function doAjaxLog(ya,ajaxcall,userId,ip,loggableUserId) {
	if(ya==null)
	{
		//missing yapprAnalytics?!
		return false;
	}
	 
	//alert(ajaxcall);
	if (ajaxcall.indexOf('..') == 0) {
		ajaxcall = ajaxcall.substring(2,ajaxcall.length);
	}
	ajaxcall = "http://" + document.domain + ajaxcall;
	//alert(ajaxcall);
	
	var yapprAnalytics = new Object();
	try {
		yapprAnalytics.navigator = getNavObject();
		ya.logRequest(yapprAnalytics.navigator.appCodeName,
				yapprAnalytics.navigator.appName,
				yapprAnalytics.navigator.appVersion,
				yapprAnalytics.navigator.cookieEnabled,
				yapprAnalytics.navigator.cpuClass,
				yapprAnalytics.navigator.onLine,
				getCookieCodeYappr("yappr_user_cookie"),
				yapprAnalytics.navigator.platform,
				loggableUserId,
				yapprAnalytics.navigator.osLang,
				yapprAnalytics.navigator.userAgent,
				yapprAnalytics.navigator.browserLang,
				FlashDetect.major,
				ajaxcall,
				document.title,
				getCookieCodeYappr("cookieCode"),
				userId,
				location.href,
				getCookieCodeYappr("JSESSIONID"),ip);
	} catch (err) {
		// eat error
	}
	return false;
}

function getNavObject() {
	var navobj;
	try {
		navobj = window.navigator;
		if (/MSIE (\d+\.\d+);/.test(navobj.userAgent)){
			navobj.browserLang = navobj.userLanguage;
			navobj.osLang = navobj.systemLanguage;
		} else {
			if (navobj.language == null) {
				navobj.browserLang = navobj.userLanguage;
			} else {
				navobj.browserLang = navobj.language;
			}
			navobj.osLang = "";
		}
	} catch (err) {
		// do nothing
	}
	return navobj;
}

function getCookieCodeYappr(c_name)
{
if (document.cookie.length>0)
  {
	c_start=document.cookie.indexOf(c_name + "=");
	if (c_start!=-1)
    { 
		c_start=c_start + c_name.length+1; 
		c_end=document.cookie.indexOf(";",c_start);
		if (c_end==-1) c_end=document.cookie.length;
		return unescape(document.cookie.substring(c_start,c_end));
    } 
  }
return "";
}	 


function inspect(obj, maxLevels, level)
{
  var str = '', type, msg;

    // Start Input Validations
    // Don't touch, we start iterating at level zero
    if(level == null)  level = 0;

    // At least you want to show the first level
    if(maxLevels == null) maxLevels = 1;
    if(maxLevels < 1)     
        return '<font color="red">Error: Levels number must be > 0</font>';

    // We start with a non null object
    if(obj == null)
    return '<font color="red">Error: Object <b>NULL</b></font>';
    // End Input Validations

    // Each Iteration must be indented
    str += '<ul>';

    // Start iterations for all objects in obj
    for(property in obj)
    {
      try
      {
          // Show "property" and "type property"
          type =  typeof(obj[property]);
          str += '<li>(' + type + ') ' + property + 
                 ( (obj[property]==null)?(': <b>null</b>'):('')) + '</li>';

          // We keep iterating if this property is an Object, non null
          // and we are inside the required number of levels
          if((type == 'object') && (obj[property] != null) && (level+1 < maxLevels))
          str += inspect(obj[property], maxLevels, level+1);
      }
      catch(err)
      {
        // Is there some properties in obj we can't access? Print it red.
        if(typeof(err) == 'string') msg = err;
        else if(err.message)        msg = err.message;
        else if(err.description)    msg = err.description;
        else                        msg = 'Unknown';

        str += '<li><font color="red">(Error) ' + property + ': ' + msg +'</font></li>';
      }
    }

      // Close indent
      str += '</ul>';
      document.getElementById("joe").innerHTML = str;
    return str;
}
