
<!-- needed because some default magnolian includes do change position of elements 

var contextPath = '';

<!-- i18n -->
/* ###################################
### i18n.js
################################### */

/* ###################################
### Message Class
################################### */

var MGNL_I18N_DEFAULT_BASENAME = "info.magnolia.module.admininterface.messages";

/* ###################################
### Constructor
################################### */

function MgnlI18nMessages(){
	this.messages = new Object();
}

/* ###################################
### Add a message. Basename is optional
################################### */

MgnlI18nMessages.prototype.add = function (key, msg, basename){
	if(basename==null){
		basename = MGNL_I18N_DEFAULT_BASENAME;
	}
	
	if(this.messages[basename] == null){
		this.messages[basename] = new Object();
	}
	
	this.messages[basename][key]=msg;
}


/* ###################################
### Get a Message. Basename is optional
################################### */

MgnlI18nMessages.prototype.get = function (key, basename, args){
	var msg;
	
	// basename is optional
	if(basename == null)
		basename = MGNL_I18N_DEFAULT_BASENAME;
		
	// return ??? key ??? if you can't find the mesage
	if(this.messages[basename] == null || this.messages[basename][key] == null){
		return "???" + key + "???";
	}
	
	msg = this.messages[basename][key];
	
	// replace parameters
	if(args != null){
		for(i=0; i<args.length;i++){
			msg = msg.replace("{" + i +"}", args[i]);
		}
	}
	return msg;
}

var mgnlMessages = new MgnlI18nMessages();



/* ###################################
### Generated Messages
################################### */

mgnlMessages.add('js.dialog.calendar.month10','October','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.mon','Mon','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.tue','Tue','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.move.aboveThisOne','Move the paragraph selected above this one','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.datecheck.date','Date must be of format\nyyyy-MM-dd\n\nexample:\n2004-06-14','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.thu','Thu','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.delete.text','The selected paragraph will be deleted immediately.\n\nAre you sure to continue?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month4','April','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.richedit.nopaste','Your browser does not support clean paste','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.verifyname.illegalCharacter','Illegal characters in name!','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.exportnode.confirm.text','Are you sure you want to continue?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month5','May','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.savenode.confirmDeactivation.text','Save will de-activate the node.\nContinue?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month12','December','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.sun','Sun','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month11','November','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month3','March','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.wed','Wed','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month2','February','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month7','July','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month9','September','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month8','August','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month6','June','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.month1','January','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.import.button','Import','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.saving','Saving...','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.inline.delete.title','Delete paragraph?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.deletenode.confirm.title','Delete node?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.fri','Fri','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.datecheck.datetime','Date must be of format\nyyyy-MM-dd\'T\'HH:mm:ss\n\nexample:\n2004-06-14T09:28:00','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.calendar.sat','Sat','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.richedit.pastehelp','Text copied in some applications (e.g. Word, Excel) contains additional information which might mess up your web content.\n\n Pasting text by Ctrl-V would insert this additional information.','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.acl.choose','Please choose a role','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.savenode.confirmDeactivation.title','De-activation warning','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.deletenode.confirm.text','The node\n{0}\nwill be de-activated and deleted immediately.\n\nAre you sure to continue?','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.dialog.password.failed','Password verification failed!','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.exportnode.confirm.title','Exporting {0} to xml.','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.loading','Loading...','info.magnolia.module.admininterface.messages');
mgnlMessages.add('js.tree.pastenode.itself','It\'s not possible to move a node into itself.','info.magnolia.module.admininterface.messages');

 <!-- load the messages from propertyfiles -->

/* ###################################
### generic.js
### generic, magnolia independant methods
################################### */


/**
 * Simple shortcut for document.getElementById()
 */
function $(element)
{
    return document.getElementById(element);
}

/**
 * get position of an object
 */
function mgnlGetPosX(obj)
	{
	if (!obj) return 0;

  	if (navigator.appName.indexOf("Microsoft")==-1)
  		{
  		if (navigator.vendor!=("Netscape6") && navigator.product!=("Gecko")) return obj.x; //ns4
  		else //ns6; don't laugh...
  			{
  			for (var elem in obj)
  				{
  				var tmp=obj[elem];
  				}
  			return obj.offsetLeft;
  			}
  		}
  	var x=document.body.scrollLeft;
  	while (obj.offsetParent)
  		{
  		x+=obj.offsetLeft;
  		obj=obj.offsetParent;
  		}
	return x; //ie
	}


