WebRTC audio/video call and conferencing server.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

131 lines
4.6 KiB

/*!
* visibly - v0.7 Page Visibility API Polyfill
* http://github.com/addyosmani
* Copyright (c) 2011-2014 Addy Osmani
* Dual licensed under the MIT and GPL licenses.
*
* Methods supported:
* visibly.onVisible(callback)
* visibly.onHidden(callback)
* visibly.hidden()
* visibly.visibilityState()
* visibly.visibilitychange(callback(state));
*/
// https://raw.githubusercontent.com/addyosmani/visibly.js/5b271d2cf71dd21805b7dc0ded7ef97ac764307e/visibly.js
;(function () {
window.visibly = {
q: document,
p: undefined,
prefixes: ['webkit', 'ms','o','moz','khtml'],
props: ['VisibilityState', 'visibilitychange', 'Hidden'],
m: ['focus', 'blur'],
visibleCallbacks: [],
hiddenCallbacks: [],
genericCallbacks:[],
_callbacks: [],
cachedPrefix:"",
fn:null,
onVisible: function (_callback) {
if(typeof _callback == 'function' ){
this.visibleCallbacks.push(_callback);
}
},
onHidden: function (_callback) {
if(typeof _callback == 'function' ){
this.hiddenCallbacks.push(_callback);
}
},
getPrefix:function(){
if(!this.cachedPrefix){
for(var l=0;b=this.prefixes[l++];){
if(b + this.props[2] in this.q){
this.cachedPrefix = b;
return this.cachedPrefix;
}
}
}
},
visibilityState:function(){
return this._getProp(0);
},
hidden:function(){
return this._getProp(2);
},
visibilitychange:function(fn){
if(typeof fn == 'function' ){
this.genericCallbacks.push(fn);
}
var n = this.genericCallbacks.length;
if(n){
if(this.cachedPrefix){
while(n--){
this.genericCallbacks[n].call(this, this.visibilityState());
}
}else{
while(n--){
this.genericCallbacks[n].call(this, arguments[0]);
}
}
}
},
isSupported: function (index) {
return ((this._getPropName(2)) in this.q);
},
_getPropName:function(index) {
return (this.cachedPrefix == "" ? this.props[index].substring(0, 1).toLowerCase() + this.props[index].substring(1) : this.cachedPrefix + this.props[index]);
},
_getProp:function(index){
return this.q[this._getPropName(index)];
},
_execute: function (index) {
if (index) {
this._callbacks = (index == 1) ? this.visibleCallbacks : this.hiddenCallbacks;
var n = this._callbacks.length;
while(n--){
this._callbacks[n]();
}
}
},
_visible: function () {
window.visibly._execute(1);
window.visibly.visibilitychange.call(window.visibly, 'visible');
},
_hidden: function () {
window.visibly._execute(2);
window.visibly.visibilitychange.call(window.visibly, 'hidden');
},
_nativeSwitch: function () {
this[this._getProp(2) ? '_hidden' : '_visible']();
},
_listen: function () {
try { /*if no native page visibility support found..*/
if (!(this.isSupported())) {
if (this.q.addEventListener) { /*for browsers without focusin/out support eg. firefox, opera use focus/blur*/
window.addEventListener(this.m[0], this._visible, 1);
window.addEventListener(this.m[1], this._hidden, 1);
} else { /*IE <10s most reliable focus events are onfocusin/onfocusout*/
if (this.q.attachEvent) {
this.q.attachEvent('onfocusin', this._visible);
this.q.attachEvent('onfocusout', this._hidden);
}
}
} else { /*switch support based on prefix detected earlier*/
this.q.addEventListener(this._getPropName(1), function () {
window.visibly._nativeSwitch.apply(window.visibly, arguments);
}, 1);
}
} catch (e) {}
},
init: function () {
this.getPrefix();
this._listen();
}
};
this.visibly.init();
})();