/* Detect-zoom
* -----------
* Cross Browser Zoom and Pixel Ratio Detector
* Version 1.0.4 | Apr 1 2013
* dual-licensed under the WTFPL and MIT license
* Maintained by https://github/tombigel
* Original developer https://github.com/yonran
*/
//AMD and CommonJS initialization copied from https://github.com/zohararad/audio5js
(function (root, ns, factory) {
"use strict";
if (typeof (module) !== 'undefined' && module.exports) { // CommonJS
module.exports = factory(ns, root);
} else if (typeof (define) === 'function' && define.amd) { // AMD
define("factory", function () {
return factory(ns, root);
});
} else {
root[ns] = factory(ns, root);
}
}(window, 'detectZoom', function () {
/**
* Use devicePixelRatio if supported by the browser
* @return {Number}
* @private
*/
var devicePixelRatio = function () {
return window.devicePixelRatio || 1;
};
/**
* Fallback function to set default values
* @return {Object}
* @private
*/
var fallback = function () {
return {
zoom: 1,
devicePxPerCssPx: 1
};
};
/**
* IE 8 and 9: no trick needed!
* TODO: Test on IE10 and Windows 8 RT
* @return {Object}
* @private
**/
var ie8 = function () {
var zoom = Math.round((screen.deviceXDPI / screen.logicalXDPI) * 100) / 100;
return {
zoom: zoom,
devicePxPerCssPx: zoom * devicePixelRatio()
};
};
/**
* For IE10 we need to change our technique again...
* thanks https://github.com/stefanvanburen
* @return {Object}
* @private
*/
var ie10 = function () {
var zoom = Math.round((document.documentElement.offsetHeight / window.innerHeight) * 100) / 100;
return {
zoom: zoom,
devicePxPerCssPx: zoom * devicePixelRatio()
};
};
/**
* Mobile WebKit
* the trick: window.innerWIdth is in CSS pixels, while
* screen.width and screen.height are in system pixels.
* And there are no scrollbars to mess up the measurement.
* @return {Object}
* @private
*/
var webkitMobile = function () {
var deviceWidth = (Math.abs(window.orientation) == 90) ? screen.height : screen.width;
var zoom = deviceWidth / window.innerWidth;
return {
zoom: zoom,
devicePxPerCssPx: zoom * devicePixelRatio()
};
};
/**
* Desktop Webkit
* the trick: an element's clientHeight is in CSS pixels, while you can
* set its line-height in system pixels using font-size and
* -webkit-text-size-adjust:none.
* device-pixel-ratio: http://www.webkit.org/blog/55/high-dpi-web-sites/
*
* Previous trick (used before http://trac.webkit.org/changeset/100847):
* documentElement.scrollWidth is in CSS pixels, while
* document.width was in system pixels. Note that this is the
* layout width of the document, which is slightly different from viewport
* because document width does not include scrollbars and might be wider
* due to big elements.
* @return {Object}
* @private
*/
var webkit = function () {
var important = function (str) {
return str.replace(/;/g, " !important;");
};
var div = document.createElement('div');
div.innerHTML = "1
2
3
4
5
6
7
8
9
0";
div.setAttribute('style', important('font: 100px/1em sans-serif; -webkit-text-size-adjust: none; text-size-adjust: none; height: auto; width: 1em; padding: 0; overflow: visible;'));
// The container exists so that the div will be laid out in its own flow
// while not impacting the layout, viewport size, or display of the
// webpage as a whole.
// Add !important and relevant CSS rule resets
// so that other rules cannot affect the results.
var container = document.createElement('div');
container.setAttribute('style', important('width:0; height:0; overflow:hidden; visibility:hidden; position: absolute;'));
container.appendChild(div);
document.body.appendChild(container);
var zoom = 1000 / div.clientHeight;
zoom = Math.round(zoom * 100) / 100;
document.body.removeChild(container);
return{
zoom: zoom,
devicePxPerCssPx: zoom * devicePixelRatio()
};
};
/**
* no real trick; device-pixel-ratio is the ratio of device dpi / css dpi.
* (Note that this is a different interpretation than Webkit's device
* pixel ratio, which is the ratio device dpi / system dpi).
*
* Also, for Mozilla, there is no difference between the zoom factor and the device ratio.
*
* @return {Object}
* @private
*/
var firefox4 = function () {
var zoom = mediaQueryBinarySearch('min--moz-device-pixel-ratio', '', 0, 10, 20, 0.0001);
zoom = Math.round(zoom * 100) / 100;
return {
zoom: zoom,
devicePxPerCssPx: zoom
};
};
/**
* Firefox 18.x
* Mozilla added support for devicePixelRatio to Firefox 18,
* but it is affected by the zoom level, so, like in older
* Firefox we can't tell if we are in zoom mode or in a device
* with a different pixel ratio
* @return {Object}
* @private
*/
var firefox18 = function () {
return {
zoom: firefox4().zoom,
devicePxPerCssPx: devicePixelRatio()
};
};
/**
* works starting Opera 11.11
* the trick: outerWidth is the viewport width including scrollbars in
* system px, while innerWidth is the viewport width including scrollbars
* in CSS px
* @return {Object}
* @private
*/
var opera11 = function () {
var zoom = window.top.outerWidth / window.top.innerWidth;
zoom = Math.round(zoom * 100) / 100;
return {
zoom: zoom,
devicePxPerCssPx: zoom * devicePixelRatio()
};
};
/**
* Use a binary search through media queries to find zoom level in Firefox
* @param property
* @param unit
* @param a
* @param b
* @param maxIter
* @param epsilon
* @return {Number}
*/
var mediaQueryBinarySearch = function (property, unit, a, b, maxIter, epsilon) {
var matchMedia;
var head, style, div;
if (window.matchMedia) {
matchMedia = window.matchMedia;
} else {
head = document.getElementsByTagName('head')[0];
style = document.createElement('style');
head.appendChild(style);
div = document.createElement('div');
div.className = 'mediaQueryBinarySearch';
div.style.display = 'none';
document.body.appendChild(div);
matchMedia = function (query) {
style.sheet.insertRule('@media ' + query + '{.mediaQueryBinarySearch ' + '{text-decoration: underline} }', 0);
var matched = getComputedStyle(div, null).textDecoration == 'underline';
style.sheet.deleteRule(0);
return {matches: matched};
};
}
var ratio = binarySearch(a, b, maxIter);
if (div) {
head.removeChild(style);
document.body.removeChild(div);
}
return ratio;
function binarySearch(a, b, maxIter) {
var mid = (a + b) / 2;
if (maxIter <= 0 || b - a < epsilon) {
return mid;
}
var query = "(" + property + ":" + mid + unit + ")";
if (matchMedia(query).matches) {
return binarySearch(mid, b, maxIter - 1);
} else {
return binarySearch(a, mid, maxIter - 1);
}
}
};
/**
* Generate detection function
* @private
*/
var detectFunction = (function () {
var func = fallback;
//IE8+
if (!isNaN(screen.logicalXDPI) && !isNaN(screen.systemXDPI)) {
func = ie8;
}
// IE10+ / Touch
else if (window.navigator.msMaxTouchPoints) {
func = ie10;
}
//Mobile Webkit
else if ('orientation' in window && typeof document.body.style.webkitMarquee === 'string') {
func = webkitMobile;
}
//WebKit
else if (typeof document.body.style.webkitMarquee === 'string') {
func = webkit;
}
//Opera
else if (navigator.userAgent.indexOf('Opera') >= 0) {
func = opera11;
}
//Last one is Firefox
//FF 18.x
else if (window.devicePixelRatio) {
func = firefox18;
}
//FF 4.0 - 17.x
else if (firefox4().zoom > 0.001) {
func = firefox4;
}
return func;
}());
return ({
/**
* Ratios.zoom shorthand
* @return {Number} Zoom level
*/
zoom: function () {
return detectFunction().zoom;
},
/**
* Ratios.devicePxPerCssPx shorthand
* @return {Number} devicePxPerCssPx level
*/
device: function () {
return detectFunction().devicePxPerCssPx;
}
});
}));
var wpcom_img_zoomer = {
clientHintSupport: {
gravatar: false,
files: false,
photon: false,
mshots: false,
staticAssets: false,
latex: false,
imgpress: false,
},
useHints: false,
zoomed: false,
timer: null,
interval: 1000, // zoom polling interval in millisecond
// Should we apply width/height attributes to control the image size?
imgNeedsSizeAtts: function( img ) {
// Do not overwrite existing width/height attributes.
if ( img.getAttribute('width') !== null || img.getAttribute('height') !== null )
return false;
// Do not apply the attributes if the image is already constrained by a parent element.
if ( img.width < img.naturalWidth || img.height < img.naturalHeight )
return false;
return true;
},
hintsFor: function( service ) {
if ( this.useHints === false ) {
return false;
}
if ( this.hints() === false ) {
return false;
}
if ( typeof this.clientHintSupport[service] === "undefined" ) {
return false;
}
if ( this.clientHintSupport[service] === true ) {
return true;
}
return false;
},
hints: function() {
try {
var chrome = window.navigator.userAgent.match(/\sChrome\/([0-9]+)\.[.0-9]+\s/)
if (chrome !== null) {
var version = parseInt(chrome[1], 10)
if (isNaN(version) === false && version >= 46) {
return true
}
}
} catch (e) {
return false
}
return false
},
init: function() {
var t = this;
try{
t.zoomImages();
t.timer = setInterval( function() { t.zoomImages(); }, t.interval );
}
catch(e){
}
},
stop: function() {
if ( this.timer )
clearInterval( this.timer );
},
getScale: function() {
var scale = detectZoom.device();
// Round up to 1.5 or the next integer below the cap.
if ( scale <= 1.0 ) scale = 1.0;
else if ( scale <= 1.5 ) scale = 1.5;
else if ( scale <= 2.0 ) scale = 2.0;
else if ( scale <= 3.0 ) scale = 3.0;
else if ( scale <= 4.0 ) scale = 4.0;
else scale = 5.0;
return scale;
},
shouldZoom: function( scale ) {
var t = this;
// Do not operate on hidden frames.
if ( "innerWidth" in window && !window.innerWidth )
return false;
// Don't do anything until scale > 1
if ( scale == 1.0 && t.zoomed == false )
return false;
return true;
},
zoomImages: function() {
var t = this;
var scale = t.getScale();
if ( ! t.shouldZoom( scale ) ){
return;
}
t.zoomed = true;
// Loop through all the elements on the page.
var imgs = document.getElementsByTagName("img");
for ( var i = 0; i < imgs.length; i++ ) {
// Wait for original images to load
if ( "complete" in imgs[i] && ! imgs[i].complete )
continue;
// Skip images that have srcset attributes.
if ( imgs[i].hasAttribute('srcset') ) {
continue;
}
// Skip images that don't need processing.
var imgScale = imgs[i].getAttribute("scale");
if ( imgScale == scale || imgScale == "0" )
continue;
// Skip images that have already failed at this scale
var scaleFail = imgs[i].getAttribute("scale-fail");
if ( scaleFail && scaleFail <= scale )
continue;
// Skip images that have no dimensions yet.
if ( ! ( imgs[i].width && imgs[i].height ) )
continue;
// Skip images from Lazy Load plugins
if ( ! imgScale && imgs[i].getAttribute("data-lazy-src") && (imgs[i].getAttribute("data-lazy-src") !== imgs[i].getAttribute("src")))
continue;
if ( t.scaleImage( imgs[i], scale ) ) {
// Mark the img as having been processed at this scale.
imgs[i].setAttribute("scale", scale);
}
else {
// Set the flag to skip this image.
imgs[i].setAttribute("scale", "0");
}
}
},
scaleImage: function( img, scale ) {
var t = this;
var newSrc = img.src;
var isFiles = false;
var isLatex = false;
var isPhoton = false;
// Skip slideshow images
if ( img.parentNode.className.match(/slideshow-slide/) )
return false;
// Skip CoBlocks Lightbox images
if ( img.parentNode.className.match(/coblocks-lightbox__image/) )
return false;
// Scale gravatars that have ?s= or ?size=
if ( img.src.match( /^https?:\/\/([^\/]*\.)?gravatar\.com\/.+[?&](s|size)=/ ) ) {
if ( this.hintsFor( "gravatar" ) === true ) {
return false;
}
newSrc = img.src.replace( /([?&](s|size)=)(\d+)/, function( $0, $1, $2, $3 ) {
// Stash the original size
var originalAtt = "originals",
originalSize = img.getAttribute(originalAtt);
if ( originalSize === null ) {
originalSize = $3;
img.setAttribute(originalAtt, originalSize);
if ( t.imgNeedsSizeAtts( img ) ) {
// Fix width and height attributes to rendered dimensions.
img.width = img.width;
img.height = img.height;
}
}
// Get the width/height of the image in CSS pixels
var size = img.clientWidth;
// Convert CSS pixels to device pixels
var targetSize = Math.ceil(img.clientWidth * scale);
// Don't go smaller than the original size
targetSize = Math.max( targetSize, originalSize );
// Don't go larger than the service supports
targetSize = Math.min( targetSize, 512 );
return $1 + targetSize;
});
}
// Scale mshots that have width
else if ( img.src.match(/^https?:\/\/([^\/]+\.)*(wordpress|wp)\.com\/mshots\/.+[?&]w=\d+/) ) {
if ( this.hintsFor( "mshots" ) === true ) {
return false;
}
newSrc = img.src.replace( /([?&]w=)(\d+)/, function($0, $1, $2) {
// Stash the original size
var originalAtt = 'originalw', originalSize = img.getAttribute(originalAtt);
if ( originalSize === null ) {
originalSize = $2;
img.setAttribute(originalAtt, originalSize);
if ( t.imgNeedsSizeAtts( img ) ) {
// Fix width and height attributes to rendered dimensions.
img.width = img.width;
img.height = img.height;
}
}
// Get the width of the image in CSS pixels
var size = img.clientWidth;
// Convert CSS pixels to device pixels
var targetSize = Math.ceil(size * scale);
// Don't go smaller than the original size
targetSize = Math.max( targetSize, originalSize );
// Don't go bigger unless the current one is actually lacking
if ( scale > img.getAttribute("scale") && targetSize <= img.naturalWidth )
targetSize = $2;
if ( $2 != targetSize )
return $1 + targetSize;
return $0;
});
// Update height attribute to match width
newSrc = newSrc.replace( /([?&]h=)(\d+)/, function($0, $1, $2) {
if ( newSrc == img.src ) {
return $0;
}
// Stash the original size
var originalAtt = 'originalh', originalSize = img.getAttribute(originalAtt);
if ( originalSize === null ) {
originalSize = $2;
img.setAttribute(originalAtt, originalSize);
}
// Get the height of the image in CSS pixels
var size = img.clientHeight;
// Convert CSS pixels to device pixels
var targetSize = Math.ceil(size * scale);
// Don't go smaller than the original size
targetSize = Math.max( targetSize, originalSize );
// Don't go bigger unless the current one is actually lacking
if ( scale > img.getAttribute("scale") && targetSize <= img.naturalHeight )
targetSize = $2;
if ( $2 != targetSize )
return $1 + targetSize;
return $0;
});
}
// Scale simple imgpress queries (s0.wp.com) that only specify w/h/fit
else if ( img.src.match(/^https?:\/\/([^\/.]+\.)*(wp|wordpress)\.com\/imgpress\?(.+)/) ) {
if ( this.hintsFor( "imgpress" ) === true ) {
return false;
}
var imgpressSafeFunctions = ["zoom", "url", "h", "w", "fit", "filter", "brightness", "contrast", "colorize", "smooth", "unsharpmask"];
// Search the query string for unsupported functions.
var qs = RegExp.$3.split('&');
for ( var q in qs ) {
q = qs[q].split('=')[0];
if ( imgpressSafeFunctions.indexOf(q) == -1 ) {
return false;
}
}
// Fix width and height attributes to rendered dimensions.
img.width = img.width;
img.height = img.height;
// Compute new src
if ( scale == 1 )
newSrc = img.src.replace(/\?(zoom=[^&]+&)?/, '?');
else
newSrc = img.src.replace(/\?(zoom=[^&]+&)?/, '?zoom=' + scale + '&');
}
// Scale files.wordpress.com, LaTeX, or Photon images (i#.wp.com)
else if (
( isFiles = img.src.match(/^https?:\/\/([^\/]+)\.files\.wordpress\.com\/.+[?&][wh]=/) ) ||
( isLatex = img.src.match(/^https?:\/\/([^\/.]+\.)*(wp|wordpress)\.com\/latex\.php\?(latex|zoom)=(.+)/) ) ||
( isPhoton = img.src.match(/^https?:\/\/i[\d]{1}\.wp\.com\/(.+)/) )
) {
if ( false !== isFiles && this.hintsFor( "files" ) === true ) {
return false
}
if ( false !== isLatex && this.hintsFor( "latex" ) === true ) {
return false
}
if ( false !== isPhoton && this.hintsFor( "photon" ) === true ) {
return false
}
// Fix width and height attributes to rendered dimensions.
img.width = img.width;
img.height = img.height;
// Compute new src
if ( scale == 1 ) {
newSrc = img.src.replace(/\?(zoom=[^&]+&)?/, '?');
} else {
newSrc = img.src;
var url_var = newSrc.match( /([?&]w=)(\d+)/ );
if ( url_var !== null && url_var[2] ) {
newSrc = newSrc.replace( url_var[0], url_var[1] + img.width );
}
url_var = newSrc.match( /([?&]h=)(\d+)/ );
if ( url_var !== null && url_var[2] ) {
newSrc = newSrc.replace( url_var[0], url_var[1] + img.height );
}
var zoom_arg = '&zoom=2';
if ( !newSrc.match( /\?/ ) ) {
zoom_arg = '?zoom=2';
}
img.setAttribute( 'srcset', newSrc + zoom_arg + ' ' + scale + 'x' );
}
}
// Scale static assets that have a name matching *-1x.png or *@1x.png
else if ( img.src.match(/^https?:\/\/[^\/]+\/.*[-@]([12])x\.(gif|jpeg|jpg|png)(\?|$)/) ) {
if ( this.hintsFor( "staticAssets" ) === true ) {
return false;
}
// Fix width and height attributes to rendered dimensions.
img.width = img.width;
img.height = img.height;
var currentSize = RegExp.$1, newSize = currentSize;
if ( scale <= 1 )
newSize = 1;
else
newSize = 2;
if ( currentSize != newSize )
newSrc = img.src.replace(/([-@])[12]x\.(gif|jpeg|jpg|png)(\?|$)/, '$1'+newSize+'x.$2$3');
}
else {
return false;
}
// Don't set img.src unless it has changed. This avoids unnecessary reloads.
if ( newSrc != img.src ) {
// Store the original img.src
var prevSrc, origSrc = img.getAttribute("src-orig");
if ( !origSrc ) {
origSrc = img.src;
img.setAttribute("src-orig", origSrc);
}
// In case of error, revert img.src
prevSrc = img.src;
img.onerror = function(){
img.src = prevSrc;
if ( img.getAttribute("scale-fail") < scale )
img.setAttribute("scale-fail", scale);
img.onerror = null;
};
// Finally load the new image
img.src = newSrc;
}
return true;
}
};
wpcom_img_zoomer.init();
;
/*
* Thickbox 3.1 - One Box To Rule Them All.
* By Cody Lindley (http://www.codylindley.com)
* Copyright (c) 2007 cody lindley
* Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
*/
if ( typeof tb_pathToImage != 'string' ) {
var tb_pathToImage = thickboxL10n.loadingAnimation;
}
/*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/
//on page load call tb_init
jQuery(document).ready(function(){
tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
imgLoader = new Image();// preload image
imgLoader.src = tb_pathToImage;
});
/*
* Add thickbox to href & area elements that have a class of .thickbox.
* Remove the loading indicator when content in an iframe has loaded.
*/
function tb_init(domChunk){
jQuery( 'body' )
.on( 'click', domChunk, tb_click )
.on( 'thickbox:iframe:loaded', function() {
jQuery( '#TB_window' ).removeClass( 'thickbox-loading' );
});
}
function tb_click(){
var t = this.title || this.name || null;
var a = this.href || this.alt;
var g = this.rel || false;
tb_show(t,a,g);
this.blur();
return false;
}
function tb_show(caption, url, imageGroup) {//function called when the user clicks on a thickbox link
var $closeBtn;
try {
if (typeof document.body.style.maxHeight === "undefined") {//if IE 6
jQuery("body","html").css({height: "100%", width: "100%"});
jQuery("html").css("overflow","hidden");
if (document.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
jQuery("body").append("
'; submitConfirm += notes_i18n.translate('Reply successful, view thread').fetch('target="_blank" href="' + commentPermalink + '"'); submitConfirm += '
'; return $('.selected .wpn-note-body').append(submitConfirm); }); }; if (this.model.get('status').approval_status !== 'approved') { return this.modComment('approve-comment').done(doSend); } else { return doSend(); } }, errorReply: function(r) { var comment_reply_el, er, o; er = r; if (typeof r === 'object') { if (r.responseText) { o = $.parseJSON(r.responseText); er = o.error + ': ' + o.message; } else if (r.statusText) { er = r.statusText; } else { er = 'Unknown Error'; } } comment_reply_el = this.$el.children('.wpn-note-comment-reply'); comment_reply_el.children('.wpn-comment-submit').children('.wpn-comment-submit-waiting').hide(); if (er) { return comment_reply_el.children('.wpn-comment-submit').children('.wpn-comment-submit-error').text(er).show(); } }, clickModComment: function(ev) { if (ev) { ev.preventDefault(); } else { return $.Deferred.reject('invalid click event'); } return this.modComment($(ev.currentTarget).data('action-type')); }, modComment: function(actionType) { var moderating, _this = this; this.$('.wpn-comment-mod-waiting').show().gifspin('small'); moderating = $.Deferred().always(function() { return _this.$('.wpn-comment-mod-waiting').empty().hide(); }).fail(function(error, code) { if ((typeof console !== "undefined" && console !== null) && typeof console.error === 'function') { console.error('Comment moderation error'); if (error) { console.error(error); } } if (!code || code !== 'too_soon') { return _this.model.reload(); } }); if (this.modPromise && typeof this.modPromise.state === 'function' && this.modPromise.state() === 'pending') { moderating.always(function() { return _this.$('.wpn-comment-mod-waiting').show().gifspin('small'); }); return moderating.reject('Moderation already in progress', 'too_soon'); } this.modPromise = moderating.promise(); if (!actionType || !actionType.length || !_.contains(this.getValidActions(), actionType)) { return moderating.reject('Invalid actionType'); } $.Deferred(function() { var action, anticipatedNewStatus; wpNotesCommon.bumpStat('notes-click-action', actionType); action = _this.actionsByName[actionType]; if (!action) { return moderating.reject('Undefined action params for type: ' + actionType); } anticipatedNewStatus = _this.getResultantStatus(actionType); if (anticipatedNewStatus) { _this.model.set('status', $.extend({}, _this.model.get('status'), { approval_status: anticipatedNewStatus })); _this.$('.wpn-comment-mod-waiting').show().gifspin('small'); } return wpNotesCommon.ajax({ type: 'POST', path: action.rest_path, data: action.rest_body }).done(function(r) { var rStatus; rStatus = (r != null ? r.status : void 0) ? r.status : 'undefined'; if (_.contains(_this.possibleStatuses, rStatus)) { _this.model.set('status', $.extend({}, _this.model.get('status'), { approval_status: rStatus })); _this.model.blockReloading(15); return moderating.resolve(); } else { return moderating.reject('Invalid status: "' + rStatus + '" received from moderation POST'); } }).fail(function(error) { return moderating.reject(error); }); }); return this.modPromise; }, clickLikeComment: function(ev) { var $button, actionType; ev.preventDefault(); $button = $(ev.currentTarget); actionType = $button.data('action-type'); return this.likeComment(actionType); }, likeComment: function(actionType) { var action, i_liked, rest_path, _this = this; action = this.actionsByName[actionType]; if ('like-comment' === actionType) { i_liked = true; rest_path = action.rest_path + 'new/'; } else { i_liked = false; rest_path = action.rest_path + 'mine/delete/'; } this.model.set('status', $.extend({}, this.model.get('status'), { i_liked: i_liked })); this.$('.wpn-comment-mod-waiting').show().gifspin('small'); return wpNotesCommon.ajax({ type: 'POST', path: rest_path }).done(function(r) { return _this.$('.wpn-comment-mod-waiting').empty().hide(); }); } }); })(jQuery); (function() { (function(window, $) { /* * Show an animated gif spinner * Replaces the contents of the selected jQuery elements with the image */ return $.fn.gifspin = function(size) { var $el, $spinner, len; $el = $(this); if (_.isFinite(size) && size > 0) { len = Math.min(~~size, 128); } else { switch (size) { case 'tiny': len = 8; break; case 'small': len = 16; break; case 'medium': len = 32; break; case 'large': len = 64; break; default: len = 128; } } $spinner = $(''); $spinner.css({ height: len, width: len }); $el.html($spinner); return $el; }; })(typeof exports !== "undefined" && exports !== null ? exports : this, window.jQuery); }).call(this); ; if ( 'undefined' == typeof wpcom ) { wpcom = {}; } if ( 'undefined' == typeof wpcom.events ) { wpcom.events = _.extend( {}, Backbone.Events ); } (function($) { // Auto-generated: do not edit! var __autoCacheBusterNotesPanel = '@automattic/jetpack-blocks@13.1.0-1381-gbdb1572270'; // End auto-generated area: var wpNotesArgs = window.wpNotesArgs || {}, cacheBuster = wpNotesArgs.cacheBuster || __autoCacheBusterNotesPanel, iframeUrl = wpNotesArgs.iframeUrl || 'https://widgets.wp.com/notes/', iframeAppend = wpNotesArgs.iframeAppend || '', iframeScroll = wpNotesArgs.iframeScroll || "no", wideScreen = wpNotesArgs.wide || false, hasToggledPanel = false, iframePanelId, iframeFrameId; var wpntView = Backbone.View.extend({ el: '#wp-admin-bar-notes', hasUnseen: null, initialLoad: true, count: null, iframe: null, iframeWindow: null, messageQ: [], iframeSpinnerShown: false, isJetpack: false, linkAccountsURL: false, currentMasterbarActive: false, initialize: function() { var t = this; // graceful fallback for IE <= 7 var matches = navigator.appVersion.match( /MSIE (\d+)/ ); if ( matches && parseInt( matches[1], 10 ) < 8 ) { var $panel = t.$( '#'+iframePanelId ); var $menuItem = t.$( '.ab-empty-item' ); if ( !$panel.length || !$menuItem.length ) { return; } var offset = t.$el.offset(); t.$( '.ab-item' ).removeClass( 'ab-item' ); t.$( '#wpnt-notes-unread-count' ).html( '?' ); // @todo localize $panel.html( ' \Notifications are not supported in this browser!
\ Please upgrade your browser to keep using notifications. \
' ).addClass( 'browse-happy' ); t.$el.on( 'mouseenter', function(e) { clearTimeout( t.fadeOutTimeout ); if ( $panel.is( ':visible:animated' ) ) { $panel.stop().css( 'opacity', '' ); } $menuItem.css({ 'background-color': '#eee' }); $panel.show(); }); t.$el.on( 'mouseleave', function() { t.fadeOutTimeout = setTimeout( function() { clearTimeout( t.fadeOutTimeout ); if ( $panel.is( ':animated' ) ) { return; } $panel.fadeOut( 250, function() { $menuItem.css({ 'background-color': 'transparent' }); }); }, 350 ); }); return; } // don't break notifications if jquery.spin isn't available if ( 'function' != typeof $.fn.spin ) { $.fn.spin = function(x){}; } this.isRtl = $('#wpadminbar').hasClass('rtl'); this.count = $('#wpnt-notes-unread-count'); this.panel = $( '#'+iframePanelId ); this.hasUnseen = this.count.hasClass( 'wpn-unread' ); if ( 'undefined' != typeof wpNotesIsJetpackClient && wpNotesIsJetpackClient ) t.isJetpack = true; if ( t.isJetpack && 'undefined' != typeof wpNotesLinkAccountsURL ) t.linkAccountsURL = wpNotesLinkAccountsURL; this.$el.children('.ab-item').on( 'click touchstart', function(e){ e.preventDefault(); t.togglePanel(); return false; } ); this.preventDefault = function(e) { if (e) e.preventDefault(); return false; }; if ( iframeAppend == '2' ) { // Disable scrolling on main page when cursor in notifications this.panel.mouseenter( function() { document.body.addEventListener( 'mousewheel', t.preventDefault ); }); this.panel.mouseleave( function() { document.body.removeEventListener( 'mousewheel', t.preventDefault ); }); if ( typeof document.hidden !== 'undefined' ) { document.addEventListener( 'visibilitychange', function() { t.postMessage( { action: "toggleVisibility", hidden: document.hidden } ); } ); } } // Click outside the panel to close the panel. $(document).bind( "mousedown focus", function(e) { var $clicked; // Don't fire if the panel isn't showing if ( ! t.showingPanel ) return true; $clicked = $(e.target); /** * Don't fire if there's no real click target * Prevents Firefox issue described here: http://datap2.wordpress.com/2013/08/15/running-in-to-some-strange/ */ if ( $clicked.is( document ) ) return true; // Don't fire on clicks in the panel. if ( $clicked.closest( '#wp-admin-bar-notes' ).length ) return true; t.hidePanel(); return false; }); $(document).on( 'keydown.notes', function (e) { var keyCode = wpNotesCommon.getKeycode( e ); if ( !keyCode ) return; if ( ( keyCode == 27 ) ) //ESC close only t.hidePanel(); if ( ( keyCode == 78 ) ) //n open/close t.togglePanel(); //ignore other commands if the iframe hasn't been loaded yet if ( this.iframeWindow === null ) return; /** * @TODO these appear to be unnecessary as the iframe doesn't * listen for these actions and doesn't appear to need * to. it handles its own keyboard trapping */ if ( t.showingPanel && ( ( keyCode == 74 ) || ( keyCode == 40 ) ) ) { //j and down arrow t.postMessage( { action:"selectNextNote" } ); return false; //prevent default } if ( t.showingPanel && ( ( keyCode == 75 ) || ( keyCode == 38 ) ) ) { //k and up arrow t.postMessage( { action:"selectPrevNote" } ); return false; //prevent default } if ( t.showingPanel && ( ( keyCode == 82 ) || ( keyCode == 65 ) || ( keyCode == 83 ) || ( keyCode == 84 ) ) ) { //mod keys (r,a,s,t) to pass to iframe t.postMessage( { action:"keyEvent", keyCode: keyCode } ); return false; //prevent default } /** * End TODO section */ }); wpcom.events.on( 'notes:togglePanel', function() { t.togglePanel(); } ); if ( t.isJetpack ) t.loadIframe(); else { setTimeout(function() { t.loadIframe(); }, 3000); } if ( t.count.hasClass( 'wpn-unread' ) ) wpNotesCommon.bumpStat( 'notes-menu-impressions', 'non-zero' ); else wpNotesCommon.bumpStat( 'notes-menu-impressions', 'zero' ); // listen for postMessage events from the iframe $(window).on( 'message', function( event ) { if ( !event.data && event.originalEvent.data ) { event = event.originalEvent; } if ( event.origin != 'https://widgets.wp.com' ) { return; } try { var data = ( 'string' == typeof event.data ) ? JSON.parse( event.data ) : event.data; if ( data.type != 'notesIframeMessage' ) { return; } t.handleEvent( data ); } catch(e){} }); }, // Done this way, "this" refers to the wpntView object instead of the window. handleEvent: function( event ) { var inNewdash = ( 'undefined' !== typeof wpcomNewdash && 'undefined' !== typeof wpcomNewdash.router && 'undefined' !== wpcomNewdash.router.setRoute ); if ( !event || !event.action ) { return; } switch ( event.action ) { case "togglePanel": this.togglePanel(); break; case "render": this.render( event.num_new, event.latest_type ); break; case "renderAllSeen": this.renderAllSeen(); break; case "iFrameReady": this.iFrameReady(event); break; /** * @TODO I don't think this action is fired anymore */ case "goToNotesPage": if ( inNewdash ) { wpcomNewdash.router.setRoute( '/notifications' ); } else { window.location.href = '//wordpress.com/me/notifications/'; } break; /** * End TODO section */ case "widescreen": var iframe = $( '#'+iframeFrameId ); if ( event.widescreen && ! iframe.hasClass( 'widescreen' ) ) { iframe.addClass( 'widescreen' ); } else if ( ! event.widescreen && iframe.hasClass( 'widescreen' ) ) { iframe.removeClass( 'widescreen' ); } break; } }, render: function( num_new, latest_type ) { var t = this, flash = false; if ( ( false === this.hasUnseen ) && ( 0 === num_new ) ) return; //assume the icon is correct on initial load, prevents fading in and out for no reason if ( this.initialLoad && this.hasUnseen && ( 0 !== num_new ) ) { this.initialLoad = false; return; } if ( ! this.hasUnseen && ( 0 !== num_new ) ) { wpNotesCommon.bumpStat( 'notes-menu-impressions', 'non-zero-async' ); } var latest_icon_type = wpNotesCommon.noteType2Noticon[ latest_type ]; if ( typeof latest_icon_type == 'undefined' ) latest_icon_type = 'notification'; var latest_img_el = $('', { 'class' : 'noticon noticon-' + latest_icon_type + '' }); var status_img_el = this.getStatusIcon( num_new ); if ( 0 === num_new || this.showingPanel ) { this.hasUnseen = false; t.count.fadeOut( 200, function() { t.count.empty(); t.count.removeClass('wpn-unread').addClass('wpn-read'); t.count.html( status_img_el ); t.count.fadeIn( 500 ); } ); if ( wpcom && wpcom.masterbar ) { wpcom.masterbar.hasUnreadNotifications( false ); } } else { if ( this.hasUnseen ) { // Blink the indicator if it's already on t.count.fadeOut( 400, function() { t.count.empty(); t.count.removeClass('wpn-unread' ).addClass('wpn-read'); t.count.html( latest_img_el ); t.count.fadeIn( 400 ); } ); } this.hasUnseen = true; t.count.fadeOut( 400, function() { t.count.empty(); t.count.removeClass('wpn-read').addClass('wpn-unread'); t.count.html( latest_img_el ); t.count.fadeIn( 400, function() { }); }); if ( wpcom && wpcom.masterbar ) { wpcom.masterbar.hasUnreadNotifications( true ); } } }, renderAllSeen: function() { if ( !this.hasToggledPanel ) { return; } var img_el = this.getStatusIcon(0); this.count.removeClass('wpn-unread').addClass('wpn-read'); this.count.empty(); this.count.html( img_el ); this.hasUnseen = false; if ( wpcom && wpcom.masterbar ) { wpcom.masterbar.hasUnreadNotifications( false ); } }, getStatusIcon: function( number ) { var new_icon = ''; switch ( number ) { case 0: new_icon = 'noticon noticon-notification'; break; case 1: new_icon = 'noticon noticon-notification'; break; case 2: new_icon = 'noticon noticon-notification'; break; default: new_icon = 'noticon noticon-notification'; } return $('', { 'class' : new_icon }); }, togglePanel: function() { if ( !this.hasToggledPanel ) { this.hasToggledPanel = true; } var t = this; this.loadIframe(); // temp hack until 3.3 merge to highlight toolbar number //this.$el.removeClass('wpnt-stayopen'); this.$el.toggleClass('wpnt-stayopen'); this.$el.toggleClass('wpnt-show'); this.showingPanel = this.$el.hasClass('wpnt-show'); $( '.ab-active' ).removeClass( 'ab-active' ); if ( this.showingPanel ) { var $unread = this.$( '.wpn-unread' ); if ( $unread.length ) { $unread.removeClass( 'wpn-unread' ).addClass( 'wpn-read' ); } this.reportIframeDelay(); if ( this.hasUnseen ) wpNotesCommon.bumpStat( 'notes-menu-clicks', 'non-zero' ); else wpNotesCommon.bumpStat( 'notes-menu-clicks', 'zero' ); this.hasUnseen = false; } // tell the iframe we are opening it this.postMessage( { action:"togglePanel", showing:this.showingPanel } ); var focusNotesIframe = function( iframe ) { if ( null === iframe.contentWindow ) { iframe.addEventListener( 'load', function() { iframe.contentWindow.focus(); } ); } else { iframe.contentWindow.focus(); } }; if ( this.showingPanel ) { focusNotesIframe( this.iframe[0] ); } else { window.focus(); } this.setActive( this.showingPanel ); }, // Handle juggling the .active state of the masterbar setActive: function( active ) { if ( active ) { this.currentMasterbarActive = $( '.masterbar li.active' ); this.currentMasterbarActive.removeClass( 'active' ); this.$el.addClass( 'active' ); } else { this.$el.removeClass( 'active' ); this.currentMasterbarActive.addClass( 'active' ); this.currentMasterbarActive = false; } this.$el.find( 'a' ).first().blur(); }, loadIframe: function() { var t = this, args = [], src, lang, queries, panelRtl; if ( t.iframe === null ) { // Removed spinner here because it shows up so briefly, and is replaced by the iframe spinner in a different spot // t.panel.addClass('loadingIframe').find('.wpnt-notes-panel-header').spin('large'); t.panel.addClass('loadingIframe'); if ( t.isJetpack ) { args.push( 'jetpack=true' ); if ( t.linkAccountsURL ) { args.push( 'link_accounts_url=' + escape( t.linkAccountsURL ) ); } } // Attempt to detect if browser is a touch device, similar code // in Calypso. The class adds CSS needed for mobile Safari to allow // scrolling of iframe. if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { t.panel.addClass( 'touch' ); } panelRtl = $( '#'+iframePanelId ).attr( 'dir' ) == 'rtl'; lang = $( '#'+iframePanelId ).attr( 'lang' ) || 'en'; args.push( 'v=' + cacheBuster ); args.push( 'locale=' + lang ); queries = ( args.length ) ? '?' + args.join( '&' ) : ''; src = iframeUrl; if ( iframeAppend == '2' && ( t.isRtl || panelRtl ) && ! /rtl.html$/.test(iframeUrl) ) { src = iframeUrl + 'rtl.html'; } src = src + queries + '#' + document.location.toString(); if ( $( '#'+iframePanelId ).attr( 'dir' ) == 'rtl' ) { src += '&rtl=1'; } if ( !lang.match( /^en/ ) ) { src += ( '&lang=' + lang ); } // Add the iframe (invisible until iFrameReady) t.iframe = $(''); t.iframe.attr( 'src', src ); if ( wideScreen ) { t.panel.addClass( 'wide' ); t.iframe.addClass( 'wide' ); } t.panel.append(t.iframe); } }, reportIframeDelay: function() { if ( !this.iframeWindow ) { if ( !this.iframeSpinnerShown ) this.iframeSpinnerShown = (new Date()).getTime(); return; } if ( this.iframeSpinnerShown !== null ) { var delay = 0; if ( this.iframeSpinnerShown ) delay = (new Date()).getTime() - this.iframeSpinnerShown; if ( delay === 0 ) wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '0' ); else if ( delay < 1000 ) wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '0-1' ); else if ( delay < 2000 ) wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '1-2' ); else if ( delay < 4000 ) wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '2-4' ); else if ( delay < 8000 ) wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '4-8' ); else wpNotesCommon.bumpStat( 'notes_iframe_perceived_delay', '8-N' ); this.iframeSpinnerShown = null; } }, iFrameReady: function(event) { var t = this; var url_parser = document.createElement( 'a' ); url_parser.href = this.iframe.get(0).src; this.iframeOrigin = url_parser.protocol + '//' + url_parser.host; this.iframeWindow = this.iframe.get(0).contentWindow; if ( "num_new" in event ) this.render( event.num_new, event.latest_type ); this.panel.removeClass('loadingIframe').find('.wpnt-notes-panel-header').remove(); this.iframe.show(); if ( this.showingPanel ) this.reportIframeDelay(); // detect user activity and trigger a refresh event in the iframe $( window ).on( 'focus keydown mousemove scroll', function() { // Throttle postMessages since the overhead is pretty high & these events fire a lot var now = ( new Date() ).getTime(); if ( !t.lastActivityRefresh || t.lastActivityRefresh < now - 5000 ) { t.lastActivityRefresh = now; t.postMessage( { action: "refreshNotes" } ); } } ); this.sendQueuedMessages(); }, hidePanel: function() { if ( this.showingPanel ) { this.togglePanel(); } }, postMessage: function( message ) { var t = this; try{ var _msg = ( 'string' == typeof message ) ? JSON.parse( message ) : message; if ( !_.isObject( _msg ) ) { return; } _msg = _.extend( { type: 'notesIframeMessage' }, _msg ); var targetOrigin = this.iframeOrigin; if ( this.iframeWindow && this.iframeWindow.postMessage ) { this.iframeWindow.postMessage( JSON.stringify( _msg ), targetOrigin ); } else { this.messageQ.push( _msg ); } } catch(e){} }, sendQueuedMessages: function() { var t = this; _.forEach( this.messageQ, function( m ) { t.postMessage( m ); } ); this.messageQ = []; } }); $(function(){ if ( ( $( '#wpnt-notes-panel' ).length == 0 && $( '#wpnt-notes-panel2' ).length ) && ( 'undefined' != typeof wpNotesIsJetpackClientV2 && wpNotesIsJetpackClientV2 ) ) { iframeUrl = 'https://widgets.wp.com/notifications/'; iframeAppend = '2'; iframeScroll = 'yes'; wideScreen = true; } iframePanelId = "wpnt-notes-panel" + iframeAppend; iframeFrameId = "wpnt-notes-iframe" + iframeAppend; new wpntView(); }); })(jQuery); ; jQuery(document).ready( function($){ var tosform = {}; tosform.loaded = false; tosform.setup = function() { tosform.report_type =''; tosform.ajaxurl = wpcom_tos_report_form.ajaxurl; tosform.isLoggedoutUser = wpcom_tos_report_form.isLoggedoutUser; tosform.$step1 = $( '#report-step-1' ); tosform.$types = tosform.$step1.find( 'input:radio' ); tosform.$step2 = $( '#report-step-2' ); tosform.$step2_details = $( '.step-2-details' ); tosform.$next = $( '#step1-submit' ); tosform.$submit = $( '#step2-submit' ); tosform.$report_url = $('#report-url'); tosform.$report_email = $('#report-email'); tosform.$step3 = $( '#report-confirm' ); tosform.$step3_error = $( '#report-error' ); tosform.$step3.hide(); tosform.$step3_error.hide(); tosform.$step2.hide(); tosform.$step1.show(); tosform.$step2_details.hide(); tosform.$types.attr( 'checked', false ); tosform.$next.attr( 'disabled', true ); tosform.$submit.attr( 'disabled', true ); } tosform.setup(); tosform.setup_step2 = function() { $( '#report-step-1' ).fadeOut( 'fast', function(){ tosform.report_type = tosform.$types.filter( ':checked' ).val(); tosform.$step2.fadeIn( 'fast' ); // Show step 2 description depending on type of report tosform.$step2_details.hide(); if( tosform.report_type == 'copyright' ) $('#step2-submit').hide(); $( '#step-2-' + tosform.report_type).show(); $( '#TB_ajaxContent' ).css( 'height', 'auto' ); }); } // Enable continue button when an option is selected, if url has been entered and the email is available $(document).on( 'change.tos_report_form', '#report-step-1 input:radio', function(){ tosform.report_type = tosform.$types.filter( ':checked' ).val(); if ( $.trim( tosform.$report_url.val() ).length != 0 && tosform.report_type.length != 0 && $.trim( tosform.$report_email.val() ).length != 0 ) tosform.$next.attr( 'disabled', false ); else tosform.$next.attr( 'disabled', true ); }); // Enable continue button when a url has been entered, if an option has been selected and the email is available $(document).on( 'change.tos_report_form', '#report-url', function(){ if ( $.trim( tosform.$report_url.val() ).length != 0 && tosform.report_type.length != 0 && $.trim( tosform.$report_email.val() ).length != 0 ) tosform.$next.attr( 'disabled', false ); else tosform.$next.attr( 'disabled', true ); }); // Enable continue button when an email has been entered, if an option is selected and url has been entered $(document).on( 'change.tos_report_form', '#report-email', function(){ if ( $.trim( tosform.$report_url.val() ).length != 0 && tosform.report_type.length != 0 && $.trim( tosform.$report_email.val() ).length != 0 ) tosform.validateUrl( tosform.$report_url.val() ); else tosform.$next.attr( 'disabled', true ); }); // Move to step 2 $(document).on( 'click.tos_report_form', '#step1-submit', function(){ if( tosform.isLoggedoutUser) { $('#step1-submit').val('validating..'); $.ajax( { url: tosform.ajaxurl, type : 'POST', dataType: 'json', data : { action: 'tos_validate_report_fields', report_url: $.trim( tosform.$report_url.val() ), report_email: $.trim( tosform.$report_email.val() ) }, success: function( errorMessages ) { $( '#tos-email-error-message' ).empty(); $( '#tos-url-error-message' ).empty(); if( Object.keys(errorMessages.errors).length === 0 ) { tosform.setup_step2(); } else { if( typeof errorMessages.errors.email_error_message != 'undefined' ) $( '#tos-email-error-message' ).append( '' + errorMessages.errors.email_error_message + '
' ); if( typeof errorMessages.errors.url_error_message != 'undefined' ) $( '#tos-url-error-message' ).append( '' + errorMessages.errors.url_error_message + '
' ); $( '#step1-submit' ).val( 'Submit' ); } } }); } else { tosform.setup_step2(); } }); // Enable form submission when reason textarea is field $(document).on( 'change.tos_report_form input.tos_report_form paste.tos_report_form', 'textarea.step-2-confirm', function(){ if ( $.trim( $(this).val() ).length != 0 ) tosform.$submit.attr( 'disabled', false ); else tosform.$submit.attr( 'disabled', true ); }); // close window on cancel button click or overlay click $(document).on( 'click.tos_report_form', '#TB_ajaxContent .tosform-cancel, #TB_overlay', function(e) { //e.preventDefault(); tb_remove(); }); // close window on 'esc' keypress $(document).keyup( function(e) { if ( e.keyCode == 27 ) { tb_remove(); } }); // Open form function var openForm = function(e){ e.preventDefault(); tb_show( wpcom_tos_report_form.report_this_content, '#TB_inline?width=auto&inlineId=report-form-window&modal=true', '' ); $( '#TB_window, #TB_overlay, #TB_load, #TB_ajaxContent' ).addClass( 'tos-report-form' ); var $tb_ajax_content = $( '#TB_ajaxContent.tos-report-form' ); if ( ! tosform.loaded ) { $tb_ajax_content.spin( 'large' ); $.ajax( { url: tosform.ajaxurl, data : { action: 'tos_form', post_id: wpcom_tos_report_form.post_ID, report_url: wpcom_tos_report_form.current_url }, success: function( form ) { $( '#TB_ajaxContent' ).html( form ).css( 'height', 'auto' ); tosform.setup(); tosform.loaded = true; }, xhrFields: { withCredentials: true } } ); } else { $tb_ajax_content.find( '.spinner' ).remove(); tosform.setup(); } return false; }; // open the form $(document).on( 'click.tos_report_form', '#wp-admin-bar-wpcom_report_url', openForm ); $(document).on( 'click.tos_report_form', '.flb-report a', openForm ); // submit the form $(document).on( 'submit.tos_report_form', '#report-form', function(e){ e.preventDefault(); // set the reason according to the form type $( '#report-form input[name=reason]' ).val( $( '#confirm-' + tosform.report_type ).val() ); var formData = $( '#report-form' ).serialize(); $.ajax( { url: tosform.ajaxurl, data : formData, type : 'POST', success: function(result) { if ( result.success == true ) { tosform.$step2.hide(); tosform.$step3.show(); } else { tosform.$step2.hide(); tosform.$step3_error.show(); } }, xhrFields: { withCredentials: true } }); $( '#TB_ajaxContent.tos-report-form' ).spin( 'large' ); setTimeout(function(){ tb_remove(); }, 2000); }) }); ; /*** * Warning: This file is remotely enqueued in Jetpack's Masterbar module. * Changing it will also affect Jetpack sites. */ jQuery( document ).ready( function( $, wpcom ) { var masterbar, menupops = $( 'li#wp-admin-bar-blog.menupop, li#wp-admin-bar-newdash.menupop, li#wp-admin-bar-my-account.menupop' ), newmenu = $( '#wp-admin-bar-new-post-types' ); // Unbind hoverIntent, we want clickable menus. menupops .unbind( 'mouseenter mouseleave' ) .removeProp( 'hoverIntent_t' ) .removeProp( 'hoverIntent_s' ) .on( 'mouseover', function(e) { var li = $(e.target).closest( 'li.menupop' ); menupops.not(li).removeClass( 'ab-hover' ); li.toggleClass( 'ab-hover' ); } ) .on( 'click touchstart', function(e) { var $target = $( e.target ); if ( masterbar.focusSubMenus( $target ) ) { return; } e.preventDefault(); masterbar.toggleMenu( $target ); } ); masterbar = { focusSubMenus: function( $target ) { // Handle selection of menu items if ( ! $target.closest( 'ul' ).hasClass( 'ab-top-menu' ) ) { $target .closest( 'li' ); return true; } return false; }, toggleMenu: function( $target ) { var $li = $target.closest( 'li.menupop' ), $html = $( 'html' ); $( 'body' ).off( 'click.ab-menu' ); $( '#wpadminbar li.menupop' ).not($li).removeClass( 'ab-active wpnt-stayopen wpnt-show' ); if ( $li.hasClass( 'ab-active' ) ) { $li.removeClass( 'ab-active' ); $html.removeClass( 'ab-menu-open' ); } else { $li.addClass( 'ab-active' ); $html.addClass( 'ab-menu-open' ); $( 'body' ).on( 'click.ab-menu', function( e ) { if ( ! $( e.target ).parents( '#wpadminbar' ).length ) { e.preventDefault(); masterbar.toggleMenu( $li ); $( 'body' ).off( 'click.ab-menu' ); } } ); } } }; } );; /*globals JSON */ ( function( $ ) { var eventName = 'wpcom_masterbar_click'; var linksTracksEvents = { //top level items 'wp-admin-bar-blog' : 'my_sites', 'wp-admin-bar-newdash' : 'reader', 'wp-admin-bar-ab-new-post' : 'write_button', 'wp-admin-bar-my-account' : 'my_account', 'wp-admin-bar-notes' : 'notifications', //my sites - top items 'wp-admin-bar-switch-site' : 'my_sites_switch_site', 'wp-admin-bar-blog-info' : 'my_sites_site_info', 'wp-admin-bar-site-view' : 'my_sites_view_site', 'wp-admin-bar-blog-stats' : 'my_sites_site_stats', 'wp-admin-bar-plan' : 'my_sites_plan', 'wp-admin-bar-plan-badge' : 'my_sites_plan_badge', //my sites - manage 'wp-admin-bar-edit-page' : 'my_sites_manage_site_pages', 'wp-admin-bar-new-page-badge' : 'my_sites_manage_add_page', 'wp-admin-bar-edit-post' : 'my_sites_manage_blog_posts', 'wp-admin-bar-new-post-badge' : 'my_sites_manage_add_post', 'wp-admin-bar-edit-attachment' : 'my_sites_manage_media', 'wp-admin-bar-new-attachment-badge' : 'my_sites_manage_add_media', 'wp-admin-bar-comments' : 'my_sites_manage_comments', 'wp-admin-bar-edit-jetpack-testimonial' : 'my_sites_manage_testimonials', 'wp-admin-bar-new-jetpack-testimonial' : 'my_sites_manage_add_testimonial', 'wp-admin-bar-edit-jetpack-portfolio' : 'my_sites_manage_portfolio', 'wp-admin-bar-new-jetpack-portfolio' : 'my_sites_manage_add_portfolio', //my sites - personalize 'wp-admin-bar-themes' : 'my_sites_personalize_themes', 'wp-admin-bar-cmz' : 'my_sites_personalize_themes_customize', //my sites - configure 'wp-admin-bar-sharing' : 'my_sites_configure_sharing', 'wp-admin-bar-people' : 'my_sites_configure_people', 'wp-admin-bar-people-add' : 'my_sites_configure_people_add_button', 'wp-admin-bar-plugins' : 'my_sites_configure_plugins', 'wp-admin-bar-domains' : 'my_sites_configure_domains', 'wp-admin-bar-domains-add' : 'my_sites_configure_add_domain', 'wp-admin-bar-blog-settings' : 'my_sites_configure_settings', 'wp-admin-bar-legacy-dashboard' : 'my_sites_configure_wp_admin', //reader 'wp-admin-bar-followed-sites' : 'reader_followed_sites', 'wp-admin-bar-reader-followed-sites-manage': 'reader_manage_followed_sites', 'wp-admin-bar-discover-discover' : 'reader_discover', 'wp-admin-bar-discover-search' : 'reader_search', 'wp-admin-bar-my-activity-my-likes' : 'reader_my_likes', //account 'wp-admin-bar-user-info' : 'my_account_user_name', // account - profile 'wp-admin-bar-my-profile' : 'my_account_profile_my_profile', 'wp-admin-bar-account-settings' : 'my_account_profile_account_settings', 'wp-admin-bar-billing' : 'my_account_profile_manage_purchases', 'wp-admin-bar-security' : 'my_account_profile_security', 'wp-admin-bar-notifications' : 'my_account_profile_notifications', //account - special 'wp-admin-bar-get-apps' : 'my_account_special_get_apps', 'wp-admin-bar-next-steps' : 'my_account_special_next_steps', 'wp-admin-bar-help' : 'my_account_special_help', }; var notesTracksEvents = { openSite: function( data ) { return { clicked: 'masterbar_notifications_panel_site', site_id: data.siteId }; }, openPost: function( data ) { return { clicked: 'masterbar_notifications_panel_post', site_id: data.siteId, post_id: data.postId }; }, openComment: function( data ) { return { clicked: 'masterbar_notifications_panel_comment', site_id: data.siteId, post_id: data.postId, comment_id: data.commentId }; } }; function recordTracksEvent( eventProps ) { eventProps = eventProps || {}; window._tkq = window._tkq || []; window._tkq.push( [ 'recordEvent', eventName, eventProps ] ); } function parseJson( s, defaultValue ) { try { return JSON.parse( s ); } catch ( e ) { return defaultValue; } } $( document ).ready( function() { var trackableLinks = '.mb-trackable .ab-item:not(div),' + '#wp-admin-bar-notes .ab-item,' + '#wp-admin-bar-user-info .ab-item,' + '.mb-trackable .ab-secondary'; $( trackableLinks ).on( 'click touchstart', function( e ) { var $target = $( e.target ), $parent = $target.closest( 'li' ); if ( ! $parent ) { return; } var trackingId = $target.attr( 'ID' ) || $parent.attr( 'ID' ); if ( ! linksTracksEvents.hasOwnProperty( trackingId ) ) { return; } var eventProps = { 'clicked': linksTracksEvents[ trackingId ] }; recordTracksEvent( eventProps ); } ); } ); // listen for postMessage events from the notifications iframe $( window ).on( 'message', function( e ) { var event = ! e.data && e.originalEvent.data ? e.originalEvent : e; if ( event.origin !== 'https://widgets.wp.com' ) { return; } var data = ( 'string' === typeof event.data ) ? parseJson( event.data, {} ) : event.data; if ( 'notesIframeMessage' !== data.type ) { return; } var eventData = notesTracksEvents[ data.action ]; if ( ! eventData ) { return; } recordTracksEvent( eventData( data ) ); } ); } )( jQuery ); ; var wpcom = window.wpcom || {}; wpcom.actionbar = {}; wpcom.actionbar.data = actionbardata; // This might be better in another file, but is here for now (function($){ var fbd = wpcom.actionbar.data, d = document, docHeight = $( d ).height(), b = d.getElementsByTagName( 'body' )[0], lastScrollTop = 0, lastScrollDir, fb, fhtml, fbhtml, fbHtmlLi, followingbtn, followbtn, fbdf, action, slkhtml = '', foldhtml = '', reporthtml = '', customizeIcon, editIcon, statsIcon, themeHtml = '', signupHtml = '', loginHtml = '', viewReaderHtml = '', editSubsHtml = '', editFollowsHtml = '', toggleactionbar, $actionbar; // Don't show actionbar when iframed if ( window != window.top ) { return; } fhtml = '
{{reply_header_text}}
\ \\ \
\ \ \ \