
djcoremetrics = function (track) {

  // configuration flags... 0 or 1
  var enabled       = 1;  // just don't do anything if not 1
  // Moved into headers.php so it can be read from the conf file
  //var live_site     = 0;  // 0 = development, 1 = live site.
  var debug_try     = 0;  // show debug info if we can find the debug window
  var debug_alert   = 0;  // show an alert if we can't find the debug window

  if (enabled != 1) return;

  show_debug( track, 'debugallmessage' );

  if (live_site == 1) cmSetProduction();

  // first check for quick conversion event actions
  if (track.conversion) {
    var conversions = track.conversion.split(/,/);
    var i;
    for (i in conversions) {
      var conversion = conversions[i];
      var cleaned = conversion.replace( /\!$/, '' );
      var done = conversion.length == cleaned.length ? 1 : 2;
      var cat_event_points = cleaned.split( ':' );
      send_tag( 'cmCreateConversionEventTag',
                [
                 [ 'Event ID',          cat_event_points[0] ],
                 [ 'Action Type',       done ],  // done = 2, incomplete = 1
                 [ 'Event Category ID', cat_event_points[1] || 'UNKNOWN' ],
                 [ 'Points',            cat_event_points[2] || 3 ]
                ] );
    }
    if (track.in_page) return;
  }

  //var send_pageview = 1;  // yes, we should send a Pageview tag

  // ... add more logic/calls here

  if (!track.skip) {

      /*var page_id = (track.cat || track.subcat || track.name) ? track.cat + ' ' + track.subcat + ' ' + track.name : null;*/
    var search_term = null;
    var search_result_count = null;

    /*if (!cat_id) cat_id = (track.cat || 'TODO');  // always send SOME cat_id
      if (page_id) page_id = page_id.replace( /^\s\s*|\s\s*$/g, '').replace( /\s\s+/g, ' ' );  // trim and single whitespace*/

    send_tag( 'cmCreatePageviewTag',
              [
               [ 'Page ID',              track.page_id ],
               [ 'Category ID',          track.cat_id ],
               [ 'Search Term',          track.search_term ],
               [ 'Search Results Count', track.search_result_count ]
              ] );
  }

  if (track.register) {
      send_tag ('cmCreateRegistrationTag',
		[
		 [ 'Customer ID', track.register[0]],
		 [ 'Customer Email', track.register[1]]
		]
	       );
  }

  if (track.element) {
  send_tag('cmCreatePageElementTag',
  [
   ['Element ID', track.element[0]],
   ['Element Category', track.element[1]]
  ]
  );
}

  // param 'fields' must be an array of array objects (each with name and value) to ensure param order
  function send_tag (tag, fields) {
    var args = [];
    var dbg = {};
    var fld;
    for (i in fields) {
      var fld = fields[i];
      if (typeof(fld) != 'function') {  // prototype.js crap
        args.push( fld[1] == null ? 'null' : '"' + fld[1] + '"' );  // TODO: all args quoted... a problem?
        dbg[fld[0]] = fld[1];  // simplified for debug output
      }
    }
    var code = tag + '(' + args.join( ',' ) + ')';
    var debug_info = {};
    debug_info[tag] = dbg;
    show_debug( debug_info );
    try {
      eval( code );
    }
    catch(e) {
      show_debug( { 'ERROR' : 'eval of coremetrics call failed',
                      'description' : e.description,
                      'code' : code }, 'debugalertmessage' );
      return 0;
    };
    return 1;
  }

  function show_debug (info,cls) {
    if (debug_try != 1) return;
    var boxclass = cls == undefined ? 'debugmessage' : cls;
    var msg;
    var other_win = parent.debuginfo || (window.opener && window.opener.parent && window.opener.parent.debuginfo) || null;
    if (other_win && other_win.document) {
      var debugTitleObj;
      try {
        debugTitleObj = other_win.document.getElementById( 'debugtitle' );
      }
      catch (e) {
        try {
          other_win = parent.searchinfo || (window.opener && window.opener.parent && window.opener.parent.searchinfo) || null;
          debugTitleObj = other_win.document.getElementById( 'debugtitle' );
        }
        catch (ee) { }
      }
      try {
        var divElem = other_win.document.createElement( 'DIV' );
        if (debugTitleObj && divElem) {
          msg = dumper( info );
          divElem.setAttribute( 'class', boxclass );
          divElem.innerHTML = '<pre>' + msg + '</pre>';
          dom_insertAfter( divElem, debugTitleObj );
          return;
        }
      }
      catch (eee) { };
    }
    if (debug_alert == 1) {
      msg = dumper( info );
      alert( msg );
    }
  }

  function dom_insertAfter (newElem, targElem) {
    var par = targElem.parentNode;
    if (par.lastChild == targElem) {
      par.appendChild( newElem );
    }
    else {
      par.insertBefore( newElem, targElem.nextSibling );
    }
  }

  function dumper (o,off) {
    var offset = off || '';
    var out = [];
    var k,v;
    for (k in o) {
      v = o[k];
      if (typeof(v) == 'object' && v != null) {
        out.push( offset + '"' + k + '" :' );
        out.push( dumper( v, offset + '    ' ) );
      }
      else {
        if (typeof(v) != 'function') {  // prototype.js crap
          out.push( offset + '"' + k + '" : ' + (v == null ? 'null' : '"' + v + '"') );
        }
      }
    }
    return out.join( "\n" );
  }

};