function mgnlGetPosY(obj)
	{
	if (!obj) return 0;

	return obj.offsetTop;
  	if (navigator.appName.indexOf("Microsoft")==-1)
  		{
  		if (navigator.vendor!=("Netscape6") && navigator.product!=("Gecko")) return obj.y; //ns4
  		else //ns6; don't laugh...
  			{
  			for (var elem in obj)
  				{
  				var tmp=obj[elem];
  				}
  			return obj.offsetTop;
  			}
  		}
  	var y=document.body.scrollTop;
  	while (obj.offsetParent)
  		{
  		y+=obj.offsetLeft;
  		obj=obj.offsetParent;
  		}
	return y; //ie
	}


function mgnlGetMousePos(event)
	{
	var pos=new Object();
	if (document.all)
		{
		pos.x=window.event.clientX+document.body.scrollLeft;
		pos.y=window.event.clientY+document.body.scrollTop;
		}
	else
		{
		pos.x=event.pageX;
		pos.y=event.pageY;
		}
	return pos;
	}


/* ###################################
### miscellaneous
################################### */


function mgnlIsKeyEnter(event)
	{
	return mgnlIsKey(event,13);
	}

function mgnlIsKeyEscape(event)
	{
	return mgnlIsKey(event,27);
	}

function mgnlIsKey(event,keyCode)
	{
	if (window.event && window.event.keyCode == keyCode) return true;
	else if (navigator.appName=="Netscape" && event.which==keyCode) return true;
	else return false;
	}

function mgnlWhichKey(event)
	{
	if (window.event && window.event.keyCode) alert(window.event.keyCode);
	else if (navigator.appName=="Netscape" && event.which==keyCode) alert(event.which);
	}



function mgnlGetWindowSize()
	{
	var obj=new Object();
	if( typeof (window.innerWidth) == 'number' )
		{
		//Non-IE
		obj.w=window.innerWidth;
		obj.h=window.innerHeight;
		}
	else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		{
		//IE 6+ in 'standards compliant mode'
		obj.w=document.documentElement.clientWidth;
		obj.h=document.documentElement.clientHeight;
		}
	else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		{
		//IE 4 compatible
		obj.w=document.body.clientWidth;
		obj.h=document.body.clientHeight;
		}
	//alert(h+'//'+w);
	return obj;
	}


function mgnlGetIFrameDocument(iFrameName)
	{
	if (document.frames && document.frames[iFrameName]) return document.frames[iFrameName].document;
	else if (document.getElementById(iFrameName)) return document.getElementById(iFrameName).contentDocument;
    else return null;
	}

function mgnlGetCacheKiller() {
    var now = new Date();
    return now.getTime();
}



/* ###################################
### add/remove parameter to query string
################################### */

function mgnlAddParameter(href,name,value)
	{
	var delimiter;
	if (href.indexOf("?")==-1) delimiter="?";
	else delimiter="&";
	return href+delimiter+name+"="+value;
	}


function mgnlRemoveParameter(href,name)
	{
	//works only for a single paramter
	/*
	var nameExtended;
	var delimiter
	var tmp;
	if (href.indexOf("?"+name+"=")!=-1) delimiter="?";
	else delimiter="&";

	var tmp=href.split(delimiter+name+"=");
	var href2=tmp[0];
	if (tmp[1])
		{
		if (tmp[1].indexOf("&")!=-1) href2+=delimiter+tmp[1].substring(tmp[1].indexOf("&")+1);
		}
	return href2;
	*/

	var tmp=href.split("?");

	var newHref=tmp[0];
	if (tmp[1])
		{
		var paramObj=tmp[1].split("&");
		var isQuestionMarkAppended = false;

		for (var i=0;i<paramObj.length;i++)
			{
			if (paramObj[i].indexOf(name+"=")!=0)
				{
				if (!isQuestionMarkAppended)
				{
					newHref+="?";
					isQuestionMarkAppended = true;
				}
				else newHref+="&";
				newHref+=paramObj[i];
				}
			}
		}
	return newHref;
	}


/* ###################################
### general.js
### some general magnolia methods (used all over magnolia)
################################### */


/* ###################################
### open window
################################### */


function mgnlOpenWindow(url,width,height)
	{

	//dialog window is resized in  dialog itself (window.resize)
    if (!width) width=800;
    if (!height) height=100;
	url="/" + url;
	if(url.indexOf('?')>=0){
		url+="&";
	}
	else{
		url+="?";
	}
	url+="mgnlCK="+mgnlGetCacheKiller();

	var w=window.open(url,"mgnlDialog"+mgnlGetCacheKiller(),"width="+width+",height="+height+"scrollbars=no,status=yes,resizable=yes");
	if (w) w.focus();
	}


