Files
alfresco-community-repo/source/web/scripts/ajax/common.js
Kevin Roast a4aa830af2 Merged from BRANCHES/DEV/KEVINR:
. NodeInfo panel and Ajax client library
 - Rewrite of Node Info panel
 - Alfresco common DOM methods refactored into namespaced object (YUI/Dojo style) Alfresco.Dom
 - Addition of useful DOM and 'smart' alignment method to common.js
 - OpenSearch now uses additional namespace for it's global method handlers: Alfresco.OpenSearchEngine
 - Temporary icons added for pop-up node info panel
. Additional FreeMarker model API method "cropContent(contentprop, length)" to return the first N bytes of a content stream - auto converted to plain/text from all supported transformation mimetypes
. DownloadContentServlet now handles ContentIOException more gracefully
. AbstractContentReader fixed to handle empty file data when requesting N characters from a content stream

. Yahoo scripts move to PageTag rendering as appropriate
. Refactoring of existing ajax components that output Yahoo scripts

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5253 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
2007-03-01 17:24:08 +00:00

283 lines
7.3 KiB
JavaScript

//
// Alfresco JavaScript support library
// Gavin Cornwell 14-07-2006
//
// Global Alfresco namespace object
if (typeof Alfresco == "undefined")
{
var Alfresco = {};
}
var _alfContextPath = null;
/**
* Error handler for errors caught in a catch block
*/
function handleCaughtError(err)
{
var msg = null;
if (err.message)
{
msg = err.message;
}
else
{
msg = err;
}
alert("An error occurred: " + msg);
}
/**
* Default handler for errors when using the dojo toolkit
*/
function handleErrorDojo(type, errObj)
{
// remove the dojo prefix from the message
var errorStart = "XMLHttpTransport Error: 500 ";
var msg = errObj.message;
if (msg.indexOf(errorStart) != -1)
{
msg = msg.substring(errorStart.length);
}
// TODO: Show a nicer error page, an alert will do for now!
alert(msg);
}
/**
* Default handler for errors when using the yahoo toolkit
*/
function handleErrorYahoo(e)
{
// TODO: Show a nicer error page, an alert will do for now!
alert(e.status + " : " + e.statusText);
}
/**
* Sets the context path to use, useful for portals where
* the URL can be different from the app's context path.
*/
function setContextPath(contextPath)
{
_alfContextPath = contextPath;
}
/**
* Calculates and returns the context path for the current page
*/
function getContextPath()
{
if (_alfContextPath == null)
{
var path = window.location.pathname;
var idx = path.indexOf("/", 1);
if (idx != -1)
{
_alfContextPath = path.substring(0, idx);
}
else
{
_alfContextPath = "";
}
}
return _alfContextPath;
}
/**
* Alfresco Utility libraries
*/
(function()
{
/**
* DOM library
*/
Alfresco.Dom = {
/**
* Returns a single child element with the given tag
* name from the given parent. If more than one tag
* exists the first one is returned, if none exist null
* is returned.
*/
getElementByTagName: function(elParent, tagName)
{
var el = null;
if (elParent != null && tagName != null)
{
var elems = elParent.getElementsByTagName(tagName);
if (elems != null && elems.length > 0)
{
el = elems[0];
}
}
return el;
},
/**
* Returns a single child element with the given tag
* name and namespace from the given parent.
* If more than one tag exists the first one is returned,
* if none exist null is returned.
*/
getElementByTagNameNS: function(elParent, nsUri, nsPrefix, tagName)
{
var el = null;
if (elParent != null && tagName != null)
{
var elems = null;
if (elParent.getElementsByTagNameNS)
{
elems = elParent.getElementsByTagNameNS(nsUri, tagName);
}
else
{
elems = elParent.getElementsByTagName(nsPrefix + ":" + tagName);
}
if (elems != null && elems.length > 0)
{
el = elems[0];
}
}
return el;
},
/**
* Returns the text of the given DOM element object
*/
getElementText: function(el)
{
var txt = null;
if (el.text != undefined)
{
// get text using IE specific property
txt = el.text;
}
else
{
// use the W3C textContent property
txt = el.textContent;
}
return txt;
},
/**
* Returns the text content of a single child element
* with the given tag name from the given parent.
* If more than one tag exists the text of the first one
* is returned, if none exist null is returned.
*/
getElementTextByTagName: function(elParent, tagName)
{
var txt = null;
var el = this.getElementByTagName(elParent, tagName);
if (el != null)
{
txt = this.getElementText(el);
}
return txt;
},
/**
* Returns the text a single child element with the given tag
* name and namespace from the given parent.
* If more than one tag exists the text of the first one is returned,
* if none exist null is returned.
*/
getElementTextByTagNameNS: function(elParent, nsUri, nsPrefix, tagName)
{
var txt = null;
var el = this.getElementByTagNameNS(elParent, nsUri, nsPrefix, tagName);
if (el != null)
{
txt = this.getElementText(el);
}
return txt;
},
/**
* Aligns an element against the specified element. Automatically adjusts the element above or to
* the left of the destination if the element would cause a scrollbar to appear.
*
* @param el Element to align
* @param destEl Destination element to align against
* @param maxwidth Maximum width of the element (assumed max-width CSS applied)
*/
smartAlignElement: function (el, destEl, maxwidth)
{
// get the position of the element we are aligning against
var pos = YAHOO.util.Dom.getXY(destEl);
// calculate display position for the element
var region = YAHOO.util.Dom.getRegion(el);
//log("DIV popup size: Width:" + (region.right-region.left) + ", Height:" + (region.bottom-region.top));
var elHeight = region.bottom - region.top;
var elWidth = region.right - region.left;
//log("elWidth:" + elWidth + " maxwidth:" + maxwidth);
if (maxwidth != undefined && maxwidth != null)
{
if (elWidth > maxwidth) elWidth = maxwidth;
}
var docWidth = YAHOO.util.Dom.getDocumentWidth();
if (pos[0] + elWidth < docWidth)
{
el.style.left = pos[0];
}
else
{
el.style.left = pos[0] - ((pos[0] + elWidth) - docWidth);
}
//log(" Element Y:" + pos[1] + " doc height:" + YAHOO.util.Dom.getDocumentHeight());
if (pos[1] + 16 + elHeight < YAHOO.util.Dom.getDocumentHeight())
{
el.style.top = pos[1] + 12;
}
else
{
//log(" ***Changing position - will overflow");
el.style.top = pos[1] - elHeight - 4;
}
}
};
})();
/**
* Logs a message to a debug log window.
*
* Example taken from http://ajaxcookbook.org/javascript-debug-log
*/
function log(message)
{
if (!log.window_ || log.window_.closed)
{
var win = window.open("", null, "width=600,height=400," +
"scrollbars=yes,resizable=yes,status=no," +
"location=no,menubar=no,toolbar=no");
if (!win) return;
var doc = win.document;
doc.write("<html><head><title>Debug Log</title></head>" +
"<body></body></html>");
doc.close();
log.window_ = win;
}
var logLine = log.window_.document.createElement("div");
logLine.appendChild(log.window_.document.createTextNode(message));
log.window_.document.body.appendChild(logLine);
}