").appendTo($container);
- $viewport.css("overflow-y", options.autoHeight ? "hidden" : "auto");
-
- $canvas = $("
").appendTo($viewport);
-
- $focusSink2 = $focusSink.clone().appendTo($container);
-
- if (!options.explicitInitialization) {
- finishInitialization();
- }
- }
-
- function finishInitialization() {
- if (!initialized) {
- initialized = true;
-
- viewportW = parseFloat($.css($container[0], "width", true));
-
- // header columns and cells may have different padding/border skewing width calculations (box-sizing, hello?)
- // calculate the diff so we can set consistent sizes
- measureCellPaddingAndBorder();
-
- // for usability reasons, all text selection in SlickGrid is disabled
- // with the exception of input and textarea elements (selection must
- // be enabled there so that editors work as expected); note that
- // selection in grid cells (grid body) is already unavailable in
- // all browsers except IE
- disableSelection($headers); // disable all text selection in header (including input and textarea)
-
- if (!options.enableTextSelectionOnCells) {
- // disable text selection in grid cells except in input and textarea elements
- // (this is IE-specific, because selectstart event will only fire in IE)
- $viewport.bind("selectstart.ui", function (event) {
- return $(event.target).is("input,textarea");
- });
- }
-
- updateColumnCaches();
- createColumnHeaders();
- setupColumnSort();
- createCssRules();
- resizeCanvas();
- bindAncestorScrollEvents();
-
- $container
- .bind("resize.slickgrid", resizeCanvas);
- $viewport
- //.bind("click", handleClick)
- .bind("scroll", handleScroll);
- $headerScroller
- .bind("contextmenu", handleHeaderContextMenu)
- .bind("click", handleHeaderClick)
- .delegate(".slick-header-column", "mouseenter", handleHeaderMouseEnter)
- .delegate(".slick-header-column", "mouseleave", handleHeaderMouseLeave);
- $headerRowScroller
- .bind("scroll", handleHeaderRowScroll);
- $focusSink.add($focusSink2)
- .bind("keydown", handleKeyDown);
- $canvas
- .bind("keydown", handleKeyDown)
- .bind("click", handleClick)
- .bind("dblclick", handleDblClick)
- .bind("contextmenu", handleContextMenu)
- .bind("draginit", handleDragInit)
- .bind("dragstart", {distance: 3}, handleDragStart)
- .bind("drag", handleDrag)
- .bind("dragend", handleDragEnd)
- .delegate(".slick-cell", "mouseenter", handleMouseEnter)
- .delegate(".slick-cell", "mouseleave", handleMouseLeave);
-
- // Work around http://crbug.com/312427.
- if (navigator.userAgent.toLowerCase().match(/webkit/) &&
- navigator.userAgent.toLowerCase().match(/macintosh/)) {
- $canvas.bind("mousewheel", handleMouseWheel);
- }
- }
- }
-
- function registerPlugin(plugin) {
- plugins.unshift(plugin);
- plugin.init(self);
- }
-
- function unregisterPlugin(plugin) {
- for (var i = plugins.length; i >= 0; i--) {
- if (plugins[i] === plugin) {
- if (plugins[i].destroy) {
- plugins[i].destroy();
- }
- plugins.splice(i, 1);
- break;
- }
- }
- }
-
- function setSelectionModel(model) {
- if (selectionModel) {
- selectionModel.onSelectedRangesChanged.unsubscribe(handleSelectedRangesChanged);
- if (selectionModel.destroy) {
- selectionModel.destroy();
- }
- }
-
- selectionModel = model;
- if (selectionModel) {
- selectionModel.init(self);
- selectionModel.onSelectedRangesChanged.subscribe(handleSelectedRangesChanged);
- }
- }
-
- function getSelectionModel() {
- return selectionModel;
- }
-
- function getCanvasNode() {
- return $canvas[0];
- }
-
- function measureScrollbar() {
- var $c = $("
").appendTo("body");
- var dim = {
- width: $c.width() - $c[0].clientWidth,
- height: $c.height() - $c[0].clientHeight
- };
- $c.remove();
- return dim;
- }
-
- function getHeadersWidth() {
- var headersWidth = 0;
- for (var i = 0, ii = columns.length; i < ii; i++) {
- var width = columns[i].width;
- headersWidth += width;
- }
- headersWidth += scrollbarDimensions.width;
- return Math.max(headersWidth, viewportW) + 1000;
- }
-
- function getCanvasWidth() {
- var availableWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;
- var rowWidth = 0;
- var i = columns.length;
- while (i--) {
- rowWidth += columns[i].width;
- }
- return options.fullWidthRows ? Math.max(rowWidth, availableWidth) : rowWidth;
- }
-
- function updateCanvasWidth(forceColumnWidthsUpdate) {
- var oldCanvasWidth = canvasWidth;
- canvasWidth = getCanvasWidth();
-
- if (canvasWidth != oldCanvasWidth) {
- $canvas.width(canvasWidth);
- $headerRow.width(canvasWidth);
- $headers.width(getHeadersWidth());
- viewportHasHScroll = (canvasWidth > viewportW - scrollbarDimensions.width);
- }
-
- $headerRowSpacer.width(canvasWidth + (viewportHasVScroll ? scrollbarDimensions.width : 0));
-
- if (canvasWidth != oldCanvasWidth || forceColumnWidthsUpdate) {
- applyColumnWidths();
- }
- }
-
- function disableSelection($target) {
- if ($target && $target.jquery) {
- $target
- .attr("unselectable", "on")
- .css("MozUserSelect", "none")
- .bind("selectstart.ui", function () {
- return false;
- }); // from jquery:ui.core.js 1.7.2
- }
- }
-
- function getMaxSupportedCssHeight() {
- var supportedHeight = 1000000;
- // FF reports the height back but still renders blank after ~6M px
- var testUpTo = navigator.userAgent.toLowerCase().match(/firefox/) ? 6000000 : 1000000000;
- var div = $("
").appendTo(document.body);
-
- while (true) {
- var test = supportedHeight * 2;
- div.css("height", test);
- if (test > testUpTo || div.height() !== test) {
- break;
- } else {
- supportedHeight = test;
- }
- }
-
- div.remove();
- return supportedHeight;
- }
-
- // TODO: this is static. need to handle page mutation.
- function bindAncestorScrollEvents() {
- var elem = $canvas[0];
- while ((elem = elem.parentNode) != document.body && elem != null) {
- // bind to scroll containers only
- if (elem == $viewport[0] || elem.scrollWidth != elem.clientWidth || elem.scrollHeight != elem.clientHeight) {
- var $elem = $(elem);
- if (!$boundAncestors) {
- $boundAncestors = $elem;
- } else {
- $boundAncestors = $boundAncestors.add($elem);
- }
- $elem.bind("scroll." + uid, handleActiveCellPositionChange);
- }
- }
- }
-
- function unbindAncestorScrollEvents() {
- if (!$boundAncestors) {
- return;
- }
- $boundAncestors.unbind("scroll." + uid);
- $boundAncestors = null;
- }
-
- function updateColumnHeader(columnId, title, toolTip) {
- if (!initialized) { return; }
- var idx = getColumnIndex(columnId);
- if (idx == null) {
- return;
- }
-
- var columnDef = columns[idx];
- var $header = $headers.children().eq(idx);
- if ($header) {
- if (title !== undefined) {
- columns[idx].name = title;
- }
- if (toolTip !== undefined) {
- columns[idx].toolTip = toolTip;
- }
-
- trigger(self.onBeforeHeaderCellDestroy, {
- "node": $header[0],
- "column": columnDef
- });
-
- $header
- .attr("title", toolTip || "")
- .children().eq(0).html(title);
-
- trigger(self.onHeaderCellRendered, {
- "node": $header[0],
- "column": columnDef
- });
- }
- }
-
- function getHeaderRow() {
- return $headerRow[0];
- }
-
- function getHeaderRowColumn(columnId) {
- var idx = getColumnIndex(columnId);
- var $header = $headerRow.children().eq(idx);
- return $header && $header[0];
- }
-
- function createColumnHeaders() {
- function onMouseEnter() {
- $(this).addClass("ui-state-hover");
- }
-
- function onMouseLeave() {
- $(this).removeClass("ui-state-hover");
- }
-
- $headers.find(".slick-header-column")
- .each(function() {
- var columnDef = $(this).data("column");
- if (columnDef) {
- trigger(self.onBeforeHeaderCellDestroy, {
- "node": this,
- "column": columnDef
- });
- }
- });
- $headers.empty();
- $headers.width(getHeadersWidth());
-
- $headerRow.find(".slick-headerrow-column")
- .each(function() {
- var columnDef = $(this).data("column");
- if (columnDef) {
- trigger(self.onBeforeHeaderRowCellDestroy, {
- "node": this,
- "column": columnDef
- });
- }
- });
- $headerRow.empty();
-
- for (var i = 0; i < columns.length; i++) {
- var m = columns[i];
-
- var header = $("
")
- .html("
" + m.name + "")
- .width(m.width - headerColumnWidthDiff)
- .attr("id", "" + uid + m.id)
- .attr("title", m.toolTip || "")
- .data("column", m)
- .addClass(m.headerCssClass || "")
- .appendTo($headers);
-
- if (options.enableColumnReorder || m.sortable) {
- header
- .on('mouseenter', onMouseEnter)
- .on('mouseleave', onMouseLeave);
- }
-
- if (m.sortable) {
- header.addClass("slick-header-sortable");
- header.append("
");
- }
-
- trigger(self.onHeaderCellRendered, {
- "node": header[0],
- "column": m
- });
-
- if (options.showHeaderRow) {
- var headerRowCell = $("
")
- .data("column", m)
- .appendTo($headerRow);
-
- trigger(self.onHeaderRowCellRendered, {
- "node": headerRowCell[0],
- "column": m
- });
- }
- }
-
- setSortColumns(sortColumns);
- setupColumnResize();
- if (options.enableColumnReorder) {
- setupColumnReorder();
- }
- }
-
- function setupColumnSort() {
- $headers.click(function (e) {
- // temporary workaround for a bug in jQuery 1.7.1 (http://bugs.jquery.com/ticket/11328)
- e.metaKey = e.metaKey || e.ctrlKey;
-
- if ($(e.target).hasClass("slick-resizable-handle")) {
- return;
- }
-
- var $col = $(e.target).closest(".slick-header-column");
- if (!$col.length) {
- return;
- }
-
- var column = $col.data("column");
- if (column.sortable) {
- if (!getEditorLock().commitCurrentEdit()) {
- return;
- }
-
- var sortOpts = null;
- var i = 0;
- for (; i < sortColumns.length; i++) {
- if (sortColumns[i].columnId == column.id) {
- sortOpts = sortColumns[i];
- sortOpts.sortAsc = !sortOpts.sortAsc;
- break;
- }
- }
-
- if (e.metaKey && options.multiColumnSort) {
- if (sortOpts) {
- sortColumns.splice(i, 1);
- }
- }
- else {
- if ((!e.shiftKey && !e.metaKey) || !options.multiColumnSort) {
- sortColumns = [];
- }
-
- if (!sortOpts) {
- sortOpts = { columnId: column.id, sortAsc: column.defaultSortAsc };
- sortColumns.push(sortOpts);
- } else if (sortColumns.length == 0) {
- sortColumns.push(sortOpts);
- }
- }
-
- setSortColumns(sortColumns);
-
- if (!options.multiColumnSort) {
- trigger(self.onSort, {
- multiColumnSort: false,
- sortCol: column,
- sortAsc: sortOpts.sortAsc}, e);
- } else {
- trigger(self.onSort, {
- multiColumnSort: true,
- sortCols: $.map(sortColumns, function(col) {
- return {sortCol: columns[getColumnIndex(col.columnId)], sortAsc: col.sortAsc };
- })}, e);
- }
- }
- });
- }
-
- function setupColumnReorder() {
- $headers.filter(":ui-sortable").sortable("destroy");
- $headers.sortable({
- containment: "parent",
- distance: 3,
- axis: "x",
- cursor: "default",
- tolerance: "intersection",
- helper: "clone",
- placeholder: "slick-sortable-placeholder ui-state-default slick-header-column",
- start: function (e, ui) {
- ui.placeholder.width(ui.helper.outerWidth() - headerColumnWidthDiff);
- $(ui.helper).addClass("slick-header-column-active");
- },
- beforeStop: function (e, ui) {
- $(ui.helper).removeClass("slick-header-column-active");
- },
- stop: function (e) {
- if (!getEditorLock().commitCurrentEdit()) {
- $(this).sortable("cancel");
- return;
- }
-
- var reorderedIds = $headers.sortable("toArray");
- var reorderedColumns = [];
- for (var i = 0; i < reorderedIds.length; i++) {
- reorderedColumns.push(columns[getColumnIndex(reorderedIds[i].replace(uid, ""))]);
- }
- setColumns(reorderedColumns);
-
- trigger(self.onColumnsReordered, {});
- e.stopPropagation();
- setupColumnResize();
- }
- });
- }
-
- function setupColumnResize() {
- var $col, j, c, pageX, columnElements, minPageX, maxPageX, firstResizable, lastResizable;
- columnElements = $headers.children();
- columnElements.find(".slick-resizable-handle").remove();
- columnElements.each(function (i, e) {
- if (columns[i].resizable) {
- if (firstResizable === undefined) {
- firstResizable = i;
- }
- lastResizable = i;
- }
- });
- if (firstResizable === undefined) {
- return;
- }
- columnElements.each(function (i, e) {
- if (i < firstResizable || (options.forceFitColumns && i >= lastResizable)) {
- return;
- }
- $col = $(e);
- $("
")
- .appendTo(e)
- .bind("dragstart", function (e, dd) {
- if (!getEditorLock().commitCurrentEdit()) {
- return false;
- }
- pageX = e.pageX;
- $(this).parent().addClass("slick-header-column-active");
- var shrinkLeewayOnRight = null, stretchLeewayOnRight = null;
- // lock each column's width option to current width
- columnElements.each(function (i, e) {
- columns[i].previousWidth = $(e).outerWidth();
- });
- if (options.forceFitColumns) {
- shrinkLeewayOnRight = 0;
- stretchLeewayOnRight = 0;
- // colums on right affect maxPageX/minPageX
- for (j = i + 1; j < columnElements.length; j++) {
- c = columns[j];
- if (c.resizable) {
- if (stretchLeewayOnRight !== null) {
- if (c.maxWidth) {
- stretchLeewayOnRight += c.maxWidth - c.previousWidth;
- } else {
- stretchLeewayOnRight = null;
- }
- }
- shrinkLeewayOnRight += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);
- }
- }
- }
- var shrinkLeewayOnLeft = 0, stretchLeewayOnLeft = 0;
- for (j = 0; j <= i; j++) {
- // columns on left only affect minPageX
- c = columns[j];
- if (c.resizable) {
- if (stretchLeewayOnLeft !== null) {
- if (c.maxWidth) {
- stretchLeewayOnLeft += c.maxWidth - c.previousWidth;
- } else {
- stretchLeewayOnLeft = null;
- }
- }
- shrinkLeewayOnLeft += c.previousWidth - Math.max(c.minWidth || 0, absoluteColumnMinWidth);
- }
- }
- if (shrinkLeewayOnRight === null) {
- shrinkLeewayOnRight = 100000;
- }
- if (shrinkLeewayOnLeft === null) {
- shrinkLeewayOnLeft = 100000;
- }
- if (stretchLeewayOnRight === null) {
- stretchLeewayOnRight = 100000;
- }
- if (stretchLeewayOnLeft === null) {
- stretchLeewayOnLeft = 100000;
- }
- maxPageX = pageX + Math.min(shrinkLeewayOnRight, stretchLeewayOnLeft);
- minPageX = pageX - Math.min(shrinkLeewayOnLeft, stretchLeewayOnRight);
- })
- .bind("drag", function (e, dd) {
- var actualMinWidth, d = Math.min(maxPageX, Math.max(minPageX, e.pageX)) - pageX, x;
- if (d < 0) { // shrink column
- x = d;
- for (j = i; j >= 0; j--) {
- c = columns[j];
- if (c.resizable) {
- actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);
- if (x && c.previousWidth + x < actualMinWidth) {
- x += c.previousWidth - actualMinWidth;
- c.width = actualMinWidth;
- } else {
- c.width = c.previousWidth + x;
- x = 0;
- }
- }
- }
-
- if (options.forceFitColumns) {
- x = -d;
- for (j = i + 1; j < columnElements.length; j++) {
- c = columns[j];
- if (c.resizable) {
- if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {
- x -= c.maxWidth - c.previousWidth;
- c.width = c.maxWidth;
- } else {
- c.width = c.previousWidth + x;
- x = 0;
- }
- }
- }
- }
- } else { // stretch column
- x = d;
- for (j = i; j >= 0; j--) {
- c = columns[j];
- if (c.resizable) {
- if (x && c.maxWidth && (c.maxWidth - c.previousWidth < x)) {
- x -= c.maxWidth - c.previousWidth;
- c.width = c.maxWidth;
- } else {
- c.width = c.previousWidth + x;
- x = 0;
- }
- }
- }
-
- if (options.forceFitColumns) {
- x = -d;
- for (j = i + 1; j < columnElements.length; j++) {
- c = columns[j];
- if (c.resizable) {
- actualMinWidth = Math.max(c.minWidth || 0, absoluteColumnMinWidth);
- if (x && c.previousWidth + x < actualMinWidth) {
- x += c.previousWidth - actualMinWidth;
- c.width = actualMinWidth;
- } else {
- c.width = c.previousWidth + x;
- x = 0;
- }
- }
- }
- }
- }
- applyColumnHeaderWidths();
- if (options.syncColumnCellResize) {
- applyColumnWidths();
- }
- })
- .bind("dragend", function (e, dd) {
- var newWidth;
- $(this).parent().removeClass("slick-header-column-active");
- for (j = 0; j < columnElements.length; j++) {
- c = columns[j];
- newWidth = $(columnElements[j]).outerWidth();
-
- if (c.previousWidth !== newWidth && c.rerenderOnResize) {
- invalidateAllRows();
- }
- }
- updateCanvasWidth(true);
- render();
- trigger(self.onColumnsResized, {});
- });
- });
- }
-
- function getVBoxDelta($el) {
- var p = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"];
- var delta = 0;
- $.each(p, function (n, val) {
- delta += parseFloat($el.css(val)) || 0;
- });
- return delta;
- }
-
- function measureCellPaddingAndBorder() {
- var el;
- var h = ["borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight"];
- var v = ["borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom"];
-
- el = $("
-
").appendTo($headers);
- headerColumnWidthDiff = headerColumnHeightDiff = 0;
- if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
- $.each(h, function (n, val) {
- headerColumnWidthDiff += parseFloat(el.css(val)) || 0;
- });
- $.each(v, function (n, val) {
- headerColumnHeightDiff += parseFloat(el.css(val)) || 0;
- });
- }
- el.remove();
-
- var r = $("
").appendTo($canvas);
- el = $("
-
").appendTo(r);
- cellWidthDiff = cellHeightDiff = 0;
- if (el.css("box-sizing") != "border-box" && el.css("-moz-box-sizing") != "border-box" && el.css("-webkit-box-sizing") != "border-box") {
- $.each(h, function (n, val) {
- cellWidthDiff += parseFloat(el.css(val)) || 0;
- });
- $.each(v, function (n, val) {
- cellHeightDiff += parseFloat(el.css(val)) || 0;
- });
- }
- r.remove();
-
- absoluteColumnMinWidth = Math.max(headerColumnWidthDiff, cellWidthDiff);
- }
-
- function createCssRules() {
- $style = $("").appendTo($("head"));
- var rowHeight = (options.rowHeight - cellHeightDiff);
- var rules = [
- "." + uid + " .slick-header-column { left: 1000px; }",
- "." + uid + " .slick-top-panel { height:" + options.topPanelHeight + "px; }",
- "." + uid + " .slick-headerrow-columns { height:" + options.headerRowHeight + "px; }",
- "." + uid + " .slick-cell { height:" + rowHeight + "px; }",
- "." + uid + " .slick-row { height:" + options.rowHeight + "px; }"
- ];
-
- for (var i = 0; i < columns.length; i++) {
- rules.push("." + uid + " .l" + i + " { }");
- rules.push("." + uid + " .r" + i + " { }");
- }
-
- if ($style[0].styleSheet) { // IE
- $style[0].styleSheet.cssText = rules.join(" ");
- } else {
- $style[0].appendChild(document.createTextNode(rules.join(" ")));
- }
- }
-
- function getColumnCssRules(idx) {
- if (!stylesheet) {
- var sheets = document.styleSheets;
- for (var i = 0; i < sheets.length; i++) {
- if ((sheets[i].ownerNode || sheets[i].owningElement) == $style[0]) {
- stylesheet = sheets[i];
- break;
- }
- }
-
- if (!stylesheet) {
- throw new Error("Cannot find stylesheet.");
- }
-
- // find and cache column CSS rules
- columnCssRulesL = [];
- columnCssRulesR = [];
- var cssRules = (stylesheet.cssRules || stylesheet.rules);
- var matches, columnIdx;
- for (var i = 0; i < cssRules.length; i++) {
- var selector = cssRules[i].selectorText;
- if (matches = /\.l\d+/.exec(selector)) {
- columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);
- columnCssRulesL[columnIdx] = cssRules[i];
- } else if (matches = /\.r\d+/.exec(selector)) {
- columnIdx = parseInt(matches[0].substr(2, matches[0].length - 2), 10);
- columnCssRulesR[columnIdx] = cssRules[i];
- }
- }
- }
-
- return {
- "left": columnCssRulesL[idx],
- "right": columnCssRulesR[idx]
- };
- }
-
- function removeCssRules() {
- $style.remove();
- stylesheet = null;
- }
-
- function destroy() {
- getEditorLock().cancelCurrentEdit();
-
- trigger(self.onBeforeDestroy, {});
-
- var i = plugins.length;
- while(i--) {
- unregisterPlugin(plugins[i]);
- }
-
- if (options.enableColumnReorder) {
- $headers.filter(":ui-sortable").sortable("destroy");
- }
-
- unbindAncestorScrollEvents();
- $container.unbind(".slickgrid");
- removeCssRules();
-
- $canvas.unbind("draginit dragstart dragend drag");
- $container.empty().removeClass(uid);
- }
-
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // General
-
- function trigger(evt, args, e) {
- e = e || new Slick.EventData();
- args = args || {};
- args.grid = self;
- return evt.notify(args, e, self);
- }
-
- function getEditorLock() {
- return options.editorLock;
- }
-
- function getEditController() {
- return editController;
- }
-
- function getColumnIndex(id) {
- return columnsById[id];
- }
-
- function autosizeColumns() {
- var i, c,
- widths = [],
- shrinkLeeway = 0,
- total = 0,
- prevTotal,
- availWidth = viewportHasVScroll ? viewportW - scrollbarDimensions.width : viewportW;
-
- for (i = 0; i < columns.length; i++) {
- c = columns[i];
- widths.push(c.width);
- total += c.width;
- if (c.resizable) {
- shrinkLeeway += c.width - Math.max(c.minWidth, absoluteColumnMinWidth);
- }
- }
-
- // shrink
- prevTotal = total;
- while (total > availWidth && shrinkLeeway) {
- var shrinkProportion = (total - availWidth) / shrinkLeeway;
- for (i = 0; i < columns.length && total > availWidth; i++) {
- c = columns[i];
- var width = widths[i];
- if (!c.resizable || width <= c.minWidth || width <= absoluteColumnMinWidth) {
- continue;
- }
- var absMinWidth = Math.max(c.minWidth, absoluteColumnMinWidth);
- var shrinkSize = Math.floor(shrinkProportion * (width - absMinWidth)) || 1;
- shrinkSize = Math.min(shrinkSize, width - absMinWidth);
- total -= shrinkSize;
- shrinkLeeway -= shrinkSize;
- widths[i] -= shrinkSize;
- }
- if (prevTotal <= total) { // avoid infinite loop
- break;
- }
- prevTotal = total;
- }
-
- // grow
- prevTotal = total;
- while (total < availWidth) {
- var growProportion = availWidth / total;
- for (i = 0; i < columns.length && total < availWidth; i++) {
- c = columns[i];
- var currentWidth = widths[i];
- var growSize;
-
- if (!c.resizable || c.maxWidth <= currentWidth) {
- growSize = 0;
- } else {
- growSize = Math.min(Math.floor(growProportion * currentWidth) - currentWidth, (c.maxWidth - currentWidth) || 1000000) || 1;
- }
- total += growSize;
- widths[i] += growSize;
- }
- if (prevTotal >= total) { // avoid infinite loop
- break;
- }
- prevTotal = total;
- }
-
- var reRender = false;
- for (i = 0; i < columns.length; i++) {
- if (columns[i].rerenderOnResize && columns[i].width != widths[i]) {
- reRender = true;
- }
- columns[i].width = widths[i];
- }
-
- applyColumnHeaderWidths();
- updateCanvasWidth(true);
- if (reRender) {
- invalidateAllRows();
- render();
- }
- }
-
- function applyColumnHeaderWidths() {
- if (!initialized) { return; }
- var h;
- for (var i = 0, headers = $headers.children(), ii = headers.length; i < ii; i++) {
- h = $(headers[i]);
- if (h.width() !== columns[i].width - headerColumnWidthDiff) {
- h.width(columns[i].width - headerColumnWidthDiff);
- }
- }
-
- updateColumnCaches();
- }
-
- function applyColumnWidths() {
- var x = 0, w, rule;
- for (var i = 0; i < columns.length; i++) {
- w = columns[i].width;
-
- rule = getColumnCssRules(i);
- rule.left.style.left = x + "px";
- rule.right.style.right = (canvasWidth - x - w) + "px";
-
- x += columns[i].width;
- }
- }
-
- function setSortColumn(columnId, ascending) {
- setSortColumns([{ columnId: columnId, sortAsc: ascending}]);
- }
-
- function setSortColumns(cols) {
- sortColumns = cols;
-
- var headerColumnEls = $headers.children();
- headerColumnEls
- .removeClass("slick-header-column-sorted")
- .find(".slick-sort-indicator")
- .removeClass("slick-sort-indicator-asc slick-sort-indicator-desc");
-
- $.each(sortColumns, function(i, col) {
- if (col.sortAsc == null) {
- col.sortAsc = true;
- }
- var columnIndex = getColumnIndex(col.columnId);
- if (columnIndex != null) {
- headerColumnEls.eq(columnIndex)
- .addClass("slick-header-column-sorted")
- .find(".slick-sort-indicator")
- .addClass(col.sortAsc ? "slick-sort-indicator-asc" : "slick-sort-indicator-desc");
- }
- });
- }
-
- function getSortColumns() {
- return sortColumns;
- }
-
- function handleSelectedRangesChanged(e, ranges) {
- selectedRows = [];
- var hash = {};
- for (var i = 0; i < ranges.length; i++) {
- for (var j = ranges[i].fromRow; j <= ranges[i].toRow; j++) {
- if (!hash[j]) { // prevent duplicates
- selectedRows.push(j);
- hash[j] = {};
- }
- for (var k = ranges[i].fromCell; k <= ranges[i].toCell; k++) {
- if (canCellBeSelected(j, k)) {
- hash[j][columns[k].id] = options.selectedCellCssClass;
- }
- }
- }
- }
-
- setCellCssStyles(options.selectedCellCssClass, hash);
-
- trigger(self.onSelectedRowsChanged, {rows: getSelectedRows()}, e);
- }
-
- function getColumns() {
- return columns;
- }
-
- function updateColumnCaches() {
- // Pre-calculate cell boundaries.
- columnPosLeft = [];
- columnPosRight = [];
- var x = 0;
- for (var i = 0, ii = columns.length; i < ii; i++) {
- columnPosLeft[i] = x;
- columnPosRight[i] = x + columns[i].width;
- x += columns[i].width;
- }
- }
-
- function setColumns(columnDefinitions) {
- columns = columnDefinitions;
-
- columnsById = {};
- for (var i = 0; i < columns.length; i++) {
- var m = columns[i] = $.extend({}, columnDefaults, columns[i]);
- columnsById[m.id] = i;
- if (m.minWidth && m.width < m.minWidth) {
- m.width = m.minWidth;
- }
- if (m.maxWidth && m.width > m.maxWidth) {
- m.width = m.maxWidth;
- }
- }
-
- updateColumnCaches();
-
- if (initialized) {
- invalidateAllRows();
- createColumnHeaders();
- removeCssRules();
- createCssRules();
- resizeCanvas();
- applyColumnWidths();
- handleScroll();
- }
- }
-
- function getOptions() {
- return options;
- }
-
- function setOptions(args) {
- if (!getEditorLock().commitCurrentEdit()) {
- return;
- }
-
- makeActiveCellNormal();
-
- if (options.enableAddRow !== args.enableAddRow) {
- invalidateRow(getDataLength());
- }
-
- options = $.extend(options, args);
- validateAndEnforceOptions();
-
- $viewport.css("overflow-y", options.autoHeight ? "hidden" : "auto");
- render();
- }
-
- function validateAndEnforceOptions() {
- if (options.autoHeight) {
- options.leaveSpaceForNewRows = false;
- }
- }
-
- function setData(newData, scrollToTop) {
- data = newData;
- invalidateAllRows();
- updateRowCount();
- if (scrollToTop) {
- scrollTo(0);
- }
- }
-
- function getData() {
- return data;
- }
-
- function getDataLength() {
- if (data.getLength) {
- return data.getLength();
- } else {
- return data.length;
- }
- }
-
- function getDataLengthIncludingAddNew() {
- return getDataLength() + (options.enableAddRow ? 1 : 0);
- }
-
- function getDataItem(i) {
- if (data.getItem) {
- return data.getItem(i);
- } else {
- return data[i];
- }
- }
-
- function getTopPanel() {
- return $topPanel[0];
- }
-
- function setTopPanelVisibility(visible) {
- if (options.showTopPanel != visible) {
- options.showTopPanel = visible;
- if (visible) {
- $topPanelScroller.slideDown("fast", resizeCanvas);
- } else {
- $topPanelScroller.slideUp("fast", resizeCanvas);
- }
- }
- }
-
- function setHeaderRowVisibility(visible) {
- if (options.showHeaderRow != visible) {
- options.showHeaderRow = visible;
- if (visible) {
- $headerRowScroller.slideDown("fast", resizeCanvas);
- } else {
- $headerRowScroller.slideUp("fast", resizeCanvas);
- }
- }
- }
-
- function getContainerNode() {
- return $container.get(0);
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Rendering / Scrolling
-
- function getRowTop(row) {
- return options.rowHeight * row - offset;
- }
-
- function getRowFromPosition(y) {
- return Math.floor((y + offset) / options.rowHeight);
- }
-
- function scrollTo(y) {
- y = Math.max(y, 0);
- y = Math.min(y, th - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0));
-
- var oldOffset = offset;
-
- page = Math.min(n - 1, Math.floor(y / ph));
- offset = Math.round(page * cj);
- var newScrollTop = y - offset;
-
- if (offset != oldOffset) {
- var range = getVisibleRange(newScrollTop);
- cleanupRows(range);
- updateRowPositions();
- }
-
- if (prevScrollTop != newScrollTop) {
- vScrollDir = (prevScrollTop + oldOffset < newScrollTop + offset) ? 1 : -1;
- $viewport[0].scrollTop = (lastRenderedScrollTop = scrollTop = prevScrollTop = newScrollTop);
-
- trigger(self.onViewportChanged, {});
- }
- }
-
- function defaultFormatter(row, cell, value, columnDef, dataContext) {
- if (value == null) {
- return "";
- } else {
- return (value + "").replace(/&/g,"&").replace(//g,">");
- }
- }
-
- function getFormatter(row, column) {
- var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
-
- // look up by id, then index
- var columnOverrides = rowMetadata &&
- rowMetadata.columns &&
- (rowMetadata.columns[column.id] || rowMetadata.columns[getColumnIndex(column.id)]);
-
- return (columnOverrides && columnOverrides.formatter) ||
- (rowMetadata && rowMetadata.formatter) ||
- column.formatter ||
- (options.formatterFactory && options.formatterFactory.getFormatter(column)) ||
- options.defaultFormatter;
- }
-
- function getEditor(row, cell) {
- var column = columns[cell];
- var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
- var columnMetadata = rowMetadata && rowMetadata.columns;
-
- if (columnMetadata && columnMetadata[column.id] && columnMetadata[column.id].editor !== undefined) {
- return columnMetadata[column.id].editor;
- }
- if (columnMetadata && columnMetadata[cell] && columnMetadata[cell].editor !== undefined) {
- return columnMetadata[cell].editor;
- }
-
- return column.editor || (options.editorFactory && options.editorFactory.getEditor(column));
- }
-
- function getDataItemValueForColumn(item, columnDef) {
- if (options.dataItemColumnValueExtractor) {
- return options.dataItemColumnValueExtractor(item, columnDef);
- }
- return item[columnDef.field];
- }
-
- function appendRowHtml(stringArray, row, range, dataLength) {
- var d = getDataItem(row);
- var dataLoading = row < dataLength && !d;
- var rowCss = "slick-row" +
- (dataLoading ? " loading" : "") +
- (row === activeRow ? " active" : "") +
- (row % 2 == 1 ? " odd" : " even");
-
- if (!d) {
- rowCss += " " + options.addNewRowCssClass;
- }
-
- var metadata = data.getItemMetadata && data.getItemMetadata(row);
-
- if (metadata && metadata.cssClasses) {
- rowCss += " " + metadata.cssClasses;
- }
-
- stringArray.push("
");
-
- var colspan, m;
- for (var i = 0, ii = columns.length; i < ii; i++) {
- m = columns[i];
- colspan = 1;
- if (metadata && metadata.columns) {
- var columnData = metadata.columns[m.id] || metadata.columns[i];
- colspan = (columnData && columnData.colspan) || 1;
- if (colspan === "*") {
- colspan = ii - i;
- }
- }
-
- // Do not render cells outside of the viewport.
- if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {
- if (columnPosLeft[i] > range.rightPx) {
- // All columns to the right are outside the range.
- break;
- }
-
- appendCellHtml(stringArray, row, i, colspan, d);
- }
-
- if (colspan > 1) {
- i += (colspan - 1);
- }
- }
-
- stringArray.push("
");
- }
-
- function appendCellHtml(stringArray, row, cell, colspan, item) {
- var m = columns[cell];
- var cellCss = "slick-cell l" + cell + " r" + Math.min(columns.length - 1, cell + colspan - 1) +
- (m.cssClass ? " " + m.cssClass : "");
- if (row === activeRow && cell === activeCell) {
- cellCss += (" active");
- }
-
- // TODO: merge them together in the setter
- for (var key in cellCssClasses) {
- if (cellCssClasses[key][row] && cellCssClasses[key][row][m.id]) {
- cellCss += (" " + cellCssClasses[key][row][m.id]);
- }
- }
-
- stringArray.push("
");
-
- // if there is a corresponding row (if not, this is the Add New row or this data hasn't been loaded yet)
- if (item) {
- var value = getDataItemValueForColumn(item, m);
- stringArray.push(getFormatter(row, m)(row, cell, value, m, item));
- }
-
- stringArray.push("
");
-
- rowsCache[row].cellRenderQueue.push(cell);
- rowsCache[row].cellColSpans[cell] = colspan;
- }
-
-
- function cleanupRows(rangeToKeep) {
- for (var i in rowsCache) {
- if (((i = parseInt(i, 10)) !== activeRow) && (i < rangeToKeep.top || i > rangeToKeep.bottom)) {
- removeRowFromCache(i);
- }
- }
- }
-
- function invalidate() {
- updateRowCount();
- invalidateAllRows();
- render();
- }
-
- function invalidateAllRows() {
- if (currentEditor) {
- makeActiveCellNormal();
- }
- for (var row in rowsCache) {
- removeRowFromCache(row);
- }
- }
-
- function removeRowFromCache(row) {
- var cacheEntry = rowsCache[row];
- if (!cacheEntry) {
- return;
- }
-
- if (rowNodeFromLastMouseWheelEvent == cacheEntry.rowNode) {
- cacheEntry.rowNode.style.display = 'none';
- zombieRowNodeFromLastMouseWheelEvent = rowNodeFromLastMouseWheelEvent;
- } else {
- $canvas[0].removeChild(cacheEntry.rowNode);
- }
-
- delete rowsCache[row];
- delete postProcessedRows[row];
- renderedRows--;
- counter_rows_removed++;
- }
-
- function invalidateRows(rows) {
- var i, rl;
- if (!rows || !rows.length) {
- return;
- }
- vScrollDir = 0;
- for (i = 0, rl = rows.length; i < rl; i++) {
- if (currentEditor && activeRow === rows[i]) {
- makeActiveCellNormal();
- }
- if (rowsCache[rows[i]]) {
- removeRowFromCache(rows[i]);
- }
- }
- }
-
- function invalidateRow(row) {
- invalidateRows([row]);
- }
-
- function updateCell(row, cell) {
- var cellNode = getCellNode(row, cell);
- if (!cellNode) {
- return;
- }
-
- var m = columns[cell], d = getDataItem(row);
- if (currentEditor && activeRow === row && activeCell === cell) {
- currentEditor.loadValue(d);
- } else {
- cellNode.innerHTML = d ? getFormatter(row, m)(row, cell, getDataItemValueForColumn(d, m), m, d) : "";
- invalidatePostProcessingResults(row);
- }
- }
-
- function updateRow(row) {
- var cacheEntry = rowsCache[row];
- if (!cacheEntry) {
- return;
- }
-
- ensureCellNodesInRowsCache(row);
-
- var d = getDataItem(row);
-
- for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {
- if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {
- continue;
- }
-
- columnIdx = columnIdx | 0;
- var m = columns[columnIdx],
- node = cacheEntry.cellNodesByColumnIdx[columnIdx];
-
- if (row === activeRow && columnIdx === activeCell && currentEditor) {
- currentEditor.loadValue(d);
- } else if (d) {
- node.innerHTML = getFormatter(row, m)(row, columnIdx, getDataItemValueForColumn(d, m), m, d);
- } else {
- node.innerHTML = "";
- }
- }
-
- invalidatePostProcessingResults(row);
- }
-
- function getViewportHeight() {
- return parseFloat($.css($container[0], "height", true)) -
- parseFloat($.css($container[0], "paddingTop", true)) -
- parseFloat($.css($container[0], "paddingBottom", true)) -
- parseFloat($.css($headerScroller[0], "height")) - getVBoxDelta($headerScroller) -
- (options.showTopPanel ? options.topPanelHeight + getVBoxDelta($topPanelScroller) : 0) -
- (options.showHeaderRow ? options.headerRowHeight + getVBoxDelta($headerRowScroller) : 0);
- }
-
- function resizeCanvas() {
- if (!initialized) { return; }
- if (options.autoHeight) {
- viewportH = options.rowHeight * getDataLengthIncludingAddNew();
- } else {
- viewportH = getViewportHeight();
- }
-
- numVisibleRows = Math.ceil(viewportH / options.rowHeight);
- viewportW = parseFloat($.css($container[0], "width", true));
- if (!options.autoHeight) {
- $viewport.height(viewportH);
- }
-
- if (options.forceFitColumns) {
- autosizeColumns();
- }
-
- updateRowCount();
- handleScroll();
- // Since the width has changed, force the render() to reevaluate virtually rendered cells.
- lastRenderedScrollLeft = -1;
- render();
- }
-
- function updateRowCount() {
- if (!initialized) { return; }
-
- var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
- var numberOfRows = dataLengthIncludingAddNew +
- (options.leaveSpaceForNewRows ? numVisibleRows - 1 : 0);
-
- var oldViewportHasVScroll = viewportHasVScroll;
- // with autoHeight, we do not need to accommodate the vertical scroll bar
- viewportHasVScroll = !options.autoHeight && (numberOfRows * options.rowHeight > viewportH);
-
- makeActiveCellNormal();
-
- // remove the rows that are now outside of the data range
- // this helps avoid redundant calls to .removeRow() when the size of the data decreased by thousands of rows
- var l = dataLengthIncludingAddNew - 1;
- for (var i in rowsCache) {
- if (i >= l) {
- removeRowFromCache(i);
- }
- }
-
- if (activeCellNode && activeRow > l) {
- resetActiveCell();
- }
-
- var oldH = h;
- th = Math.max(options.rowHeight * numberOfRows, viewportH - scrollbarDimensions.height);
- if (th < maxSupportedCssHeight) {
- // just one page
- h = ph = th;
- n = 1;
- cj = 0;
- } else {
- // break into pages
- h = maxSupportedCssHeight;
- ph = h / 100;
- n = Math.floor(th / ph);
- cj = (th - h) / (n - 1);
- }
-
- if (h !== oldH) {
- $canvas.css("height", h);
- scrollTop = $viewport[0].scrollTop;
- }
-
- var oldScrollTopInRange = (scrollTop + offset <= th - viewportH);
-
- if (th == 0 || scrollTop == 0) {
- page = offset = 0;
- } else if (oldScrollTopInRange) {
- // maintain virtual position
- scrollTo(scrollTop + offset);
- } else {
- // scroll to bottom
- scrollTo(th - viewportH);
- }
-
- if (h != oldH && options.autoHeight) {
- resizeCanvas();
- }
-
- if (options.forceFitColumns && oldViewportHasVScroll != viewportHasVScroll) {
- autosizeColumns();
- }
- updateCanvasWidth(false);
- }
-
- function getVisibleRange(viewportTop, viewportLeft) {
- if (viewportTop == null) {
- viewportTop = scrollTop;
- }
- if (viewportLeft == null) {
- viewportLeft = scrollLeft;
- }
-
- return {
- top: getRowFromPosition(viewportTop),
- bottom: getRowFromPosition(viewportTop + viewportH) + 1,
- leftPx: viewportLeft,
- rightPx: viewportLeft + viewportW
- };
- }
-
- function getRenderedRange(viewportTop, viewportLeft) {
- var range = getVisibleRange(viewportTop, viewportLeft);
- var buffer = Math.round(viewportH / options.rowHeight);
- var minBuffer = 3;
-
- if (vScrollDir == -1) {
- range.top -= buffer;
- range.bottom += minBuffer;
- } else if (vScrollDir == 1) {
- range.top -= minBuffer;
- range.bottom += buffer;
- } else {
- range.top -= minBuffer;
- range.bottom += minBuffer;
- }
-
- range.top = Math.max(0, range.top);
- range.bottom = Math.min(getDataLengthIncludingAddNew() - 1, range.bottom);
-
- range.leftPx -= viewportW;
- range.rightPx += viewportW;
-
- range.leftPx = Math.max(0, range.leftPx);
- range.rightPx = Math.min(canvasWidth, range.rightPx);
-
- return range;
- }
-
- function ensureCellNodesInRowsCache(row) {
- var cacheEntry = rowsCache[row];
- if (cacheEntry) {
- if (cacheEntry.cellRenderQueue.length) {
- var lastChild = cacheEntry.rowNode.lastChild;
- while (cacheEntry.cellRenderQueue.length) {
- var columnIdx = cacheEntry.cellRenderQueue.pop();
- cacheEntry.cellNodesByColumnIdx[columnIdx] = lastChild;
- lastChild = lastChild.previousSibling;
- }
- }
- }
- }
-
- function cleanUpCells(range, row) {
- var totalCellsRemoved = 0;
- var cacheEntry = rowsCache[row];
-
- // Remove cells outside the range.
- var cellsToRemove = [];
- for (var i in cacheEntry.cellNodesByColumnIdx) {
- // I really hate it when people mess with Array.prototype.
- if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(i)) {
- continue;
- }
-
- // This is a string, so it needs to be cast back to a number.
- i = i | 0;
-
- var colspan = cacheEntry.cellColSpans[i];
- if (columnPosLeft[i] > range.rightPx ||
- columnPosRight[Math.min(columns.length - 1, i + colspan - 1)] < range.leftPx) {
- if (!(row == activeRow && i == activeCell)) {
- cellsToRemove.push(i);
- }
- }
- }
-
- var cellToRemove;
- while ((cellToRemove = cellsToRemove.pop()) != null) {
- cacheEntry.rowNode.removeChild(cacheEntry.cellNodesByColumnIdx[cellToRemove]);
- delete cacheEntry.cellColSpans[cellToRemove];
- delete cacheEntry.cellNodesByColumnIdx[cellToRemove];
- if (postProcessedRows[row]) {
- delete postProcessedRows[row][cellToRemove];
- }
- totalCellsRemoved++;
- }
- }
-
- function cleanUpAndRenderCells(range) {
- var cacheEntry;
- var stringArray = [];
- var processedRows = [];
- var cellsAdded;
- var totalCellsAdded = 0;
- var colspan;
-
- for (var row = range.top, btm = range.bottom; row <= btm; row++) {
- cacheEntry = rowsCache[row];
- if (!cacheEntry) {
- continue;
- }
-
- // cellRenderQueue populated in renderRows() needs to be cleared first
- ensureCellNodesInRowsCache(row);
-
- cleanUpCells(range, row);
-
- // Render missing cells.
- cellsAdded = 0;
-
- var metadata = data.getItemMetadata && data.getItemMetadata(row);
- metadata = metadata && metadata.columns;
-
- var d = getDataItem(row);
-
- // TODO: shorten this loop (index? heuristics? binary search?)
- for (var i = 0, ii = columns.length; i < ii; i++) {
- // Cells to the right are outside the range.
- if (columnPosLeft[i] > range.rightPx) {
- break;
- }
-
- // Already rendered.
- if ((colspan = cacheEntry.cellColSpans[i]) != null) {
- i += (colspan > 1 ? colspan - 1 : 0);
- continue;
- }
-
- colspan = 1;
- if (metadata) {
- var columnData = metadata[columns[i].id] || metadata[i];
- colspan = (columnData && columnData.colspan) || 1;
- if (colspan === "*") {
- colspan = ii - i;
- }
- }
-
- if (columnPosRight[Math.min(ii - 1, i + colspan - 1)] > range.leftPx) {
- appendCellHtml(stringArray, row, i, colspan, d);
- cellsAdded++;
- }
-
- i += (colspan > 1 ? colspan - 1 : 0);
- }
-
- if (cellsAdded) {
- totalCellsAdded += cellsAdded;
- processedRows.push(row);
- }
- }
-
- if (!stringArray.length) {
- return;
- }
-
- var x = document.createElement("div");
- x.innerHTML = stringArray.join("");
-
- var processedRow;
- var node;
- while ((processedRow = processedRows.pop()) != null) {
- cacheEntry = rowsCache[processedRow];
- var columnIdx;
- while ((columnIdx = cacheEntry.cellRenderQueue.pop()) != null) {
- node = x.lastChild;
- cacheEntry.rowNode.appendChild(node);
- cacheEntry.cellNodesByColumnIdx[columnIdx] = node;
- }
- }
- }
-
- function renderRows(range) {
- var parentNode = $canvas[0],
- stringArray = [],
- rows = [],
- needToReselectCell = false,
- dataLength = getDataLength();
-
- for (var i = range.top, ii = range.bottom; i <= ii; i++) {
- if (rowsCache[i]) {
- continue;
- }
- renderedRows++;
- rows.push(i);
-
- // Create an entry right away so that appendRowHtml() can
- // start populatating it.
- rowsCache[i] = {
- "rowNode": null,
-
- // ColSpans of rendered cells (by column idx).
- // Can also be used for checking whether a cell has been rendered.
- "cellColSpans": [],
-
- // Cell nodes (by column idx). Lazy-populated by ensureCellNodesInRowsCache().
- "cellNodesByColumnIdx": [],
-
- // Column indices of cell nodes that have been rendered, but not yet indexed in
- // cellNodesByColumnIdx. These are in the same order as cell nodes added at the
- // end of the row.
- "cellRenderQueue": []
- };
-
- appendRowHtml(stringArray, i, range, dataLength);
- if (activeCellNode && activeRow === i) {
- needToReselectCell = true;
- }
- counter_rows_rendered++;
- }
-
- if (!rows.length) { return; }
-
- var x = document.createElement("div");
- x.innerHTML = stringArray.join("");
-
- for (var i = 0, ii = rows.length; i < ii; i++) {
- rowsCache[rows[i]].rowNode = parentNode.appendChild(x.firstChild);
- }
-
- if (needToReselectCell) {
- activeCellNode = getCellNode(activeRow, activeCell);
- }
- }
-
- function startPostProcessing() {
- if (!options.enableAsyncPostRender) {
- return;
- }
- clearTimeout(h_postrender);
- h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);
- }
-
- function invalidatePostProcessingResults(row) {
- delete postProcessedRows[row];
- postProcessFromRow = Math.min(postProcessFromRow, row);
- postProcessToRow = Math.max(postProcessToRow, row);
- startPostProcessing();
- }
-
- function updateRowPositions() {
- for (var row in rowsCache) {
- rowsCache[row].rowNode.style.top = getRowTop(row) + "px";
- }
- }
-
- function render() {
- if (!initialized) { return; }
- var visible = getVisibleRange();
- var rendered = getRenderedRange();
-
- // remove rows no longer in the viewport
- cleanupRows(rendered);
-
- // add new rows & missing cells in existing rows
- if (lastRenderedScrollLeft != scrollLeft) {
- cleanUpAndRenderCells(rendered);
- }
-
- // render missing rows
- renderRows(rendered);
-
- postProcessFromRow = visible.top;
- postProcessToRow = Math.min(getDataLengthIncludingAddNew() - 1, visible.bottom);
- startPostProcessing();
-
- lastRenderedScrollTop = scrollTop;
- lastRenderedScrollLeft = scrollLeft;
- h_render = null;
- }
-
- function handleHeaderRowScroll() {
- var scrollLeft = $headerRowScroller[0].scrollLeft;
- if (scrollLeft != $viewport[0].scrollLeft) {
- $viewport[0].scrollLeft = scrollLeft;
- }
- }
-
- function handleScroll() {
- scrollTop = $viewport[0].scrollTop;
- scrollLeft = $viewport[0].scrollLeft;
- var vScrollDist = Math.abs(scrollTop - prevScrollTop);
- var hScrollDist = Math.abs(scrollLeft - prevScrollLeft);
-
- if (hScrollDist) {
- prevScrollLeft = scrollLeft;
- $headerScroller[0].scrollLeft = scrollLeft;
- $topPanelScroller[0].scrollLeft = scrollLeft;
- $headerRowScroller[0].scrollLeft = scrollLeft;
- }
-
- if (vScrollDist) {
- vScrollDir = prevScrollTop < scrollTop ? 1 : -1;
- prevScrollTop = scrollTop;
-
- // switch virtual pages if needed
- if (vScrollDist < viewportH) {
- scrollTo(scrollTop + offset);
- } else {
- var oldOffset = offset;
- if (h == viewportH) {
- page = 0;
- } else {
- page = Math.min(n - 1, Math.floor(scrollTop * ((th - viewportH) / (h - viewportH)) * (1 / ph)));
- }
- offset = Math.round(page * cj);
- if (oldOffset != offset) {
- invalidateAllRows();
- }
- }
- }
-
- if (hScrollDist || vScrollDist) {
- if (h_render) {
- clearTimeout(h_render);
- }
-
- if (Math.abs(lastRenderedScrollTop - scrollTop) > 20 ||
- Math.abs(lastRenderedScrollLeft - scrollLeft) > 20) {
- if (options.forceSyncScrolling || (
- Math.abs(lastRenderedScrollTop - scrollTop) < viewportH &&
- Math.abs(lastRenderedScrollLeft - scrollLeft) < viewportW)) {
- render();
- } else {
- h_render = setTimeout(render, 50);
- }
-
- trigger(self.onViewportChanged, {});
- }
- }
-
- trigger(self.onScroll, {scrollLeft: scrollLeft, scrollTop: scrollTop});
- }
-
- function asyncPostProcessRows() {
- var dataLength = getDataLength();
- while (postProcessFromRow <= postProcessToRow) {
- var row = (vScrollDir >= 0) ? postProcessFromRow++ : postProcessToRow--;
- var cacheEntry = rowsCache[row];
- if (!cacheEntry || row >= dataLength) {
- continue;
- }
-
- if (!postProcessedRows[row]) {
- postProcessedRows[row] = {};
- }
-
- ensureCellNodesInRowsCache(row);
- for (var columnIdx in cacheEntry.cellNodesByColumnIdx) {
- if (!cacheEntry.cellNodesByColumnIdx.hasOwnProperty(columnIdx)) {
- continue;
- }
-
- columnIdx = columnIdx | 0;
-
- var m = columns[columnIdx];
- if (m.asyncPostRender && !postProcessedRows[row][columnIdx]) {
- var node = cacheEntry.cellNodesByColumnIdx[columnIdx];
- if (node) {
- m.asyncPostRender(node, row, getDataItem(row), m);
- }
- postProcessedRows[row][columnIdx] = true;
- }
- }
-
- h_postrender = setTimeout(asyncPostProcessRows, options.asyncPostRenderDelay);
- return;
- }
- }
-
- function updateCellCssStylesOnRenderedRows(addedHash, removedHash) {
- var node, columnId, addedRowHash, removedRowHash;
- for (var row in rowsCache) {
- removedRowHash = removedHash && removedHash[row];
- addedRowHash = addedHash && addedHash[row];
-
- if (removedRowHash) {
- for (columnId in removedRowHash) {
- if (!addedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {
- node = getCellNode(row, getColumnIndex(columnId));
- if (node) {
- $(node).removeClass(removedRowHash[columnId]);
- }
- }
- }
- }
-
- if (addedRowHash) {
- for (columnId in addedRowHash) {
- if (!removedRowHash || removedRowHash[columnId] != addedRowHash[columnId]) {
- node = getCellNode(row, getColumnIndex(columnId));
- if (node) {
- $(node).addClass(addedRowHash[columnId]);
- }
- }
- }
- }
- }
- }
-
- function addCellCssStyles(key, hash) {
- if (cellCssClasses[key]) {
- throw "addCellCssStyles: cell CSS hash with key '" + key + "' already exists.";
- }
-
- cellCssClasses[key] = hash;
- updateCellCssStylesOnRenderedRows(hash, null);
-
- trigger(self.onCellCssStylesChanged, { "key": key, "hash": hash });
- }
-
- function removeCellCssStyles(key) {
- if (!cellCssClasses[key]) {
- return;
- }
-
- updateCellCssStylesOnRenderedRows(null, cellCssClasses[key]);
- delete cellCssClasses[key];
-
- trigger(self.onCellCssStylesChanged, { "key": key, "hash": null });
- }
-
- function setCellCssStyles(key, hash) {
- var prevHash = cellCssClasses[key];
-
- cellCssClasses[key] = hash;
- updateCellCssStylesOnRenderedRows(hash, prevHash);
-
- trigger(self.onCellCssStylesChanged, { "key": key, "hash": hash });
- }
-
- function getCellCssStyles(key) {
- return cellCssClasses[key];
- }
-
- function flashCell(row, cell, speed) {
- speed = speed || 100;
- if (rowsCache[row]) {
- var $cell = $(getCellNode(row, cell));
-
- function toggleCellClass(times) {
- if (!times) {
- return;
- }
- setTimeout(function () {
- $cell.queue(function () {
- $cell.toggleClass(options.cellFlashingCssClass).dequeue();
- toggleCellClass(times - 1);
- });
- },
- speed);
- }
-
- toggleCellClass(4);
- }
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Interactivity
-
- function handleMouseWheel(e) {
- var rowNode = $(e.target).closest(".slick-row")[0];
- if (rowNode != rowNodeFromLastMouseWheelEvent) {
- if (zombieRowNodeFromLastMouseWheelEvent && zombieRowNodeFromLastMouseWheelEvent != rowNode) {
- $canvas[0].removeChild(zombieRowNodeFromLastMouseWheelEvent);
- zombieRowNodeFromLastMouseWheelEvent = null;
- }
- rowNodeFromLastMouseWheelEvent = rowNode;
- }
- }
-
- function handleDragInit(e, dd) {
- var cell = getCellFromEvent(e);
- if (!cell || !cellExists(cell.row, cell.cell)) {
- return false;
- }
-
- var retval = trigger(self.onDragInit, dd, e);
- if (e.isImmediatePropagationStopped()) {
- return retval;
- }
-
- // if nobody claims to be handling drag'n'drop by stopping immediate propagation,
- // cancel out of it
- return false;
- }
-
- function handleDragStart(e, dd) {
- var cell = getCellFromEvent(e);
- if (!cell || !cellExists(cell.row, cell.cell)) {
- return false;
- }
-
- var retval = trigger(self.onDragStart, dd, e);
- if (e.isImmediatePropagationStopped()) {
- return retval;
- }
-
- return false;
- }
-
- function handleDrag(e, dd) {
- return trigger(self.onDrag, dd, e);
- }
-
- function handleDragEnd(e, dd) {
- trigger(self.onDragEnd, dd, e);
- }
-
- function handleKeyDown(e) {
- trigger(self.onKeyDown, {row: activeRow, cell: activeCell}, e);
- var handled = e.isImmediatePropagationStopped();
-
- if (!handled) {
- if (!e.shiftKey && !e.altKey && !e.ctrlKey) {
- if (e.which == 27) {
- if (!getEditorLock().isActive()) {
- return; // no editing mode to cancel, allow bubbling and default processing (exit without cancelling the event)
- }
- cancelEditAndSetFocus();
- } else if (e.which == 34) {
- navigatePageDown();
- handled = true;
- } else if (e.which == 33) {
- navigatePageUp();
- handled = true;
- } else if (e.which == 37) {
- handled = navigateLeft();
- } else if (e.which == 39) {
- handled = navigateRight();
- } else if (e.which == 38) {
- handled = navigateUp();
- } else if (e.which == 40) {
- handled = navigateDown();
- } else if (e.which == 9) {
- handled = navigateNext();
- } else if (e.which == 13) {
- if (options.editable) {
- if (currentEditor) {
- // adding new row
- if (activeRow === getDataLength()) {
- navigateDown();
- } else {
- commitEditAndSetFocus();
- }
- } else {
- if (getEditorLock().commitCurrentEdit()) {
- makeActiveCellEditable();
- }
- }
- }
- handled = true;
- }
- } else if (e.which == 9 && e.shiftKey && !e.ctrlKey && !e.altKey) {
- handled = navigatePrev();
- }
- }
-
- if (handled) {
- // the event has been handled so don't let parent element (bubbling/propagation) or browser (default) handle it
- e.stopPropagation();
- e.preventDefault();
- try {
- e.originalEvent.keyCode = 0; // prevent default behaviour for special keys in IE browsers (F3, F5, etc.)
- }
- // ignore exceptions - setting the original event's keycode throws access denied exception for "Ctrl"
- // (hitting control key only, nothing else), "Shift" (maybe others)
- catch (error) {
- }
- }
- }
-
- function handleClick(e) {
- if (!currentEditor) {
- // if this click resulted in some cell child node getting focus,
- // don't steal it back - keyboard events will still bubble up
- // IE9+ seems to default DIVs to tabIndex=0 instead of -1, so check for cell clicks directly.
- if (e.target != document.activeElement || $(e.target).hasClass("slick-cell")) {
- setFocus();
- }
- }
-
- var cell = getCellFromEvent(e);
- if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {
- return;
- }
-
- trigger(self.onClick, {row: cell.row, cell: cell.cell}, e);
- if (e.isImmediatePropagationStopped()) {
- return;
- }
-
- if ((activeCell != cell.cell || activeRow != cell.row) && canCellBeActive(cell.row, cell.cell)) {
- if (!getEditorLock().isActive() || getEditorLock().commitCurrentEdit()) {
- scrollRowIntoView(cell.row, false);
- setActiveCellInternal(getCellNode(cell.row, cell.cell));
- }
- }
- }
-
- function handleContextMenu(e) {
- var $cell = $(e.target).closest(".slick-cell", $canvas);
- if ($cell.length === 0) {
- return;
- }
-
- // are we editing this cell?
- if (activeCellNode === $cell[0] && currentEditor !== null) {
- return;
- }
-
- trigger(self.onContextMenu, {}, e);
- }
-
- function handleDblClick(e) {
- var cell = getCellFromEvent(e);
- if (!cell || (currentEditor !== null && activeRow == cell.row && activeCell == cell.cell)) {
- return;
- }
-
- trigger(self.onDblClick, {row: cell.row, cell: cell.cell}, e);
- if (e.isImmediatePropagationStopped()) {
- return;
- }
-
- if (options.editable) {
- gotoCell(cell.row, cell.cell, true);
- }
- }
-
- function handleHeaderMouseEnter(e) {
- trigger(self.onHeaderMouseEnter, {
- "column": $(this).data("column")
- }, e);
- }
-
- function handleHeaderMouseLeave(e) {
- trigger(self.onHeaderMouseLeave, {
- "column": $(this).data("column")
- }, e);
- }
-
- function handleHeaderContextMenu(e) {
- var $header = $(e.target).closest(".slick-header-column", ".slick-header-columns");
- var column = $header && $header.data("column");
- trigger(self.onHeaderContextMenu, {column: column}, e);
- }
-
- function handleHeaderClick(e) {
- var $header = $(e.target).closest(".slick-header-column", ".slick-header-columns");
- var column = $header && $header.data("column");
- if (column) {
- trigger(self.onHeaderClick, {column: column}, e);
- }
- }
-
- function handleMouseEnter(e) {
- trigger(self.onMouseEnter, {}, e);
- }
-
- function handleMouseLeave(e) {
- trigger(self.onMouseLeave, {}, e);
- }
-
- function cellExists(row, cell) {
- return !(row < 0 || row >= getDataLength() || cell < 0 || cell >= columns.length);
- }
-
- function getCellFromPoint(x, y) {
- var row = getRowFromPosition(y);
- var cell = 0;
-
- var w = 0;
- for (var i = 0; i < columns.length && w < x; i++) {
- w += columns[i].width;
- cell++;
- }
-
- if (cell < 0) {
- cell = 0;
- }
-
- return {row: row, cell: cell - 1};
- }
-
- function getCellFromNode(cellNode) {
- // read column number from .l
CSS class
- var cls = /l\d+/.exec(cellNode.className);
- if (!cls) {
- throw "getCellFromNode: cannot get cell - " + cellNode.className;
- }
- return parseInt(cls[0].substr(1, cls[0].length - 1), 10);
- }
-
- function getRowFromNode(rowNode) {
- for (var row in rowsCache) {
- if (rowsCache[row].rowNode === rowNode) {
- return row | 0;
- }
- }
-
- return null;
- }
-
- function getCellFromEvent(e) {
- var $cell = $(e.target).closest(".slick-cell", $canvas);
- if (!$cell.length) {
- return null;
- }
-
- var row = getRowFromNode($cell[0].parentNode);
- var cell = getCellFromNode($cell[0]);
-
- if (row == null || cell == null) {
- return null;
- } else {
- return {
- "row": row,
- "cell": cell
- };
- }
- }
-
- function getCellNodeBox(row, cell) {
- if (!cellExists(row, cell)) {
- return null;
- }
-
- var y1 = getRowTop(row);
- var y2 = y1 + options.rowHeight - 1;
- var x1 = 0;
- for (var i = 0; i < cell; i++) {
- x1 += columns[i].width;
- }
- var x2 = x1 + columns[cell].width;
-
- return {
- top: y1,
- left: x1,
- bottom: y2,
- right: x2
- };
- }
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Cell switching
-
- function resetActiveCell() {
- setActiveCellInternal(null, false);
- }
-
- function setFocus() {
- if (tabbingDirection == -1) {
- $focusSink[0].focus();
- } else {
- $focusSink2[0].focus();
- }
- }
-
- function scrollCellIntoView(row, cell, doPaging) {
- scrollRowIntoView(row, doPaging);
-
- var colspan = getColspan(row, cell);
- var left = columnPosLeft[cell],
- right = columnPosRight[cell + (colspan > 1 ? colspan - 1 : 0)],
- scrollRight = scrollLeft + viewportW;
-
- if (left < scrollLeft) {
- $viewport.scrollLeft(left);
- handleScroll();
- render();
- } else if (right > scrollRight) {
- $viewport.scrollLeft(Math.min(left, right - $viewport[0].clientWidth));
- handleScroll();
- render();
- }
- }
-
- function setActiveCellInternal(newCell, opt_editMode) {
- if (activeCellNode !== null) {
- makeActiveCellNormal();
- $(activeCellNode).removeClass("active");
- if (rowsCache[activeRow]) {
- $(rowsCache[activeRow].rowNode).removeClass("active");
- }
- }
-
- var activeCellChanged = (activeCellNode !== newCell);
- activeCellNode = newCell;
-
- if (activeCellNode != null) {
- activeRow = getRowFromNode(activeCellNode.parentNode);
- activeCell = activePosX = getCellFromNode(activeCellNode);
-
- if (opt_editMode == null) {
- opt_editMode = (activeRow == getDataLength()) || options.autoEdit;
- }
-
- $(activeCellNode).addClass("active");
- $(rowsCache[activeRow].rowNode).addClass("active");
-
- if (options.editable && opt_editMode && isCellPotentiallyEditable(activeRow, activeCell)) {
- clearTimeout(h_editorLoader);
-
- if (options.asyncEditorLoading) {
- h_editorLoader = setTimeout(function () {
- makeActiveCellEditable();
- }, options.asyncEditorLoadDelay);
- } else {
- makeActiveCellEditable();
- }
- }
- } else {
- activeRow = activeCell = null;
- }
-
- if (activeCellChanged) {
- trigger(self.onActiveCellChanged, getActiveCell());
- }
- }
-
- function clearTextSelection() {
- if (document.selection && document.selection.empty) {
- try {
- //IE fails here if selected element is not in dom
- document.selection.empty();
- } catch (e) { }
- } else if (window.getSelection) {
- var sel = window.getSelection();
- if (sel && sel.removeAllRanges) {
- sel.removeAllRanges();
- }
- }
- }
-
- function isCellPotentiallyEditable(row, cell) {
- var dataLength = getDataLength();
- // is the data for this row loaded?
- if (row < dataLength && !getDataItem(row)) {
- return false;
- }
-
- // are we in the Add New row? can we create new from this cell?
- if (columns[cell].cannotTriggerInsert && row >= dataLength) {
- return false;
- }
-
- // does this cell have an editor?
- if (!getEditor(row, cell)) {
- return false;
- }
-
- return true;
- }
-
- function makeActiveCellNormal() {
- if (!currentEditor) {
- return;
- }
- trigger(self.onBeforeCellEditorDestroy, {editor: currentEditor});
- currentEditor.destroy();
- currentEditor = null;
-
- if (activeCellNode) {
- var d = getDataItem(activeRow);
- $(activeCellNode).removeClass("editable invalid");
- if (d) {
- var column = columns[activeCell];
- var formatter = getFormatter(activeRow, column);
- activeCellNode.innerHTML = formatter(activeRow, activeCell, getDataItemValueForColumn(d, column), column, d);
- invalidatePostProcessingResults(activeRow);
- }
- }
-
- // if there previously was text selected on a page (such as selected text in the edit cell just removed),
- // IE can't set focus to anything else correctly
- if (navigator.userAgent.toLowerCase().match(/msie/)) {
- clearTextSelection();
- }
-
- getEditorLock().deactivate(editController);
- }
-
- function makeActiveCellEditable(editor) {
- if (!activeCellNode) {
- return;
- }
- if (!options.editable) {
- throw "Grid : makeActiveCellEditable : should never get called when options.editable is false";
- }
-
- // cancel pending async call if there is one
- clearTimeout(h_editorLoader);
-
- if (!isCellPotentiallyEditable(activeRow, activeCell)) {
- return;
- }
-
- var columnDef = columns[activeCell];
- var item = getDataItem(activeRow);
-
- if (trigger(self.onBeforeEditCell, {row: activeRow, cell: activeCell, item: item, column: columnDef}) === false) {
- setFocus();
- return;
- }
-
- getEditorLock().activate(editController);
- $(activeCellNode).addClass("editable");
-
- // don't clear the cell if a custom editor is passed through
- if (!editor) {
- activeCellNode.innerHTML = "";
- }
-
- currentEditor = new (editor || getEditor(activeRow, activeCell))({
- grid: self,
- gridPosition: absBox($container[0]),
- position: absBox(activeCellNode),
- container: activeCellNode,
- column: columnDef,
- item: item || {},
- commitChanges: commitEditAndSetFocus,
- cancelChanges: cancelEditAndSetFocus
- });
-
- if (item) {
- currentEditor.loadValue(item);
- }
-
- serializedEditorValue = currentEditor.serializeValue();
-
- if (currentEditor.position) {
- handleActiveCellPositionChange();
- }
- }
-
- function commitEditAndSetFocus() {
- // if the commit fails, it would do so due to a validation error
- // if so, do not steal the focus from the editor
- if (getEditorLock().commitCurrentEdit()) {
- setFocus();
- if (options.autoEdit) {
- navigateDown();
- }
- }
- }
-
- function cancelEditAndSetFocus() {
- if (getEditorLock().cancelCurrentEdit()) {
- setFocus();
- }
- }
-
- function absBox(elem) {
- var box = {
- top: elem.offsetTop,
- left: elem.offsetLeft,
- bottom: 0,
- right: 0,
- width: $(elem).outerWidth(),
- height: $(elem).outerHeight(),
- visible: true};
- box.bottom = box.top + box.height;
- box.right = box.left + box.width;
-
- // walk up the tree
- var offsetParent = elem.offsetParent;
- while ((elem = elem.parentNode) != document.body) {
- if (box.visible && elem.scrollHeight != elem.offsetHeight && $(elem).css("overflowY") != "visible") {
- box.visible = box.bottom > elem.scrollTop && box.top < elem.scrollTop + elem.clientHeight;
- }
-
- if (box.visible && elem.scrollWidth != elem.offsetWidth && $(elem).css("overflowX") != "visible") {
- box.visible = box.right > elem.scrollLeft && box.left < elem.scrollLeft + elem.clientWidth;
- }
-
- box.left -= elem.scrollLeft;
- box.top -= elem.scrollTop;
-
- if (elem === offsetParent) {
- box.left += elem.offsetLeft;
- box.top += elem.offsetTop;
- offsetParent = elem.offsetParent;
- }
-
- box.bottom = box.top + box.height;
- box.right = box.left + box.width;
- }
-
- return box;
- }
-
- function getActiveCellPosition() {
- return absBox(activeCellNode);
- }
-
- function getGridPosition() {
- return absBox($container[0])
- }
-
- function handleActiveCellPositionChange() {
- if (!activeCellNode) {
- return;
- }
-
- trigger(self.onActiveCellPositionChanged, {});
-
- if (currentEditor) {
- var cellBox = getActiveCellPosition();
- if (currentEditor.show && currentEditor.hide) {
- if (!cellBox.visible) {
- currentEditor.hide();
- } else {
- currentEditor.show();
- }
- }
-
- if (currentEditor.position) {
- currentEditor.position(cellBox);
- }
- }
- }
-
- function getCellEditor() {
- return currentEditor;
- }
-
- function getActiveCell() {
- if (!activeCellNode) {
- return null;
- } else {
- return {row: activeRow, cell: activeCell};
- }
- }
-
- function getActiveCellNode() {
- return activeCellNode;
- }
-
- function scrollRowIntoView(row, doPaging) {
- var rowAtTop = row * options.rowHeight;
- var rowAtBottom = (row + 1) * options.rowHeight - viewportH + (viewportHasHScroll ? scrollbarDimensions.height : 0);
-
- // need to page down?
- if ((row + 1) * options.rowHeight > scrollTop + viewportH + offset) {
- scrollTo(doPaging ? rowAtTop : rowAtBottom);
- render();
- }
- // or page up?
- else if (row * options.rowHeight < scrollTop + offset) {
- scrollTo(doPaging ? rowAtBottom : rowAtTop);
- render();
- }
- }
-
- function scrollRowToTop(row) {
- scrollTo(row * options.rowHeight);
- render();
- }
-
- function scrollPage(dir) {
- var deltaRows = dir * numVisibleRows;
- scrollTo((getRowFromPosition(scrollTop) + deltaRows) * options.rowHeight);
- render();
-
- if (options.enableCellNavigation && activeRow != null) {
- var row = activeRow + deltaRows;
- var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
- if (row >= dataLengthIncludingAddNew) {
- row = dataLengthIncludingAddNew - 1;
- }
- if (row < 0) {
- row = 0;
- }
-
- var cell = 0, prevCell = null;
- var prevActivePosX = activePosX;
- while (cell <= activePosX) {
- if (canCellBeActive(row, cell)) {
- prevCell = cell;
- }
- cell += getColspan(row, cell);
- }
-
- if (prevCell !== null) {
- setActiveCellInternal(getCellNode(row, prevCell));
- activePosX = prevActivePosX;
- } else {
- resetActiveCell();
- }
- }
- }
-
- function navigatePageDown() {
- scrollPage(1);
- }
-
- function navigatePageUp() {
- scrollPage(-1);
- }
-
- function getColspan(row, cell) {
- var metadata = data.getItemMetadata && data.getItemMetadata(row);
- if (!metadata || !metadata.columns) {
- return 1;
- }
-
- var columnData = metadata.columns[columns[cell].id] || metadata.columns[cell];
- var colspan = (columnData && columnData.colspan);
- if (colspan === "*") {
- colspan = columns.length - cell;
- } else {
- colspan = colspan || 1;
- }
-
- return colspan;
- }
-
- function findFirstFocusableCell(row) {
- var cell = 0;
- while (cell < columns.length) {
- if (canCellBeActive(row, cell)) {
- return cell;
- }
- cell += getColspan(row, cell);
- }
- return null;
- }
-
- function findLastFocusableCell(row) {
- var cell = 0;
- var lastFocusableCell = null;
- while (cell < columns.length) {
- if (canCellBeActive(row, cell)) {
- lastFocusableCell = cell;
- }
- cell += getColspan(row, cell);
- }
- return lastFocusableCell;
- }
-
- function gotoRight(row, cell, posX) {
- if (cell >= columns.length) {
- return null;
- }
-
- do {
- cell += getColspan(row, cell);
- }
- while (cell < columns.length && !canCellBeActive(row, cell));
-
- if (cell < columns.length) {
- return {
- "row": row,
- "cell": cell,
- "posX": cell
- };
- }
- return null;
- }
-
- function gotoLeft(row, cell, posX) {
- if (cell <= 0) {
- return null;
- }
-
- var firstFocusableCell = findFirstFocusableCell(row);
- if (firstFocusableCell === null || firstFocusableCell >= cell) {
- return null;
- }
-
- var prev = {
- "row": row,
- "cell": firstFocusableCell,
- "posX": firstFocusableCell
- };
- var pos;
- while (true) {
- pos = gotoRight(prev.row, prev.cell, prev.posX);
- if (!pos) {
- return null;
- }
- if (pos.cell >= cell) {
- return prev;
- }
- prev = pos;
- }
- }
-
- function gotoDown(row, cell, posX) {
- var prevCell;
- var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
- while (true) {
- if (++row >= dataLengthIncludingAddNew) {
- return null;
- }
-
- prevCell = cell = 0;
- while (cell <= posX) {
- prevCell = cell;
- cell += getColspan(row, cell);
- }
-
- if (canCellBeActive(row, prevCell)) {
- return {
- "row": row,
- "cell": prevCell,
- "posX": posX
- };
- }
- }
- }
-
- function gotoUp(row, cell, posX) {
- var prevCell;
- while (true) {
- if (--row < 0) {
- return null;
- }
-
- prevCell = cell = 0;
- while (cell <= posX) {
- prevCell = cell;
- cell += getColspan(row, cell);
- }
-
- if (canCellBeActive(row, prevCell)) {
- return {
- "row": row,
- "cell": prevCell,
- "posX": posX
- };
- }
- }
- }
-
- function gotoNext(row, cell, posX) {
- if (row == null && cell == null) {
- row = cell = posX = 0;
- if (canCellBeActive(row, cell)) {
- return {
- "row": row,
- "cell": cell,
- "posX": cell
- };
- }
- }
-
- var pos = gotoRight(row, cell, posX);
- if (pos) {
- return pos;
- }
-
- var firstFocusableCell = null;
- var dataLengthIncludingAddNew = getDataLengthIncludingAddNew();
- while (++row < dataLengthIncludingAddNew) {
- firstFocusableCell = findFirstFocusableCell(row);
- if (firstFocusableCell !== null) {
- return {
- "row": row,
- "cell": firstFocusableCell,
- "posX": firstFocusableCell
- };
- }
- }
- return null;
- }
-
- function gotoPrev(row, cell, posX) {
- if (row == null && cell == null) {
- row = getDataLengthIncludingAddNew() - 1;
- cell = posX = columns.length - 1;
- if (canCellBeActive(row, cell)) {
- return {
- "row": row,
- "cell": cell,
- "posX": cell
- };
- }
- }
-
- var pos;
- var lastSelectableCell;
- while (!pos) {
- pos = gotoLeft(row, cell, posX);
- if (pos) {
- break;
- }
- if (--row < 0) {
- return null;
- }
-
- cell = 0;
- lastSelectableCell = findLastFocusableCell(row);
- if (lastSelectableCell !== null) {
- pos = {
- "row": row,
- "cell": lastSelectableCell,
- "posX": lastSelectableCell
- };
- }
- }
- return pos;
- }
-
- function navigateRight() {
- return navigate("right");
- }
-
- function navigateLeft() {
- return navigate("left");
- }
-
- function navigateDown() {
- return navigate("down");
- }
-
- function navigateUp() {
- return navigate("up");
- }
-
- function navigateNext() {
- return navigate("next");
- }
-
- function navigatePrev() {
- return navigate("prev");
- }
-
- /**
- * @param {string} dir Navigation direction.
- * @return {boolean} Whether navigation resulted in a change of active cell.
- */
- function navigate(dir) {
- if (!options.enableCellNavigation) {
- return false;
- }
-
- if (!activeCellNode && dir != "prev" && dir != "next") {
- return false;
- }
-
- if (!getEditorLock().commitCurrentEdit()) {
- return true;
- }
- setFocus();
-
- var tabbingDirections = {
- "up": -1,
- "down": 1,
- "left": -1,
- "right": 1,
- "prev": -1,
- "next": 1
- };
- tabbingDirection = tabbingDirections[dir];
-
- var stepFunctions = {
- "up": gotoUp,
- "down": gotoDown,
- "left": gotoLeft,
- "right": gotoRight,
- "prev": gotoPrev,
- "next": gotoNext
- };
- var stepFn = stepFunctions[dir];
- var pos = stepFn(activeRow, activeCell, activePosX);
- if (pos) {
- var isAddNewRow = (pos.row == getDataLength());
- scrollCellIntoView(pos.row, pos.cell, !isAddNewRow);
- setActiveCellInternal(getCellNode(pos.row, pos.cell));
- activePosX = pos.posX;
- return true;
- } else {
- setActiveCellInternal(getCellNode(activeRow, activeCell));
- return false;
- }
- }
-
- function getCellNode(row, cell) {
- if (rowsCache[row]) {
- ensureCellNodesInRowsCache(row);
- return rowsCache[row].cellNodesByColumnIdx[cell];
- }
- return null;
- }
-
- function setActiveCell(row, cell) {
- if (!initialized) { return; }
- if (row > getDataLength() || row < 0 || cell >= columns.length || cell < 0) {
- return;
- }
-
- if (!options.enableCellNavigation) {
- return;
- }
-
- scrollCellIntoView(row, cell, false);
- setActiveCellInternal(getCellNode(row, cell), false);
- }
-
- function canCellBeActive(row, cell) {
- if (!options.enableCellNavigation || row >= getDataLengthIncludingAddNew() ||
- row < 0 || cell >= columns.length || cell < 0) {
- return false;
- }
-
- var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
- if (rowMetadata && typeof rowMetadata.focusable === "boolean") {
- return rowMetadata.focusable;
- }
-
- var columnMetadata = rowMetadata && rowMetadata.columns;
- if (columnMetadata && columnMetadata[columns[cell].id] && typeof columnMetadata[columns[cell].id].focusable === "boolean") {
- return columnMetadata[columns[cell].id].focusable;
- }
- if (columnMetadata && columnMetadata[cell] && typeof columnMetadata[cell].focusable === "boolean") {
- return columnMetadata[cell].focusable;
- }
-
- return columns[cell].focusable;
- }
-
- function canCellBeSelected(row, cell) {
- if (row >= getDataLength() || row < 0 || cell >= columns.length || cell < 0) {
- return false;
- }
-
- var rowMetadata = data.getItemMetadata && data.getItemMetadata(row);
- if (rowMetadata && typeof rowMetadata.selectable === "boolean") {
- return rowMetadata.selectable;
- }
-
- var columnMetadata = rowMetadata && rowMetadata.columns && (rowMetadata.columns[columns[cell].id] || rowMetadata.columns[cell]);
- if (columnMetadata && typeof columnMetadata.selectable === "boolean") {
- return columnMetadata.selectable;
- }
-
- return columns[cell].selectable;
- }
-
- function gotoCell(row, cell, forceEdit) {
- if (!initialized) { return; }
- if (!canCellBeActive(row, cell)) {
- return;
- }
-
- if (!getEditorLock().commitCurrentEdit()) {
- return;
- }
-
- scrollCellIntoView(row, cell, false);
-
- var newCell = getCellNode(row, cell);
-
- // if selecting the 'add new' row, start editing right away
- setActiveCellInternal(newCell, forceEdit || (row === getDataLength()) || options.autoEdit);
-
- // if no editor was created, set the focus back on the grid
- if (!currentEditor) {
- setFocus();
- }
- }
-
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // IEditor implementation for the editor lock
-
- function commitCurrentEdit() {
- var item = getDataItem(activeRow);
- var column = columns[activeCell];
-
- if (currentEditor) {
- if (currentEditor.isValueChanged()) {
- var validationResults = currentEditor.validate();
-
- if (validationResults.valid) {
- if (activeRow < getDataLength()) {
- var editCommand = {
- row: activeRow,
- cell: activeCell,
- editor: currentEditor,
- serializedValue: currentEditor.serializeValue(),
- prevSerializedValue: serializedEditorValue,
- execute: function () {
- this.editor.applyValue(item, this.serializedValue);
- updateRow(this.row);
- trigger(self.onCellChange, {
- row: activeRow,
- cell: activeCell,
- item: item
- });
- },
- undo: function () {
- this.editor.applyValue(item, this.prevSerializedValue);
- updateRow(this.row);
- trigger(self.onCellChange, {
- row: activeRow,
- cell: activeCell,
- item: item
- });
- }
- };
-
- if (options.editCommandHandler) {
- makeActiveCellNormal();
- options.editCommandHandler(item, column, editCommand);
- } else {
- editCommand.execute();
- makeActiveCellNormal();
- }
-
- } else {
- var newItem = {};
- currentEditor.applyValue(newItem, currentEditor.serializeValue());
- makeActiveCellNormal();
- trigger(self.onAddNewRow, {item: newItem, column: column});
- }
-
- // check whether the lock has been re-acquired by event handlers
- return !getEditorLock().isActive();
- } else {
- // Re-add the CSS class to trigger transitions, if any.
- $(activeCellNode).removeClass("invalid");
- $(activeCellNode).width(); // force layout
- $(activeCellNode).addClass("invalid");
-
- trigger(self.onValidationError, {
- editor: currentEditor,
- cellNode: activeCellNode,
- validationResults: validationResults,
- row: activeRow,
- cell: activeCell,
- column: column
- });
-
- currentEditor.focus();
- return false;
- }
- }
-
- makeActiveCellNormal();
- }
- return true;
- }
-
- function cancelCurrentEdit() {
- makeActiveCellNormal();
- return true;
- }
-
- function rowsToRanges(rows) {
- var ranges = [];
- var lastCell = columns.length - 1;
- for (var i = 0; i < rows.length; i++) {
- ranges.push(new Slick.Range(rows[i], 0, rows[i], lastCell));
- }
- return ranges;
- }
-
- function getSelectedRows() {
- if (!selectionModel) {
- throw "Selection model is not set";
- }
- return selectedRows;
- }
-
- function setSelectedRows(rows) {
- if (!selectionModel) {
- throw "Selection model is not set";
- }
- selectionModel.setSelectedRanges(rowsToRanges(rows));
- }
-
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Debug
-
- this.debug = function () {
- var s = "";
-
- s += ("\n" + "counter_rows_rendered: " + counter_rows_rendered);
- s += ("\n" + "counter_rows_removed: " + counter_rows_removed);
- s += ("\n" + "renderedRows: " + renderedRows);
- s += ("\n" + "numVisibleRows: " + numVisibleRows);
- s += ("\n" + "maxSupportedCssHeight: " + maxSupportedCssHeight);
- s += ("\n" + "n(umber of pages): " + n);
- s += ("\n" + "(current) page: " + page);
- s += ("\n" + "page height (ph): " + ph);
- s += ("\n" + "vScrollDir: " + vScrollDir);
-
- alert(s);
- };
-
- // a debug helper to be able to access private members
- this.eval = function (expr) {
- return eval(expr);
- };
-
- //////////////////////////////////////////////////////////////////////////////////////////////
- // Public API
-
- $.extend(this, {
- "slickGridVersion": "2.1",
-
- // Events
- "onScroll": new Slick.Event(),
- "onSort": new Slick.Event(),
- "onHeaderMouseEnter": new Slick.Event(),
- "onHeaderMouseLeave": new Slick.Event(),
- "onHeaderContextMenu": new Slick.Event(),
- "onHeaderClick": new Slick.Event(),
- "onHeaderCellRendered": new Slick.Event(),
- "onBeforeHeaderCellDestroy": new Slick.Event(),
- "onHeaderRowCellRendered": new Slick.Event(),
- "onBeforeHeaderRowCellDestroy": new Slick.Event(),
- "onMouseEnter": new Slick.Event(),
- "onMouseLeave": new Slick.Event(),
- "onClick": new Slick.Event(),
- "onDblClick": new Slick.Event(),
- "onContextMenu": new Slick.Event(),
- "onKeyDown": new Slick.Event(),
- "onAddNewRow": new Slick.Event(),
- "onValidationError": new Slick.Event(),
- "onViewportChanged": new Slick.Event(),
- "onColumnsReordered": new Slick.Event(),
- "onColumnsResized": new Slick.Event(),
- "onCellChange": new Slick.Event(),
- "onBeforeEditCell": new Slick.Event(),
- "onBeforeCellEditorDestroy": new Slick.Event(),
- "onBeforeDestroy": new Slick.Event(),
- "onActiveCellChanged": new Slick.Event(),
- "onActiveCellPositionChanged": new Slick.Event(),
- "onDragInit": new Slick.Event(),
- "onDragStart": new Slick.Event(),
- "onDrag": new Slick.Event(),
- "onDragEnd": new Slick.Event(),
- "onSelectedRowsChanged": new Slick.Event(),
- "onCellCssStylesChanged": new Slick.Event(),
-
- // Methods
- "registerPlugin": registerPlugin,
- "unregisterPlugin": unregisterPlugin,
- "getColumns": getColumns,
- "setColumns": setColumns,
- "getColumnIndex": getColumnIndex,
- "updateColumnHeader": updateColumnHeader,
- "setSortColumn": setSortColumn,
- "setSortColumns": setSortColumns,
- "getSortColumns": getSortColumns,
- "autosizeColumns": autosizeColumns,
- "getOptions": getOptions,
- "setOptions": setOptions,
- "getData": getData,
- "getDataLength": getDataLength,
- "getDataItem": getDataItem,
- "setData": setData,
- "getSelectionModel": getSelectionModel,
- "setSelectionModel": setSelectionModel,
- "getSelectedRows": getSelectedRows,
- "setSelectedRows": setSelectedRows,
- "getContainerNode": getContainerNode,
-
- "render": render,
- "invalidate": invalidate,
- "invalidateRow": invalidateRow,
- "invalidateRows": invalidateRows,
- "invalidateAllRows": invalidateAllRows,
- "updateCell": updateCell,
- "updateRow": updateRow,
- "getViewport": getVisibleRange,
- "getRenderedRange": getRenderedRange,
- "resizeCanvas": resizeCanvas,
- "updateRowCount": updateRowCount,
- "scrollRowIntoView": scrollRowIntoView,
- "scrollRowToTop": scrollRowToTop,
- "scrollCellIntoView": scrollCellIntoView,
- "getCanvasNode": getCanvasNode,
- "focus": setFocus,
-
- "getCellFromPoint": getCellFromPoint,
- "getCellFromEvent": getCellFromEvent,
- "getActiveCell": getActiveCell,
- "setActiveCell": setActiveCell,
- "getActiveCellNode": getActiveCellNode,
- "getActiveCellPosition": getActiveCellPosition,
- "resetActiveCell": resetActiveCell,
- "editActiveCell": makeActiveCellEditable,
- "getCellEditor": getCellEditor,
- "getCellNode": getCellNode,
- "getCellNodeBox": getCellNodeBox,
- "canCellBeSelected": canCellBeSelected,
- "canCellBeActive": canCellBeActive,
- "navigatePrev": navigatePrev,
- "navigateNext": navigateNext,
- "navigateUp": navigateUp,
- "navigateDown": navigateDown,
- "navigateLeft": navigateLeft,
- "navigateRight": navigateRight,
- "navigatePageUp": navigatePageUp,
- "navigatePageDown": navigatePageDown,
- "gotoCell": gotoCell,
- "getTopPanel": getTopPanel,
- "setTopPanelVisibility": setTopPanelVisibility,
- "setHeaderRowVisibility": setHeaderRowVisibility,
- "getHeaderRow": getHeaderRow,
- "getHeaderRowColumn": getHeaderRowColumn,
- "getGridPosition": getGridPosition,
- "flashCell": flashCell,
- "addCellCssStyles": addCellCssStyles,
- "setCellCssStyles": setCellCssStyles,
- "removeCellCssStyles": removeCellCssStyles,
- "getCellCssStyles": getCellCssStyles,
-
- "init": finishInitialization,
- "destroy": destroy,
-
- // IEditor implementation
- "getEditorLock": getEditorLock,
- "getEditController": getEditController
- });
-
- init();
- }
-}(jQuery));
diff --git a/apps/willrogers/src/main/public/javascripts/slick.groupitemmetadataprovider.js b/apps/willrogers/src/main/public/javascripts/slick.groupitemmetadataprovider.js
deleted file mode 100644
index 18ee1c6..0000000
--- a/apps/willrogers/src/main/public/javascripts/slick.groupitemmetadataprovider.js
+++ /dev/null
@@ -1,158 +0,0 @@
-(function ($) {
- $.extend(true, window, {
- Slick: {
- Data: {
- GroupItemMetadataProvider: GroupItemMetadataProvider
- }
- }
- });
-
-
- /***
- * Provides item metadata for group (Slick.Group) and totals (Slick.Totals) rows produced by the DataView.
- * This metadata overrides the default behavior and formatting of those rows so that they appear and function
- * correctly when processed by the grid.
- *
- * This class also acts as a grid plugin providing event handlers to expand & collapse groups.
- * If "grid.registerPlugin(...)" is not called, expand & collapse will not work.
- *
- * @class GroupItemMetadataProvider
- * @module Data
- * @namespace Slick.Data
- * @constructor
- * @param options
- */
- function GroupItemMetadataProvider(options) {
- var _grid;
- var _defaults = {
- groupCssClass: "slick-group",
- groupTitleCssClass: "slick-group-title",
- totalsCssClass: "slick-group-totals",
- groupFocusable: true,
- totalsFocusable: false,
- toggleCssClass: "slick-group-toggle",
- toggleExpandedCssClass: "expanded",
- toggleCollapsedCssClass: "collapsed",
- enableExpandCollapse: true,
- groupFormatter: defaultGroupCellFormatter,
- totalsFormatter: defaultTotalsCellFormatter
- };
-
- options = $.extend(true, {}, _defaults, options);
-
-
- function defaultGroupCellFormatter(row, cell, value, columnDef, item) {
- if (!options.enableExpandCollapse) {
- return item.title;
- }
-
- var indentation = item.level * 15 + "px";
-
- return "" +
- "" +
- "" +
- item.title +
- "";
- }
-
- function defaultTotalsCellFormatter(row, cell, value, columnDef, item) {
- return (columnDef.groupTotalsFormatter && columnDef.groupTotalsFormatter(item, columnDef)) || "";
- }
-
-
- function init(grid) {
- _grid = grid;
- _grid.onClick.subscribe(handleGridClick);
- _grid.onKeyDown.subscribe(handleGridKeyDown);
-
- }
-
- function destroy() {
- if (_grid) {
- _grid.onClick.unsubscribe(handleGridClick);
- _grid.onKeyDown.unsubscribe(handleGridKeyDown);
- }
- }
-
- function handleGridClick(e, args) {
- var item = this.getDataItem(args.row);
- if (item && item instanceof Slick.Group && $(e.target).hasClass(options.toggleCssClass)) {
- var range = _grid.getRenderedRange();
- this.getData().setRefreshHints({
- ignoreDiffsBefore: range.top,
- ignoreDiffsAfter: range.bottom
- });
-
- if (item.collapsed) {
- this.getData().expandGroup(item.groupingKey);
- } else {
- this.getData().collapseGroup(item.groupingKey);
- }
-
- e.stopImmediatePropagation();
- e.preventDefault();
- }
- }
-
- // TODO: add -/+ handling
- function handleGridKeyDown(e, args) {
- if (options.enableExpandCollapse && (e.which == $.ui.keyCode.SPACE)) {
- var activeCell = this.getActiveCell();
- if (activeCell) {
- var item = this.getDataItem(activeCell.row);
- if (item && item instanceof Slick.Group) {
- var range = _grid.getRenderedRange();
- this.getData().setRefreshHints({
- ignoreDiffsBefore: range.top,
- ignoreDiffsAfter: range.bottom
- });
-
- if (item.collapsed) {
- this.getData().expandGroup(item.groupingKey);
- } else {
- this.getData().collapseGroup(item.groupingKey);
- }
-
- e.stopImmediatePropagation();
- e.preventDefault();
- }
- }
- }
- }
-
- function getGroupRowMetadata(item) {
- return {
- selectable: false,
- focusable: options.groupFocusable,
- cssClasses: options.groupCssClass,
- columns: {
- 0: {
- colspan: "*",
- formatter: options.groupFormatter,
- editor: null
- }
- }
- };
- }
-
- function getTotalsRowMetadata(item) {
- return {
- selectable: false,
- focusable: options.totalsFocusable,
- cssClasses: options.totalsCssClass,
- formatter: options.totalsFormatter,
- editor: null
- };
- }
-
-
- return {
- "init": init,
- "destroy": destroy,
- "getGroupRowMetadata": getGroupRowMetadata,
- "getTotalsRowMetadata": getTotalsRowMetadata
- };
- }
-})(jQuery);
diff --git a/apps/willrogers/src/main/public/javascripts/slick.pager.js b/apps/willrogers/src/main/public/javascripts/slick.pager.js
deleted file mode 100644
index b3242d9..0000000
--- a/apps/willrogers/src/main/public/javascripts/slick.pager.js
+++ /dev/null
@@ -1,154 +0,0 @@
-(function ($) {
- function SlickGridPager(dataView, grid, $container) {
- var $status;
-
- function init() {
- dataView.onPagingInfoChanged.subscribe(function (e, pagingInfo) {
- updatePager(pagingInfo);
- });
-
- constructPagerUI();
- updatePager(dataView.getPagingInfo());
- }
-
- function getNavState() {
- var cannotLeaveEditMode = !Slick.GlobalEditorLock.commitCurrentEdit();
- var pagingInfo = dataView.getPagingInfo();
- var lastPage = pagingInfo.totalPages - 1;
-
- return {
- canGotoFirst: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
- canGotoLast: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum != lastPage,
- canGotoPrev: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum > 0,
- canGotoNext: !cannotLeaveEditMode && pagingInfo.pageSize != 0 && pagingInfo.pageNum < lastPage,
- pagingInfo: pagingInfo
- }
- }
-
- function setPageSize(n) {
- dataView.setRefreshHints({
- isFilterUnchanged: true
- });
- dataView.setPagingOptions({pageSize: n});
- }
-
- function gotoFirst() {
- if (getNavState().canGotoFirst) {
- dataView.setPagingOptions({pageNum: 0});
- }
- }
-
- function gotoLast() {
- var state = getNavState();
- if (state.canGotoLast) {
- dataView.setPagingOptions({pageNum: state.pagingInfo.totalPages - 1});
- }
- }
-
- function gotoPrev() {
- var state = getNavState();
- if (state.canGotoPrev) {
- dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum - 1});
- }
- }
-
- function gotoNext() {
- var state = getNavState();
- if (state.canGotoNext) {
- dataView.setPagingOptions({pageNum: state.pagingInfo.pageNum + 1});
- }
- }
-
- function constructPagerUI() {
- $container.empty();
-
- var $nav = $("").appendTo($container);
- var $settings = $("").appendTo($container);
- $status = $("").appendTo($container);
-
- $settings
- .append("Show: AllAuto2550100");
-
- $settings.find("a[data]").click(function (e) {
- var pagesize = $(e.target).attr("data");
- if (pagesize != undefined) {
- if (pagesize == -1) {
- var vp = grid.getViewport();
- setPageSize(vp.bottom - vp.top);
- } else {
- setPageSize(parseInt(pagesize));
- }
- }
- });
-
- var icon_prefix = "";
-
- $(icon_prefix + "ui-icon-lightbulb" + icon_suffix)
- .click(function () {
- $(".slick-pager-settings-expanded").toggle()
- })
- .appendTo($settings);
-
- $(icon_prefix + "ui-icon-seek-first" + icon_suffix)
- .click(gotoFirst)
- .appendTo($nav);
-
- $(icon_prefix + "ui-icon-seek-prev" + icon_suffix)
- .click(gotoPrev)
- .appendTo($nav);
-
- $(icon_prefix + "ui-icon-seek-next" + icon_suffix)
- .click(gotoNext)
- .appendTo($nav);
-
- $(icon_prefix + "ui-icon-seek-end" + icon_suffix)
- .click(gotoLast)
- .appendTo($nav);
-
- $container.find(".ui-icon-container")
- .hover(function () {
- $(this).toggleClass("ui-state-hover");
- });
-
- $container.children().wrapAll("");
- }
-
-
- function updatePager(pagingInfo) {
- var state = getNavState();
-
- $container.find(".slick-pager-nav span").removeClass("ui-state-disabled");
- if (!state.canGotoFirst) {
- $container.find(".ui-icon-seek-first").addClass("ui-state-disabled");
- }
- if (!state.canGotoLast) {
- $container.find(".ui-icon-seek-end").addClass("ui-state-disabled");
- }
- if (!state.canGotoNext) {
- $container.find(".ui-icon-seek-next").addClass("ui-state-disabled");
- }
- if (!state.canGotoPrev) {
- $container.find(".ui-icon-seek-prev").addClass("ui-state-disabled");
- }
-
- if (pagingInfo.pageSize == 0) {
- var totalRowsCount = dataView.getItems().length;
- var visibleRowsCount = pagingInfo.totalRows;
- if (visibleRowsCount < totalRowsCount) {
- $status.text("Showing " + visibleRowsCount + " of " + totalRowsCount + " rows");
- } else {
- $status.text("Showing all " + totalRowsCount + " rows");
- }
- $status.text("Showing all " + pagingInfo.totalRows + " rows");
- } else {
- $status.text("Showing page " + (pagingInfo.pageNum + 1) + " of " + pagingInfo.totalPages);
- }
- }
-
- init();
- }
-
- // Slick.Controls.Pager
- $.extend(true, window, { Slick:{ Controls:{ Pager:SlickGridPager }}});
-})(jQuery);
diff --git a/apps/willrogers/src/main/public/stylesheets/bootstrap.css b/apps/willrogers/src/main/public/stylesheets/bootstrap.css
deleted file mode 100644
index b226301..0000000
--- a/apps/willrogers/src/main/public/stylesheets/bootstrap.css
+++ /dev/null
@@ -1,2470 +0,0 @@
-/*!
- * Bootstrap v1.4.0
- *
- * Copyright 2011 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- * Date: Sun Dec 25 20:18:31 PST 2011
- */
-/* Reset.less
- * Props to Eric Meyer (meyerweb.com) for his CSS reset file. We're using an adapted version here that cuts out some of the reset HTML elements we will never need here (i.e., dfn, samp, etc).
- * ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- */
-html, body {
- margin: 0;
- padding: 0;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-p,
-blockquote,
-pre,
-a,
-abbr,
-acronym,
-address,
-cite,
-code,
-del,
-dfn,
-em,
-img,
-q,
-s,
-samp,
-small,
-strike,
-strong,
-sub,
-sup,
-tt,
-var,
-dd,
-dl,
-dt,
-li,
-ol,
-ul,
-fieldset,
-form,
-label,
-legend,
-button,
-table,
-caption,
-tbody,
-tfoot,
-thead,
-tr,
-th,
-td {
- margin: 0;
- padding: 0;
- border: 0;
- font-weight: normal;
- font-style: normal;
- font-size: 100%;
- line-height: 1;
- font-family: inherit;
-}
-table {
- border-collapse: collapse;
- border-spacing: 0;
-}
-ol, ul {
- list-style: none;
-}
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-html {
- overflow-y: scroll;
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-a:focus {
- outline: thin dotted;
-}
-a:hover, a:active {
- outline: 0;
-}
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-audio, canvas, video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-audio:not([controls]) {
- display: none;
-}
-sub, sup {
- font-size: 75%;
- line-height: 0;
- position: relative;
- vertical-align: baseline;
-}
-sup {
- top: -0.5em;
-}
-sub {
- bottom: -0.25em;
-}
-img {
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-button,
-input,
-select,
-textarea {
- font-size: 100%;
- margin: 0;
- vertical-align: baseline;
- *vertical-align: middle;
-}
-button, input {
- line-height: normal;
- *overflow: visible;
-}
-button::-moz-focus-inner, input::-moz-focus-inner {
- border: 0;
- padding: 0;
-}
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-input[type="search"] {
- -webkit-appearance: textfield;
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-input[type="search"]::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-/* Variables.less
- * Variables to customize the look and feel of Bootstrap
- * ----------------------------------------------------- */
-/* Mixins.less
- * Snippets of reusable CSS to develop faster and keep code readable
- * ----------------------------------------------------------------- */
-/*
- * Scaffolding
- * Basic and global styles for generating a grid system, structural layout, and page templates
- * ------------------------------------------------------------------------------------------- */
-body {
- background-color: #ffffff;
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 18px;
- color: #404040;
-}
-.container {
- width: 940px;
- margin-left: auto;
- margin-right: auto;
- zoom: 1;
-}
-.container:before, .container:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.container:after {
- clear: both;
-}
-.container-fluid {
- position: relative;
- min-width: 940px;
- padding-left: 20px;
- padding-right: 20px;
- zoom: 1;
-}
-.container-fluid:before, .container-fluid:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.container-fluid:after {
- clear: both;
-}
-.container-fluid > .sidebar {
- position: absolute;
- top: 0;
- left: 20px;
- width: 220px;
-}
-.container-fluid > .content {
- margin-left: 240px;
-}
-a {
- color: #0069d6;
- text-decoration: none;
- line-height: inherit;
- font-weight: inherit;
-}
-a:hover {
- color: #00438a;
- text-decoration: underline;
-}
-.pull-right {
- float: right;
-}
-.pull-left {
- float: left;
-}
-.hide {
- display: none;
-}
-.show {
- display: block;
-}
-.row {
- zoom: 1;
- margin-left: -20px;
-}
-.row:before, .row:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.row:after {
- clear: both;
-}
-.row > [class*="span"] {
- display: inline;
- float: left;
- margin-left: 20px;
-}
-.span1 {
- width: 40px;
-}
-.span2 {
- width: 100px;
-}
-.span3 {
- width: 160px;
-}
-.span4 {
- width: 220px;
-}
-.span5 {
- width: 280px;
-}
-.span6 {
- width: 340px;
-}
-.span7 {
- width: 400px;
-}
-.span8 {
- width: 460px;
-}
-.span9 {
- width: 520px;
-}
-.span10 {
- width: 580px;
-}
-.span11 {
- width: 640px;
-}
-.span12 {
- width: 700px;
-}
-.span13 {
- width: 760px;
-}
-.span14 {
- width: 820px;
-}
-.span15 {
- width: 880px;
-}
-.span16 {
- width: 940px;
-}
-.span17 {
- width: 1000px;
-}
-.span18 {
- width: 1060px;
-}
-.span19 {
- width: 1120px;
-}
-.span20 {
- width: 1180px;
-}
-.span21 {
- width: 1240px;
-}
-.span22 {
- width: 1300px;
-}
-.span23 {
- width: 1360px;
-}
-.span24 {
- width: 1420px;
-}
-.row > .offset1 {
- margin-left: 80px;
-}
-.row > .offset2 {
- margin-left: 140px;
-}
-.row > .offset3 {
- margin-left: 200px;
-}
-.row > .offset4 {
- margin-left: 260px;
-}
-.row > .offset5 {
- margin-left: 320px;
-}
-.row > .offset6 {
- margin-left: 380px;
-}
-.row > .offset7 {
- margin-left: 440px;
-}
-.row > .offset8 {
- margin-left: 500px;
-}
-.row > .offset9 {
- margin-left: 560px;
-}
-.row > .offset10 {
- margin-left: 620px;
-}
-.row > .offset11 {
- margin-left: 680px;
-}
-.row > .offset12 {
- margin-left: 740px;
-}
-.span-one-third {
- width: 300px;
-}
-.span-two-thirds {
- width: 620px;
-}
-.row > .offset-one-third {
- margin-left: 340px;
-}
-.row > .offset-two-thirds {
- margin-left: 660px;
-}
-/* Typography.less
- * Headings, body text, lists, code, and more for a versatile and durable typography system
- * ---------------------------------------------------------------------------------------- */
-p {
- font-size: 13px;
- font-weight: normal;
- line-height: 18px;
- margin-bottom: 9px;
-}
-p small {
- font-size: 11px;
- color: #bfbfbf;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- font-weight: bold;
- color: #404040;
-}
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- color: #bfbfbf;
-}
-h1 {
- margin-bottom: 18px;
- font-size: 30px;
- line-height: 36px;
-}
-h1 small {
- font-size: 18px;
-}
-h2 {
- font-size: 24px;
- line-height: 36px;
-}
-h2 small {
- font-size: 14px;
-}
-h3,
-h4,
-h5,
-h6 {
- line-height: 36px;
-}
-h3 {
- font-size: 18px;
-}
-h3 small {
- font-size: 14px;
-}
-h4 {
- font-size: 16px;
-}
-h4 small {
- font-size: 12px;
-}
-h5 {
- font-size: 14px;
-}
-h6 {
- font-size: 13px;
- color: #bfbfbf;
- text-transform: uppercase;
-}
-ul, ol {
- margin: 0 0 18px 25px;
-}
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-ul {
- list-style: disc;
-}
-ol {
- list-style: decimal;
-}
-li {
- line-height: 18px;
- color: #808080;
-}
-ul.unstyled {
- list-style: none;
- margin-left: 0;
-}
-dl {
- margin-bottom: 18px;
-}
-dl dt, dl dd {
- line-height: 18px;
-}
-dl dt {
- font-weight: bold;
-}
-dl dd {
- margin-left: 9px;
-}
-hr {
- margin: 20px 0 19px;
- border: 0;
- border-bottom: 1px solid #eee;
-}
-strong {
- font-style: inherit;
- font-weight: bold;
-}
-em {
- font-style: italic;
- font-weight: inherit;
- line-height: inherit;
-}
-.muted {
- color: #bfbfbf;
-}
-blockquote {
- margin-bottom: 18px;
- border-left: 5px solid #eee;
- padding-left: 15px;
-}
-blockquote p {
- font-size: 14px;
- font-weight: 300;
- line-height: 18px;
- margin-bottom: 0;
-}
-blockquote small {
- display: block;
- font-size: 12px;
- font-weight: 300;
- line-height: 18px;
- color: #bfbfbf;
-}
-blockquote small:before {
- content: '\2014 \00A0';
-}
-address {
- display: block;
- line-height: 18px;
- margin-bottom: 18px;
-}
-code, pre {
- padding: 0 3px 2px;
- font-family: Monaco, Andale Mono, Courier New, monospace;
- font-size: 12px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-code {
- background-color: #fee9cc;
- color: rgba(0, 0, 0, 0.75);
- padding: 1px 3px;
-}
-pre {
- background-color: #f5f5f5;
- display: block;
- padding: 8.5px;
- margin: 0 0 18px;
- line-height: 18px;
- font-size: 12px;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- white-space: pre;
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-/* Forms.less
- * Base styles for various input types, form layouts, and states
- * ------------------------------------------------------------- */
-form {
- margin-bottom: 18px;
-}
-fieldset {
- margin-bottom: 18px;
- padding-top: 18px;
-}
-fieldset legend {
- display: block;
- padding-left: 150px;
- font-size: 19.5px;
- line-height: 1;
- color: #404040;
- *padding: 0 0 5px 145px;
- /* IE6-7 */
-
- *line-height: 1.5;
- /* IE6-7 */
-
-}
-form .clearfix {
- margin-bottom: 18px;
- zoom: 1;
-}
-form .clearfix:before, form .clearfix:after {
- display: table;
- content: "";
- zoom: 1;
-}
-form .clearfix:after {
- clear: both;
-}
-label,
-input,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: normal;
-}
-label {
- padding-top: 6px;
- font-size: 13px;
- line-height: 18px;
- float: left;
- width: 130px;
- text-align: right;
- color: #404040;
-}
-form .input {
- margin-left: 150px;
-}
-input[type=checkbox], input[type=radio] {
- cursor: pointer;
-}
-input,
-textarea,
-select,
-.uneditable-input {
- display: inline-block;
- width: 210px;
- height: 18px;
- padding: 4px;
- font-size: 13px;
- line-height: 18px;
- color: #808080;
- border: 1px solid #ccc;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-select {
- padding: initial;
-}
-input[type=checkbox], input[type=radio] {
- width: auto;
- height: auto;
- padding: 0;
- margin: 3px 0;
- *margin-top: 0;
- /* IE6-7 */
-
- line-height: normal;
- border: none;
-}
-input[type=file] {
- background-color: #ffffff;
- padding: initial;
- border: initial;
- line-height: initial;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-input[type=button], input[type=reset], input[type=submit] {
- width: auto;
- height: auto;
-}
-select, input[type=file] {
- height: 27px;
- *height: auto;
- line-height: 27px;
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
-}
-select[multiple] {
- height: inherit;
- background-color: #ffffff;
-}
-textarea {
- height: auto;
-}
-.uneditable-input {
- background-color: #ffffff;
- display: block;
- border-color: #eee;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- cursor: not-allowed;
-}
-:-moz-placeholder {
- color: #bfbfbf;
-}
-::-webkit-input-placeholder {
- color: #bfbfbf;
-}
-input, textarea {
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -ms-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
- transition: border linear 0.2s, box-shadow linear 0.2s;
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-input:focus, textarea:focus {
- outline: 0;
- border-color: rgba(82, 168, 236, 0.8);
- -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
- -moz-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-input[type=file]:focus, input[type=checkbox]:focus, select:focus {
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
- outline: 1px dotted #666;
-}
-form .clearfix.error > label, form .clearfix.error .help-block, form .clearfix.error .help-inline {
- color: #b94a48;
-}
-form .clearfix.error input, form .clearfix.error textarea {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-form .clearfix.error input:focus, form .clearfix.error textarea:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-form .clearfix.error .input-prepend .add-on, form .clearfix.error .input-append .add-on {
- color: #b94a48;
- background-color: #fce6e6;
- border-color: #b94a48;
-}
-form .clearfix.warning > label, form .clearfix.warning .help-block, form .clearfix.warning .help-inline {
- color: #c09853;
-}
-form .clearfix.warning input, form .clearfix.warning textarea {
- color: #c09853;
- border-color: #ccae64;
-}
-form .clearfix.warning input:focus, form .clearfix.warning textarea:focus {
- border-color: #be9a3f;
- -webkit-box-shadow: 0 0 6px #e5d6b1;
- -moz-box-shadow: 0 0 6px #e5d6b1;
- box-shadow: 0 0 6px #e5d6b1;
-}
-form .clearfix.warning .input-prepend .add-on, form .clearfix.warning .input-append .add-on {
- color: #c09853;
- background-color: #d2b877;
- border-color: #c09853;
-}
-form .clearfix.success > label, form .clearfix.success .help-block, form .clearfix.success .help-inline {
- color: #468847;
-}
-form .clearfix.success input, form .clearfix.success textarea {
- color: #468847;
- border-color: #57a957;
-}
-form .clearfix.success input:focus, form .clearfix.success textarea:focus {
- border-color: #458845;
- -webkit-box-shadow: 0 0 6px #9acc9a;
- -moz-box-shadow: 0 0 6px #9acc9a;
- box-shadow: 0 0 6px #9acc9a;
-}
-form .clearfix.success .input-prepend .add-on, form .clearfix.success .input-append .add-on {
- color: #468847;
- background-color: #bcddbc;
- border-color: #468847;
-}
-.input-mini,
-input.mini,
-textarea.mini,
-select.mini {
- width: 60px;
-}
-.input-small,
-input.small,
-textarea.small,
-select.small {
- width: 90px;
-}
-.input-medium,
-input.medium,
-textarea.medium,
-select.medium {
- width: 150px;
-}
-.input-large,
-input.large,
-textarea.large,
-select.large {
- width: 210px;
-}
-.input-xlarge,
-input.xlarge,
-textarea.xlarge,
-select.xlarge {
- width: 270px;
-}
-.input-xxlarge,
-input.xxlarge,
-textarea.xxlarge,
-select.xxlarge {
- width: 530px;
-}
-textarea.xxlarge {
- overflow-y: auto;
-}
-input.span1, textarea.span1 {
- display: inline-block;
- float: none;
- width: 30px;
- margin-left: 0;
-}
-input.span2, textarea.span2 {
- display: inline-block;
- float: none;
- width: 90px;
- margin-left: 0;
-}
-input.span3, textarea.span3 {
- display: inline-block;
- float: none;
- width: 150px;
- margin-left: 0;
-}
-input.span4, textarea.span4 {
- display: inline-block;
- float: none;
- width: 210px;
- margin-left: 0;
-}
-input.span5, textarea.span5 {
- display: inline-block;
- float: none;
- width: 270px;
- margin-left: 0;
-}
-input.span6, textarea.span6 {
- display: inline-block;
- float: none;
- width: 330px;
- margin-left: 0;
-}
-input.span7, textarea.span7 {
- display: inline-block;
- float: none;
- width: 390px;
- margin-left: 0;
-}
-input.span8, textarea.span8 {
- display: inline-block;
- float: none;
- width: 450px;
- margin-left: 0;
-}
-input.span9, textarea.span9 {
- display: inline-block;
- float: none;
- width: 510px;
- margin-left: 0;
-}
-input.span10, textarea.span10 {
- display: inline-block;
- float: none;
- width: 570px;
- margin-left: 0;
-}
-input.span11, textarea.span11 {
- display: inline-block;
- float: none;
- width: 630px;
- margin-left: 0;
-}
-input.span12, textarea.span12 {
- display: inline-block;
- float: none;
- width: 690px;
- margin-left: 0;
-}
-input.span13, textarea.span13 {
- display: inline-block;
- float: none;
- width: 750px;
- margin-left: 0;
-}
-input.span14, textarea.span14 {
- display: inline-block;
- float: none;
- width: 810px;
- margin-left: 0;
-}
-input.span15, textarea.span15 {
- display: inline-block;
- float: none;
- width: 870px;
- margin-left: 0;
-}
-input.span16, textarea.span16 {
- display: inline-block;
- float: none;
- width: 930px;
- margin-left: 0;
-}
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- background-color: #f5f5f5;
- border-color: #ddd;
- cursor: not-allowed;
-}
-.actions {
- background: #f5f5f5;
- margin-top: 18px;
- margin-bottom: 18px;
- padding: 17px 20px 18px 150px;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 3px 3px;
- -moz-border-radius: 0 0 3px 3px;
- border-radius: 0 0 3px 3px;
-}
-.actions .secondary-action {
- float: right;
-}
-.actions .secondary-action a {
- line-height: 30px;
-}
-.actions .secondary-action a:hover {
- text-decoration: underline;
-}
-.help-inline, .help-block {
- font-size: 13px;
- line-height: 18px;
- color: #bfbfbf;
-}
-.help-inline {
- padding-left: 5px;
- *position: relative;
- /* IE6-7 */
-
- *top: -5px;
- /* IE6-7 */
-
-}
-.help-block {
- display: block;
- max-width: 600px;
-}
-.inline-inputs {
- color: #808080;
-}
-.inline-inputs span {
- padding: 0 2px 0 1px;
-}
-.input-prepend input, .input-append input {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-.input-prepend .add-on, .input-append .add-on {
- position: relative;
- background: #f5f5f5;
- border: 1px solid #ccc;
- z-index: 2;
- float: left;
- display: block;
- width: auto;
- min-width: 16px;
- height: 18px;
- padding: 4px 4px 4px 5px;
- margin-right: -1px;
- font-weight: normal;
- line-height: 18px;
- color: #bfbfbf;
- text-align: center;
- text-shadow: 0 1px 0 #ffffff;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-prepend .active, .input-append .active {
- background: #a9dba9;
- border-color: #46a546;
-}
-.input-prepend .add-on {
- *margin-top: 1px;
- /* IE6-7 */
-
-}
-.input-append input {
- float: left;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-.input-append .add-on {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
- margin-right: 0;
- margin-left: -1px;
-}
-.inputs-list {
- margin: 0 0 5px;
- width: 100%;
-}
-.inputs-list li {
- display: block;
- padding: 0;
- width: 100%;
-}
-.inputs-list label {
- display: block;
- float: none;
- width: auto;
- padding: 0;
- margin-left: 20px;
- line-height: 18px;
- text-align: left;
- white-space: normal;
-}
-.inputs-list label strong {
- color: #808080;
-}
-.inputs-list label small {
- font-size: 11px;
- font-weight: normal;
-}
-.inputs-list .inputs-list {
- margin-left: 25px;
- margin-bottom: 10px;
- padding-top: 0;
-}
-.inputs-list:first-child {
- padding-top: 6px;
-}
-.inputs-list li + li {
- padding-top: 2px;
-}
-.inputs-list input[type=radio], .inputs-list input[type=checkbox] {
- margin-bottom: 0;
- margin-left: -20px;
- float: left;
-}
-.form-stacked {
- padding-left: 20px;
-}
-.form-stacked fieldset {
- padding-top: 9px;
-}
-.form-stacked legend {
- padding-left: 0;
-}
-.form-stacked label {
- display: block;
- float: none;
- width: auto;
- font-weight: bold;
- text-align: left;
- line-height: 20px;
- padding-top: 0;
-}
-.form-stacked .clearfix {
- margin-bottom: 9px;
-}
-.form-stacked .clearfix div.input {
- margin-left: 0;
-}
-.form-stacked .inputs-list {
- margin-bottom: 0;
-}
-.form-stacked .inputs-list li {
- padding-top: 0;
-}
-.form-stacked .inputs-list li label {
- font-weight: normal;
- padding-top: 0;
-}
-.form-stacked div.clearfix.error {
- padding-top: 10px;
- padding-bottom: 10px;
- padding-left: 10px;
- margin-top: 0;
- margin-left: -10px;
-}
-.form-stacked .actions {
- margin-left: -20px;
- padding-left: 20px;
-}
-/*
- * Tables.less
- * Tables for, you guessed it, tabular data
- * ---------------------------------------- */
-table {
- width: 100%;
- margin-bottom: 18px;
- padding: 0;
- font-size: 13px;
- border-collapse: collapse;
-}
-table th, table td {
- padding: 10px 10px 9px;
- line-height: 18px;
- text-align: left;
-}
-table th {
- padding-top: 9px;
- font-weight: bold;
- vertical-align: middle;
-}
-table td {
- vertical-align: top;
- border-top: 1px solid #ddd;
-}
-table tbody th {
- border-top: 1px solid #ddd;
- vertical-align: top;
-}
-.condensed-table th, .condensed-table td {
- padding: 5px 5px 4px;
-}
-.bordered-table {
- border: 1px solid #ddd;
- border-collapse: separate;
- *border-collapse: collapse;
- /* IE7, collapse table to remove spacing */
-
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.bordered-table th + th, .bordered-table td + td, .bordered-table th + td {
- border-left: 1px solid #ddd;
-}
-.bordered-table thead tr:first-child th:first-child, .bordered-table tbody tr:first-child td:first-child {
- -webkit-border-radius: 4px 0 0 0;
- -moz-border-radius: 4px 0 0 0;
- border-radius: 4px 0 0 0;
-}
-.bordered-table thead tr:first-child th:last-child, .bordered-table tbody tr:first-child td:last-child {
- -webkit-border-radius: 0 4px 0 0;
- -moz-border-radius: 0 4px 0 0;
- border-radius: 0 4px 0 0;
-}
-.bordered-table tbody tr:last-child td:first-child {
- -webkit-border-radius: 0 0 0 4px;
- -moz-border-radius: 0 0 0 4px;
- border-radius: 0 0 0 4px;
-}
-.bordered-table tbody tr:last-child td:last-child {
- -webkit-border-radius: 0 0 4px 0;
- -moz-border-radius: 0 0 4px 0;
- border-radius: 0 0 4px 0;
-}
-table .span1 {
- width: 20px;
-}
-table .span2 {
- width: 60px;
-}
-table .span3 {
- width: 100px;
-}
-table .span4 {
- width: 140px;
-}
-table .span5 {
- width: 180px;
-}
-table .span6 {
- width: 220px;
-}
-table .span7 {
- width: 260px;
-}
-table .span8 {
- width: 300px;
-}
-table .span9 {
- width: 340px;
-}
-table .span10 {
- width: 380px;
-}
-table .span11 {
- width: 420px;
-}
-table .span12 {
- width: 460px;
-}
-table .span13 {
- width: 500px;
-}
-table .span14 {
- width: 540px;
-}
-table .span15 {
- width: 580px;
-}
-table .span16 {
- width: 620px;
-}
-.zebra-striped tbody tr:nth-child(odd) td, .zebra-striped tbody tr:nth-child(odd) th {
- background-color: #f9f9f9;
-}
-.zebra-striped tbody tr:hover td, .zebra-striped tbody tr:hover th {
- background-color: #f5f5f5;
-}
-table .header {
- cursor: pointer;
-}
-table .header:after {
- content: "";
- float: right;
- margin-top: 7px;
- border-width: 0 4px 4px;
- border-style: solid;
- border-color: #000 transparent;
- visibility: hidden;
-}
-table .headerSortUp, table .headerSortDown {
- background-color: rgba(141, 192, 219, 0.25);
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-}
-table .header:hover:after {
- visibility: visible;
-}
-table .headerSortDown:after, table .headerSortDown:hover:after {
- visibility: visible;
- filter: alpha(opacity=60);
- -khtml-opacity: 0.6;
- -moz-opacity: 0.6;
- opacity: 0.6;
-}
-table .headerSortUp:after {
- border-bottom: none;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid #000;
- visibility: visible;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
- filter: alpha(opacity=60);
- -khtml-opacity: 0.6;
- -moz-opacity: 0.6;
- opacity: 0.6;
-}
-table .blue {
- color: #049cdb;
- border-bottom-color: #049cdb;
-}
-table .headerSortUp.blue, table .headerSortDown.blue {
- background-color: #ade6fe;
-}
-table .green {
- color: #46a546;
- border-bottom-color: #46a546;
-}
-table .headerSortUp.green, table .headerSortDown.green {
- background-color: #cdeacd;
-}
-table .red {
- color: #9d261d;
- border-bottom-color: #9d261d;
-}
-table .headerSortUp.red, table .headerSortDown.red {
- background-color: #f4c8c5;
-}
-table .yellow {
- color: #ffc40d;
- border-bottom-color: #ffc40d;
-}
-table .headerSortUp.yellow, table .headerSortDown.yellow {
- background-color: #fff6d9;
-}
-table .orange {
- color: #f89406;
- border-bottom-color: #f89406;
-}
-table .headerSortUp.orange, table .headerSortDown.orange {
- background-color: #fee9cc;
-}
-table .purple {
- color: #7a43b6;
- border-bottom-color: #7a43b6;
-}
-table .headerSortUp.purple, table .headerSortDown.purple {
- background-color: #e2d5f0;
-}
-/* Patterns.less
- * Repeatable UI elements outside the base styles provided from the scaffolding
- * ---------------------------------------------------------------------------- */
-.topbar {
- height: 40px;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- z-index: 10000;
- overflow: visible;
-}
-.topbar a {
- color: #bfbfbf;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-.topbar h3 a:hover, .topbar .brand:hover, .topbar ul .active > a {
- background-color: #333;
- background-color: rgba(255, 255, 255, 0.05);
- color: #ffffff;
- text-decoration: none;
-}
-.topbar h3 {
- position: relative;
-}
-.topbar h3 a, .topbar .brand {
- float: left;
- display: block;
- padding: 8px 20px 12px;
- margin-left: -20px;
- color: #ffffff;
- font-size: 20px;
- font-weight: 200;
- line-height: 1;
-}
-.topbar p {
- margin: 0;
- line-height: 40px;
-}
-.topbar p a:hover {
- background-color: transparent;
- color: #ffffff;
-}
-.topbar form {
- float: left;
- margin: 5px 0 0 0;
- position: relative;
- filter: alpha(opacity=100);
- -khtml-opacity: 1;
- -moz-opacity: 1;
- opacity: 1;
-}
-.topbar form.pull-right {
- float: right;
-}
-.topbar input {
- background-color: #444;
- background-color: rgba(255, 255, 255, 0.3);
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: normal;
- font-weight: 13px;
- line-height: 1;
- padding: 4px 9px;
- color: #ffffff;
- color: rgba(255, 255, 255, 0.75);
- border: 1px solid #111;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.25);
- -webkit-transition: none;
- -moz-transition: none;
- -ms-transition: none;
- -o-transition: none;
- transition: none;
-}
-.topbar input:-moz-placeholder {
- color: #e6e6e6;
-}
-.topbar input::-webkit-input-placeholder {
- color: #e6e6e6;
-}
-.topbar input:hover {
- background-color: #bfbfbf;
- background-color: rgba(255, 255, 255, 0.5);
- color: #ffffff;
-}
-.topbar input:focus, .topbar input.focused {
- outline: 0;
- background-color: #ffffff;
- color: #404040;
- text-shadow: 0 1px 0 #ffffff;
- border: 0;
- padding: 5px 10px;
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-.topbar-inner, .topbar .fill {
- background-color: #222;
- background-color: #222222;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#333333), to(#222222));
- background-image: -moz-linear-gradient(top, #333333, #222222);
- background-image: -ms-linear-gradient(top, #333333, #222222);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #333333), color-stop(100%, #222222));
- background-image: -webkit-linear-gradient(top, #333333, #222222);
- background-image: -o-linear-gradient(top, #333333, #222222);
- background-image: linear-gradient(top, #333333, #222222);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);
-}
-.topbar div > ul, .nav {
- display: block;
- float: left;
- margin: 0 10px 0 0;
- position: relative;
- left: 0;
-}
-.topbar div > ul > li, .nav > li {
- display: block;
- float: left;
-}
-.topbar div > ul a, .nav a {
- display: block;
- float: none;
- padding: 10px 10px 11px;
- line-height: 19px;
- text-decoration: none;
-}
-.topbar div > ul a:hover, .nav a:hover {
- color: #ffffff;
- text-decoration: none;
-}
-.topbar div > ul .active > a, .nav .active > a {
- background-color: #222;
- background-color: rgba(0, 0, 0, 0.5);
-}
-.topbar div > ul.secondary-nav, .nav.secondary-nav {
- float: right;
- margin-left: 10px;
- margin-right: 0;
-}
-.topbar div > ul.secondary-nav .menu-dropdown,
-.nav.secondary-nav .menu-dropdown,
-.topbar div > ul.secondary-nav .dropdown-menu,
-.nav.secondary-nav .dropdown-menu {
- right: 0;
- border: 0;
-}
-.topbar div > ul a.menu:hover,
-.nav a.menu:hover,
-.topbar div > ul li.open .menu,
-.nav li.open .menu,
-.topbar div > ul .dropdown-toggle:hover,
-.nav .dropdown-toggle:hover,
-.topbar div > ul .dropdown.open .dropdown-toggle,
-.nav .dropdown.open .dropdown-toggle {
- background: #444;
- background: rgba(255, 255, 255, 0.05);
-}
-.topbar div > ul .menu-dropdown,
-.nav .menu-dropdown,
-.topbar div > ul .dropdown-menu,
-.nav .dropdown-menu {
- background-color: #333;
-}
-.topbar div > ul .menu-dropdown a.menu,
-.nav .menu-dropdown a.menu,
-.topbar div > ul .dropdown-menu a.menu,
-.nav .dropdown-menu a.menu,
-.topbar div > ul .menu-dropdown .dropdown-toggle,
-.nav .menu-dropdown .dropdown-toggle,
-.topbar div > ul .dropdown-menu .dropdown-toggle,
-.nav .dropdown-menu .dropdown-toggle {
- color: #ffffff;
-}
-.topbar div > ul .menu-dropdown a.menu.open,
-.nav .menu-dropdown a.menu.open,
-.topbar div > ul .dropdown-menu a.menu.open,
-.nav .dropdown-menu a.menu.open,
-.topbar div > ul .menu-dropdown .dropdown-toggle.open,
-.nav .menu-dropdown .dropdown-toggle.open,
-.topbar div > ul .dropdown-menu .dropdown-toggle.open,
-.nav .dropdown-menu .dropdown-toggle.open {
- background: #444;
- background: rgba(255, 255, 255, 0.05);
-}
-.topbar div > ul .menu-dropdown li a,
-.nav .menu-dropdown li a,
-.topbar div > ul .dropdown-menu li a,
-.nav .dropdown-menu li a {
- color: #999;
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5);
-}
-.topbar div > ul .menu-dropdown li a:hover,
-.nav .menu-dropdown li a:hover,
-.topbar div > ul .dropdown-menu li a:hover,
-.nav .dropdown-menu li a:hover {
- background-color: #191919;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#292929), to(#191919));
- background-image: -moz-linear-gradient(top, #292929, #191919);
- background-image: -ms-linear-gradient(top, #292929, #191919);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #292929), color-stop(100%, #191919));
- background-image: -webkit-linear-gradient(top, #292929, #191919);
- background-image: -o-linear-gradient(top, #292929, #191919);
- background-image: linear-gradient(top, #292929, #191919);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#292929', endColorstr='#191919', GradientType=0);
- color: #ffffff;
-}
-.topbar div > ul .menu-dropdown .active a,
-.nav .menu-dropdown .active a,
-.topbar div > ul .dropdown-menu .active a,
-.nav .dropdown-menu .active a {
- color: #ffffff;
-}
-.topbar div > ul .menu-dropdown .divider,
-.nav .menu-dropdown .divider,
-.topbar div > ul .dropdown-menu .divider,
-.nav .dropdown-menu .divider {
- background-color: #222;
- border-color: #444;
-}
-.topbar ul .menu-dropdown li a, .topbar ul .dropdown-menu li a {
- padding: 4px 15px;
-}
-li.menu, .dropdown {
- position: relative;
-}
-a.menu:after, .dropdown-toggle:after {
- width: 0;
- height: 0;
- display: inline-block;
- content: "↓";
- text-indent: -99999px;
- vertical-align: top;
- margin-top: 8px;
- margin-left: 4px;
- border-left: 4px solid transparent;
- border-right: 4px solid transparent;
- border-top: 4px solid #ffffff;
- filter: alpha(opacity=50);
- -khtml-opacity: 0.5;
- -moz-opacity: 0.5;
- opacity: 0.5;
-}
-.menu-dropdown, .dropdown-menu {
- background-color: #ffffff;
- float: left;
- display: none;
- position: absolute;
- top: 40px;
- z-index: 900;
- min-width: 160px;
- max-width: 220px;
- _width: 160px;
- margin-left: 0;
- margin-right: 0;
- padding: 6px 0;
- zoom: 1;
- border-color: #999;
- border-color: rgba(0, 0, 0, 0.2);
- border-style: solid;
- border-width: 0 1px 1px;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- -webkit-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.menu-dropdown li, .dropdown-menu li {
- float: none;
- display: block;
- background-color: none;
-}
-.menu-dropdown .divider, .dropdown-menu .divider {
- height: 1px;
- margin: 5px 0;
- overflow: hidden;
- background-color: #eee;
- border-bottom: 1px solid #ffffff;
-}
-.topbar .dropdown-menu a, .dropdown-menu a {
- display: block;
- padding: 4px 15px;
- clear: both;
- font-weight: normal;
- line-height: 18px;
- color: #808080;
- text-shadow: 0 1px 0 #ffffff;
-}
-.topbar .dropdown-menu a:hover,
-.dropdown-menu a:hover,
-.topbar .dropdown-menu a.hover,
-.dropdown-menu a.hover {
- background-color: #dddddd;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#eeeeee), to(#dddddd));
- background-image: -moz-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -ms-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #eeeeee), color-stop(100%, #dddddd));
- background-image: -webkit-linear-gradient(top, #eeeeee, #dddddd);
- background-image: -o-linear-gradient(top, #eeeeee, #dddddd);
- background-image: linear-gradient(top, #eeeeee, #dddddd);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);
- color: #404040;
- text-decoration: none;
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.025), inset 0 -1px rgba(0, 0, 0, 0.025);
-}
-.open .menu,
-.dropdown.open .menu,
-.open .dropdown-toggle,
-.dropdown.open .dropdown-toggle {
- color: #ffffff;
- background: #ccc;
- background: rgba(0, 0, 0, 0.3);
-}
-.open .menu-dropdown,
-.dropdown.open .menu-dropdown,
-.open .dropdown-menu,
-.dropdown.open .dropdown-menu {
- display: block;
-}
-.tabs, .pills {
- margin: 0 0 18px;
- padding: 0;
- list-style: none;
- zoom: 1;
-}
-.tabs:before,
-.pills:before,
-.tabs:after,
-.pills:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.tabs:after, .pills:after {
- clear: both;
-}
-.tabs > li, .pills > li {
- float: left;
-}
-.tabs > li > a, .pills > li > a {
- display: block;
-}
-.tabs {
- border-color: #ddd;
- border-style: solid;
- border-width: 0 0 1px;
-}
-.tabs > li {
- position: relative;
- margin-bottom: -1px;
-}
-.tabs > li > a {
- padding: 0 15px;
- margin-right: 2px;
- line-height: 34px;
- border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-.tabs > li > a:hover {
- text-decoration: none;
- background-color: #eee;
- border-color: #eee #eee #ddd;
-}
-.tabs .active > a, .tabs .active > a:hover {
- color: #808080;
- background-color: #ffffff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
- cursor: default;
-}
-.tabs .menu-dropdown, .tabs .dropdown-menu {
- top: 35px;
- border-width: 1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-.tabs a.menu:after, .tabs .dropdown-toggle:after {
- border-top-color: #999;
- margin-top: 15px;
- margin-left: 5px;
-}
-.tabs li.open.menu .menu, .tabs .open.dropdown .dropdown-toggle {
- border-color: #999;
-}
-.tabs li.open a.menu:after, .tabs .dropdown.open .dropdown-toggle:after {
- border-top-color: #555;
-}
-.pills a {
- margin: 5px 3px 5px 0;
- padding: 0 15px;
- line-height: 30px;
- text-shadow: 0 1px 1px #ffffff;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-.pills a:hover {
- color: #ffffff;
- text-decoration: none;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
- background-color: #00438a;
-}
-.pills .active a {
- color: #ffffff;
- text-shadow: 0 1px 1px rgba(0, 0, 0, 0.25);
- background-color: #0069d6;
-}
-.pills-vertical > li {
- float: none;
-}
-.tab-content > .tab-pane,
-.pill-content > .pill-pane,
-.tab-content > div,
-.pill-content > div {
- display: none;
-}
-.tab-content > .active, .pill-content > .active {
- display: block;
-}
-.breadcrumb {
- padding: 7px 14px;
- margin: 0 0 18px;
- background-color: #f5f5f5;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#ffffff), to(#f5f5f5));
- background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ffffff), color-stop(100%, #f5f5f5));
- background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: linear-gradient(top, #ffffff, #f5f5f5);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
- border: 1px solid #ddd;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
-}
-.breadcrumb li {
- display: inline;
- text-shadow: 0 1px 0 #ffffff;
-}
-.breadcrumb .divider {
- padding: 0 5px;
- color: #bfbfbf;
-}
-.breadcrumb .active a {
- color: #404040;
-}
-.hero-unit {
- background-color: #f5f5f5;
- margin-bottom: 30px;
- padding: 60px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
-}
-.hero-unit p {
- font-size: 18px;
- font-weight: 200;
- line-height: 27px;
-}
-footer {
- margin-top: 17px;
- padding-top: 17px;
- border-top: 1px solid #eee;
-}
-.page-header {
- margin-bottom: 17px;
- border-bottom: 1px solid #ddd;
- -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- box-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.page-header h1 {
- margin-bottom: 8px;
-}
-.btn.danger,
-.alert-message.danger,
-.btn.danger:hover,
-.alert-message.danger:hover,
-.btn.error,
-.alert-message.error,
-.btn.error:hover,
-.alert-message.error:hover,
-.btn.success,
-.alert-message.success,
-.btn.success:hover,
-.alert-message.success:hover,
-.btn.info,
-.alert-message.info,
-.btn.info:hover,
-.alert-message.info:hover {
- color: #ffffff;
-}
-.btn .close, .alert-message .close {
- font-family: Arial, sans-serif;
- line-height: 18px;
-}
-.btn.danger,
-.alert-message.danger,
-.btn.error,
-.alert-message.error {
- background-color: #c43c35;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#ee5f5b), to(#c43c35));
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #ee5f5b), color-stop(100%, #c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(top, #ee5f5b, #c43c35);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #c43c35 #c43c35 #882a25;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.success, .alert-message.success {
- background-color: #57a957;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#62c462), to(#57a957));
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -ms-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #62c462), color-stop(100%, #57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(top, #62c462, #57a957);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #57a957 #57a957 #3d773d;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.info, .alert-message.info {
- background-color: #339bb9;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#5bc0de), to(#339bb9));
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #5bc0de), color-stop(100%, #339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(top, #5bc0de, #339bb9);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #339bb9 #339bb9 #22697d;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn {
- cursor: pointer;
- display: inline-block;
- background-color: #e6e6e6;
- background-repeat: no-repeat;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
- background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);
- padding: 5px 14px 6px;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- color: #333;
- font-size: 13px;
- line-height: normal;
- border: 1px solid #ccc;
- border-bottom-color: #bbb;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -webkit-transition: 0.1s linear all;
- -moz-transition: 0.1s linear all;
- -ms-transition: 0.1s linear all;
- -o-transition: 0.1s linear all;
- transition: 0.1s linear all;
-}
-.btn:hover {
- background-position: 0 -15px;
- color: #333;
- text-decoration: none;
-}
-.btn:focus {
- outline: 1px dotted #666;
-}
-.btn.primary {
- color: #ffffff;
- background-color: #0064cd;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#049cdb), to(#0064cd));
- background-image: -moz-linear-gradient(top, #049cdb, #0064cd);
- background-image: -ms-linear-gradient(top, #049cdb, #0064cd);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #049cdb), color-stop(100%, #0064cd));
- background-image: -webkit-linear-gradient(top, #049cdb, #0064cd);
- background-image: -o-linear-gradient(top, #049cdb, #0064cd);
- background-image: linear-gradient(top, #049cdb, #0064cd);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#049cdb', endColorstr='#0064cd', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #0064cd #0064cd #003f81;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-}
-.btn.active, .btn:active {
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.btn.disabled {
- cursor: default;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- filter: alpha(opacity=65);
- -khtml-opacity: 0.65;
- -moz-opacity: 0.65;
- opacity: 0.65;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn[disabled] {
- cursor: default;
- background-image: none;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- filter: alpha(opacity=65);
- -khtml-opacity: 0.65;
- -moz-opacity: 0.65;
- opacity: 0.65;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.btn.large {
- font-size: 15px;
- line-height: normal;
- padding: 9px 14px 9px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-.btn.small {
- padding: 7px 9px 7px;
- font-size: 11px;
-}
-:root .alert-message, :root .btn {
- border-radius: 0 \0;
-}
-button.btn::-moz-focus-inner, input[type=submit].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-.close {
- float: right;
- color: #000000;
- font-size: 20px;
- font-weight: bold;
- line-height: 13.5px;
- text-shadow: 0 1px 0 #ffffff;
- filter: alpha(opacity=25);
- -khtml-opacity: 0.25;
- -moz-opacity: 0.25;
- opacity: 0.25;
-}
-.close:hover {
- color: #000000;
- text-decoration: none;
- filter: alpha(opacity=40);
- -khtml-opacity: 0.4;
- -moz-opacity: 0.4;
- opacity: 0.4;
-}
-.alert-message {
- position: relative;
- padding: 7px 15px;
- margin-bottom: 18px;
- color: #404040;
- background-color: #eedc94;
- background-repeat: repeat-x;
- background-image: -khtml-gradient(linear, left top, left bottom, from(#fceec1), to(#eedc94));
- background-image: -moz-linear-gradient(top, #fceec1, #eedc94);
- background-image: -ms-linear-gradient(top, #fceec1, #eedc94);
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #fceec1), color-stop(100%, #eedc94));
- background-image: -webkit-linear-gradient(top, #fceec1, #eedc94);
- background-image: -o-linear-gradient(top, #fceec1, #eedc94);
- background-image: linear-gradient(top, #fceec1, #eedc94);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fceec1', endColorstr='#eedc94', GradientType=0);
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- border-color: #eedc94 #eedc94 #e4c652;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- border-width: 1px;
- border-style: solid;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25);
-}
-.alert-message .close {
- margin-top: 1px;
- *margin-top: 0;
-}
-.alert-message a {
- font-weight: bold;
- color: #404040;
-}
-.alert-message.danger p a,
-.alert-message.error p a,
-.alert-message.success p a,
-.alert-message.info p a {
- color: #ffffff;
-}
-.alert-message h5 {
- line-height: 18px;
-}
-.alert-message p {
- margin-bottom: 0;
-}
-.alert-message div {
- margin-top: 5px;
- margin-bottom: 2px;
- line-height: 28px;
-}
-.alert-message .btn {
- -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
- box-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
-}
-.alert-message.block-message {
- background-image: none;
- background-color: #fdf5d9;
- filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
- padding: 14px;
- border-color: #fceec1;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-.alert-message.block-message ul, .alert-message.block-message p {
- margin-right: 30px;
-}
-.alert-message.block-message ul {
- margin-bottom: 0;
-}
-.alert-message.block-message li {
- color: #404040;
-}
-.alert-message.block-message .alert-actions {
- margin-top: 5px;
-}
-.alert-message.block-message.error, .alert-message.block-message.success, .alert-message.block-message.info {
- color: #404040;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-.alert-message.block-message.error {
- background-color: #fddfde;
- border-color: #fbc7c6;
-}
-.alert-message.block-message.success {
- background-color: #d1eed1;
- border-color: #bfe7bf;
-}
-.alert-message.block-message.info {
- background-color: #ddf4fb;
- border-color: #c6edf9;
-}
-.alert-message.block-message.danger p a,
-.alert-message.block-message.error p a,
-.alert-message.block-message.success p a,
-.alert-message.block-message.info p a {
- color: #404040;
-}
-.pagination {
- height: 36px;
- margin: 18px 0;
-}
-.pagination ul {
- float: left;
- margin: 0;
- border: 1px solid #ddd;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-.pagination li {
- display: inline;
-}
-.pagination a {
- float: left;
- padding: 0 14px;
- line-height: 34px;
- border-right: 1px solid;
- border-right-color: #ddd;
- border-right-color: rgba(0, 0, 0, 0.15);
- *border-right-color: #ddd;
- /* IE6-7 */
-
- text-decoration: none;
-}
-.pagination a:hover, .pagination .active a {
- background-color: #c7eefe;
-}
-.pagination .disabled a, .pagination .disabled a:hover {
- background-color: transparent;
- color: #bfbfbf;
-}
-.pagination .next a {
- border: 0;
-}
-.well {
- background-color: #f5f5f5;
- margin-bottom: 20px;
- padding: 19px;
- min-height: 20px;
- border: 1px solid #eee;
- border: 1px solid rgba(0, 0, 0, 0.05);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-.modal-backdrop {
- background-color: #000000;
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 10000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop, .modal-backdrop.fade.in {
- filter: alpha(opacity=80);
- -khtml-opacity: 0.8;
- -moz-opacity: 0.8;
- opacity: 0.8;
-}
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 11000;
- max-height: 500px;
- overflow: auto;
- width: 560px;
- margin: -250px 0 0 -280px;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- /* IE6-7 */
-
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.modal .close {
- margin-top: 7px;
-}
-.modal.fade {
- -webkit-transition: opacity .3s linear, top .3s ease-out;
- -moz-transition: opacity .3s linear, top .3s ease-out;
- -ms-transition: opacity .3s linear, top .3s ease-out;
- -o-transition: opacity .3s linear, top .3s ease-out;
- transition: opacity .3s linear, top .3s ease-out;
- top: -25%;
-}
-.modal.fade.in {
- top: 50%;
-}
-.modal-header {
- border-bottom: 1px solid #eee;
- padding: 5px 15px;
-}
-.modal-body {
- padding: 15px;
-}
-.modal-body form {
- margin-bottom: 0;
-}
-.modal-footer {
- background-color: #f5f5f5;
- padding: 14px 15px 15px;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
- zoom: 1;
- margin-bottom: 0;
-}
-.modal-footer:before, .modal-footer:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.modal-footer:after {
- clear: both;
-}
-.modal-footer .btn {
- float: right;
- margin-left: 5px;
-}
-.modal .popover, .modal .twipsy {
- z-index: 12000;
-}
-.twipsy {
- display: block;
- position: absolute;
- visibility: visible;
- padding: 5px;
- font-size: 11px;
- z-index: 1000;
- filter: alpha(opacity=80);
- -khtml-opacity: 0.8;
- -moz-opacity: 0.8;
- opacity: 0.8;
-}
-.twipsy.fade.in {
- filter: alpha(opacity=80);
- -khtml-opacity: 0.8;
- -moz-opacity: 0.8;
- opacity: 0.8;
-}
-.twipsy.above .twipsy-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- border-top: 5px solid #000000;
-}
-.twipsy.left .twipsy-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid #000000;
-}
-.twipsy.below .twipsy-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- border-bottom: 5px solid #000000;
-}
-.twipsy.right .twipsy-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-right: 5px solid #000000;
-}
-.twipsy-inner {
- padding: 3px 8px;
- background-color: #000000;
- color: white;
- text-align: center;
- max-width: 200px;
- text-decoration: none;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-.twipsy-arrow {
- position: absolute;
- width: 0;
- height: 0;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1000;
- padding: 5px;
- display: none;
-}
-.popover.above .arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- border-top: 5px solid #000000;
-}
-.popover.right .arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-right: 5px solid #000000;
-}
-.popover.below .arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-left: 5px solid transparent;
- border-right: 5px solid transparent;
- border-bottom: 5px solid #000000;
-}
-.popover.left .arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-top: 5px solid transparent;
- border-bottom: 5px solid transparent;
- border-left: 5px solid #000000;
-}
-.popover .arrow {
- position: absolute;
- width: 0;
- height: 0;
-}
-.popover .inner {
- background: #000000;
- background: rgba(0, 0, 0, 0.8);
- padding: 3px;
- overflow: hidden;
- width: 280px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
-}
-.popover .title {
- background-color: #f5f5f5;
- padding: 9px 15px;
- line-height: 1;
- -webkit-border-radius: 3px 3px 0 0;
- -moz-border-radius: 3px 3px 0 0;
- border-radius: 3px 3px 0 0;
- border-bottom: 1px solid #eee;
-}
-.popover .content {
- background-color: #ffffff;
- padding: 14px;
- -webkit-border-radius: 0 0 3px 3px;
- -moz-border-radius: 0 0 3px 3px;
- border-radius: 0 0 3px 3px;
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-.popover .content p, .popover .content ul, .popover .content ol {
- margin-bottom: 0;
-}
-.fade {
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -ms-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
- opacity: 0;
-}
-.fade.in {
- opacity: 1;
-}
-.label {
- padding: 1px 3px 2px;
- font-size: 9.75px;
- font-weight: bold;
- color: #ffffff;
- text-transform: uppercase;
- white-space: nowrap;
- background-color: #bfbfbf;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- text-shadow: none;
-}
-.label.important {
- background-color: #c43c35;
-}
-.label.warning {
- background-color: #f89406;
-}
-.label.success {
- background-color: #46a546;
-}
-.label.notice {
- background-color: #62cffc;
-}
-.media-grid {
- margin-left: -20px;
- margin-bottom: 0;
- zoom: 1;
-}
-.media-grid:before, .media-grid:after {
- display: table;
- content: "";
- zoom: 1;
-}
-.media-grid:after {
- clear: both;
-}
-.media-grid li {
- display: inline;
-}
-.media-grid a {
- float: left;
- padding: 4px;
- margin: 0 0 18px 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-.media-grid a img {
- display: block;
-}
-.media-grid a:hover {
- border-color: #0069d6;
- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
diff --git a/apps/willrogers/src/main/public/stylesheets/demos/jquery-ui-1.10.3.custom.min.css b/apps/willrogers/src/main/public/stylesheets/demos/jquery-ui-1.10.3.custom.min.css
deleted file mode 100755
index 326eba0..0000000
--- a/apps/willrogers/src/main/public/stylesheets/demos/jquery-ui-1.10.3.custom.min.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/*! jQuery UI - v1.10.3 - 2013-07-15
-* http://jqueryui.com
-* Includes: jquery.ui.core.css, jquery.ui.resizable.css, jquery.ui.selectable.css, jquery.ui.accordion.css, jquery.ui.autocomplete.css, jquery.ui.button.css, jquery.ui.datepicker.css, jquery.ui.dialog.css, jquery.ui.menu.css, jquery.ui.progressbar.css, jquery.ui.slider.css, jquery.ui.spinner.css, jquery.ui.tabs.css, jquery.ui.tooltip.css
-* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
-* Copyright 2013 jQuery Foundation and other contributors Licensed MIT */.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted #000}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month-year{width:100%}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:700;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:21px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:0;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:0}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:400}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:400;margin:-1px}.ui-menu .ui-state-disabled{font-weight:400;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url(images/animated-overlay.gif);height:100%;filter:alpha(opacity=25);opacity:.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:0;background:0;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:0;border-bottom:0;border-right:0}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav li a{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active a,.ui-tabs .ui-tabs-nav li.ui-state-disabled a,.ui-tabs .ui-tabs-nav li.ui-tabs-loading a{cursor:text}.ui-tabs .ui-tabs-nav li a,.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active a{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:0}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url(images/ui-bg_highlight-soft_100_eeeeee_1x100.png) 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url(images/ui-bg_gloss-wave_35_f6a828_500x100.png) 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url(images/ui-bg_glass_100_f6f6f6_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url(images/ui-bg_glass_100_fdf5ce_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url(images/ui-bg_highlight-soft_75_ffe45c_1x100.png) 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url(images/ui-bg_diagonals-thick_18_b81900_40x40.png) 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_ffffff_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_ef8c08_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_228ef1_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_ffd27a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url(images/ui-bg_diagonals-thick_20_666666_40x40.png) 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url(images/ui-bg_flat_10_000000_40x100.png) 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px}
\ No newline at end of file
diff --git a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.css b/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.css
deleted file mode 100644
index d57b597..0000000
--- a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.css
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
- width: 100%;
- margin: 0 auto;
- clear: both;
- border-collapse: separate;
- border-spacing: 0;
- /*
- * Header and footer styles
- */
- /*
- * Body styles
- */
-}
-table.dataTable thead th,
-table.dataTable tfoot th {
- font-weight: bold;
-}
-table.dataTable thead th,
-table.dataTable thead td {
- padding: 10px 18px;
- border-bottom: 1px solid #111111;
-}
-table.dataTable thead th:active,
-table.dataTable thead td:active {
- outline: none;
-}
-table.dataTable tfoot th,
-table.dataTable tfoot td {
- padding: 10px 18px 6px 18px;
- border-top: 1px solid #111111;
-}
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting {
- cursor: pointer;
- *cursor: hand;
-}
-table.dataTable thead .sorting {
- background: url("../images/sort_both.png") no-repeat center right;
-}
-table.dataTable thead .sorting_asc {
- background: url("../images/sort_asc.png") no-repeat center right;
-}
-table.dataTable thead .sorting_desc {
- background: url("../images/sort_desc.png") no-repeat center right;
-}
-table.dataTable thead .sorting_asc_disabled {
- background: url("../images/sort_asc_disabled.png") no-repeat center right;
-}
-table.dataTable thead .sorting_desc_disabled {
- background: url("../images/sort_desc_disabled.png") no-repeat center right;
-}
-table.dataTable tbody tr {
- background-color: white;
-}
-table.dataTable tbody tr.selected {
- background-color: #b0bed9;
-}
-table.dataTable tbody th,
-table.dataTable tbody td {
- padding: 8px 10px;
-}
-table.dataTable th.center,
-table.dataTable td.center,
-table.dataTable td.dataTables_empty {
- text-align: center;
-}
-table.dataTable th.right,
-table.dataTable td.right {
- text-align: right;
-}
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
- border-top: 1px solid #dddddd;
-}
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
- border-top: none;
-}
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
- border-top: 1px solid #dddddd;
- border-right: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
- border-left: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
- border-top: none;
-}
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
- background-color: #f9f9f9;
-}
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
- background-color: #abb9d3;
-}
-table.dataTable.hover tbody tr:hover,
-table.dataTable.hover tbody tr.odd:hover,
-table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
-table.dataTable.display tbody tr.odd:hover,
-table.dataTable.display tbody tr.even:hover {
- background-color: whitesmoke;
-}
-table.dataTable.hover tbody tr:hover.selected,
-table.dataTable.hover tbody tr.odd:hover.selected,
-table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
-table.dataTable.display tbody tr.odd:hover.selected,
-table.dataTable.display tbody tr.even:hover.selected {
- background-color: #a9b7d1;
-}
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
- background-color: #f9f9f9;
-}
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
- background-color: #acbad4;
-}
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
- background-color: #f1f1f1;
-}
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
- background-color: #f3f3f3;
-}
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
- background-color: whitesmoke;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
- background-color: #a6b3cd;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
- background-color: #a7b5ce;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
- background-color: #a9b6d0;
-}
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
- background-color: #f9f9f9;
-}
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
- background-color: #fbfbfb;
-}
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
- background-color: #fdfdfd;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
- background-color: #acbad4;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
- background-color: #adbbd6;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
- background-color: #afbdd8;
-}
-table.dataTable.display tbody tr:hover > .sorting_1,
-table.dataTable.display tbody tr.odd:hover > .sorting_1,
-table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
- background-color: #eaeaea;
-}
-table.dataTable.display tbody tr:hover > .sorting_2,
-table.dataTable.display tbody tr.odd:hover > .sorting_2,
-table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
- background-color: #ebebeb;
-}
-table.dataTable.display tbody tr:hover > .sorting_3,
-table.dataTable.display tbody tr.odd:hover > .sorting_3,
-table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
- background-color: #eeeeee;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
- background-color: #a1aec7;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
- background-color: #a2afc8;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
- background-color: #a4b2cb;
-}
-table.dataTable.no-footer {
- border-bottom: 1px solid #111111;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
- position: relative;
- clear: both;
- *zoom: 1;
- zoom: 1;
-}
-.dataTables_wrapper .dataTables_length {
- float: left;
-}
-.dataTables_wrapper .dataTables_filter {
- float: right;
- text-align: right;
-}
-.dataTables_wrapper .dataTables_filter input {
- margin-left: 0.5em;
-}
-.dataTables_wrapper .dataTables_info {
- clear: both;
- float: left;
- padding-top: 0.755em;
-}
-.dataTables_wrapper .dataTables_paginate {
- float: right;
- text-align: right;
- padding-top: 0.25em;
-}
-.dataTables_wrapper .dataTables_paginate .paginate_button {
- box-sizing: border-box;
- display: inline-block;
- min-width: 1.5em;
- padding: 0.5em 1em;
- margin-left: 2px;
- text-align: center;
- text-decoration: none !important;
- cursor: pointer;
- *cursor: hand;
- color: #333333 !important;
- border: 1px solid transparent;
-}
-.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
- color: #333333 !important;
- border: 1px solid #cacaca;
- background-color: white;
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, gainsboro));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, white 0%, gainsboro 100%);
- /* Chrome10+,Safari5.1+ */
- background: -moz-linear-gradient(top, white 0%, gainsboro 100%);
- /* FF3.6+ */
- background: -ms-linear-gradient(top, white 0%, gainsboro 100%);
- /* IE10+ */
- background: -o-linear-gradient(top, white 0%, gainsboro 100%);
- /* Opera 11.10+ */
- background: linear-gradient(to bottom, white 0%, gainsboro 100%);
- /* W3C */
-}
-.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
- cursor: default;
- color: #666 !important;
- border: 1px solid transparent;
- background: transparent;
- box-shadow: none;
-}
-.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
- color: white !important;
- border: 1px solid #111111;
- background-color: #585858;
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111111));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, #585858 0%, #111111 100%);
- /* Chrome10+,Safari5.1+ */
- background: -moz-linear-gradient(top, #585858 0%, #111111 100%);
- /* FF3.6+ */
- background: -ms-linear-gradient(top, #585858 0%, #111111 100%);
- /* IE10+ */
- background: -o-linear-gradient(top, #585858 0%, #111111 100%);
- /* Opera 11.10+ */
- background: linear-gradient(to bottom, #585858 0%, #111111 100%);
- /* W3C */
-}
-.dataTables_wrapper .dataTables_paginate .paginate_button:active {
- outline: none;
- background-color: #2b2b2b;
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
- /* Chrome10+,Safari5.1+ */
- background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
- /* FF3.6+ */
- background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
- /* IE10+ */
- background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
- /* Opera 11.10+ */
- background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
- /* W3C */
- box-shadow: inset 0 0 3px #111;
-}
-.dataTables_wrapper .dataTables_processing {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100%;
- height: 40px;
- margin-left: -50%;
- margin-top: -25px;
- padding-top: 20px;
- text-align: center;
- font-size: 1.2em;
- background-color: white;
- background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* Chrome10+,Safari5.1+ */
- background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* FF3.6+ */
- background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* IE10+ */
- background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* Opera 11.10+ */
- background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* W3C */
-}
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
- color: #333333;
-}
-.dataTables_wrapper .dataTables_scroll {
- clear: both;
-}
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
- *margin-top: -1px;
- -webkit-overflow-scrolling: touch;
-}
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
-.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
- height: 0;
- overflow: hidden;
- margin: 0 !important;
- padding: 0 !important;
-}
-.dataTables_wrapper.no-footer .dataTables_scrollBody {
- border-bottom: 1px solid #111111;
-}
-.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
-.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
- border-bottom: none;
-}
-.dataTables_wrapper:after {
- visibility: hidden;
- display: block;
- content: "";
- clear: both;
- height: 0;
-}
-
-@media screen and (max-width: 767px) {
- .dataTables_wrapper .dataTables_info,
- .dataTables_wrapper .dataTables_paginate {
- float: none;
- text-align: center;
- }
- .dataTables_wrapper .dataTables_paginate {
- margin-top: 0.5em;
- }
-}
-@media screen and (max-width: 640px) {
- .dataTables_wrapper .dataTables_length,
- .dataTables_wrapper .dataTables_filter {
- float: none;
- text-align: center;
- }
- .dataTables_wrapper .dataTables_filter {
- margin-top: 0.5em;
- }
-}
diff --git a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.min.css b/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.min.css
deleted file mode 100644
index 037a3bb..0000000
--- a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url("../images/sort_both.png") no-repeat center right}table.dataTable thead .sorting_asc{background:url("../images/sort_asc.png") no-repeat center right}table.dataTable thead .sorting_desc{background:url("../images/sort_desc.png") no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url("../images/sort_asc_disabled.png") no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url("../images/sort_desc_disabled.png") no-repeat center right}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable th.center,table.dataTable td.center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.right,table.dataTable td.right{text-align:right}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}}
diff --git a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.css b/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.css
deleted file mode 100644
index 5a56d97..0000000
--- a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.css
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Table styles
- */
-table.dataTable {
- width: 100%;
- margin: 0 auto;
- clear: both;
- border-collapse: separate;
- border-spacing: 0;
- /*
- * Header and footer styles
- */
- /*
- * Body styles
- */
-}
-table.dataTable thead th,
-table.dataTable thead td,
-table.dataTable tfoot th,
-table.dataTable tfoot td {
- padding: 4px 10px;
-}
-table.dataTable thead th,
-table.dataTable tfoot th {
- font-weight: bold;
-}
-table.dataTable thead th:active,
-table.dataTable thead td:active {
- outline: none;
-}
-table.dataTable thead .sorting_asc,
-table.dataTable thead .sorting_desc,
-table.dataTable thead .sorting {
- cursor: pointer;
- *cursor: hand;
-}
-table.dataTable thead th div.DataTables_sort_wrapper {
- position: relative;
- padding-right: 10px;
-}
-table.dataTable thead th div.DataTables_sort_wrapper span {
- position: absolute;
- top: 50%;
- margin-top: -8px;
- right: -5px;
-}
-table.dataTable thead th.ui-state-default {
- border-right-width: 0;
-}
-table.dataTable thead th.ui-state-default:last-child {
- border-right-width: 1px;
-}
-table.dataTable tbody tr {
- background-color: white;
-}
-table.dataTable tbody tr.selected {
- background-color: #b0bed9;
-}
-table.dataTable tbody th,
-table.dataTable tbody td {
- padding: 8px 10px;
-}
-table.dataTable th.center,
-table.dataTable td.center,
-table.dataTable td.dataTables_empty {
- text-align: center;
-}
-table.dataTable th.right,
-table.dataTable td.right {
- text-align: right;
-}
-table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
- border-top: 1px solid #dddddd;
-}
-table.dataTable.row-border tbody tr:first-child th,
-table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
-table.dataTable.display tbody tr:first-child td {
- border-top: none;
-}
-table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
- border-top: 1px solid #dddddd;
- border-right: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr th:first-child,
-table.dataTable.cell-border tbody tr td:first-child {
- border-left: 1px solid #dddddd;
-}
-table.dataTable.cell-border tbody tr:first-child th,
-table.dataTable.cell-border tbody tr:first-child td {
- border-top: none;
-}
-table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
- background-color: #f9f9f9;
-}
-table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
- background-color: #abb9d3;
-}
-table.dataTable.hover tbody tr:hover,
-table.dataTable.hover tbody tr.odd:hover,
-table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
-table.dataTable.display tbody tr.odd:hover,
-table.dataTable.display tbody tr.even:hover {
- background-color: whitesmoke;
-}
-table.dataTable.hover tbody tr:hover.selected,
-table.dataTable.hover tbody tr.odd:hover.selected,
-table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
-table.dataTable.display tbody tr.odd:hover.selected,
-table.dataTable.display tbody tr.even:hover.selected {
- background-color: #a9b7d1;
-}
-table.dataTable.order-column tbody tr > .sorting_1,
-table.dataTable.order-column tbody tr > .sorting_2,
-table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
-table.dataTable.display tbody tr > .sorting_2,
-table.dataTable.display tbody tr > .sorting_3 {
- background-color: #f9f9f9;
-}
-table.dataTable.order-column tbody tr.selected > .sorting_1,
-table.dataTable.order-column tbody tr.selected > .sorting_2,
-table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
-table.dataTable.display tbody tr.selected > .sorting_2,
-table.dataTable.display tbody tr.selected > .sorting_3 {
- background-color: #acbad4;
-}
-table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
- background-color: #f1f1f1;
-}
-table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
- background-color: #f3f3f3;
-}
-table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
- background-color: whitesmoke;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
- background-color: #a6b3cd;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
- background-color: #a7b5ce;
-}
-table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
- background-color: #a9b6d0;
-}
-table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
- background-color: #f9f9f9;
-}
-table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
- background-color: #fbfbfb;
-}
-table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
- background-color: #fdfdfd;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
- background-color: #acbad4;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
- background-color: #adbbd6;
-}
-table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
- background-color: #afbdd8;
-}
-table.dataTable.display tbody tr:hover > .sorting_1,
-table.dataTable.display tbody tr.odd:hover > .sorting_1,
-table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
- background-color: #eaeaea;
-}
-table.dataTable.display tbody tr:hover > .sorting_2,
-table.dataTable.display tbody tr.odd:hover > .sorting_2,
-table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
- background-color: #ebebeb;
-}
-table.dataTable.display tbody tr:hover > .sorting_3,
-table.dataTable.display tbody tr.odd:hover > .sorting_3,
-table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
- background-color: #eeeeee;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
- background-color: #a1aec7;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
- background-color: #a2afc8;
-}
-table.dataTable.display tbody tr:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
-table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
- background-color: #a4b2cb;
-}
-
-table.dataTable,
-table.dataTable th,
-table.dataTable td {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
-}
-
-/*
- * Control feature layout
- */
-.dataTables_wrapper {
- position: relative;
- clear: both;
- *zoom: 1;
- zoom: 1;
-}
-.dataTables_wrapper .dataTables_length {
- float: left;
-}
-.dataTables_wrapper .dataTables_filter {
- float: right;
- text-align: right;
-}
-.dataTables_wrapper .dataTables_filter input {
- margin-left: 0.5em;
-}
-.dataTables_wrapper .dataTables_info {
- clear: both;
- float: left;
- padding-top: 0.55em;
-}
-.dataTables_wrapper .dataTables_paginate {
- float: right;
- text-align: right;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button {
- box-sizing: border-box;
- display: inline-block;
- min-width: 1.5em;
- padding: 0.5em;
- margin-left: 2px;
- text-align: center;
- text-decoration: none !important;
- cursor: pointer;
- *cursor: hand;
- color: #333333 !important;
- border: 1px solid transparent;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:active {
- outline: none;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:first-child {
- border-top-left-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-.dataTables_wrapper .dataTables_paginate .fg-button:last-child {
- border-top-right-radius: 3px;
- border-bottom-right-radius: 3px;
-}
-.dataTables_wrapper .dataTables_processing {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 100%;
- height: 40px;
- margin-left: -50%;
- margin-top: -25px;
- padding-top: 20px;
- text-align: center;
- font-size: 1.2em;
- background-color: white;
- background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
- /* Chrome,Safari4+ */
- background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* Chrome10+,Safari5.1+ */
- background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* FF3.6+ */
- background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* IE10+ */
- background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* Opera 11.10+ */
- background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
- /* W3C */
-}
-.dataTables_wrapper .dataTables_length,
-.dataTables_wrapper .dataTables_filter,
-.dataTables_wrapper .dataTables_info,
-.dataTables_wrapper .dataTables_processing,
-.dataTables_wrapper .dataTables_paginate {
- color: #333333;
-}
-.dataTables_wrapper .dataTables_scroll {
- clear: both;
-}
-.dataTables_wrapper .dataTables_scrollBody {
- *margin-top: -1px;
- -webkit-overflow-scrolling: touch;
-}
-.dataTables_wrapper .ui-widget-header {
- font-weight: normal;
-}
-.dataTables_wrapper .ui-toolbar {
- padding: 8px;
-}
-.dataTables_wrapper:after {
- visibility: hidden;
- display: block;
- content: "";
- clear: both;
- height: 0;
-}
-
-@media screen and (max-width: 767px) {
- .dataTables_wrapper .dataTables_length,
- .dataTables_wrapper .dataTables_filter,
- .dataTables_wrapper .dataTables_info,
- .dataTables_wrapper .dataTables_paginate {
- float: none;
- text-align: center;
- }
- .dataTables_wrapper .dataTables_filter,
- .dataTables_wrapper .dataTables_paginate {
- margin-top: 0.5em;
- }
-}
diff --git a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.min.css b/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.min.css
deleted file mode 100644
index 8847f80..0000000
--- a/apps/willrogers/src/main/public/stylesheets/demos/jquery.dataTables_themeroller.min.css
+++ /dev/null
@@ -1 +0,0 @@
-table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{padding:4px 10px}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead th div.DataTables_sort_wrapper{position:relative;padding-right:10px}table.dataTable thead th div.DataTables_sort_wrapper span{position:absolute;top:50%;margin-top:-8px;right:-5px}table.dataTable thead th.ui-state-default{border-right-width:0}table.dataTable thead th.ui-state-default:last-child{border-right-width:1px}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable th.center,table.dataTable td.center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.right,table.dataTable td.right{text-align:right}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.55em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right}.dataTables_wrapper .dataTables_paginate .fg-button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .fg-button:active{outline:none}.dataTables_wrapper .dataTables_paginate .fg-button:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.dataTables_wrapper .dataTables_paginate .fg-button:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .ui-widget-header{font-weight:normal}.dataTables_wrapper .ui-toolbar{padding:8px}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}
diff --git a/apps/willrogers/src/main/public/stylesheets/jquery.tablescroll.css b/apps/willrogers/src/main/public/stylesheets/jquery.tablescroll.css
deleted file mode 100644
index d6617a8..0000000
--- a/apps/willrogers/src/main/public/stylesheets/jquery.tablescroll.css
+++ /dev/null
@@ -1,32 +0,0 @@
-.tablescroll
-{ font: 12px normal Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif; background-color:#fff; }
-
-.tablescroll td,
-.tablescroll_wrapper,
-.tablescroll_head,
-.tablescroll_foot
-{ border:1px solid #ccc; }
-
-.tablescroll td
-{ padding:3px 5px; }
-
-.tablescroll_wrapper
-{ border-left:0; }
-
-.tablescroll_head
-{ font-size:11px; font-weight:bold; background-color:#eee; border-left:0; border-top:0; margin-bottom:3px; }
-
-.tablescroll thead td
-{ border-right:0; border-bottom:0; }
-
-.tablescroll tbody td
-{ border-right:0; border-bottom:0; }
-
-.tablescroll tbody tr.first td
-{ border-top:0; }
-
-.tablescroll_foot
-{ font-weight:bold; background-color:#eee; border-left:0; border-top:0; margin-top:3px; }
-
-.tablescroll tfoot td
-{ border-right:0; border-bottom:0; }
\ No newline at end of file
diff --git a/apps/willrogers/src/main/public/stylesheets/main.css b/apps/willrogers/src/main/public/stylesheets/main.css
deleted file mode 100644
index fd5bfae..0000000
--- a/apps/willrogers/src/main/public/stylesheets/main.css
+++ /dev/null
@@ -1,63 +0,0 @@
-
-div#gridPanel
-{
- width:900px;
- overflow:scroll;
- position:relative;
-}
-
-
-div#gridPanel th
-{
- top: expression(document.getElementById("gridPanel").scrollTop-2);
- left:expression(parentNode.parentNode.parentNode.parentNode.scrollLeft);
- position: relative;
- z-index: 20;
-}
-
-div.inLineDivContainer {
-
- overflow:hidden;
- margin:auto;
-}
-
-div.inLineDiv {
- float:left;
- overflow:auto;
- width:75%;
- margin: 5px;
-}
-
-div.inLineDiv#logHistoryMenu {
- width: 20%;
- overflow:hidden;
-
-}
-
-
-label
-{
- float:left;
- display:block;
- clear:both;
- width:200px;
-}
-
-.ui-logHistoryMenu {
- overflow:hidden;
- width: 150px;
-}
-
-.slick-row:hover {
- background-color:#cdcdcd;
-}
-
-}
-
-/* to break up long paths Source: http://snipplr.com/view/10979/css-cross-browser-word-wrap */
-.wordwrap {
- white-space: pre-wrap; /* CSS3 */
- white-space: -moz-pre-wrap; /* Firefox */
- white-space: -o-pre-wrap; /* Opera 7 */
- word-wrap: break-word; /* IE */
- }
\ No newline at end of file
diff --git a/apps/willrogers/src/main/public/stylesheets/slick-default-theme.css b/apps/willrogers/src/main/public/stylesheets/slick-default-theme.css
deleted file mode 100644
index efc7415..0000000
--- a/apps/willrogers/src/main/public/stylesheets/slick-default-theme.css
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-IMPORTANT:
-In order to preserve the uniform grid appearance, all cell styles need to have padding, margin and border sizes.
-No built-in (selected, editable, highlight, flashing, invalid, loading, :focus) or user-specified CSS
-classes should alter those!
-*/
-
-.slick-header-columns {
- background: url('images/header-columns-bg.gif') repeat-x center bottom;
- border-bottom: 1px solid silver;
-}
-
-.slick-header-column {
- background: url('images/header-columns-bg.gif') repeat-x center bottom;
- border-right: 1px solid silver;
-}
-
-.slick-header-column:hover, .slick-header-column-active {
- background: white url('images/header-columns-over-bg.gif') repeat-x center bottom;
-}
-
-.slick-headerrow {
- background: #fafafa;
-}
-
-.slick-headerrow-column {
- background: #fafafa;
- border-bottom: 0;
- height: 100%;
-}
-
-.slick-row.ui-state-active {
- background: #F5F7D7;
-}
-
-.slick-row {
- position: absolute;
- background: white;
- border: 0px;
- line-height: 20px;
-}
-
-.slick-row.selected {
- z-index: 10;
- background: #DFE8F6;
-}
-
-.slick-cell {
- padding-left: 4px;
- padding-right: 4px;
-}
-
-.slick-group {
- border-bottom: 2px solid silver;
-}
-
-.slick-group-toggle {
- width: 9px;
- height: 9px;
- margin-right: 5px;
-}
-
-.slick-group-toggle.expanded {
- background: url(images/collapse.gif) no-repeat center center;
-}
-
-.slick-group-toggle.collapsed {
- background: url(images/expand.gif) no-repeat center center;
-}
-
-.slick-group-totals {
- color: gray;
- background: white;
-}
-
-.slick-cell.selected {
- background-color: beige;
-}
-
-.slick-cell.active {
- border-color: gray;
- border-style: solid;
-}
-
-.slick-sortable-placeholder {
- background: silver !important;
-}
-
-.slick-row.odd {
- background: #fafafa;
-}
-
-.slick-row.ui-state-active {
- background: #F5F7D7;
-}
-
-.slick-row.loading {
- opacity: 0.5;
- filter: alpha(opacity = 50);
-}
-
-.slick-cell.invalid {
- border-color: red;
- -moz-animation-duration: 0.2s;
- -webkit-animation-duration: 0.2s;
- -moz-animation-name: slickgrid-invalid-hilite;
- -webkit-animation-name: slickgrid-invalid-hilite;
-}
-
-@-moz-keyframes slickgrid-invalid-hilite {
- from { box-shadow: 0 0 6px red; }
- to { box-shadow: none; }
-}
-
-@-webkit-keyframes slickgrid-invalid-hilite {
- from { box-shadow: 0 0 6px red; }
- to { box-shadow: none; }
-}
\ No newline at end of file
diff --git a/apps/willrogers/src/main/public/stylesheets/slick.columnpicker.css b/apps/willrogers/src/main/public/stylesheets/slick.columnpicker.css
deleted file mode 100644
index bcbb375..0000000
--- a/apps/willrogers/src/main/public/stylesheets/slick.columnpicker.css
+++ /dev/null
@@ -1,31 +0,0 @@
-.slick-columnpicker {
- border: 1px solid #718BB7;
- background: #f0f0f0;
- padding: 6px;
- -moz-box-shadow: 2px 2px 2px silver;
- -webkit-box-shadow: 2px 2px 2px silver;
- box-shadow: 2px 2px 2px silver;
- min-width: 100px;
- cursor: default;
-}
-
-.slick-columnpicker li {
- list-style: none;
- margin: 0;
- padding: 0;
- background: none;
-}
-
-.slick-columnpicker input {
- margin: 4px;
-}
-
-.slick-columnpicker li a {
- display: block;
- padding: 4px;
- font-weight: bold;
-}
-
-.slick-columnpicker li a:hover {
- background: white;
-}
diff --git a/apps/willrogers/src/main/public/stylesheets/slick.grid.css b/apps/willrogers/src/main/public/stylesheets/slick.grid.css
deleted file mode 100644
index 6a416db..0000000
--- a/apps/willrogers/src/main/public/stylesheets/slick.grid.css
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
-IMPORTANT:
-In order to preserve the uniform grid appearance, all cell styles need to have padding, margin and border sizes.
-No built-in (selected, editable, highlight, flashing, invalid, loading, :focus) or user-specified CSS
-classes should alter those!
-*/
-
-.slick-header.ui-state-default, .slick-headerrow.ui-state-default {
- width: 100%;
- overflow: hidden;
- border-left: 0px;
-}
-
-.slick-header-columns, .slick-headerrow-columns {
- position: relative;
- white-space: nowrap;
- cursor: default;
- overflow: hidden;
-}
-
-.slick-header-column.ui-state-default {
- position: relative;
- display: inline-block;
- overflow: hidden;
- -o-text-overflow: ellipsis;
- text-overflow: ellipsis;
- height: 16px;
- line-height: 16px;
- margin: 0;
- padding: 4px;
- border-right: 1px solid silver;
- border-left: 0px;
- border-top: 0px;
- border-bottom: 0px;
- float: left;
-}
-
-.slick-headerrow-column.ui-state-default {
- padding: 4px;
-}
-
-.slick-header-column-sorted {
- font-style: italic;
-}
-
-.slick-sort-indicator {
- display: inline-block;
- width: 8px;
- height: 5px;
- margin-left: 4px;
- margin-top: 6px;
- float: left;
-}
-
-.slick-sort-indicator-desc {
- background: url(images/sort-desc.gif);
-}
-
-.slick-sort-indicator-asc {
- background: url(images/sort-asc.gif);
-}
-
-.slick-resizable-handle {
- position: absolute;
- font-size: 0.1px;
- display: block;
- cursor: col-resize;
- width: 4px;
- right: 0px;
- top: 0;
- height: 100%;
-}
-
-.slick-sortable-placeholder {
- background: silver;
-}
-
-.grid-canvas {
- position: relative;
- outline: 0;
-}
-
-.slick-row.ui-widget-content, .slick-row.ui-state-active {
- position: absolute;
- border: 0px;
- width: 100%;
-}
-
-.slick-cell, .slick-headerrow-column {
- position: absolute;
- border: 1px solid transparent;
- border-right: 1px dotted silver;
- border-bottom-color: silver;
- overflow: hidden;
- -o-text-overflow: ellipsis;
- text-overflow: ellipsis;
- vertical-align: middle;
- z-index: 1;
- padding: 1px 2px 2px 1px;
- margin: 0;
- white-space: nowrap;
- cursor: default;
-}
-
-.slick-group {
-}
-
-.slick-group-toggle {
- display: inline-block;
-}
-
-.slick-cell.highlighted {
- background: lightskyblue;
- background: rgba(0, 0, 255, 0.2);
- -webkit-transition: all 0.5s;
- -moz-transition: all 0.5s;
- -o-transition: all 0.5s;
- transition: all 0.5s;
-}
-
-.slick-cell.flashing {
- border: 1px solid red !important;
-}
-
-.slick-cell.editable {
- z-index: 11;
- overflow: visible;
- background: white;
- border-color: black;
- border-style: solid;
-}
-
-.slick-cell:focus {
- outline: none;
-}
-
-.slick-reorder-proxy {
- display: inline-block;
- background: blue;
- opacity: 0.15;
- filter: alpha(opacity = 15);
- cursor: move;
-}
-
-.slick-reorder-guide {
- display: inline-block;
- height: 2px;
- background: blue;
- opacity: 0.7;
- filter: alpha(opacity = 70);
-}
-
-.slick-selection {
- z-index: 10;
- position: absolute;
- border: 2px dashed black;
-}
diff --git a/apps/willrogers/src/main/public/stylesheets/slick.pager.css b/apps/willrogers/src/main/public/stylesheets/slick.pager.css
deleted file mode 100644
index e360ec6..0000000
--- a/apps/willrogers/src/main/public/stylesheets/slick.pager.css
+++ /dev/null
@@ -1,41 +0,0 @@
-.slick-pager {
- width: 100%;
- height: 26px;
- border: 1px solid gray;
- border-top: 0;
- background: url('../images/header-columns-bg.gif') repeat-x center bottom;
- vertical-align: middle;
-}
-
-.slick-pager .slick-pager-status {
- display: inline-block;
- padding: 6px;
-}
-
-.slick-pager .ui-icon-container {
- display: inline-block;
- margin: 2px;
- border-color: gray;
-}
-
-.slick-pager .slick-pager-nav {
- display: inline-block;
- float: left;
- padding: 2px;
-}
-
-.slick-pager .slick-pager-settings {
- display: block;
- float: right;
- padding: 2px;
-}
-
-.slick-pager .slick-pager-settings * {
- vertical-align: middle;
-}
-
-.slick-pager .slick-pager-settings a {
- padding: 2px;
- text-decoration: underline;
- cursor: pointer;
-}
diff --git a/apps/willrogers/src/main/public~HEAD b/apps/willrogers/src/main/public~HEAD
new file mode 120000
index 0000000..0276007
--- /dev/null
+++ b/apps/willrogers/src/main/public~HEAD
@@ -0,0 +1 @@
+../../public/
\ No newline at end of file
diff --git a/modules/core/src/main/scala/satisfaction/Goal.scala b/modules/core/src/main/scala/satisfaction/Goal.scala
index edf0f5f..32a1e1e 100644
--- a/modules/core/src/main/scala/satisfaction/Goal.scala
+++ b/modules/core/src/main/scala/satisfaction/Goal.scala
@@ -79,6 +79,14 @@ case class Goal(
copy( dependencies = dependencies + Tuple2(rule, goal) )
}
+ def addVariable( vr : Variable[_]) : Goal = {
+ copy( variables = variables.+:( vr) )
+ }
+
+ def withVariables( varList : List[Variable[_]]) : Goal = {
+ copy( variables = varList )
+ }
+
/**
* Depend upon yesterday's output of the specified Goal
*/
@@ -147,11 +155,9 @@ case class Goal(
*/
def chainWitnessRules[T]( prevRule : ( Witness=>Witness) ,subGoal :Goal, foldVar : Variable[T], valIter : Traversable[T]) : Goal = {
val first = valIter.head
- println(s" HEAD is $first ")
val chained : Goal = valIter.drop(1).foldLeft( subGoal )( (g: Goal, vv : T) => {
val witnessMapping : ( Witness=>Witness) = Goal.qualifyWitness( foldVar, vv )
- println(s" ${g.name} CHAIN WITNESS RULE $vv ")
Goal(subGoal).addWitnessRule( witnessMapping,g)
} )
//// apply the composed rule onto the first value, and then
diff --git a/modules/core/src/main/scala/satisfaction/TemporalVariable.scala b/modules/core/src/main/scala/satisfaction/TemporalVariable.scala
index b934074..d4c3eaf 100644
--- a/modules/core/src/main/scala/satisfaction/TemporalVariable.scala
+++ b/modules/core/src/main/scala/satisfaction/TemporalVariable.scala
@@ -29,17 +29,21 @@ trait TemporalVariable { self : Variable[String] =>
lazy val formatter : DateTimeFormatter = DateTimeFormat.forPattern( formatString)
- {
- TemporalVariable.register( this)
- }
-
-
}
object TemporalVariable {
import Temporal._
private val _tvMap : scala.collection.mutable.Map[String,TemporalVariable] = scala.collection.mutable.HashMap.empty
+
+
+ val registered = {
+ register( Dt)
+ register( Hour)
+ register( Date)
+ register( Minute)
+ register( StartTime)
+ }
def register( tv :TemporalVariable ) = {
_tvMap.put(tv.asInstanceOf[Variable[_]].name, tv)
@@ -48,7 +52,7 @@ trait TemporalVariable { self : Variable[String] =>
def isTemporalVariable( v : Variable[_] ) : Option[TemporalVariable] = {
v match {
case tv : TemporalVariable => Some(tv)
- case vStr : Variable[String] => _tvMap.get( vStr.name)
+ case vStr : Variable[_] => _tvMap.get( vStr.name)
case _ => None
}
}
@@ -57,10 +61,11 @@ trait TemporalVariable { self : Variable[String] =>
object Dt extends Variable[String]("dt", classOf[String], Some("Daily Frequency")) with TemporalVariable {
override val formatString = dailyFormat
override val frequency = dailyPeriod
+
}
/// Alternative Daily Frequency VAr
- object Date extends Variable[String]("date", classOf[String], Some("Alternative Daily Frequency Varr")) with TemporalVariable {
+ object Date extends Variable[String]("date", classOf[String], Some("Alternative Daily Frequency Var")) with TemporalVariable {
override val formatString = dailyFormat
override val frequency = dailyPeriod
}
diff --git a/modules/core/src/main/scala/satisfaction/Track.scala b/modules/core/src/main/scala/satisfaction/Track.scala
index 7aed8ca..1c025b4 100644
--- a/modules/core/src/main/scala/satisfaction/Track.scala
+++ b/modules/core/src/main/scala/satisfaction/Track.scala
@@ -233,21 +233,21 @@ case class Track(
}
- def listResources : Seq[Path] = {
+ def listResources : Iterable[Path] = {
///hdfs.listFiles( resourcePath ).map( _.path.name )
_cachedListResources.get()
}
- private val _cachedListResources = new CachedOne[Seq[Path]]( {
+ private val _cachedListResources = new CachedOne[Iterable[Path]]( {
hdfs.synchronized {
hdfs.listFiles( resourcePath ).map( _.path )
}
} )
- def listLibraries : Seq[Path] = {
+ def listLibraries : Iterable[Path] = {
///hdfs.listFiles( resourcePath ).map( _.path.name )
_cachedListLibraries.get()
}
- private val _cachedListLibraries = new CachedOne[Seq[Path]]( {
+ private val _cachedListLibraries = new CachedOne[Iterable[Path]]( {
hdfs.synchronized {
hdfs.listFiles( libPath ).map( _.path )
}
diff --git a/modules/core/src/main/scala/satisfaction/fs/FileSystem.scala b/modules/core/src/main/scala/satisfaction/fs/FileSystem.scala
index ff57a52..4a02de9 100644
--- a/modules/core/src/main/scala/satisfaction/fs/FileSystem.scala
+++ b/modules/core/src/main/scala/satisfaction/fs/FileSystem.scala
@@ -3,6 +3,7 @@ package satisfaction.fs
import java.io.ByteArrayOutputStream
import org.joda.time.DateTime
+import Path._
/**
* Want to mock out FileSystem and MetaStore into traits
@@ -16,12 +17,21 @@ import org.joda.time.DateTime
trait FileSystem {
def uri : java.net.URI
- def listFiles( p : Path ) : Seq[FileStatus]
- def listFilesRecursively( p : Path ) : Seq[FileStatus]
+ def listFiles( p : Path ) : Iterable[FileStatus]
+ def listFilesRecursively( p : Path ) : Iterable[FileStatus]
- def globFiles( p: Path, filterFunc : (FileStatus=>Boolean)) : Seq[FileStatus] = {
+ def listFiles( p : Path, filterFunc : PathFilter ) : Iterable[FileStatus] = {
+ listFiles(p).filter( filterFunc)
+ }
+
+ def listFilesRecursively( p : Path, filterFunc : PathFilter ) : Iterable[FileStatus] = {
listFilesRecursively( p).filter( filterFunc)
}
+
+ def globFiles( p: Path) : Iterable[FileStatus]
+ def globFiles( p: Path, filterFunc : PathFilter ) : Iterable[FileStatus] = {
+ globFiles(p).filter(filterFunc)
+ }
def mkdirs( p : Path ) : Boolean
diff --git a/modules/core/src/main/scala/satisfaction/fs/LocalFs.scala b/modules/core/src/main/scala/satisfaction/fs/LocalFs.scala
index 23fa3d5..9cff096 100644
--- a/modules/core/src/main/scala/satisfaction/fs/LocalFs.scala
+++ b/modules/core/src/main/scala/satisfaction/fs/LocalFs.scala
@@ -9,8 +9,12 @@ import org.joda.time.DateTime
*
* XXX Add unit tests for local file operations
*/
-case class LocalFileSystem() extends FileSystem {
+case class LocalFileSystem( val nfs : java.nio.file.FileSystem = java.nio.file.FileSystems.getDefault) extends FileSystem {
+ def this() = {
+ this( java.nio.file.FileSystems.getDefault)
+ }
+
case class LocalFStatus( file : java.io.File ) extends FileStatus {
override def size : Long = {
@@ -81,6 +85,11 @@ case class LocalFileSystem() extends FileSystem {
} ).flatten
}
+ override def globFiles( p: Path) : Seq[FileStatus] = {
+ val pathMatcher = nfs.getPathMatcher( p.toString )
+ null
+ }
+
override def mkdirs( p : Path ) : Boolean = {
(p).mkdirs
}
@@ -124,7 +133,7 @@ case class LocalFileSystem() extends FileSystem {
}
-object LocalFileSystem extends LocalFileSystem {
+object LocalFileSystem extends LocalFileSystem( java.nio.file.FileSystems.getDefault) {
def currentDirectory : Path = {
new Path( System.getProperty("user.dir"))
}
diff --git a/modules/core/src/main/scala/satisfaction/fs/Path.scala b/modules/core/src/main/scala/satisfaction/fs/Path.scala
index bc5bf42..77b9a46 100644
--- a/modules/core/src/main/scala/satisfaction/fs/Path.scala
+++ b/modules/core/src/main/scala/satisfaction/fs/Path.scala
@@ -100,6 +100,9 @@ class PathSequence( val bottomPath : Path ) extends Seq[Path] {
}
}
+
object Path {
+ type PathFilter = (FileStatus) => Boolean
}
+
diff --git a/modules/core/src/test/scala/satisfaction/SubstitutionSpec.scala b/modules/core/src/test/scala/satisfaction/SubstitutionSpec.scala
index cc137ad..d682eed 100644
--- a/modules/core/src/test/scala/satisfaction/SubstitutionSpec.scala
+++ b/modules/core/src/test/scala/satisfaction/SubstitutionSpec.scala
@@ -9,6 +9,12 @@ import org.junit.runner.RunWith
class WitnessSpec extends Specification {
"WitnessUtils" should {
+<<<<<<< HEAD
+ "checkPath" should {
+
+ }
+=======
+>>>>>>> 133b57614f6c29c04c8e4fce1bc88320ef1adfbe
"find variables in string " in {
val str = " select * from my_view_${networkAbbr} where dt= ${dateString} "
diff --git a/modules/core/src/test/scala/satisfaction/TemporalSpec.scala b/modules/core/src/test/scala/satisfaction/TemporalSpec.scala
index 92a1864..6b96891 100644
--- a/modules/core/src/test/scala/satisfaction/TemporalSpec.scala
+++ b/modules/core/src/test/scala/satisfaction/TemporalSpec.scala
@@ -11,7 +11,10 @@ class TemporalSpec extends Specification {
"TemporalVariables" should {
+<<<<<<< HEAD
+=======
+>>>>>>> 133b57614f6c29c04c8e4fce1bc88320ef1adfbe
"Produce hourly ranges" in {
Temporal.hours foreach println
@@ -65,6 +68,13 @@ class TemporalSpec extends Specification {
strWitness.contains( TemporalVariable.Dt ) must_== true
}
+ "TemporalVariable.isTemporal" in {
+ import TemporalVariable._
+ TemporalVariable.isTemporalVariable( Variable("hour") ) match {
+ case Some(hour) => { hour == TemporalVariable.Hour }
+ case None => false
+ }
+ }
}
diff --git a/modules/engine/.project b/modules/engine/.project
new file mode 100644
index 0000000..5d75ed5
--- /dev/null
+++ b/modules/engine/.project
@@ -0,0 +1,13 @@
+
+ satisfaction-engine
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
+
\ No newline at end of file
diff --git a/modules/engine/src/main/scala/reference.conf b/modules/engine/src/main/scala/reference.conf
new file mode 100644
index 0000000..6dd7636
--- /dev/null
+++ b/modules/engine/src/main/scala/reference.conf
@@ -0,0 +1,10 @@
+
+
+akka {
+ actor {
+ default-dispatcher {
+ executor = "thread-pool-executor"
+ type = PinnedDispatcher
+ }
+ }
+}
diff --git a/modules/engine/src/main/scala/satisfaction/engine/actors/JobRunner.scala b/modules/engine/src/main/scala/satisfaction/engine/actors/JobRunner.scala
index e022084..0995dcd 100644
--- a/modules/engine/src/main/scala/satisfaction/engine/actors/JobRunner.scala
+++ b/modules/engine/src/main/scala/satisfaction/engine/actors/JobRunner.scala
@@ -19,6 +19,11 @@ import org.joda.time.DateTime
import scala.util.Success
import scala.util.Failure
import satisfaction.RobustRun
+import java.util.concurrent.ForkJoinPool
+import com.typesafe.config.ConfigFactory
+import java.util.concurrent.ThreadPoolExecutor
+import java.util.concurrent.TimeUnit
+import java.util.concurrent.ArrayBlockingQueue
/**
* JobRunner actually satisfies a goal,
@@ -32,7 +37,11 @@ class JobRunner(
params: Witness ) extends Actor with ActorLogging {
- implicit val executionContext : ExecutionContext = ExecutionContext.global
+ //// Create our own Thread pool for running our own jobs...
+ //// rather then mess with the Akka or play threads
+ lazy implicit val executionContext : ExecutionContext = {
+ JobRunner.executorPool( track.trackProperties)
+ }
private var _messageSender: ActorRef = null
def messageSender = _messageSender
@@ -213,5 +222,23 @@ object JobRunner {
Thread.currentThread.setContextClassLoader(thClBefore)
res
}
+
+
+ private var _globalPool : ExecutionContext = null
+ def executorPool( properties : java.util.Properties) : ExecutionContext = {
+ if( _globalPool == null) {
+ val numCores = Runtime.getRuntime().availableProcessors();
+ val corePoolSize = properties.getProperty("satisfaction.jobrunner.corePoolSize", numCores.toString).toInt
+ val maxPoolSize = properties.getProperty("satisfaction.jobrunner.maxPoolSize", (4*numCores).toString).toInt
+ val keepAliveTime = properties.getProperty("satisfaction.jobrunner.keepAlive", "400").toLong
+ val queueSize = properties.getProperty("satisfaction.jobrunner.queueSize", (maxPoolSize + 1).toString ).toInt
+
+ val workQueue = new ArrayBlockingQueue[Runnable](queueSize)
+
+ val pool = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS , workQueue )
+ _globalPool = ExecutionContext.fromExecutor( pool)
+ }
+ _globalPool
+ }
}
diff --git a/modules/engine/src/main/scala/satisfaction/engine/actors/LogWrapper.scala b/modules/engine/src/main/scala/satisfaction/engine/actors/LogWrapper.scala
index 6d8537f..294fd9d 100644
--- a/modules/engine/src/main/scala/satisfaction/engine/actors/LogWrapper.scala
+++ b/modules/engine/src/main/scala/satisfaction/engine/actors/LogWrapper.scala
@@ -238,7 +238,7 @@ object LogWrapper {
}
- def getLogPathsForGoal( trackName : String, goalName : String ) : Seq[FileStatus] = {
+ def getLogPathsForGoal( trackName : String, goalName : String ) : Iterable[FileStatus] = {
val goalPath : Path = rootDirectory / pathString( trackName) / pathString( goalName)
localFS.listFiles( goalPath)
diff --git a/modules/engine/src/main/scala/satisfaction/engine/actors/PredicateProver.scala b/modules/engine/src/main/scala/satisfaction/engine/actors/PredicateProver.scala
index 1c4e89e..3db6122 100644
--- a/modules/engine/src/main/scala/satisfaction/engine/actors/PredicateProver.scala
+++ b/modules/engine/src/main/scala/satisfaction/engine/actors/PredicateProver.scala
@@ -96,12 +96,36 @@ class PredicateProver(val track : Track, val goal: Goal, val witness: Witness, v
satisfy(runID,parentRunID,forceSatisfy)
}
} else {
- //// XXX
- error( s"Invalid Request ; Job in state ${status.state} can not receive multiple Satisfy messages." )
- ////sender ! InvalidRequest(status,"Job in state ${status.state} can not receive multiple Satisfy messages ")
- //// XXX FIXME XXX
- /// Do we want to send message not to send multiple
+ //// We've already started ...
+ //// So we're already satisfied, or failed, or running
+ //// Add the sender to the listener list,
+ //// And send back a message, if we're terminal
addListener( sender )
+ status.state match {
+ case GoalState.Success => {
+ info(s" ${goal.name} ${witness} is Success ; Sending GoalSuccess ")
+ sender ! GoalSuccess(status)
+ }
+ case GoalState.AlreadySatisfied => {
+ info(s" ${goal.name} ${witness} is Already Satisfied ; Sending GoalSuccess ")
+ sender ! GoalSuccess(status)
+ }
+ case GoalState.Failed => {
+ info(s" ${goal.name} ${witness} is Already Failed ; Sending GoalFailure ")
+ sender ! GoalFailure(status)
+ }
+ case GoalState.DependencyFailed => {
+ info(s" ${goal.name} ${witness} is Dependency Failed ; Sending GoalFailure ")
+ sender ! GoalFailure(status)
+ }
+ case GoalState.Aborted => {
+ info(s" ${goal.name} ${witness} is Aborted ; Sending GoalFailure ")
+ sender ! GoalFailure(status)
+ }
+ case _ => {
+ info(s" ${goal.name} ${witness} State is ${status.state} ; Not sending message to sender ")
+ }
+ }
}
}
case EvidenceCheckResult(id: String, w: Witness, isAlreadySatisfied: Boolean) =>
diff --git a/modules/engine/src/main/scala/satisfaction/engine/actors/ProofEngine.scala b/modules/engine/src/main/scala/satisfaction/engine/actors/ProofEngine.scala
index 38ba847..9a93276 100644
--- a/modules/engine/src/main/scala/satisfaction/engine/actors/ProofEngine.scala
+++ b/modules/engine/src/main/scala/satisfaction/engine/actors/ProofEngine.scala
@@ -27,8 +27,13 @@ import com.typesafe.config.ConfigFactory
class ProofEngine( val trackHistoryOpt : Option[TrackHistory] = None) extends satisfaction.Logging{
- implicit val config : com.typesafe.config.Config = ConfigFactory.load
- implicit val akkaSystem = ActorSystem("satisfaction", config ,this.getClass.getClassLoader)
+ implicit val config : com.typesafe.config.Config = ConfigFactory.load()
+ implicit val akkaSystem : ActorSystem = {
+ val as = ActorSystem("satisfaction", config ,this.getClass.getClassLoader)
+ info(s" Actor System = $as ; Dispatcher is ${as.dispatcher} ")
+ as
+ }
+
val proverFactory = {
val actorRef = akkaSystem.actorOf(Props( classOf[ProverFactory], trackHistoryOpt), "ProverFactory")
akkaSystem.eventStream.subscribe(actorRef, classOf[DeadLetter])
@@ -42,7 +47,8 @@ class ProofEngine( val trackHistoryOpt : Option[TrackHistory] = None) extends s
/**
* Blocking call to satisfy Goal
*/
- def satisfyGoalBlocking( goal: Goal, witness: Witness, duration: Duration): GoalStatus = {
+ def satisfyGoalBlocking( goal: Goal, witness: Witness, duration: FiniteDuration): GoalStatus = {
+ implicit val timeout = new Timeout(duration)
val f = getProver(goal, witness) ? Satisfy(true)
val response = Await.result(f, duration)
response match {
@@ -57,9 +63,10 @@ class ProofEngine( val trackHistoryOpt : Option[TrackHistory] = None) extends s
}
def satisfyGoal( goal: Goal, witness: Witness): Future[GoalStatus] = {
- future {
+ implicit val timeout = new Timeout( Duration( 24, HOURS))
+ future {
val f = getProver(goal, witness) ? Satisfy(true)
- val response = Await.result(f, Duration(6, HOURS)) /// XXX Allow for really long jobs ... put in config somehow ..
+ val response = Await.result(f, Duration(24, HOURS)) /// XXX Allow for really long jobs ... put in config somehow ..
response match {
case s: GoalSuccess =>
info(s" Goal ${goal.name} Was Satisfied")
@@ -69,7 +76,7 @@ class ProofEngine( val trackHistoryOpt : Option[TrackHistory] = None) extends s
info(s" Goal ${goal.name} received GoalFailure ")
f.goalStatus
}
- }
+ }
}
def restartGoal( goal : Goal, witness: Witness ) : Future[GoalStatus] = {
diff --git a/modules/engine/src/main/scala/satisfaction/track/TrackContext.scala b/modules/engine/src/main/scala/satisfaction/track/TrackContext.scala
index a06ca82..17b0627 100644
--- a/modules/engine/src/main/scala/satisfaction/track/TrackContext.scala
+++ b/modules/engine/src/main/scala/satisfaction/track/TrackContext.scala
@@ -25,12 +25,10 @@ case class TrackContext( val track : Track,
def getResource( resourceFile : String ) : String = {
- println(" GET HDFS is " + hdfs)
hdfs.readFile( resourcePath / resourceFile ).mkString
}
- def listResources : Seq[String] = {
- println(" LIST HDFS is " + hdfs)
+ def listResources : Iterable[String] = {
hdfs.listFiles( resourcePath ).map( _.path.name )
}
diff --git a/modules/engine/src/main/scala/satisfaction/track/TrackFactory.scala b/modules/engine/src/main/scala/satisfaction/track/TrackFactory.scala
index 3d17ce0..375aece 100644
--- a/modules/engine/src/main/scala/satisfaction/track/TrackFactory.scala
+++ b/modules/engine/src/main/scala/satisfaction/track/TrackFactory.scala
@@ -11,8 +11,11 @@ import satisfaction.engine.actors.JobRunner
/**
* Class for Executor to access deployed Tracks (i.e Projects)
+<<<<<<< HEAD
+=======
class TracksUnavailableException( exc : Throwable ) extends RuntimeException
class TracksUnavailableException( exc : Throwable ) extends RuntimeException
+>>>>>>> 133b57614f6c29c04c8e4fce1bc88320ef1adfbe
*
* Tracks are deployed in a well-defined directory on HDFS,
* where the Track Name is defined as a path relative to a
@@ -44,14 +47,6 @@ case class TrackFactory(val trackFS : FileSystem,
}
}
- /**
- * Monitor the memory usage, and die
- * when we have exhausted all of the PermGen space
- */
- val initPoisonPill = {
- PoisonPill()
- }
-
private val _trackMap : collection.mutable.Map[TrackDescriptor,Track] = collection.mutable.HashMap[TrackDescriptor,Track]()
def trackMap : collection.immutable.Map[TrackDescriptor,Track] = _trackMap.toMap
@@ -87,19 +82,24 @@ case class TrackFactory(val trackFS : FileSystem,
}
}
}
+
+ def release() = {
+ _cached = None
+ _lastAccessed = System.currentTimeMillis()
+ }
}
/**
* Get all the tracks which have been deployed to HDFS under the
* Satisfaction base track path.
*/
- def getAllTracks : Seq[TrackDescriptor] = {
+ def getAllTracks : Iterable[TrackDescriptor] = {
_cachedAllTracks.get
}
private val _cachedAllTracks = new Cacheable( 60*1000*30, _getAllTracks )
- private def _getAllTracks() : Seq[TrackDescriptor] = {
+ private def _getAllTracks() : Iterable[TrackDescriptor] = {
try {
val trackRoot : Path = baseTrackPath / "track"
@@ -116,6 +116,37 @@ case class TrackFactory(val trackFS : FileSystem,
}
}
}
+
+ /**
+ * For now just
+ */
+ def refreshAllTracks() = {
+ _cachedAllTracks.release()
+ _trackMap.clear()
+ }
+
+ def refreshTrack( trackDesc : TrackDescriptor ) : Track = {
+ //// Remove the Track from the mutable Map
+ val findCurrentTrack : Option[TrackDescriptor] = _trackMap.seq.collectFirst({ case(td : TrackDescriptor, tr : Track) if
+ td.trackName == trackDesc.trackName && td.variant == trackDesc.variant &&
+ td.forUser == trackDesc.forUser => { td } } )
+ findCurrentTrack match {
+ case Some(td) => {
+ info(s" Removing Previous Track ${td.trackName} with Version ${td.version} ")
+ _trackMap.remove(td)
+ }
+ case None => {
+ info(s" No Previous track ${trackDesc.trackName} found ")
+ }
+
+ }
+
+ _cachedAllTracks.release()
+ val latestTD = getAllTracks.filter( _.equalsWoVersion(trackDesc) ).
+ toList.sortWith( versionSort )(0)
+
+ getTrack( latestTD ).get
+ }
def getLatestTracks : Seq[TrackDescriptor] = {
val trackDescMap: Map[TrackDescriptor,MajorMinorPatch] = getAllTracks.foldLeft( Map[TrackDescriptor,MajorMinorPatch]() )( (map,td) => {
diff --git a/modules/engine/src/main/scala/satisfaction/track/TrackScheduler.scala b/modules/engine/src/main/scala/satisfaction/track/TrackScheduler.scala
index d80104b..d18f8ed 100644
--- a/modules/engine/src/main/scala/satisfaction/track/TrackScheduler.scala
+++ b/modules/engine/src/main/scala/satisfaction/track/TrackScheduler.scala
@@ -50,7 +50,34 @@ class TrackScheduler( val proofEngine : ProofEngine ) extends Logging {
val runningForTrack = track.topLevelGoals.filter(goal => proofEngine.getStatus(goal, witness).canChange)
!runningForTrack.isEmpty
*/
-
+ val goalsInProgress = proofEngine.getGoalsInProgress.filter(running => track.topLevelGoals.map(_.name).contains(running.goalName))
+ if( goalsInProgress.isEmpty) {
+ false
+ } else {
+ goalsInProgress.foreach( goal => {
+ //// If the job died, it may still have actors
+ goal.state match {
+ case GoalState.Failed => {
+ return false
+ }
+ case GoalState.DependencyFailed => {
+ return false
+ }
+ case GoalState.AlreadySatisfied => {
+ return false
+ }
+ case GoalState.Success => {
+ return false
+ }
+ case GoalState.Aborted => {
+ return false
+ }
+ case _ => { //// Do nothing
+ }
+ }
+ })
+ true
+ }
}
@@ -129,41 +156,37 @@ class TrackScheduler( val proofEngine : ProofEngine ) extends Logging {
}
def generateWitness( track : Track, nowDt : DateTime ) : Witness = {
- var subst = Witness()
- track.getWitnessVariables.foreach( { v : Variable[_] =>
- if(isTemporalVariable(v)) {
- val temporal = getValueForTemporal( v, nowDt)
- subst = subst + VariableAssignment( v.name , temporal)
- info(s" Adding Temporal value $temporal for temporal variable $v.name ")
- } else {
- /// XXX Fixme ???? Allow the substitution to be partially specified
- info(s" Getting non temporal variable $v.name from track properties ")
- val varValMatch = track.trackProperties.raw.get( v.name)
+ track.getWitnessVariables.foldLeft( Witness() ) { (w: Witness, v : Variable[_]) =>
+ isTemporalVariable(v) match {
+ case Some(temporalVar) => {
+ val temporalVal = getValueForTemporal( temporalVar, nowDt)
+
+ info(s" Adding Temporal value $temporalVal for temporal variable $v.name ")
+ w + VariableAssignment( v.name , temporalVal)
+ }
+ case None => {
+ info(s" Getting non temporal variable $v.name from track properties ")
+ val varValMatch = track.trackProperties.raw.get( v.name)
- varValMatch match {
- case Some(varVal) =>
- subst = subst + VariableAssignment( v.name , varVal)
- case None =>
- info(" No variable found with " + v.name)
- }
- }
- })
- info(" Temporal witness is " + subst)
- subst
+ varValMatch match {
+ case Some(varVal) => {
+ w + VariableAssignment( v.name , varVal)
+ }
+ case None => {
+ throw new IllegalStateException(s"Unable to get value for variable ${v.name} ")
+ }
+ }
+ }
+ }
+ }
}
- def isTemporalVariable( variable : Variable[_] ) : Boolean = {
- variable match {
- case temporal : TemporalVariable => true
- case _ => false
- }
+ def isTemporalVariable( variable : Variable[_] ) : Option[TemporalVariable] = {
+ TemporalVariable.isTemporalVariable(variable)
}
- def getValueForTemporal( variable : Variable[_], dt : DateTime ) : String = {
- variable match {
- case temporal : TemporalVariable => temporal.formatted( dt)
- case _ => ""
- }
+ def getValueForTemporal( temporal : TemporalVariable, dt : DateTime ) : String = {
+ temporal.formatted( dt)
}
@@ -184,7 +207,8 @@ object TrackScheduler {
log.info(" Starting Goal for Track " + mess.trackDesc.trackName + " Version " + mess.trackDesc.version)
- val trckOpt = if( trackFactory != null ) { trackFactory.getTrack( mess.trackDesc ) } else { None }
+ ////val trckOpt = if( trackFactory != null ) { trackFactory.getTrack( mess.trackDesc ) } else { None }
+ val trckOpt = if( trackFactory != null ) { trackFactory.getLatestTrack( mess.trackDesc ) } else { None }
trckOpt match {
case Some(trck) if (trackScheduler.isRunning(trck) && mess.continuous ) => { // define "already running"
diff --git a/modules/hadoop/src/main/scala/satisfaction/hadoop/DistCpSatisfier.scala b/modules/hadoop/src/main/scala/satisfaction/hadoop/DistCpSatisfier.scala
index 5057194..c7d975b 100644
--- a/modules/hadoop/src/main/scala/satisfaction/hadoop/DistCpSatisfier.scala
+++ b/modules/hadoop/src/main/scala/satisfaction/hadoop/DistCpSatisfier.scala
@@ -11,54 +11,38 @@ import hdfs.HdfsPath
import hdfs.VariablePath
import fs.FileSystem
import fs.Path
+import Goal._
import org.apache.hadoop.mapred.JobClient
import org.apache.hadoop.mapred.JobStatus
import org.apache.hadoop.mapred.RunningJob
import org.apache.hadoop.tools.DistCpOptions
import org.apache.hadoop.fs.{Path => ApachePath}
+import org.apache.hadoop.mapreduce.Job
+import collection.JavaConversions._
/**
* For now deprecate DistCP Satisfier,
* until we get a chance to better test it ..
*/
-/***
-class DistCpSatisfier(val src: VariablePath, val dest: VariablePath)( implicit val hdfs : FileSystem , implicit val track: Track) extends Satisfier {
+class DistCpSatisfier(val src: VariablePath, val dest: VariablePath)(implicit val track: Track) extends Satisfier with Logging {
override def name = s"DistCp $src to $dest "
- var execResult : ExecutionResult = null
var _distCp : DistCp = null
+ var _runningJob : Job = null
- @Override
- override def satisfy(projParams: Witness): ExecutionResult = robustly {
- true
- }
- def XXXsatisfy(projParams: Witness) :ExecutionResult = robustly {
-
+ def satisfy(projParams: Witness) : ExecutionResult = robustly {
val srcPath: HdfsPath = src.getDataInstance(projParams).get.asInstanceOf[HdfsPath]
val destPath: HdfsPath = dest.getDataInstance(projParams).get.asInstanceOf[HdfsPath]
-
- if (srcPath.path.equals(destPath)) {
- true
- } else {
- //// Otherwise, it seems like someone wanted the path to be overwritten
- //// Delete it first
- println(s" Deleting existing Path ${destPath.path.toUri.toString}")
- hdfs.delete(destPath.path)
- println(s"Distcp'ing ${srcPath} to ${destPath.path.toUri} ")
-
- val result = distcp(srcPath.path, destPath.path);
- //// Does DistCp have return codes ??
- println(s" Result of DistCp is $result")
- result == 0
- }
-
- val result = distcp(srcPath.path, destPath.path);
- //// Does DistCp have return codes ??
- println(s" Result of DistCp is $result")
- result == 0
+ if (srcPath.path.equals(destPath)) {
+ true
+ } else {
+ val result = distcp(srcPath.path, destPath.path);
+ //// Does DistCp have return codes ??
+ info(s" Result of DistCp is $result")
+ result
}
}
@@ -67,68 +51,50 @@ class DistCpSatisfier(val src: VariablePath, val dest: VariablePath)( implicit v
* Determine if the job is our DistCp job
*/
def isDistCpJob( js: JobStatus , jc: JobClient) : Boolean = {
- /// XXX
val checkJob: RunningJob = jc.getJob( js.getJobID)
//// Figure out proper Job name
checkJob.getJobName.toLowerCase.contains("distcp")
}
- @Override
- override def abort() : ExecutionResult = {
- if(_distCp != null) {
- val jobClient = new JobClient(_distCp.getConf() )
- val allJobs = jobClient.getAllJobs
- allJobs.filter( isDistCpJob( _, jobClient )) foreach( js => {
- if( js.getRunState() == JobStatus.RUNNING) {
- println(s"Killing job ${js.getJobId} ")
- val checkJob: RunningJob = jobClient.getJob( js.getJobID)
- checkJob.killJob
- return execResult.markFailure
- }
- } )
- ///TODO XXX Fix DistCp abort
-
+ override def abort() : ExecutionResult = robustly {
+ if(_runningJob != null) {
+ _runningJob.killJob()
+ true
+ } else {
+ false
}
-
- execResult.markFailure
}
-
- def distcp(src : Path, dest : Path): Int = {
- val job = new JobConf();
+ def distcp(src : Path, dest : Path): Boolean = {
+ val jobConf = new JobConf( Config( track) );
-
- /// Why won't my implicits get invoked ???
val apacheSrc : ApachePath = HdfsImplicits.Path2ApachePath(src);
val apacheDest : ApachePath = HdfsImplicits.Path2ApachePath(dest);
///val apacheDest : ApachePath = dest;
- val opts = new DistCpOptions(apacheSrc,apacheDest)
+ val opts = new DistCpOptions(List[ApachePath]( apacheSrc),apacheDest)
- _distCp = new DistCp(job, opts);
- val args = new Array[String](0)
-
- ToolRunner.run(_distCp, args);
+ val distCp = new DistCp(jobConf, opts);
+ _runningJob = distCp.execute();
+
+
+ _runningJob.monitorAndPrintJob()
+ _runningJob.isSuccessful
}
}
object DistCpGoal {
- /// XXX Is this the correct implicit scope???
- implicit val hdfs : FileSystem = Hdfs.default
def apply(goalName: String, src: VariablePath, dest: VariablePath )
(implicit track: Track): Goal = {
val srcVars = src.variables
val destVars = dest.variables
- //// Add check that vars are the same
- if (srcVars.size != destVars.size) {
- throw new IllegalArgumentException("Paths must have same variables")
- }
+
new Goal(
name = goalName,
- satisfier = Some(new DistCpSatisfier(src, dest)),
+ satisfierFactory = SatisfierFactory( { new DistCpSatisfier(src, dest) } ),
variables = srcVars,
dependencies = Set.empty,
evidence = Set(dest)
@@ -136,4 +102,3 @@ object DistCpGoal {
}
}
- ***/
diff --git a/modules/hadoop/src/main/scala/satisfaction/hadoop/HadoopJobProgress.scala b/modules/hadoop/src/main/scala/satisfaction/hadoop/HadoopJobProgress.scala
index 7817d0a..9b0c921 100644
--- a/modules/hadoop/src/main/scala/satisfaction/hadoop/HadoopJobProgress.scala
+++ b/modules/hadoop/src/main/scala/satisfaction/hadoop/HadoopJobProgress.scala
@@ -49,7 +49,6 @@ class HadoopJobProgress( val hadoopJob : RunningJob ) extends ProgressCounter {
* that we don't say 0% before mappers have started,
* and we don't say 100% right after reducers have completed.
*/
- @Override
override def progressPercent = {
hadoopJob.mapProgress*0.45 + hadoopJob.reduceProgress*0.45 +
hadoopJob.setupProgress*0.05 + hadoopJob.cleanupProgress*0.05
@@ -59,7 +58,6 @@ class HadoopJobProgress( val hadoopJob : RunningJob ) extends ProgressCounter {
/**
* Include a bunch of counters, so that more accurate progress may be measured ..
*/
- @Override
override def progressUnits : MetricsCollection= {
/// XXX TODO.. filter out only the counters we care about
/// XXX Make scala wrapper around hadoop counters ...
diff --git a/modules/hadoop/src/main/scala/satisfaction/hadoop/PathExists.scala b/modules/hadoop/src/main/scala/satisfaction/hadoop/PathExists.scala
new file mode 100644
index 0000000..879968d
--- /dev/null
+++ b/modules/hadoop/src/main/scala/satisfaction/hadoop/PathExists.scala
@@ -0,0 +1,52 @@
+package satisfaction.hadoop
+
+import satisfaction.Satisfier
+import satisfaction.Evidence
+import satisfaction.hadoop.hdfs.VariablePath
+import satisfaction.ExecutionResult
+import satisfaction.fs.FileSystem
+import satisfaction.Witness
+import satisfaction.fs.Path
+import satisfaction.Goal
+import satisfaction.Track
+
+/**
+ * Asssert that a Path actually exists on a filesystem
+ *
+ */
+class PathExistsSatisfier( varPath : VariablePath ) extends Satisfier {
+
+ def name : String = s"PathExists(${varPath.pathTemplate})"
+
+ /**
+ * Make sure the Goal is satisfied for the specified Witness
+ *
+ * @returns Result of execution
+ */
+ def satisfy(witness: Witness): ExecutionResult = robustly {
+ if( !varPath.exists(witness)) {
+ varPath.hdfs.mkdirs( varPath.getPathForWitness( witness).get)
+ }
+ true
+ }
+
+ /**
+ * If possible, abort the job
+ */
+ /// Not supported
+ def abort() : ExecutionResult = robustly { true }
+
+
+}
+
+object PathExists {
+
+ def apply( pth : VariablePath )(implicit track : Track) : Goal = {
+ new Goal(
+ name=s"PathExists(${pth.pathTemplate})",
+ satisfierFactory= Goal.SatisfierFactory( { new PathExistsSatisfier( pth) } ),
+ variables = pth.variables
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/Hdfs.scala b/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/Hdfs.scala
index 144a1df..b31e864 100644
--- a/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/Hdfs.scala
+++ b/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/Hdfs.scala
@@ -17,6 +17,8 @@ import satisfaction.hadoop.Config._
import org.apache.hadoop.fs.FSDataOutputStream
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.PathFilter
+import org.apache.hadoop.fs.{RemoteIterator => ApacheRemoteIterator}
+import org.apache.hadoop.fs.LocatedFileStatus
/**
* Implement our FileSystem abstraction with
@@ -116,23 +118,56 @@ case class Hdfs(val fsURI: String)
fs.getUri()
}
- override def listFiles( rootPath : Path ) : Seq[FileStatus] = {
- fs.listStatus( rootPath ).toSeq.map( afs => { afs : FileStatus } )
+ override def listFiles( rootPath : Path ) : Iterable[FileStatus] = {
+ ///new ApacheFileSequence( rootPath, false )
+ ///new Iterable[FileStatus] {
+ ///override val iterator = { fs.listFiles( rootPath, false) }
+ ///}
+ fs.listStatus( Path2ApachePath(rootPath) ).toIterable.map(afs => { val fs : FileStatus = afs ; fs } )
}
+ class ApacheFileIterator( rootPath : Path, recursive : Boolean) extends Iterator[FileStatus] {
+ private var _lastDir : String = null
+ private var _nextFile : LocatedFileStatus = null
+
+ private lazy val remoteIterator = fs.listFiles( rootPath, recursive)
+
+ override def hasNext : Boolean = {
+ _nextFile != null || remoteIterator.hasNext
+ }
+
+ override def next : FileStatus = {
+ //// Need to do funky logic to include directories
+ if( _nextFile == null ) {
+ val nextLFS = remoteIterator.next
+ val nextLFSDir = nextLFS.getPath().getParent().toUri.toString
+ if( ( nextLFSDir.equals( _lastDir ))
+ || (nextLFSDir.equals(rootPath.toUri.toString))) {
+ nextLFS
+ } else {
+ _nextFile = nextLFS
+ _lastDir = nextLFSDir
+
+ fs.getFileStatus( nextLFS.getPath().getParent() )
+ }
+ } else {
+ val nf = _nextFile
+ _nextFile = null
+ nf
+ }
+ }
+ }
+
+ //// Should have made FileSystem Iterable, not Sequence
+ class ApacheFileSequence( rootPath : Path, recursive : Boolean) extends Iterable[FileStatus] {
+
+ override def iterator : Iterator[FileStatus] = { new ApacheFileIterator(rootPath,recursive) }
+ }
+
@Override
- override def listFilesRecursively( rootPath : Path ) : Seq[FileStatus] = {
- val fullList : collection.mutable.Buffer[FileStatus] = new ArrayBuffer[FileStatus]
- listFiles( rootPath).foreach( { fs : FileStatus =>
- if( !fs.isDirectory ) {
- fullList += fs
- } else {
- fullList += fs
- fullList ++= listFilesRecursively( fs.path)
- }
- })
- fullList
+ override def listFilesRecursively( rootPath : Path ) : Iterable[FileStatus] = {
+ new ApacheFileSequence( rootPath, true)
}
@@ -142,13 +177,13 @@ case class Hdfs(val fsURI: String)
}
- def globFiles( rootPath : Path ) : Seq[FileStatus] = {
+ def globFiles( rootPath : Path ) : Iterable[FileStatus] = {
fs.globStatus(rootPath).toSeq.map( afs => { afs : FileStatus })
}
- def globFilesRecursively( rootPath : Path ) : Seq[FileStatus] = {
+ def globFilesRecursively( rootPath : Path ) : Iterable[FileStatus] = {
var fullList : collection.mutable.Buffer[FileStatus] = new ArrayBuffer[FileStatus]
- listFiles( rootPath).foreach( { fs : FileStatus =>
+ globFiles( rootPath).foreach( { fs : FileStatus =>
if( fs.isFile ) {
fullList += fs
} else {
diff --git a/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/VariablePath.scala b/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/VariablePath.scala
index 39836bd..624998c 100644
--- a/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/VariablePath.scala
+++ b/modules/hadoop/src/main/scala/satisfaction/hadoop/hdfs/VariablePath.scala
@@ -8,22 +8,26 @@ case class VariablePath(pathTemplate: String, checkMarked : Boolean , minSize :
extends DataOutput with Logging {
def variables = {
- Substituter.findVariablesInString(pathTemplate).map (Variable(_))
+ Substituter.findVariablesInString(pathTemplate).map (Variable(_)).distinct
}
def exists(witness: Witness): Boolean = {
getPathForWitness(witness) match {
case None => false
case Some(path) => {
+ info(s" Checking if path ${path} exists ")
if(hdfs.exists(path) ) {
+ info(s" Path ${path} does exist ")
val hdfsPath = new HdfsPath( path)
if( checkMarked) {
if ( ! hdfsPath.isMarkedCompleted ) {
+ info(s" Path ${path} does exist, but is not marked complete.")
return false
}
}
if( minSize > 0 ) {
if ( hdfsPath.size < minSize) {
+ info(s" Path ${path} does exist, but the size ${hdfsPath.size} is less than minimum ${minSize} .")
return false
}
}
@@ -44,7 +48,7 @@ case class VariablePath(pathTemplate: String, checkMarked : Boolean , minSize :
def getPathForWitness(witness: Witness): Option[Path] = {
val fullSubstituter = track.getTrackProperties(witness)
- var substPath = Substituter.substitute(pathTemplate, fullSubstituter)
+ val substPath = Substituter.substitute(pathTemplate, fullSubstituter)
substPath match {
case Left(missingVars) =>
warn(" Missing vars " + missingVars.mkString(",") + " ; no Path for witness")
diff --git a/modules/hadoop/src/test/resources/config/hdfs-site.xml b/modules/hadoop/src/test/resources/config/hdfs-site.xml
index ad04106..26ca75c 100644
--- a/modules/hadoop/src/test/resources/config/hdfs-site.xml
+++ b/modules/hadoop/src/test/resources/config/hdfs-site.xml
@@ -1,3 +1,289 @@
+<<<<<<< HEAD
+
+
+
+
+ dfs.block.access.token.enable
+ true
+
+
+
+ dfs.blockreport.initialDelay
+ 120
+
+
+
+ dfs.blocksize
+ 134217728
+
+
+
+ dfs.client.read.shortcircuit
+ true
+
+
+
+ dfs.client.read.shortcircuit.streams.cache.size
+ 4096
+
+
+
+ dfs.cluster.administrators
+ hdfs
+
+
+
+ dfs.datanode.address
+ 0.0.0.0:50010
+
+
+
+ dfs.datanode.balance.bandwidthPerSec
+ 6250000
+
+
+
+ dfs.datanode.data.dir
+ /mnt/data01/hadoop/hdfs/data,/mnt/data02/hadoop/hdfs/data,/mnt/data03/hadoop/hdfs/data
+
+
+
+ dfs.datanode.data.dir.perm
+ 750
+
+
+
+ dfs.datanode.du.reserved
+ 1073741824
+
+
+
+ dfs.datanode.failed.volumes.tolerated
+ 0
+
+
+
+ dfs.datanode.http.address
+ 0.0.0.0:50075
+
+
+
+ dfs.datanode.https.address
+ 0.0.0.0:50475
+
+
+
+ dfs.datanode.ipc.address
+ 0.0.0.0:8010
+
+
+
+ dfs.datanode.kerberos.principal
+ dn/_HOST@EXAMPLE.COM
+
+
+
+ dfs.datanode.keytab.file
+ /etc/security/keytabs/dn.service.keytab
+
+
+
+ dfs.datanode.max.transfer.threads
+ 1024
+
+
+
+ dfs.domain.socket.path
+ /var/lib/hadoop-hdfs/dn_socket
+
+
+
+ dfs.heartbeat.interval
+ 3
+
+
+
+ dfs.hosts.exclude
+ /etc/hadoop/conf/dfs.exclude
+
+
+
+ dfs.http.policy
+ HTTP_ONLY
+
+
+
+ dfs.https.port
+ 50470
+
+
+
+ dfs.journalnode.edits.dir
+ /grid/0/hdfs/journal
+
+
+
+ dfs.journalnode.http-address
+ 0.0.0.0:8480
+
+
+
+ dfs.namenode.accesstime.precision
+ 0
+
+
+
+ dfs.namenode.avoid.read.stale.datanode
+ true
+
+
+
+ dfs.namenode.avoid.write.stale.datanode
+ true
+
+
+
+ dfs.namenode.checkpoint.dir
+ /mnt/data01/hdfs/namesecondary
+
+
+
+ dfs.namenode.checkpoint.edits.dir
+ ${dfs.namenode.checkpoint.dir}
+
+
+
+ dfs.namenode.checkpoint.period
+ 21600
+
+
+
+ dfs.namenode.checkpoint.txns
+ 1000000
+
+
+
+ dfs.namenode.handler.count
+ 40
+
+
+
+ dfs.namenode.http-address
+ dahdp2nn01.tag-dev.com:50070
+
+
+
+ dfs.namenode.https-address
+ dahdp2nn01.tag-dev.com:50470
+
+
+
+ dfs.namenode.kerberos.https.principal
+ HTTP/_HOST@EXAMPLE.COM
+
+
+
+ dfs.namenode.kerberos.principal
+ nn/_HOST@EXAMPLE.COM
+
+
+
+ dfs.namenode.keytab.file
+ /etc/security/keytabs/nn.service.keytab
+
+
+
+ dfs.namenode.name.dir
+ /mnt/data01/hadoop/hdfs/namenode,/mnt/data02/hadoop/hdfs/namenode
+
+
+
+ dfs.namenode.name.dir.restore
+ true
+
+
+
+ dfs.namenode.safemode.threshold-pct
+ 1.0f
+
+
+
+ dfs.namenode.secondary.http-address
+ dahdp2nn01.tag-dev.com:50090
+
+
+
+ dfs.namenode.stale.datanode.interval
+ 30000
+
+
+
+ dfs.namenode.write.stale.datanode.ratio
+ 1.0f
+
+
+
+ dfs.permissions.enabled
+ true
+
+
+
+ dfs.permissions.superusergroup
+ hdfs
+
+
+
+ dfs.replication
+ 3
+
+
+
+ dfs.replication.max
+ 50
+
+
+
+ dfs.secondary.namenode.kerberos.https.principal
+ HTTP/_HOST@EXAMPLE.COM
+
+
+
+ dfs.secondary.namenode.kerberos.principal
+ nn/_HOST@EXAMPLE.COM
+
+
+
+ dfs.secondary.namenode.keytab.file
+ /etc/security/keytabs/nn.service.keytab
+
+
+
+ dfs.support.append
+ true
+
+
+
+ dfs.web.authentication.kerberos.keytab
+ /etc/security/keytabs/spnego.service.keytab
+
+
+
+ dfs.web.authentication.kerberos.principal
+ HTTP/_HOST@EXAMPLE.COM
+
+
+
+ dfs.webhdfs.enabled
+ true
+
+
+
+ fs.permissions.umask-mode
+ 022
+
+
+
+=======
@@ -160,3 +446,4 @@
+>>>>>>> 133b57614f6c29c04c8e4fce1bc88320ef1adfbe
diff --git a/modules/hadoop/src/test/scala/satisfaction/hadoop/hdfs/HdfsSpec.scala b/modules/hadoop/src/test/scala/satisfaction/hadoop/hdfs/HdfsSpec.scala
index f16a3fe..8070a64 100644
--- a/modules/hadoop/src/test/scala/satisfaction/hadoop/hdfs/HdfsSpec.scala
+++ b/modules/hadoop/src/test/scala/satisfaction/hadoop/hdfs/HdfsSpec.scala
@@ -18,10 +18,6 @@ class HdfsSpec extends Specification {
"Hdfs" should {
- "create URLS starting with hdfs" in {
- //// XXX use MiniFS for unit testing ...
- /// Externalize configuration
- val hdfsUrl = new java.net.URL("hdfs://dhdp2/user/satisfaction/track/Sample/version_2.1/satisfaction.properties")
val stream = hdfsUrl.openStream
val props = Substituter.readProperties( stream)
@@ -33,14 +29,14 @@ class HdfsSpec extends Specification {
"List files" in {
val hdfs = Hdfs.fromConfig(HdfsSpec.clientConfig)
- val path = new Path("hdfs:///data/ramblas/event_log")
+ val path = new Path("hdfs://dahdp2nn01/data/ramblas/event_log")
hdfs.listFiles( path ).foreach( fs => {
System.out.println(s" Path is ${fs.path} ${fs.size} ${fs.lastAccessed} ")
} )
- val pathToday = path / "20140429"
+ val pathToday = path / "20150414"
hdfs.listFilesRecursively( pathToday ).foreach( fs => {
System.out.println(s" Recursive Path is ${fs.path} ${fs.size} ${fs.lastAccessed} ")
} )
@@ -59,7 +55,7 @@ class HdfsSpec extends Specification {
testConf.writeXml(System.out)
val haHdfs = Hdfs.fromConfig( testConf)
- val nsPath = new Path("hdfs://dhdp2/user/ramblas/lib")
+ val nsPath = new Path("hdfs://dahdp2nn01/user/ramblas/lib")
haHdfs.listFiles( nsPath ).foreach( fs => {
System.out.println(s" Path is ${fs.path} ${fs.size} ${fs.lastAccessed} ")
} )
@@ -70,7 +66,7 @@ class HdfsSpec extends Specification {
"read and write file" in {
val hdfs = Hdfs.fromConfig( HdfsSpec.clientConfig)
- val brPath = Path("hdfs://dhdp2/user/satisfaction/track/DauBackfill/version_0.2/auxJar/brickhouse-0.7.0-jdb-SNAPSHOT.jar")
+ val brPath = Path("hdfs://dahdp2nn01/user/satisfaction/track/DauBackfill/version_0.2/auxJar/brickhouse-0.7.0-jdb-SNAPSHOT.jar")
val readFile = hdfs.readFile( brPath)
@@ -79,7 +75,7 @@ class HdfsSpec extends Specification {
"read and write text file" in {
val hdfs = Hdfs.fromConfig( HdfsSpec.clientConfig)
- val brPath = Path("hdfs://dhdp2/user/satisfaction/track/DauBackfill/version_0.2/satisfaction.properties")
+ val brPath = Path("hdfs://dahdp2nn01/user/satisfaction/track/DauBackfill/version_0.2/satisfaction.properties")
val readFile = hdfs.readFile( brPath)
diff --git a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HivePartitionSet.scala b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HivePartitionSet.scala
index 34adc76..a0f4676 100644
--- a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HivePartitionSet.scala
+++ b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HivePartitionSet.scala
@@ -60,5 +60,9 @@ case class HivePartitionSet(
partitionSet.forall( _.isMarkedCompleted )
}
+ override def toString() = {
+ val partitionStr = partitionSet.mkString("_")
+ s"HivePartitionSet!_${partitionStr}_!"
+ }
}
\ No newline at end of file
diff --git a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTable.scala b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTable.scala
index 5e2dda0..3bb0650 100644
--- a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTable.scala
+++ b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTable.scala
@@ -28,7 +28,10 @@ case class HiveTable (
val checkMarkedComplete = true
-
+
+ override def toString() = {
+ s"HiveTable(${dbName}.${tblName})"
+ }
private lazy val _hiveTable : ApacheTable = ms.getTableByName(dbName, tblName)
diff --git a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTablePartitionGroup.scala b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTablePartitionGroup.scala
index 1520f78..e8bea02 100644
--- a/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTablePartitionGroup.scala
+++ b/modules/hive-ms/src/main/scala/satisfaction/hive/ms/HiveTablePartitionGroup.scala
@@ -21,6 +21,20 @@ case class HiveTablePartitionGroup(
( implicit val ms : MetaStore,
implicit val hdfs : FileSystem ) extends HiveDataOutput {
+ override def toString() = {
+ val tblPart = s"HiveTable(${dbName}.${tblName})"
+ val groupingPart = grouping.map( _.name).mkString("_")
+ val varPart = s"Vars(${groupingPart})"
+ val partitionPart = requiredPartitions match {
+ case Some(parts) =>{
+ val mkVa = parts.map( va => s"${va.variable.name}=${va.value}" ).mkString("_")
+ s"Partitions(${mkVa})"
+ }
+ case None => ""
+ }
+
+ s"${tblPart}_${varPart}_${partitionPart}"
+ }
override def variables : List[Variable[_]] = {
grouping
diff --git a/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveDriver.scala b/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveDriver.scala
index f34e626..e33f75e 100644
--- a/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveDriver.scala
+++ b/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveDriver.scala
@@ -81,9 +81,34 @@ object HiveDriver extends Logging {
info( s" Track libPath is ${track.libPath}")
info( s" Track resourcePath is ${track.resourcePath}")
- val urls = track.listLibraries
- val resources = track.listResources
- val exportFiles = ( urls ++ resources)
+ //// Allow tracks to specify which classes to export to distributed cache
+ /// so that whole dependency tree doe
+ val auxJarFiles : Iterable[Path] = track.trackProperties.get( Variable("satisfaction.track.hive.aux.jars.path") ) match {
+ case Some("none") => { Iterable[Path]() }
+ case Some( auxJarsString) => {
+ val prefixes = auxJarsString.split(",").toSet
+ track.listLibraries.filter( lb => {
+ prefixes.exists( pre => { lb.name.startsWith( if(pre.endsWith(".jar")) { pre } else { pre + "-" } ) } )
+ })
+ }
+ case None => { track.listLibraries }
+ }
+ val resources : Iterable[Path] = track.trackProperties.get( Variable("satisfaction.track.hive.resources") ) match {
+ case Some("none") => { Iterable[Path]() }
+ case Some( resourcesString) => {
+ info(s" Found property satisfaction.track.hive.resources $resourcesString ")
+ resourcesString.split(",").map( track.resourcePath / _ )
+ }
+ case None => { track.listResources } //// Explicitly set auxJars in track
+ }
+
+ ///// Which jars do we need for Hive ?
+ val hivePrefixes = List[String]("hive-shim" , "hive-common", "hive-exec" )
+ val hiveDependencies : Iterable[Path] = track.listLibraries.filter( { lib => { { hivePrefixes.exists( pre => { lib.name.startsWith(pre) } ) } } } )
+ info(s" Using Hive Jars ${hiveDependencies.mkString(" ")} ")
+
+ val distribCacheFiles = ( auxJarFiles ++ resources ++ hiveDependencies )
+ val exportFiles = ( track.listLibraries ++ track.listResources )
val isolateFlag = track.trackProperties.getProperty("satisfaction.classloader.isolate","true").toBoolean
val urlClassLoader = if( isolateFlag) {
@@ -181,13 +206,13 @@ object HiveDriver extends Logging {
}
- val auxJarPath = exportFiles.map( _.toUri.toString ).mkString(",")
+ val auxJarPath = distribCacheFiles.map( _.toUri.toString ).mkString(",")
info(" Using AuxJarPath " + auxJarPath)
hiveConf.setAuxJars( auxJarPath)
hiveConf.set("hive.aux.jars.path", auxJarPath)
hiveConf.setClassLoader(urlClassLoader)
-
+
//// XXX Move to Scala reflection ...
info( "Instantiating HiveLocalDriver")
//// XXX Specify as track property ..
@@ -217,7 +242,6 @@ object HiveDriver extends Logging {
throw new RuntimeException(s" LocalDriver $hiveLocalDriver really isn't a Hive Driver !!!!")
}
}
-
} catch {
case e: Exception =>
e.printStackTrace(System.out)
diff --git a/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveLocalDriver.scala b/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveLocalDriver.scala
index 35b3b76..7567995 100644
--- a/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveLocalDriver.scala
+++ b/modules/hive/src/main/scala/satisfaction/hadoop/hive/HiveLocalDriver.scala
@@ -33,6 +33,7 @@ import _root_.org.apache.hadoop.io.WritableComparator
import _root_.org.apache.thrift.meta_data.FieldMetaData
import _root_.org.apache.hive.com.esotericsoftware.reflectasm.AccessClassLoader
import org.apache.hadoop.mapreduce.protocol.ClientProtocolProvider
+import org.apache.hadoop.filecache.DistributedCache
/**
@@ -206,6 +207,19 @@ class HiveLocalDriver( val hiveConf : HiveConf = new HiveConf( Config.config, cl
error(" Unexpected error trying to clean threadLocal cloningQueryPlanKryo " , unexpected)
}
}
+
+ try {
+ info(" Calling HConnectionManager.deleteAllConnections() ")
+ val thisClassLoader = this.getClass().getClassLoader
+ val hconnectionClass = thisClassLoader.loadClass("org.apache.hadoop.hbase.client.HConnectionManager")
+
+ val shutdownMeth = hconnectionClass.getDeclaredMethod("deleteAllConnections")
+ shutdownMeth.invoke( null)
+ } catch {
+ case unexpected : Throwable => {
+ warn(" Unexpected error trying to shutdown HBase Connections ")
+ }
+ }
try {
@@ -231,6 +245,78 @@ class HiveLocalDriver( val hiveConf : HiveConf = new HiveConf( Config.config, cl
this.hiveConf.set( prop, propValue)
}
+ /**
+ * Implement the Hive 'add file ' command
+ */
+ def addResource( resourceType : String, resource : String ) : Boolean = {
+ val hiveConfVar = {
+ resourceType.trim.toLowerCase match {
+ case "file" => HiveConf.ConfVars.HIVEADDEDFILES
+ case "files" => HiveConf.ConfVars.HIVEADDEDFILES
+ case "jar" => HiveConf.ConfVars.HIVEADDEDJARS
+ case "jars" => HiveConf.ConfVars.HIVEADDEDJARS
+ case "archive" => HiveConf.ConfVars.HIVEADDEDARCHIVES
+ case "archives" => HiveConf.ConfVars.HIVEADDEDARCHIVES
+ case _ => {
+ error(s"Unknown resource type $resourceType ")
+ return false
+ }
+ }
+ }
+
+ val hdfsURI = """^hdfs://(.+)""".r
+ val fileURI = """"^file://(.+)""".r
+ val absoluteFile = "^/(.*)".r
+ val filename : String = {
+ resource match {
+ case hdfsURI(uri) => {
+ resource
+ }
+ case fileURI(f) => {
+ resource
+ }
+ case absoluteFile(f) => {
+ s"file://$resource"
+ }
+ case _ => {
+ s"file://${System.getProperty("user.dir")}/$resource"
+ }
+ }
+ }
+
+ info(s" Adding resource $filename TO $hiveConfVar ")
+ val checkPath = hiveConf.getVar( hiveConfVar )
+ if( checkPath == null || checkPath.trim.length == 0) {
+ hiveConf.setVar( hiveConfVar, filename)
+ } else {
+ hiveConf.setVar( hiveConfVar, s"${checkPath},${filename}")
+ }
+
+ true
+ }
+ /**
+ public CommandProcessorResponse run(String command) {
+ SessionState ss = SessionState.get();
+ command = new VariableSubstitution().substitute(ss.getConf(),command);
+ String[] tokens = command.split("\\s+");
+ SessionState.ResourceType t;
+ if (tokens.length < 2
+ || (t = SessionState.find_resource_type(tokens[0])) == null) {
+ console.printError("Usage: add ["
+ + StringUtils.join(SessionState.ResourceType.values(), "|")
+ + "] []*");
+ return new CommandProcessorResponse(1);
+ }
+ for (int i = 1; i < tokens.length; i++) {
+ String resourceFile = ss.add_resource(t, tokens[i]);
+ if(resourceFile == null){
+ String errMsg = tokens[i]+" does not exist.";
+ return new CommandProcessorResponse(1,errMsg,null);
+ }
+ }
+ *
+ */
+
/**
override lazy val progressCounter : ProgressCounter = {
new HiveProgress( this )
@@ -280,6 +366,17 @@ class HiveLocalDriver( val hiveConf : HiveConf = new HiveConf( Config.config, cl
override def executeQuery(query: String): Boolean = {
try {
+ //// Hack to support Hive 'ADD FILE ' command
+ //// not quite fully compliant, but will move to
+ //// new HiveServer next release
+ if( query.toLowerCase().trim().startsWith("add")) {
+ val cmdArr = query.split(" ")
+ if(cmdArr.length != 3) {
+ error(" Add File command takes resource type and file name ")
+ return false
+ }
+ return addResource(cmdArr(1), cmdArr(2) )
+ }
val response : CommandProcessorResponse = HiveLocalDriver.retry (5) {
sessionState.execStatic("setCurrentSessionState", sessionState.wrapped)
@@ -333,14 +430,21 @@ class HiveLocalDriver( val hiveConf : HiveConf = new HiveConf( Config.config, cl
///case sqlExc: HiveSQLException =>
case sqlExc: Exception =>
error(s"Dammit !!! Caught Hive SQLException ${sqlExc.getLocalizedMessage} ", sqlExc)
+ driver.get.->("close")
+ driver.get.->("destroy")
+ driver.release
return false
case unexpected : Throwable =>
error(s"Dammit !!! Unexpected SQLException ${unexpected.getLocalizedMessage} ", unexpected)
- throw unexpected
- } finally {
driver.get.->("close")
driver.get.->("destroy")
driver.release
+ throw unexpected
+ } finally {
+ info(" What happens if we don't close the driver each time ??? ")
+ ///driver.get.->("close")
+ ///driver.get.->("destroy")
+ ///driver.release
}
}
@@ -432,7 +536,8 @@ object HiveLocalDriver {
throw retry
}
}
- case clusterException if clusterException.getMessage().contains("Cannot initialize Cluster. Please check your configuration") => {
+ case clusterException if clusterException.getMessage() != null
+ && clusterException.getMessage().contains("Cannot initialize Cluster. Please check your configuration") => {
checkCluster()
println(s" Number of retries = $cnt")
cnt += 1
diff --git a/modules/samples/.cache b/modules/samples/.cache
new file mode 100644
index 0000000..7870129
Binary files /dev/null and b/modules/samples/.cache differ
diff --git a/modules/samples/.classpath b/modules/samples/.classpath
new file mode 100644
index 0000000..d269fa5
--- /dev/null
+++ b/modules/samples/.classpath
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/samples/.project b/modules/samples/.project
new file mode 100644
index 0000000..02f4ba7
--- /dev/null
+++ b/modules/samples/.project
@@ -0,0 +1,12 @@
+
+ satisfaction-samples
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
\ No newline at end of file
diff --git a/modules/samples/.settings/org.scala-ide.sdt.core.prefs b/modules/samples/.settings/org.scala-ide.sdt.core.prefs
new file mode 100644
index 0000000..eb29806
--- /dev/null
+++ b/modules/samples/.settings/org.scala-ide.sdt.core.prefs
@@ -0,0 +1,6 @@
+#Generated by sbteclipse
+#Thu Aug 22 17:46:10 PDT 2013
+scala.compiler.additionalParams=-feature -language\:existentials -language\:postfixOps -language\:implicitConversions -language\:reflectiveCalls
+deprecation=true
+unchecked=true
+scala.compiler.useProjectSettings=true
diff --git a/modules/samples/src/main/resources/fact_content.hql b/modules/samples/src/main/resources/fact_content.hql
new file mode 100644
index 0000000..168b16e
--- /dev/null
+++ b/modules/samples/src/main/resources/fact_content.hql
@@ -0,0 +1,148 @@
+
+use bi_maxwell;
+
+set hive.exec.parallel=true;
+
+SET hive.exec.compress.output=true;
+SET io.seqfile.compression.type=BLOCK;
+
+SET io.sort.mb=512;
+
+
+
+create external table if not exists raw_content
+partitioned by (dt string, network_abbr string)
+row format serde 'com.inadco.ecoadapters.hive.ProtoSerDe'
+with serdeproperties( "messageClass"="com.klout.platform.protos.Topics$FactContent")
+stored as sequencefile
+location '${rawContentDir}' ;
+
+
+alter table raw_content
+add if not exists partition( dt="${dateString}", network_abbr="${networkAbbr}")
+ location '${dateString}/${networkAbbr}';
+
+create external table if not exists actor_action (
+ ks_uid bigint,
+ service_uid string,
+ service_id string,
+ tstamp string,
+ message_id string,
+ action string,
+ actor_service_uid string,
+ tstamp_type string,
+ original_message_id string,
+ original_tstamp string,
+ registered_flag tinyint,
+ actor_ks_uid bigint
+)
+partitioned by (dt string,network_abbr string)
+stored as sequencefile
+location '${actorActionDir}';
+
+alter table actor_action
+add if not exists partition (dt="${dateString}", network_abbr="${networkAbbr}")
+location "${dateString}/${networkAbbr}";
+alter table actor_action partition(dt="${dateString}",network_abbr="${networkAbbr}")
+set fileformat sequencefile;
+
+drop view if exists fact_actor_action_feature_type_view_${networkAbbr};
+create view fact_actor_action_feature_type_view_${networkAbbr}
+as
+ select
+ user.user_id as service_uid,
+ user.service_id as service_id,
+ action.message.message_id as message_id,
+ action.message.`timestamp` as tstamp,
+ concat(action.action_type.action, "_", feature.messagefeaturekey) as action,
+ actor.actor.user_id as actor_service_uid,
+ rc.dt as dt,
+ rc.network_abbr as network_abbr,
+ action.message.timestamp_type as tstamp_type,
+ message.message_id as original_message_id,
+ message.`timestamp` as original_tstamp
+ from ( select user,actions, messages, dt, network_abbr from raw_content
+ where network_abbr = '${networkAbbr}' ) rc
+ lateral view
+ explode( actions ) a as action
+ lateral view
+ explode( action.actors ) aa as actor
+ lateral view
+ explode(messages) mm as message
+ lateral view
+ explode(message.messagefeatures) mf as feature
+ where network_abbr in ("fb", "fp") and (feature.messagefeaturekey = 'VIDEO' or feature.messagefeaturekey = 'PICTURE');
+
+
+drop view if exists fact_actor_action_view_${networkAbbr};
+create view fact_actor_action_view_${networkAbbr}
+as select * from (
+ select
+ user.user_id as service_uid,
+ user.service_id as service_id,
+ action.message.message_id as message_id,
+ action.message.`timestamp` as tstamp,
+ action.action_type.action,
+ actor.actor.user_id as actor_service_uid,
+ rc.dt as dt,
+ rc.network_abbr as network_abbr,
+ action.message.timestamp_type as tstamp_type,
+ messages[0].message_id as original_message_id,
+ messages[0].`timestamp` as original_tstamp
+ from ( select user, actions, messages, dt, network_abbr from raw_content
+ where network_abbr='${networkAbbr}' ) rc
+ lateral view
+ explode( actions ) a as action
+ lateral view
+ explode( action.actors ) aa as actor
+union all
+ select *
+ from fact_actor_action_feature_type_view_${networkAbbr}
+) au;
+
+
+
+
+insert overwrite table actor_action partition(dt="${dateString}", network_abbr="${networkAbbr}")
+select
+ dus.ks_uid,
+ aa.service_uid,
+ aa.service_id,
+ aa.tstamp,
+ aa.message_id,
+ aa.action,
+ aa.actor_service_uid,
+ aa.tstamp_type,
+ aa.original_message_id,
+ aa.original_tstamp,
+ dus.registered_flag,
+ cast(dus_actor.ks_uid as bigint) as actor_ks_uid
+from
+ ( select *
+ from fact_actor_action_view_${networkAbbr}
+ where dt=${dateString} ) aa
+JOIN
+ ( select ks_uid, service_uid, service_id, registered_flag
+ from ksuid_mapping
+ where dt = ${dateString}
+ and service_id = ${featureGroup}
+ and coalesce(optout, cast(0 as tinyint)) = 0 ) dus
+ON
+ ( aa.service_uid = dus.service_uid )
+JOIN
+ ( select ks_uid, service_uid, service_id
+ from ksuid_mapping
+ where dt = ${dateString}
+ and service_id = ${featureGroup}
+ and coalesce(optout, cast(0 as tinyint)) = 0 ) dus_actor
+ON
+ ( aa.actor_service_uid = dus_actor.service_uid )
+WHERE
+ action != 'TWITTER_MENTION'
+ and
+ action != 'TWITTER_RETWEET'
+
+;
+
+
+
diff --git a/modules/samples/src/main/resources/fact_content_kl.hql b/modules/samples/src/main/resources/fact_content_kl.hql
new file mode 100644
index 0000000..d9a1322
--- /dev/null
+++ b/modules/samples/src/main/resources/fact_content_kl.hql
@@ -0,0 +1,79 @@
+set hive.exec.parallel=true;
+
+create external table if not exists raw_content
+partitioned by (dt string, network_abbr string)
+row format serde 'com.inadco.ecoadapters.hive.ProtoSerDe'
+with serdeproperties( "messageClass"="com.klout.platform.protos.Topics$FactContent")
+stored as sequencefile
+location '${rawContentDir}' ;
+
+
+alter table raw_content
+add if not exists partition( dt="${dateString}", network_abbr="kl" )
+ location '${dateString}/kl';
+
+create external table if not exists actor_action (
+ ks_uid bigint,
+ service_uid string,
+ service_id string,
+ tstamp string,
+ message_id string,
+ action string,
+ actor_service_uid string,
+ tstamp_type string,
+ original_message_id string,
+ original_tstamp string,
+ registered_flag tinyint
+)
+partitioned by (dt string,network_abbr string)
+location '${actorActionDir}';
+
+alter table actor_action
+add if not exists partition (dt="${dateString}", network_abbr="kl")
+location "${dateString}/kl";
+
+
+drop view if exists fact_actor_action_view_kl;
+create view fact_actor_action_view_kl
+as select * from (
+ select
+ user.user_id as service_uid,
+ user.service_id as service_id,
+ action.message.message_id as message_id,
+ action.message.`timestamp` as tstamp,
+ action.action_type.action,
+ actor.actor.user_id as actor_service_uid,
+ rc.dt as dt,
+ rc.network_abbr as network_abbr,
+ action.message.timestamp_type as tstamp_type,
+ messages[0].message_id as original_message_id,
+ messages[0].`timestamp` as original_tstamp
+ from ( select user, actions, messages, dt, network_abbr from raw_content
+ where network_abbr='kl' ) rc
+ lateral view
+ explode( actions ) a as action
+ lateral view
+ explode( action.actors ) aa as actor
+) au;
+
+
+insert overwrite table actor_action partition(dt="${dateString}", network_abbr="kl")
+select
+ aa.service_uid as ks_uid,
+ aa.service_uid,
+ aa.service_id,
+ aa.tstamp,
+ aa.message_id,
+ aa.action,
+ aa.actor_service_uid,
+ aa.tstamp_type,
+ aa.original_message_id,
+ aa.original_tstamp,
+ 1 as registered_flag,
+ aa.actor_service_uid as actor_ks_uid
+from
+ fact_actor_action_view_kl aa
+ where dt=${dateString}
+;
+
+
diff --git a/modules/samples/src/main/scala/MaxwellProject.scala b/modules/samples/src/main/scala/MaxwellProject.scala
new file mode 100644
index 0000000..79bcda0
--- /dev/null
+++ b/modules/samples/src/main/scala/MaxwellProject.scala
@@ -0,0 +1,85 @@
+package com.klout.satisfaction.projects
+
+import com.klout.satisfaction.Track
+import com.klout.satisfaction._
+import com.klout.scoozie._
+import com.klout.klout_scoozie._
+import com.klout.klout_scoozie.maxwell._
+import workflows._
+import com.klout.klout_scoozie.common.Networks
+import com.klout.klout_scoozie.common.Network
+
+object MaxwellProject {
+ val networkAbbrVar = Variable[String]("network_abbr", classOf[String])
+ val featureGroupVar = Variable[String]("feature_group", classOf[String])
+ val serviceIdVar = Variable[Int]("service_id", classOf[Int])
+
+ val calcScore = ScoozieGoal(
+ workflow = ScoreCalculation.CalcScore,
+ Set(HiveTable("bi_maxwell", "maxwell_score"),
+ HiveTable("bi_maxwell", "network_score"))
+ )
+ val featureNetworks: Set[Network] =
+ Set(Networks.Klout, Networks.Facebook, Networks.Twitter,
+ Networks.LinkedIn, Networks.Foursquare, Networks.FacebookPages)
+
+ def qualifyByNetwork(networkAbbr: String): (Witness => Witness) = {
+ w: Witness =>
+ w.update(VariableAssignment[String](networkAbbrVar, networkAbbr))
+ }
+
+ def qualifyByFeatureGroup(fg: Int): (Witness => Witness) = {
+ w: Witness =>
+ w.update(VariableAssignment[String](featureGroupVar, fg.toString))
+ }
+
+ def getTopLevel: Goal = {
+ for (network <- featureNetworks) {
+ println(s" Adding dependency on score with features ${network.networkAbbr} ")
+ calcScore.addWitnessRule(
+ qualifyByFeatureGroup(network.featureGroup),
+ featureGenGoal(network))
+ }
+
+ return calcScore
+ }
+
+ def featureGenGoal(network: Network): Goal = {
+ val featureGen = ScoozieGoal(name = s" Feature Generation for ${network.networkFull}",
+ workflow = FeatureGeneration.Finalize,
+ overrides = None,
+ Set(HiveTable("bi_maxwell", "hb_feature_import")))
+ featureGen.addWitnessRule(
+ Goal.stripVariable(Variable("feature_group")) compose qualifyByNetwork(network.networkAbbr),
+ factContentGoal(network))
+ }
+
+ def factContentGoal(networkName: Network): Goal = {
+ networkName.networkAbbr match {
+ case "klout" =>
+ val kloutAA: Goal = HiveGoal(
+ name = "Klout Fact Content",
+ query = HiveGoal.readResource("fact_content_kl.hql"),
+ table = HiveTable("bi_maxwell", "actor_action"));
+ kloutAA.addWitnessRule(Goal.stripVariable(Variable("network_abbr")),
+ WaitForKSUIDMappingGoal);
+ case _ =>
+ val actorAction: Goal = HiveGoal(
+ name = networkName.networkFull + " Fact Content",
+ query = HiveGoal.readResource("fact_content.hql"),
+ table = HiveTable("bi_maxwell", "actor_action"),
+ overrides = None, Set.empty);
+ actorAction.addWitnessRule(
+ Goal.stripVariable(Variable("network_abbr")),
+ WaitForKSUIDMappingGoal);
+ }
+ }
+
+ val WaitForKSUIDMappingGoal: Goal = ScoozieGoal(
+ workflow = WaitForKsUidMapping.Flow,
+ Set(HiveTablePartitionGroup("bi_maxwell", "ksuid_mapping", Variable("dt").asInstanceOf[Variable[Any]])))
+
+ val Project = new Track("Maxwell Score",
+ Set(getTopLevel) )
+
+}
\ No newline at end of file
diff --git a/modules/samples/src/main/scala/bollinger/BollingerProject.scala b/modules/samples/src/main/scala/bollinger/BollingerProject.scala
new file mode 100644
index 0000000..48172cf
--- /dev/null
+++ b/modules/samples/src/main/scala/bollinger/BollingerProject.scala
@@ -0,0 +1,12 @@
+package bollinger
+
+import com.klout.satisfaction.Track
+
+/**
+ * object BollingerProject extends Project(
+ * "Bollinger",
+ * Set(GenerateBollingerBands.goal, HBaseExportBollingerBands)
+ * ) {
+ *
+ * }
+ */
diff --git a/modules/samples/src/main/scala/bollinger/GenerateBollingerBands.scala b/modules/samples/src/main/scala/bollinger/GenerateBollingerBands.scala
new file mode 100644
index 0000000..dcf5c42
--- /dev/null
+++ b/modules/samples/src/main/scala/bollinger/GenerateBollingerBands.scala
@@ -0,0 +1,6 @@
+package bollinger
+
+object GenerateBollingerBands {
+ ////val goal = HiveGoal()
+
+}
\ No newline at end of file
diff --git a/modules/samples/src/test/resources/maxwell.properties b/modules/samples/src/test/resources/maxwell.properties
new file mode 100644
index 0000000..57020d2
--- /dev/null
+++ b/modules/samples/src/test/resources/maxwell.properties
@@ -0,0 +1,253 @@
+
+nameNode=hdfs://jobs-dev-hnn:8020
+nameNodeHost=${dw.nameNodeHost}
+srcNameNode=hdfs://jobs-aa-hnn:8020
+jobTracker=jobs-dev-hnn:8021
+queueName=default
+hbaseNameNode=${nameNode}
+hbaseNameNodeHost=${dw.hbaseNameNodeHost}
+hbaseSecondNameNode=${nameNode}
+doHBaseDistCp=false
+hbaseJobTracker=jobs-dev-hnn:8021
+
+doDistCp=true
+doRemoteDistCp=${dw.doRemoteDistCp}
+
+tsdbHost=bogus_host
+tsdbPort=-1
+
+doSanity=true
+doScoreSanity=true
+
+graphiteRealm=dev-jdb
+graphiteHost=carbon-relay1
+graphitePort=2013
+
+minMoments=1000
+
+dataSizeCheckInKB=1024
+waitForDataTimeoutInSec=14400
+
+applicationRoot=${nameNode}/user/jerome/hive_data_store
+oozie.libpath=${applicationRoot}/lib
+oozie.wf.application.path=${applicationRoot}/maxwell/mw_aggfeatures.xml
+
+scoozie.wf.application.path=${applicationRoot}/maxwell/scooz
+scoozie.oozie.url=http://jobs-dev-sched2:11000/oozie
+
+
+outputDataRoot=/data/hive
+
+dstamp=2012-03-09
+tstamp=2012-03-09 00:00:00
+yesterdstamp=2012-03-08
+prevdstamp=2012-03-07
+datePath=2012/03/09
+dateString=20120309
+yesterdayString=20120308
+prevdayString=20120307
+weekAgoString=20120302
+monthAgoString=20120208
+
+hourString=2100
+lastRunTime=2012-02-21 21:30:00,000
+currentRunTime=2012-02-21 21:45:00,000
+retentionDay=${prevdstamp}
+
+networkAbbr=tw
+networkFull=twitter
+numDays=90
+featureGroup=1
+contentDate=${dateString}
+factContentSrcDir=hdfs://jobs-aa-hnn/data/prod/jobs/networks/${networkFull}Harvester/${contentDate}/*/output
+deletedContentSrcDir=hdfs://jobs-aa-hnn/data/prod/jobs/networks/${networkFull}IncrementalHarvester/deletedActions
+recoveredContentSrcDir=hdfs://jobs-aa-hnn/data/prod/jobs/networks/${networkFull}IncrementalHarvester/recoveredActions
+contentHoldDays=0
+
+rawContentDir=${outputDataRoot}/maxwell/raw_content
+deletedContentAggDir=${outputDataRoot}/maxwell/deleted_content_agg
+deletedContentRawDir=${outputDataRoot}/maxwell/deleted_content_raw
+actorActionDir=${outputDataRoot}/maxwell/actor_action
+ksuidMappingsDir=${outputDataRoot}/maxwell/ksuid_mapping
+optOutSrcDir=/data/prod/jobs/optOutUsers/
+optOutDir=/data/prod/jobs/optOutUsers/
+doKsUidDodSanityCheck=true
+maxRegisteredDrop=0.02
+maxOptoutDrop=0.02
+
+
+msgAggregateSrcDir=hdfs://jobs-aa-hnn/data/prod/jobs/networks/${networkFull}IncrementalHarvester/messageAggregates/${contentDate}/output
+rawContentAggDir=${outputDataRoot}/maxwell/rawAggContent
+
+profilesLoadEnabled=false
+deletedContentLoadEnabled=false
+skipFactContent=false
+profilesSrcDir=hdfs://jobs-aa-hnn/data/prod/inputs/${networkAbbr}/profilesDeduped/parsed/${dateString}/output
+rawProfilesDir=${outputDataRoot}/maxwell/raw_profiles
+ksUidMappingRawDir=/data/prod/jobs/registeredUserKloutIdAssigned/
+ksUidMappingDir=${dw.ksUidMappingDir}
+
+fbFriendsSrcDir=/data/prod/inputs/userGraph/fbFriends/logs
+fbFriendsDestDir=/data/hive/maxwell/fbFriends/
+
+twFriendsSrcDir=hftp://jobs-aa-hnn//data/prod/inputs/userGraph/twFriends/logs
+twFriendsDestDir=/data/prod/inputs/userGraph/twFriends/logs
+twFollowersSrcDir=hftp://jobs-aa-hnn//data/prod/inputs/userGraph/twFollowers/logs
+twFollowersDestDir=/data/prod/inputs/userGraph/twFollowers/logs
+
+fbFriendsDate=${dateString}
+doDistCpFbFriends=true
+fbSubscribersSrcDir=/data/prod/inputs/userGraph/fbSubscribers/logs
+fbSubscribersDestDir=/data/hive/maxwell/fbSubscribers
+userGraphDir=/data/hive/maxwell/user_graph
+fbSubscribersDate=${dateString}
+doDistCpFbSubscribers=true
+
+countDays= 3, 7, 14, 21, 30, 60, 90
+lookbackDays=92
+preAggDays=2
+preAggFeatureCountFlag=false
+
+
+
+featureValueDir=${dw.featureValueDir}
+featureClass=derived
+
+rawCombinedDir=${dw.rawCombinedDir}
+
+classifierDir=${dw.classifierDir}
+wikigraphDir=${dw.wikigraphDir}
+wikiPageInfoDir=${dw.wikiPageInfoDir}
+wikiLinkDir=${dw.wikiLinkDir}
+freebaseQuadruplesRawDir=${dw.freebaseQuadruplesRawDir}
+freebaseTopicRawDir=${dw.freebaseTopicRawDir}
+latestBrandDate=20120413
+# previous stable celeb, wiki graph date: 20120725
+latestCelebDate=${dateString}
+#latest wiki data is kept consistent with the dump we get from wiki media
+latestWikiDate=20130701
+latestWikigraphDate=${dateString}
+latestSpamDate=${dateString}
+latestNoiseDate=${dateString}
+latestWikiLinkFeaturesDate=20120802
+latestFreebaseDate=20120819
+latestWikiTextDate=20130808
+
+hfileFeatureStreamOutputBase=${outputDataRoot}/maxwell/hfile_feature_stream
+hfileScoreOutput=${outputDataRoot}/maxwell/hfile_score/${dateString}
+hfileUserScoreOutput=${outputDataRoot}/maxwell/hfile_user_score/${dateString}
+hfileUserGraphOutput=${outputDataRoot}/maxwell/hfile_user_graph/
+hbFeatureImportDir=${dw.hbFeatureImportDir}
+hbScoreImportDir=${dw.hbScoreImportDir}
+hbUserScoreImportDir=${dw.hbUserScoreImportDir}
+hbUserGraphImportDir=${dw.hbUserGraphImportDir}
+doClassifierHFileLoad=false
+hbMomentRegionCount=64
+hbDashMomentRegionCount=64
+
+hbaseFeatureTablename=${dw.hbaseFeatureTablename}
+hbaseScoreTablename=${dw.hbaseScoreTablename}
+hbaseUserScoreTablename=${dw.hbaseUserScoreTablename}
+hbaseColumnFamily=c
+hbaseColumnValueName=${dw.hbaseColumnValueName}
+zookeeperQuorum=jobs-dev-zoo1,jobs-dev-zoo2,jobs-dev-zoo3
+zookeeperPort=2181
+hbaseName=jobs-dev
+hbaseAlias=primary
+zookeeperQuorumSecond=${dw.zookeeperQuorumSecond}
+zookeeperPortSecond=${dw.zookeeperPortSecond}
+hbaseNameSecond=${dw.hbaseNameSecond}
+hbaseAliasSecond=${dw.hbaseAliasSecond}
+doSecondHBase=${dw.doSecondHBase}
+
+splitSampleSize=125000
+splitFile=${outputDataRoot}/maxwell/hb_split_cf
+
+
+scoreExpiration=144000
+maxBytePerFactStream=900000
+factStreamExpiration=2591000
+ksmDate=${yesterdayString}
+latestScoreDate=${yesterdayString}
+maxMomentActors=20
+proMomentIndexCap=6
+
+
+dashIndexCap=4
+interactionActionList= 'FACEBOOK_COMMENTS' , 'LINKEDIN_COMMENTS' , 'TWITTER_REPLIES', 'TWITTER_VIA' , 'TWITTER_MENTION_EXCLUSIVE', 'GOOGLE_PLUS_COMMENTS' , 'TWITTER_RETWEET_NEW' , 'FACEBOOK_WALLPOSTS' , 'FACEBOOK_PAGES_COMMENTS' , 'FACEBOOK_MENTIONS', 'FACEBOOK_PAGES_MENTIONS' , 'INSTAGRAM_COMMENTS_PICTURE', 'FOURSQUARE_COMMENTS_CHECKIN'
+dashAggActionList= 'TWITTER_RETWEET_OLD', 'FACEBOOK_LIKES' , 'KLOUT_PLUS_K_TOPIC' , 'FOURSQUARE_TIPS_DONE', 'LINKEDIN_LIKES', 'FOURSQUARE_TIPS_TODO', 'GOOGLE_PLUS_PLUSONES', 'FACEBOOK_PAGES_LIKES', 'FACEBOOK_PAGES_LIKES_COUNT', 'FACEBOOK_PAGES_COMMENTS_COUNT', 'INSTAGRAM_LIKES_PICTURE', 'INSTAGRAM_AGG_COMMENTS_PICTURE', 'INSTAGRAM_AGG_LIKES_PICTURE', 'FOURSQUARE_LIKES_CHECKIN'
+maxInteractionCount=20
+
+
+hiveMapAggrFlag=true
+hiveMapAggrHashForceFlushMemoryThreshold=0.55
+hiveMapAggrHashPercentMemory=0.25
+hiveGroupByMapAggrCheckInterval=5000
+mapredChildJavaOpts=-Xmx3586M
+
+
+dashSplitFile=${outputDataRoot}/maxwell/hb_dashboard_split_cf
+dashIndexSplitFile=${outputDataRoot}/maxwell/hb_dashboard_index_split_cf
+
+
+
+
+
+
+jenkinsMomentUrl=${dw.jenkinsMomentUrl}
+jenkinsNetworkName=${networkFull}
+
+
+doGoldenSetMoment=false
+doGoldenSetScore=false
+
+expModelVersion=c.dev3.TWPOP.4.FBPOP.4.LIPOP.4.GPPOP.4.CELEB.4
+defaultNetworkContribs= "LIPOP", 10.0, "FBPOP", 10.0, "GPPOP", 10.0, "CELEB", 10.0, "FSPOP", 10.0, "PLUSK", 10.0, "TWPOP", 10.0 , "FPPOP", 10.0, "WKPOP", 10.0, "IGPOP", 10.0, "BIPOP", 10.0
+prodModelVersion=c.12.TWPOP.9.FBPOP.9.LIPOP.7.GPPOP.6.CELEB.14.FSPOP.7.PLUSK.6.FPPOP.1.WKPOP.1.IGPOP.1.BIPOP.1
+
+#parameteres used in tiny profiles generation
+fbRawLogsSrcDir=/data/prod/inputs/fb/deduped/logs
+gpRawLogsSrcDir=/data/prod/inputs/gp/deduped/logs
+liRawLogsSrcDir=/data/prod/inputs/li/deduped/logs
+fpRawLogsSrcDir=/data/prod/inputs/fp/deduped/logs
+# Instagram does not have a deduped raw logs directory.
+igRawLogsSrcDir=/data/prod/inputs/instagram/activities
+tinyProfilesDir=/data/prod/maxwell/tinyProfilesRaw
+
+#parameters for historical backfill of custom scores like celeb, noise, spam
+backfillRunVersion=20120813001
+hbCustomBackfillScoreImportDir=${dw.hbCustomBackfillScoreImportDir}
+hfileCustomBackfillScoreOutput=${outputDataRoot}/maxwell/hfile_custom_backfill_score/${backfillRunVersion}
+
+bingDir=/data/hive/bing
+
+dedupMoments=false
+actionCounts=false
+
+#variable to pass in scored networks so we can deploy a new network to prod
+#without actually scoring or loading moments
+scoredNetworks=0,1,2,3,4,6,11,13,100,101,102
+momentNetworks={0,1,2,3,4,6,11,13}
+maxMomentsPerNetwork=100000
+
+perkMomentsLookbackDays=90
+
+cappedScoreKSID='1126429'
+cappedScore=96.85
+
+#sanity check for celeb score drops
+#checks if score drop is more than this as compared to prev day
+celebScoreDropValue=5
+#checks only users who had score more than this as of prev day
+celebCheckBaseScore=75
+#checks if the total number of users who dropped by more than celebScoreDropValue exceeds this percent
+celebDropsThreshold=5
+
+#min count for actor_actions checks
+minCount=10
+
+checkFeatureSanity=true
+checkScoreSanity=false
+
+#number of klout moments shipped to bing
+momentsToShip=5
diff --git a/modules/samples/src/test/scala/DistCpGoalSpec.scala b/modules/samples/src/test/scala/DistCpGoalSpec.scala
new file mode 100644
index 0000000..cfc55e9
--- /dev/null
+++ b/modules/samples/src/test/scala/DistCpGoalSpec.scala
@@ -0,0 +1,33 @@
+package com.klout.satisfaction
+package executor
+package actors
+
+import scalaxb._
+import org.specs2.mutable._
+import scala.concurrent.duration._
+import org.joda.time.DateTime
+import com.klout.klout_scoozie.common.Network
+import com.klout.klout_scoozie.common.Networks
+import org.specs2.runner.JUnitRunner
+import org.junit.runner.RunWith
+import org.apache.log4j.Logger
+import org.apache.log4j.Level
+
+@RunWith(classOf[JUnitRunner])
+class DistCpGoalSpec extends Specification {
+
+ "DistCpSpec" should {
+ "DistCp a file from prod to dev" in {
+ val engine = new ProofEngine()
+ val srcPath = new VariablePath("${srcNameNode}${twFriendsSrcDir}/${dateString}/output")
+ val destPath = new VariablePath("${nameNode}/${twFriendsDestDir}/${dateString}/output")
+ val distCpAction = DistCpGoal("DistCp Twitter", srcPath, destPath)
+
+ val runDate = Variable("dateString")
+ val witness = Witness((runDate -> "20130917"))
+ ///val result = engine.satisfyProject(project, witness)
+ Satisfaction.satisfyGoal(distCpAction, witness)
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/modules/samples/src/test/scala/HiveGoalSpec.scala b/modules/samples/src/test/scala/HiveGoalSpec.scala
new file mode 100644
index 0000000..d35d07c
--- /dev/null
+++ b/modules/samples/src/test/scala/HiveGoalSpec.scala
@@ -0,0 +1,40 @@
+package com.klout.satisfaction
+package executor
+package actors
+
+import scalaxb._
+import org.specs2.mutable._
+import scala.concurrent.duration._
+import org.joda.time.DateTime
+import com.klout.klout_scoozie.common.Network
+import com.klout.klout_scoozie.common.Networks
+import org.specs2.runner.JUnitRunner
+import org.junit.runner.RunWith
+import org.apache.log4j.Logger
+import org.apache.log4j.Level
+
+@RunWith(classOf[JUnitRunner])
+class HiveGoalSpec extends Specification {
+ val NetworkAbbr = new Variable[String]("network_abbr", classOf[String])
+ val DoDistcp = new Variable[Boolean]("doDistcp", classOf[Boolean])
+ val runDate = new Variable[String]("dt", classOf[String])
+
+ "HiveGoalSpec" should {
+ "Run a Hive goal" in {
+ val engine = new ProofEngine()
+ val vars: Set[Variable[_]] = Set(NetworkAbbr, runDate)
+ val networkName = Networks.LinkedIn
+ val actorAction: Goal = HiveGoal(
+ name = "Fact Content",
+ query = HiveGoal.readResource("fact_content.hql"),
+ table = HiveTable("bi_maxwell", "actor_action"),
+ overrides = None, Set.empty);
+
+ val witness = Witness((runDate -> "20130910"), (NetworkAbbr -> "li"))
+ ///val result = engine.satisfyProject(project, witness)
+ Satisfaction.satisfyGoal(actorAction, witness)
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/modules/samples/src/test/scala/TestSampleProjectSpec.scala b/modules/samples/src/test/scala/TestSampleProjectSpec.scala
new file mode 100644
index 0000000..066d0d0
--- /dev/null
+++ b/modules/samples/src/test/scala/TestSampleProjectSpec.scala
@@ -0,0 +1,56 @@
+package com.klout.satisfaction.projects
+
+import com.klout.satisfaction._
+import com.klout.satisfaction.executor.actors._
+import scalaxb._
+import org.specs2.mutable._
+import scala.concurrent.duration._
+import org.joda.time.DateTime
+import com.klout.klout_scoozie.maxwell.workflows.WaitForKsUidMapping
+import scala.concurrent.Await
+import scala.util.Try
+import scala.util.Success
+import scala.util.Failure
+import executor.Satisfaction
+
+class TestSampleProjectSpec extends Specification {
+ val NetworkAbbr = Variable[String]("network_abbr", classOf[String])
+ val DoDistcpVar = Variable[Boolean]("doDistcp", classOf[Boolean])
+ val runDateVar = Variable[String]("dt", classOf[String])
+
+ /**
+ * "TestSampleProjectSpec" should {
+ * "run Maxwell" in {
+ * val engine = new ProofEngine()
+ *
+ * val maxwell = MaxwellProject.Project
+ *
+ * val witness = Witness((MaxwellProject.dateParam -> "20130821"),
+ * (MaxwellProject.networkParam -> "li"))
+ *
+ * val topLevelProject = MaxwellProject.calcScore
+ *
+ * val status = engine.satisfyGoal(topLevelProject, witness)
+ *
+ * status.state must_== GoalState.Success
+ * }
+ *
+ */
+
+ "WaitForKsUIDMapping" in {
+ val engine = new ProofEngine()
+
+ ///val waitForKSUID = MaxwellProject.WaitForKSUIDMappingGoal
+
+ val waitForKSUID: Goal = ScoozieGoal(
+ workflow = WaitForKsUidMapping.Flow,
+ Set(HiveTable("bi_maxwell", "ksuid_mapping")))
+
+ val witness = Witness((runDateVar -> "20130827"), MaxwellProject.serviceIdVar -> 1)
+
+ Satisfaction.satisfyGoal(waitForKSUID, witness)
+
+ true
+ }
+
+}
\ No newline at end of file
diff --git a/modules/satisfy-simple/.cache b/modules/satisfy-simple/.cache
new file mode 100644
index 0000000..eb680ea
Binary files /dev/null and b/modules/satisfy-simple/.cache differ
diff --git a/modules/satisfy-simple/.classpath b/modules/satisfy-simple/.classpath
new file mode 100644
index 0000000..75fa95a
--- /dev/null
+++ b/modules/satisfy-simple/.classpath
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/satisfy-simple/.history b/modules/satisfy-simple/.history
new file mode 100644
index 0000000..3d67de4
--- /dev/null
+++ b/modules/satisfy-simple/.history
@@ -0,0 +1,2 @@
+quit
+exit
diff --git a/modules/satisfy-simple/.project b/modules/satisfy-simple/.project
new file mode 100644
index 0000000..7e07d48
--- /dev/null
+++ b/modules/satisfy-simple/.project
@@ -0,0 +1,13 @@
+
+ satisfy-simple
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
+
\ No newline at end of file
diff --git a/modules/satisfy-simple/.settings/org.scala-ide.sdt.core.prefs b/modules/satisfy-simple/.settings/org.scala-ide.sdt.core.prefs
new file mode 100644
index 0000000..b31bae3
--- /dev/null
+++ b/modules/satisfy-simple/.settings/org.scala-ide.sdt.core.prefs
@@ -0,0 +1,6 @@
+#Generated by sbteclipse
+#Wed Jun 18 14:05:08 PDT 2014
+scala.compiler.additionalParams=-feature -language\:existentials -language\:postfixOps -language\:implicitConversions
+deprecation=true
+unchecked=true
+scala.compiler.useProjectSettings=true
diff --git a/modules/satisfy-simple/conf/satisfaction.properties b/modules/satisfy-simple/conf/satisfaction.properties
new file mode 100644
index 0000000..874416e
--- /dev/null
+++ b/modules/satisfy-simple/conf/satisfaction.properties
@@ -0,0 +1,11 @@
+
+#
+# Sample Satisfaction properties file
+#
+
+satisfaction.track.class=com.klout.satisfy.track.simple.SampleProject
+
+
+
+
+
diff --git a/modules/satisfy-simple/project/Build.scala b/modules/satisfy-simple/project/Build.scala
new file mode 100644
index 0000000..962d8df
--- /dev/null
+++ b/modules/satisfy-simple/project/Build.scala
@@ -0,0 +1,78 @@
+import sbt._
+import Keys._
+
+import sbtSatisfy._
+import sbtSatisfy.SatisfyPlugin.SatisfyKeys._
+
+
+
+
+object SatisfySimpleBuild extends Build {
+
+ val main = Project(
+ "satisfy-simple", file(".")
+ ).settings(LibrarySettings: _*).settings(
+ version := "2.6"
+ )
+
+ def excludeFromAll(items: Seq[ModuleID], group: String, artifact: String) =
+ items.map(_.exclude(group, artifact))
+
+ implicit def dependencyFilterer(deps: Seq[ModuleID]) = new Object {
+ def excluding(group: String, artifactId: String) =
+ deps.map(_.exclude(group, artifactId))
+
+ def excludingGroup(group: String) =
+ deps.map(_.exclude(group, "*"))
+ }
+
+
+ def commonDependencies = Seq(
+ ("com.klout.satisfaction" %% "satisfaction-core" % "2.0.1"),
+ "org.specs2" %% "specs2" % "1.14" % "test"
+ )
+
+
+ def commonResolvers = Seq(
+ "snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
+ "releases" at "http://oss.sonatype.org/content/repositories/releases"
+ )
+
+
+
+ def BaseSettings = Seq(
+ resolvers ++= commonResolvers,
+
+ organization := "com.tagged.satisfy",
+
+ scalaVersion := "2.10.2",
+
+ startYear := Some(2013),
+
+ scalacOptions ++= Seq(
+ "-deprecation",
+ "-unchecked",
+ "-feature",
+ "-language:existentials",
+ "-language:postfixOps",
+ "-language:implicitConversions"),
+
+ logLevel in compile := Level.Info,
+
+ libraryDependencies ++= commonDependencies,
+
+
+ credentials := Credentials(Path.userHome / ".ivy2" / ".credentials") :: Nil,
+
+ exportJars := false,
+
+ trackName := "SampleTrack",
+
+ overwriteTrack := true
+
+
+ )
+
+
+ def LibrarySettings = BaseSettings
+}
diff --git a/modules/satisfy-simple/project/build.properties b/modules/satisfy-simple/project/build.properties
new file mode 100644
index 0000000..b876e1f
--- /dev/null
+++ b/modules/satisfy-simple/project/build.properties
@@ -0,0 +1,4 @@
+
+#sbt.version=0.12.3
+#scala.version=2.10.2
+
diff --git a/modules/satisfy-simple/project/plugins.sbt b/modules/satisfy-simple/project/plugins.sbt
new file mode 100644
index 0000000..da5315a
--- /dev/null
+++ b/modules/satisfy-simple/project/plugins.sbt
@@ -0,0 +1,7 @@
+// Comment to get more information during initialization
+logLevel := Level.Info
+
+
+addSbtPlugin( "com.tagged.satisfaction" % "sbt-satisfy" % "0.1")
+
+
diff --git a/modules/satisfy-simple/src/main/.cache b/modules/satisfy-simple/src/main/.cache
new file mode 100644
index 0000000..e6e1070
Binary files /dev/null and b/modules/satisfy-simple/src/main/.cache differ
diff --git a/modules/satisfy-simple/src/main/.classpath b/modules/satisfy-simple/src/main/.classpath
new file mode 100644
index 0000000..1c46405
--- /dev/null
+++ b/modules/satisfy-simple/src/main/.classpath
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/satisfy-simple/src/main/.project b/modules/satisfy-simple/src/main/.project
new file mode 100644
index 0000000..7a5d284
--- /dev/null
+++ b/modules/satisfy-simple/src/main/.project
@@ -0,0 +1,13 @@
+
+ satisfy-usergraph
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
+
\ No newline at end of file
diff --git a/modules/satisfy-simple/src/main/.settings/org.scala-ide.sdt.core.prefs b/modules/satisfy-simple/src/main/.settings/org.scala-ide.sdt.core.prefs
new file mode 100644
index 0000000..69bfd11
--- /dev/null
+++ b/modules/satisfy-simple/src/main/.settings/org.scala-ide.sdt.core.prefs
@@ -0,0 +1,6 @@
+#Generated by sbteclipse
+#Wed Oct 02 16:38:03 PDT 2013
+scala.compiler.additionalParams=-feature -language\:existentials -language\:postfixOps -language\:implicitConversions
+deprecation=true
+unchecked=true
+scala.compiler.useProjectSettings=true
diff --git a/modules/satisfy-simple/src/main/java/com/klout/satisfaction/BoogerObject.java b/modules/satisfy-simple/src/main/java/com/klout/satisfaction/BoogerObject.java
new file mode 100644
index 0000000..1bd4101
--- /dev/null
+++ b/modules/satisfy-simple/src/main/java/com/klout/satisfaction/BoogerObject.java
@@ -0,0 +1,8 @@
+package com.klout.satisfaction;
+
+public class BoogerObject {
+
+ public void doTheGoober(){
+ System.out.println(" Do the Goober !!!");
+ }
+}
diff --git a/modules/satisfy-simple/src/main/resources/hb_user_graph.hql b/modules/satisfy-simple/src/main/resources/hb_user_graph.hql
new file mode 100644
index 0000000..d379fa9
--- /dev/null
+++ b/modules/satisfy-simple/src/main/resources/hb_user_graph.hql
@@ -0,0 +1,32 @@
+source oozie-setup.hql ;
+
+SET hive.exec.compress.output=true;
+SET io.seqfile.compression.type=BLOCK;
+
+drop view if exists hb_user_graph_view;
+create view hb_user_graph_view as
+select
+ hbase_key,
+ hbase_value
+from
+ (select encode_user_graph_key(ks_uid, network_abbr, relation_type, friend_ks_uid) as hbase_key,
+ "1" as hbase_value
+ from user_graph
+ where dt = ${dateString} and
+ network_abbr = "fb" and
+ relation_type = "FACEBOOK_FRIENDS") a;
+
+create external table if not exists hb_user_graph(
+ hbase_key string,
+ hbase_value string
+)
+partitioned by (dt string)
+location '${hbUserGraphImportDir}';
+
+alter table hb_user_graph add if not exists partition (dt='${dateString}')
+ location '${dateString}';
+
+insert overwrite table hb_user_graph partition(dt='${dateString}')
+ select * from hb_user_graph_view;
+
+
diff --git a/modules/satisfy-simple/src/main/resources/tw_user_graph.hql b/modules/satisfy-simple/src/main/resources/tw_user_graph.hql
new file mode 100644
index 0000000..ae4b210
--- /dev/null
+++ b/modules/satisfy-simple/src/main/resources/tw_user_graph.hql
@@ -0,0 +1,85 @@
+
+create external table if not exists tw_friends_json(
+unused string,
+service_uid_json string,
+friends_json string
+)
+partitioned by(dt string)
+row format delimited fields terminated by "\t"
+LOCATION '${nameNode}/${twFriendsDestDir}';
+
+create external table if not exists tw_followers_json(
+unused string,
+service_uid_json string,
+friends_json string
+)
+partitioned by(dt string)
+row format delimited fields terminated by "\t"
+LOCATION '${nameNode}/${twFollowersDestDir}';
+
+alter table tw_${tableAlias}_json add if not exists partition
+(dt=${dateString}) location '${dateString}/output';
+
+drop view if exists tw_${tableAlias}_view;
+create view tw_${tableAlias}_view
+as
+select get_json_object( service_uid_json, "$.klout_id" ) as ks_uid,
+ get_json_object( service_uid_json, "$.service_uid" ) as service_uid,
+ get_json_object( service_uid_json, "$.service_id" ) as service_id,
+ json_split( get_json_object( friends_json, "$.ids" )) as friends_arr
+ from tw_${tableAlias}_json
+ where dt = ${dateString};
+
+drop view if exists tw_${tableAlias}_explode_view;
+create view tw_${tableAlias}_explode_view
+as
+select ks_uid,
+ service_id,
+ friend_service_uid
+from
+ ( select ks_uid, service_id, friends_arr
+ from tw_${tableAlias}_view
+ where ks_uid is not null and
+ friends_arr is not null and
+ size(friends_arr) > 0 ) tw_view
+lateral view
+ explode(friends_arr) fj as friend_service_uid
+group by ks_uid, service_id, friend_service_uid;
+
+drop view if exists user_graph_${tableAlias}_view_tw;
+create view user_graph_${tableAlias}_view_tw as
+select cast(friend.ks_uid as bigint) as ks_uid,
+ cast(ids.ks_uid as bigint) as friend_ks_uid
+from
+( select ks_uid,
+ service_id,
+ friend_service_uid
+ from tw_${tableAlias}_explode_view) friend
+JOIN
+( select ks_uid, service_id, service_uid
+ from ksuid_mapping
+ where dt = ${dateString}
+ and service_id = 1 ) ids
+ON
+( friend.friend_service_uid = ids.service_uid)
+;
+
+create external table if not exists user_graph(
+ ks_uid bigint,
+ friend_ks_uid bigint
+)
+partitioned by(dt string, network_abbr string, relation_type string)
+row format delimited fields terminated by "\t"
+LOCATION '${nameNode}/${userGraphDir}'
+;
+
+alter table user_graph
+add if not exists partition (dt=${dateString}, network_abbr = "tw", relation_type = "${graphType}" )
+location '${dateString}/tw/${graphType}';
+alter table user_graph partition (dt=${dateString}, network_abbr = "tw", relation_type = "${graphType}" )
+set fileformat sequencefile;
+
+
+insert overwrite table user_graph partition(dt=${dateString}, network_abbr = "tw", relation_type = "${graphType}" )
+select ks_uid, friend_ks_uid
+from user_graph_${tableAlias}_view_tw;
diff --git a/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/.SampleGoal.scala.swp b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/.SampleGoal.scala.swp
new file mode 100644
index 0000000..3dc6d4c
Binary files /dev/null and b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/.SampleGoal.scala.swp differ
diff --git a/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/DailyDAU.scala b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/DailyDAU.scala
new file mode 100644
index 0000000..b31200f
--- /dev/null
+++ b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/DailyDAU.scala
@@ -0,0 +1,69 @@
+package com.klout
+package satisfy
+package track
+package simple
+
+import com.klout.satisfaction._
+object SampleGoal {
+
+
+ def apply(name: String, numIterations: Int)(implicit track : Track): Goal = {
+ val variables: List[Variable[_]] = List(Variable("dt"), Variable("network_abbr"), Variable[Int]("service_id", classOf[Int]))
+ val sampSatisfier = new SampleSatisfier(numIterations, 1000)
+ new Goal(name = name, satisfier = Some(sampSatisfier), variables = variables)
+
+ }
+
+ def apply(name: String, varArg: List[Variable[_]], numIterations: Int)(implicit track : Track): Goal = {
+ val sampSatisfier = new SampleSatisfier(numIterations, 1000)
+ new Goal(name = name, satisfier = Some(sampSatisfier), variables = varArg)
+ }
+
+}
+
+///object SampleProject extends Track(TrackDescriptor("SampleTrack")) {
+class SampleProject extends Track(TrackDescriptor("SampleTrack")) with Recurring {
+
+ override def frequency = Recurring.period("1D")
+
+ val dtVar = Variable("dt")
+ val networkAbbrVar = Variable[String]("network_abbr", classOf[String])
+ val serviceIdVar = Variable[Int]("service_id", classOf[Int])
+
+ ///{
+ ///println(" Top level goal is " + topLevelGoal)
+ ///addTopLevelGoal( topLevelGoal )
+ ///}
+
+ val featureNetworks: Set[Network] =
+ Set(Networks.Klout, Networks.Facebook, Networks.Twitter,
+ Networks.LinkedIn, Networks.Foursquare, Networks.FacebookPages)
+
+ val topLevelGoal: Goal = {
+ println(" TopLevel Goal -- Networks = )" + featureNetworks)
+
+ val tlGoal = SampleGoal("Top Level Goal", List(Variable("dt")), 23)
+
+ val waitForKsuidMapping = SampleGoal("Wait for KSUID Mapping", List(Variable("dt")), 60)
+
+ for (network <- featureNetworks) {
+ println(s" Adding dependency on score with features ${network.networkAbbr} ")
+ val subGoal = SampleGoal(network.networkFull + " Features", 20 + (Math.random() * 40).toInt)
+ val subGoal2 = SampleGoal(network.networkFull + " FactContent ", 15 + (Math.random() * 40).toInt)
+ subGoal.addDependency(subGoal2)
+ subGoal2.addDependency(waitForKsuidMapping)
+ tlGoal.addWitnessRule(qualifyByNetwork(network.networkAbbr), subGoal)
+ }
+
+ val classifier = SampleGoal("Wiki Classifiers", 7)
+ tlGoal.addDependency(classifier).declareTopLevel()
+
+ }
+
+ def qualifyByNetwork(networkAbbr: String): (Witness => Witness) = {
+ w: Witness =>
+ w.update(VariableAssignment[String](networkAbbrVar, networkAbbr))
+ }
+
+}
+
diff --git a/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/SampleSatisfier.scala b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/SampleSatisfier.scala
new file mode 100644
index 0000000..9716d97
--- /dev/null
+++ b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/SampleSatisfier.scala
@@ -0,0 +1,57 @@
+package com.klout
+package satisfy
+package track
+package simple
+
+import org.joda.time.DateTime
+
+import com.klout.satisfaction._
+
+/**
+ * Test class for Satisfier..
+ *
+ */
+class SampleSatisfier(progressCount: Int, sleepTime: Long) extends Satisfier with Evidence {
+ var varMap = Set[String]()
+
+ var retCode = true
+ var startTime : DateTime = null
+
+
+ override def name = "SampleSatisfier"
+
+
+
+ @Override
+ override def satisfy(params: Witness): ExecutionResult = {
+ startTime = new DateTime
+ println(" Satisfy for params " + params.raw.mkString(","))
+ varMap ++= params.raw.keySet
+
+ for (i <- Range(0, progressCount)) {
+ println("Doing the thing ;; Progress Count = " + i)
+ Thread.sleep(sleepTime)
+ }
+
+ println(" Returning code " + retCode)
+ val execResult = new ExecutionResult("Simple Satisfier", startTime)
+ execResult.timeEnded = new DateTime
+ execResult.isSuccess = retCode
+
+ execResult
+ }
+
+ def exists(w: Witness): Boolean = {
+ w.raw.keys.forall(v => varMap.contains(v))
+ }
+
+
+ @Override
+ override def abort() : ExecutionResult = {
+ val execResult = new ExecutionResult("Simple Satisfier", startTime )
+ execResult.markFailure
+ execResult.errorMessage = "Aborted by User"
+ execResult
+ }
+
+}
diff --git a/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/networks.scala b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/networks.scala
new file mode 100644
index 0000000..47006ac
--- /dev/null
+++ b/modules/satisfy-simple/src/main/scala/com/klout/satisfaction/simple/networks.scala
@@ -0,0 +1,35 @@
+package com.klout
+package satisfy
+package track
+package simple
+
+case class Network(featureGroup: Int, networkAbbr: String, networkFull: String)
+
+object Networks {
+
+ def Klout = Network(0, "kl", "klout")
+
+ def Twitter = Network(1, "tw", "twitter")
+
+ def Facebook = Network(2, "fb", "facebook")
+
+ def LinkedIn = Network(3, "li", "linkedin")
+
+ def Foursquare = Network(4, "fs", "foursquare")
+
+ def Instagram = Network(6, "ig", "instagram")
+
+ def FacebookPages = Network(11, "fp", "facebook_pages")
+
+ def GooglePlus = Network(13, "gp", "google_plus")
+
+ def Yammer = Network(15, "ya", "yammer")
+
+ def Classifier = Network(100, "df", "classifier")
+
+ def Wikipedia = Network(101, "wk", "wikipedia")
+
+ def Bing = Network(102, "bi", "bing")
+
+ def Yelp = Network(501, "yl", "yelp")
+}
\ No newline at end of file
diff --git a/modules/scoozie/.classpath b/modules/scoozie/.classpath
new file mode 100644
index 0000000..fea4507
--- /dev/null
+++ b/modules/scoozie/.classpath
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/scoozie/.project b/modules/scoozie/.project
new file mode 100644
index 0000000..53b708a
--- /dev/null
+++ b/modules/scoozie/.project
@@ -0,0 +1,13 @@
+
+ satisfaction-scoozie
+
+
+ org.scala-ide.sdt.core.scalabuilder
+
+
+
+ org.scala-ide.sdt.core.scalanature
+ org.eclipse.jdt.core.javanature
+
+
+
\ No newline at end of file
diff --git a/modules/scoozie/.settings/org.scala-ide.sdt.core.prefs b/modules/scoozie/.settings/org.scala-ide.sdt.core.prefs
new file mode 100644
index 0000000..2ae1aef
--- /dev/null
+++ b/modules/scoozie/.settings/org.scala-ide.sdt.core.prefs
@@ -0,0 +1,6 @@
+#Generated by sbteclipse
+#Wed Jan 08 17:05:33 PST 2014
+scala.compiler.additionalParams=-feature -language\:existentials -language\:postfixOps -language\:implicitConversions -language\:reflectiveCalls
+deprecation=true
+unchecked=true
+scala.compiler.useProjectSettings=true
diff --git a/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieGoal.scala b/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieGoal.scala
new file mode 100644
index 0000000..a66d19f
--- /dev/null
+++ b/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieGoal.scala
@@ -0,0 +1,39 @@
+package com.klout
+package satisfaction
+package hadoop
+package scoozie
+
+import com.klout.scoozie._
+import com.klout.scoozie.dsl._
+import com.klout.scoozie.runner._
+
+object ScoozieGoal {
+
+ def apply(name: String,
+ workflow: Workflow,
+ overrides: Option[Substitution] = None,
+ outputs: Set[DataOutput])
+ (implicit track : Track): Goal = {
+
+ val evidence: Set[Evidence] = outputs.toSet[Evidence]
+ val satisfier = new ScoozieSatisfier(workflow)
+ val variables = (for (data <- outputs) yield {
+ data.variables
+ }).flatten
+
+ new Goal(name,
+ Some(satisfier),
+ variables,
+ Set.empty, /// dependencies
+ evidence
+ )
+ }
+
+ def apply(workflow: Workflow,
+ outputs: Set[DataOutput])
+ (implicit track : Track): Goal = {
+ apply( workflow.name, workflow, null, outputs)
+
+ }
+
+}
\ No newline at end of file
diff --git a/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieSatisfier.scala b/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieSatisfier.scala
new file mode 100644
index 0000000..a6c058f
--- /dev/null
+++ b/modules/scoozie/src/main/scala/satisfaction/scoozie/ScoozieSatisfier.scala
@@ -0,0 +1,91 @@
+package com.klout
+package satisfaction
+package hadoop
+package scoozie
+
+import com.klout.scoozie._
+import com.klout.scoozie.dsl._
+import com.klout.scoozie.runner._
+import com.klout.scoozie.jobs._
+import util.{ Left, Right }
+import collection.JavaConversions._
+import org.joda.time.DateTime
+import org.apache.oozie.client.OozieClient
+
+class ScoozieSatisfier(workflow: Workflow) (implicit track : Track) extends Satisfier {
+
+ val appPathParam: Variable[String] = Variable("scoozie.wf.application.path")
+ val ScoozieUrlParam: Variable[String] = Variable("scoozie.oozie.url")
+ val appRootParam: Variable[String] = Variable("applicationRoot")
+ var scoozieUrl : String = null
+
+ @Override
+ override def satisfy(params: Substitution): ExecutionResult = {
+ val timeStarted = new DateTime
+ try {
+ val allParams = params ++ track.getTrackProperties( params)
+
+ if (!allParams.contains(appPathParam)) {
+ throw new IllegalArgumentException("Must specify application path ")
+ }
+ val appPath = scoozieApplicationPath( allParams.get(appPathParam).get, params)
+ println(" Application path = " + appPath)
+ if (!allParams.contains(ScoozieUrlParam)) {
+ throw new IllegalArgumentException("Must specify Oozie URL ")
+ }
+ val scoozieUrl = allParams.get(ScoozieUrlParam).get
+ println("Oozie URL = " + scoozieUrl)
+
+ if (!allParams.contains(ScoozieUrlParam)) {
+ throw new IllegalArgumentException("Must specify Oozie URL ")
+ }
+ val oozieConfig = OozieConfig(scoozieUrl, allParams.raw)
+ RunWorkflow(workflow, appPath, oozieConfig, None) match {
+ case Left(oozieFail) =>
+ //// XXX TODO ... more diagnostic option
+ println(s" Oozie job ${oozieFail.jobId} failed miserably !!!")
+ println(s" Console available at ${oozieFail.consoleUrl})")
+ val execResult = new ExecutionResult(oozieFail.jobId , timeStarted)
+
+ execResult.errorMessage = oozieFail.jobLog
+ execResult.markFailure
+ case Right(oozieSuccess) =>
+ println(s" Huzzah !!! Oozie job ${oozieSuccess.jobId} has completed with great success!!!")
+ val execResult = new ExecutionResult( workflow.name, timeStarted)
+ execResult.markSuccess
+ }
+ } catch {
+ case unexpected: Throwable =>
+ println(" Unexpected exception " + unexpected)
+ unexpected.printStackTrace()
+ val execResult = new ExecutionResult( "Job Failed " + workflow.name, timeStarted )
+ execResult.markUnexpected( unexpected)
+ }
+ }
+
+ override def abort() : ExecutionResult = {
+ /// Can we abort the process ???
+ /// Should be part of scoozie, but
+ /// not currently accessible
+ if(scoozieUrl != null) {
+ val oozieClient = new OozieClient( scoozieUrl)
+ /// Somehow get the Job Id from the scoozie client ...
+ //// For now try killing jobs with that name
+ //// Might not work with multiple oozies
+ oozieClient.getJobsInfo(s"NAME=${workflow.name}") foreach( wfj => {
+ println(s" Killing Oozie WF ${wfj.getAppName} ${wfj.getId} ")
+ oozieClient.kill( wfj.getId )
+ })
+ }
+ val execResult = new ExecutionResult( workflow.name, DateTime.now)
+ execResult.markFailure
+
+ }
+
+
+ def scoozieApplicationPath( basePath : String, witness : Substitution ) : String = {
+ val suffix = witness.pathString
+ s"$basePath/scoozie_${workflow.name}_$suffix.xml"
+ }
+
+}
\ No newline at end of file
diff --git a/project/Build.scala b/project/Build.scala
index f7d55c7..2fa268a 100644
--- a/project/Build.scala
+++ b/project/Build.scala
@@ -23,9 +23,11 @@ import com.typesafe.sbt.web.Import.WebKeys._
object ApplicationBuild extends Build {
- val appVersion = "2.5.10"
+ val appVersion = "2.6.2"
- val hiveVersion = "0.13.1"
+ val hiveVersion = "0.14.0.2.2.4.2-2"
+
+ val hadoopVersion = "2.6.0.2.2.4.2-2"
val core = Project(
"satisfaction-core",
@@ -160,8 +162,9 @@ fi"""),
rpmPost := Option("""
export JAVA_HOME=/usr/java/default
-export HADOOP_CONF_DIR=/etc/hadoop/conf
-export HADOOP_HOME=/usr/lib/hadoop
+export HADOOP_CONF_DIR=/usr/hdp/current/hadoop-client/etc/hadoop
+export HADOOP_HOME=/usr/hdp/current/hadoop-client
+export HIVE_CONF_DIR=/usr/hdp/current/hive-client/conf
""")
@@ -188,13 +191,13 @@ export HADOOP_HOME=/usr/lib/hadoop
def hadoopDependencies = Seq(
- ("org.apache.hadoop" % "hadoop-common" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-hdfs" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-mapreduce-client-app" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-mapreduce-client-common" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-mapreduce-client-core" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-mapreduce-client-jobclient" % "2.3.0"),
- ("org.apache.hadoop" % "hadoop-distcp" % "2.3.0"),
+ ("org.apache.hadoop" % "hadoop-common" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-hdfs" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-mapreduce-client-app" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-mapreduce-client-common" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-mapreduce-client-core" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-mapreduce-client-jobclient" % hadoopVersion),
+ ("org.apache.hadoop" % "hadoop-distcp" % hadoopVersion),
("org.hamcrest" % "hamcrest-core" % "1.3" ) ,
("ch.qos.logback" % "logback-classic" % "1.0.13" ),
("org.slf4j" % "log4j-over-slf4j" % "1.7.7" )
@@ -202,7 +205,9 @@ export HADOOP_HOME=/usr/lib/hadoop
.excluding("junit","junit")
.excluding("log4j", "log4j")
.excluding("org.slf4j","slf4j-log4j12")
- .excludingGroup("org.jboss.netty" ) ++ testDependencies
+ .excluding("org.mortbay.jetty","jetty")
+ .excluding("org.mortbay.jetty","jetty-util")
+ .excluding("org.jboss.netty", "netty" ) ++ testDependencies
def coreDependencies = Seq(
("org.slf4j" % "slf4j-api" % "1.7.7"),
@@ -212,8 +217,8 @@ export HADOOP_HOME=/usr/lib/hadoop
) ++ testDependencies
def jsonDependencies = Seq(
- ("org.json4s" %% "json4s-jackson" % "3.2.9" )
- )
+ ("org.json4s" %% "json4s-jackson" % "3.2.9" )
+ )
def metastoreDependencies = Seq(
("org.apache.hive" % "hive-common" % hiveVersion),
@@ -221,9 +226,14 @@ export HADOOP_HOME=/usr/lib/hadoop
("org.apache.hive" % "hive-metastore" % hiveVersion),
("org.apache.hive" % "hive-serde" % hiveVersion),
("org.apache.hive" % "hive-exec" % hiveVersion),
+ ("org.apache.calcite" % "calcite-core" % "0.9.1-incubating"),
+ ("org.apache.calcite" % "calcite-avatica" % "0.9.1-incubating"),
("org.apache.thrift" % "libfb303" % "0.7.0")
).excluding( "log4j", "log4j" ).excluding("org.slf4j", "slf4j-log4j12")
+ .excluding("org.mortbay.jetty", "jetty")
+ .excluding("org.mortbay.jetty", "jetty-util")
.excluding("org.jboss.netty", "netty")
+ .excluding("org.pentaho", "pentaho-aggdesigner-algorithm")
def hiveDependencies = Seq(
("org.apache.hive" % "hive-common" % hiveVersion),
@@ -235,11 +245,14 @@ export HADOOP_HOME=/usr/lib/hadoop
("org.apache.hive" % "hive-hbase-handler" % hiveVersion),
("org.apache.hive" % "hive-jdbc" % hiveVersion),
("org.apache.hive" % "hive-service" % hiveVersion ),
+ ////("org.apache.calcite" % "calcite-core" % "0.9.1-incubating"),
+ /////("org.apache.calcite" % "calcite-avatica" % "0.9.1-incubating"),
("org.apache.thrift" % "libfb303" % "0.7.0" ),
("org.antlr" % "antlr-runtime" % "3.4" )
).excluding("org.slf4j", "slf4j-log4j12")
.excluding("org.jboss.netty", "netty")
- .excludingGroup("org.jboss.netty") ++ metastoreDependencies ++ testDependencies
+ .excluding("org.mortbay.jetty", "jetty")
+ .excluding("org.mortbay.jetty", "jetty-util") ++ metastoreDependencies ++ testDependencies
def engineDependencies = Seq(
@@ -257,6 +270,8 @@ export HADOOP_HOME=/usr/lib/hadoop
def Resolvers = resolvers ++= Seq(
"artifactory.tagged.com" at "https://artifactory.tagged.com/artifactory/repo",
+ "HortonWorks Releases" at "http://repo.hortonworks.com/content/repositories/releases/",
+ "ConJars.org" at "http://conjars.org/repo",
"snapshots" at "http://oss.sonatype.org/content/repositories/snapshots",
"releases" at "http://oss.sonatype.org/content/repositories/releases",
"Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/",