/* ###################################
### open dialog window
################################### */


function mgnlOpenDialog(path,nodeCollection,node,paragraph,repository,dialogPage,width,height)
	{

	//dialog window is resized in  dialog itself (window.resize)
    if (!width) width=800;
    if (!height) height=100;

	//magnolia edit window: add browser information (needed for rich editor)
    var agent=navigator.userAgent.toLowerCase();

	var richE="false";
	var richEPaste="";
	var richESupported=false;
	if (document.designMode)
		{
		//safari has designMode...
	    if (agent.indexOf("safari")==-1) richESupported=true;
		}
	if (richESupported)
		{
		//richedit
		richE="true";
		if (agent.indexOf("mac")!=-1) richEPaste="false";
		else if (agent.indexOf("msie")!=-1)  richEPaste="button";
		else richEPaste="textarea";
		}

	if (!dialogPage){
		dialogPage = ".magnolia/dialogs/" + paragraph + ".html";
	 	//dialogPage=".magnolia/dialogs/standard.html";
	}

    url="/";
    url+=dialogPage;
    url+="?mgnlPath="+path;
    url+="&mgnlNodeCollection="+nodeCollection;
	url+="&mgnlNode="+node;
	url+="&mgnlParagraph="+paragraph;
	url+="&mgnlRichE="+richE;
	url+="&mgnlRichEPaste="+richEPaste;
	url+="&mgnlRepository="+repository;
	url+="&mgnlCK="+mgnlGetCacheKiller();

	var w=window.open(url,"mgnlDialog"+mgnlGetCacheKiller(),"width="+width+",height="+height+"scrollbars=no,status=yes,resizable=yes");
	if (w) w.focus();
	}


/* ###################################
### open tree browser
################################### */

function mgnlOpenTreeBrowser(pathSelected, pathOpen, repository, width, height, callBackCommand){
	mgnlDebug("mgnlOpenTreeBrowser","dialog");
	if (!width) width=450;
	if (!height) height=550;
	var src="/.magnolia/dialogpages/linkBrowser.html?mgnlCK="+mgnlGetCacheKiller();
	if (pathSelected) src+="&pathSelected="+pathSelected;
	if (pathOpen) src+="&pathOpen="+pathOpen;
	if (repository) src+="&repository="+repository;
	var w=window.open(src,"mgnlTreeBrowser","width="+width+",height="+height+",resizable=yes,status=yes,scrollbars=no");

	if (w){
		mgnlDebug("register call back function", "dialog");
		w.mgnlCallBackCommand = callBackCommand;
	}
}

function mgnlOpenTreeBrowserWithControl(control,pathSelected,pathOpen,repository,extension,width,height,addcontext){
	mgnlDebug("mgnlOpenTreeBrowserWithControl","dialog");
	var callBackCommand = new MgnlTreeBrowserWithControlCallBackCommand(control,extension,addcontext);
	mgnlOpenTreeBrowser(pathSelected, pathOpen, repository, width, height, callBackCommand)
}

/* ###################################
### tree browser default callback
################################### */

function MgnlTreeBrowserWithControlCallBackCommand(control, extension, addcontext){
	this.control = control;
	this.extension = extension;
	this.addcontext = addcontext;

	this.callback = function(value){
		if (this.addcontext){
		  value = contextPath + value;
		}

		if (this.extension){
			value += "." + extension;
		}

		mgnlDebug("MgnlTreeBrowserCallBackCommand: write to the control", "dialog");
		this.control.value = value;
	}
}



/* ###################################
### open adminCentral
################################### */

function mgnlOpenAdminCentral(path,repository)
	{
	var src="";
	src+="/.magnolia/adminCentral.html?mgnlCK="+mgnlGetCacheKiller();
	src+="&pathSelected="+path;
	if (repository) src+="&repository="+repository;
    var w=window.open(src,"mgnlAdminCentral","");
	if (w) w.focus();
	}






/* ###################################
### update mgnlCK in the extisting location string
################################### */

function mgnlUpdateCK(href)
	{
	if (!href) href=document.location.href;
	tmp=href.split("?")
	var href2=tmp[0]+"?mgnlCK="+new Date().getTime();
	if (tmp[1])
		{
		var qs=tmp[1].split("&");
		for (var elem=0; elem<qs.length; elem++)
			{
			if (qs[elem].indexOf("mgnlCK=")!=0) href2+="&"+qs[elem];
			}
		}
	return href2;
	}


