All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ui.js.main.js Maven / Gradle / Ivy

var MINI = require('minified');
var $ = MINI.$, $$ = MINI.$$, EE = MINI.EE;
var divFactory = EE('div');
var anchorFactory = EE('a');
var strongFactory = EE('strong');

$(function () {
   $.ready(function () {
      bindLinks();
      var checkForStatsTimeout = setTimeout(function () {
         checkForStats();
      }, 1000);

      function checkForStats() {
         var statsPresent = false;
         var anchor = anchorFactory()[0];
         $(anchor).set({'@href': "/ajax/stats/check"});
         var noCache = Math.random().toString(36).substring(3) + Math.random().toString(36).substring(3);
         $.request('get', anchor.href + "?" + noCache).then(
            function success(content) {
               statsPresent = (/^true$/i).test(content.replace(/^\s+|\s+$/g, ''))
               if (statsPresent === true) {
                  clearTimeout(checkForStatsTimeout);
                  var parentTD = document.evaluate('//td[contains(text(), "No requests were made")]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE).snapshotItem(0);
                  parentTD = $(parentTD);
                  rebindAjaxLink(parentTD, "/ajax/stats", ajaxToStatsClickHandler);
               } else {
                  checkForStatsTimeout = setTimeout(function () {
                     checkForStats();
                  }, 1000);
               }
            },
            function error(status, statusText, responseText) {
               //requestErrorHandler(status, statusText, responseText, anchor, null, null);
            });
         return false;
      }
   });
});

function bindLinks() {
   $('.ajax-stats').on('click', ajaxToStatsClickHandler);
   $('.ajax-resource').on('click', ajaxToResourceClickHandler);
}

function ajaxToStatsClickHandler() {
   var thisLink = $$(this);
   // TD/STRONG/A
   var parentTD = thisLink.parentNode.parentNode;
   $(parentTD).set("innerHTML", "");
   var noCache = Math.random().toString(36).substring(3) + Math.random().toString(36).substring(3);
   $.request('get', thisLink.href + "?" + noCache).then(
      function success(content) {
         var popupWithCsvWithin = content.replace(/^\s+|\s+$/g, '');

         displayPopupWithContent(thisLink, $(parentTD), popupWithCsvWithin, ajaxToStatsClickHandler);
         var divStatsHolder = '#popup-stats-content';
         var csv = $(divStatsHolder).get('innerHTML');
         $(divStatsHolder).set('innerHTML', '');

         var margin = {top: 20, right: 20, bottom: 30, left: 40},
            width = 510 - margin.left - margin.right,
            height = 200 - margin.top - margin.bottom;

         var x = d3.scale.ordinal()
            .rangeRoundBands([0, width], .3);

         var y = d3.scale.linear()
            .range([height, 0]);

         var xAxis = d3.svg.axis()
            .scale(x)
            .orient("bottom");

         var yAxis = d3.svg.axis()
            .scale(y)
            .orient("left");

         var svg = d3.select(divStatsHolder).append("svg")
            .attr("width", width + margin.left + margin.right)
            .attr("height", height + margin.top + margin.bottom)
            .append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

         var data = d3.csv.parse(csv, stringToInt);
         var maxYAxis = d3.max(data, function (d) {
            return d.hits;
         });

         x.domain(data.map(function (d) {
            return d.resourceId;
         }));
         y.domain([0, maxYAxis]);

         svg.append("g")
            .attr("class", "x axis")
            .attr("transform", "translate(0," + height + ")")
            .call(xAxis)
            .append("text")
            .attr("x", "30%")
            .attr("dy", "2.8em")
            .text("x-stubby-resource-id");

         svg.append("g")
            .attr("class", "y axis")
            .call(yAxis)
            .append("text")
            .attr("transform", "rotate(-90)")
            .attr("y", 6)
            .attr("dy", ".71em")
            .style("text-anchor", "end")
            .text("hits");

         svg.selectAll(".bar")
            .data(data)
            .enter().append("rect")
            .attr("class", "bar")
            .attr("x", function (d) {
               return x(d.resourceId);
            })
            .attr("width", x.rangeBand())
            .attr("y", function (d) {
               return y(d.hits);
            })
            .attr("height", function (d) {
               return height - y(d.hits);
            });

         d3.select("#sort-values-box").on("change", sortColumns);
         var sortTimeout = setTimeout(function () {
            d3.select("#sort-values-box").property("checked", true).each(sortColumns);
         }, 1500);

         function stringToInt(d) {
            d.hits = +d.hits;
            d.resourceId = +d.resourceId;
            return d;
         }

         function sortColumns() {
            clearTimeout(sortTimeout);
            // Copy-on-write since tweens are evaluated after a delay.
            var x0 = x.domain(data.sort(this.checked
                     ? function (a, b) {
                     return b.hits - a.hits;
                  }
                     : function (a, b) {
                     return d3.ascending(a.resourceId, b.resourceId);
                  })
                  .map(function (d) {
                     return d.resourceId;
                  }))
               .copy();

            var transition = svg.transition().duration(1250),
               delay = function (d, i) {
                  return i * 50;
               };

            transition.selectAll(".bar")
               .delay(delay)
               .attr("x", function (d) {
                  return x0(d.resourceId);
               });

            transition.select(".x.axis")
               .call(xAxis)
               .selectAll("g")
               .delay(delay);
         }
      },
      function error(status, statusText, responseText) {
         requestErrorHandler(status, statusText, responseText, thisLink, parentTD, ajaxToStatsClickHandler);
      });
   return false;
}


function ajaxToResourceClickHandler() {
   var thisLink = $$(this);
   // TD/STRONG/A
   var parentTD = thisLink.parentNode.parentNode;
   $(parentTD).set("innerHTML", "");

   $.request('get', thisLink.href).then(
      function success(content) {
         var popupWithContent = content.replace(/^\s+|\s+$/g, '');
         displayPopupWithContent(thisLink, $(parentTD), popupWithContent, ajaxToResourceClickHandler);
         hljs.highlightBlock($$("code#ajax-response"));
      },
      function error(status, statusText, responseText) {
         requestErrorHandler(status, statusText, responseText, thisLink, parentTD, ajaxToResourceClickHandler);
      });
   return false;
}

function requestErrorHandler(status, statusText, responseText, thisLink, parentTD, thisLinkHandlerFunction) {
   var status = parseInt(status);
   if (status === 0) {
      alert("Could not contact the stubby4j backend when fetching resource:\n" + thisLink + "\n\nIs stubby4j app UP?");
   } else {
      alert("Error fetching resource:\n" + thisLink + "\n\nstatus: " + status + "\nstatusText: " + statusText + "\nresponseText: " + responseText);
   }
   //rebindAjaxLink(parentTD, thisLink, thisLinkHandlerFunction);
}

function rebindAjaxLink(parentTD, href, thisLinkHandlerFunction) {
   var anchor = anchorFactory()[0];
   $(anchor).set({'@href': href, $: '+ajaxified', 'innerHTML': '[view]'});
   $(anchor).on('click', thisLinkHandlerFunction);

   var strong = strongFactory()[0];
   parentTD.set('innerHTML', '');
   parentTD.add($(strong).add($(anchor)));
}

function displayPopupWithContent(thisLink, parentTD, popupHtmlWithContent, thisLinkHandlerFunction) {
   var body = document.body;
   var html = document.documentElement;

   var divRemovable = divFactory()[0];
   $(divRemovable).set({'@id': "popup-placeholder", 'innerHTML': popupHtmlWithContent});
   $('body').add($(divRemovable));

   var divOverlay = 'div#overlay';
   $(divOverlay).set({$display: 'block', $opacity: '0.4', $width: getMaskWidth() + 'px', $height: getMaskHeight() + 'px'});

   var divPopupWindow = 'div#popup-window';
   $(divPopupWindow).set({$display: 'block'});
   $(divPopupWindow).set({$top: getTopCoord() + "px", $left: getLeftCoord() + "px"});

   $('#close-x').on('click', function () {
      closePopupAndResetHandler();
   });

   $('#close-dialog-btn').on('click', function () {
      closePopupAndResetHandler();
   });

   $(divOverlay).on('click', function () {
      closePopupAndResetHandler();
   });

   document.onkeydown = function (event) {
      if (event == null) {
         event = window.event;
      }
      if (event.keyCode === 27) { //ESC key
         closePopupAndResetHandler();
      }
   }

   document.onmouseup = function (event) {
      onMouseUpHandler(event);
   };

   function onMouseUpHandler(event) {
      document.onmousemove = null;
      document.onselectstart = null;
      if ($$(divPopupWindow)) {
         $$(divPopupWindow).ondragstart = null;
      }
   }

   document.onmousedown = function (event) {
      onMouseDownHandler(event);
   };

   function onMouseDownHandler(event) {
      document.onmousemove = null;
      document.onselectstart = null;

      var viewportWidth = getViewportWidth();
      var viewportHeight = getViewportHeight();

      // IE is retarded and doesn't pass the event object
      if (event == null) {
         event = window.event;
      }
      // IE uses srcElement, others use target
      var target = event.target != null ? event.target : event.srcElement;

      // for IE, left click == 1
      // for Firefox, left click == 0
      if (event.button === 1 && window.event != null || event.button === 0)  {
         if (target.id === 'popup-drag-handle' || target.id === 'popup-title' || target.className === 'drag') {
            draggableHandler(event);
         }  else if (target.id === 'popup-resize-handle') {
            resizeableHandler(event);
         }
         // cancel out any text selections
         document.body.focus();
         // prevent text selection in IE
         document.onselectstart = function () {
            return false;
         };
         // prevent IE from trying to drag an image
         target.ondragstart = function () {
            return false;
         };

         $("body").set({$cursor: 'auto'});
         return false;
      }

      function draggableHandler(event) {
         // grab the mouse position
         var initialMouseX = event.clientX;
         var initialMouseY = event.clientY;
         // grab the clicked element's position
         var coords = $(divPopupWindow).get({$top: 0, $left: 0, $width: 0, $height: 0}, true);
         var initialPopupX = coords.$left;
         var initialPopupY = coords.$top;
         coords.$height = coords.$height + 52 + 13; //border width from each side: 26 * 2
         coords.$width = coords.$width + 52;   //border width from each side: 26 * 2

         // tell our code to start moving the element with the mouse
         document.onmousemove = function (event) {
            onMouseMoveHandler(event);
         };

         function onMouseMoveHandler(event) {
            if (event == null) {
               event = window.event;
            }

            var mouseDraggedDistanceX = event.clientX - initialMouseX;
            var newLeft = (initialPopupX + mouseDraggedDistanceX);
            if (newLeft + coords.$width > viewportWidth) {
               newLeft = viewportWidth - coords.$width;
            } else if (newLeft < 0) {
               newLeft = 0;
            }

            var mouseDraggedDistanceY = event.clientY - initialMouseY;
            var newTop = ( initialPopupY + mouseDraggedDistanceY);
            if (newTop + coords.$height > viewportHeight) {
               newTop = viewportHeight - coords.$height;
            } else if (newTop < 0) {
               newTop = 0;
            }
            $(divPopupWindow).set({$top: newTop + 'px', $left: newLeft + 'px'});
         }
      }

      function resizeableHandler(event) {
         // grab the mouse position
         var initialMouseX = event.clientX;
         var coords = $(divPopupWindow).get({$top: 0, $left: 0, $width: 0, $height: 0}, true);
         coords.$top = coords.$top + 52 + 13; //border width from each side plus another border: 26 * 2 + 13
         coords.$left = coords.$left + 52;   //border width from each side: 26 * 2
         var initialPopupWidth = coords.$width ;
         var minimalWidth = 420;

         // tell our code to start moving the element with the mouse
         document.onmousemove = function (event) {
            onMouseMoveHandler(event);
         };

         function onMouseMoveHandler(event) {
            if (event == null) {
               event = window.event;
            }

            var mouseDraggedDistanceX = event.clientX - initialMouseX;
            var newWidth = (initialPopupWidth + mouseDraggedDistanceX);
            if (coords.$left + newWidth > viewportWidth) {
               newWidth = viewportWidth - coords.$left;
            } else if (newWidth < minimalWidth) {
               newWidth = minimalWidth;
            }

            if (initialPopupWidth !== newWidth) {
               $(divPopupWindow).set({$width: newWidth + 'px'});
            }
         }
      }
   }

   function getViewportHeight() {
      return getMaxViewportValue("Height");
   }

   function getViewportWidth() {
      return getMaxViewportValue("Width");
   }

   function getMaxViewportValue(name) {
      return Math.min(
         body["scroll" + name],
         html["scroll" + name],
         body["offset" + name],
         html["offset" + name],
         html["client" + name]
      );
   }

   function getMaskHeight() {
      return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight, window.innerHeight);
   }

   function getMaskWidth() {
      return Math.max(body.scrollWidth, body.offsetWidth, html.clientWidth, html.scrollWidth, html.offsetWidth, window.innerWidth);
   }

   function getTopCoord() {
      return (window.innerHeight / 2 - $$(divPopupWindow).offsetHeight / 2);
   }

   function getLeftCoord() {
      return (window.innerWidth / 2 - $$(divPopupWindow).offsetWidth / 2);
   }

   function closePopupAndResetHandler() {
      closeDialog();
      rebindAjaxLink(parentTD, thisLink, thisLinkHandlerFunction);
   }

   function closeDialog() {
      $(divPopupWindow).animate({$$fade: 0}, 250).then(function () {
         $(divPopupWindow).remove();
      });
      $(divOverlay).animate({$$fade: 0}, 250).then(function () {
         $(divOverlay).remove();
      });
      $("div#popup-placeholder").remove();
   }

   window.onresize = function (event) {
      if (event == null) {
         event = window.event;
      }
      $(divOverlay).set({$width: getMaskWidth() + 'px', $height: getMaskHeight() + 'px'});
      $(divPopupWindow).set({$top: getTopCoord() + 'px', $left: getLeftCoord() + 'px', $width: '45%'});
   }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy