/**
 * @author marcello.disimone
 */
(function($){
  $.fn.navigation = function( settings ){
    var jQueryObjList = this;
    
    var highlightNavigation = function( _linkList ){
      var linksMain = [];
      for (var i = 0; i < _linkList.length; i++) {
        if (_linkList[i].href.indexOf('javascript:') == -1 && _linkList[i].href.indexOf('http://') == -1) {
          linksMain[i] = 'http://' + window.location.hostname + '' + _linkList[i].href;
        } else {
          linksMain[i] = _linkList[i].href;
        }
      }
      var evaluatedLinks = evaluateHighlighting(window.location.href, linksMain);
      var highlightedIndex = -1;
      var bestmatch = 999;
      for (var j = 0; j < evaluatedLinks.length; j++) {
        if (evaluatedLinks[j] < bestmatch) {
          bestmatch = evaluatedLinks[j];
          if (evaluatedLinks[j] == -2) {
            highlightedIndex = j;
            break;
          }
        }
      }
      var currentLink = null;
      if (highlightedIndex != -1) {
        currentLink = _linkList[ highlightedIndex ];
        currentLink.parentNode.className = "active";
        while( currentLink.getAttribute( 'navParent' ) != undefined ){
          currentLink = document.getElementById( currentLink.getAttribute( 'navParent' ) );
          $( currentLink ).parent().addClass( "activeParent" );
        }
      }
    };
    var evaluateHighlighting = function(contentUrl, linkList){
      var navLinkFull = "";
      var navLinkPath = "";
      var navLinkFile = "";
      var navLinkQuery = "";
      var navLinkPathParts = [];
      var contentLinkFull = "";
      var contentLinkPath = "";
      var contentLinkFile = "";
      var contentLinkQuery = "";
      var contentLinkPathParts = [];
      var evaluatedLinks = [];
      if (contentUrl.indexOf('?') != -1) {
        contentLinkFull = contentUrl.substring(0, contentUrl.lastIndexOf('?'));
        contentLinkQuery = contentUrl.substring(contentUrl.lastIndexOf('?'), contentUrl.length);
        if (contentLinkQuery.indexOf("&") != -1) {
          contentLinkQuery = contentLinkQuery.substring(0, contentLinkQuery.indexOf("&"));
        }
      } else {
        contentLinkFull = contentUrl;
      }
      if (contentLinkFull.charAt(contentLinkFull.length - 1) == '/') {
        contentLinkFull = contentLinkFull.substring(0, contentLinkFull.length - 1);
      }
      if (contentLinkFull.lastIndexOf('/') < contentLinkFull.lastIndexOf('.')) {
        contentLinkFile = contentLinkFull.substring(contentLinkFull.lastIndexOf('/') + 1, contentLinkFull.length);
        contentLinkPath = contentLinkFull.substring(0, contentLinkFull.lastIndexOf('/'));
      } else {
        contentLinkPath = contentLinkFull;
        contentLinkFile = "";
      }
      contentLinkPathParts = contentLinkPath.split('/');
      for (var i = 0; i < linkList.length; i++) {
        navLinkFull = linkList[i];
        if (navLinkFull.indexOf('javascript:') != -1 || navLinkFull == '') {
          evaluatedLinks.push(999);
          continue;
        }
        if (navLinkFull.indexOf('?') != -1) {
          navLinkQuery = navLinkFull.substring(navLinkFull.lastIndexOf('?'), navLinkFull.length);
          if (navLinkQuery.indexOf("&") != -1) {
            navLinkQuery = navLinkQuery.substring(0, navLinkQuery.indexOf("&"));
          }
          navLinkFull = navLinkFull.substring(0, navLinkFull.lastIndexOf('?'));
        } else {
          navLinkQuery = "";
        }
        if (navLinkFull.charAt(navLinkFull.length - 1) == '/') {
          navLinkFull = navLinkFull.substring(0, navLinkFull.length - 1);
        }
        if (navLinkFull.lastIndexOf('/') < navLinkFull.lastIndexOf('.')) {
          navLinkFile = navLinkFull.substring(navLinkFull.lastIndexOf('/') + 1, navLinkFull.length);
          navLinkPath = navLinkFull.substring(0, navLinkFull.lastIndexOf('/'));
        } else {
          navLinkPath = navLinkFull;
          navLinkFile = "";
        }
        navLinkPathParts = navLinkPath.split('/');
        
        var contentIndex = 0;
        var navIndex = 0;
        var bestmatchFound = false;
        var charMatch = null;
        
        while (navLinkPathParts[navIndex] == contentLinkPathParts[contentIndex]) {
          navIndex++;
          contentIndex++;
          if (contentIndex == contentLinkPathParts.length && navIndex == navLinkPathParts.length) {
            if (navLinkFile == contentLinkFile) {
              if (navLinkQuery == contentLinkQuery) {
                evaluatedLinks.push(-2);
                bestmatchFound = true;
              } else {
                evaluatedLinks.push(-1);
              }
            } else {
              charMatch = stringCompare(navLinkFile, contentLinkFile);
              evaluatedLinks.push(0.99 - (charMatch / 100));
            }
            break;
          } else if (contentIndex == contentLinkPathParts.length) {
            evaluatedLinks.push(999);
            break;
          } else if (navIndex == navLinkPathParts.length) {
            evaluatedLinks.push(contentLinkPathParts.length - contentIndex);
            break;
          } else if (navLinkPathParts[navIndex] != contentLinkPathParts[contentIndex]) {
            evaluatedLinks.push(999);
            break;
          }
        }
        if (bestmatchFound) {
          break;
        }
      }
      return evaluatedLinks;
    }
    
    var stringCompare = function(comparator1, comparator2){
      var shorter = null;
      var longer = null;
      if (comparator1.length > comparator2.length) {
        longer = comparator1.toLowerCase();
        shorter = comparator2.toLowerCase();
      } else {
        longer = comparator2.toLowerCase();
        shorter = comparator1.toLowerCase();
      }
      var matchCount = 0;
      for (var x = 0; x < shorter.length; x++) {
        if (shorter.charAt(x) == longer.charAt(x)) {
          matchCount++;
        } else {
          break;
        }
      }
      return matchCount;
    }

    $(function() {
      highlightNavigation( jQueryObjList );
    });
  }
})(jQuery);


