
function debugAlertProperties(obj)
{
  if (!obj) { alert( ' null or undefined ' ); return false; }

  if (name.length && name.length==0) { alert(" {{empty }}"); return false; }

  var txt = "";
  var i=0;
  for (name in obj)
  {
    txt += name.toString() + "\n";
    if (++i==10)
    {
      i=0;
      alert(txt);
      txt = "";
    }
  }
  if (i>0) alert(txt);

  return true;
}

function addEventHandler(element,eventname,handler,context)
{
  var wrapperobject = new ContextFixer(handler,context);
  var args = new Array(null,null);
  for (var i=4; i<arguments.length; i++)
    args.push(arguments[i]);
  wrapperobject.args = args;

  // attach event
  //
  // use exception handling instead of unreliable browsercheck
  // should cope better for future browsers
  try {
    element.attachEvent("on" + eventname,wrapperobject.execute);
  } catch(e) {
    try {
      element.addEventListener(eventname, wrapperobject.execute, false);
    } catch(ee) {
      alert("addEventHandler :: unable to register event handler");
    }
  }
}

function ContextFixer(func, context) {
    /* Make sure 'this' inside a method points to its class */
    this.func = func;
    this.context = context;
    this.args = arguments;
    var self = this;
    
    this.execute = function() {
        /* execute the method */
        var args = new Array();
        // the first arguments will be the extra ones of the class
        for (var i=0; i < self.args.length - 2; i++) {
            args.push(self.args[i + 2]);
        };
        // the last are the ones passed on to the execute method
        for (var i=0; i < arguments.length; i++) {
            args.push(arguments[i]);
        };
        return self.func.apply(self.context, args);
    };
};


  function sendHTTP(url, fun, bSync)
  {
    var http = false;
    if (window.XMLHttpRequest)
      http = new XMLHttpRequest();
    else
    {
      try
      {
        http = new ActiveXObject("Msxml2.XMLHTTP");
      }
      catch(e)
      {
        try
        {
          http = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e)
        {
          http = false;
        }
      }
    }
    if (http)
    {
      http.open("GET",url,bSync==null?true:(!bSync));
      if (bSync==null||!bSync) http.onreadystatechange = function() { fun(http) };
      http.send(null);

      if (bSync!=null&&bSync)
        fun(http);
    }
  }

  function getElementLeft(elem)
  {
    if (!elem) return 0;

    if (document.getBoxObjectFor)
      return document.getBoxObjectFor(elem).x;
    else
      return elem.getBoundingClientRect().left;
  }

  function getElementTop(elem)
  {
    if (!elem) return 0;

/*    if (document.getBoxObjectFor)
      return document.getBoxObjectFor(elem).y;
    else
      return elem.getBoundingClientRect().top;
      */
      
	var curtop = 0;
	if (elem.offsetParent)
	{
		while (elem.offsetParent)
		{
			curtop += elem.offsetTop
			elem = elem.offsetParent;
		}
	}
	else if (elem.y)
		curtop += elem.y;
	return curtop;
  }

  //
  // state variables
  //
  
      // dev
  var awareDevStart = null;
  var awareDevEnd = null;

  var awareOverviewStart;
  var awareOverviewEnd;

  var awareZoomStart;
  var awareZoomEnd;

  var awareControlDownX = 0;
  var awareControlDownXold = 0;
  var awareControlDownDir = 1;

  var awarePage = "Start";
  var awareTemp = 1;

  // graphical components

  var awareDiv,awareDrawArea, awareControlBar;
  var awareStartTD,awareEndTD;
  var awareOverviewStartTD,awareOverviewEndTD;
  var awareDragbarStart,awareDragbarEnd;
  var awareDrawbarSelection;
  var awareNumDays;

  // container for received events (events are wikipage edits, image uploads, etc)
  var awareObjects = new Array();

  function AwareEvent(objectname,time,user,type)
  {
    this.type = type;
    this.objectname = objectname;
    this.time = time;
    this.user = user;
    this.div = null;
    this.infoDiv = null;

    this.infoDisplay = function() { this.infoDiv.style.display='block'; }
    this.infoHide = function() { this.infoDiv.style.display='none'; }
  }

  function awareParseURL()
  {
    var str = document.location.toString();
    var ind = str.indexOf("?");
    if (ind<=0) return;
    str = str.substr(ind);
    ind = str.indexOf('page=');
/*    if (ind<=0) return;
    str = str.substr(ind);
    ind = str.indexOf('&');
    if (ind>0)
    {
      str = str.substr(5,ind);
    }
    else
    {
      str = str.substr(5);
    }

    awarePage = str;
*/
    if (ind>0)  // page=
    {
        var val = str.substr(ind);
        ind = val.indexOf('&');
        if (ind>0)
        {
            val = val.substr(5,ind-5);
        }
        else
        {
            val = val.substr(5);
        }
        awarePage = val;
    }
    ind = str.indexOf('dev_start=');
    if (ind>0)  // dev_start=
    {
        var val = str.substr(ind);
        ind = val.indexOf('&');
        if (ind>0)
        {
            val = val.substr(10,ind-10);
        }
        else
        {
            val = val.substr(10);
        }
        awareDevStart = val;
    }
    ind = str.indexOf('dev_end=');
    if (ind>0)  // dev_end=
    {
        var val = str.substr(ind);
        ind = val.indexOf('&');
        if (ind>0)
        {
            val = val.substr(8,ind-8);
        }
        else
        {
            val = val.substr(8);
        }
        awareDevEnd = val;
    }
  }

  function setClass( element, classname )
  {
//     element.setAttribute("class",classname);	// mozilla
     element.className = classname; // ie & (apparently) mozilla aswell
  }

  function awareInit()
  {
    awareParseURL();

    var start = new Date();
    var end = new Date();
    start.setDate(start.getDate()-30);
//    end.setDate(start.getDate()-230);
    start.setHours(0); start.setMinutes(0);
    end.setHours(23); end.setMinutes(59);
    var startVal = parseInt(start.getTime()/1000);
    var endVal = parseInt(end.getTime()/1000);
    awareOverviewStart = parseInt(awareDevStart?awareDevStart:startVal);
    awareOverviewEnd = parseInt(awareDevEnd?awareDevEnd:endVal);
    
    awareZoomStart = awareOverviewStart;
    awareZoomEnd = awareOverviewEnd;

    awareDiv = document.getElementById("awareness");

    // create all elements
    awareDrawArea = document.createElement("div");
    var table = document.createElement("TABLE");
    var tbody = document.createElement("TBODY");
    var tr = document.createElement("TR");
    var td1 = document.createElement("TD");
    var td2 = document.createElement("TD");
    var tdcenter = document.createElement("TD");

    var controlBar = document.createElement("div");
    var startBar = document.createElement("div");
    var endBar = document.createElement("div");

    var ctable = document.createElement("table");
    var ctd1 = document.createElement("td");
    var ctd2 = document.createElement("td");
    var ctr = document.createElement("tr");

    awareDragbarSelection = document.createElement("div");

    // build graph
    table.appendChild(tbody);
    tbody.appendChild(tr);
    tr.appendChild(td1);
    tr.appendChild(tdcenter);
    tr.appendChild(td2);

    ctable.appendChild(ctr);
    ctr.appendChild(ctd1);
    ctr.appendChild(ctd2);

      // create histogram bars, have to appended first.
    var days = Math.ceil((awareOverviewEnd - awareOverviewStart)/(24*60*60));
    awareNumDays = days;
    for (var i=0;i<days;i++)
    {
      var histoBar = document.createElement("div");
//      histoBar.setAttribute("class", "awareHistogramBar");
      setClass(histoBar,"awareHistogramBar");
      histoBar.style.left = getElementLeft(awareDiv) + parseInt((i+0.5)*awareDiv.offsetWidth/days) -4 + "px";
      histoBar.style.top = getElementTop(awareControlBar) + "px";

      controlBar.appendChild(histoBar);
    }

    controlBar.appendChild(awareDragbarSelection);

    controlBar.appendChild(startBar);
    controlBar.appendChild(endBar);

    awareControlBar = controlBar;
    awareDragbarStart = startBar;
    awareDragbarEnd = endBar;

    awareDiv.appendChild(table);
    awareDiv.appendChild(awareDrawArea);
    awareDiv.appendChild(controlBar);

//debugAlertProperties( controlBar.childNodes[0] );
//alert(controlBar.childNodes[0].clientHeight);
//alert(controlBar.childNodes[0].offsetHeight);

    // set attributes
    setClass(awareDrawArea,"awareDrawArea");
    setClass(table,"awarenessTable");
    tdcenter.appendChild(document.createTextNode( unescape(awarePage.toString()) ));
    table.style.width = "100%";
    td1.setAttribute("align","left");
    td2.setAttribute("align","right");
    tdcenter.setAttribute("align","center");
    awareStartTD = td1;
    awareEndTD = td2;

    setClass(controlBar,"awareControlBar");
    setClass(startBar,"awareControlDragbar");
//    startBar.setAttribute("onmousedown","awareControlDrag(event)");
    startBar.onmousedown = awareControlDrag;
    setClass(endBar,"awareControlDragbar");
//    endBar.setAttribute("onmousedown","awareControlDrag(event)");
    endBar.onmousedown = awareControlDrag;

    ctable.setAttribute("class","awarenessTable");
    ctd1.style.color = "#fff";
    ctd2.style.color = "#fff";
    ctd1.setAttribute("align","left");
    ctd2.setAttribute("align","right");
    awareOverviewStartTD = ctd1;
    awareOverviewEndTD = ctd2;

//    controlBar.appendChild(ctable);

     setClass(awareDragbarSelection,"awareControlSelection");

    awareSetDragbarPositions();

    awareSetTimeText();

    awareLoadHistogram();
//    awareLoad();
  }

  function awareLoadHistogram()
  {
//    awareDragbarStart.style.top = awareControlBar.offsetTop;
//    awareDragbarEnd.style.top = awareControlBar.offsetTop;
    awareDragbarStart.style.height = awareControlBar.offsetHeight-2+"px";
    awareDragbarEnd.style.height = awareControlBar.offsetHeight-2+"px";
    awareDragbarStart.style.top = getElementTop(awareControlBar)+"px";
    awareDragbarEnd.style.top = getElementTop(awareControlBar)+"px";
    awareDragbarSelection.style.top = getElementTop(awareControlBar)+"px";
    awareDragbarSelection.style.height = awareControlBar.offsetHeight + "px";
//    awareDragbarSelection.style.height = 8 + "px";
    awareSetDragbarPositions();

    var query = "aware_getdata.php?function=histogram&page="+awarePage+"&start="+awareOverviewStart+"&end="+awareOverviewEnd;
    log( query );
    sendHTTP( query, awareLoadHistoResp );
    // aware_getdata.php?function=histogram&page=HomePage&tart=1159826459&end=1162508399
  }

  function awareLoadHistoResp(resp)
  {
    if (resp.readyState!=4||resp.status!=200) return false;
    
    if (!resp.responseXML) return false;
    var list = resp.responseXML.firstChild;
    if (list.nodeName && list.nodeName=="xml") list = list.nextSibling;

    var maxcount = 0;

    var item = list.firstChild;
    for(;item;item = item.nextSibling)
    {
      if (!item.nodeName||item.nodeName!="item") continue;

      var count = 0;
      
      var attrib = item.firstChild;
      for(;attrib;attrib = attrib.nextSibling)
      {
        if (!attrib.firstChild) continue;
        var value = attrib.firstChild.nodeValue;
        switch(attrib.nodeName)
        {
        case "count": count = parseInt(value); break;
        }
      }

      if(maxcount<count) maxcount = count;
    }

    if (maxcount==0) maxcount = 1;
    
    item = list.firstChild;
    var fh = awareControlBar.offsetHeight-2;

    for(var i=0;i<awareNumDays&&item;item = item.nextSibling)
    {
      if (!item.nodeName||item.nodeName!="item") continue;

      var count = 0;
      var day = -1;

      var attrib = item.firstChild;
      for(;attrib;attrib = attrib.nextSibling)
      {
        if (!attrib.firstChild) continue;
        var value = attrib.firstChild.nodeValue;
        switch(attrib.nodeName)
        {
        case "day": day = parseInt(value); break;
        case "count": count = parseInt(value); break;
        }
      }

      if (day==-1) continue;

      i++;

      var e = awareControlBar.childNodes[day];
      var height = parseInt(count*fh/maxcount); //Math.min(count*2,awareControlBar.offsetHeight);
      if (height==0) height = 1;
      e.style.height = height + "px";
      e.style.top = getElementTop(awareControlBar)+"px";
      var colfix = 0;
//      if (height<count*2) colfix = count*2-height;
//      e.style.backgroundColor = "RGB("+Math.min(255,192+colfix)+","+Math.max(0,192-colfix)+","+Math.max(0,128-colfix)+")";
      e.setAttribute("title", ""+count);
      if (count==0) e.style.borderColor = "#888";

      // required for resize measures
      e.style.left = getElementLeft(awareDiv) + parseInt((day+0.5)*awareDiv.offsetWidth/awareNumDays) -4 + "px";
      e.style.top = getElementTop(awareControlBar) + "px";
    }
  }

  var awareControlDragTarget;

  function awareControlDrag(evt)
  {
    if (!evt) evt = event;

    switch(evt.type)
    {
    case "mousedown":
      document.onmouseup = awareControlDrag;
      document.onmousemove = awareControlDrag;

      awareControlDownX = evt.clientX?evt.clientX:evt.pageX;
      awareControlDragTarget = evt.target?evt.target:evt.srcElement;

      break;
    case "mouseup":
      document.onmouseup = null;
      document.onmousemove = null;

      awareLoad();
      break;
    case "mousemove":
      var width = awareDiv.offsetWidth;
      var height = awareDiv.offsetHeight;
      var top = getElementTop(awareDiv);
      var left = getElementLeft(awareDiv);
      
      var clientX = evt.clientX?evt.clientX:evt.pageX;
      var clientY = evt.clientY?evt.clientY:evt.pageY;

      if (awareControlDragTarget==awareDragbarStart)
      {
        awareZoomStart = parseInt(awareOverviewStart + (clientX-left)*(awareOverviewEnd-awareOverviewStart)/width);
        if (awareZoomStart<awareOverviewStart) awareZoomStart = awareOverviewStart;
        if (awareZoomStart>awareZoomEnd) awareZoomStart = awareZoomEnd;
      }
      else if (awareControlDragTarget==awareDragbarEnd)
      {
        awareZoomEnd = parseInt(awareOverviewStart + (clientX-left)*(awareOverviewEnd-awareOverviewStart)/width);
        if (awareZoomEnd<awareZoomStart) awareZoomEnd = awareZoomStart;
        if (awareZoomEnd>awareOverviewEnd) awareZoomEnd = awareOverviewEnd;
      }

      awareSetTimeText();
      awareSetDragbarPositions();
      awareRender();
//      awareLoad();

      break;
    }
  }

  function awareSetDragbarPositions()
  {
    var ae = awareDiv;

    var width = ae.offsetWidth;
    var height = ae.offsetHeight;
//    var left = ae.offsetLeft;
    var left = getElementLeft(ae);

    awareDragbarStart.style.left =  (left+parseInt(((awareZoomStart-awareOverviewStart)*width)/(awareOverviewEnd-awareOverviewStart))) + "px";
    awareDragbarEnd.style.left =  (left-5+parseInt(((awareZoomEnd-awareOverviewStart)*width)/(awareOverviewEnd-awareOverviewStart))) + "px";

    awareDragbarSelection.style.left = awareDragbarStart.style.left;
    awareDragbarSelection.style.width = awareDragbarEnd.offsetWidth + parseInt(awareDragbarEnd.style.left)-parseInt(awareDragbarStart.style.left) + "px";
  }

  function awareControlDown(evt)
  {
    if (!evt) evt = event;

    awareControlDownXold = awareControlDownX = evt.clientX;
    this.onmousemove = awareControlMove;
    this.onmouseup = function(evt) { awareLoad(); if (!evt) evt = event; this.onmouseup=null; this.onmousemove=null; }
  }

  function awareControlMove(evt)
  {
    if (!evt) evt = event;

    var diffx = evt.clientX - awareControlDownX;
//    if ((evt.clientX-awareControl)*awareControlDownDir<0)
    if (diffx*(evt.clientX-awareControlDownXold)<0)
    {
      awareControlDownX = evt.clientX;
//      awareControlDownDir *= -1;
      diffx=0;
    }

    awareControlDownXold = evt.clientX;

//    starttime += diffx*60;
//    endtime += diffx*60;
    awareZoomStart += diffx*60;
    awareZoomEnd += diffx*60;

    awareSetTimeText();
    awareRender();
    awareLoad();
  }

  function awareSetTimeText()
  {
    var start = new Date();
    var end = new Date();
    start.setTime(awareZoomStart*1000);
    end.setTime(awareZoomEnd*1000);

//    awareStartTD.innerHTML = awareFormatTime(start,true,true,true,true,true);
//    awareEndTD.innerHTML = awareFormatTime(end,true,true,true,true,true);
    awareStartTD.innerHTML = awareFormatTime(start,true,true,true);
    awareEndTD.innerHTML = awareFormatTime(end,true,true,true);

    start.setTime(awareOverviewStart*1000);
    end.setTime(awareOverviewEnd*1000);
    awareOverviewStartTD.innerHTML = awareFormatTime(start,true,true,true);
    awareOverviewEndTD.innerHTML = awareFormatTime(end,true,true,true);
  }

  function awareNumstringPad(len,str)
  {
    str = ""+str;
    if (str.length>=len) return str;
    var s = "00000000000000000000000";
    return s.substr(0,len-str.length)+str;
  }

  function awareFormatTime(date,y,m,d,h,min)
  {
    var str = "";
    if (y) str += date.getFullYear();
    if (m) str += (str!=""?"-":"") + awareNumstringPad(2,date.getMonth()+1);
    if (d) str += (str!=""?"-":"") + awareNumstringPad(2,date.getDate());
    if (h) str += (str!=""?" ":"") + date.getHours();
    if (min) str += (str!=""?":":"") + awareNumstringPad(2,date.getMinutes());
    return str;
  }

  var awareLoading = false;

  function awareLoad()
  {
    if (awareLoading) return;

    awareLoading = true;
    var query = "aware_getdata.php?function=get&page="+awarePage+"&start="+awareZoomStart+"&end="+awareZoomEnd+"&timewindow="+parseInt((awareZoomEnd-awareZoomStart)/10);
    clearLog();
    log( query );
    sendHTTP( query, awareHandleGet );
  }

  function sortEventByTime(a,b)
  {
    return a.time-b.time;
  }

  function awareRender()
  {
    var ae = awareDrawArea;

    var width = ae.offsetWidth;
    var height = ae.offsetHeight;
    var top = getElementTop(ae);
    var left = getElementLeft(ae);

    var y = top;

    awareObjects.sort(sortEventByTime);

    for (var i=0;i<awareObjects.length;i++)
    {
      var obj = awareObjects[i];

      if (obj.time<awareZoomStart||obj.time>awareZoomEnd)
      {
        if (obj.div)
        {
          ae.removeChild(obj.div);
          if (obj.infoDiv) ae.removeChild(obj.infoDiv);
          obj.div = null;
        }
        continue;
      }

      if (!obj.div)
      {
        var div = document.createElement("DIV");
        setClass( div, "awareMarker"+obj.type );

        div.innerHTML = obj.user.toString().substr(0,3) + " " + obj.objectname.toString().substr(0,20);

        var info = document.createElement("DIV");
        setClass(info,"awarePopupInfo");
        var infoID = "awarePopupInfo_"+i;
        info.setAttribute( "id", infoID );
        var date = new Date(); date.setTime(obj.time*1000);
        info.innerHTML = "name: " + obj.objectname + "<br>" +
                         "type: " + obj.type + "<br>" +
                         "user: " + obj.user + "<br>" +
                         "time: " + awareFormatTime(date,true,true,true,true,true);
        switch(obj.type)
        {
        case "wikipage":
          info.innerHTML += "<br>count: " + obj.count;
          break;
        }
        ae.appendChild(info);
//        addEventHandler( div, "mouseover", obj.infoDisplay, obj );
//        addEventHandler( div, "mouseout", obj.infoHide, obj );
        eval("div.onmouseover = function() { document.getElementById('"+infoID+"').style.display = 'block'; }");
        eval("div.onmouseout = function() { document.getElementById('"+infoID+"').style.display = 'none'; }");

        obj.infoDiv = info;

        var r = 160+(obj.diffsize?obj.diffsize:0);
        if (r>=1024) r=1023;
        r = parseInt(r/4);
        var r_ = 128+r; if (r_>255) r_-=256;
        switch(obj.type)
        {
        case "wikipage":
          div.style.backgroundColor = "RGB("+r+","+r+","+r+")";
          div.style.color = "RGB("+r_+","+r_+","+r_+")";

//          div.setAttribute( "onclick","document.location='tiki-index.php?page="+obj.objectname+"'" );
          eval("div.onclick = function() { document.location='tiki-index.php?page=" + obj.objectname + "'; }");
          break;
        case "image":
          div.style.backgroundColor = "RGB("+r+","+r+","+r+")";
          div.style.color = "RGB("+r_+","+r_+","+r_+")";

//          div.setAttribute( "onclick","document.location='tiki-browse_image.php?imageId="+obj.imageid+"'" );
          eval("div.onclick = function() { document.location='tiki-browse_image.php?imageId=" + obj.imageid + "'; }");
          break;
        case "file":
          div.style.backgroundColor = "RGB("+r+","+r+","+r+")";
          div.style.color = "RGB("+r_+","+r_+","+r_+")";

//          div.setAttribute( "onclick","document.location='tiki-download_file.php?fileId="+obj.fileid+"'" );
          eval("div.onclick = function() { document.location='tiki-download_file.php?fileId=" + obj.fileid + "'; }");
          break;
        }

        obj.div = div;

        ae.appendChild(obj.div);
      }

      var t = (obj.time-awareZoomStart)/(awareZoomEnd-awareZoomStart);
      if (awareTemp>1)
        t = 1/(1+Math.exp((0.5-t)*awareTemp));

      obj.div.style.left = (left + parseInt((width-10)*t)) + "px";
      obj.div.style.top = y + "px";

      obj.infoDiv.style.left = parseInt(obj.div.style.left) + 15 + "px";
      obj.infoDiv.style.top = parseInt(obj.div.style.top) + 20 + "px";

      y += 37;
      y = top+(y-top)%(height-obj.div.offsetHeight);
    }
  }

  /*
    handles xmlhttprequest-response from get-request
   */
  function awareHandleGet(resp)
  {
    if (resp.readyState==4) awareLoading = false;
    if (resp.readyState!=4||resp.status!=200) return false;

    if (!resp.responseXML) return false;
    var list = resp.responseXML.firstChild;
    if (list.nodeName && list.nodeName=="xml") list = list.nextSibling;

    var d = new Date();
    d.setTime(awareZoomStart*1000);
    log( list.childNodes.length + "::" + d.toString() );

    awareClear();

    var item = list.firstChild;
    for(;item;item = item.nextSibling)
    {
      if (item.nodeName!="item") continue;
      var objectname = "";
      var time = 0;
      var user = "";
      var type = "wikipage";
      var diffsize = 0;
      var count = 0;
      var imageid = -1;
      var fileid = -1;

      var attrib = item.firstChild;
      for(;attrib;attrib = attrib.nextSibling)
      {
        if (!attrib.firstChild) continue;

        var value = attrib.firstChild.nodeValue

        switch(attrib.nodeName)
        {
        case "objectname": objectname = value; break;
        case "time": time = parseInt(value); break;
        case "user": user = value; break;
        case "type": type = value; break;
        // for 'wikipage'
        case "diffsize": diffsize = parseInt(value); break;
        case "count": count = parseInt(value); break;
        // for 'image'
        case "imageid": imageid = parseInt(value); break;
        // for 'file'
         case "fileid": fileid = parseInt(value); break;
        default: break;
        }
      }

      var obj = new AwareEvent(objectname,time,user,type);
      switch(type)
      {
      case "wikipage":
        obj.diffsize = diffsize;
        obj.count = count;
        break;
      case "image":
        obj.imageid = imageid;
        break;
      case "file":
        obj.fileid = fileid;
        break;
      }
      awareObjects.push(obj);
    }

    awareRender();
    awareSetTimeText();
  }

  var awareInitialized = false;

  function initAwareness()
  {
    var el = document.getElementById("awareness");
    el.style.display = el.style.display=="block"?"none":"block";
    if (!awareInitialized)
    {
      awareInit();
      createTimeline();
    }
    
//    addEventHandler( window, "resize", function() { awareLoadHistogram(); awareRender(); }, null );
    eval("window.onresize = function() { awareLoadHistogram(); awareRender(); }");
    awareInitialized = true;
    
    awareLoadHistogram(); awareLoad();
  }

  function awareClear()
  {
    delete awareObjects;
    awareObjects = new Array();
//    document.getElementById("awareness").innerHTML="";
//    awareDrawArea.innerHTML = "";
    while(awareDrawArea.childNodes.length>0) awareDrawArea.removeChild(awareDrawArea.childNodes[0]);
    log("cleared");
  }

  function log(str)
  {
    if (document.getElementById("log"))
      document.getElementById("log").innerHTML += str + "<br>";
  }

  function clearLog()
  {
//    document.getElementById("log").innerHTML = "";
  }

function createTimeline()
{
  var el = document.getElementById("awareness_timeline");
  if (!el) return;

  el.style.width = document.getElementById("awareness").offsetWidth+"px";
  el.style.height = 20+"px";

  var top = getElementTop(el);
  var left = getElementLeft(el);
  var width = parseInt(el.style.width);

  var x = 0;

/*  while(x<=width)
  {
    var tag = document.createElement("span");
    el.appendChild(tag);

    tag.setAttribute("class","awareTimelineTime");

//    tag.style.color = "#fff";
//    tag.style.backgroundColor = "#000";

    var time = parseInt(awareOverviewStart + x*(awareOverviewEnd-awareOverviewStart)/width);
    var date = new Date();
    date.setTime(time*1000);
    tag.innerHTML = awareFormatTime(date,false,true,true);
    tag.style.position = "abolute;";
    tag.style.top = top + "px";
    tag.style.left = left + parseInt(x-x*tag.offsetWidth/width) + "px";

    x+=Math.max(tag.offsetWidth,parseInt(width/8));
    if (tag.offsetWidth==0) { alert("break"); break; }
  }*/
}
