text: /*! Picturefill - v2.1.0 - 2014-07-25
  * http://scottjehl.github.io/picturefill
  * Copyright (c) 2014 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT */
  /*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */
  
  window.matchMedia || (window.matchMedia = function() {
  	"use strict";
  
  	// For browsers that support matchMedium api such as IE 9 and webkit
  	var styleMedia = (window.styleMedia || window.media);
  
  	// For those that don't support matchMedium
  	if (!styleMedia) {
  		var style       = document.createElement('style'),
  			script      = document.getElementsByTagName('script')[0],
  			info        = null;
  
  		style.type  = 'text/css';
  		style.id    = 'matchmediajs-test';
  
  		script.parentNode.insertBefore(style, script);
  
  		// 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers
  		info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;
  
  		styleMedia = {
  			matchMedium: function(media) {
  				var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';
  
  				// 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers
  				if (style.styleSheet) {
  					style.styleSheet.cssText = text;
  				} else {
  					style.textContent = text;
  				}
  
  				// Test if media query is true or false
  				return info.width === '1px';
  			}
  		};
  	}
  
  	return function(media) {
  		return {
  			matches: styleMedia.matchMedium(media || 'all'),
  			media: media || 'all'
  		};
  	};
  }());
  /*! Picturefill - Responsive Images that work today.
  *  Author: Scott Jehl, Filament Group, 2012 ( new proposal implemented by Shawn Jansepar )
  *  License: MIT/GPLv2
  *  Spec: http://picture.responsiveimages.org/
  */
  (function( w, doc ) {
  	// Enable strict mode
  	"use strict";
  
  	// If picture is supported, well, that's awesome. Let's get outta here...
  	if ( w.HTMLPictureElement ) {
  		w.picturefill = function() { };
  		return;
  	}
  
  	// HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround)
  	doc.createElement( "picture" );
  
  	// local object for method references and testing exposure
  	var pf = {};
  
  	// namespace
  	pf.ns = "picturefill";
  
  	// srcset support test
  	pf.srcsetSupported = "srcset" in doc.createElement( "img" );
  	pf.sizesSupported = w.HTMLImageElement.sizes;
  
  	// just a string trim workaround
  	pf.trim = function( str ) {
  		return str.trim ? str.trim() : str.replace( /^\s+|\s+$/g, "" );
  	};
  
  	// just a string endsWith workaround
  	pf.endsWith = function( str, suffix ) {
  		return str.endsWith ? str.endsWith( suffix ) : str.indexOf( suffix, str.length - suffix.length ) !== -1;
  	};
  
  	/**
  	 * Shortcut method for matchMedia ( for easy overriding in tests )
  	 */
  	pf.matchesMedia = function( media ) {
  		return w.matchMedia && w.matchMedia( media ).matches;
  	};
  
  	/**
  	 * Shortcut method for `devicePixelRatio` ( for easy overriding in tests )
  	 */
  	pf.getDpr = function() {
  		return ( w.devicePixelRatio || 1 );
  	};
  
  	/**
  	 * Get width in css pixel value from a "length" value
  	 * http://dev.w3.org/csswg/css-values-3/#length-value
  	 */
  	pf.getWidthFromLength = function( length ) {
  		// If no length was specified, or it is 0 or negative, default to `100vw` (per the spec).
  		length = length && ( parseFloat( length ) > 0 || length.indexOf( "calc(" ) > -1 ) ? length : "100vw";
  
  		/**
  		* If length is specified in  `vw` units, use `%` instead since the div we’re measuring
  		* is injected at the top of the document.
  		*
  		* TODO: maybe we should put this behind a feature test for `vw`?
  		*/
  		length = length.replace( "vw", "%" );
  
  		// Create a cached element for getting length value widths
  		if ( !pf.lengthEl ) {
  			pf.lengthEl = doc.createElement( "div" );
  			doc.documentElement.insertBefore( pf.lengthEl, doc.documentElement.firstChild );
  		}
  
  		// Positioning styles help prevent padding/margin/width on `html` from throwing calculations off.
  		pf.lengthEl.style.cssText = "position: absolute; left: 0; width: " + length + ";";
  
  		if ( pf.lengthEl.offsetWidth <= 0 ) {
  			// Something has gone wrong. `calc()` is in use and unsupported, most likely. Default to `100vw` (`100%`, for broader support.):
  			pf.lengthEl.style.cssText = "width: 100%;";
  		}
  
  		return pf.lengthEl.offsetWidth;
  	};
  
  	// container of supported mime types that one might need to qualify before using
  	pf.types =  {};
  
  	// Add support for standard mime types.
  	pf.types["image/jpeg"] = true;
  	pf.types["image/gif"] = true;
  	pf.types["image/png"] = true;
  
  	// test svg support
  	pf.types[ "image/svg+xml" ] = doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1");
  
  	// test webp support, only when the markup calls for it
  	pf.types[ "image/webp" ] = function() {
  		// based on Modernizr's lossless img-webp test
  		// note: asynchronous
  		var img = new w.Image(),
  			type = "image/webp";
  
  		img.onerror = function() {
  			pf.types[ type ] = false;
  			picturefill();
  		};
  		img.onload = function() {
  			pf.types[ type ] = img.width === 1;
  			picturefill();
  		};
  		img.src = "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=";
  	};
  
  	/**
  	 * Takes a source element and checks if its type attribute is present and if so, supported
  	 * Note: for type tests that require a async logic,
  	 * you can define them as a function that'll run only if that type needs to be tested. Just make the test function call picturefill again when it is complete.
  	 * see the async webp test above for example
  	 */
  	pf.verifyTypeSupport = function( source ) {
  		var type = source.getAttribute( "type" );
  		// if type attribute exists, return test result, otherwise return true
  		if ( type === null || type === "" ) {
  			return true;
  		} else {
  			// if the type test is a function, run it and return "pending" status. The function will rerun picturefill on pending elements once finished.
  			if ( typeof( pf.types[ type ] ) === "function" ) {
  				pf.types[ type ]();
  				return "pending";
  			} else {
  				return pf.types[ type ];
  			}
  		}
  	};
  
  	/**
  	* Parses an individual `size` and returns the length, and optional media query
  	*/
  	pf.parseSize = function( sourceSizeStr ) {
  		var match = /(\([^)]+\))?\s*(.+)/g.exec( sourceSizeStr );
  		return {
  			media: match && match[1],
  			length: match && match[2]
  		};
  	};
  
  	/**
  	 * Takes a string of sizes and returns the width in pixels as a number
  	 */
  	pf.findWidthFromSourceSize = function( sourceSizeListStr ) {
  		// Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33%
  		//                            or (min-width:30em) calc(30% - 15px)
  		var sourceSizeList = pf.trim( sourceSizeListStr ).split( /\s*,\s*/ ),
  			winningLength;
  
  		for ( var i = 0, len = sourceSizeList.length; i < len; i++ ) {
  			// Match <media-condition>? length, ie ( min-width: 50em ) 100%
  			var sourceSize = sourceSizeList[ i ],
  				// Split "( min-width: 50em ) 100%" into separate strings
  				parsedSize = pf.parseSize( sourceSize ),
  				length = parsedSize.length,
  				media = parsedSize.media;
  
  			if ( !length ) {
  				continue;
  			}
  			if ( !media || pf.matchesMedia( media ) ) {
  				// if there is no media query or it matches, choose this as our winning length
  				// and end algorithm
  				winningLength = length;
  				break;
  			}
  		}
  
  		// pass the length to a method that can properly determine length
  		// in pixels based on these formats: http://dev.w3.org/csswg/css-values-3/#length-value
  		return pf.getWidthFromLength( winningLength );
  	};
  
  	pf.parseSrcset = function( srcset ) {
  		/**
  		* A lot of this was pulled from Boris Smus’ parser for the now-defunct WHATWG `srcset`
  		* https://github.com/borismus/srcset-polyfill/blob/master/js/srcset-info.js
  		*
  		* 1. Let input (`srcset`) be the value passed to this algorithm.
  		* 2. Let position be a pointer into input, initially pointing at the start of the string.
  		* 3. Let raw candidates be an initially empty ordered list of URLs with associated 
  		*    unparsed descriptors. The order of entries in the list is the order in which entries 
  		*    are added to the list.
  		*/
  		var candidates = [];
  
  		while ( srcset !== "" ) {
  			srcset = srcset.replace(/^\s+/g,"");
  
  			// 5. Collect a sequence of characters that are not space characters, and let that be url.
  			var pos = srcset.search(/\s/g),
  				url, descriptor = null;
  
  			if ( pos !== -1 ) {
  				url = srcset.slice( 0, pos );
  
  				var last = url[ url.length - 1 ];
  
  				// 6. If url ends with a U+002C COMMA character (,), remove that character from url
  				// and let descriptors be the empty string. Otherwise, follow these substeps
  				// 6.1. If url is empty, then jump to the step labeled descriptor parser.
  
  				if ( last === "," || url === "" ) {
  					url = url.replace(/,+$/, "");
  					descriptor = "";
  				}
  				srcset = srcset.slice( pos + 1 );
  
  				// 6.2. Collect a sequence of characters that are not U+002C COMMA characters (,), and 
  				// let that be descriptors.
  				if ( descriptor === null ) {
  					var descpos = srcset.indexOf(",");
  					if ( descpos !== -1 ) {
  						descriptor = srcset.slice( 0, descpos );
  						srcset = srcset.slice( descpos + 1 );
  					} else {
  						descriptor = srcset;
  						srcset = "";
  					}
  				}
  			} else {
  				url = srcset;
  				srcset = "";
  			}
  
  			// 7. Add url to raw candidates, associated with descriptors.
  			if ( url || descriptor ) {
  				candidates.push({
  					url: url,
  					descriptor: descriptor
  				});
  			}
  		}
  		return candidates;
  	};
  
  	pf.parseDescriptor = function( descriptor, sizesattr ) {
  		// 11. Descriptor parser: Let candidates be an initially empty source set. The order of entries in the list 
  		// is the order in which entries are added to the list.
  		var sizes = sizesattr || "100vw",
  			sizeDescriptor = descriptor && descriptor.replace(/(^\s+|\s+$)/g, ""),
  			widthInCssPixels = pf.findWidthFromSourceSize( sizes ),
  			resCandidate;
  
  			if ( sizeDescriptor ) {
  				var splitDescriptor = sizeDescriptor.split(" ");
  
  				for (var i = splitDescriptor.length + 1; i >= 0; i--) {
  					if ( splitDescriptor[ i ] !== undefined ) {
  						var curr = splitDescriptor[ i ],
  							lastchar = curr && curr.slice( curr.length - 1 );
  
  						if ( ( lastchar === "h" || lastchar === "w" ) && !pf.sizesSupported ) {
  							resCandidate = parseFloat( ( parseInt( curr, 10 ) / widthInCssPixels ) );
  						} else if ( lastchar === "x" ) {
  							var res = curr && parseFloat( curr, 10 );
  							resCandidate = res && !isNaN( res ) ? res : 1;
  						}
  					}
  				}
  			}
  		return resCandidate || 1;
  	};
  
  	/**
  	 * Takes a srcset in the form of url/
  	 * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or
  	 *     "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or
  	 *     "images/pic-small.png"
  	 * Get an array of image candidates in the form of
  	 *      {url: "/foo/bar.png", resolution: 1}
  	 * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value
  	 * If sizes is specified, resolution is calculated
  	 */
  	pf.getCandidatesFromSourceSet = function( srcset, sizes ) {
  		var candidates = pf.parseSrcset( srcset ),
  			formattedCandidates = [];
  
  		for ( var i = 0, len = candidates.length; i < len; i++ ) {
  			var candidate = candidates[ i ];
  
  			formattedCandidates.push({
  				url: candidate.url,
  				resolution: pf.parseDescriptor( candidate.descriptor, sizes )
  			});
  		}
  		return formattedCandidates;
  	};
  
  	/*
  	 * if it's an img element and it has a srcset property,
  	 * we need to remove the attribute so we can manipulate src
  	 * (the property's existence infers native srcset support, and a srcset-supporting browser will prioritize srcset's value over our winning picture candidate)
  	 * this moves srcset's value to memory for later use and removes the attr
  	 */
  	pf.dodgeSrcset = function( img ) {
  		if ( img.srcset ) {
  			img[ pf.ns ].srcset = img.srcset;
  			img.removeAttribute( "srcset" );
  		}
  	};
  
  	/*
  	 * Accept a source or img element and process its srcset and sizes attrs
  	 */
  	pf.processSourceSet = function( el ) {
  		var srcset = el.getAttribute( "srcset" ),
  			sizes = el.getAttribute( "sizes" ),
  			candidates = [];
  
  		// if it's an img element, use the cached srcset property (defined or not)
  		if ( el.nodeName.toUpperCase() === "IMG" && el[ pf.ns ] && el[ pf.ns ].srcset ) {
  			srcset = el[ pf.ns ].srcset;
  		}
  
  		if ( srcset ) {
  			candidates = pf.getCandidatesFromSourceSet( srcset, sizes );
  		}
  		return candidates;
  	};
  
  	pf.applyBestCandidate = function( candidates, picImg ) {
  		var candidate,
  			length,
  			bestCandidate;
  
  		candidates.sort( pf.ascendingSort );
  
  		length = candidates.length;
  		bestCandidate = candidates[ length - 1 ];
  
  		for ( var i = 0; i < length; i++ ) {
  			candidate = candidates[ i ];
  			if ( candidate.resolution >= pf.getDpr() ) {
  				bestCandidate = candidate;
  				break;
  			}
  		}
  
  		if ( bestCandidate && !pf.endsWith( picImg.src, bestCandidate.url ) ) {
  			picImg.src = bestCandidate.url;
  			// currentSrc attribute and property to match
  			// http://picture.responsiveimages.org/#the-img-element
  			picImg.currentSrc = picImg.src;
  		}
  	};
  
  	pf.ascendingSort = function( a, b ) {
  		return a.resolution - b.resolution;
  	};
  
  	/*
  	 * In IE9, <source> elements get removed if they aren't children of
  	 * video elements. Thus, we conditionally wrap source elements
  	 * using <!--[if IE 9]><video style="display: none;"><![endif]-->
  	 * and must account for that here by moving those source elements
  	 * back into the picture element.
  	 */
  	pf.removeVideoShim = function( picture ) {
  		var videos = picture.getElementsByTagName( "video" );
  		if ( videos.length ) {
  			var video = videos[ 0 ],
  				vsources = video.getElementsByTagName( "source" );
  			while ( vsources.length ) {
  				picture.insertBefore( vsources[ 0 ], video );
  			}
  			// Remove the video element once we're finished removing its children
  			video.parentNode.removeChild( video );
  		}
  	};
  
  	/*
  	 * Find all `img` elements, and add them to the candidate list if they have
  	 * a `picture` parent, a `sizes` attribute in basic `srcset` supporting browsers,
  	 * a `srcset` attribute at all, and they haven’t been evaluated already.
  	 */
  	pf.getAllElements = function() {
  		var elems = [],
  			imgs = doc.getElementsByTagName( "img" );
  
  		for ( var h = 0, len = imgs.length; h < len; h++ ) {
  			var currImg = imgs[ h ];
  
  			if ( currImg.parentNode.nodeName.toUpperCase() === "PICTURE" ||
  				( currImg.getAttribute( "srcset" ) !== null ) || currImg[ pf.ns ] && currImg[ pf.ns ].srcset !== null ) {
  					elems.push( currImg );
  			}
  		}
  		return elems;
  	};
  
  	pf.getMatch = function( img, picture ) {
  		var sources = picture.childNodes,
  			match;
  
  		// Go through each child, and if they have media queries, evaluate them
  		for ( var j = 0, slen = sources.length; j < slen; j++ ) {
  			var source = sources[ j ];
  
  			// ignore non-element nodes
  			if ( source.nodeType !== 1 ) {
  				continue;
  			}
  
  			// Hitting the `img` element that started everything stops the search for `sources`.
  			// If no previous `source` matches, the `img` itself is evaluated later.
  			if ( source === img ) {
  				return match;
  			}
  
  			// ignore non-`source` nodes
  			if ( source.nodeName.toUpperCase() !== "SOURCE" ) {
  				continue;
  			}
  			// if it's a source element that has the `src` property set, throw a warning in the console
  			if ( source.getAttribute( "src" ) !== null && typeof console !== undefined ){
  				console.warn("The `src` attribute is invalid on `picture` `source` element; instead, use `srcset`.");
  			}
  
  			var media = source.getAttribute( "media" );
  
  			// if source does not have a srcset attribute, skip
  			if ( !source.getAttribute( "srcset" ) ) {
  				continue;
  			}
  
  			// if there's no media specified, OR w.matchMedia is supported
  			if ( ( !media || pf.matchesMedia( media ) ) ) {
  				var typeSupported = pf.verifyTypeSupport( source );
  
  				if ( typeSupported === true ) {
  					match = source;
  					break;
  				} else if ( typeSupported === "pending" ) {
  					return false;
  				}
  			}
  		}
  
  		return match;
  	};
  
  	function picturefill( opt ) {
  		var elements,
  			element,
  			parent,
  			firstMatch,
  			candidates,
  
  		options = opt || {};
  		elements = options.elements || pf.getAllElements();
  
  		// Loop through all elements
  		for ( var i = 0, plen = elements.length; i < plen; i++ ) {
  			element = elements[ i ];
  			parent = element.parentNode;
  			firstMatch = undefined;
  			candidates = undefined;
  
  			// expando for caching data on the img
  			if ( !element[ pf.ns ] ) {
  				element[ pf.ns ] = {};
  			}
  
  			// if the element has already been evaluated, skip it
  			// unless `options.force` is set to true ( this, for example,
  			// is set to true when running `picturefill` on `resize` ).
  			if ( !options.reevaluate && element[ pf.ns ].evaluated ) {
  				continue;
  			}
  
  			// if `img` is in a `picture` element
  			if ( parent.nodeName.toUpperCase() === "PICTURE" ) {
  
  				// IE9 video workaround
  				pf.removeVideoShim( parent );
  
  				// return the first match which might undefined
  				// returns false if there is a pending source
  				// TODO the return type here is brutal, cleanup
  				firstMatch = pf.getMatch( element, parent );
  
  				// if any sources are pending in this picture due to async type test(s)
  				// remove the evaluated attr and skip for now ( the pending test will
  				// rerun picturefill on this element when complete)
  				if ( firstMatch === false ) {
  					continue;
  				}
  			} else {
  				firstMatch = undefined;
  			}
  
  			// Cache and remove `srcset` if present and we’re going to be doing `picture`/`srcset`/`sizes` polyfilling to it.
  			if ( parent.nodeName.toUpperCase() === "PICTURE" ||
  			( element.srcset && !pf.srcsetSupported ) ||
  			( !pf.sizesSupported && ( element.srcset && element.srcset.indexOf("w") > -1 ) ) ) {
  				pf.dodgeSrcset( element );
  			}
  
  			if ( firstMatch ) {
  				candidates = pf.processSourceSet( firstMatch );
  				pf.applyBestCandidate( candidates, element );
  			} else {
  				// No sources matched, so we’re down to processing the inner `img` as a source.
  				candidates = pf.processSourceSet( element );
  
  				if ( element.srcset === undefined || element[ pf.ns ].srcset ) {
  					// Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality.
  					pf.applyBestCandidate( candidates, element );
  				} // Else, resolution-only `srcset` is supported natively.
  			}
  
  			// set evaluated to true to avoid unnecessary reparsing
  			element[ pf.ns ].evaluated = true;
  		}
  	}
  
  	/**
  	 * Sets up picture polyfill by polling the document and running
  	 * the polyfill every 250ms until the document is ready.
  	 * Also attaches picturefill on resize
  	 */
  	function runPicturefill() {
  		picturefill();
  		var intervalId = setInterval( function() {
  			// When the document has finished loading, stop checking for new images
  			// https://github.com/ded/domready/blob/master/ready.js#L15
  			picturefill();
  			if ( /^loaded|^i|^c/.test( doc.readyState ) ) {
  				clearInterval( intervalId );
  				return;
  			}
  		}, 250 );
  		if ( w.addEventListener ) {
  			var resizeThrottle;
  			w.addEventListener( "resize", function() {
  				if (!w._picturefillWorking) {
  					w._picturefillWorking = true;
  					w.clearTimeout( resizeThrottle );
  					resizeThrottle = w.setTimeout( function() {
  						picturefill({ reevaluate: true });
  						w._picturefillWorking = false;
  					}, 60 );
  				}
  			}, false );
  		}
  	}
  
  	runPicturefill();
  
  	/* expose methods for testing */
  	picturefill._ = pf;
  
  	/* expose picturefill */
  	if ( typeof module === "object" && typeof module.exports === "object" ) {
  		// CommonJS, just export
  		module.exports = picturefill;
  	} else if ( typeof define === "function" && define.amd ){
  		// AMD support
  		define( function() { return picturefill; } );
  	} else if ( typeof w === "object" ) {
  		// If no AMD and we are in the browser, attach to window
  		w.picturefill = picturefill;
  	}
  
  } )( this, this.document );
  ;
  if (typeof Drupal !== 'undefined' && typeof jQuery !== 'undefined') {
    // only load if Drupal and jQuery are defined.
    (function ($) {
      Drupal.behaviors.picture = {
        attach: function (context) {
          // Ensure we always pass a raw DOM element to picture fill, otherwise it
          // will fallback to the document scope and maybe handle to much.
          window.picturefill($(context));
          // If this is an opened colorbox ensure the content dimensions are set
          // properly. colorbox.js of the colorbox modules sets #cboxLoadedContent
          // as context.
          if (context === '#cboxLoadedContent' && $(context).find('picture').length) {
            // Try to resize right away.
            $.colorbox.resize();
            // Make sure the colorbox resizes always when the image is changed.
            $('img', context).once('colorbox-lazy-load', function(){
              $(this).load(function(){
                // Ensure there's no max-width / max-height otherwise we won't get
                // the proper values. We could use naturalWeight / naturalHeight
                // but that's not supported by <IE9 and Opera.
                this.style.maxHeight = $(window).height() + 'px';
                this.style.maxWidth = $(window).width() + 'px';
                $.colorbox.resize({innerHeight: this.height, innerWidth: this.width});
                // Remove overwrite of this values again to ensure we respect the
                // stylesheet.
                this.style.maxHeight = null;
                this.style.maxWidth = null;
              });
            });
          }
        }
      };
    })(jQuery);
  }
  ;
  /**
   * hoverIntent is similar to jQuery's built-in "hover" function except that
   * instead of firing the onMouseOver event immediately, hoverIntent checks
   * to see if the user's mouse has slowed down (beneath the sensitivity
   * threshold) before firing the onMouseOver event.
   *
   * hoverIntent r6 // 2011.02.26 // jQuery 1.5.1+
   * <http://cherne.net/brian/resources/jquery.hoverIntent.html>
   *
   * hoverIntent is currently available for use in all personal or commercial
   * projects under both MIT and GPL licenses. This means that you can choose
   * the license that best suits your project, and use it accordingly.
   *
   * // basic usage (just like .hover) receives onMouseOver and onMouseOut functions
   * $("ul li").hoverIntent( showNav , hideNav );
   *
   * // advanced usage receives configuration object only
   * $("ul li").hoverIntent({
  *	sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
  *	interval: 100,   // number = milliseconds of polling interval
  *	over: showNav,  // function = onMouseOver callback (required)
  *	timeout: 0,   // number = milliseconds delay before onMouseOut function call
  *	out: hideNav    // function = onMouseOut callback (required)
  * });
   *
   * @param  f  onMouseOver function || An object with configuration options
   * @param  g  onMouseOut function  || Nothing (use configuration options object)
   * @author    Brian Cherne <brian(at)cherne(dot)net>
   */
  (function($) {
    $.fn.hoverIntent = function(f,g) {
      // default configuration options
      var cfg = {
        sensitivity: 7,
        interval: 100,
        timeout: 0
      };
      // override configuration options with user supplied object
      cfg = $.extend(cfg, g ? { over: f, out: g } : f );
  
      // instantiate variables
      // cX, cY = current X and Y position of mouse, updated by mousemove event
      // pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
      var cX, cY, pX, pY;
  
      // A private function for getting mouse position
      var track = function(ev) {
        cX = ev.pageX;
        cY = ev.pageY;
      };
  
      // A private function for comparing current and previous mouse position
      var compare = function(ev,ob) {
        ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
        // compare mouse positions to see if they've crossed the threshold
        if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
          $(ob).unbind("mousemove",track);
          // set hoverIntent state to true (so mouseOut can be called)
          ob.hoverIntent_s = 1;
          return cfg.over.apply(ob,[ev]);
        } else {
          // set previous coordinates for next time
          pX = cX; pY = cY;
          // use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
          ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
        }
      };
  
      // A private function for delaying the mouseOut function
      var delay = function(ev,ob) {
        ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
        ob.hoverIntent_s = 0;
        return cfg.out.apply(ob,[ev]);
      };
  
      // A private function for handling mouse 'hovering'
      var handleHover = function(e) {
        // copy objects to be passed into t (required for event object to be passed in IE)
        var ev = jQuery.extend({},e);
        var ob = this;
  
        // cancel hoverIntent timer if it exists
        if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
  
        // if e.type == "mouseenter"
        if (e.type == "mouseenter") {
          // set "previous" X and Y position based on initial entry point
          pX = ev.pageX; pY = ev.pageY;
          // update "current" X and Y position based on mousemove
          $(ob).bind("mousemove",track);
          // start polling interval (self-calling timeout) to compare mouse coordinates over time
          if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
  
          // else e.type == "mouseleave"
        } else {
          // unbind expensive mousemove event
          $(ob).unbind("mousemove",track);
          // if hoverIntent state is true, then call the mouseOut function after the specified delay
          if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
        }
      };
  
      // bind the function to the two event listeners
      return this.bind('mouseenter',handleHover).bind('mouseleave',handleHover);
    };
  })(jQuery);
  ;
  /*!
    Tinycon - A small library for manipulating the Favicon
    Tom Moor, http://tommoor.com
    Copyright (c) 2012 Tom Moor
    MIT Licensed
    @version 0.5
  */
  (function(){var Tinycon={};var currentFavicon=null;var originalFavicon=null;var originalTitle=document.title;var faviconImage=null;var canvas=null;var options={};var defaults={width:7,height:9,font:'10px arial',colour:'#ffffff',background:'#F03D25',fallback:true,abbreviate:true};var ua=(function(){var agent=navigator.userAgent.toLowerCase();return function(browser){return agent.indexOf(browser)!==-1}}());var browser={ie:ua('msie'),chrome:ua('chrome'),webkit:ua('chrome')||ua('safari'),safari:ua('safari')&&!ua('chrome'),mozilla:ua('mozilla')&&!ua('chrome')&&!ua('safari')};var getFaviconTag=function(){var links=document.getElementsByTagName('link');for(var i=0,len=links.length;i<len;i++){if((links[i].getAttribute('rel')||'').match(/\bicon\b/)){return links[i]}}return false};var removeFaviconTag=function(){var links=document.getElementsByTagName('link');var head=document.getElementsByTagName('head')[0];for(var i=0,len=links.length;i<len;i++){var exists=(typeof(links[i])!=='undefined');if(exists&&(links[i].getAttribute('rel')||'').match(/\bicon\b/)){head.removeChild(links[i])}}};var getCurrentFavicon=function(){if(!originalFavicon||!currentFavicon){var tag=getFaviconTag();originalFavicon=currentFavicon=tag?tag.getAttribute('href'):'/favicon.ico'}return currentFavicon};var getCanvas=function(){if(!canvas){canvas=document.createElement("canvas");canvas.width=16;canvas.height=16}return canvas};var setFaviconTag=function(url){removeFaviconTag();var link=document.createElement('link');link.type='image/x-icon';link.rel='icon';link.href=url;document.getElementsByTagName('head')[0].appendChild(link)};var log=function(message){if(window.console)window.console.log(message)};var drawFavicon=function(label,colour){if(!getCanvas().getContext||browser.ie||browser.safari||options.fallback==='force'){return updateTitle(label)}var context=getCanvas().getContext("2d");var colour=colour||'#000000';var src=getCurrentFavicon();faviconImage=new Image();faviconImage.onload=function(){context.clearRect(0,0,16,16);context.drawImage(faviconImage,0,0,faviconImage.width,faviconImage.height,0,0,16,16);if((label+'').length>0)drawBubble(context,label,colour);refreshFavicon()};if(!src.match(/^data/)){faviconImage.crossOrigin='anonymous'}faviconImage.src=src};var updateTitle=function(label){if(options.fallback){if((label+'').length>0){document.title='('+label+') '+originalTitle}else{document.title=originalTitle}}};var drawBubble=function(context,label,colour){if(typeof label=='number'&&label>99&&options.abbreviate){label=abbreviateNumber(label)}var len=(label+'').length-1;var width=options.width+(6*len);var w=16-width;var h=16-options.height;context.font=(browser.webkit?'bold ':'')+options.font;context.fillStyle=options.background;context.strokeStyle=options.background;context.lineWidth=1;context.fillRect(w,h,width-1,options.height);context.beginPath();context.moveTo(w-0.5,h+1);context.lineTo(w-0.5,15);context.stroke();context.beginPath();context.moveTo(15.5,h+1);context.lineTo(15.5,15);context.stroke();context.beginPath();context.strokeStyle="rgba(0,0,0,0.3)";context.moveTo(w,16);context.lineTo(15,16);context.stroke();context.fillStyle=options.colour;context.textAlign="right";context.textBaseline="top";context.fillText(label,15,browser.mozilla?7:6)};var refreshFavicon=function(){if(!getCanvas().getContext)return;setFaviconTag(getCanvas().toDataURL())};var abbreviateNumber=function(label){var metricPrefixes=[['G',1000000000],['M',1000000],['k',1000]];for(var i=0;i<metricPrefixes.length;++i){if(label>=metricPrefixes[i][1]){label=round(label/metricPrefixes[i][1])+metricPrefixes[i][0];break}}return label};var round=function(value,precision){var number=new Number(value);return number.toFixed(precision)};Tinycon.setOptions=function(custom){options={};for(var key in defaults){options[key]=custom.hasOwnProperty(key)?custom[key]:defaults[key]}return this};Tinycon.setImage=function(url){currentFavicon=url;refreshFavicon();return this};Tinycon.setBubble=function(label,colour){label=label||'';drawFavicon(label,colour);return this};Tinycon.reset=function(){setFaviconTag(originalFavicon)};Tinycon.setOptions(defaults);window.Tinycon=Tinycon})();
  ;
  (function ($) {
  
    Drupal.behaviors.environment_indicatorToolbar = {
      attach: function (context, settings) {
        if (typeof(settings.environment_indicator) != 'undefined' && typeof(settings.environment_indicator['toolbar-color']) != 'undefined') {
          var environment_name = settings.environment_indicator['environment-indicator-name'],
            environment_color = settings.environment_indicator['toolbar-color'],
            environment_text_color = settings.environment_indicator['toolbar-text-color'],
            $name = $('<div>').addClass('environment-indicator-name-wrapper').html(environment_name),
            $toolbar = $('#toolbar, #navbar-bar', context);
          $('div.toolbar-menu', $toolbar).once('environment_indicator').prepend($name);
          $('div.toolbar-menu', $toolbar).css('background-color', environment_color);
          $('div.toolbar-menu .item-list', $toolbar).css('background-color', changeColor(environment_color, 0.15, true));
          $('div.toolbar-menu ul li:not(.environment-switcher) a', $toolbar).css('background-color', environment_color).css('color', environment_text_color);
          $('div.toolbar-drawer', $toolbar).css('background-color', changeColor(environment_color, 0.25)).find('ul li a').css('color', changeColor(environment_text_color, 0.25));
          $('div.toolbar-menu ul li a', $toolbar).hover(function () {
            $(this).css('background-color', changeColor(environment_color, 0.1)).css('color', changeColor(environment_text_color, 0.1));
          }, function () {
            $(this).css('background-color', environment_color).css('color', environment_text_color);
            $('div.toolbar-menu ul li.active-trail a', $toolbar).css('background-color', changeColor(environment_color, 0.1)).css('color', changeColor(environment_text_color, 0.1));
          });
          $('div.toolbar-menu ul li.active-trail a', $toolbar).css('background-image', 'none').css('background-color', changeColor(environment_color, 0.1)).css('color', changeColor(environment_text_color, 0.1));
          $('div.toolbar-drawer ul li a', $toolbar).hover(function () {
            $(this).css('background-color', changeColor(environment_color, 0.1, true)).css('color', changeColor(environment_text_color, 0.1, true));
          }, function () {
            $(this).css('background-color', changeColor(environment_color, 0.25)).css('color', changeColor(environment_text_color, 0.25));
            $('div.toolbar-drawer ul li.active-trail a', $toolbar).css('background-color', changeColor(environment_color, 0.1, true)).css('color', changeColor(environment_text_color, 0.1, true));
          });
          $('div.toolbar-drawer ul li.active-trail a', $toolbar).css('background-image', 'none').css('background-color', changeColor(environment_color, 0.1, true)).css('color', changeColor(environment_text_color, 0.1, true));
          // Move switcher bar to the top
          var $switcher_container = $('.environment-switcher-container', $toolbar);
          var $switcher = $switcher_container.parent().clone();
          $switcher_container.parent().remove();
          $toolbar.prepend($switcher);
          // Add a margin if the Shortcut module toggle button is present.
          if ($('div.toolbar-menu a.toggle', $toolbar).length > 0) {
            $('div.toolbar-menu', $toolbar).css('padding-right', 40);
          }
        };
      }
    };
  
    Drupal.behaviors.environment_indicatorTinycon = {
      attach: function (context, settings) {
        if (typeof(settings.environment_indicator) != 'undefined' &&
            typeof(settings.environment_indicator.addFavicon) != 'undefined' &&
            settings.environment_indicator.addFavicon) {
          //Draw favicon label
          Tinycon.setBubble(settings.environment_indicator.faviconLabel);
          Tinycon.setOptions({
            background: settings.environment_indicator.faviconColor,
            colour: settings.environment_indicator.faviconTextColor
          });
        }
      }
    }
  
    Drupal.behaviors.environment_indicatorAdminMenu = {
      attach: function (context, settings) {
        if (typeof(Drupal.admin) != 'undefined' && typeof(settings.environment_indicator) != 'undefined' && typeof(settings.environment_indicator['toolbar-color']) != 'undefined') {
          // Add the restyling behavior to the admin menu behaviors.
          Drupal.admin.behaviors['environment_indicator'] = function (context, settings) {
            $('#admin-menu, #admin-menu-wrapper', context).css('background-color', settings.environment_indicator['toolbar-color']);
            $('#admin-menu, #admin-menu-wrapper > ul > li:not(.admin-menu-account) > a', context).css('color', settings.environment_indicator['toolbar-text-color']);
            $('#admin-menu .item-list', context).css('background-color', changeColor(settings.environment_indicator['toolbar-color'], 0.15, true));
            $('#admin-menu .item-list ul li:not(.environment-switcher) a', context).css('background-color', settings.environment_indicator['toolbar-color']).css('color', settings.environment_indicator['toolbar-text-color']);
          };
        };
      }
    };
  
    Drupal.behaviors.environment_indicatorNavbar = {
      attach: function (context, settings) {
        if (typeof(settings.navbar) != 'undefined' && typeof(settings.environment_indicator) != 'undefined' && typeof(settings.environment_indicator['toolbar-color']) != 'undefined') {
          $('#navbar-administration .navbar-bar', context).css('background-color', settings.environment_indicator['toolbar-color']);
          $('#navbar-administration .navbar-tab *:not(select)', context).css('color', settings.environment_indicator['toolbar-text-color']);
        }
      }
    };
  
    Drupal.behaviors.environment_indicatorSwitcher = {
      attach: function (context, settings) {
        // Check that the links actually point to the current path, if not, fix them
        $('.environment-switcher a', context).click(function (e) {
          e.preventDefault();
          var current_location = window.location;
          window.location.href = current_location.protocol + '//' + e.currentTarget.hostname + current_location.pathname + current_location.search + current_location.hash;
        });
        $('#environment-indicator .environment-indicator-name, #toolbar .environment-indicator-name-wrapper, #navbar-bar .environment-indicator-name-wrapper', context).click(function () {
          $('#environment-indicator .item-list, #toolbar .item-list, #navbar-bar .item-list', context).slideToggle('fast');
        });
        $('#environment-indicator.position-top.fixed-yes').once(function () {
          $('body').css('margin-top', $('#environment-indicator.position-top.fixed-yes').height() + 'px');
        });
        $('#environment-indicator.position-bottom.fixed-yes').once(function () {
          $('body').css('margin-bottom', $('#environment-indicator.position-bottom.fixed-yes').height() + 'px');
        });
      }
    }
  
    Drupal.behaviors.environment_indicator_admin = {
      attach: function(context, settings) {
        var $picker = $('#environment-indicator-color-picker');
        // Add the farbtastic tie-in
        if ($.isFunction($.farbtastic) && $picker.length > 0) {
          settings.environment_indicator_color_picker = $picker.farbtastic('#ctools-export-ui-edit-item-form #edit-color');
          settings.environment_indicator_text_color_picker = $('#environment-indicator-text-color-picker').farbtastic('#ctools-export-ui-edit-item-form #edit-text-color');
        }
      }
    }
  
  })(jQuery);
  ;
  var pad = function(num, totalChars) {
      var pad = '0';
      num = num + '';
      while (num.length < totalChars) {
          num = pad + num;
      }
      return num;
  };
  
  // Ratio is between 0 and 1
  var changeColor = function(color, ratio, darker) {
      // Trim trailing/leading whitespace
      color = color.replace(/^\s*|\s*$/, '');
  
      // Expand three-digit hex
      color = color.replace(
          /^#?([a-f0-9])([a-f0-9])([a-f0-9])$/i,
          '#$1$1$2$2$3$3'
      );
  
      // Calculate ratio
      var difference = Math.round(ratio * 256) * (darker ? -1 : 1),
          // Determine if input is RGB(A)
          rgb = color.match(new RegExp('^rgba?\\(\\s*' +
              '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
              '\\s*,\\s*' +
              '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
              '\\s*,\\s*' +
              '(\\d|[1-9]\\d|1\\d{2}|2[0-4][0-9]|25[0-5])' +
              '(?:\\s*,\\s*' +
              '(0|1|0?\\.\\d+))?' +
              '\\s*\\)$'
          , 'i')),
          alpha = !!rgb && rgb[4] != null ? rgb[4] : null,
  
          // Convert hex to decimal
          decimal = !!rgb? [rgb[1], rgb[2], rgb[3]] : color.replace(
              /^#?([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i,
              function() {
                  return parseInt(arguments[1], 16) + ',' +
                      parseInt(arguments[2], 16) + ',' +
                      parseInt(arguments[3], 16);
              }
          ).split(/,/),
          returnValue;
  
      // Return RGB(A)
      return !!rgb ?
          'rgb' + (alpha !== null ? 'a' : '') + '(' +
              Math[darker ? 'max' : 'min'](
                  parseInt(decimal[0], 10) + difference, darker ? 0 : 255
              ) + ', ' +
              Math[darker ? 'max' : 'min'](
                  parseInt(decimal[1], 10) + difference, darker ? 0 : 255
              ) + ', ' +
              Math[darker ? 'max' : 'min'](
                  parseInt(decimal[2], 10) + difference, darker ? 0 : 255
              ) +
              (alpha !== null ? ', ' + alpha : '') +
              ')' :
          // Return hex
          [
              '#',
              pad(Math[darker ? 'max' : 'min'](
                  parseInt(decimal[0], 10) + difference, darker ? 0 : 255
              ).toString(16), 2),
              pad(Math[darker ? 'max' : 'min'](
                  parseInt(decimal[1], 10) + difference, darker ? 0 : 255
              ).toString(16), 2),
              pad(Math[darker ? 'max' : 'min'](
                  parseInt(decimal[2], 10) + difference, darker ? 0 : 255
              ).toString(16), 2)
          ].join('');
  };
  var lighterColor = function(color, ratio) {
      return changeColor(color, ratio, false);
  };
  var darkerColor = function(color, ratio) {
      return changeColor(color, ratio, true);
  };
  ;
  (function($) {
    Drupal.behaviors.epa_wysiwyg = {
      attach : function(context, settings) {
        // Add custom css to the wysiwyg
        if ('undefined' != typeof CKEDITOR) {
          CKEDITOR.on('instanceReady', function(e) {
            $('head', $('#cke_' + e.editor.name + ' iframe').eq(0).contents()).append('<link rel="stylesheet" href="/sites/all/themes/epa/css/wysiwyg.css" type="text/css" >');
            $('#cke_' + e.editor.name + ' iframe').contents().find('html').attr('lang', settings.epa_wysiwyg.site_default_lang);
          });
        }
      }
    };
  })(jQuery);
  ;
  