﻿$(function () {

   function filterPath(string) {
      return string
			.replace(/^\//, '')
			.replace(/(index|default).[a-zA-Z]{3,4}$/, '')
			.replace(/\/$/, '');
   }

   var locationPath = filterPath(location.pathname);
   var scrollElem = scrollableElement('html', 'body');

   // Any links with hash tags in them (can't do ^= because of fully qualified URL potential)
   $('a[href*=#]').each(function () {

      // Ensure it's a same-page link
      var thisPath = filterPath(this.pathname) || locationPath;
      if (locationPath == thisPath
				&& (location.hostname == this.hostname || !this.hostname)
				&& this.hash.replace(/#/, '')) {

         // Ensure target exists
         var $target = $(this.hash), target = this.hash;
         if (target && $target.length != 0) {

            // Find location of target
            var targetOffset = $target.offset().top;
            $(this).click(function (event) {

               // Prevent jump-down
               event.preventDefault();

               // Animate to target
               $(scrollElem).animate({ scrollTop: targetOffset }, 400, function () {

                  // Set hash in URL after animation successful
                  location.hash = target;

               });
            });
         }
      }

   });

   // Use the first element that is "scrollable"  (cross-browser fix?)
   function scrollableElement(els) {
      for (var i = 0, argLength = arguments.length; i < argLength; i++) {
         var el = arguments[i],
				$scrollElement = $(el);
         if ($scrollElement.scrollTop() > 0) {
            return el;
         } else {
            $scrollElement.scrollTop(1);
            var isScrollable = $scrollElement.scrollTop() > 0;
            $scrollElement.scrollTop(0);
            if (isScrollable) {
               return el;
            }
         }
      }
      return [];
   }

});
