function px(i) { return "" + parseInt(i) + "px"; }
function percentage (f) { return "" + (f * 100) + "%"; }

if ( window.Evri === undefined ) {
  window.Evri = {};
}

Evri.Constants = {
  APP_ID: "evri-portal",
  FACEBOOK_LOGIN_COOKIE_NAME: "fbLoginCookie"
};

var Class = {
  // Standard Class Constructor Adopted from PrototypeJS

  create: function() {
    function klass() {
      this.initialize.apply(this, arguments);
    }
    return klass;
  }
};


var URI = {
  parseQueryString: function (queryString) {
    // Remove the leading question mark if it was passed in.

    if ( queryString.search(/^\?/) === 0 ) {
      queryString = queryString.substring(1);
    }

    var paramItems = queryString.split("&");
    var params = {};

    for (var i = 0; i < paramItems.length; i++) {
      var result = paramItems[i].split("=");
      params[result.first()] = decodeURIComponent(result.last());
    }

    return params;
  },
  toCanonicalQueryString: function (params) {
    var paramsItems = [];

    for (var key in params) {
      if (params.hasOwnProperty(key)) {
        paramsItems.push({key:key, value:params[key]});
      }
    }

    paramsItems = paramsItems.sort(function (a,b) {return a.key > b.key ? 1 : -1;});

    for (var i = 0 ; i < paramsItems.length ; i++) {
      paramsItems[i] = paramsItems[i].key + "=" + encodeURIComponent(paramsItems[i].value);
    }

    return paramsItems.join('&');
  },
  toQueryString: function (params) {
    var paramItems = [];

    for ( var i in params ) {
      if ( params[i] instanceof(Array) )
      {
        for ( var j = 0 ; j < params[i].length ; j++ )
        {
          paramItems.push( [ i, encodeURIComponent( params[i][j] ) ].join("="));
        }
      }
      else
      {
        paramItems.push([i, encodeURIComponent(params[i])].join("="));
      }

    }

    return '?' + paramItems.join('&');
  }
};


var EventTracker = {
  REFERRAL_ATTRIBUTE_NAME: 'data-analytics-referrer-name',
  CONTAINER_PATH_ATTRIBUTE_NAME: 'data-analytics-container-path',
  PAGE_ATTRIBUTE_NAME: 'data-analytics-page-name',
  googleAnalyticsEventTracker: undefined,
  referralMade: false,
  pageName: function () {
    return document.body.getAttribute(EventTracker.PAGE_ATTRIBUTE_NAME);
  },
  bindToPage: function () {
    EventTracker.googleAnalyticsEventTracker = pageTracker;
  },
  addContainerPathTo: function (node, path) {
    if ( node !== undefined ) {
      node.setAttribute(EventTracker.CONTAINER_PATH_ATTRIBUTE_NAME, path);
    }
  },
  trackDHTML: function (node, name, options) {
    options = options || {};

    if ( EventTracker.referralMade === true ) {
      EventTracker.referralMade = false;
      return;
    }

    EventTracker.track("DHTML", node, name, options);
  },
  trackFlex: function (node, name, options) {
    options = options || {};

    if ( EventTracker.referralMade === true ) {
      EventTracker.referralMade = false;
      return;
    }

    EventTracker.track("FLEX", node, name, options);
  },
  trackReferral: function (node, options) {
    options = options || {};

    EventTracker.referralMade = true;
    EventTracker.track("REFERRAL", node, node.getAttribute(EventTracker.REFERRAL_ATTRIBUTE_NAME), {});
  },
  track: function (type, node, name, options) {
	  if ( node.skipTrack === true ) {
	    node.skipTrack = false;
	    return;
	  }

    var trackPath = "/" + type + "/" + EventTracker.pageName();
    var eventName = "/" + name;

    var trackPathItems = [];

    // Allow users to pass in a containerPath when the interaction is outside
    // of a good node path
    if ( options.containerPath !== undefined ) {
      trackPathItems.push(options.containerPath);
      delete options.containerPath;
    }

      while ( node.tagName !== undefined && node.tagName.toUpperCase() != 'BODY' ) {
        if ( node.getAttribute(EventTracker.CONTAINER_PATH_ATTRIBUTE_NAME) !== undefined ) {
          trackPathItems.unshift(node.getAttribute(EventTracker.CONTAINER_PATH_ATTRIBUTE_NAME));
        }
        node = node.parentNode;
      }

    var canonicalQueryString = URI.toCanonicalQueryString(options);
    var eventPath = trackPath + trackPathItems.join("") + eventName;

    EventTracker.googleAnalyticsEventTracker._trackEvent(type, eventPath, canonicalQueryString);
  },
  markReferrerLinks: function ($node) {
    // Bind onclick handlers to links with ref markers
    setTimeout(function () {
      $node.find("a[" + EventTracker.REFERRAL_ATTRIBUTE_NAME + "]").each(function (index, anchor) {
        // Unbind first so that we do not track multiple times
        $(anchor).unbind('click', EventTracker.referralClickHandler);
        $(anchor).bind('click', EventTracker.referralClickHandler);
      });
    }, 0);
  },
  referralClickHandler: function (event) {
    var anchor = this;
    EventTracker.trackReferral(anchor, {});
    // return false;
  }
};

jQuery.fn.replaceAttr = function(aName, rxString, repString) {
  return this.attr(
    aName,
    function() {
      return jQuery(this).attr(aName).replace(rxString, repString);
    }
  );
};


var Flash = {
  expressInstallPath: undefined,
  requiredVersion: "9.0.0",
  installMessaging: "This content requires the Macromedia Flash Player. <a href=\"http://www.macromedia.com/go/getflash/\">Get Flash!</a>",
  clearFocusOnClick: function () {
    this.blur();
  },
  userVersion: function () {
    var version = swfobject.getFlashPlayerVersion();
    return [version.major, version.minor, version.release].join('.');
  }
};

