/* Google Analytics tracking extension for mailto links, file download links and outgoing links
   and forms.
   
   This script adds pageview tracking events to all mailto links file download links and to all
   links and forms, which point to external domains. This file must be included in the html source
   after the main GA tracking code snippet. 
   
   The variables declared below can be set inline in the html source, or redefined below.
*/ 

/* Initialise all required variables */
if ( GA_tracker_object_name == undefined )
  var GA_tracker_object_name = "pageTracker";
if ( GA_internal_domains == undefined )
  var GA_internal_domains = [document.location.hostname];
if ( GA_file_extensions == undefined )
  var GA_file_extensions = ["txt","doc","docm", "docx", "xls","ppt","exe","zip","pdf","mp3","avi","wmv",
                            "mpg","mpeg", "pps", "ppsm", "ppsx", "xlsb", "xlsm", "xlsx", "pptx"];
if ( GA_event_root_path == undefined )
  var GA_event_root_path = "";


function GAaddEventPageview(element, event, tracker_object, pageview_url) {
  if ( element.getAttribute(event) ) {
    if ( element.getAttribute(event).match(/^javascript:/) ) {
      var GA_link_event_start = "javascript:";
      var GA_link_event_end = element.getAttribute(event).substr(11);
    } else {
      var GA_link_event_start = "";
      var GA_link_event_end = element.getAttribute(event);
    }
  } else {
    var GA_link_event_start = "";
    var GA_link_event_end = "";
  }
  
  pageview_url = pageview_url.replace(/;/g, "");
  pageview_url = pageview_url.replace(/%3B/g, "");
	
  element.setAttribute( event, GA_link_event_start + tracker_object + "._trackPageview('" +
                        pageview_url + "');" + GA_link_event_end );
}

/* Check that the GA js tracking object has been initialised properly. */
if ( typeof(_gat) == "object" ) {

/* Handle mailto, file-download and outgoing links */
var GA_links = document.getElementsByTagName("a");
for ( var GA_link=0; GA_link<GA_links.length; GA_link++ ) {
  if ( GA_links[GA_link].getAttribute("href") != null ) {
    /* Handle all mailto links first */
    if ( GA_links[GA_link].href.match("mailto:") ) {
      var GA_split_link = GA_links[GA_link].href.split(":");
      GAaddEventPageview( GA_links[GA_link], "onclick", GA_tracker_object_name, GA_event_root_path + "/mailto/" + GA_split_link[1] );
    } else {
      /* Handle file download links */
      for ( var GA_file_extension=0; GA_file_extension<GA_file_extensions.length;
            GA_file_extension++ ) {
        if ( GA_links[GA_link].href.match("[._]"+GA_file_extensions[GA_file_extension]+"$") ) {
          if ( GA_links[GA_link].href.match(":") ) {
            var GA_tracked_url = GA_links[GA_link].href.split(":");
            GA_tracked_url = ""+GA_tracked_url[0]+GA_tracked_url[1];
            GAaddEventPageview( GA_links[GA_link], "onclick", GA_tracker_object_name, GA_event_root_path + "/file-download/" + GA_tracked_url );
          }
        }
      }
      
      /* Handle outgoing links */
      if ( GA_links[GA_link].href.match(/^https?:\/\//) ) {
        /* Start by checking if the link points to any internal domain */
        var GA_internal_domain_counter = 0;
        for ( var GA_internal_domain=0; GA_internal_domain<GA_internal_domains.length;
              GA_internal_domain++ ) {
          if ( !GA_links[GA_link].href.match("://" + GA_internal_domains[GA_internal_domain]) ) {
            GA_internal_domain_counter++;
          }
        }
        
        if ( GA_internal_domain_counter == GA_internal_domains.length ) {
          /* Handle outgoing links */
          var GA_tracked_url = GA_links[GA_link].href.split(":");
          GA_tracked_url = ""+GA_tracked_url[0]+GA_tracked_url[1];
          GAaddEventPageview( GA_links[GA_link], "onclick", GA_tracker_object_name, GA_event_root_path + "/outgoing-link/" + GA_tracked_url );
        }
      }
    }
  }
}

/* Handle outgoing forms */
var GA_forms = document.getElementsByTagName("form");
for ( var GA_form=0; GA_form<GA_forms.length; GA_form++ ) {
  if ( GA_forms[GA_form].getAttribute("action") != null ) {
    if ( GA_forms[GA_form].action.match(/^https?:\/\//) ) {
      /* Start by checking if the form points to any internal domain */
      var GA_internal_domain_counter = 0;
      for ( var GA_internal_domain=0; GA_internal_domain<GA_internal_domains.length;
            GA_internal_domain++ ) {
        if ( !GA_forms[GA_form].action.match(GA_internal_domains[GA_internal_domain]) ) {
          GA_internal_domain_counter++;
        }
      }
      
      if ( GA_internal_domain_counter == GA_internal_domains.length ) {
        /* Handle outgoing forms */
        var GA_tracked_url = GA_links[GA_link].href.split(":");
        GA_tracked_url = ""+GA_tracked_url[0]+GA_tracked_url[1];
        var GA_form_elements = GA_forms[GA_form].getElementsByTagName("input");
        for ( var GA_form_element=0; GA_form_element<GA_form_elements.length; GA_form_element++ ) {
          if ( GA_form_elements[GA_form_element].type == "submit" || GA_form_elements[GA_form_element].type == "image" ) {
            GAaddEventPageview( GA_form_elements[GA_form_element], "onclick", GA_tracker_object_name, GA_event_root_path + "/outgoing-form/" + GA_tracked_url );
          }
        }
      }
    }
  }
}

}

