+/**
+ * Theme Browsing
+ *
+ * Controls visibility of theme details on manage and install themes pages.
+ */
+jQuery( function($) {
+ $('#availablethemes').on( 'click', '.theme-detail', function (event) {
+ var theme = $(this).closest('.available-theme'),
+ details = theme.find('.themedetaildiv');
+
+ if ( ! details.length ) {
+ details = theme.find('.install-theme-info .theme-details');
+ details = details.clone().addClass('themedetaildiv').appendTo( theme ).hide();
+ }
+
+ details.toggle();
+ event.preventDefault();
+ });
+});
+
+/**
+ * Theme Install
+ *
+ * Displays theme previews on theme install pages.
+ */
+jQuery( function($) {
+ if( ! window.postMessage )
+ return;
+
+ var preview = $('#theme-installer'),
+ info = preview.find('.install-theme-info'),
+ panel = preview.find('.wp-full-overlay-main'),
+ body = $( document.body );
+
+ preview.on( 'click', '.close-full-overlay', function( event ) {
+ preview.fadeOut( 200, function() {
+ panel.empty();
+ body.removeClass('theme-installer-active full-overlay-active');
+ });
+ event.preventDefault();
+ });
+
+ preview.on( 'click', '.collapse-sidebar', function( event ) {
+ preview.toggleClass( 'collapsed' ).toggleClass( 'expanded' );
+ event.preventDefault();
+ });
+
+ $('#availablethemes').on( 'click', '.install-theme-preview', function( event ) {
+ var src;
+
+ info.html( $(this).closest('.installable-theme').find('.install-theme-info').html() );
+ src = info.find( '.theme-preview-url' ).val();
+ panel.html( '<iframe src="' + src + '" />');
+ preview.fadeIn( 200, function() {
+ body.addClass('theme-installer-active full-overlay-active');
+ });
+ event.preventDefault();
+ });
+});
+
var ThemeViewer;
(function($){
init: init
};
- return api;
+ return api;
}
})(jQuery);
theme_viewer = new ThemeViewer();
theme_viewer.init();
});
+
+
+/**
+ * Class that provides infinite scroll for Themes admin screens
+ *
+ * @since 3.4
+ *
+ * @uses ajaxurl
+ * @uses list_args
+ * @uses theme_list_args
+ * @uses $('#_ajax_fetch_list_nonce').val()
+* */
+var ThemeScroller;
+(function($){
+ ThemeScroller = {
+ querying: false,
+ scrollPollingDelay: 500,
+ failedRetryDelay: 4000,
+ outListBottomThreshold: 300,
+
+ /**
+ * Initializer
+ *
+ * @since 3.4
+ * @access private
+ */
+ init: function() {
+ var self = this;
+
+ // Get out early if we don't have the required arguments.
+ if ( typeof ajaxurl === 'undefined' ||
+ typeof list_args === 'undefined' ||
+ typeof theme_list_args === 'undefined' ) {
+ $('.pagination-links').show();
+ return;
+ }
+
+ // Handle inputs
+ this.nonce = $('#_ajax_fetch_list_nonce').val();
+ this.nextPage = ( theme_list_args.paged + 1 );
+
+ // Cache jQuery selectors
+ this.$outList = $('#availablethemes');
+ this.$spinner = $('div.tablenav.bottom').children( 'img.ajax-loading' );
+ this.$window = $(window);
+ this.$document = $(document);
+
+ /**
+ * If there are more pages to query, then start polling to track
+ * when user hits the bottom of the current page
+ */
+ if ( theme_list_args.total_pages >= this.nextPage )
+ this.pollInterval =
+ setInterval( function() {
+ return self.poll();
+ }, this.scrollPollingDelay );
+ },
+
+ /**
+ * Checks to see if user has scrolled to bottom of page.
+ * If so, requests another page of content from self.ajax().
+ *
+ * @since 3.4
+ * @access private
+ */
+ poll: function() {
+ var bottom = this.$document.scrollTop() + this.$window.innerHeight();
+
+ if ( this.querying ||
+ ( bottom < this.$outList.height() - this.outListBottomThreshold ) )
+ return;
+
+ this.ajax();
+ },
+
+ /**
+ * Applies results passed from this.ajax() to $outList
+ *
+ * @since 3.4
+ * @access private
+ *
+ * @param results Array with results from this.ajax() query.
+ */
+ process: function( results ) {
+ if ( results === undefined ) {
+ clearInterval( this.pollInterval );
+ return;
+ }
+
+ if ( this.nextPage > theme_list_args.total_pages )
+ clearInterval( this.pollInterval );
+
+ if ( this.nextPage <= ( theme_list_args.total_pages + 1 ) )
+ this.$outList.append( results.rows );
+ },
+
+ /**
+ * Queries next page of themes
+ *
+ * @since 3.4
+ * @access private
+ */
+ ajax: function() {
+ var self = this;
+
+ this.querying = true;
+
+ var query = {
+ action: 'fetch-list',
+ paged: this.nextPage,
+ s: theme_list_args.search,
+ tab: theme_list_args.tab,
+ type: theme_list_args.type,
+ _ajax_fetch_list_nonce: this.nonce,
+ 'features[]': theme_list_args.features,
+ 'list_args': list_args
+ };
+
+ this.$spinner.css( 'visibility', 'visible' );
+ $.getJSON( ajaxurl, query )
+ .done( function( response ) {
+ self.nextPage++;
+ self.process( response );
+ self.$spinner.css( 'visibility', 'hidden' );
+ self.querying = false;
+ })
+ .fail( function() {
+ self.$spinner.css( 'visibility', 'hidden' );
+ self.querying = false;
+ setTimeout( function() { self.ajax(); }, self.failedRetryDelay );
+ });
+ }
+ }
+
+ $(document).ready( function($) {
+ ThemeScroller.init();
+ });
+
+})(jQuery);