1
if (typeof XDocController == "undefined" || !XDocController) {
    /**
     * The XDocController global namespace object.  If XDocController is already defined, the
     * existing XDocController object will not be overwritten so that defined
     * namespaces are preserved.
     */
    var XDocController = {};
}
/***
* miscellaneous data
***/
XDocController.env = {
"COMPONENTS_DB_NAME": "WebSite/Components.nsf",
"RENDER_DB_NAME": "Website/Renderer.nsf",
"LIBRARY_DB_NAME": "WebSite/library.nsf",
"CACHEID_PARAM": ""
}
if (typeof(xdoc_cacheid)!="undefined"){
XDocController.env.CACHEID_PARAM = "&cacheID="+xdoc_cacheid;
}
/***
* urls
***/
XDocController.urls = {
"folderUrl": "/"+XDocController.env.LIBRARY_DB_NAME+"/(JSONLevelsByID)/@@contentId@@?OpenDocument"+XDocController.env.CACHEID_PARAM,
"documentUrl": "/"+XDocController.env.LIBRARY_DB_NAME+"/(JSONDocumentsByID)/@@contentId@@?OpenDocument"+XDocController.env.CACHEID_PARAM,
"contentUrl": "",
"presentationTemplateUrl": "/"+XDocController.env.RENDER_DB_NAME+"/(LookupHTMLTemplatesByName)/@@template@@?OpenDocument"+XDocController.env.CACHEID_PARAM
};
/***
* initialization
***/
XDocController.init = function(){
//XDoc context
XDocContext = {};
XDocController.data = [];
XDocController.xmlTemplate = null;
XDocController.dataIsLoaded = (XDocController.urls["contentUrl"]=="");
XDocController.templateIsLoaded = false;
if (!XDocController.dataIsLoaded) XDocController.getContent();
XDocController.getPresentationTemplate();
};
/***
* get content
***/
XDocController.getContent = function(){
//success
var responseSuccess = function(o){
var responseType = o.getResponseHeader["Content-Type"];
if (responseType.match("text/javascript")){
XDocController.getDataFromJSON(XDocController.util.stringToJSON(o.responseText));
}else if (responseType.match("text/html")){
//o.reponseText -> 1 line
var response = o.responseText.replace(/\n/g,"");
var stringStream = null;
//get data
var reg = new RegExp(/<response[^>]*>(.*)<\/response>/i);
var res = reg.exec(response);
if ((res!=null)&&(res.length>1)) stringStream = res[1].replace(/<response[^>]*>(.*)<\/response>/ig,"$1");
var patternJSON = /<json[^>]*>(.*)<\/json>/i;
var patternRichText = /<richtexts[^>]*>(.*)<\/richtexts>/i;
var contentProperties = patternJSON.exec(stringStream);
var contentRichTexts = patternRichText.exec(stringStream);
//get data from content
if (contentProperties) XDocController.getDataFromJSON(XDocController.util.stringToJSON(contentProperties[1]));
//get rich texts and update data object
if (contentRichTexts) XDocController.getRichText(contentRichTexts[1]);
}
XDocContext["levels"] = XDocController.data["levels"];
//data is loaded
XDocController.dataIsLoaded = true;
//try to create body
if (XDocController.dataIsLoaded&&XDocController.templateIsLoaded){
XDocController.createBody();
}
};
//Failure
var responseFailure = function(o){
//data is loaded
XDocController.dataIsLoaded = true;
//try to create body
if (XDocController.dataIsLoaded&&XDocController.templateIsLoaded){
XDocController.createBody();
}
};
//Callback function
var callback = {
success: responseSuccess,
failure: responseFailure
};
//Get data
YAHOO.util.Connect.asyncRequest('GET', XDocController.urls["contentUrl"], callback, null);
};
/***
* get rich texts and update data object
***/
XDocController.getRichText = function(stringStream){
var pattern = /<richtext id=\"([^\"]*)\">/gi;
var rtfs = stringStream.split("</richtext>");
//last element is empty
rtfs.pop();
var ids = stringStream.match(pattern);
var brPattern1 = /^(<br>)?/;
var brPattern2 = /(<br>)?\s$/;
XDocController.data["richtexts"] = [];
for (var i=0; i<ids.length; i++){
var id = ids[i].replace(pattern,"$1");
var rtfContent = rtfs[i].replace(pattern,"");
rtfContent = rtfContent.replace(brPattern1,"");
rtfContent = rtfContent.replace(brPattern2,"");
XDocController.data["richtexts"][id] = rtfContent;
}
};
/*** 
* get presentation template
***/
XDocController.getPresentationTemplate = function(){
//success
var responseSuccess = function(o){
//o.reponseText -> 1 line
var response = o.responseText.replace(/\n/g,"");
var head = null;
var body = null;
//get body
var bodyReg = new RegExp(/<body[^>]*>(.*)<\/body>/i);
var res = bodyReg.exec(response);
if ((res!=null)&&(res.length>1)) body = res[1].replace(/<body[^>]*>(.*)<\/body>/ig,"$1");
//if template is a HTML fragment without body tag
if (!body){
body = response;
}else{
//get head
var headReg = new RegExp(/<head[^>]*>(.*)<\/head>/i);
res = headReg.exec(response);
if ((res!=null)&&(res.length>1)) head = res[1].replace(/<head[^>]*>(.*)<\/head>/ig,"$1");
}
//import head elements : script, style, css file, js file, title
XDocController.util.importHeadElements(head);
//import body elements : script, style, title
//set xmlTemplate variable
XDocController.xmlTemplate = XDocController.util.importBodyElements(body);
//template is loaded
XDocController.templateIsLoaded = true;
//try to create body
if (XDocController.dataIsLoaded&&XDocController.templateIsLoaded){
XDocController.createBody();
}
};
//Failure
var responseFailure = function(o){};
//Callback function
var callback = {
success: responseSuccess,
failure: responseFailure
};
//Get data
YAHOO.util.Connect.asyncRequest('GET', XDocController.urls["presentationTemplateUrl"], callback, null);
};
/***
* get data from JSON stream
* @param json: JSON stream
***/
XDocController.getDataFromJSON = function(json){
XDocController.data = json["data"];
}
/***
* get replacement value
* @param obj: json object
* @return: return value
***/
XDocController.getReplacement = function (obj){
var fieldName = obj["name"];
var displayFunction = obj["displayFunction"];
var index = obj["index"];
var defaultValue = obj["default"];
if (defaultValue==null) defaultValue="";
var separator = obj["separator"];
if (separator==null) separator="";
if ((!XDocController.data[fieldName])&&(XDocController.data[fieldName]!="")) return defaultValue;
var d = XDocController.data[fieldName];
if (typeof(d)=="string"){
if (displayFunction==null){
return decodeURIComponent(d);
}else{
if (XDocController[displayFunction]){
var display = XDocController[displayFunction](fieldName,0);
if (display=="") return defaultValue
else return display;
}else return decodeURIComponent(d);
}
}else if (typeof(d)=="object"){
var res = [];
if (index==null){
for (var i=0; i<d.length; i++){
if (displayFunction==null){
res.push(decodeURIComponent(d[i]["field@@value"]));
}else{
if (XDocController[displayFunction]){
res.push(XDocController[displayFunction](fieldName,i));
}else res.push(decodeURIComponent(d[i]["field@@value"]));
}
}
}else{
if (index>d.length) return defaultValue;
if (displayFunction==null){
res.push(decodeURIComponent(d[index]["field@@value"]));
}else{
if (XDocController[displayFunction]){
res.push(XDocController[displayFunction](fieldName,index));
}else res.push(decodeURIComponent(d[index]["field@@value"]));
}
}
if (res.join('')=="") return defaultValue;
return res.join(decodeURIComponent(separator));
}else return defaultValue;
}
/***
* create page's body
***/
XDocController.createBody = function(){
var xml = XDocController.xmlTemplate;
var xmlString = XDocController.util.XMLToString(xml);
var pattern = /#\{[^\}]*\}/g;
var ELs = xmlString.match(pattern);
if (ELs){
for (var i=0; i<ELs.length; i++){
var EL = ELs[i];
//delete # and replace ' by "
var jsonString = EL.substr(1).replace(/'/g,"\"");
var o = YAHOO.lang.JSON.parse(jsonString);
var replacement = XDocController.getReplacement(o);
xmlString = xmlString.replace(EL, replacement);
}
}
//add to page's body
document.getElementsByTagName("body")[0].innerHTML = xmlString;
};
