--- a/js/flotr2/examples/js/Examples.js +++ b/js/flotr2/examples/js/Examples.js @@ -1,1 +1,292 @@ - +(function () { + +var + E = Flotr.EventAdapter, + _ = Flotr._, + + CLICK = 'click', + EXAMPLE = 'example', + MOUSEENTER = 'mouseenter', + MOUSELEAVE = 'mouseleave', + + DOT = '.', + + CN_EXAMPLES = 'flotr-examples', + CN_CONTAINER = 'flotr-examples-container', + CN_RESET = 'flotr-examples-reset', + CN_THUMBS = 'flotr-examples-thumbs', + CN_THUMB = 'flotr-examples-thumb', + CN_COLLAPSED = 'flotr-examples-collapsed', + CN_HIGHLIGHT = 'flotr-examples-highlight', + CN_LARGE = 'flotr-examples-large', + CN_MEDIUM = 'flotr-examples-medium', + CN_SMALL = 'flotr-examples-small', + CN_MOBILE = 'flotr-examples-mobile', + + T_THUMB = '
', + + TEMPLATE = '' + + '
' + + '
View All
' + + '
' + + '
' + + '
' + +Examples = function (o) { + + if (_.isUndefined(Flotr.ExampleList)) throw "Flotr.ExampleList not defined."; + + this.options = o; + this.list = Flotr.ExampleList; + this.current = null; + this.single = false; + + this._initNodes(); + this._example = new Flotr.Examples.Example({ + node : this._exampleNode + }); + + //console.time(EXAMPLE); + //console.profile(); + this._initExamples(); + //console.profileEnd(); + //console.timeEnd(EXAMPLE); +}; + +Examples.prototype = { + + examples : function () { + + var + styles = {cursor : 'pointer'}, + thumbsNode = this._thumbsNode, + list = this.list.get(), + that = this; + + var + order = [ + "basic", + "basic-axis", + "basic-bars", + "basic-bars-horizontal", + "basic-bar-stacked", + "basic-stacked-horizontal", + "basic-pie", + "basic-radar", + "basic-bubble", + "basic-candle", + "basic-legend", + "mouse-tracking", + "mouse-zoom", + "mouse-drag", + "basic-time", + "negative-values", + "click-example", + "download-image", + "download-data", + "advanced-titles", + "color-gradients", + "basic-timeline", + "advanced-markers" + ]; + + (function runner () { + var + key = order.shift(), + example = list[key]; + + if (example.type === 'profile' || example.type === 'test') return; + var node = $(T_THUMB); + node.data('example', example); + thumbsNode.append(node); + that._example.executeCallback(example, node); + node.click(function () {that._loadExample(example)}); + + if (order.length) setTimeout(runner, 20); + })(); + + function zoomHandler (e) { + var + node = $(e.currentTarget), + example = node.data('example'), + orientation = e.data.orientation; + if (orientation ^ node.hasClass(CN_HIGHLIGHT)) { + node.toggleClass(CN_HIGHLIGHT).css(styles); + that._example.executeCallback(example, node); + } + } + + thumbsNode.delegate(DOT + CN_THUMB, 'mouseenter', {orientation : true}, zoomHandler); + thumbsNode.delegate(DOT + CN_THUMB, 'mouseleave', {orientation : false}, zoomHandler); + + if ($(window).hashchange) { + $(window).hashchange(function () { + that._loadHash(); + }); + } + }, + + _loadExample : function (example) { + if (example) { + if (this._currentExample !== example) { + this._currentExample = example; + } else { + return; + } + + window.location.hash = '!'+(this.single ? 'single/' : '')+example.key; + + if (!scroller) { + this._thumbsNode.css({ + position: 'absolute', + height: '0px', + overflow: 'hidden', + width: '0px' + }); + this._resetNode.css({ + top: '16px' + }); + } + + this._examplesNode.addClass(CN_COLLAPSED); + this._exampleNode.show(); + this._example.setExample(example); + this._resize(); + $(document).scrollTop(0); + } + }, + + _reset : function () { + window.location.hash = ''; + + if (!scroller) { + this._thumbsNode.css({ + position: '', + height: '', + overflow: '', + width: '' + }); + } + + this._examplesNode.removeClass(CN_COLLAPSED); + this._thumbsNode.height(''); + this._exampleNode.hide(); + }, + + _initNodes : function () { + + var + node = $(this.options.node), + that = this, + examplesNode = $(TEMPLATE); + + that._resetNode = examplesNode.find(DOT+CN_RESET); + that._exampleNode = examplesNode.find(DOT+CN_CONTAINER); + that._thumbsNode = examplesNode.find(DOT+CN_THUMBS); + that._examplesNode = examplesNode; + + that._resetNode.click(function () { + that._reset(); + }); + + node.append(examplesNode); + + this._initResizer(); + }, + + _initResizer : function () { + + var + that = this, + node = that._examplesNode, + page = $(window), + currentClass; + + $(window).resize(applySize); + applySize(); + + function applySize () { + + var + height = page.height() - (that.options.thumbPadding || 0), + width = page.width(), + newClass; + + if (width > 1760) { + newClass = CN_LARGE; + that._thumbsNode.height(height); + } else if (width > 1140) { + newClass = CN_MEDIUM; + that._thumbsNode.height(height); + } else { + newClass = CN_SMALL; + that._thumbsNode.height(''); + } + + if (currentClass !== newClass) { + if (currentClass) + that._examplesNode.removeClass(currentClass); + that._examplesNode.addClass(newClass); + currentClass = newClass; + } + } + + this._resize = applySize; + }, + _initExamples : function () { + var + hash = window.location.hash, + example, params; + + hash = hash.substring(2); + params = hash.split('/'); + + if (params.length == 1) { + this.examples(); + if (hash) { + this._loadHash(); + } + } + else { + if (params[0] == 'single') { + this.single = true; + this._loadExample( + this.list.get(params[1]) + ); + } + } + }, + _loadHash : function () { + + var + hash = window.location.hash, + example; + + hash = hash.substring(2); + if (hash) { + example = this.list.get(hash); + this._loadExample(example); + } else { + this._reset(); + } + } +} + +var scroller = (function () { + + var + mobile = !!( + navigator.userAgent.match(/Android/i) || + navigator.userAgent.match(/webOS/i) || + navigator.userAgent.match(/iPhone/i) || + navigator.userAgent.match(/iPod/i) + ), + mozilla = !!$.browser.mozilla; + + return (!mobile || mozilla); +})(); + +Flotr.Examples = Examples; + +})(); +