/* ###################################
### alert
################################### */
function mgnlAlert(text,title)
	{
    var line="--------------------------------------------\n";
    var alertText="";
    alertText+=line;
    if (title) alertText+=title+"\n"+line;
   	alertText+="\n"+text+"\n";
   	alertText+=line;
   	alert(alertText);
	}

/* ###################################
### confirm
################################### */
function mgnlConfirm(text,title)
	{
    var line="--------------------------------------------\n";
    var alertText="";
    alertText+=line;
    if (title) alertText+=title+"\n"+line;
   	alertText+="\n"+text+"\n";
   	alertText+=line;
   	return confirm(alertText);
   	}


function eventHandlerOnResize(e)
	{
	//resize tabs before resize of trees (in case there are any trees on a tab)
	mgnlDialogResizeTabs();
	mgnlDialogLinkBrowserResize();
	mgnlTreeResize();
	mgnlAdminCentralResize();
	}


/* ###################################
### adminCentral.js
################################### */

function mgnlAdminCentralResize()
	{
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");
	var divButtons=document.getElementById("mgnlAdminCentral_ButtonsDiv");

	if (divExtractTree && divButtons)
		{
		if (navigator.userAgent.toLowerCase().indexOf("safari")!=-1)
			{
			divExtractNonTree.style.display="block";
			}


		var sizeObj=mgnlGetWindowSize();
		//80 is top position of divTrees
		var h=sizeObj.h-80-20;
		//20 is left position of divTrees
		var w=sizeObj.w-200-20;


		//todo: to be tested!
		var agent=navigator.userAgent.toLowerCase();
		if (agent.indexOf("msie")!=-1) divButtons.style.height=h-29;
		else divButtons.style.height=h-37;

		divExtractTree.style.width=w;
		divExtractTree.style.height=h;
		var iFrameTree=document.getElementById("mgnlAdminCentral_ExtractTreeIFrame");
		iFrameTree.style.height=h;

		divExtractNonTree.style.width=w;
		divExtractNonTree.style.height=h-30;
		var iFrameNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeIFrame");
		iFrameNonTree.style.height=h-30;
		}
	}

function mgnlAdminCentralSwitchExtractTree(name,href)
	{
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");

	divExtractTree.style.visibility="hidden";
	divExtractNonTree.style.visibility="hidden";

	if (navigator.userAgent.toLowerCase().indexOf("safari")==-1)
		{
		divExtractTree.style.display="block";
		divExtractNonTree.style.display="none";
		}


    var iFrameDoc=mgnlGetIFrameDocument('mgnlAdminCentral_ExtractTreeIFrame');
	if (!href) href="/.magnolia/adminCentral/extractTree.html";

	var divSuper=iFrameDoc.getElementById("mgnlTree_DivSuper");
	if (divSuper) divSuper.style.display="none";

	href=mgnlAddParameter(href,"mgnlCK",mgnlGetCacheKiller());
	href=mgnlAddParameter(href,"name", name);
	iFrameDoc.location.href = contextPath + href;

	divExtractTree.style.visibility="visible";
	}

function mgnlAdminCentralSwitchExtractNonTree(href, external)
	{
	external = external == null? false : external;
		
	var divExtractTree=document.getElementById("mgnlAdminCentral_ExtractTreeDiv");
	var divExtractNonTree=document.getElementById("mgnlAdminCentral_ExtractNonTreeDiv");

	divExtractTree.style.visibility="hidden";
	divExtractNonTree.style.visibility="hidden";

	if (navigator.userAgent.toLowerCase().indexOf("safari")==-1)
		{
		divExtractTree.style.display="none";
		divExtractNonTree.style.display="block";
		}

	divExtractNonTree.style.visibility="visible";

	var iframe = document.getElementById('mgnlAdminCentral_ExtractNonTreeIFrame');
	if( ! external){
		href = contextPath + href;
		href=mgnlAddParameter(href,"mgnlCK",mgnlGetCacheKiller());
	}
	
	iframe.src = href;
	}







function pgnlTreeMenuItemOpen( tree ) {
	top.document.location.href = "/strutsAction/editPage.do?handle=" + tree.selectedNode.path;
}

