Team:Alberta/application.js
From 2011.igem.org
(Difference between revisions)
m |
|||
(One intermediate revision not shown) | |||
Line 11: | Line 11: | ||
}); | }); | ||
+ | |||
+ | /* | ||
+ | * jQuery FlexSlider v1.7 | ||
+ | * http://flex.madebymufffin.com | ||
+ | * | ||
+ | * Copyright 2011, Tyler Smith | ||
+ | * Free to use under the MIT license. | ||
+ | * http://www.opensource.org/licenses/mit-license.php | ||
+ | * | ||
+ | * Shoutout to Darin Richardson for his wonderful contributions to the betterment of FlexSlider | ||
+ | */ | ||
+ | |||
+ | ;(function ($) { | ||
+ | |||
+ | //FlexSlider: Object Instance | ||
+ | $.flexslider = function(el, options) { | ||
+ | var slider = el; | ||
+ | |||
+ | slider.init = function() { | ||
+ | slider.vars = $.extend({}, $.flexslider.defaults, options); | ||
+ | slider.data('flexslider', true); | ||
+ | slider.container = $('.slides', slider); | ||
+ | slider.slides = $('.slides > li', slider); | ||
+ | slider.count = slider.slides.length; | ||
+ | slider.animating = false; | ||
+ | slider.currentSlide = slider.vars.slideToStart; | ||
+ | slider.animatingTo = slider.currentSlide; | ||
+ | slider.atEnd = (slider.currentSlide == 0) ? true : false; | ||
+ | slider.eventType = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click'; | ||
+ | slider.cloneCount = 0; | ||
+ | slider.cloneOffset = 0; | ||
+ | |||
+ | //Test for controlsContainer | ||
+ | if (slider.vars.controlsContainer != "") { | ||
+ | slider.controlsContainer = $(slider.vars.controlsContainer).eq($('.slides').index(slider.container)); | ||
+ | slider.containerExists = slider.controlsContainer.length > 0; | ||
+ | } | ||
+ | //Test for manualControls | ||
+ | if (slider.vars.manualControls != "") { | ||
+ | slider.manualControls = $(slider.vars.manualControls, ((slider.containerExists) ? slider.controlsContainer : slider)); | ||
+ | slider.manualExists = slider.manualControls.length > 0; | ||
+ | } | ||
+ | |||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | // FlexSlider: Randomize Slides | ||
+ | if (slider.vars.randomize) { | ||
+ | slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); | ||
+ | slider.container.empty().append(slider.slides); | ||
+ | } | ||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | // FlexSlider: Slider Animation Initialize | ||
+ | if (slider.vars.animation.toLowerCase() == "slide") { | ||
+ | slider.css({"overflow": "hidden"}); | ||
+ | if (slider.vars.animationLoop) { | ||
+ | slider.cloneCount = 2; | ||
+ | slider.cloneOffset = 1; | ||
+ | slider.container.append(slider.slides.filter(':first').clone().addClass('clone')).prepend(slider.slides.filter(':last').clone().addClass('clone')); | ||
+ | } | ||
+ | slider.container.width(((slider.count + slider.cloneCount) * slider.width()) + 2000); //extra width to account for quirks | ||
+ | //create newSlides to capture possible clones | ||
+ | slider.newSlides = $('.slides > li', slider); | ||
+ | //Timeout function to give browser enough time to get proper width initially | ||
+ | setTimeout(function() { | ||
+ | slider.newSlides.width(slider.width()).css({"float": "left"}).show(); | ||
+ | }, 100); | ||
+ | slider.container.css({"marginLeft": (-1 * (slider.currentSlide + slider.cloneOffset))* slider.width() + "px"}); | ||
+ | } else { //Default to fade | ||
+ | slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%"}).eq(slider.currentSlide).fadeIn(400); | ||
+ | } | ||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | // FlexSlider: Control Nav | ||
+ | if (slider.vars.controlNav) { | ||
+ | if (slider.manualExists) { | ||
+ | slider.controlNav = slider.manualControls; | ||
+ | } else { | ||
+ | var controlNavScaffold = $('<ol class="flex-control-nav"></ol>'); | ||
+ | var j = 1; | ||
+ | for (var i = 0; i < slider.count; i++) { | ||
+ | controlNavScaffold.append('<li><a>' + j + '</a></li>'); | ||
+ | j++; | ||
+ | } | ||
+ | |||
+ | if (slider.containerExists) { | ||
+ | $(slider.controlsContainer).append(controlNavScaffold); | ||
+ | slider.controlNav = $('.flex-control-nav li a', slider.controlsContainer); | ||
+ | } else { | ||
+ | slider.append(controlNavScaffold); | ||
+ | slider.controlNav = $('.flex-control-nav li a', slider); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | slider.controlNav.eq(slider.currentSlide).addClass('active'); | ||
+ | |||
+ | slider.controlNav.bind(slider.eventType, function(event) { | ||
+ | event.preventDefault(); | ||
+ | if (!$(this).hasClass('active')) { | ||
+ | slider.flexAnimate(slider.controlNav.index($(this)), slider.vars.pauseOnAction); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | /////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider: Direction Nav | ||
+ | if (slider.vars.directionNav) { | ||
+ | var directionNavScaffold = $('<ul class="flex-direction-nav"><li><a class="prev" href="#">' + slider.vars.prevText + '</a></li><li><a class="next" href="#">' + slider.vars.nextText + '</a></li></ul>'); | ||
+ | |||
+ | if (slider.containerExists) { | ||
+ | $(slider.controlsContainer).append(directionNavScaffold); | ||
+ | slider.directionNav = $('.flex-direction-nav li a', slider.controlsContainer); | ||
+ | } else { | ||
+ | slider.append(directionNavScaffold); | ||
+ | slider.directionNav = $('.flex-direction-nav li a', slider); | ||
+ | } | ||
+ | |||
+ | //Set initial disable styles if necessary | ||
+ | if (!slider.vars.animationLoop) { | ||
+ | if (slider.currentSlide == 0) { | ||
+ | slider.directionNav.filter('.prev').addClass('disabled'); | ||
+ | } else if (slider.currentSlide == slider.count - 1) { | ||
+ | slider.directionNav.filter('.next').addClass('disabled'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | slider.directionNav.bind(slider.eventType, function(event) { | ||
+ | event.preventDefault(); | ||
+ | var target = ($(this).hasClass('next')) ? slider.getTarget('next') : slider.getTarget('prev'); | ||
+ | |||
+ | if (slider.canAdvance(target)) { | ||
+ | slider.flexAnimate(target, slider.vars.pauseOnAction); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider: Keyboard Nav | ||
+ | if (slider.vars.keyboardNav && $('ul.slides').length == 1) { | ||
+ | $(document).keyup(function(event) { | ||
+ | if (slider.animating) { | ||
+ | return; | ||
+ | } else if (event.keyCode != 39 && event.keyCode != 37){ | ||
+ | return; | ||
+ | } else { | ||
+ | if (event.keyCode == 39) { | ||
+ | var target = slider.getTarget('next'); | ||
+ | } else if (event.keyCode == 37){ | ||
+ | var target = slider.getTarget('prev'); | ||
+ | } | ||
+ | |||
+ | if (slider.canAdvance(target)) { | ||
+ | slider.flexAnimate(target, slider.vars.pauseOnAction); | ||
+ | } | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider: Slideshow Setup | ||
+ | if (slider.vars.slideshow) { | ||
+ | //pauseOnHover | ||
+ | if (slider.vars.pauseOnHover && slider.vars.slideshow) { | ||
+ | slider.hover(function() { | ||
+ | slider.pause(); | ||
+ | }, function() { | ||
+ | slider.resume(); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | //Initialize animation | ||
+ | slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider: Pause/Play | ||
+ | if (slider.vars.pausePlay) { | ||
+ | var pausePlayScaffold = $('<div class="flex-pauseplay"><span></span></div>'); | ||
+ | |||
+ | if (slider.containerExists) { | ||
+ | slider.controlsContainer.append(pausePlayScaffold); | ||
+ | slider.pausePlay = $('.flex-pauseplay span', slider.controlsContainer); | ||
+ | } else { | ||
+ | slider.append(pausePlayScaffold); | ||
+ | slider.pausePlay = $('.flex-pauseplay span', slider); | ||
+ | } | ||
+ | |||
+ | var pausePlayState = (slider.vars.slideshow) ? 'pause' : 'play'; | ||
+ | slider.pausePlay.addClass(pausePlayState).text(pausePlayState); | ||
+ | |||
+ | slider.pausePlay.click(function(event) { | ||
+ | event.preventDefault(); | ||
+ | ($(this).hasClass('pause'))? slider.pause() : slider.resume(); | ||
+ | }); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider:Touch Swip Gestures | ||
+ | //Credit of concept: TouchSwipe - http://www.netcu.de/jquery-touchwipe-iphone-ipad-library | ||
+ | if (slider.vars.touchSwipe && 'ontouchstart' in document.documentElement) { | ||
+ | slider.each(function() { | ||
+ | var startX, | ||
+ | min_move_x = 20; | ||
+ | isMoving = false; | ||
+ | |||
+ | function cancelTouch() { | ||
+ | this.removeEventListener('touchmove', onTouchMove); | ||
+ | startX = null; | ||
+ | isMoving = false; | ||
+ | } | ||
+ | function onTouchMove(e) { | ||
+ | if (isMoving) { | ||
+ | var x = e.touches[0].pageX, | ||
+ | dx = startX - x; | ||
+ | |||
+ | if(Math.abs(dx) >= min_move_x) { | ||
+ | cancelTouch(); | ||
+ | var target = (dx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); | ||
+ | |||
+ | if (slider.canAdvance(target)) { | ||
+ | slider.flexAnimate(target, slider.vars.pauseOnAction); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | function onTouchStart(e) { | ||
+ | if (e.touches.length == 1) { | ||
+ | startX = e.touches[0].pageX; | ||
+ | isMoving = true; | ||
+ | this.addEventListener('touchmove', onTouchMove, false); | ||
+ | } | ||
+ | } | ||
+ | if ('ontouchstart' in document.documentElement) { | ||
+ | this.addEventListener('touchstart', onTouchStart, false); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | //FlexSlider: Resize Functions (If necessary) | ||
+ | if (slider.vars.animation.toLowerCase() == "slide") { | ||
+ | slider.sliderTimer; | ||
+ | $(window).resize(function(){ | ||
+ | slider.newSlides.width(slider.width()); | ||
+ | slider.container.width(((slider.count + slider.cloneCount) * slider.width()) + 2000); //extra width to account for quirks | ||
+ | |||
+ | //Slider resize reset | ||
+ | clearTimeout(slider.sliderTimer); | ||
+ | slider.sliderTimer = setTimeout(function(){ | ||
+ | slider.flexAnimate(slider.currentSlide); | ||
+ | }, 300); | ||
+ | }); | ||
+ | } | ||
+ | ////////////////////////////////////////////////////////////////// | ||
+ | |||
+ | //FlexSlider: start() Callback | ||
+ | slider.vars.start(slider); | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Animation Actions | ||
+ | slider.flexAnimate = function(target, pause) { | ||
+ | if (!slider.animating) { | ||
+ | //Animating flag | ||
+ | slider.animating = true; | ||
+ | |||
+ | //Optional paramter to pause slider when making an anmiation call | ||
+ | if (pause) { | ||
+ | slider.pause(); | ||
+ | } | ||
+ | |||
+ | //Update controlNav | ||
+ | if (slider.vars.controlNav) { | ||
+ | slider.controlNav.removeClass('active').eq(target).addClass('active'); | ||
+ | } | ||
+ | |||
+ | //Is the slider at either end | ||
+ | slider.atEnd = (target == 0 || target == slider.count - 1) ? true : false; | ||
+ | if (!slider.vars.animationLoop) { | ||
+ | if (target == 0) { | ||
+ | slider.directionNav.removeClass('disabled').filter('.prev').addClass('disabled'); | ||
+ | } else if (target == slider.count - 1) { | ||
+ | slider.directionNav.removeClass('disabled').filter('.next').addClass('disabled'); | ||
+ | slider.pause(); | ||
+ | //FlexSlider: end() of cycle Callback | ||
+ | slider.vars.end(slider); | ||
+ | } else { | ||
+ | slider.directionNav.removeClass('disabled'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: before() animation Callback | ||
+ | slider.animatingTo = target; | ||
+ | slider.vars.before(slider); | ||
+ | |||
+ | if (slider.vars.animation.toLowerCase() == "slide") { | ||
+ | |||
+ | if (slider.currentSlide == 0 && target == slider.count - 1 && slider.vars.animationLoop) { | ||
+ | slider.slideString = "0px"; | ||
+ | } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.vars.animationLoop) { | ||
+ | slider.slideString = (-1 * (slider.count + 1)) * slider.slides.filter(':first').width() + "px"; | ||
+ | } else { | ||
+ | slider.slideString = (-1 * (target + slider.cloneOffset)) * slider.slides.filter(':first').width() + "px"; | ||
+ | } | ||
+ | slider.container.animate({"marginLeft": slider.slideString}, slider.vars.animationDuration, function(){ | ||
+ | //Jump the slider if necessary | ||
+ | if (slider.currentSlide == 0 && target == slider.count - 1 && slider.vars.animationLoop) { | ||
+ | slider.container.css({"marginLeft": (-1 * slider.count) * slider.slides.filter(':first').width() + "px"}); | ||
+ | } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.vars.animationLoop) { | ||
+ | slider.container.css({"marginLeft": -1 * slider.slides.filter(':first').width() + "px"}); | ||
+ | } | ||
+ | slider.animating = false; | ||
+ | slider.currentSlide = target; | ||
+ | //FlexSlider: after() animation Callback | ||
+ | slider.vars.after(slider); | ||
+ | }); | ||
+ | } else { //Default to Fade | ||
+ | slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationDuration); | ||
+ | slider.slides.eq(target).fadeIn(slider.vars.animationDuration, function() { | ||
+ | slider.animating = false; | ||
+ | slider.currentSlide = target; | ||
+ | //FlexSlider: after() animation Callback | ||
+ | slider.vars.after(slider); | ||
+ | }); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Automatic Slideshow | ||
+ | slider.animateSlides = function() { | ||
+ | if (!slider.animating) { | ||
+ | var target = (slider.currentSlide == slider.count - 1) ? 0 : slider.currentSlide + 1; | ||
+ | slider.flexAnimate(target); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Automatic Slideshow Pause | ||
+ | slider.pause = function() { | ||
+ | clearInterval(slider.animatedSlides); | ||
+ | if (slider.vars.pausePlay) { | ||
+ | slider.pausePlay.removeClass('pause').addClass('play').text('play'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Automatic Slideshow Start/Resume | ||
+ | slider.resume = function() { | ||
+ | slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); | ||
+ | if (slider.vars.pausePlay) { | ||
+ | slider.pausePlay.removeClass('play').addClass('pause').text('pause'); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Helper function for non-looping sliders | ||
+ | slider.canAdvance = function(target) { | ||
+ | if (!slider.vars.animationLoop && slider.atEnd) { | ||
+ | if (slider.currentSlide == 0 && target == slider.count - 1 && slider.direction != "next") { | ||
+ | return false; | ||
+ | } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.direction == "next") { | ||
+ | return false; | ||
+ | } else { | ||
+ | return true; | ||
+ | } | ||
+ | } else { | ||
+ | return true; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Helper function to determine animation target | ||
+ | slider.getTarget = function(dir) { | ||
+ | slider.direction = dir; | ||
+ | if (dir == "next") { | ||
+ | return (slider.currentSlide == slider.count - 1) ? 0 : slider.currentSlide + 1; | ||
+ | } else { | ||
+ | return (slider.currentSlide == 0) ? slider.count - 1 : slider.currentSlide - 1; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Initialize | ||
+ | slider.init(); | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Default Settings | ||
+ | $.flexslider.defaults = { | ||
+ | animation: "fade", //Select your animation type (fade/slide) | ||
+ | slideshow: true, //Should the slider animate automatically by default? (true/false) | ||
+ | slideshowSpeed: 7000, //Set the speed of the slideshow cycling, in milliseconds | ||
+ | animationDuration: 600, //Set the speed of animations, in milliseconds | ||
+ | directionNav: true, //Create navigation for previous/next navigation? (true/false) | ||
+ | controlNav: true, //Create navigation for paging control of each clide? (true/false) | ||
+ | keyboardNav: true, //Allow for keyboard navigation using left/right keys (true/false) | ||
+ | touchSwipe: true, //Touch swipe gestures for left/right slide navigation (true/false) | ||
+ | prevText: "Previous", //Set the text for the "previous" directionNav item | ||
+ | nextText: "Next", //Set the text for the "next" directionNav item | ||
+ | pausePlay: false, //Create pause/play dynamic element (true/false) | ||
+ | randomize: false, //Randomize slide order on page load? (true/false) | ||
+ | slideToStart: 0, //The slide that the slider should start on. Array notation (0 = first slide) | ||
+ | animationLoop: true, //Should the animation loop? If false, directionNav will received disabled classes when at either end (true/false) | ||
+ | pauseOnAction: true, //Pause the slideshow when interacting with control elements, highly recommended. (true/false) | ||
+ | pauseOnHover: false, //Pause the slideshow when hovering over slider, then resume when no longer hovering (true/false) | ||
+ | controlsContainer: "", //Advanced property: Can declare which container the navigation elements should be appended too. Default container is the flexSlider element. Example use would be ".flexslider-container", "#container", etc. If the given element is not found, the default action will be taken. | ||
+ | manualControls: "", //Advanced property: Can declare custom control navigation. Example would be ".flex-control-nav" or "#tabs-nav", etc. The number of elements in your controlNav should match the number of slides/tabs (obviously). | ||
+ | start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide | ||
+ | before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation | ||
+ | after: function(){}, //Callback: function(slider) - Fires after each slider animation completes | ||
+ | end: function(){} //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) | ||
+ | } | ||
+ | |||
+ | //FlexSlider: Plugin Function | ||
+ | $.fn.flexslider = function(options) { | ||
+ | return this.each(function() { | ||
+ | if ($(this).find('.slides li').length == 1) { | ||
+ | $(this).find('.slides li').fadeIn(400); | ||
+ | } | ||
+ | else if ($(this).data('flexslider') != true) { | ||
+ | new $.flexslider($(this), options); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | })(jQuery); | ||
+ | |||
+ | // jquery.tweet.js - See http://tweet.seaofclouds.com/ or https://github.com/seaofclouds/tweet for more info | ||
+ | // Copyright (c) 2008-2011 Todd Matthews & Steve Purcell | ||
+ | (function($) { | ||
+ | $.fn.tweet = function(o){ | ||
+ | var s = $.extend({ | ||
+ | username: null, // [string or array] required unless using the 'query' option; one or more twitter screen names (use 'list' option for multiple names, where possible) | ||
+ | list: null, // [string] optional name of list belonging to username | ||
+ | favorites: false, // [boolean] display the user's favorites instead of his tweets | ||
+ | query: null, // [string] optional search query (see also: http://search.twitter.com/operators) | ||
+ | avatar_size: null, // [integer] height and width of avatar if displayed (48px max) | ||
+ | count: 3, // [integer] how many tweets to display? | ||
+ | fetch: null, // [integer] how many tweets to fetch via the API (set this higher than 'count' if using the 'filter' option) | ||
+ | page: 1, // [integer] which page of results to fetch (if count != fetch, you'll get unexpected results) | ||
+ | retweets: true, // [boolean] whether to fetch (official) retweets (not supported in all display modes) | ||
+ | intro_text: null, // [string] do you want text BEFORE your your tweets? | ||
+ | outro_text: null, // [string] do you want text AFTER your tweets? | ||
+ | join_text: null, // [string] optional text in between date and tweet, try setting to "auto" | ||
+ | auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks | ||
+ | auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed | ||
+ | auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing | ||
+ | auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" | ||
+ | auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... | ||
+ | loading_text: null, // [string] optional loading text, displayed while tweets load | ||
+ | refresh_interval: null , // [integer] optional number of seconds after which to reload tweets | ||
+ | twitter_url: "twitter.com", // [string] custom twitter url, if any (apigee, etc.) | ||
+ | twitter_api_url: "api.twitter.com", // [string] custom twitter api url, if any (apigee, etc.) | ||
+ | twitter_search_url: "search.twitter.com", // [string] custom twitter search url, if any (apigee, etc.) | ||
+ | template: "{avatar}{time}{join}{text}", // [string or function] template used to construct each tweet <li> - see code for available vars | ||
+ | comparator: function(tweet1, tweet2) { // [function] comparator used to sort tweets (see Array.sort) | ||
+ | return tweet2["tweet_time"] - tweet1["tweet_time"]; | ||
+ | }, | ||
+ | filter: function(tweet) { // [function] whether or not to include a particular tweet (be sure to also set 'fetch') | ||
+ | return true; | ||
+ | } | ||
+ | }, o); | ||
+ | |||
+ | // See http://daringfireball.net/2010/07/improved_regex_for_matching_urls | ||
+ | var url_regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/gi; | ||
+ | |||
+ | // Expand values inside simple string templates with {placeholders} | ||
+ | function t(template, info) { | ||
+ | if (typeof template === "string") { | ||
+ | var result = template; | ||
+ | for(var key in info) { | ||
+ | var val = info[key]; | ||
+ | result = result.replace(new RegExp('{'+key+'}','g'), val === null ? '' : val); | ||
+ | } | ||
+ | return result; | ||
+ | } else return template(info); | ||
+ | } | ||
+ | // Export the t function for use when passing a function as the 'template' option | ||
+ | $.extend({tweet: {t: t}}); | ||
+ | |||
+ | function replacer (regex, replacement) { | ||
+ | return function() { | ||
+ | var returning = []; | ||
+ | this.each(function() { | ||
+ | returning.push(this.replace(regex, replacement)); | ||
+ | }); | ||
+ | return $(returning); | ||
+ | }; | ||
+ | } | ||
+ | |||
+ | $.fn.extend({ | ||
+ | linkUrl: replacer(url_regexp, function(match) { | ||
+ | var url = (/^[a-z]+:/i).test(match) ? match : "http://"+match; | ||
+ | return "<a href=\""+url+"\">"+match+"</a>"; | ||
+ | }), | ||
+ | linkUser: replacer(/@(\w+)/gi, "@<a href=\"http://"+s.twitter_url+"/$1\">$1</a>"), | ||
+ | // Support various latin1 (\u00**) and arabic (\u06**) alphanumeric chars | ||
+ | linkHash: replacer(/(?:^| )[\#]+([\w\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0600-\u06ff]+)/gi, | ||
+ | ' <a href="http://'+s.twitter_search_url+'/search?q=&tag=$1&lang=all'+((s.username && s.username.length == 1 && !s.list) ? '&from='+s.username.join("%2BOR%2B") : '')+'">#$1</a>'), | ||
+ | capAwesome: replacer(/\b(awesome)\b/gi, '<span class="awesome">$1</span>'), | ||
+ | capEpic: replacer(/\b(epic)\b/gi, '<span class="epic">$1</span>'), | ||
+ | makeHeart: replacer(/(<)+[3]/gi, "<tt class='heart'>♥</tt>") | ||
+ | }); | ||
+ | |||
+ | function parse_date(date_str) { | ||
+ | // The non-search twitter APIs return inconsistently-formatted dates, which Date.parse | ||
+ | // cannot handle in IE. We therefore perform the following transformation: | ||
+ | // "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000" | ||
+ | return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3')); | ||
+ | } | ||
+ | |||
+ | function relative_time(date) { | ||
+ | var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); | ||
+ | var delta = parseInt((relative_to.getTime() - date) / 1000, 10); | ||
+ | var r = ''; | ||
+ | if (delta < 60) { | ||
+ | r = delta + ' seconds ago'; | ||
+ | } else if(delta < 120) { | ||
+ | r = 'a minute ago'; | ||
+ | } else if(delta < (45*60)) { | ||
+ | r = (parseInt(delta / 60, 10)).toString() + ' minutes ago'; | ||
+ | } else if(delta < (2*60*60)) { | ||
+ | r = 'an hour ago'; | ||
+ | } else if(delta < (24*60*60)) { | ||
+ | r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago'; | ||
+ | } else if(delta < (48*60*60)) { | ||
+ | r = 'a day ago'; | ||
+ | } else { | ||
+ | r = (parseInt(delta / 86400, 10)).toString() + ' days ago'; | ||
+ | } | ||
+ | return 'about ' + r; | ||
+ | } | ||
+ | |||
+ | function build_auto_join_text(text) { | ||
+ | if (text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) { | ||
+ | return s.auto_join_text_reply; | ||
+ | } else if (text.match(url_regexp)) { | ||
+ | return s.auto_join_text_url; | ||
+ | } else if (text.match(/^((\w+ed)|just) .*/im)) { | ||
+ | return s.auto_join_text_ed; | ||
+ | } else if (text.match(/^(\w*ing) .*/i)) { | ||
+ | return s.auto_join_text_ing; | ||
+ | } else { | ||
+ | return s.auto_join_text_default; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | function maybe_https(url) { | ||
+ | return ('https:' == document.location.protocol) ? url.replace(/^http:/, 'https:') : url; | ||
+ | } | ||
+ | |||
+ | function build_api_url() { | ||
+ | var proto = ('https:' == document.location.protocol ? 'https:' : 'http:'); | ||
+ | var count = (s.fetch === null) ? s.count : s.fetch; | ||
+ | if (s.list) { | ||
+ | return proto+"//"+s.twitter_api_url+"/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?page="+s.page+"&per_page="+count+"&callback=?"; | ||
+ | } else if (s.favorites) { | ||
+ | return proto+"//"+s.twitter_api_url+"/favorites/"+s.username[0]+".json?page="+s.page+"&count="+count+"&callback=?"; | ||
+ | } else if (s.query === null && s.username.length == 1) { | ||
+ | return proto+'//'+s.twitter_api_url+'/1/statuses/user_timeline.json?screen_name='+s.username[0]+'&count='+count+(s.retweets ? '&include_rts=1' : '')+'&page='+s.page+'&callback=?'; | ||
+ | } else { | ||
+ | var query = (s.query || 'from:'+s.username.join(' OR from:')); | ||
+ | return proto+'//'+s.twitter_search_url+'/search.json?&q='+encodeURIComponent(query)+'&rpp='+count+'&page='+s.page+'&callback=?'; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | // Convert twitter API objects into data available for | ||
+ | // constructing each tweet <li> using a template | ||
+ | function extract_template_data(item){ | ||
+ | var o = {}; | ||
+ | o.item = item; | ||
+ | o.source = item.source; | ||
+ | o.screen_name = item.from_user || item.user.screen_name; | ||
+ | o.avatar_size = s.avatar_size; | ||
+ | o.avatar_url = maybe_https(item.profile_image_url || item.user.profile_image_url); | ||
+ | o.retweet = typeof(item.retweeted_status) != 'undefined'; | ||
+ | o.tweet_time = parse_date(item.created_at); | ||
+ | o.join_text = s.join_text == "auto" ? build_auto_join_text(item.text) : s.join_text; | ||
+ | o.tweet_id = item.id_str; | ||
+ | o.twitter_base = "http://"+s.twitter_url+"/"; | ||
+ | o.user_url = o.twitter_base+o.screen_name; | ||
+ | o.tweet_url = o.user_url+"/status/"+o.tweet_id; | ||
+ | o.reply_url = o.twitter_base+"intent/tweet?in_reply_to="+o.tweet_id; | ||
+ | o.retweet_url = o.twitter_base+"intent/retweet?tweet_id="+o.tweet_id; | ||
+ | o.favorite_url = o.twitter_base+"intent/favorite?tweet_id="+o.tweet_id; | ||
+ | o.retweeted_screen_name = o.retweet && item.retweeted_status.user.screen_name; | ||
+ | o.tweet_relative_time = relative_time(o.tweet_time); | ||
+ | o.tweet_raw_text = o.retweet ? ('RT @'+o.retweeted_screen_name+' '+item.retweeted_status.text) : item.text; // avoid '...' in long retweets | ||
+ | o.tweet_text = $([o.tweet_raw_text]).linkUrl().linkUser().linkHash()[0]; | ||
+ | o.tweet_text_fancy = $([o.tweet_text]).makeHeart().capAwesome().capEpic()[0]; | ||
+ | |||
+ | // Default spans, and pre-formatted blocks for common layouts | ||
+ | o.user = t('<a class="tweet_user" href="{user_url}">{screen_name}</a>', o); | ||
+ | o.join = s.join_text ? t(' <span class="tweet_join">{join_text}</span> ', o) : ' '; | ||
+ | o.avatar = o.avatar_size ? | ||
+ | t('<a class="tweet_avatar" href="{user_url}"><img src="{avatar_url}" height="{avatar_size}" width="{avatar_size}" alt="{screen_name}\'s avatar" title="{screen_name}\'s avatar" border="0"/></a>', o) : ''; | ||
+ | o.time = t('<span class="tweet_time"><a href="{tweet_url}" title="view tweet on twitter">{tweet_relative_time}</a></span>', o); | ||
+ | o.text = t('<span class="tweet_text">{tweet_text_fancy}</span>', o); | ||
+ | o.reply_action = t('<a class="tweet_action tweet_reply" href="{reply_url}">reply</a>', o); | ||
+ | o.retweet_action = t('<a class="tweet_action tweet_retweet" href="{retweet_url}">retweet</a>', o); | ||
+ | o.favorite_action = t('<a class="tweet_action tweet_favorite" href="{favorite_url}">favorite</a>', o); | ||
+ | return o; | ||
+ | } | ||
+ | |||
+ | return this.each(function(i, widget){ | ||
+ | var list = $('<ul class="tweet_list">').appendTo(widget); | ||
+ | var intro = '<p class="tweet_intro">'+s.intro_text+'</p>'; | ||
+ | var outro = '<p class="tweet_outro">'+s.outro_text+'</p>'; | ||
+ | var loading = $('<p class="loading">'+s.loading_text+'</p>'); | ||
+ | |||
+ | if(s.username && typeof(s.username) == "string"){ | ||
+ | s.username = [s.username]; | ||
+ | } | ||
+ | |||
+ | if (s.loading_text) $(widget).append(loading); | ||
+ | $(widget).bind("tweet:load", function(){ | ||
+ | $.getJSON(build_api_url(), function(data){ | ||
+ | if (s.loading_text) loading.remove(); | ||
+ | if (s.intro_text) list.before(intro); | ||
+ | list.empty(); | ||
+ | |||
+ | var tweets = $.map(data.results || data, extract_template_data); | ||
+ | tweets = $.grep(tweets, s.filter).sort(s.comparator).slice(0, s.count); | ||
+ | list.append($.map(tweets, function(o) { return "<li>" + t(s.template, o) + "</li>"; }).join('')). | ||
+ | children('li:first').addClass('tweet_first').end(). | ||
+ | children('li:odd').addClass('tweet_even').end(). | ||
+ | children('li:even').addClass('tweet_odd'); | ||
+ | |||
+ | if (s.outro_text) list.after(outro); | ||
+ | $(widget).trigger("loaded").trigger((tweets.length === 0 ? "empty" : "full")); | ||
+ | if (s.refresh_interval) { | ||
+ | window.setTimeout(function() { $(widget).trigger("tweet:load"); }, 1000 * s.refresh_interval); | ||
+ | } | ||
+ | }); | ||
+ | }).trigger("tweet:load"); | ||
+ | }); | ||
+ | }; | ||
+ | })(jQuery); |
Latest revision as of 00:45, 24 September 2011
// This file for javascript that we want to include on all pages
$(document).ready(function(){
// show the drop down list on hover $('li.headlink').hover( /*function() { $('ul', this).show(); }, function() { $('ul', this).hide(); }*/ function() { $('ul', this).css('display', 'table') }, function() { $('ul', this).css('display', 'none') } );
});
/*
* jQuery FlexSlider v1.7 * http://flex.madebymufffin.com * * Copyright 2011, Tyler Smith * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php * * Shoutout to Darin Richardson for his wonderful contributions to the betterment of FlexSlider */
- (function ($) {
//FlexSlider: Object Instance $.flexslider = function(el, options) { var slider = el;
slider.init = function() { slider.vars = $.extend({}, $.flexslider.defaults, options); slider.data('flexslider', true); slider.container = $('.slides', slider); slider.slides = $('.slides > li', slider); slider.count = slider.slides.length; slider.animating = false; slider.currentSlide = slider.vars.slideToStart; slider.animatingTo = slider.currentSlide; slider.atEnd = (slider.currentSlide == 0) ? true : false; slider.eventType = ('ontouchstart' in document.documentElement) ? 'touchstart' : 'click'; slider.cloneCount = 0; slider.cloneOffset = 0; //Test for controlsContainer if (slider.vars.controlsContainer != "") { slider.controlsContainer = $(slider.vars.controlsContainer).eq($('.slides').index(slider.container)); slider.containerExists = slider.controlsContainer.length > 0; } //Test for manualControls if (slider.vars.manualControls != "") { slider.manualControls = $(slider.vars.manualControls, ((slider.containerExists) ? slider.controlsContainer : slider)); slider.manualExists = slider.manualControls.length > 0; } /////////////////////////////////////////////////////////////////// // FlexSlider: Randomize Slides if (slider.vars.randomize) { slider.slides.sort(function() { return (Math.round(Math.random())-0.5); }); slider.container.empty().append(slider.slides); } ///////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////// // FlexSlider: Slider Animation Initialize if (slider.vars.animation.toLowerCase() == "slide") { slider.css({"overflow": "hidden"}); if (slider.vars.animationLoop) { slider.cloneCount = 2; slider.cloneOffset = 1; slider.container.append(slider.slides.filter(':first').clone().addClass('clone')).prepend(slider.slides.filter(':last').clone().addClass('clone')); } slider.container.width(((slider.count + slider.cloneCount) * slider.width()) + 2000); //extra width to account for quirks //create newSlides to capture possible clones slider.newSlides = $('.slides > li', slider); //Timeout function to give browser enough time to get proper width initially setTimeout(function() { slider.newSlides.width(slider.width()).css({"float": "left"}).show(); }, 100); slider.container.css({"marginLeft": (-1 * (slider.currentSlide + slider.cloneOffset))* slider.width() + "px"}); } else { //Default to fade slider.slides.css({"width": "100%", "float": "left", "marginRight": "-100%"}).eq(slider.currentSlide).fadeIn(400); } /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // FlexSlider: Control Nav if (slider.vars.controlNav) { if (slider.manualExists) { slider.controlNav = slider.manualControls; } else {var controlNavScaffold = $('
var j = 1; for (var i = 0; i < slider.count; i++) {controlNavScaffold.append('
- <a class="prev" href="#">' + slider.vars.prevText + '</a>
- <a class="next" href="#">' + slider.vars.nextText + '</a>
if (slider.containerExists) { $(slider.controlsContainer).append(directionNavScaffold); slider.directionNav = $('.flex-direction-nav li a', slider.controlsContainer); } else { slider.append(directionNavScaffold); slider.directionNav = $('.flex-direction-nav li a', slider); } //Set initial disable styles if necessary if (!slider.vars.animationLoop) { if (slider.currentSlide == 0) { slider.directionNav.filter('.prev').addClass('disabled'); } else if (slider.currentSlide == slider.count - 1) { slider.directionNav.filter('.next').addClass('disabled'); } } slider.directionNav.bind(slider.eventType, function(event) { event.preventDefault(); var target = ($(this).hasClass('next')) ? slider.getTarget('next') : slider.getTarget('prev'); if (slider.canAdvance(target)) { slider.flexAnimate(target, slider.vars.pauseOnAction); } }); } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //FlexSlider: Keyboard Nav if (slider.vars.keyboardNav && $('ul.slides').length == 1) { $(document).keyup(function(event) { if (slider.animating) { return; } else if (event.keyCode != 39 && event.keyCode != 37){ return; } else { if (event.keyCode == 39) { var target = slider.getTarget('next'); } else if (event.keyCode == 37){ var target = slider.getTarget('prev'); } if (slider.canAdvance(target)) { slider.flexAnimate(target, slider.vars.pauseOnAction); } } }); } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //FlexSlider: Slideshow Setup if (slider.vars.slideshow) { //pauseOnHover if (slider.vars.pauseOnHover && slider.vars.slideshow) { slider.hover(function() { slider.pause(); }, function() { slider.resume(); }); }
//Initialize animation slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //FlexSlider: Pause/Play if (slider.vars.pausePlay) {var pausePlayScaffold = $('
');
if (slider.containerExists) { slider.controlsContainer.append(pausePlayScaffold); slider.pausePlay = $('.flex-pauseplay span', slider.controlsContainer); } else { slider.append(pausePlayScaffold); slider.pausePlay = $('.flex-pauseplay span', slider); } var pausePlayState = (slider.vars.slideshow) ? 'pause' : 'play'; slider.pausePlay.addClass(pausePlayState).text(pausePlayState); slider.pausePlay.click(function(event) { event.preventDefault(); ($(this).hasClass('pause'))? slider.pause() : slider.resume(); }); } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //FlexSlider:Touch Swip Gestures //Credit of concept: TouchSwipe - http://www.netcu.de/jquery-touchwipe-iphone-ipad-library if (slider.vars.touchSwipe && 'ontouchstart' in document.documentElement) { slider.each(function() { var startX, min_move_x = 20; isMoving = false;
function cancelTouch() { this.removeEventListener('touchmove', onTouchMove); startX = null; isMoving = false; } function onTouchMove(e) { if (isMoving) { var x = e.touches[0].pageX, dx = startX - x; if(Math.abs(dx) >= min_move_x) { cancelTouch(); var target = (dx > 0) ? slider.getTarget('next') : slider.getTarget('prev'); if (slider.canAdvance(target)) { slider.flexAnimate(target, slider.vars.pauseOnAction); } } } } function onTouchStart(e) { if (e.touches.length == 1) { startX = e.touches[0].pageX; isMoving = true; this.addEventListener('touchmove', onTouchMove, false); } } if ('ontouchstart' in document.documentElement) { this.addEventListener('touchstart', onTouchStart, false); } }); } ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //FlexSlider: Resize Functions (If necessary) if (slider.vars.animation.toLowerCase() == "slide") { slider.sliderTimer; $(window).resize(function(){ slider.newSlides.width(slider.width()); slider.container.width(((slider.count + slider.cloneCount) * slider.width()) + 2000); //extra width to account for quirks //Slider resize reset clearTimeout(slider.sliderTimer); slider.sliderTimer = setTimeout(function(){ slider.flexAnimate(slider.currentSlide); }, 300); }); } ////////////////////////////////////////////////////////////////// //FlexSlider: start() Callback slider.vars.start(slider); } //FlexSlider: Animation Actions slider.flexAnimate = function(target, pause) { if (!slider.animating) { //Animating flag slider.animating = true; //Optional paramter to pause slider when making an anmiation call if (pause) { slider.pause(); } //Update controlNav if (slider.vars.controlNav) { slider.controlNav.removeClass('active').eq(target).addClass('active'); } //Is the slider at either end slider.atEnd = (target == 0 || target == slider.count - 1) ? true : false; if (!slider.vars.animationLoop) { if (target == 0) { slider.directionNav.removeClass('disabled').filter('.prev').addClass('disabled'); } else if (target == slider.count - 1) { slider.directionNav.removeClass('disabled').filter('.next').addClass('disabled'); slider.pause(); //FlexSlider: end() of cycle Callback slider.vars.end(slider); } else { slider.directionNav.removeClass('disabled'); } } //FlexSlider: before() animation Callback slider.animatingTo = target; slider.vars.before(slider); if (slider.vars.animation.toLowerCase() == "slide") {
if (slider.currentSlide == 0 && target == slider.count - 1 && slider.vars.animationLoop) { slider.slideString = "0px"; } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.vars.animationLoop) { slider.slideString = (-1 * (slider.count + 1)) * slider.slides.filter(':first').width() + "px"; } else { slider.slideString = (-1 * (target + slider.cloneOffset)) * slider.slides.filter(':first').width() + "px"; } slider.container.animate({"marginLeft": slider.slideString}, slider.vars.animationDuration, function(){ //Jump the slider if necessary if (slider.currentSlide == 0 && target == slider.count - 1 && slider.vars.animationLoop) { slider.container.css({"marginLeft": (-1 * slider.count) * slider.slides.filter(':first').width() + "px"}); } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.vars.animationLoop) { slider.container.css({"marginLeft": -1 * slider.slides.filter(':first').width() + "px"}); } slider.animating = false; slider.currentSlide = target; //FlexSlider: after() animation Callback slider.vars.after(slider); }); } else { //Default to Fade slider.slides.eq(slider.currentSlide).fadeOut(slider.vars.animationDuration); slider.slides.eq(target).fadeIn(slider.vars.animationDuration, function() { slider.animating = false; slider.currentSlide = target; //FlexSlider: after() animation Callback slider.vars.after(slider); }); } } } //FlexSlider: Automatic Slideshow slider.animateSlides = function() { if (!slider.animating) { var target = (slider.currentSlide == slider.count - 1) ? 0 : slider.currentSlide + 1; slider.flexAnimate(target); } } //FlexSlider: Automatic Slideshow Pause slider.pause = function() { clearInterval(slider.animatedSlides); if (slider.vars.pausePlay) { slider.pausePlay.removeClass('pause').addClass('play').text('play'); } } //FlexSlider: Automatic Slideshow Start/Resume slider.resume = function() { slider.animatedSlides = setInterval(slider.animateSlides, slider.vars.slideshowSpeed); if (slider.vars.pausePlay) { slider.pausePlay.removeClass('play').addClass('pause').text('pause'); } } //FlexSlider: Helper function for non-looping sliders slider.canAdvance = function(target) { if (!slider.vars.animationLoop && slider.atEnd) { if (slider.currentSlide == 0 && target == slider.count - 1 && slider.direction != "next") { return false; } else if (slider.currentSlide == slider.count - 1 && target == 0 && slider.direction == "next") { return false; } else { return true; } } else { return true; } } //FlexSlider: Helper function to determine animation target slider.getTarget = function(dir) { slider.direction = dir; if (dir == "next") { return (slider.currentSlide == slider.count - 1) ? 0 : slider.currentSlide + 1; } else { return (slider.currentSlide == 0) ? slider.count - 1 : slider.currentSlide - 1; } } //FlexSlider: Initialize slider.init(); } //FlexSlider: Default Settings $.flexslider.defaults = { animation: "fade", //Select your animation type (fade/slide) slideshow: true, //Should the slider animate automatically by default? (true/false) slideshowSpeed: 7000, //Set the speed of the slideshow cycling, in milliseconds animationDuration: 600, //Set the speed of animations, in milliseconds directionNav: true, //Create navigation for previous/next navigation? (true/false) controlNav: true, //Create navigation for paging control of each clide? (true/false) keyboardNav: true, //Allow for keyboard navigation using left/right keys (true/false) touchSwipe: true, //Touch swipe gestures for left/right slide navigation (true/false) prevText: "Previous", //Set the text for the "previous" directionNav item nextText: "Next", //Set the text for the "next" directionNav item pausePlay: false, //Create pause/play dynamic element (true/false) randomize: false, //Randomize slide order on page load? (true/false) slideToStart: 0, //The slide that the slider should start on. Array notation (0 = first slide) animationLoop: true, //Should the animation loop? If false, directionNav will received disabled classes when at either end (true/false) pauseOnAction: true, //Pause the slideshow when interacting with control elements, highly recommended. (true/false) pauseOnHover: false, //Pause the slideshow when hovering over slider, then resume when no longer hovering (true/false) controlsContainer: "", //Advanced property: Can declare which container the navigation elements should be appended too. Default container is the flexSlider element. Example use would be ".flexslider-container", "#container", etc. If the given element is not found, the default action will be taken. manualControls: "", //Advanced property: Can declare custom control navigation. Example would be ".flex-control-nav" or "#tabs-nav", etc. The number of elements in your controlNav should match the number of slides/tabs (obviously). start: function(){}, //Callback: function(slider) - Fires when the slider loads the first slide before: function(){}, //Callback: function(slider) - Fires asynchronously with each slider animation after: function(){}, //Callback: function(slider) - Fires after each slider animation completes end: function(){} //Callback: function(slider) - Fires when the slider reaches the last slide (asynchronous) } //FlexSlider: Plugin Function $.fn.flexslider = function(options) { return this.each(function() { if ($(this).find('.slides li').length == 1) { $(this).find('.slides li').fadeIn(400); } else if ($(this).data('flexslider') != true) { new $.flexslider($(this), options); } }); }
})(jQuery);
// jquery.tweet.js - See http://tweet.seaofclouds.com/ or https://github.com/seaofclouds/tweet for more info // Copyright (c) 2008-2011 Todd Matthews & Steve Purcell (function($) {
$.fn.tweet = function(o){ var s = $.extend({ username: null, // [string or array] required unless using the 'query' option; one or more twitter screen names (use 'list' option for multiple names, where possible) list: null, // [string] optional name of list belonging to username favorites: false, // [boolean] display the user's favorites instead of his tweets query: null, // [string] optional search query (see also: http://search.twitter.com/operators) avatar_size: null, // [integer] height and width of avatar if displayed (48px max) count: 3, // [integer] how many tweets to display? fetch: null, // [integer] how many tweets to fetch via the API (set this higher than 'count' if using the 'filter' option) page: 1, // [integer] which page of results to fetch (if count != fetch, you'll get unexpected results) retweets: true, // [boolean] whether to fetch (official) retweets (not supported in all display modes) intro_text: null, // [string] do you want text BEFORE your your tweets? outro_text: null, // [string] do you want text AFTER your tweets? join_text: null, // [string] optional text in between date and tweet, try setting to "auto" auto_join_text_default: "i said,", // [string] auto text for non verb: "i said" bullocks auto_join_text_ed: "i", // [string] auto text for past tense: "i" surfed auto_join_text_ing: "i am", // [string] auto tense for present tense: "i was" surfing auto_join_text_reply: "i replied to", // [string] auto tense for replies: "i replied to" @someone "with" auto_join_text_url: "i was looking at", // [string] auto tense for urls: "i was looking at" http:... loading_text: null, // [string] optional loading text, displayed while tweets load refresh_interval: null , // [integer] optional number of seconds after which to reload tweets twitter_url: "twitter.com", // [string] custom twitter url, if any (apigee, etc.) twitter_api_url: "api.twitter.com", // [string] custom twitter api url, if any (apigee, etc.) twitter_search_url: "search.twitter.com", // [string] custom twitter search url, if any (apigee, etc.)template: "{avatar}{time}{join}{text}", // [string or function] template used to construct each tweet
- ').appendTo(widget);
var intro = '
'+s.intro_text+'
'; var outro = ''+s.outro_text+'
'; var loading = $(''+s.loading_text+'
');if(s.username && typeof(s.username) == "string"){ s.username = [s.username]; }
if (s.loading_text) $(widget).append(loading); $(widget).bind("tweet:load", function(){ $.getJSON(build_api_url(), function(data){ if (s.loading_text) loading.remove(); if (s.intro_text) list.before(intro); list.empty();
var tweets = $.map(data.results || data, extract_template_data); tweets = $.grep(tweets, s.filter).sort(s.comparator).slice(0, s.count);list.append($.map(tweets, function(o) { return "
children('li:first').addClass('tweet_first').end(). children('li:odd').addClass('tweet_even').end(). children('li:even').addClass('tweet_odd');
if (s.outro_text) list.after(outro); $(widget).trigger("loaded").trigger((tweets.length === 0 ? "empty" : "full")); if (s.refresh_interval) { window.setTimeout(function() { $(widget).trigger("tweet:load"); }, 1000 * s.refresh_interval); } }); }).trigger("tweet:load"); }); };})(jQuery);