var GW = {
url: '/proto.srv',
timeoutMins : 5,
protocolVersion : '4.0',
userId: null,
agentKey: null,
onNegRsp: null,
webRoot: null,
IS_SAFARI : (navigator.userAgent && navigator.vendor && (navigator.userAgent.toLowerCase().indexOf("applewebkit") != -1 || navigator.vendor.indexOf("Apple") != -1)),
loginReqDoc: null,
recovering: false,
user: null,
pwd: null,
init: function(nrspCallback, theTimeoutMins, theWebRoot) {
if (!document.getElementsByTagName) {
alert('No browser XML support');
return;
}
GW.onNegRsp = nrspCallback;
GW.timeoutMins = theTimeoutMins ? theTimeoutMins : GW.timeoutMins;
if (theWebRoot) {
GW.webRoot = theWebRoot;
} else {
GW.webRoot = GW._getWebRoot();
}
GW.url = GW.webRoot + GW.url;
GW.request(GW.createRequest('ses-create-req'), null);
},
isLoggedIn: function() {
return GW.userId != null;
},
createCallback: function(cbFunOrObj, name) {
if (cbFunOrObj == null) {
return null;
}
var callback;
if (name && cbFunOrObj[name + 'Rsp']) {
callback = new GWCallbackObj(cbFunOrObj, name + 'Rsp', name + 'NegRsp');
} else {
callback = new GWCallbackFun(cbFunOrObj);
}
return callback;
},
createRequest: function(tag) {
var xmlDoc = XmlDocument.create();
var elm = xmlDoc.createElement(tag);
xmlDoc.appendChild(elm);
return xmlDoc;
},
login: function(callback, user, password, ismd5) {
var doc = GW.createRequest('ses-login-req');
var xml = doc.documentElement;
xml.setAttribute('name', user);
xml.setAttribute('password', password);
xml.setAttribute('agent', "web");
xml.setAttribute('ismd5', ismd5);
GW.user = user;
GW.pwd = password;
xml.setAttribute('protocolVersion', GW.protocolVersion);
GW.loginReqDoc = doc;
GW.request(doc, GW.createCallback(callback, 'login'));
},
logout: function(callback) {
var doc = GW.createRequest('ses-logout-req');
GW.request(doc, GW.createCallback(callback, 'logout'));
},
selectApp: function() {
alert('selectApp is no longer required, pls remove from your code')
},
request: function(aReqDoc, aCallback) {
if (aCallback == null || !aCallback) {
return GW._send(null, aReqDoc);
} else {
var cb = aCallback;
if (!cb instanceof GWCallbackObj && !cb instanceof GWCallbackFun) {
cb = GW.createCallback(aCallback);
}
GW._send(cb, aReqDoc);
}
},
isPositive: function(element) {
return element.tagName.lastIndexOf('-rsp') != -1;
},
storeSession: function() {
GW._createCookie('agentkey', GW.agentKey, 1);
},
restoreSession: function() {
GW.agentKey = GW._readCookie('agentkey');
},
clearAccount: function() {
GW.user = ' ';
GW.pwd = ' ';
GW._eraseCookie('kwacc');
},
storeAccount: function() {
GW._createCookie('kwacc', GW.user + ',' + GW.pwd, 365);
},
getAccountData: function() {
var data = GW._readCookie('kwacc');
return (data && data != null && data.length > 0) ? data.split(',') : null;
},
_camelizeCmd: function(s) {
if (s.indexOf('-nrsp') > 0) {
s = s.substring(0, s.indexOf('-nrsp')) + '-neg-rsp';
}
return GW._camelize(s.substring(s.indexOf('-') + 1, s.length));
},
_camelize: function(s) {
var parts = s.split('-'), len = parts.length;
if (len == 1) return parts[0];
var camelized = s.charAt(0) == '-'
? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
: parts[0];
for (var i = 1; i < len; i++)
camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
return camelized;
},
_getWebRoot: function() {
var webRoot;
var head = document.getElementsByTagName('head')[0];
var nodes = head.childNodes;
for (var i = 0; i < nodes.length; ++i) {
var src = nodes.item(i).src;
if (src) {
var index = src.indexOf("GWClient.js");
if (index < 0) {
index = src.indexOf("all");
}
if (index >= 0) {
if (src.indexOf("lib") >= 0) {
index = src.indexOf("lib");
}
webRoot = src.substring(0, index);
break;
}
}
}
return webRoot;
},
_negativeRsp: function(callback, element) {
var errorId = element.getAttribute('errorId'),
errorStr = element.getAttribute('error'),
details = element.getAttribute('details'), tagName = element.tagName;
try {
callback.doNegRsp(errorId, errorStr, details, tagName);
} catch(ex) {
throw ex;
}
},
_recoverSession: function(callback, reqDoc) {
GW.agentKey = null;
GW.userId = null;
GW.recovering = true;
var onLoginRsp = function(rsp) {
GW.agentKey = rsp.getAttribute('agentkey');
GW.userId = rsp.getAttribute('userid');
GW.recovering = false;
return GW._send(callback, reqDoc);
}
GW._send(GW.createCallback(onLoginRsp), GW.loginReqDoc);
},
_send: function(callback, doc) {
var xmlhttp = new XMLHttpRequest();
var async = false;
if (callback) {
async = true;
xmlhttp.onreadystatechange = function() {
if (xmlhttp.readyState == 4) {
var element = xmlhttp.responseXML.documentElement;
var tagName = element.tagName;
if (GW.isPositive(element)) {
switch (tagName) {
case 'ses-create-rsp':
GW.agentKey = element.getAttribute('agentkey');
break;
case 'ses-login-rsp':
GW.agentKey = element.getAttribute('agentkey');
GW.userId = element.getAttribute('userid');
break;
case 'ses-logout-rsp':
GW.userId = null;
break;
}
try {
callback.doRsp(element);
} catch(ex) {
throw ex;
}
} else if (element.getAttribute('errorId') == '4007') {
if (GW.isLoggedIn()) {
GW._recoverSession(callback, doc);
} else if (GW.recovering) {
setTimeout(function() {
GW._send(callback, doc)
}, 3000);
} else {
GW._negativeRsp(callback, element);
}
} else {
GW._negativeRsp(callback, element);
}
}
}
}
var qs = GW.agentKey == null ? '?gw_timeout=' + GW.timeoutMins : '?agentkey=' + GW.agentKey;
qs += '&gw_t=' + (new Date().getTime());
var method = 'POST';
if (doc.documentElement.childNodes.length == 0) {
method = 'GET';
qs += '&gw_cmd=' + doc.documentElement.nodeName;
var attrs = doc.documentElement.attributes;
var i;
for (i = 0; i < attrs.length; i++) {
qs += '&' + attrs[i].name + '=' + attrs[i].value;
}
}
xmlhttp.open(method, GW.url + qs, async);
if (method == 'POST') {
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
if (this.IS_SAFARI) {
xmlhttp.send(doc);
} else {
xmlhttp.send(doc.xml);
}
} else {
xmlhttp.send(null);
}
if (!callback) {
if (xmlhttp.status != 200) {
alert('Problem retrieving XML data:\n' + xmlhttp.statusText);
return null;
}
var element = xmlhttp.responseXML.documentElement;
if (element.getAttribute('errorId') == '4007') {
if (GW.isLoggedIn()) {
return GW._recoverSession(callback, doc);
} else if (GW.recovering) {
setTimeout(function() {
GW._send(callback, doc)
}, 3000);
return;
}
}
if (GW.isPositive(element)) {
switch (element.tagName) {
case 'ses-create-rsp':
GW.agentKey = element.getAttribute('agentkey');
break;
case 'ses-login-rsp':
GW.agentKey = element.getAttribute('agentkey');
GW.userId = element.getAttribute('userid');
break;
case 'ses-logout-rsp':
GW.userId = null;
break;
}
}
return element;
}
},
_createCookie: function(name, value, days) {
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "; expires=" + date.toGMTString();
}
else var expires = "";
document.cookie = name + "=" + value + expires + "; path=/";
},
_readCookie: function(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') {
c = c.substring(1, c.length);
}
if (c.indexOf(nameEQ) == 0) {
return c.substring(nameEQ.length, c.length);
}
}
return null;
},
_eraseCookie: function(name) {
GW._createCookie(name, "", -1);
}
}
function GWCallbackObj(obj, rsp, nrsp) {
this.obj = obj;
this.rsp = rsp;
if (!this.obj[this.rsp]) {
alert('He JoeS de functie ' + rsp + ' moet wel bestaan in je object !!');
}
this.nrsp = nrsp;
}
GWCallbackObj.prototype.doRsp = function(element) {
this.obj[this.rsp](element);
}
GWCallbackObj.prototype.doNegRsp = function(errorId, errorStr, details, tagName) {
if (this.obj[this.nrsp]) {
this.obj[this.nrsp](errorId, errorStr, details, tagName);
} else {
GW.onNegRsp(errorId, errorStr, details, tagName);
}
}
function GWCallbackFun(fun) {
this.fun = fun;
}
GWCallbackFun.prototype.doRsp = function(element) {
this.fun(element);
}
GWCallbackFun.prototype.doNegRsp = function(errorId, errorStr, details, tagName) {
GW.onNegRsp(errorId, errorStr, details, tagName);
}
function getDomDocumentPrefix() {
if (getDomDocumentPrefix.prefix)
return getDomDocumentPrefix.prefix;
var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
var o;
for (var i = 0; i < prefixes.length; i++) {
try {
o = new ActiveXObject(prefixes[i] + ".DomDocument");
return getDomDocumentPrefix.prefix = prefixes[i];
}
catch (ex) {
}
;
}
throw new Error("Could not find an installed XML parser");
}
function getXmlHttpPrefix() {
if (getXmlHttpPrefix.prefix)
return getXmlHttpPrefix.prefix;
var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
var o;
for (var i = 0; i < prefixes.length; i++) {
try {
o = new ActiveXObject(prefixes[i] + ".XmlHttp");
return getXmlHttpPrefix.prefix = prefixes[i];
}
catch (ex) {
}
;
}
throw new Error("Could not find an installed XML parser");
}
function XmlDocument() {
}
XmlDocument.create = function () {
try {
if (document.implementation && document.implementation.createDocument) {
var doc = document.implementation.createDocument("", "", null);
if (doc.readyState == null) {
doc.readyState = 1;
doc.addEventListener("load", function () {
doc.readyState = 4;
if (typeof doc.onreadystatechange == "function")
doc.onreadystatechange();
}, false);
}
return doc;
}
if (window.ActiveXObject)
return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
}
catch (ex) {
}
throw new Error("Your browser does not support XmlDocument objects");
};
if (window.DOMParser &&
window.XMLSerializer &&
window.Node && Node.prototype && Node.prototype.__defineGetter__) {
Document.prototype.loadXML = function (s) {
var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
while (this.hasChildNodes())
this.removeChild(this.lastChild);
for (var i = 0; i < doc2.childNodes.length; i++) {
this.appendChild(this.importNode(doc2.childNodes[i], true));
}
};
try {
Document.prototype.__defineGetter__("xml", function () {
return (new XMLSerializer()).serializeToString(this);
});
} catch(e) {
}
}
if (window.ActiveXObject && !window.XMLHttpRequest) {
window.XMLHttpRequest = function() {
var msxmls = new Array(
'Msxml2.XMLHTTP.5.0',
'Msxml2.XMLHTTP.4.0',
'Msxml2.XMLHTTP.3.0',
'Msxml2.XMLHTTP',
'Microsoft.XMLHTTP');
for (var i = 0; i < msxmls.length; i++) {
try {
return new ActiveXObject(msxmls[i]);
} catch (e) {
}
}
return null;
};
}
if (!window.ActiveXObject && window.XMLHttpRequest) {
window.ActiveXObject = function(type) {
switch (type.toLowerCase()) {
case 'microsoft.xmlhttp':
case 'msxml2.xmlhttp':
case 'msxml2.xmlhttp.3.0':
case 'msxml2.xmlhttp.4.0':
case 'msxml2.xmlhttp.5.0':
return new XMLHttpRequest();
}
return null;
};
}
function copyChildNodes(nodeFrom, nodeTo) {
if ((!nodeFrom) || (!nodeTo)) {
throw "Both source and destination nodes must be provided";
}
;
var ownerDoc = nodeTo.nodeType == Node.DOCUMENT_NODE ? nodeTo : nodeTo.ownerDocument;
var nodes = nodeFrom.childNodes;
if (ownerDoc.importNode) {
for (var i = 0; i < nodes.length; i++) {
nodeTo.appendChild(ownerDoc.importNode(nodes[i], true));
}
;
} else {
for (var i = 0; i < nodes.length; i++) {
nodeTo.appendChild(nodes[i].cloneNode(true));
}
}
}
GW.CMT = {
add: function(callback, commentObj) {
var req = GW.createRequest('cmt-insert-req');
GW.UTIL.addObject(req, 'comment', commentObj);
GW.request(req, GW.createCallback(callback, 'add'));
},
markRead: function(callback, commentId, targetId) {
var req = GW.createRequest('cmt-update-state-req');
GW.UTIL.setAttr(req, 'state', 2);
GW.UTIL.setOptAttr(req, 'id', commentId);
GW.UTIL.setOptAttr(req, 'target', targetId);
GW.request(req, GW.createCallback(callback, 'markRead'));
},
markReadForTarget: function(callback, targetId) {
GW.CMT.markRead(callback, null, targetId);
},
markReadForComment: function(callback, commentId) {
GW.CMT.markRead(callback, commentId, null);
},
del: function(callback, commentId) {
var req = GW.createRequest('cmt-delete-req');
GW.UTIL.setAttr(req, 'id', commentId);
GW.request(req, GW.createCallback(callback, 'del'));
},
delForTarget: function(callback, targetId) {
var req = GW.createRequest('cmt-delete-for-target-req');
GW.UTIL.setAttr(req, 'targetid', targetId);
GW.request(req, GW.createCallback(callback, 'delForTarget'));
}
}
GW.EVENT = {
FETCH_INTERVAL_MILLIS: 8000,
listener: null,
send: function(callback, topic, argObj) {
var req = GW.createRequest('event-send-req');
GW.UTIL.setAttr(req, 'topic', topic);
if (argObj) {
GW.UTIL.setAttrs(req, argObj);
}
GW.request(req, GW.createCallback(callback, 'send'));
},
subscribe: function(callback, topics) {
var req = GW.createRequest('event-subscribe-req');
GW.UTIL.setAttr(req, 'topics', topics);
GW.request(req, GW.createCallback(callback, 'subscribe'));
},
start: function(callback, aListener) {
GW.EVENT.listener = aListener;
var startRsp = function(xmlElm) {
GW.EVENT._fetchReq();
if (callback != null) {
GW.createCallback(callback, 'start').doRsp(xmlElm);
}
}
GW.request(GW.createRequest('event-start-req'), GW.createCallback(startRsp));
},
stop: function(callback) {
GW.EVENT.listener = null;
GW.request(GW.createRequest('event-stop-req'), GW.createCallback(callback, 'stop'));
},
unsubscribe: function(callback, topics) {
var req = GW.createRequest('event-unsubscribe-req');
if (topics) {
GW.UTIL.setAttr(req, 'topics', topics);
}
GW.request(req, GW.createCallback(callback, 'unsubscribe'));
},
_fetchReq: function() {
GW.request(GW.createRequest('event-fetch-req'), GW.createCallback(GW.EVENT, '_fetch'));
},
_fetchRsp: function(xmlElm) {
if (GW.EVENT.listener == null) {
return;
}
try {
var indicationElms = xmlElm.childNodes;
for (var i = 0; i < indicationElms.length; i++) {
GW.EVENT.listener.onIndication(indicationElms[i]);
}
} catch (e) {
throw e;
}
setTimeout(GW.EVENT._fetchReq, GW.EVENT.FETCH_INTERVAL_MILLIS);
},
_fetchNegRsp: function(errorId, errorStr, details, tagName) {
if (GW.EVENT.listener == null) {
return;
}
setTimeout(GW.EVENT._fetchReq, GW.EVENT.FETCH_INTERVAL_MILLIS);
}
}
GW.MEDIA = {
iframeCnt: 0,
callback: null,
getBaseURL: function() {
return GW.webRoot + '/media.srv';
},
addRef: function(callback, argObj) {
var req = GW.createRequest('medium-insert-req');
if (argObj.userid == -1) {
argObj.userId = undefined;
}
GW.UTIL.addObject(req, 'medium', argObj);
GW.request(req, GW.createCallback(callback, 'addRef'));
},
upload: function(callback, form) {
var rsp = document.createElement('input');
rsp.name = 'rsp';
rsp.type = 'hidden';
rsp.value = 'jsonjs';
form.appendChild(rsp);
var agentkey = document.createElement('input');
agentkey.name = 'agentkey';
agentkey.type = 'hidden';
agentkey.value = GW.agentKey;
form.appendChild(agentkey);
var iframeId = 'kwrspframe' + GW.MEDIA.iframeCnt;
form.target = iframeId;
if (!form.name.value) {
form.name.value = 'unnamed';
}
GW.MEDIA._createRspIFrame(iframeId);
form.submit();
GW.MEDIA.callback = callback;
GW.MEDIA.iframeCnt++;
return false;
},
del: function(callback, id) {
var req = GW.createRequest('medium-delete-req');
GW.UTIL.setAttr(req, 'id', id);
GW.request(req, GW.createCallback(callback, 'del'));
},
update: function(callback, id, name, desc) {
var req = GW.createRequest('medium-update-req');
GW.UTIL.setAttr(req, 'id', id);
var elm = req.createElement('medium');
GW.UTIL.addOptTextElement(elm, 'name', name);
GW.UTIL.addOptTextElement(elm, 'description', desc);
req.documentElement.appendChild(elm);
GW.request(req, GW.createCallback(callback, 'update'));
},
_serverRsp: function(jsonRsp) {
if (GW.MEDIA.callback != null) {
GW.MEDIA.callback(jsonRsp);
GW.MEDIA.callback = null;
}
},
_checkRspIFrame: function(callback, iframeId) {
var iframe = window.frames[iframeId];
if (!iframe) {
iframe = DH.getObject(iframeId);
if (!iframe) {
alert('cannot get rspFrame: ' + iframeId);
return;
}
}
var iframeDoc;
if (iframe.contentDocument) {
iframeDoc = iframe.contentDocument;
} else if (iframe.contentWindow) {
iframeDoc = iframe.contentWindow.document;
} else if (iframe.document) {
iframeDoc = iframe.document;
}
if (iframeDoc && iframeDoc.documentElement && iframeDoc.documentElement.tagName.indexOf('rsp') != -1) {
callback(iframeDoc.documentElement);
} else {
var f = function() {
GW.MEDIA._checkRspIFrame(callback, iframeId);
}
if (iframeDoc && iframeDoc.documentElement && iframeDoc.documentElement.innerHTML.indexOf('rsp') != -1) {
var id = iframeDoc.body.getElementsByTagName('B')[0].innerHTML;
var rsp = GW.createRequest('medium-insert-rsp');
rsp.documentElement.setAttribute('id', id);
callback(rsp.documentElement);
return;
}
setTimeout(f, 50);
}
},
_createRspIFrame: function(iframeId) {
var iframeDiv = document.createElement('DIV');
iframeDiv.style.visibility = 'hidden';
iframeDiv.style.position = 'absolute';
iframeDiv.style.top = '0px';
iframeDiv.style.left = '0px';
iframeDiv.style.width = '0px';
iframeDiv.style.height = '0px';
iframeDiv.innerHTML = '<iframe id="' + iframeId + '"  name="' + iframeId + '" style="width: 0px; height: 0px; border: 0px;"><\/iframe>';
document.body.appendChild(iframeDiv);
return true;
}
}
GW.TAG = {
add: function(callback, itemIds, tags) {
var req = GW.createRequest('tagging-tag-req');
GW.UTIL.setAttr(req, 'items', itemIds);
GW.UTIL.setAttr(req, 'tags', tags);
GW.UTIL.setAttr(req, 'mode', 'add');
GW.request(req, GW.createCallback(callback, 'add'));
},
replace: function(callback, itemIds, tags) {
var req = GW.createRequest('tagging-tag-req');
GW.UTIL.setAttr(req, 'items', itemIds);
GW.UTIL.setAttr(req, 'tags', tags);
GW.UTIL.setAttr(req, 'mode', 'replace');
GW.request(req, GW.createCallback(callback, 'replace'));
},
remove: function(callback, itemIds, tags) {
var req = GW.createRequest('tagging-untag-req');
GW.UTIL.setAttr(req, 'items', itemIds);
GW.UTIL.setAttr(req, 'tags', tags);
GW.request(req, GW.createCallback(callback, 'remove'));
}
}
GW.TRACE = {
addMediumToTrace: function(callback, mediumId, userId) {
var req = GW.createRequest('trace-add-medium-req');
GW.UTIL.setAttr(req, 'id', mediumId);
GW.UTIL.setOptAttr(req, 'userid', userId);
GW.request(req, GW.createCallback(callback, 'addMediumToTrace'));
},
create: function(callback, name) {
var req = GW.createRequest('trace-create-req');
GW.UTIL.setOptAttr(req, 'name', name);
GW.request(req, GW.createCallback(callback, 'create'));
},
get: function(callback, id, argObj) {
var req = GW.createRequest('trace-export-req');
GW.UTIL.setAttr(req, 'id', id);
if (argObj) {
GW.UTIL.setAttrs(req, argObj);
}
GW.request(req, GW.createCallback(callback, 'get'));
},
write: function(callback, lon, lat, time, ele) {
var req = GW.createRequest('trace-write-req');
var pt = req.createElement('pt');
GW.UTIL.setAttr(pt, 'lon', lon);
GW.UTIL.setAttr(pt, 'lat', lat);
GW.UTIL.setOptAttr(pt, 't', time);
GW.UTIL.setOptAttr(pt, 'ele', ele);
req.documentElement.appendChild(pt);
GW.request(req, GW.createCallback(callback, 'write'));
},
suspend: function(callback, id) {
var req = GW.createRequest('trace-suspend-req');
GW.UTIL.setOptAttr(req, 'id', id);
GW.request(req, GW.createCallback(callback, 'suspend'));
},
resume: function(callback, id) {
var req = GW.createRequest('trace-resume-req');
GW.UTIL.setOptAttr(req, 'id', id);
GW.request(req, GW.createCallback(callback, 'resume'));
},
del: function(callback, id) {
var req = GW.createRequest('trace-delete-req');
GW.UTIL.setAttr(req, 'id', id);
GW.request(req, GW.createCallback(callback, 'del'));
}
}
GW.QUERY = {
queryStore: function(aCmd, aCallback, theOtherArgs) {
var req = GW.createRequest('query-store-req');
var argv = GW.QUERY.queryStore.arguments;
var argc = arguments.length;
if (argc < 2) {
alert('get command must have at least 2 argv (cmd+callback)');
return;
}
GW.UTIL.setAttr(req, 'cmd', aCmd);
if (typeof theOtherArgs == 'object') {
for (var field in theOtherArgs) {
GW.UTIL.setAttr(req, field, theOtherArgs[field]);
}
} else {
for (var i = 2; i < argc; i++) {
GW.UTIL.setAttr(req, argv[i], argv[++i]);
}
}
if (aCallback != null) {
var qr = new GW.QUERY._queryRspHandler(aCallback);
GW.request(req, GW.createCallback(qr.onQueryRsp));
} else {
return GW.QUERY._rsp2XMLRecords(GW.request(req));
}
},
_rsp2XMLRecords: function(xmlElm) {
var records = [];
if (!xmlElm) {
return records;
}
var recordElements = xmlElm.getElementsByTagName('record');
for (var i = 0; i < recordElements.length; i++) {
records.push(new XMLRecord(recordElements[i]));
}
return records;
},
_queryRspHandler: function(cb) {
this.onQueryRsp = function(rsp) {
GW.createCallback(cb, 'queryStore').doRsp(GW.QUERY._rsp2XMLRecords(rsp));
}
}
}
GW.USER = {
create: function(callback, name, password, email, fullname, role) {
var req = GW.createRequest('user-create-req');
GW.UTIL.setAttr(req, 'name', name);
GW.UTIL.setAttr(req, 'password', password);
GW.UTIL.setAttr(req, 'email', email);
GW.UTIL.setAttr(req, 'fullname', fullname);
GW.UTIL.setOptAttr(req, 'role', role);
GW.request(req, GW.createCallback(callback, 'create'));
},
signup: function(callback, fullname, name, password, email, invite, profile, lang, newsletter) {
var req = GW.createRequest('user-signup-req');
GW.UTIL.setAttr(req, 'fullname', fullname);
GW.UTIL.setAttr(req, 'name', name);
GW.UTIL.setAttr(req, 'password', password);
GW.UTIL.setAttr(req, 'email', email);
GW.UTIL.setAttr(req, 'invite', invite);
GW.UTIL.setOptAttr(req, 'profile', profile);
GW.UTIL.setOptAttr(req, 'lang', lang);
GW.UTIL.setOptAttr(req, 'newsletter', newsletter);
GW.request(req, GW.createCallback(callback, 'signup'));
},
verify: function(callback, email, verify) {
var req = GW.createRequest('user-verify-req');
GW.UTIL.setAttr(req, 'email', email);
GW.UTIL.setAttr(req, 'verify', verify);
GW.request(req, GW.createCallback(callback, 'verify'));
},
getProfile: function(callback) {
var req = GW.createRequest('user-get-profile-req');
return GW.request(req, GW.createCallback(callback, 'getProfile'));
},
update: function(callback, id, name, password, email) {
var req = GW.createRequest('user-update-req');
GW.UTIL.setAttr(req, 'id', id);
GW.UTIL.setOptAttr(req, 'name', name);
GW.UTIL.setOptAttr(req, 'password', password);
GW.UTIL.setOptAttr(req, 'email', email);
GW.request(req, GW.createCallback(callback, 'update'));
},
updateProfile: function(callback, profileObj) {
var req = GW.createRequest('user-update-profile-req');
GW.UTIL.addObject(req, 'profile', profileObj);
return GW.request(req, GW.createCallback(callback, 'updateProfile'));
},
del: function(callback, id) {
var req = GW.createRequest('user-delete-req');
GW.UTIL.setAttr(req, 'id', id);
GW.request(req, GW.createCallback(callback, 'del'));
}
}
GW.UTIL = {
escape : function(s) {
return s.replace(/&/g, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&apos;");
},
expandQueryString: function(qs, name, value) {
if (value && value != null) {
qs += ('&' + name + '=' + value);
}
return qs;
},
addArray: function(parent, name, arr) {
var doc = parent.ownerDocument;
if (parent.nodeName == '#document') {
doc = parent;
parent = doc.documentElement;
}
var arrElm = doc.createElement(name);
var elmName = name.substring(0, name.indexOf('list'));
for (var i = 0; i < arr.length; i++) {
if (arr[i]) {
if (typeof arr[i] == 'object') {
GW.UTIL.addObject(arrElm, elmName, arr[i]);
} else {
GW.UTIL.addTextElement(arrElm, elmName, arr[i]);
}
}
}
parent.appendChild(arrElm);
return arrElm;
},
addOptArray: function(parent, name, arr) {
if (arr && arr != null) {
return GW.UTIL.addArray(parent, name, arr);
}
},
addObject: function(parent, name, obj) {
var doc = parent.ownerDocument;
if (parent.nodeName == '#document') {
doc = parent;
parent = doc.documentElement;
}
var elm = doc.createElement(name);
var field, value, type;
for (field in obj) {
value = obj[field];
type = typeof value;
if (type == 'object' && value && value.constructor == (new Array).constructor) {
type = 'array';
}
if (value == undefined || value == null) {
GW.UTIL.addTextElement(elm, field, null);
continue;
}
switch (type) {
case 'object' :
GW.UTIL.addObject(elm, field, value);
break;
case 'array' :
GW.UTIL.addArray(elm, field, value);
break;
case 'boolean' :
GW.UTIL.addTextElement(elm, field, value ? 'true' : 'false');
break;
case 'number' :
case 'string' :
if (field == 'id' || (field == 'name' && parent.nodeName == 'mediumlist')) {
GW.UTIL.setAttr(elm, field, value);
} else {
GW.UTIL.addTextElement(elm, field, value);
}
break;
default:
break;
}
}
parent.appendChild(elm);
return elm;
},
addOptObject: function(parent, name, obj) {
if (obj && obj != null) {
return GW.UTIL.addObject(parent, name, obj);
}
},
addElement: function(parent, name) {
var doc = parent.ownerDocument;
if (parent.nodeName == '#document') {
doc = parent;
parent = doc.documentElement;
}
var elm = doc.createElement(name);
parent.appendChild(elm);
return elm;
},
addTextElement: function(parent, name, text) {
var elm = GW.UTIL.addElement(parent, name);
if (text != undefined && text != null) {
var doc = parent.ownerDocument;
if (parent.nodeName == '#document') {
doc = parent;
}
var textNode = doc.createTextNode(text);
elm.appendChild(textNode);
}
return elm;
},
addOptTextElement: function(parent, name, text) {
if (text != undefined && text != null) {
return GW.UTIL.addTextElement(parent, name, text);
}
},
addTextElements: function(node, obj) {
var name;
for (name in obj) {
GW.UTIL.addOptTextElement(node, name, obj[name]);
}
},
getChildText: function(parent, childName) {
function getElement(childName)
{
return parent.getElementsByTagName(childName)[0] || false;
}
if (getElement(childName) && getElement(childName).firstChild)
{
return getElement(childName).firstChild.nodeValue;
}
else
{
return false;
}
},
setAttrs: function(node, obj) {
var name;
for (name in obj) {
GW.UTIL.setOptAttr(node, name, obj[name]);
}
},
setAttr: function(node, name, value) {
if (node.nodeName == '#document') {
node = node.documentElement;
}
if (value == undefined || value == null) {
alert('error: no value passed for attr ' + name);
return;
}
if (typeof value == 'boolean') {
value = value ? 'true' : 'false';
}
node.setAttribute(name, value);
},
setOptAttr: function(node, name, value) {
if (value != undefined && value != null) {
GW.UTIL.setAttr(node, name, value);
}
}
}
GW.SCENE = {
addPlace: function(callback, sceneId, name, type, geometry, meta, content) {
var req = GW.createRequest('scene-add-place-req');
GW.UTIL.setAttr(req, 'id', sceneId);
var place = req.createElement('place');
GW.UTIL.addOptTextElement(place, 'name', name);
GW.UTIL.addTextElement(place, 'type', type);
GW.UTIL.addObject(place, 'geometry', geometry);
GW.UTIL.addOptObject(place, 'meta', meta);
GW.UTIL.addOptObject(place, 'content', content);
req.documentElement.appendChild(place);
return GW.request(req, GW.createCallback(callback, 'addPlace'));
},
create: function(callback, type, name, meta, content, contextId) {
var req = GW.createRequest('scene-create-req');
var scene = req.createElement('scene');
GW.UTIL.addTextElement(scene, 'type', type);
GW.UTIL.addTextElement(scene, 'name', name);
GW.UTIL.addOptObject(scene, 'meta', meta);
GW.UTIL.addOptObject(scene, 'content', content);
GW.UTIL.addOptTextElement(scene, 'contextid', contextId);
req.documentElement.appendChild(scene);
return GW.request(req, GW.createCallback(callback, 'create'));
},
del: function(callback, sceneId) {
var req = GW.createRequest('scene-delete-req');
GW.UTIL.setAttr(req, 'id', sceneId);
return GW.request(req, GW.createCallback(callback, 'del'));
},
delPlace: function(callback, placeId) {
var req = GW.createRequest('scene-delete-place-req');
GW.UTIL.setAttr(req, 'id', placeId);
return GW.request(req, GW.createCallback(callback, 'delPlace'));
},
exportScene: function(callback, sceneId, format) {
var req = GW.createRequest('scene-export-req');
GW.UTIL.setAttr(req, 'id', sceneId);
GW.UTIL.setOptAttr(req, 'format', format);
return GW.request(req, GW.createCallback(callback, 'exportScene'));
},
get: function(callback, sceneId, sections) {
var req = GW.createRequest('scene-get-req');
GW.UTIL.setAttr(req, 'id', sceneId);
GW.UTIL.setOptAttr(req, 'sections', sections);
return GW.request(req, GW.createCallback(callback, 'get'));
},
getPlace: function(callback, placeId) {
var req = GW.createRequest('scene-get-place-req');
GW.UTIL.setAttr(req, 'id', placeId);
return GW.request(req, GW.createCallback(callback, 'getPlace'));
},
importScene: function(callback, type, format, idType, id) {
var req = GW.createRequest('scene-import-req');
GW.UTIL.setAttr(req, 'type', type);
GW.UTIL.setAttr(req, 'format', format);
GW.UTIL.setAttr(req, 'idtype', idType);
GW.UTIL.setAttr(req, 'id', escape(id));
return GW.request(req, GW.createCallback(callback, 'importScene'));
},
importSceneDoc: function(callback, format, docText) {
var req = GW.createRequest('scene-import-req');
GW.UTIL.setAttr(req, 'format', format);
var cdata = req.createCDATASection(docText);
req.documentElement.appendChild(cdata);
return GW.request(req, GW.createCallback(callback, 'importSceneDoc'));
},
orderPlaces: function(callback, sceneId, order) {
var req = GW.createRequest('scene-order-places-req');
GW.UTIL.setAttr(req, 'id', sceneId);
GW.UTIL.setAttr(req, 'order', order);
return GW.request(req, GW.createCallback(callback, 'orderPlaces'));
},
setState: function(callback, sceneId, state, deletePlaysOnPublic, allowPublish) {
var req = GW.createRequest('scene-set-state-req');
GW.UTIL.setAttr(req, 'id', sceneId);
GW.UTIL.setAttr(req, 'state', state);
GW.UTIL.setOptAttr(req, 'deleteplays', deletePlaysOnPublic);
GW.UTIL.setOptAttr(req, 'allowpublish', allowPublish);
return GW.request(req, GW.createCallback(callback, 'setState'));
},
update: function(callback, sceneId, name, meta, content) {
var req = GW.createRequest('scene-update-req');
GW.UTIL.setAttr(req, 'id', sceneId);
var scene = req.createElement('scene');
GW.UTIL.addOptTextElement(scene, 'name', name);
GW.UTIL.addOptObject(scene, 'meta', meta);
GW.UTIL.addOptObject(scene, 'content', content);
req.documentElement.appendChild(scene);
return GW.request(req, GW.createCallback(callback, 'update'));
},
updatePlace: function(callback, placeId, name, geometry, meta, content) {
var req = GW.createRequest('scene-update-place-req');
GW.UTIL.setAttr(req, 'id', placeId);
var place = req.createElement('place');
GW.UTIL.addOptTextElement(place, 'name', name);
GW.UTIL.addOptObject(place, 'geometry', geometry);
GW.UTIL.addOptObject(place, 'meta', meta);
GW.UTIL.addOptObject(place, 'content', content);
req.documentElement.appendChild(place);
return GW.request(req, GW.createCallback(callback, 'updatePlace'));
},
listReviews: function(callback, sceneId) {
var req = GW.createRequest('review-list-req');
GW.UTIL.setAttr(req, 'sceneId', sceneId);
return GW.request(req, GW.createCallback(callback, 'listReviews'));
}
}
GW.CONTEXT = {
addRole: function(callback, contextId, userName, roleNames) {
var req = GW.createRequest('context-add-role-req');
GW.UTIL.setAttr(req, 'id', contextId);
GW.UTIL.addTextElement(req, 'user', userName);
GW.UTIL.addTextElement(req, 'role', roleNames);
return GW.request(req, GW.createCallback(callback, 'addRole'));
},
updateDirectors: function(callback, contextId, addDirectors, removeDirectors) {
var req = GW.createRequest('context-update-directors-req');
GW.UTIL.setAttr(req, 'id', contextId);
GW.UTIL.addTextElement(req, 'add', addDirectors);
GW.UTIL.addTextElement(req, 'del', removeDirectors);
return GW.request(req, GW.createCallback(callback, 'updateDirectors'));
},
create: function(callback, type, name, content, parentId, userId, roleNames) {
var req = GW.createRequest('context-create-req');
var context = req.createElement('context');
GW.UTIL.addTextElement(context, 'type', type);
GW.UTIL.addTextElement(context, 'name', name);
GW.UTIL.addOptObject(context, 'content', content);
GW.UTIL.addOptTextElement(context, 'parent', parentId);
GW.UTIL.addOptTextElement(context, 'userid', userId);
GW.UTIL.addOptTextElement(context, 'roles', roleNames);
req.documentElement.appendChild(context);
return GW.request(req, GW.createCallback(callback, 'create'));
},
del: function(callback, contextId) {
var req = GW.createRequest('context-delete-req');
GW.UTIL.setAttr(req, 'id', contextId);
return GW.request(req, GW.createCallback(callback, 'del'));
},
delRole: function(callback, contextId, userName, roleName) {
var req = GW.createRequest('context-delete-role-req');
GW.UTIL.setAttr(req, 'id', contextId);
GW.UTIL.addTextElement(req, 'user', userName);
GW.UTIL.addTextElement(req, 'role', roleName);
return GW.request(req, GW.createCallback(callback, 'delRole'));
},
get: function(callback, contextId) {
var req = GW.createRequest('context-get-req');
GW.UTIL.setAttr(req, 'id', contextId);
return GW.request(req, GW.createCallback(callback, 'get'));
},
getRoles: function(callback, contextType, userId) {
var req = GW.createRequest('context-get-roles-req');
GW.UTIL.setOptAttr(req, 'contexttype', contextType);
GW.UTIL.setOptAttr(req, 'userid', userId);
return GW.request(req, GW.createCallback(callback, 'getRoles'));
},
getUsers: function(callback, contextId) {
var req = GW.createRequest('context-get-users-req');
GW.UTIL.setAttr(req, 'id', contextId);
return GW.request(req, GW.createCallback(callback, 'getUsers'));
},
update: function(callback, contextId, name) {
var req = GW.createRequest('context-update-req');
GW.UTIL.setAttr(req, 'id', contextId);
var context = req.createElement('context');
GW.UTIL.addTextElement(context, 'name', name);
req.documentElement.appendChild(context);
return GW.request(req, GW.createCallback(callback, 'update'));
},
updateContent: function(callback, contextId, description, content, fullname) {
var req = GW.createRequest('context-update-content-req');
GW.UTIL.setAttr(req, 'id', contextId);
GW.UTIL.addOptTextElement(req, 'description', description);
GW.UTIL.addOptTextElement(req, 'fullname', fullname);
GW.UTIL.addOptObject(req, 'content', content);
return GW.request(req, GW.createCallback(callback, 'updateContent'));
}
}
GW.ROUND = {
create: function(callback, sceneId, roundObj) {
var req = GW.createRequest('round-create-req');
GW.UTIL.setAttr(req, 'sceneid', sceneId);
GW.UTIL.addObject(req, 'round', roundObj);
return GW.request(req, GW.createCallback(callback, 'create'));
},
del: function(callback, roundId) {
var req = GW.createRequest('round-delete-req');
GW.UTIL.setAttr(req, 'id', roundId);
return GW.request(req, GW.createCallback(callback, 'del'));
},
deleteAll: function(callback, sceneId) {
var req = GW.createRequest('round-delete-all-req');
GW.UTIL.setAttr(req, 'sceneid', sceneId);
return GW.request(req, GW.createCallback(callback, 'deleteAll'));
},
get: function(callback, roundId) {
var req = GW.createRequest('round-get-req');
GW.UTIL.setAttr(req, 'id', roundId);
return GW.request(req, GW.createCallback(callback, 'get'));
},
update: function(callback, roundId, roundObj) {
var req = GW.createRequest('round-update-req');
GW.UTIL.setAttr(req, 'id', roundId);
GW.UTIL.addObject(req, 'round', roundObj);
return GW.request(req, GW.createCallback(callback, 'update'));
}
}
GW.PLAY = {
addMedium: function(callback, mediumId, placeId) {
var req = GW.createRequest('play-add-medium-req');
GW.UTIL.setAttr(req, 'id', mediumId);
GW.UTIL.setAttr(req, 'placeid', placeId);
return GW.request(req, GW.createCallback(callback, 'addMedium'));
},
answerTask: function(callback, taskId, answer) {
var req = GW.createRequest('play-answer-task-req');
GW.UTIL.setAttr(req, 'id', taskId);
GW.UTIL.setAttr(req, 'answer', answer);
return GW.request(req, GW.createCallback(callback, 'answerTask'));
},
enter: function(callback, playId) {
var req = GW.createRequest('play-enter-req');
GW.UTIL.setAttr(req, 'id', playId);
return GW.request(req, GW.createCallback(callback, 'enter'));
},
exit: function(callback) {
var req = GW.createRequest('play-exit-req');
return GW.request(req, GW.createCallback(callback, 'exit'));
},
get: function(callback, playId, sections) {
var req = GW.createRequest('play-get-req');
GW.UTIL.setAttr(req, 'id', playId);
GW.UTIL.setOptAttr(req, 'sections', sections);
return GW.request(req, GW.createCallback(callback, 'get'));
},
getEventList: function(callback, playId) {
var req = GW.createRequest('play-get-events-req');
GW.UTIL.setAttr(req, 'id', playId);
return GW.request(req, GW.createCallback(callback, 'getEventList'));
},
getRoundEventList: function(callback, roundId, merge) {
var req = GW.createRequest('round-get-events-req');
GW.UTIL.setAttr(req, 'id', roundId);
GW.UTIL.setOptAttr(req, 'merge', merge);
return GW.request(req, GW.createCallback(callback, 'getEventList'));
},
getPlace: function(callback, placeId, sections) {
var req = GW.createRequest('play-get-place-req');
GW.UTIL.setAttr(req, 'id', placeId);
GW.UTIL.setOptAttr(req, 'sections', sections);
return GW.request(req, GW.createCallback(callback, 'getPlace'));
},
message: function(callback, text, type, to) {
var req = GW.createRequest('play-message-req');
GW.UTIL.addTextElement(req, 'text', text);
GW.UTIL.addOptTextElement(req, 'type', type);
GW.UTIL.addOptObject(req, 'to', to);
return GW.request(req, GW.createCallback(callback, 'message'));
},
skipTask: function(callback, taskId) {
var req = GW.createRequest('play-skip-task-req');
GW.UTIL.setAttr(req, 'id', taskId);
return GW.request(req, GW.createCallback(callback, 'skipTask'));
}
}
function Record(anObj) {
this.getField = function(name) {
return null;
}
this.toHTML = function() {
return null;
}
}
function ObjRecord(anObj) {
Record.apply(this);
this.rec = anObj;
this.getField = function(name) {
return this.rec[name];
}
this.toHTML = function() {
var html = '<pre>';
var fieldCount = fields.length;
var nextField;
for (j  in this.recs) {
nextField = fields[j];
html += j + '=' + this.rec[j];
html += '\n';
}
html += '\n</pre>';
return html;
}
}
function XMLRecord(xmlElement) {
Record.apply(this);
this.xml = xmlElement;
this.id = -1;
if (this.xml.attributes && this.xml.getAttribute("id")) {
this.id = this.xml.getAttribute("id");
} else  if (this.getField("id") != null) {
this.id = this.getField("id");
}
this.getField = function(name) {
if (name == 'id' && this.id > 0) {
return this.id;
}
var field = this.getXMLField(name);
if (field != null && field.childNodes.length > 0) {
return field.childNodes[0].nodeValue;
} else {
return null;
}
}
this.getXMLField = function(name) {
var list = this.xml.getElementsByTagName(name);
if (list && list.length > 0) {
return list[0];
} else {
return null;
}
}
this.toHTML = function() {
var html = '<pre>';
var xml = this.xml;
html += (xml.tagName + ' id=' + this.id + '\n');
var fields = xml.childNodes;
var fieldCount = fields.length;
var nextField;
for (var j = 0; j < fieldCount; j++) {
nextField = fields[j];
html += (nextField.tagName + '=');
if (nextField.childNodes[0]) {
html += nextField.childNodes[0].nodeValue;
}
html += '\n';
}
html += '\n</pre>';
return html;
}
}
