/**
 * Helper function used to instanciate the WebTrends object
 *
 *    parameter                  | description
 *  -------------------------------------------------------------------------------------------------
 *   pageTrackingEnabled         | true when page tracking is enabled
 *   inputfield_tracking_enabled | true when input field tracking is enabled
 *   user_tracking_enabled       | true when user tracking is enabled
 *   uc_url                      | url from mapping
 *   uc_forward                  | forward from mapping
 *   meta_si_n                   | define the usecase
 *   meta_si_p                   | define the step in the usecase
 *   meta_multi                  | defines multiple meta tags in one line in the form: <meta1>=<value>;<meta2>=<value>
 *   callbackFn                  | function which will be called back when the event 'onchange occurs on an input field
 *                               | this function is only called when pageTrackingEnabled and inputfield_tracking_enabled are true
*/
WebTrends.setup = function (params) {
  function param_default(pname, def) { if (typeof params[pname] == "undefined") { params[pname] = def; } };
  param_default("pageTrackingEnabled",          false);
  param_default("inputfield_tracking_enabled",  false);
  param_default("user_tracking_enabled",        false);
  param_default("uc_url",                       null);
  param_default("uc_forward",                   null);
  param_default("meta_si_n",                    null);
  param_default("meta_si_p",                    null);
  param_default("meta_multi",                   null);
  param_default("callbackFn",                   null);

  return new WebTrends(params.pageTrackingEnabled,
                       params.inputfield_tracking_enabled,
                       params.user_tracking_enabled,
                       params.uc_url,
                       params.uc_forward,
                       params.meta_si_n,
                       params.meta_si_p,
                       params.meta_multi,
                       params.callbackFn);
}

/**
 *  WebTrends constructor.
 *  This object is used as following functionalities :
 *  - Store the webtrends information from the webapp (configuration, meta_si_n, meta_si_p)
 *  - Allow to set a callback function when the event 'onchange' occurs on an input field
 * *
 */
function WebTrends (pageTrackingEnabled,
                    inputfield_tracking_enabled,
                    user_tracking_enabled,
                    uc_url,
                    uc_forward,
                    meta_si_n,
                    meta_si_p,
                    meta_multi,
                    callbackFn) {
  // set the properties
  this.pageTrackingEnabled = pageTrackingEnabled || false;
  this.inputfield_tracking_enabled = inputfield_tracking_enabled || false;
  this.user_tracking_enabled = user_tracking_enabled || false;
  this.uc_url = uc_url || null;
  this.uc_forward = uc_forward || null;
  this.meta_si_n = meta_si_n || "";
  this.meta_si_p = meta_si_p || "";
  this.meta_multi = meta_multi || "";
  this.callbackFn = callbackFn || null;


  // set the functions
  this.browserValid = isBrowserValid;
  this.addCallback = addCallback;
  this.listen=listen;
  this.toString = toString;


  if (this.browserValid && this.pageTrackingEnabled && this.inputfield_tracking_enabled && this.callbackFn != null) {
    // set up the event listeners here
    listen();
  }

  // Check if the browser is recent enought to support these javascript functions
  function isBrowserValid() {
    if (!document.getElementById ||
        !document.getElementsByTagName ||
        !document.createElement) {
       return false;
    } else {
      return true;
    }
  };

  // Add the event listener
  // This function add the listener for all input fields in the page
  function listen() {
    var elements = document.getElementsByTagName('input');
    elements2  = document.getElementsByTagName('select');

    // loop through all input elements in form
    for(var i = 0; i < elements.length; i++) {
      var input_field = elements.item(i);
      if (input_field) {
        addEvent(input_field, 'change', specificCallback, false);
      }
    }

    var selects = document.getElementsByTagName('select');

    // loop through all input elements in form
    for(var i = 0; i <selects.length; i++) {
      var input_field =selects.item(i);
      if (input_field) {
        addEvent(input_field, 'change', specificCallback, false);
      }
    }
  };

  // This function is called when the 'onchange' event occurs
  // We get the name of the input field in a cross-browser way
  // Once the callback has occured, we remove the listener to avoid to many callback
  function specificCallback(e) {
    if (e.target) {
      e.target.removeEventListener('change', specificCallback, false);
      genericCallback(e.target.name);
    }
    else if (e.srcElement) {
      e.srcElement.detachEvent('onchange', specificCallback);
      genericCallback(e.srcElement.name);
    }
    else {
      // the browser does not support event listener
    }
  };

  // This function acts as a generic callback and calls the specified callback function
  function genericCallback(name) {
    if (typeof webtrends.callbackFn == "function") {
      webtrends.callbackFn(name);
    }
  };

  function addEvent(elm, evType, fn, useCapture)
  // cross-browser event handling for IE5+, NS6+ and Mozilla/Gecko
  // By Scott Andrew
  {
    if (elm.addEventListener) {
      elm.addEventListener(evType, fn, useCapture);
      return true;
    } else if (elm.attachEvent) {
      var r = elm.attachEvent('on' + evType, fn);
      return r;
    } else {
      elm['on' + evType] = fn;
    }
  };

  // Set the callback funtion
  // Use this when the callback function is not available when the webtrends object is constructed
  function addCallback (callbackFn) {
    this.callbackFn = callbackFn;
    if (this.browserValid && this.pageTrackingEnabled && this.inputfield_tracking_enabled && this.callbackFn != null) {
      // set up the event listeners here
      this.listen();
      return true;
    }
    return false;
}


  function toString() {
    return ( 'pageTrackingEnabled = ' + this.pageTrackingEnabled + '\n' +
            ' inputfield_tracking_enabled = '+ this.inputfield_tracking_enabled + '\n' +
            ' user_tracking_enabled = '+ this.user_tracking_enabled + '\n' +
            ' uc_url = '+ this.uc_url + '\n' +
            ' uc_forward = '+ this.uc_forward + '\n' +
            ' meta_si_n = '+ this.meta_si_n + '\n' +
            ' meta_si_p = '+ this.meta_si_p + '\n' +
            ' meta_multi = '+ this.meta_multi);
  };
};


// display the webtrends info in an alert box
function testCallback(fieldname) {
  alert('testCallback for field: '+fieldname + "\n"+ webtrends.toString());
};