var GlobalTemplates = {
  link: function( params )
  {
    return $('<a></a>').attr( 'href' , params.href ).attr('title' , params.title ).html( params.text );
  },
  image: function( params )
  {
    return $('<img></img>').attr( 'src' , params.src ).attr( 'alt' , params.alt ).attr( 'title' , params.title).attr( 'class' , params.classes );
  },
  documentTitle: function (content) {
    document.title = content + ' - Evri';
  }
};

var HelpViewer = {
  spotlight: function (nodeId, callbacks, options) {
    var nodeSelector = '#' + nodeId;
    var selectedSection = $(nodeSelector);
    var documentName = options.documentName !== undefined ? options.documentName : nodeId;

    if ( selectedSection.hasClass("help-focused") )
    {
      return;
    }

    selectedSection.modalize({blockFocus:true}).addClass("help-focused");

    if ( callbacks.afterBlocked !== undefined ) {
      try {
        callbacks.afterBlocked.call();
      } catch (e) {}
    }

    // Fetch help content from the server...

    $.ajax({url:"/help/" + documentName + ".xml",
            type: "GET",
            dataType: "xml",
            success: function (dialogOptionsXML, text) {
              var dialogOptions = HelpViewer.toJSON(dialogOptionsXML);
              var dialog = HelpViewer.Templates.dialog(dialogOptions);
              var placement = dialogOptions.placement;

              var dialogPositionLeft = px(parseInt(selectedSection.offset().left) + parseInt(selectedSection.width()) - 8);
              var dialogPositionTop = px(parseInt(selectedSection.offset().top) - 18);
              var trigger = selectedSection.find("a.help-trigger");

              if ( placement == 'trigger-bottom' ) {
                dialogPositionTop = px(parseInt(trigger.offset().top) + trigger.height() + 10);
                dialogPositionLeft = px(parseInt(selectedSection.offset().left) + selectedSection.width() - 245);
              } else if ( placement.search(/^trigger-/) === 0 ) {
                dialogPositionTop = px(parseInt(trigger.offset().top) - 25);
              }

              if ( placement == 'left' ) {
                dialogPositionLeft = px(parseInt(selectedSection.offset().left) - 267);
              } else if ( placement == 'trigger-right' ) {
                dialogPositionLeft = px(parseInt(trigger.offset().left) + parseInt(trigger.width()) + 10);
              } else if ( placement == 'trigger-left' ) {
                dialogPositionLeft = px(parseInt(trigger.offset().left) - 280);
              }

              dialog.css({top:dialogPositionTop, left:dialogPositionLeft}).appendTo("body");

              var closer = function () {
                var node = this;

                selectedSection.demodalize().removeClass("help-focused");
                EventTracker.trackDHTML(node, "HelpCloser", {});

                $(window).unbind("resize", closer);
                $("div#help-dialog-closer").unbind('click');

                dialog.remove();
              };

              $("div#help-dialog-closer").click(closer);
              $("div#help-dialog-closer").hover(
                  function(){
                      $(this).addClass("hover");
                  } ,
                  function(){
                      $(this).removeClass("hover");
              });

              $(window).bind("resize", closer);
              $("#modal-blocker div").click(closer);

              if ( $.browser.msie && $.browser.version <= 6 )
              {
                  $("#help-dialog-pointer").remove();
              }

            },
            error: function (xhr, textStatus, errorThrown) {
              selectedSection.demodalize().removeClass("help-focused");
            }
           });
  },
  toJSON: function (xml) {
    var options = {};

    options.title = $(xml).children('HelpSection').children('Title').text();
    options.content = $(xml).children('HelpSection').children('Content').text();
    options.placement = $(xml).children('HelpSection').children('Placement').text();

    return options;
  },
  Templates: {
    dialog: function (options) {
      var dialogContainer = $('<div id="help-dialog" class="placement-' + options.placement + '"></div>');
      var dialogContentContainer = $('<div id="help-dialog-content"></div>');
      var dialogHeader = $('<h3>' + options.title + '</h3>');
      var dialogCloser = $("<div />").attr("id" , "help-dialog-closer").append(
        $('<img class="close-button-hover" src="/images/buttons/close_over.png" alt="Close"/>'),
        $('<img class="close-button" src="/images/buttons/close.png" alt="Close"/>')
      );

      dialogContentContainer.append(dialogCloser);
      dialogContainer.append(dialogContentContainer);
      dialogContentContainer.append(dialogHeader);
      dialogContentContainer.append($('<div class="content">' + options.content + '</div>'));

      dialogContainer.append('<div id="help-dialog-pointer">&nbsp;</div>');

      return dialogContainer;
    }
  },
  initializeTriggers: function () {
    $(document.body).addClass('help-enabled');
  }
};


var HTML = {
  escape: function (string) {
    return string.toString().replace(/</,'&lt;').replace(/>/,'&gt;');
  }
};

var ToggleList = {
  buildMenu: function ($hiddenList, $toolbar) {
    var $show = $("<li><a/></li>").addClass("menu");
    $toolbar.append($show);

    // function to show less of the description
    var less = function(untracked) {
      if (!untracked) {
        EventTracker.trackDHTML($show[0], "ShowLess");
      }
      $show.find("a").html("Show more&nbsp;<sub>&#9660;</sub>").blur();
      $hiddenList.hide();
    };

    // function to show more of the description
    var more = function() {
      EventTracker.trackDHTML($show[0], "ShowMore");
      $show.find("a").html("Show less&nbsp;<sub>&#9650;</sub>").blur();
      $hiddenList.show();
    };

    $show.toggle(more, less);
    less(false);
  }
};
