EnVisageOnline/PixelAdmin-1.3.0/javascripts/libs/jquery.vague-0.0.4.js

192 lines
5.2 KiB
JavaScript

/**
*
* Version: 0.0.4
* Author: Gianluca Guarini
* Contact: gianluca.guarini@gmail.com
* Website: http://www.gianlucaguarini.com/
* Twitter: @gianlucaguarini
*
* Copyright (c) 2013 Gianluca Guarini
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
**/
;(function(window, document, $) {
"use strict";
// Plugin private cache
var cache = {
filterId: 0
};
var Vague = function(elm, customOptions) {
// Default oprions
var defaultOptions = {
intensity: 5,
forceSVGUrl: false
},
options = $.extend(defaultOptions, customOptions);
/*
*
* PUBLIC VARS
*
*/
this.$elm = elm instanceof $ ? elm : $(elm);
/*
*
* PRIVATE VARS
*
*/
var blurred = false;
/*
*
* features detection
*
*/
var browserPrefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
cssPrefixString = {},
cssPrefix = function(property) {
if (cssPrefixString[property] || cssPrefixString[property] === '') return cssPrefixString[property] + property;
var e = document.createElement('div');
var prefixes = ['', 'Moz', 'Webkit', 'O', 'ms', 'Khtml']; // Various supports...
for (var i in prefixes) {
if (typeof e.style[prefixes[i] + property] !== 'undefined') {
cssPrefixString[property] = prefixes[i];
return prefixes[i] + property;
}
}
return property.toLowerCase();
},
// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/css-filters.js
cssfilters = function() {
var el = document.createElement('div');
el.style.cssText = browserPrefixes.join('filter' + ':blur(2px); ');
return !!el.style.length && ((document.documentMode === undefined || document.documentMode > 9));
}(),
// https://github.com/Modernizr/Modernizr/blob/master/feature-detects/svg-filters.js
svgfilters = function() {
var result = false;
try {
result = typeof SVGFEColorMatrixElement !== undefined &&
SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE == 2;
} catch (e) {}
return result;
}(),
/*
*
* PRIVATE METHODS
*
*/
appendSVGFilter = function() {
var filterMarkup = "<svg id='vague-svg-blur' style='position:absolute;' width='0' height='0' >" +
"<filter id='blur-effect-id-" + cache.filterId + "'>" +
"<feGaussianBlur stdDeviation='" + options.intensity + "' />" +
"</filter>" +
"</svg>";
$("body").append(filterMarkup);
};
/*
*
* PUBLIC METHODS
*
*/
this.init = function() {
// checking the css filter feature
if (svgfilters) {
appendSVGFilter();
}
this.$elm.data("vague-filter-id", cache.filterId);
cache.filterId++;
};
this.blur = function() {
var filterValue,
loc = window.location,
svgUrl = options.forceSVGUrl ? loc.protocol + "//" + loc.host + loc.pathname : '',
filterId = this.$elm.data("vague-filter-id"),
cssProp = {};
if (cssfilters) {
filterValue = "blur(" + options.intensity + "px)";
} else if (svgfilters) {
filterValue = "url(" + svgUrl + "#blur-effect-id-" + filterId + ")";
} else {
filterValue = "progid:DXImageTransform.Microsoft.Blur(pixelradius=" + options.intensity + ")";
}
cssProp[cssPrefix('Filter')] = filterValue;
this.$elm.css(cssProp);
blurred = true;
};
this.unblur = function() {
var cssProp = {};
cssProp[cssPrefix('Filter')] = "none";
this.$elm.css(cssProp);
blurred = false;
};
this.toggleblur = function() {
if (blurred) {
this.unblur();
} else {
this.blur();
}
};
this.destroy = function() {
if (svgfilters) {
$("filter#blur-effect-id-" + this.$elm.data("vague-filter-id")).parent().remove();
}
this.unblur();
};
return this.init();
};
$.fn.Vague = function(options) {
return new Vague(this, options);
};
window.Vague = Vague;
}(window, document, jQuery));