/**
  * macro rendering a skin
  * @param name name of skin
  */
function skin_macro(par)	{
	if ( par && par.name )	{
		this.renderSkin(par.name);
	}
}


/**
  * macro-wrapper for href-function
  * @param action name of action to call on this prototype, default main
  */
function href_macro(par)	{
	return this.href( (par&&par.action)?par.action:"main" );
}


/**
 * Macro returning the URL of an application.
 * using absoluteURI if set in app.properties, otherwise we go for the href calculated by 
 * the application (which is using baseURI if set)
 */
function url_macro() {
	var str = this.getProperty("absoluteuri");
	if ( str!=null && str!="" )	{
		return str;
	}	else	{
		return this.getRootHref();
	}
}


/** 
  * Macro returning the title of an application
  */
function title_macro() {
	var title = this.name;
	return(title);
}


/**
  * Macro rendering a description of an application from a 
  * file called description.txt or doc.html located in the
  * app's root. Limits description to 200 chars.
  * @param Object Macro parameter object
  */
function description_macro(param) {
	var str = "";
	var appHome = this.getAppDir();
	var f = new File(this.getAppDir().toString(), "description.txt");
	if (!f.exists())
		f = new File(this.getAppDir().toString(), "doc.html");
	if (f.exists()) {
		str = f.readAll();
		if (str.length > 200)
			str = str.substring(0, 200) + "...";
	}
	return(str);
}


/**
  * Macro returning the server's uptime nicely formatted
  */
function uptime_macro()	{
	return formatAge( (java.lang.System.currentTimeMillis()-this.starttime) / 1000 );
}


/**
  * Macro returning the number of active sessions.
  * parameter used by global.formatCount
  * @see global.formatCount
  */
function countSessions_macro(par)	{
	if ( this.isActive()==true )
		return this.sessions.size() + formatCount(this.sessions.size(),par);
	else
		return 0;
}


/**
  * Macro returning the number of logged-in users or the list
  * of logged-in users if http-parameter showusers is set to true.
  * Makes use of this.countUsers_macro and this.listUsers_macro
  * @see application.countUsers_macro
  * @see application.listUsers_macro
  */
function users_macro(par)	{
	if ( req.data.showusers=="true" )	{
		this.listUsers_macro(par);
	}	else	{
		this.countUsers_macro(par);
	}
}


/**
  * Macro returning the number of logged-in users if application
  * is active
  * parameter used by global.formatCount
  * @see global.formatCount
  */
function countUsers_macro(par)	{
	if ( this.isActive()==true )
		return this.activeUsers.size() + formatCount(this.activeUsers.size(),par);
	else
		return 0;
}


/**
  * Macro rendering the list of logged-in users if application is active
  * @param separator html-code written between elements
  */
function listUsers_macro(par)	{
	var separator = (par && par.separator) ? par.separator : ", ";
	if ( this.activeUsers.size()==0 )
		return "";
	var e = this.activeUsers.keys();
	while ( e.hasMoreElements() )	{
		res.write ( e.nextElement() );
		if ( e.hasMoreElements() )	{
			res.write ( separator );
		}
	}
}


/**
  * Macro returning the number of active evaluators (=threads)
  */
function countActiveEvaluators_macro()	{
	return this.countActiveEvaluators();
}


/**
  * Macro returning the number of free evaluators (=threads)
  */
function countFreeEvaluators_macro()	{
	return this.countFreeEvaluators();
}


/**
  * Macro returning the current number of objects in the cache
  */
function cacheusage_macro (param) {
   return this.getCacheUsage ();
}


/**
  * Macro returning the number of objects allowed in the cache
  */
function cachesize_macro (param) {
   return this.getProperty ("cachesize", "1000");
}


/**
  * Macro formatting the number of requests in the last 5 minutes
  */
function requestCount_macro(par)	{
	if (app.data.stat==null || app.data.stat.get (this.name)==null)
		return "not available";
	if (this.isActive()) {
		var obj = app.data.stat.get (this.name);
		return obj.requestCount + formatCount (obj.requestCount, par);
	}	else	{
		return 0 + formatCount (0,par);
	}
}


/**
  * Macro formatting the number of errors in the last 5 minutes
  */
function errorCount_macro(par)	{
	if (app.data.stat==null || app.data.stat.get (this.name)==null)
		return "not available";
	if (this.isActive()) {
		var obj = app.data.stat.get (this.name);
		return obj.errorCount + formatCount (obj.errorCount, par);
	}	else	{
		return 0 + formatCount (0,par);
	}
}




/**
  * Macro formatting app.properties
  */
function properties_macro(par)	{
	formatProperties( this.getProperties(), par );
}


function appdir_macro (param) {
   return this.getAppDir ().toString ();
}