
if (typeof XDocRender == "undefined" || !XDocRender) {
    /**
     * The XDocRender global namespace object.  If XDocRender is already defined, the
     * existing XDocRender object will not be overwritten so that defined
     * namespaces are preserved.
     */
    var XDocRender = {};
}
XDocRender.util = {};
/******* Cookie *******/
XDocRender.util.Cookie = {
/***
* create a cookie
* @param name : cookie's name
* @param value : cookie's value
* @param days : expiration
***/
createCookie: function(name,value,days){
var expires;
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
expires = "; expires="+date.toGMTString();
}else expires = "";
document.cookie = name+"="+value+expires;
},
/***
* read a cookie
* @param name : cookie's name
* @return {string} cookie's value
***/
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;
},
/***
* erase a cookie
* @param name : cookie's name
***/
eraseCookie: function(name) {
this.createCookie(name,"",-1);
}
};
/******* Date *******/
XDocRender.util.Date = {
/***
* put zeros before a number
* @param value : number
* @param nb : number of zero to put before
* @return {int} completed number
***/
completeDateValue: function(value,nb){
if (nb>value.length){
for(var i=0;nb-value.length;i++){
value = "0"+value;
}
}
return value;
},
/***
* create a sortable Data from a String
* @param dateString : date as string
* @param dateFormat : date format, ex [M]/[D]/[Y]
* @return {string} sortable date
***/
createSortableDate: function(dateString,dateFormat){
var d = null;
var year = 0;
var month = 0;
var day = 0;
var hours = 0;
var minutes = 0;
var seconds = 0;
var milliseconds = 0;
//update 17/09/2007
var elForm = dateFormat.split("/");
var format = [];
for (var i = 0;i<elForm.length;i++){
var el = elForm[i].substring(0,1);
format.push("["+el+"]");
}
dateFormat = format.join("/");
//update 17/09/2007
//Prepare regular expression with backslash for special caracters
var pattern = dateFormat.replace(/([\\\.\$\[\]\(\)\{\}\^\?\*\+\-])/g,"\\$1");
//Replace [Y],[M],... in (.*) to get the pattern
var pattern = pattern.replace(/\\\[[^\[\]]*\\\]/g,'(.*)');
var reg = new RegExp(pattern);
//Array with all date's elements
var dateElements = reg.exec(dateString);
//Bad Format
if (dateElements==null){
// alert("The Date Format "+dateFormat+" doesn't match this date : "+dateString);
}
else{
var formatElements = reg.exec(dateFormat);
for(var i=1;i<formatElements.length;i++){			
switch (formatElements[i]){
case '[Y]': {
if (dateElements[i].match(/^[0-9]*$/)) {
year = dateElements[i];
break;
}else return null;
}
case '[D]': {
if (dateElements[i].match(/^[0-9]*$/)) {
day = dateElements[i];
break;
}else return null;
}
case '[M]': {
if (dateElements[i].match(/^[0-9]*$/)) {
month = dateElements[i];
break;
}else return null;
}
case '[H]': {
if (dateElements[i].match(/^[0-9]*$/)) {
hours = dateElements[i];
break;
}else return null;
}
case '[m]': {
if (dateElements[i].match(/^[0-9]*$/)) {
minutes = dateElements[i];
break;
}else return null;
}
case '[s]': {
if (dateElements[i].match(/^[0-9]*$/)) {
seconds = dateElements[i];
break;
}else return null;
}
case '[S]': {
if (dateElements[i].match(/^[0-9]*$/)) {
milliseconds = dateElements[i];
break;
}else return null;
}
default : break;
}
}
d = new Array();
d.push(year);
d.push(month);
d.push(day);
d.push(hours);
d.push(minutes);
d.push(seconds);
d.push(milliseconds);
}
if (d!= null) return d.join('');
else return d;
},
/***
* transform date string in array
* @param dateString : date as string (12/12/2008)
* @param dateFormat : date format (MM/DD/YYYY)
* @return {array} date as array
***/
dateStringToArray: function(dateString,dateFormat){
//contains value of date elements, day, month, year
var dateElements = [];
var elementsDate = dateString.split("/");	
var formatElements = dateFormat.split("/");
for (var i = 0;i<formatElements.length;i++){
var element = formatElements[i];
var formatElement = element.substring(0,1);
dateElements[formatElement] = elementsDate[i];
}
return dateElements;
},
/***
* change date form dateFormat1 to dateFormat2
* @param dateString : date as string (12/12/2008)
* @param dateFormat1 : date format (MM/DD/YYYY)
* @param dateFormat2 : date format (DD/MM/YYYY)
* @return transformed date (string)
***/
changeDateFormat: function(dateString, dateFormat1, dateFormat2){
//if dateString doesn't match dateFormat1 format, return unchanged dateString
if (!this.isDateValid(dateString, dateFormat1)) return dateString;
//contains value of date elements, day, month, year in dateFormat1 format
var dateElementsOfFormat1 = this.dateStringToArray(dateString, dateFormat1);
//create date Array in dateFormat2 format
var format2Elements = dateFormat2.split("/");
var newDateStringArray = [];
for (var i = 0;i<format2Elements.length;i++){
var element = format2Elements[i];
var format2Element = element.substring(0,1);
newDateStringArray.push(dateElementsOfFormat1[format2Element]);
}
//return date string in dateFormat2 format
return newDateStringArray.join('/');
},
/***
* test if date is valid according a date format
* @param dateString : date as string (12/12/2008)
* @param dateFormat : date format (MM/DD/YYYY)
* @return true if date is valid, false otherwise
***/
isDateValid: function(dateString, dateFormat){
//Prepare regular expression with backslash for special caracters
var pattern = "/"+dateFormat.replace(/([\\\.\$\[\]\(\)\{\}\^\?\*\+\-\/])/g,"\\$1")+"/";
//Replace D, M, Y,... in '.' to get the pattern
pattern = pattern.replace(/[a-z]/ig,".");
//Create regular expression
var regExpr = eval(pattern);
var isDateInCorrectFormat = regExpr.test(dateString);
//day, month and year have to be integer?
var dateArray = this.dateStringToArray(dateString, dateFormat);
var intPattern = /^[0-9]*$/;
var day = dateArray["D"];
var month = dateArray["M"];
var year = dateArray["Y"];
//is day a valid number
if (intPattern.test(day)){
var dayInt = parseInt(day);
if (dayInt>31) return false;
}else{
return false;
}
//is month a valid number
if (intPattern.test(month)){
var monthInt = parseInt(month);
if (month>12) return false;
}else{
return false;
}
//is year a valid number
if (!intPattern.test(year)){
return false;
}
return isDateInCorrectFormat;
}
};
/****** File *******/
XDocRender.util.File = {
/***
* added CSS files
***/
CSSadded: [],
/***
* added JS files
***/
JSadded: [],
/***
* import CSS file
* @param file : file URL
***/
importCSSFile: function(file){
if (this.CSSadded[file]==null){
var elmt=document.createElement("link");
elmt.setAttribute('rel','stylesheet');
elmt.setAttribute('type','text/css');
elmt.setAttribute('href',file);
var head = document.getElementsByTagName('head').item(0);
head.appendChild(elmt);
this.CSSadded[file] = "";
}
},
/***
* import JS file
* @param file : file URL
***/
importJSFile: function(file){
if (this.JSadded[file]==null){
var elmt=document.createElement("script");
elmt.setAttribute('type','text/javascript');
elmt.setAttribute('src',file);
var head = document.getElementsByTagName('head').item(0);
head.appendChild(elmt);
this.JSadded[file] = "";
}
}
};
/******* Tools *******/
XDocRender.util.Tools = {
/***
* get URL parameter
* @param paramName : parameter name
* @return {string} paramater value
***/
getURLParameter: function(paramName){
var paramValue = null;
var url = location.href;
if (url.split("?").length>1){
var params = url.split("?")[1].split("&");
for (var i=0;i<params.length;i++){
var name = params[i].split("=")[0];
var value = params[i].split("=")[1];
if (name==paramName){
paramValue=value;
break;
}
}
}
return paramValue;
},
/***
* get tag value in a XML stream
* @param xml : xml stream
* @param tagName : tag name
* @return {string} tag value
***/
getXMLTagValue: function(xml,tagName){
var elements = xml.getElementsByTagName(tagName);
if (elements.length>0){
var firstElement = elements.item(0).firstChild;
if (firstElement)
return decodeURIComponent(firstElement.nodeValue);
else return "";
}else return null;
},
/***
* transform simple query in a query understandable by Domino search engine
* @param query : simple query (like google)
* @return {string} trandformed query
***/
createDominoQuery: function(query){
if (query==null) {query="";}
//GOOGLE
var googleQuery = query;	
//space -> @@SPACE@@
googleQuery = googleQuery.replace(/(%20)+/g, "@@SPACE@@");	
//trim
googleQuery = googleQuery.replace(/^@@SPACE@@(.*)/,"$1");
googleQuery = googleQuery.replace(/(.*)@@SPACE@@$/,"$1");	
//leave space in double quotes
googleQuery2 = "" ;
while (googleQuery2 != googleQuery) {
googleQuery2 = googleQuery ;
googleQuery = googleQuery.replace(/%22(.*?)@@SPACE@@(.*?)%22/g, "%22$1%20$2%22");
}
//AND  -> @@AND@@
googleQuery = googleQuery.replace(/@@SPACE@@AND@@SPACE@@/gi, "@@AND@@");	
//OR -> @@OR@@
googleQuery = googleQuery.replace(/@@SPACE@@OR@@SPACE@@/gi, "@@OR@@");	
//SPACE out of quotes -> AND
googleQuery = googleQuery.replace(/@@SPACE@@/g, "@@AND@@");
var DOMINOquery = googleQuery;
DOMINOquery = DOMINOquery.replace(/@@AND@@/g,"%20AND%20");
DOMINOquery = DOMINOquery.replace(/@@OR@@/g,"%20OR%20");
DOMINOquery = DOMINOquery.replace(/%22/g,"%20");
//trim
DOMINOquery = DOMINOquery.replace(/^%20(.*)/,"$1");
DOMINOquery = DOMINOquery.replace(/(.*)%20$/,"$1");	
return DOMINOquery;
},
/***
* add special URL parameter to href attribute in A tag and to action attribute in form tag.
* This special parameter is a string representation of current username
* @param id : id of the tag used as starting point
***/
addXDocLibUserNameToLink: function(id){
//if current_user isn't defined, null or empty, nothing is done
if (typeof(current_user)=="undefined") return;
var XDocLib_User = current_user;
if ((XDocLib_User==null)||(XDocLib_User=="")) return;
var linkList;
var formList;
//if no id, search in the whole page
//linkList is the list of A tags
//formList is the list of form tags
if (id==null){
linkList = document.getElementsByTagName("a");
formList = document.getElementsByTagName("form");
}
else{
linkList = document.getElementById(id).getElementsByTagName("a");
formList = document.getElementById(id).getElementsByTagName("form");
}
//A tags
for (var i=0;i<linkList.length;i++){
var link = linkList[i];
var ok = true;
//href contains "://" string therefore href is an absolute URL
//we need to compare its domain with current page domain before adding XDoc parameter
if (link.href.match(/:\/\//)){
var current_link = link.href.replace(/.*:\/\//,"");
var pathElements1 = current_link.split("/");
var serverName1;
if (pathElements1.length>0) serverName1 = pathElements1[0];
var page_link = document.location.href.replace(/.*:\/\//,"");
var pathElements2 = page_link.split("/");
var serverName2;
if (pathElements2.length>0) serverName2 = pathElements2[0];
if (serverName1!=serverName2) ok = (ok)&&(false);
}
//Don't add parameter to special href
if (link.href.match(/^javascript/)) ok = (ok)&&(false);
if (link.href.match(/^mailto/)) ok = (ok)&&(false);
//add parameter
if (ok){ 
//IE bug (@ in href innerHTML) : changing link href changes link innerHTML
var inner = link.innerHTML;
//add openElement command in url containing $FILE but no "?"
if (link.href.match(/\$FILE/) && !(link.href.match(/\?/)) )
link.href += "?OpenElement"+"&XDocLibUserName="+XDocLib_User;
//dont need to add parameter if it is already present, we just replace it
if (link.href.match(/&XDocLibUserName=/)){
link.href = link.href.replace(/&XDocLibUserName=([^&]*)/,"&XDocLibUserName="+XDocLib_User);
}else link.href +="&XDocLibUserName="+XDocLib_User;
//IE bug (@ in href innerHTML) : changing link href changes link innerHTML
link.innerHTML = inner;
}
}
//form tags
for (var i=0;i<formList.length;i++){
var form = formList[i];
var ok = true;
//action contains "://" string therefore href is an absolute URL
//we need to compare its domain with current page domain before adding XDoc parameter
if (form.action.match(/:\/\//)){
var current_link = form.action.replace(/.*:\/\//,"");
var pathElements1 = current_link.split("/");
var serverName1;
if (pathElements1.length>0) serverName1 = pathElements1[0];
var page_link = document.location.href.replace(/.*:\/\//,"");
var pathElements2 = page_link.split("/");
var serverName2;
if (pathElements2.length>0) serverName2 = pathElements2[0];
if (serverName1!=serverName2) ok = (ok)&&(false);
}
//Don't add parameter to special action
if (form.action.match(/^javascript/)) ok = (ok)&&(false);
if (form.action.match(/^mailto/)) ok = (ok)&&(false);
//add parameter
if (ok){ 
//add openElement command in url containing $FILE but no "?"
if (form.action.match(/\$FILE/) && !(form.action.match(/\?/))){
form.action += "?OpenElement"+"&XDocLibUserName="+XDocLib_User;
}
//dont need to add parameter if it's already present, we just replace it
if (form.action.match(/&XDocLibUserName=/)){
form.action = form.action.replace(/&XDocLibUserName=([^&]*)/,"&XDocLibUserName="+XDocLib_User);
}else form.action +="&XDocLibUserName="+XDocLib_User;
}
}	
},
/***
* generate a random number
* @param size : number size
* @return {int} random number
***/
createRandomNumber: function(size){
var nb = Math.random();
var multi = Math.pow(10,size);
return Math.floor(nb*multi);
},
/***
* generate a random number in an interval
* @param lower : lower number (included)
* @param higher : higher number (omitted)
* @return {int} random number
***/
createRandomNumberInInterval: function(lower,higher){
if (lower==higher) return lower;
if (lower>higher){
var temp = higher;
higher = lower;
lower = temp;
}
var nb = Math.random();
return Math.floor(nb*(higher-lower) + lower);
},
/***
* remove a value in an array
* @param myArray : array
* @param position : position of the value to be removed
* @return array without the value
***/
removeValueInArray: function(myArray, position){
if (position>0){
var tmp = myArray.splice(0,position);
myArray.shift();
while(tmp.length>0){
myArray.unshift(tmp.pop());
}
}else{
myArray.shift();
}
},
/***
* remove unnecessary spaces
* @param s : text as string
* @return {string} trimed string
***/
trim: function(s){
s = s.replace(/^(\s)*([^\s].*)/,"$2");
s = s.replace(/(.*[^\s])(\s)*$/,"$1");
return s;
},
/***
* clone an object
* @param obj : object to clone
* @return cloned object
***/
clone: function(obj){
return YAHOO.lang.JSON.parse(YAHOO.lang.JSON.stringify(obj));
},
/***
* make an element displayable in HTML
* @param element
* @return escaped element
***/
escapeHTML: function(element){
var div = document.createElement('div');
var text = document.createTextNode(element);
div.appendChild(text);
return div.innerHTML;
}
};