function pgnlDialogFormApply( portletId ) {
	// send data to server
	var url = location.protocol + "//" + location.host + location.pathname;
	
	processSubmitResponse = function( xmlhttp ) {
		opener.kmuwebController.refreshPortlet( portletId, window );
	}
	
	// generate post body
	var postBody = "param1=value1&param2=value2";
	
	// persist
	pgnlSubmitForm( url, postBody, processSubmitResponse );
}


/* ###################################
### delete paragraph
################################### */

var isAssetDeleted = false;
var isPortletRefreshed = false;

function pgnlDeleteAsset( path, paragraphName, nodeName, portletId ) {
	isAssetDeleted = false;
	var alertText = mgnlMessages.get("js.inline.delete.text");
	if (mgnlConfirm(alertText,mgnlMessages.get("js.inline.delete.title"))) {
		//var href=mgnlUpdateCK(document.location.href)

		var href = document.location.href;
		href = mgnlRemoveParameter( href, 'pgnlPath' );
		href = mgnlAddParameter( href, "pgnlPath", path );
		href = mgnlRemoveParameter( href, 'pgnlParagraphName' );
		href = mgnlAddParameter( href, "pgnlParagraphName", paragraphName );
		href = mgnlRemoveParameter( href, 'pgnlNodeName' );
		href = mgnlAddParameter( href, "pgnlNodeName", nodeName );
		href = mgnlRemoveParameter( href, 'action' );
		href = mgnlAddParameter( href, "action", "controls.DeleteAsset" );
		href = mgnlRemoveParameter( href, 'js_peid' );
		href = mgnlAddParameter( href, "js_peid", portletId );

		processDeleteAssetResponse = function( xmlhttp ) {
			// refresh portlet
			isPortletRefreshed = false;
			var portletHtml = xmlhttp.responseText;
			
			// refresh view
			var portletDiv = document.getElementById( portletId );
			var portletPos = eval( '_rowcol=' + portletDiv.attributes['name'].value );
			
			portletDiv.parentNode.innerHTML = portletHtml;
			buildDragLists( portletPos.portletSetId );
			isAssetDeleted = true;
			
			//kmuwebController.refreshPortlet( portletId, this );
		}
		
		// delete asset
		sendRequest( href, processDeleteAssetResponse );

	}
	else return;
}


/* ###################################
### utilities for drop down menu
### see http://www.aplus.co.yu/adxmenu/end-of-the-road/
################################### */

// globals, Copyright 2001-2005 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xNN4,xUA=navigator.userAgent.toLowerCase();
if(window.opera){
  var i=xUA.indexOf('opera');
  if(i!=-1){
    var v=parseInt(xUA.charAt(i+6));
    xOp7Up=v>=7;
    xOp6Dn=v<7;
  }
}
else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){
  xIE4Up=parseFloat(navigator.appVersion)>=4;
  xIE4=xUA.indexOf('msie 4')!=-1;
  xIE5=xUA.indexOf('msie 5')!=-1;
}
else if(document.layers){xNN4=true;}
xMac=xUA.indexOf('mac')!=-1;


function xInitializeDropDownMenu() {
	xGetElementsByClassName("menu", document, "div", function(navDiv) { 
		xGetElementsByClassName("menuList", navDiv, "ul", function(oUL) {
			xGetElementsByClassName("submenu", oUL, "li", function(oLI) {
				oLI.onmouseover = function() {
					if (!this.UL) {
						this.UL = oLI.getElementsByTagName("ul")[0];
					}
					if (this.UL) {
						this.UL.style.visibility = "visible";
						this.UL.style.display = "block";
					}
				}
					
				oLI.onmouseout = function() {
					if (this.UL) {
						this.UL.style.visibility = "hidden";
					}
				}
			} );
		} );
	} );
}

// xGetElementsByTagName, Copyright 2001-2005 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xGetElementsByTagName(t,p)
{
  var list = null;
  t = t || '*';
  p = p || document;
  if (xIE4 || xIE5) {
    if (t == '*') list = p.all;
    else list = p.all.tags(t);
  }
  else if (p.getElementsByTagName) list = p.getElementsByTagName(t);
  return list || new Array();
}



// xGetElementsByClassName, Copyright 2001-2005 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xGetElementsByClassName(c,p,t,f)
{
  var found = new Array();
  var re = new RegExp('\\b'+c+'\\b', 'i');
  var list = xGetElementsByTagName(t, p);
  for (var i = 0; i < list.length; ++i) {
    if (list[i].className && list[i].className.search(re) != -1) {
      found[found.length] = list[i];
      if (f) f(list[i]);
    }
  }
  return found;
}



