Scripts To Footer - Version 0.2

Version Description

Updating code to be object-oriented and added page metabox to disable plugin on specific pages.

Download this release

Release Info

Developer joshuadnelson
Plugin Icon wp plugin Scripts To Footer
Version 0.2
Comparing to
See all releases

Code changes from version 0.1 to 0.2

lib/metabox/example-functions.php ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Include and setup custom metaboxes and fields.
4
+ *
5
+ * @category YourThemeOrPlugin
6
+ * @package Metaboxes
7
+ * @license http://www.opensource.org/licenses/gpl-license.php GPL v2.0 (or later)
8
+ * @link https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress
9
+ */
10
+
11
+ add_filter( 'cmb_meta_boxes', 'cmb_sample_metaboxes' );
12
+ /**
13
+ * Define the metabox and field configurations.
14
+ *
15
+ * @param array $meta_boxes
16
+ * @return array
17
+ */
18
+ function cmb_sample_metaboxes( array $meta_boxes ) {
19
+
20
+ // Start with an underscore to hide fields from custom fields list
21
+ $prefix = '_cmb_';
22
+
23
+ $meta_boxes[] = array(
24
+ 'id' => 'test_metabox',
25
+ 'title' => 'Test Metabox',
26
+ 'pages' => array( 'page', ), // Post type
27
+ 'context' => 'normal',
28
+ 'priority' => 'high',
29
+ 'show_names' => true, // Show field names on the left
30
+ 'fields' => array(
31
+ array(
32
+ 'name' => 'Test Text',
33
+ 'desc' => 'field description (optional)',
34
+ 'id' => $prefix . 'test_text',
35
+ 'type' => 'text',
36
+ ),
37
+ array(
38
+ 'name' => 'Test Text Small',
39
+ 'desc' => 'field description (optional)',
40
+ 'id' => $prefix . 'test_textsmall',
41
+ 'type' => 'text_small',
42
+ ),
43
+ array(
44
+ 'name' => 'Test Text Medium',
45
+ 'desc' => 'field description (optional)',
46
+ 'id' => $prefix . 'test_textmedium',
47
+ 'type' => 'text_medium',
48
+ ),
49
+ array(
50
+ 'name' => 'Test Date Picker',
51
+ 'desc' => 'field description (optional)',
52
+ 'id' => $prefix . 'test_textdate',
53
+ 'type' => 'text_date',
54
+ ),
55
+ array(
56
+ 'name' => 'Test Date Picker (UNIX timestamp)',
57
+ 'desc' => 'field description (optional)',
58
+ 'id' => $prefix . 'test_textdate_timestamp',
59
+ 'type' => 'text_date_timestamp',
60
+ ),
61
+ array(
62
+ 'name' => 'Test Date/Time Picker Combo (UNIX timestamp)',
63
+ 'desc' => 'field description (optional)',
64
+ 'id' => $prefix . 'test_datetime_timestamp',
65
+ 'type' => 'text_datetime_timestamp',
66
+ ),
67
+ array(
68
+ 'name' => 'Test Time',
69
+ 'desc' => 'field description (optional)',
70
+ 'id' => $prefix . 'test_time',
71
+ 'type' => 'text_time',
72
+ ),
73
+ array(
74
+ 'name' => 'Test Money',
75
+ 'desc' => 'field description (optional)',
76
+ 'id' => $prefix . 'test_textmoney',
77
+ 'type' => 'text_money',
78
+ ),
79
+ array(
80
+ 'name' => 'Test Color Picker',
81
+ 'desc' => 'field description (optional)',
82
+ 'id' => $prefix . 'test_colorpicker',
83
+ 'type' => 'colorpicker',
84
+ 'std' => '#ffffff'
85
+ ),
86
+ array(
87
+ 'name' => 'Test Text Area',
88
+ 'desc' => 'field description (optional)',
89
+ 'id' => $prefix . 'test_textarea',
90
+ 'type' => 'textarea',
91
+ ),
92
+ array(
93
+ 'name' => 'Test Text Area Small',
94
+ 'desc' => 'field description (optional)',
95
+ 'id' => $prefix . 'test_textareasmall',
96
+ 'type' => 'textarea_small',
97
+ ),
98
+ array(
99
+ 'name' => 'Test Text Area Code',
100
+ 'desc' => 'field description (optional)',
101
+ 'id' => $prefix . 'test_textarea_code',
102
+ 'type' => 'textarea_code',
103
+ ),
104
+ array(
105
+ 'name' => 'Test Title Weeeee',
106
+ 'desc' => 'This is a title description',
107
+ 'id' => $prefix . 'test_title',
108
+ 'type' => 'title',
109
+ ),
110
+ array(
111
+ 'name' => 'Test Select',
112
+ 'desc' => 'field description (optional)',
113
+ 'id' => $prefix . 'test_select',
114
+ 'type' => 'select',
115
+ 'options' => array(
116
+ array( 'name' => 'Option One', 'value' => 'standard', ),
117
+ array( 'name' => 'Option Two', 'value' => 'custom', ),
118
+ array( 'name' => 'Option Three', 'value' => 'none', ),
119
+ ),
120
+ ),
121
+ array(
122
+ 'name' => 'Test Radio inline',
123
+ 'desc' => 'field description (optional)',
124
+ 'id' => $prefix . 'test_radio_inline',
125
+ 'type' => 'radio_inline',
126
+ 'options' => array(
127
+ array( 'name' => 'Option One', 'value' => 'standard', ),
128
+ array( 'name' => 'Option Two', 'value' => 'custom', ),
129
+ array( 'name' => 'Option Three', 'value' => 'none', ),
130
+ ),
131
+ ),
132
+ array(
133
+ 'name' => 'Test Radio',
134
+ 'desc' => 'field description (optional)',
135
+ 'id' => $prefix . 'test_radio',
136
+ 'type' => 'radio',
137
+ 'options' => array(
138
+ array( 'name' => 'Option One', 'value' => 'standard', ),
139
+ array( 'name' => 'Option Two', 'value' => 'custom', ),
140
+ array( 'name' => 'Option Three', 'value' => 'none', ),
141
+ ),
142
+ ),
143
+ array(
144
+ 'name' => 'Test Taxonomy Radio',
145
+ 'desc' => 'Description Goes Here',
146
+ 'id' => $prefix . 'text_taxonomy_radio',
147
+ 'type' => 'taxonomy_radio',
148
+ 'taxonomy' => '', // Taxonomy Slug
149
+ ),
150
+ array(
151
+ 'name' => 'Test Taxonomy Select',
152
+ 'desc' => 'Description Goes Here',
153
+ 'id' => $prefix . 'text_taxonomy_select',
154
+ 'type' => 'taxonomy_select',
155
+ 'taxonomy' => '', // Taxonomy Slug
156
+ ),
157
+ array(
158
+ 'name' => 'Test Checkbox',
159
+ 'desc' => 'field description (optional)',
160
+ 'id' => $prefix . 'test_checkbox',
161
+ 'type' => 'checkbox',
162
+ ),
163
+ array(
164
+ 'name' => 'Test Multi Checkbox',
165
+ 'desc' => 'field description (optional)',
166
+ 'id' => $prefix . 'test_multicheckbox',
167
+ 'type' => 'multicheck',
168
+ 'options' => array(
169
+ 'check1' => 'Check One',
170
+ 'check2' => 'Check Two',
171
+ 'check3' => 'Check Three',
172
+ ),
173
+ ),
174
+ array(
175
+ 'name' => 'Test wysiwyg',
176
+ 'desc' => 'field description (optional)',
177
+ 'id' => $prefix . 'test_wysiwyg',
178
+ 'type' => 'wysiwyg',
179
+ 'options' => array( 'textarea_rows' => 5, ),
180
+ ),
181
+ array(
182
+ 'name' => 'Test Image',
183
+ 'desc' => 'Upload an image or enter an URL.',
184
+ 'id' => $prefix . 'test_image',
185
+ 'type' => 'file',
186
+ ),
187
+ ),
188
+ );
189
+
190
+ $meta_boxes[] = array(
191
+ 'id' => 'about_page_metabox',
192
+ 'title' => 'About Page Metabox',
193
+ 'pages' => array( 'page', ), // Post type
194
+ 'context' => 'normal',
195
+ 'priority' => 'high',
196
+ 'show_names' => true, // Show field names on the left
197
+ 'show_on' => array( 'key' => 'id', 'value' => array( 2, ), ), // Specific post IDs to display this metabox
198
+ 'fields' => array(
199
+ array(
200
+ 'name' => 'Test Text',
201
+ 'desc' => 'field description (optional)',
202
+ 'id' => $prefix . 'test_text',
203
+ 'type' => 'text',
204
+ ),
205
+ )
206
+ );
207
+
208
+ // Add other metaboxes as needed
209
+
210
+ return $meta_boxes;
211
+ }
212
+
213
+ add_action( 'init', 'cmb_initialize_cmb_meta_boxes', 9999 );
214
+ /**
215
+ * Initialize the metabox class.
216
+ */
217
+ function cmb_initialize_cmb_meta_boxes() {
218
+
219
+ if ( ! class_exists( 'cmb_Meta_Box' ) )
220
+ require_once 'init.php';
221
+
222
+ }
lib/metabox/images/ico-delete.png ADDED
Binary file
lib/metabox/images/ui-bg_flat_0_aaaaaa_40x100.png ADDED
Binary file
lib/metabox/images/ui-bg_flat_75_ffffff_40x100.png ADDED
Binary file
lib/metabox/images/ui-bg_glass_55_fbf9ee_1x400.png ADDED
Binary file
lib/metabox/images/ui-bg_glass_65_ffffff_1x400.png ADDED
Binary file
lib/metabox/images/ui-bg_glass_75_dadada_1x400.png ADDED
Binary file
lib/metabox/images/ui-bg_glass_75_e6e6e6_1x400.png ADDED
Binary file
lib/metabox/images/ui-bg_glass_95_fef1ec_1x400.png ADDED
Binary file
lib/metabox/images/ui-bg_highlight-soft_75_cccccc_1x100.png ADDED
Binary file
lib/metabox/images/ui-icons_222222_256x240.png ADDED
Binary file
lib/metabox/images/ui-icons_2e83ff_256x240.png ADDED
Binary file
lib/metabox/images/ui-icons_454545_256x240.png ADDED
Binary file
lib/metabox/images/ui-icons_888888_256x240.png ADDED
Binary file
lib/metabox/images/ui-icons_cd0a0a_256x240.png ADDED
Binary file
lib/metabox/init.php ADDED
@@ -0,0 +1,569 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Script Name: Custom Metaboxes and Fields
4
+ Contributors: Andrew Norcross (@norcross / andrewnorcross.com)
5
+ Jared Atchison (@jaredatch / jaredatchison.com)
6
+ Bill Erickson (@billerickson / billerickson.net)
7
+ Description: This will create metaboxes with custom fields that will blow your mind.
8
+ Version: 0.9
9
+ */
10
+
11
+ /**
12
+ * Released under the GPL license
13
+ * http://www.opensource.org/licenses/gpl-license.php
14
+ *
15
+ * This is an add-on for WordPress
16
+ * http://wordpress.org/
17
+ *
18
+ * **********************************************************************
19
+ * This program is free software; you can redistribute it and/or modify
20
+ * it under the terms of the GNU General Public License as published by
21
+ * the Free Software Foundation; either version 2 of the License, or
22
+ * (at your option) any later version.
23
+ *
24
+ * This program is distributed in the hope that it will be useful,
25
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27
+ * GNU General Public License for more details.
28
+ * **********************************************************************
29
+ */
30
+
31
+ /************************************************************************
32
+ You should not edit the code below or things might explode!
33
+ *************************************************************************/
34
+
35
+ $meta_boxes = array();
36
+ $meta_boxes = apply_filters ( 'cmb_meta_boxes' , $meta_boxes );
37
+ foreach ( $meta_boxes as $meta_box ) {
38
+ $my_box = new cmb_Meta_Box( $meta_box );
39
+ }
40
+
41
+ /**
42
+ * Validate value of meta fields
43
+ * Define ALL validation methods inside this class and use the names of these
44
+ * methods in the definition of meta boxes (key 'validate_func' of each field)
45
+ */
46
+ class cmb_Meta_Box_Validate {
47
+ function check_text( $text ) {
48
+ if ($text != 'hello') {
49
+ return false;
50
+ }
51
+ return true;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Defines the url to which is used to load local resources.
57
+ * This may need to be filtered for local Window installations.
58
+ * If resources do not load, please check the wiki for details.
59
+ */
60
+ define( 'CMB_META_BOX_URL', apply_filters( 'cmb_meta_box_url', trailingslashit( str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, dirname( __FILE__ ) ) ) ) );
61
+
62
+ /**
63
+ * Create meta boxes
64
+ */
65
+ class cmb_Meta_Box {
66
+ protected $_meta_box;
67
+
68
+ function __construct( $meta_box ) {
69
+ if ( !is_admin() ) return;
70
+
71
+ $this->_meta_box = $meta_box;
72
+
73
+ $upload = false;
74
+ foreach ( $meta_box['fields'] as $field ) {
75
+ if ( $field['type'] == 'file' || $field['type'] == 'file_list' ) {
76
+ $upload = true;
77
+ break;
78
+ }
79
+ }
80
+
81
+ global $pagenow;
82
+ if ( $upload && in_array( $pagenow, array( 'page.php', 'page-new.php', 'post.php', 'post-new.php' ) ) ) {
83
+ add_action( 'admin_head', array( &$this, 'add_post_enctype' ) );
84
+ }
85
+
86
+ add_action( 'admin_menu', array( &$this, 'add' ) );
87
+ add_action( 'save_post', array( &$this, 'save' ) );
88
+
89
+ add_filter( 'cmb_show_on', array( &$this, 'add_for_id' ), 10, 2 );
90
+ add_filter( 'cmb_show_on', array( &$this, 'add_for_page_template' ), 10, 2 );
91
+ }
92
+
93
+ function add_post_enctype() {
94
+ echo '
95
+ <script type="text/javascript">
96
+ jQuery(document).ready(function(){
97
+ jQuery("#post").attr("enctype", "multipart/form-data");
98
+ jQuery("#post").attr("encoding", "multipart/form-data");
99
+ });
100
+ </script>';
101
+ }
102
+
103
+ // Add metaboxes
104
+ function add() {
105
+ $this->_meta_box['context'] = empty($this->_meta_box['context']) ? 'normal' : $this->_meta_box['context'];
106
+ $this->_meta_box['priority'] = empty($this->_meta_box['priority']) ? 'high' : $this->_meta_box['priority'];
107
+ $this->_meta_box['show_on'] = empty( $this->_meta_box['show_on'] ) ? array('key' => false, 'value' => false) : $this->_meta_box['show_on'];
108
+
109
+ foreach ( $this->_meta_box['pages'] as $page ) {
110
+ if( apply_filters( 'cmb_show_on', true, $this->_meta_box ) )
111
+ add_meta_box( $this->_meta_box['id'], $this->_meta_box['title'], array(&$this, 'show'), $page, $this->_meta_box['context'], $this->_meta_box['priority']) ;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Show On Filters
117
+ * Use the 'cmb_show_on' filter to further refine the conditions under which a metabox is displayed.
118
+ * Below you can limit it by ID and page template
119
+ */
120
+
121
+ // Add for ID
122
+ function add_for_id( $display, $meta_box ) {
123
+ if ( 'id' !== $meta_box['show_on']['key'] )
124
+ return $display;
125
+
126
+ // If we're showing it based on ID, get the current ID
127
+ if( isset( $_GET['post'] ) ) $post_id = $_GET['post'];
128
+ elseif( isset( $_POST['post_ID'] ) ) $post_id = $_POST['post_ID'];
129
+ if( !isset( $post_id ) )
130
+ return false;
131
+
132
+ // If value isn't an array, turn it into one
133
+ $meta_box['show_on']['value'] = !is_array( $meta_box['show_on']['value'] ) ? array( $meta_box['show_on']['value'] ) : $meta_box['show_on']['value'];
134
+
135
+ // If current page id is in the included array, display the metabox
136
+
137
+ if ( in_array( $post_id, $meta_box['show_on']['value'] ) )
138
+ return true;
139
+ else
140
+ return false;
141
+ }
142
+
143
+ // Add for Page Template
144
+ function add_for_page_template( $display, $meta_box ) {
145
+ if( 'page-template' !== $meta_box['show_on']['key'] )
146
+ return $display;
147
+
148
+ // Get the current ID
149
+ if( isset( $_GET['post'] ) ) $post_id = $_GET['post'];
150
+ elseif( isset( $_POST['post_ID'] ) ) $post_id = $_POST['post_ID'];
151
+ if( !( isset( $post_id ) || is_page() ) ) return false;
152
+
153
+ // Get current template
154
+ $current_template = get_post_meta( $post_id, '_wp_page_template', true );
155
+
156
+ // If value isn't an array, turn it into one
157
+ $meta_box['show_on']['value'] = !is_array( $meta_box['show_on']['value'] ) ? array( $meta_box['show_on']['value'] ) : $meta_box['show_on']['value'];
158
+
159
+ // See if there's a match
160
+ if( in_array( $current_template, $meta_box['show_on']['value'] ) )
161
+ return true;
162
+ else
163
+ return false;
164
+ }
165
+
166
+ // Show fields
167
+ function show() {
168
+
169
+ global $post;
170
+
171
+ // Use nonce for verification
172
+ echo '<input type="hidden" name="wp_meta_box_nonce" value="', wp_create_nonce( basename(__FILE__) ), '" />';
173
+ echo '<table class="form-table cmb_metabox">';
174
+
175
+ foreach ( $this->_meta_box['fields'] as $field ) {
176
+ // Set up blank or default values for empty ones
177
+ if ( !isset( $field['name'] ) ) $field['name'] = '';
178
+ if ( !isset( $field['desc'] ) ) $field['desc'] = '';
179
+ if ( !isset( $field['std'] ) ) $field['std'] = '';
180
+ if ( 'file' == $field['type'] && !isset( $field['allow'] ) ) $field['allow'] = array( 'url', 'attachment' );
181
+ if ( 'file' == $field['type'] && !isset( $field['save_id'] ) ) $field['save_id'] = false;
182
+ if ( 'multicheck' == $field['type'] ) $field['multiple'] = true;
183
+
184
+ $meta = get_post_meta( $post->ID, $field['id'], 'multicheck' != $field['type'] /* If multicheck this can be multiple values */ );
185
+
186
+ echo '<tr>';
187
+
188
+ if ( $field['type'] == "title" ) {
189
+ echo '<td colspan="2">';
190
+ } else {
191
+ if( $this->_meta_box['show_names'] == true ) {
192
+ echo '<th style="width:18%"><label for="', $field['id'], '">', $field['name'], '</label></th>';
193
+ }
194
+ echo '<td>';
195
+ }
196
+
197
+ switch ( $field['type'] ) {
198
+
199
+ case 'text':
200
+ echo '<input type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" />','<p class="cmb_metabox_description">', $field['desc'], '</p>';
201
+ break;
202
+ case 'text_small':
203
+ echo '<input class="cmb_text_small" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
204
+ break;
205
+ case 'text_medium':
206
+ echo '<input class="cmb_text_medium" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
207
+ break;
208
+ case 'text_date':
209
+ echo '<input class="cmb_text_small cmb_datepicker" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
210
+ break;
211
+ case 'text_date_timestamp':
212
+ echo '<input class="cmb_text_small cmb_datepicker" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? date( 'm\/d\/Y', $meta ) : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
213
+ break;
214
+
215
+ case 'text_datetime_timestamp':
216
+ echo '<input class="cmb_text_small cmb_datepicker" type="text" name="', $field['id'], '[date]" id="', $field['id'], '_date" value="', '' !== $meta ? date( 'm\/d\/Y', $meta ) : $field['std'], '" />';
217
+ echo '<input class="cmb_timepicker text_time" type="text" name="', $field['id'], '[time]" id="', $field['id'], '_time" value="', '' !== $meta ? date( 'h:i A', $meta ) : $field['std'], '" /><span class="cmb_metabox_description" >', $field['desc'], '</span>';
218
+ break;
219
+ case 'text_time':
220
+ echo '<input class="cmb_timepicker text_time" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
221
+ break;
222
+ case 'text_money':
223
+ echo '$ <input class="cmb_text_money" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', '' !== $meta ? $meta : $field['std'], '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
224
+ break;
225
+ case 'colorpicker':
226
+ $meta = '' !== $meta ? $meta : $field['std'];
227
+ $hex_color = '(([a-fA-F0-9]){3}){1,2}$';
228
+ if ( preg_match( '/^' . $hex_color . '/i', $meta ) ) // Value is just 123abc, so prepend #.
229
+ $meta = '#' . $meta;
230
+ elseif ( ! preg_match( '/^#' . $hex_color . '/i', $meta ) ) // Value doesn't match #123abc, so sanitize to just #.
231
+ $meta = "#";
232
+ echo '<input class="cmb_colorpicker cmb_text_small" type="text" name="', $field['id'], '" id="', $field['id'], '" value="', $meta, '" /><span class="cmb_metabox_description">', $field['desc'], '</span>';
233
+ break;
234
+ case 'textarea':
235
+ echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="10">', '' !== $meta ? $meta : $field['std'], '</textarea>','<p class="cmb_metabox_description">', $field['desc'], '</p>';
236
+ break;
237
+ case 'textarea_small':
238
+ echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="4">', '' !== $meta ? $meta : $field['std'], '</textarea>','<p class="cmb_metabox_description">', $field['desc'], '</p>';
239
+ break;
240
+ case 'textarea_code':
241
+ echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="10" class="cmb_textarea_code">', '' !== $meta ? $meta : $field['std'], '</textarea>','<p class="cmb_metabox_description">', $field['desc'], '</p>';
242
+ break;
243
+ case 'select':
244
+ if( empty( $meta ) && !empty( $field['std'] ) ) $meta = $field['std'];
245
+ echo '<select name="', $field['id'], '" id="', $field['id'], '">';
246
+ foreach ($field['options'] as $option) {
247
+ echo '<option value="', $option['value'], '"', $meta == $option['value'] ? ' selected="selected"' : '', '>', $option['name'], '</option>';
248
+ }
249
+ echo '</select>';
250
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
251
+ break;
252
+ case 'radio_inline':
253
+ if( empty( $meta ) && !empty( $field['std'] ) ) $meta = $field['std'];
254
+ echo '<div class="cmb_radio_inline">';
255
+ $i = 1;
256
+ foreach ($field['options'] as $option) {
257
+ echo '<div class="cmb_radio_inline_option"><input type="radio" name="', $field['id'], '" id="', $field['id'], $i, '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' /><label for="', $field['id'], $i, '">', $option['name'], '</label></div>';
258
+ $i++;
259
+ }
260
+ echo '</div>';
261
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
262
+ break;
263
+ case 'radio':
264
+ if( empty( $meta ) && !empty( $field['std'] ) ) $meta = $field['std'];
265
+ echo '<ul>';
266
+ $i = 1;
267
+ foreach ($field['options'] as $option) {
268
+ echo '<li><input type="radio" name="', $field['id'], '" id="', $field['id'], $i,'" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' /><label for="', $field['id'], $i, '">', $option['name'].'</label></li>';
269
+ $i++;
270
+ }
271
+ echo '</ul>';
272
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
273
+ break;
274
+ case 'checkbox':
275
+ echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />';
276
+ echo '<span class="cmb_metabox_description">', $field['desc'], '</span>';
277
+ break;
278
+ case 'multicheck':
279
+ echo '<ul>';
280
+ $i = 1;
281
+ foreach ( $field['options'] as $value => $name ) {
282
+ // Append `[]` to the name to get multiple values
283
+ // Use in_array() to check whether the current option should be checked
284
+ echo '<li><input type="checkbox" name="', $field['id'], '[]" id="', $field['id'], $i, '" value="', $value, '"', in_array( $value, $meta ) ? ' checked="checked"' : '', ' /><label for="', $field['id'], $i, '">', $name, '</label></li>';
285
+ $i++;
286
+ }
287
+ echo '</ul>';
288
+ echo '<span class="cmb_metabox_description">', $field['desc'], '</span>';
289
+ break;
290
+ case 'title':
291
+ echo '<h5 class="cmb_metabox_title">', $field['name'], '</h5>';
292
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
293
+ break;
294
+ case 'wysiwyg':
295
+ wp_editor( $meta ? $meta : $field['std'], $field['id'], isset( $field['options'] ) ? $field['options'] : array() );
296
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
297
+ break;
298
+ case 'taxonomy_select':
299
+ echo '<select name="', $field['id'], '" id="', $field['id'], '">';
300
+ $names= wp_get_object_terms( $post->ID, $field['taxonomy'] );
301
+ $terms = get_terms( $field['taxonomy'], 'hide_empty=0' );
302
+ foreach ( $terms as $term ) {
303
+ if (!is_wp_error( $names ) && !empty( $names ) && !strcmp( $term->slug, $names[0]->slug ) ) {
304
+ echo '<option value="' . $term->slug . '" selected>' . $term->name . '</option>';
305
+ } else {
306
+ echo '<option value="' . $term->slug . ' ' , $meta == $term->slug ? $meta : ' ' ,' ">' . $term->name . '</option>';
307
+ }
308
+ }
309
+ echo '</select>';
310
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
311
+ break;
312
+ case 'taxonomy_radio':
313
+ $names= wp_get_object_terms( $post->ID, $field['taxonomy'] );
314
+ $terms = get_terms( $field['taxonomy'], 'hide_empty=0' );
315
+ echo '<ul>';
316
+ foreach ( $terms as $term ) {
317
+ if ( !is_wp_error( $names ) && !empty( $names ) && !strcmp( $term->slug, $names[0]->slug ) ) {
318
+ echo '<li><input type="radio" name="', $field['id'], '" value="'. $term->slug . '" checked>' . $term->name . '</li>';
319
+ } else {
320
+ echo '<li><input type="radio" name="', $field['id'], '" value="' . $term->slug . ' ' , $meta == $term->slug ? $meta : ' ' ,' ">' . $term->name .'</li>';
321
+ }
322
+ }
323
+ echo '</ul>';
324
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
325
+ break;
326
+ case 'taxonomy_multicheck':
327
+ echo '<ul>';
328
+ $names = wp_get_object_terms( $post->ID, $field['taxonomy'] );
329
+ $terms = get_terms( $field['taxonomy'], 'hide_empty=0' );
330
+ foreach ($terms as $term) {
331
+ echo '<li><input type="checkbox" name="', $field['id'], '[]" id="', $field['id'], '" value="', $term->name , '"';
332
+ foreach ($names as $name) {
333
+ if ( $term->slug == $name->slug ){ echo ' checked="checked" ';};
334
+ }
335
+ echo' /><label>', $term->name , '</label></li>';
336
+ }
337
+ break;
338
+ case 'file_list':
339
+ echo '<input class="cmb_upload_file" type="text" size="36" name="', $field['id'], '" value="" />';
340
+ echo '<input class="cmb_upload_button button" type="button" value="Upload File" />';
341
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
342
+ $args = array(
343
+ 'post_type' => 'attachment',
344
+ 'numberposts' => null,
345
+ 'post_status' => null,
346
+ 'post_parent' => $post->ID
347
+ );
348
+ $attachments = get_posts($args);
349
+ if ($attachments) {
350
+ echo '<ul class="attach_list">';
351
+ foreach ($attachments as $attachment) {
352
+ echo '<li>'.wp_get_attachment_link($attachment->ID, 'thumbnail', 0, 0, 'Download');
353
+ echo '<span>';
354
+ echo apply_filters('the_title', '&nbsp;'.$attachment->post_title);
355
+ echo '</span></li>';
356
+ }
357
+ echo '</ul>';
358
+ }
359
+ break;
360
+ case 'file':
361
+ $input_type_url = "hidden";
362
+ if ( 'url' == $field['allow'] || ( is_array( $field['allow'] ) && in_array( 'url', $field['allow'] ) ) )
363
+ $input_type_url="text";
364
+ echo '<input class="cmb_upload_file" type="' . $input_type_url . '" size="45" id="', $field['id'], '" name="', $field['id'], '" value="', $meta, '" />';
365
+ echo '<input class="cmb_upload_button button" type="button" value="Upload File" />';
366
+ echo '<input class="cmb_upload_file_id" type="hidden" id="', $field['id'], '_id" name="', $field['id'], '_id" value="', get_post_meta( $post->ID, $field['id'] . "_id",true), '" />';
367
+ echo '<p class="cmb_metabox_description">', $field['desc'], '</p>';
368
+ echo '<div id="', $field['id'], '_status" class="cmb_upload_status">';
369
+ if ( $meta != '' ) {
370
+ $check_image = preg_match( '/(^.*\.jpg|jpeg|png|gif|ico*)/i', $meta );
371
+ if ( $check_image ) {
372
+ echo '<div class="img_status">';
373
+ echo '<img src="', $meta, '" alt="" />';
374
+ echo '<a href="#" class="cmb_remove_file_button" rel="', $field['id'], '">Remove Image</a>';
375
+ echo '</div>';
376
+ } else {
377
+ $parts = explode( '/', $meta );
378
+ for( $i = 0; $i < count( $parts ); ++$i ) {
379
+ $title = $parts[$i];
380
+ }
381
+ echo 'File: <strong>', $title, '</strong>&nbsp;&nbsp;&nbsp; (<a href="', $meta, '" target="_blank" rel="external">Download</a> / <a href="#" class="cmb_remove_file_button" rel="', $field['id'], '">Remove</a>)';
382
+ }
383
+ }
384
+ echo '</div>';
385
+ break;
386
+ default:
387
+ do_action('cmb_render_' . $field['type'] , $field, $meta);
388
+ }
389
+
390
+ echo '</td>','</tr>';
391
+ }
392
+ echo '</table>';
393
+ }
394
+
395
+ // Save data from metabox
396
+ function save( $post_id) {
397
+
398
+ // verify nonce
399
+ if ( ! isset( $_POST['wp_meta_box_nonce'] ) || !wp_verify_nonce( $_POST['wp_meta_box_nonce'], basename(__FILE__) ) ) {
400
+ return $post_id;
401
+ }
402
+
403
+ // check autosave
404
+ if ( defined('DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
405
+ return $post_id;
406
+ }
407
+
408
+ // check permissions
409
+ if ( 'page' == $_POST['post_type'] ) {
410
+ if ( !current_user_can( 'edit_page', $post_id ) ) {
411
+ return $post_id;
412
+ }
413
+ } elseif ( !current_user_can( 'edit_post', $post_id ) ) {
414
+ return $post_id;
415
+ }
416
+
417
+ foreach ( $this->_meta_box['fields'] as $field ) {
418
+ $name = $field['id'];
419
+
420
+ if ( ! isset( $field['multiple'] ) )
421
+ $field['multiple'] = ( 'multicheck' == $field['type'] ) ? true : false;
422
+
423
+ $old = get_post_meta( $post_id, $name, !$field['multiple'] /* If multicheck this can be multiple values */ );
424
+ $new = isset( $_POST[$field['id']] ) ? $_POST[$field['id']] : null;
425
+
426
+ if ( in_array( $field['type'], array( 'taxonomy_select', 'taxonomy_radio', 'taxonomy_multicheck' ) ) ) {
427
+ $new = wp_set_object_terms( $post_id, $new, $field['taxonomy'] );
428
+ }
429
+
430
+ if ( ($field['type'] == 'textarea') || ($field['type'] == 'textarea_small') ) {
431
+ $new = htmlspecialchars( $new );
432
+ }
433
+
434
+ if ( ($field['type'] == 'textarea_code') ) {
435
+ $new = htmlspecialchars_decode( $new );
436
+ }
437
+
438
+ if ( $field['type'] == 'text_date_timestamp' ) {
439
+ $new = strtotime( $new );
440
+ }
441
+
442
+ if ( $field['type'] == 'text_datetime_timestamp' ) {
443
+ $string = $new['date'] . ' ' . $new['time'];
444
+ $new = strtotime( $string );
445
+ }
446
+
447
+ $new = apply_filters('cmb_validate_' . $field['type'], $new, $post_id, $field);
448
+
449
+ // validate meta value
450
+ if ( isset( $field['validate_func']) ) {
451
+ $ok = call_user_func( array( 'cmb_Meta_Box_Validate', $field['validate_func']), $new );
452
+ if ( $ok === false ) { // pass away when meta value is invalid
453
+ continue;
454
+ }
455
+ } elseif ( $field['multiple'] ) {
456
+ delete_post_meta( $post_id, $name );
457
+ if ( !empty( $new ) ) {
458
+ foreach ( $new as $add_new ) {
459
+ add_post_meta( $post_id, $name, $add_new, false );
460
+ }
461
+ }
462
+ } elseif ( '' !== $new && $new != $old ) {
463
+ update_post_meta( $post_id, $name, $new );
464
+ } elseif ( '' == $new ) {
465
+ delete_post_meta( $post_id, $name );
466
+ }
467
+
468
+ if ( 'file' == $field['type'] ) {
469
+ $name = $field['id'] . "_id";
470
+ $old = get_post_meta( $post_id, $name, !$field['multiple'] /* If multicheck this can be multiple values */ );
471
+ if ( isset( $field['save_id'] ) && $field['save_id'] ) {
472
+ $new = isset( $_POST[$name] ) ? $_POST[$name] : null;
473
+ } else {
474
+ $new = "";
475
+ }
476
+
477
+ if ( $new && $new != $old ) {
478
+ update_post_meta( $post_id, $name, $new );
479
+ } elseif ( '' == $new && $old ) {
480
+ delete_post_meta( $post_id, $name, $old );
481
+ }
482
+ }
483
+ }
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Adding scripts and styles
489
+ */
490
+ function cmb_scripts( $hook ) {
491
+ if ( $hook == 'post.php' || $hook == 'post-new.php' || $hook == 'page-new.php' || $hook == 'page.php' ) {
492
+ wp_register_script( 'cmb-timepicker', CMB_META_BOX_URL . 'js/jquery.timePicker.min.js' );
493
+ wp_register_script( 'cmb-scripts', CMB_META_BOX_URL . 'js/cmb.js', array( 'jquery', 'jquery-ui-core', 'jquery-ui-datepicker', 'media-upload', 'thickbox', 'farbtastic' ) );
494
+ wp_enqueue_script( 'cmb-timepicker' );
495
+ wp_enqueue_script( 'cmb-scripts' );
496
+ wp_register_style( 'cmb-styles', CMB_META_BOX_URL . 'style.css', array( 'thickbox', 'farbtastic' ) );
497
+ wp_enqueue_style( 'cmb-styles' );
498
+ }
499
+ }
500
+ add_action( 'admin_enqueue_scripts', 'cmb_scripts', 10 );
501
+
502
+ function cmb_editor_footer_scripts() { ?>
503
+ <?php
504
+ if ( isset( $_GET['cmb_force_send'] ) && 'true' == $_GET['cmb_force_send'] ) {
505
+ $label = $_GET['cmb_send_label'];
506
+ if ( empty( $label ) ) $label="Select File";
507
+ ?>
508
+ <script type="text/javascript">
509
+ jQuery(function($) {
510
+ $('td.savesend input').val('<?php echo $label; ?>');
511
+ });
512
+ </script>
513
+ <?php
514
+ }
515
+ }
516
+ add_action( 'admin_print_footer_scripts', 'cmb_editor_footer_scripts', 99 );
517
+
518
+ // Force 'Insert into Post' button from Media Library
519
+ add_filter( 'get_media_item_args', 'cmb_force_send' );
520
+ function cmb_force_send( $args ) {
521
+
522
+ // if the Gallery tab is opened from a custom meta box field, add Insert Into Post button
523
+ if ( isset( $_GET['cmb_force_send'] ) && 'true' == $_GET['cmb_force_send'] )
524
+ $args['send'] = true;
525
+
526
+ // if the From Computer tab is opened AT ALL, add Insert Into Post button after an image is uploaded
527
+ if ( isset( $_POST['attachment_id'] ) && '' != $_POST["attachment_id"] ) {
528
+
529
+ $args['send'] = true;
530
+
531
+ // TO DO: Are there any conditions in which we don't want the Insert Into Post
532
+ // button added? For example, if a post type supports thumbnails, does not support
533
+ // the editor, and does not have any cmb file inputs? If so, here's the first
534
+ // bits of code needed to check all that.
535
+ // $attachment_ancestors = get_post_ancestors( $_POST["attachment_id"] );
536
+ // $attachment_parent_post_type = get_post_type( $attachment_ancestors[0] );
537
+ // $post_type_object = get_post_type_object( $attachment_parent_post_type );
538
+ }
539
+
540
+ // change the label of the button on the From Computer tab
541
+ if ( isset( $_POST['attachment_id'] ) && '' != $_POST["attachment_id"] ) {
542
+
543
+ echo '
544
+ <script type="text/javascript">
545
+ function cmbGetParameterByNameInline(name) {
546
+ name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
547
+ var regexS = "[\\?&]" + name + "=([^&#]*)";
548
+ var regex = new RegExp(regexS);
549
+ var results = regex.exec(window.location.href);
550
+ if(results == null)
551
+ return "";
552
+ else
553
+ return decodeURIComponent(results[1].replace(/\+/g, " "));
554
+ }
555
+
556
+ jQuery(function($) {
557
+ if (cmbGetParameterByNameInline("cmb_force_send")=="true") {
558
+ var cmb_send_label = cmbGetParameterByNameInline("cmb_send_label");
559
+ $("td.savesend input").val(cmb_send_label);
560
+ }
561
+ });
562
+ </script>
563
+ ';
564
+ }
565
+
566
+ return $args;
567
+
568
+ }
569
+ // End. That's it, folks! //
lib/metabox/js/cmb.js ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Controls the behaviours of custom metabox fields.
3
+ *
4
+ * @author Andrew Norcross
5
+ * @author Jared Atchison
6
+ * @author Bill Erickson
7
+ * @see https://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress
8
+ */
9
+
10
+ /*jslint browser: true, devel: true, indent: 4, maxerr: 50, sub: true */
11
+ /*global jQuery, tb_show, tb_remove */
12
+
13
+ /**
14
+ * Custom jQuery for Custom Metaboxes and Fields
15
+ */
16
+ jQuery(document).ready(function ($) {
17
+ 'use strict';
18
+
19
+ var formfield;
20
+
21
+ /**
22
+ * Initialize timepicker (this will be moved inline in a future release)
23
+ */
24
+ $('.cmb_timepicker').each(function () {
25
+ $('#' + jQuery(this).attr('id')).timePicker({
26
+ startTime: "07:00",
27
+ endTime: "22:00",
28
+ show24Hours: false,
29
+ separator: ':',
30
+ step: 30
31
+ });
32
+ });
33
+
34
+ /**
35
+ * Initialize jQuery UI datepicker (this will be moved inline in a future release)
36
+ */
37
+ $('.cmb_datepicker').each(function () {
38
+ $('#' + jQuery(this).attr('id')).datepicker();
39
+ // $('#' + jQuery(this).attr('id')).datepicker({ dateFormat: 'yy-mm-dd' });
40
+ // For more options see http://jqueryui.com/demos/datepicker/#option-dateFormat
41
+ });
42
+ // Wrap date picker in class to narrow the scope of jQuery UI CSS and prevent conflicts
43
+ $("#ui-datepicker-div").wrap('<div class="cmb_element" />');
44
+
45
+ /**
46
+ * Initialize color picker
47
+ */
48
+ $('input:text.cmb_colorpicker').each(function (i) {
49
+ $(this).after('<div id="picker-' + i + '" style="z-index: 1000; background: #EEE; border: 1px solid #CCC; position: absolute; display: block;"></div>');
50
+ $('#picker-' + i).hide().farbtastic($(this));
51
+ })
52
+ .focus(function() {
53
+ $(this).next().show();
54
+ })
55
+ .blur(function() {
56
+ $(this).next().hide();
57
+ });
58
+
59
+ /**
60
+ * File and image upload handling
61
+ */
62
+ $('.cmb_upload_file').change(function () {
63
+ formfield = $(this).attr('name');
64
+ $('#' + formfield + '_id').val("");
65
+ });
66
+
67
+ $('.cmb_upload_button').live('click', function () {
68
+ var buttonLabel;
69
+ formfield = $(this).prev('input').attr('name');
70
+ buttonLabel = 'Use as ' + $('label[for=' + formfield + ']').text();
71
+ tb_show('', 'media-upload.php?post_id=' + $('#post_ID').val() + '&type=file&cmb_force_send=true&cmb_send_label=' + buttonLabel + '&TB_iframe=true');
72
+ return false;
73
+ });
74
+
75
+ $('.cmb_remove_file_button').live('click', function () {
76
+ formfield = $(this).attr('rel');
77
+ $('input#' + formfield).val('');
78
+ $('input#' + formfield + '_id').val('');
79
+ $(this).parent().remove();
80
+ return false;
81
+ });
82
+
83
+ window.original_send_to_editor = window.send_to_editor;
84
+ window.send_to_editor = function (html) {
85
+ var itemurl, itemclass, itemClassBits, itemid, htmlBits, itemtitle,
86
+ image, uploadStatus = true;
87
+
88
+ if (formfield) {
89
+
90
+ if ($(html).html(html).find('img').length > 0) {
91
+ itemurl = $(html).html(html).find('img').attr('src'); // Use the URL to the size selected.
92
+ itemclass = $(html).html(html).find('img').attr('class'); // Extract the ID from the returned class name.
93
+ itemClassBits = itemclass.split(" ");
94
+ itemid = itemClassBits[itemClassBits.length - 1];
95
+ itemid = itemid.replace('wp-image-', '');
96
+ } else {
97
+ // It's not an image. Get the URL to the file instead.
98
+ htmlBits = html.split("'"); // jQuery seems to strip out XHTML when assigning the string to an object. Use alternate method.
99
+ itemurl = htmlBits[1]; // Use the URL to the file.
100
+ itemtitle = htmlBits[2];
101
+ itemtitle = itemtitle.replace('>', '');
102
+ itemtitle = itemtitle.replace('</a>', '');
103
+ itemid = ""; // TO DO: Get ID for non-image attachments.
104
+ }
105
+
106
+ image = /(jpe?g|png|gif|ico)$/gi;
107
+
108
+ if (itemurl.match(image)) {
109
+ uploadStatus = '<div class="img_status"><img src="' + itemurl + '" alt="" /><a href="#" class="cmb_remove_file_button" rel="' + formfield + '">Remove Image</a></div>';
110
+ } else {
111
+ // No output preview if it's not an image
112
+ // Standard generic output if it's not an image.
113
+ html = '<a href="' + itemurl + '" target="_blank" rel="external">View File</a>';
114
+ uploadStatus = '<div class="no_image"><span class="file_link">' + html + '</span>&nbsp;&nbsp;&nbsp;<a href="#" class="cmb_remove_file_button" rel="' + formfield + '">Remove</a></div>';
115
+ }
116
+
117
+ $('#' + formfield).val(itemurl);
118
+ $('#' + formfield + '_id').val(itemid);
119
+ $('#' + formfield).siblings('.cmb_upload_status').slideDown().html(uploadStatus);
120
+ tb_remove();
121
+
122
+ } else {
123
+ window.original_send_to_editor(html);
124
+ }
125
+
126
+ formfield = '';
127
+ };
128
+ });
lib/metabox/js/jquery.timePicker.min.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * A time picker for jQuery.
3
+ *
4
+ * Dual licensed under the MIT and GPL licenses.
5
+ * Copyright (c) 2009 Anders Fajerson
6
+ *
7
+ * @name timePicker
8
+ * @author Anders Fajerson (http://perifer.se)
9
+ * @see http://github.com/perifer/timePicker
10
+ * @example $("#mytime").timePicker();
11
+ * @example $("#mytime").timePicker({step:30, startTime:"15:00", endTime:"18:00"});
12
+ */
13
+ (function(a){function g(a){a.setFullYear(2001),a.setMonth(0),a.setDate(0);return a}function f(a,b){if(a){var c=a.split(b.separator),d=parseFloat(c[0]),e=parseFloat(c[1]);b.show24Hours||(d===12&&a.indexOf("AM")!==-1?d=0:d!==12&&a.indexOf("PM")!==-1&&(d+=12));var f=new Date(0,0,0,d,e,0);return g(f)}return null}function e(a,b){return typeof a=="object"?g(a):f(a,b)}function d(a){return(a<10?"0":"")+a}function c(a,b){var c=a.getHours(),e=b.show24Hours?c:(c+11)%12+1,f=a.getMinutes();return d(e)+b.separator+d(f)+(b.show24Hours?"":c<12?" AM":" PM")}function b(b,c,d,e){b.value=a(c).text(),a(b).change(),a.browser.msie||b.focus(),d.hide()}a.fn.timePicker=function(b){var c=a.extend({},a.fn.timePicker.defaults,b);return this.each(function(){a.timePicker(this,c)})},a.timePicker=function(b,c){var d=a(b)[0];return d.timePicker||(d.timePicker=new jQuery._timePicker(d,c))},a.timePicker.version="0.3",a._timePicker=function(d,h){var i=!1,j=!1,k=e(h.startTime,h),l=e(h.endTime,h),m="selected",n="li."+m;a(d).attr("autocomplete","OFF");var o=[],p=new Date(k);while(p<=l)o[o.length]=c(p,h),p=new Date(p.setMinutes(p.getMinutes()+h.step));var q=a('<div class="time-picker'+(h.show24Hours?"":" time-picker-12hours")+'"></div>'),r=a("<ul></ul>");for(var s=0;s<o.length;s++)r.append("<li>"+o[s]+"</li>");q.append(r),q.appendTo("body").hide(),q.mouseover(function(){i=!0}).mouseout(function(){i=!1}),a("li",r).mouseover(function(){j||(a(n,q).removeClass(m),a(this).addClass(m))}).mousedown(function(){i=!0}).click(function(){b(d,this,q,h),i=!1});var t=function(){if(q.is(":visible"))return!1;a("li",q).removeClass(m);var b=a(d).offset();q.css({top:b.top+d.offsetHeight,left:b.left}),q.show();var e=d.value?f(d.value,h):k,i=k.getHours()*60+k.getMinutes(),j=e.getHours()*60+e.getMinutes()-i,n=Math.round(j/h.step),o=g(new Date(0,0,0,0,n*h.step+i,0));o=k<o&&o<=l?o:k;var p=a("li:contains("+c(o,h)+")",q);p.length&&(p.addClass(m),q[0].scrollTop=p[0].offsetTop);return!0};a(d).focus(t).click(t),a(d).blur(function(){i||q.hide()});var u=a.browser.opera||a.browser.mozilla?"keypress":"keydown";a(d)[u](function(c){var e;j=!0;var f=q[0].scrollTop;switch(c.keyCode){case 38:if(t())return!1;e=a(n,r);var g=e.prev().addClass(m)[0];g?(e.removeClass(m),g.offsetTop<f&&(q[0].scrollTop=f-g.offsetHeight)):(e.removeClass(m),g=a("li:last",r).addClass(m)[0],q[0].scrollTop=g.offsetTop-g.offsetHeight);return!1;case 40:if(t())return!1;e=a(n,r);var i=e.next().addClass(m)[0];i?(e.removeClass(m),i.offsetTop+i.offsetHeight>f+q[0].offsetHeight&&(q[0].scrollTop=f+i.offsetHeight)):(e.removeClass(m),i=a("li:first",r).addClass(m)[0],q[0].scrollTop=0);return!1;case 13:if(q.is(":visible")){var k=a(n,r)[0];b(d,k,q,h)}return!1;case 27:q.hide();return!1}return!0}),a(d).keyup(function(a){j=!1}),this.getTime=function(){return f(d.value,h)},this.setTime=function(b){d.value=c(e(b,h),h),a(d).change()}},a.fn.timePicker.defaults={step:30,startTime:new Date(0,0,0,0,0,0),endTime:new Date(0,0,0,23,30,0),separator:":",show24Hours:!0}})(jQuery)
lib/metabox/readme.md ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Custom Metaboxes and Fields for WordPress
2
+
3
+ **Contributors**:
4
+
5
+ * Andrew Norcross ( [@norcross](http://twitter.com/norcross ) / [andrewnorcross.com](http://andrewnorcross.com/) )
6
+ * Jared Atchison ( [@jaredatch](http://twitter.com/jaredatch ) / [jaredatchison.com](http://jaredatchison.com/) )
7
+ * Bill Erickson ( [@billerickson](http://twitter.com/billerickson ) / [billerickson.net](http://billerickson.net/) )
8
+
9
+ **Version**: 0.9
10
+ **Requires at least**: 3.3
11
+ **Tested up to**: 3.3
12
+ **License**: GPLv2
13
+
14
+ ## Description
15
+
16
+ Custom Metaboxes and Fields (CMB for short) will create metaboxes with custom fields that will blow your mind.
17
+
18
+ ##### Links
19
+ * [Github project page](http://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress)
20
+ * [Documentation (GitHub wiki)](http://github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress/wiki)
21
+
22
+ ##### Field Types:
23
+ * text
24
+ * text small
25
+ * text medium
26
+ * text money
27
+ * date picker
28
+ * date picker (unix timestamp)
29
+ * date time picker combo (unix timestamp)
30
+ * time picker
31
+ * color picker
32
+ * textarea
33
+ * textarea small
34
+ * textarea code
35
+ * select
36
+ * radio
37
+ * radio inline
38
+ * taxonomy radio
39
+ * taxonomy select
40
+ * checkbox
41
+ * multicheck
42
+ * WYSIWYG/TinyMCE
43
+ * Image/file upload
44
+
45
+ [More on field types (GitHub wiki)](github.com/jaredatch/Custom-Metaboxes-and-Fields-for-WordPress/wiki/Field-Types)
46
+
47
+ ## Installation
48
+
49
+ This script is easy to install. If you can't figure it out you probably shouldn't be using it.
50
+
51
+ 1. Place `metabox` directory inside of your (activated) theme. E.g. inside `/themes/twentyten/lib/metabox/`.
52
+ 2. Include `init.php`.
53
+ 3. See `example-functions.php` for further guidance.
54
+ 4. Profit.
55
+
56
+ ## Known Issues
57
+
58
+ * Problem inserting file url inside field for image with caption (issue #50)
59
+ * `CMB_META_BOX_URL` does not define properly in WAMP/XAMP (Windows) (issue #31)
60
+ * Metabox containing WYSIWYG editor cannot be moved (this is a TinyMCE issue)
61
+
62
+ ## To-do
63
+ * Fix known issues (above)
64
+ * clean up code
65
+ * improve inline documentation
66
+ * move timepicker and datepicker jQuery inline
67
+ * support for multiple configurable timepickers/datepickers
68
+ * add ability to save fields in a single custom field
69
+ * add ability to mark fields as required
70
+ * add ability to define `placeholder` text
71
+ * repeatable fields
72
+ * look at possiblity of tabs
73
+ * look at preserving taxonomy hierarchies
74
+
75
+ ## Changelog
76
+
77
+ ### 0.9
78
+ * __Note: This release requires WordPress 3.3+__
79
+ * Cleaned up scripts being queued, props @jaredatch
80
+ * Cleaned up and reorganized jQuery, props @GaryJones
81
+ * Use $pagenow instead of custom $current_page, props @jaredatch
82
+ * Fixed CSS, removed inline styles, now all in style.css, props @jaredatch
83
+ * Fixed multicheck issues (issue #48), props @jaredatch
84
+ * Fixed jQuery UI datepicker CSS conflicting with WordPress UI elements, props @jaredatch
85
+ * Fixed zeros not saving in fields, props @GaryJones
86
+ * Fixed improper labels on radio and multicheck fields, props @jaredatch
87
+ * Fixed fields not rendering properly when in sidebar, props @jaredatch
88
+ * Fixed bug where datepicker triggers extra space after footer in Firefox (issue #14), props @jaredatch
89
+ * Added jQuery UI datepicker packaged with 3.3 core, props @jaredatch
90
+ * Added date time combo picker, props @jaredatch
91
+ * Added color picker, props @jaredatch
92
+ * Added readme.md markdown file, props @jaredatch
93
+
94
+ ### 0.8
95
+ * Added jQuery timepicker, props @norcross
96
+ * Added 'raw' textarea to convert special HTML entities back to characters, props @norcross
97
+ * Added missing examples on example-functions.php, props @norcross
98
+
99
+ ### 0.7
100
+ * Added the new wp_editor() function for the WYSIWYG dialog box, props @jcpry
101
+ * Created 'cmb_show_on' filter to define your own Show On Filters, props @billerickson
102
+ * Added page template show_on filter, props @billerickson
103
+ * Improvements to the 'file' field type, props @randyhoyt
104
+ * Allow for default values on 'radio' and 'radio_inline' field types, props @billerickson
105
+
106
+ ### 0.6.1
107
+ * Enabled the ability to define your own custom field types (issue #28). props @randyhoyt
108
+
109
+ ### 0.6
110
+ * Added the ability to limit metaboxes to certain posts by id. props @billerickson
111
+
112
+ ### 0.5
113
+ * Fixed define to prevent notices. props @destos
114
+ * Added text_date_timestap option. props @andrewyno
115
+ * Fixed WYSIWYG paragraph breaking/spacing bug. props @wpsmith
116
+ * Added taxonomy_radio and taxonomies_select options. props @c3mdigital
117
+ * Fixed script causing the dashboard widgets to not be collapsible.
118
+ * Fixed various spacing and whitespace inconsistencies
119
+
120
+ ### 0.4
121
+ * Think we have a release that is mostly working. We'll say the initial release :)
lib/metabox/style.css ADDED
@@ -0,0 +1,329 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * CMB Styling
3
+ */
4
+ table.cmb_metabox td, table.cmb_metabox th { border-bottom: 1px solid #E9E9E9; }
5
+ table.cmb_metabox th { text-align: right; font-weight:bold;}
6
+ table.cmb_metabox th label { margin-top:5px; display:block;}
7
+ p.cmb_metabox_description { color: #AAA; font-style: italic; margin: 2px 0 !important;}
8
+ span.cmb_metabox_description { color: #AAA; font-style: italic;}
9
+ table.cmb_metabox input, table.cmb_metabox textarea { font-size:12px; padding: 5px; }
10
+ table.cmb_metabox input[type=text], table.cmb_metabox textarea { width: 97%; }
11
+ table.cmb_metabox textarea.cmb_textarea_code { font-family: Consolas,Monaco,monospace; line-height: 16px; }
12
+ table.cmb_metabox input.cmb_text_small { width: 100px; margin-right: 15px;}
13
+ table.cmb_metabox input.cmb_timepicker { width: 100px; margin-right: 15px;}
14
+ table.cmb_metabox input.cmb_text_money { width: 90px; margin-right: 15px;}
15
+ table.cmb_metabox input.cmb_text_medium { width: 230px; margin-right: 15px;}
16
+ table.cmb_metabox input.cmb_upload_file { width: 65%; }
17
+ table.cmb_metabox li { font-size:12px; margin: 1px 0 5px 0; line-height: 16px; }
18
+ table.cmb_metabox ul { padding-top:5px; margin: 0; }
19
+ table.cmb_metabox select { font-size:12px; margin-top: 3px;}
20
+ table.cmb_metabox input:focus, table.cmb_metabox textarea:focus { background: #fffff8;}
21
+ .cmb_metabox_title { margin: 0 0 5px 0; padding: 5px 0 0 0; font: italic 24px/35px Georgia,"Times New Roman","Bitstream Charter",Times,serif;}
22
+ .cmb_radio_inline { padding: 4px 0 0 0;}
23
+ .cmb_radio_inline_option {display: inline; padding-right: 18px;}
24
+ table.cmb_metabox input[type="radio"] { margin: 0 5px 0 0; padding: 0;}
25
+ table.cmb_metabox input[type="checkbox"] { margin: 0 5px 0 0; padding: 0;}
26
+ table.cmb_metabox .mceLayout {border:1px solid #DFDFDF !important;}
27
+ table.cmb_metabox .mceIframeContainer {background:#FFF;}
28
+ table.cmb_metabox .meta_mce {width:97%;}
29
+ table.cmb_metabox .meta_mce textarea {width:100%;}
30
+ table.cmb_metabox .cmb_upload_status { margin: 10px 0 0 0;}
31
+ table.cmb_metabox .cmb_upload_status .img_status { position: relative; }
32
+ table.cmb_metabox .cmb_upload_status .img_status img { border:1px solid #DFDFDF; background: #FAFAFA; max-width:350px; padding: 5px; -moz-border-radius: 2px; border-radius: 2px;}
33
+ table.cmb_metabox .cmb_upload_status .img_status .cmb_remove_file_button { text-indent: -9999px; background: url(images/ico-delete.png); width: 16px; height: 16px; position: absolute; top: -5px; left: -5px;}
34
+ /* Sidebar placement adjustments */
35
+ .inner-sidebar table.cmb_metabox input[type=text], table.cmb_metabox textarea { width: 95%; }
36
+ .inner-sidebar table.cmb_metabox .cmb_upload_status .img_status img { width: 90%; }
37
+
38
+ /**
39
+ * Timepicker
40
+ */
41
+ div.time-picker { position: absolute; height: 191px; width:6em; /* needed for IE */overflow: auto; background: #fff; border: 1px solid #aaa; z-index: 99; margin: 0;}
42
+ div.time-picker-12hours { width:8em; /* needed for IE */}
43
+ div.time-picker ul { list-style-type: none; margin: 0; padding: 0; }
44
+ div.time-picker li { cursor: pointer; height: 10px; font: 12px/1 Helvetica, Arial, sans-serif; padding: 4px 3px; }
45
+ div.time-picker li.selected { background: #0063CE; color: #fff; }
46
+
47
+ /**
48
+ * jQuery UI CSS Framework 1.8.16
49
+ *
50
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
51
+ * Dual licensed under the MIT or GPL Version 2 licenses.
52
+ * http://jquery.org/license
53
+ *
54
+ * http://docs.jquery.com/UI/Theming/API
55
+ */
56
+ .cmb_element .ui-helper-hidden { display: none; }
57
+ .cmb_element .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); }
58
+ .cmb_element .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
59
+ .cmb_element .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
60
+ .cmb_element .ui-helper-clearfix { display: inline-block; }
61
+ * html .ui-helper-clearfix { height:1%; }
62
+ .cmb_element .ui-helper-clearfix { display:block; }
63
+ .cmb_element .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
64
+ .cmb_element .ui-state-disabled { cursor: default !important; }
65
+ .cmb_element .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
66
+ .cmb_element .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
67
+ .cmb_element .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
68
+ .cmb_element .ui-widget .ui-widget { font-size: 1em; }
69
+ .cmb_element .ui-widget input, .cmb_element .ui-widget select, .cmb_element .ui-widget textarea, .cmb_element .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
70
+ .cmb_element .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
71
+ .cmb_element .ui-widget-content a { color: #222222; }
72
+ .cmb_element .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
73
+ .cmb_element .ui-widget-header a { color: #222222; }
74
+ .cmb_element .ui-state-default, .cmb_element .ui-widget-content .ui-state-default, .cmb_element .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
75
+ .cmb_element .ui-state-default a, .cmb_element .ui-state-default a:link, .cmb_element .ui-state-default a:visited { color: #555555; text-decoration: none; }
76
+ .cmb_element .ui-state-hover, .cmb_element .ui-widget-content .ui-state-hover, .cmb_element .ui-widget-header .ui-state-hover, .cmb_element .ui-state-focus, .cmb_element .ui-widget-content .ui-state-focus, .cmb_element .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
77
+ .cmb_element .ui-state-hover a, .cmb_element .ui-state-hover a:hover { color: #212121; text-decoration: none; }
78
+ .cmb_element .ui-state-active, .cmb_element .ui-widget-content .ui-state-active, .cmb_element .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
79
+ .cmb_element .ui-state-active a, .cmb_element .ui-state-active a:link, .cmb_element .ui-state-active a:visited { color: #212121; text-decoration: none; }
80
+ .cmb_element .ui-widget :active { outline: none; }
81
+ .cmb_element .ui-state-highlight, .cmb_element .ui-widget-content .ui-state-highlight, .cmb_element .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
82
+ .cmb_element .ui-state-highlight a, .cmb_element .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
83
+ .cmb_element .ui-state-error, .cmb_element .ui-widget-content .ui-state-error, .cmb_element .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
84
+ .cmb_element .ui-state-error a, .cmb_element .ui-widget-content .ui-state-error a, .cmb_element .ui-widget-header .ui-state-error a { color: #cd0a0a; }
85
+ .cmb_element .ui-state-error-text, .cmb_element .ui-widget-content .ui-state-error-text, .cmb_element .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
86
+ .cmb_element .ui-priority-primary, .cmb_element .ui-widget-content .ui-priority-primary, .cmb_element .ui-widget-header .ui-priority-primary { font-weight: bold; }
87
+ .cmb_element .ui-priority-secondary, .cmb_element .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
88
+ .cmb_element .ui-state-disabled, .cmb_element .ui-widget-content .ui-state-disabled, .cmb_element .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
89
+ .cmb_element .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
90
+ .cmb_element .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
91
+ .cmb_element .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
92
+ .cmb_element .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
93
+ .cmb_element .ui-state-hover .ui-icon, .cmb_element .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
94
+ .cmb_element .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
95
+ .cmb_element .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
96
+ .cmb_element .ui-state-error .ui-icon, .cmb_element .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
97
+ .cmb_element .ui-icon-carat-1-n { background-position: 0 0; }
98
+ .cmb_element .ui-icon-carat-1-ne { background-position: -16px 0; }
99
+ .cmb_element .ui-icon-carat-1-e { background-position: -32px 0; }
100
+ .cmb_element .ui-icon-carat-1-se { background-position: -48px 0; }
101
+ .cmb_element .ui-icon-carat-1-s { background-position: -64px 0; }
102
+ .cmb_element .ui-icon-carat-1-sw { background-position: -80px 0; }
103
+ .cmb_element .ui-icon-carat-1-w { background-position: -96px 0; }
104
+ .cmb_element .ui-icon-carat-1-nw { background-position: -112px 0; }
105
+ .cmb_element .ui-icon-carat-2-n-s { background-position: -128px 0; }
106
+ .cmb_element .ui-icon-carat-2-e-w { background-position: -144px 0; }
107
+ .cmb_element .ui-icon-triangle-1-n { background-position: 0 -16px; }
108
+ .cmb_element .ui-icon-triangle-1-ne { background-position: -16px -16px; }
109
+ .cmb_element .ui-icon-triangle-1-e { background-position: -32px -16px; }
110
+ .cmb_element .ui-icon-triangle-1-se { background-position: -48px -16px; }
111
+ .cmb_element .ui-icon-triangle-1-s { background-position: -64px -16px; }
112
+ .cmb_element .ui-icon-triangle-1-sw { background-position: -80px -16px; }
113
+ .cmb_element .ui-icon-triangle-1-w { background-position: -96px -16px; }
114
+ .cmb_element .ui-icon-triangle-1-nw { background-position: -112px -16px; }
115
+ .cmb_element .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
116
+ .cmb_element .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
117
+ .cmb_element .ui-icon-arrow-1-n { background-position: 0 -32px; }
118
+ .cmb_element .ui-icon-arrow-1-ne { background-position: -16px -32px; }
119
+ .cmb_element .ui-icon-arrow-1-e { background-position: -32px -32px; }
120
+ .cmb_element .ui-icon-arrow-1-se { background-position: -48px -32px; }
121
+ .cmb_element .ui-icon-arrow-1-s { background-position: -64px -32px; }
122
+ .cmb_element .ui-icon-arrow-1-sw { background-position: -80px -32px; }
123
+ .cmb_element .ui-icon-arrow-1-w { background-position: -96px -32px; }
124
+ .cmb_element .ui-icon-arrow-1-nw { background-position: -112px -32px; }
125
+ .cmb_element .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
126
+ .cmb_element .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
127
+ .cmb_element .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
128
+ .cmb_element .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
129
+ .cmb_element .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
130
+ .cmb_element .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
131
+ .cmb_element .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
132
+ .cmb_element .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
133
+ .cmb_element .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
134
+ .cmb_element .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
135
+ .cmb_element .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
136
+ .cmb_element .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
137
+ .cmb_element .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
138
+ .cmb_element .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
139
+ .cmb_element .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
140
+ .cmb_element .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
141
+ .cmb_element .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
142
+ .cmb_element .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
143
+ .cmb_element .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
144
+ .cmb_element .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
145
+ .cmb_element .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
146
+ .cmb_element .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
147
+ .cmb_element .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
148
+ .cmb_element .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
149
+ .cmb_element .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
150
+ .cmb_element .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
151
+ .cmb_element .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
152
+ .cmb_element .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
153
+ .cmb_element .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
154
+ .cmb_element .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
155
+ .cmb_element .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
156
+ .cmb_element .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
157
+ .cmb_element .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
158
+ .cmb_element .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
159
+ .cmb_element .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
160
+ .cmb_element .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
161
+ .cmb_element .ui-icon-arrow-4 { background-position: 0 -80px; }
162
+ .cmb_element .ui-icon-arrow-4-diag { background-position: -16px -80px; }
163
+ .cmb_element .ui-icon-extlink { background-position: -32px -80px; }
164
+ .cmb_element .ui-icon-newwin { background-position: -48px -80px; }
165
+ .cmb_element .ui-icon-refresh { background-position: -64px -80px; }
166
+ .cmb_element .ui-icon-shuffle { background-position: -80px -80px; }
167
+ .cmb_element .ui-icon-transfer-e-w { background-position: -96px -80px; }
168
+ .cmb_element .ui-icon-transferthick-e-w { background-position: -112px -80px; }
169
+ .cmb_element .ui-icon-folder-collapsed { background-position: 0 -96px; }
170
+ .cmb_element .ui-icon-folder-open { background-position: -16px -96px; }
171
+ .cmb_element .ui-icon-document { background-position: -32px -96px; }
172
+ .cmb_element .ui-icon-document-b { background-position: -48px -96px; }
173
+ .cmb_element .ui-icon-note { background-position: -64px -96px; }
174
+ .cmb_element .ui-icon-mail-closed { background-position: -80px -96px; }
175
+ .cmb_element .ui-icon-mail-open { background-position: -96px -96px; }
176
+ .cmb_element .ui-icon-suitcase { background-position: -112px -96px; }
177
+ .cmb_element .ui-icon-comment { background-position: -128px -96px; }
178
+ .cmb_element .ui-icon-person { background-position: -144px -96px; }
179
+ .cmb_element .ui-icon-print { background-position: -160px -96px; }
180
+ .cmb_element .ui-icon-trash { background-position: -176px -96px; }
181
+ .cmb_element .ui-icon-locked { background-position: -192px -96px; }
182
+ .cmb_element .ui-icon-unlocked { background-position: -208px -96px; }
183
+ .cmb_element .ui-icon-bookmark { background-position: -224px -96px; }
184
+ .cmb_element .ui-icon-tag { background-position: -240px -96px; }
185
+ .cmb_element .ui-icon-home { background-position: 0 -112px; }
186
+ .cmb_element .ui-icon-flag { background-position: -16px -112px; }
187
+ .cmb_element .ui-icon-calendar { background-position: -32px -112px; }
188
+ .cmb_element .ui-icon-cart { background-position: -48px -112px; }
189
+ .cmb_element .ui-icon-pencil { background-position: -64px -112px; }
190
+ .cmb_element .ui-icon-clock { background-position: -80px -112px; }
191
+ .cmb_element .ui-icon-disk { background-position: -96px -112px; }
192
+ .cmb_element .ui-icon-calculator { background-position: -112px -112px; }
193
+ .cmb_element .ui-icon-zoomin { background-position: -128px -112px; }
194
+ .cmb_element .ui-icon-zoomout { background-position: -144px -112px; }
195
+ .cmb_element .ui-icon-search { background-position: -160px -112px; }
196
+ .cmb_element .ui-icon-wrench { background-position: -176px -112px; }
197
+ .cmb_element .ui-icon-gear { background-position: -192px -112px; }
198
+ .cmb_element .ui-icon-heart { background-position: -208px -112px; }
199
+ .cmb_element .ui-icon-star { background-position: -224px -112px; }
200
+ .cmb_element .ui-icon-link { background-position: -240px -112px; }
201
+ .cmb_element .ui-icon-cancel { background-position: 0 -128px; }
202
+ .cmb_element .ui-icon-plus { background-position: -16px -128px; }
203
+ .cmb_element .ui-icon-plusthick { background-position: -32px -128px; }
204
+ .cmb_element .ui-icon-minus { background-position: -48px -128px; }
205
+ .cmb_element .ui-icon-minusthick { background-position: -64px -128px; }
206
+ .cmb_element .ui-icon-close { background-position: -80px -128px; }
207
+ .cmb_element .ui-icon-closethick { background-position: -96px -128px; }
208
+ .cmb_element .ui-icon-key { background-position: -112px -128px; }
209
+ .cmb_element .ui-icon-lightbulb { background-position: -128px -128px; }
210
+ .cmb_element .ui-icon-scissors { background-position: -144px -128px; }
211
+ .cmb_element .ui-icon-clipboard { background-position: -160px -128px; }
212
+ .cmb_element .ui-icon-copy { background-position: -176px -128px; }
213
+ .cmb_element .ui-icon-contact { background-position: -192px -128px; }
214
+ .cmb_element .ui-icon-image { background-position: -208px -128px; }
215
+ .cmb_element .ui-icon-video { background-position: -224px -128px; }
216
+ .cmb_element .ui-icon-script { background-position: -240px -128px; }
217
+ .cmb_element .ui-icon-alert { background-position: 0 -144px; }
218
+ .cmb_element .ui-icon-info { background-position: -16px -144px; }
219
+ .cmb_element .ui-icon-notice { background-position: -32px -144px; }
220
+ .cmb_element .ui-icon-help { background-position: -48px -144px; }
221
+ .cmb_element .ui-icon-check { background-position: -64px -144px; }
222
+ .cmb_element .ui-icon-bullet { background-position: -80px -144px; }
223
+ .cmb_element .ui-icon-radio-off { background-position: -96px -144px; }
224
+ .cmb_element .ui-icon-radio-on { background-position: -112px -144px; }
225
+ .cmb_element .ui-icon-pin-w { background-position: -128px -144px; }
226
+ .cmb_element .ui-icon-pin-s { background-position: -144px -144px; }
227
+ .cmb_element .ui-icon-play { background-position: 0 -160px; }
228
+ .cmb_element .ui-icon-pause { background-position: -16px -160px; }
229
+ .cmb_element .ui-icon-seek-next { background-position: -32px -160px; }
230
+ .cmb_element .ui-icon-seek-prev { background-position: -48px -160px; }
231
+ .cmb_element .ui-icon-seek-end { background-position: -64px -160px; }
232
+ .cmb_element .ui-icon-seek-start { background-position: -80px -160px; }
233
+ .cmb_element .ui-icon-seek-first { background-position: -80px -160px; }
234
+ .cmb_element .ui-icon-stop { background-position: -96px -160px; }
235
+ .cmb_element .ui-icon-eject { background-position: -112px -160px; }
236
+ .cmb_element .ui-icon-volume-off { background-position: -128px -160px; }
237
+ .cmb_element .ui-icon-volume-on { background-position: -144px -160px; }
238
+ .cmb_element .ui-icon-power { background-position: 0 -176px; }
239
+ .cmb_element .ui-icon-signal-diag { background-position: -16px -176px; }
240
+ .cmb_element .ui-icon-signal { background-position: -32px -176px; }
241
+ .cmb_element .ui-icon-battery-0 { background-position: -48px -176px; }
242
+ .cmb_element .ui-icon-battery-1 { background-position: -64px -176px; }
243
+ .cmb_element .ui-icon-battery-2 { background-position: -80px -176px; }
244
+ .cmb_element .ui-icon-battery-3 { background-position: -96px -176px; }
245
+ .cmb_element .ui-icon-circle-plus { background-position: 0 -192px; }
246
+ .cmb_element .ui-icon-circle-minus { background-position: -16px -192px; }
247
+ .cmb_element .ui-icon-circle-close { background-position: -32px -192px; }
248
+ .cmb_element .ui-icon-circle-triangle-e { background-position: -48px -192px; }
249
+ .cmb_element .ui-icon-circle-triangle-s { background-position: -64px -192px; }
250
+ .cmb_element .ui-icon-circle-triangle-w { background-position: -80px -192px; }
251
+ .cmb_element .ui-icon-circle-triangle-n { background-position: -96px -192px; }
252
+ .cmb_element .ui-icon-circle-arrow-e { background-position: -112px -192px; }
253
+ .cmb_element .ui-icon-circle-arrow-s { background-position: -128px -192px; }
254
+ .cmb_element .ui-icon-circle-arrow-w { background-position: -144px -192px; }
255
+ .cmb_element .ui-icon-circle-arrow-n { background-position: -160px -192px; }
256
+ .cmb_element .ui-icon-circle-zoomin { background-position: -176px -192px; }
257
+ .cmb_element .ui-icon-circle-zoomout { background-position: -192px -192px; }
258
+ .cmb_element .ui-icon-circle-check { background-position: -208px -192px; }
259
+ .cmb_element .ui-icon-circlesmall-plus { background-position: 0 -208px; }
260
+ .cmb_element .ui-icon-circlesmall-minus { background-position: -16px -208px; }
261
+ .cmb_element .ui-icon-circlesmall-close { background-position: -32px -208px; }
262
+ .cmb_element .ui-icon-squaresmall-plus { background-position: -48px -208px; }
263
+ .cmb_element .ui-icon-squaresmall-minus { background-position: -64px -208px; }
264
+ .cmb_element .ui-icon-squaresmall-close { background-position: -80px -208px; }
265
+ .cmb_element .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
266
+ .cmb_element .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
267
+ .cmb_element .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
268
+ .cmb_element .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
269
+ .cmb_element .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
270
+ .cmb_element .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
271
+ .cmb_element .ui-corner-all, .cmb_element .ui-corner-top, .cmb_element .ui-corner-left, .cmb_element .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }
272
+ .cmb_element .ui-corner-all, .cmb_element .ui-corner-top, .cmb_element .ui-corner-right, .cmb_element .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }
273
+ .cmb_element .ui-corner-all, .cmb_element .ui-corner-bottom, .cmb_element .ui-corner-left, .cmb_element .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
274
+ .cmb_element .ui-corner-all, .cmb_element .ui-corner-bottom, .cmb_element .ui-corner-right, .cmb_element .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
275
+ .cmb_element .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
276
+ .cmb_element .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }
277
+ .cmb_element .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; }
278
+ .cmb_element .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
279
+ .cmb_element .ui-datepicker .ui-datepicker-prev, .cmb_element .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
280
+ .cmb_element .ui-datepicker .ui-datepicker-prev-hover, .cmb_element .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
281
+ .cmb_element .ui-datepicker .ui-datepicker-prev { left:2px; }
282
+ .cmb_element .ui-datepicker .ui-datepicker-next { right:2px; }
283
+ .cmb_element .ui-datepicker .ui-datepicker-prev-hover { left:1px; }
284
+ .cmb_element .ui-datepicker .ui-datepicker-next-hover { right:1px; }
285
+ .cmb_element .ui-datepicker .ui-datepicker-prev span, .cmb_element .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
286
+ .cmb_element .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
287
+ .cmb_element .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
288
+ .cmb_element .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
289
+ .cmb_element .ui-datepicker select.ui-datepicker-month,
290
+ .cmb_element .ui-datepicker select.ui-datepicker-year { width: 49%;}
291
+ .cmb_element .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
292
+ .cmb_element .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
293
+ .cmb_element .ui-datepicker td { border: 0; padding: 1px; }
294
+ .cmb_element .ui-datepicker td span, .cmb_element .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
295
+ .cmb_element .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
296
+ .cmb_element .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
297
+ .cmb_element .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
298
+ .cmb_element .ui-datepicker.ui-datepicker-multi { width:auto; }
299
+ .cmb_element .ui-datepicker-multi .ui-datepicker-group { float:left; }
300
+ .cmb_element .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
301
+ .cmb_element .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
302
+ .cmb_element .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
303
+ .cmb_element .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
304
+ .cmb_element .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
305
+ .cmb_element .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
306
+ .cmb_element .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
307
+ .cmb_element .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; }
308
+ .cmb_element .ui-datepicker-rtl { direction: rtl; }
309
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
310
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
311
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
312
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
313
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
314
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
315
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
316
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-group { float:right; }
317
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
318
+ .cmb_element .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
319
+ .cmb_element .ui-datepicker-cover {
320
+ display: none; /*sorry for IE5*/
321
+ display/**/: block; /*sorry for IE5*/
322
+ position: absolute; /*must have*/
323
+ z-index: -1; /*must have*/
324
+ filter: mask(); /*must have*/
325
+ top: -4px; /*must have*/
326
+ left: -4px; /*must have*/
327
+ width: 200px; /*must have*/
328
+ height: 200px; /*must have*/
329
+ }
readme.txt CHANGED
@@ -1,18 +1,24 @@
1
  === Scripts To Footer ===
2
  Contributors: joshuadnelson
3
- Tags: javascript, footer, speed, head
4
- Donate link: http://joshuadnelson.com/donate
5
  Requires at least: 3.0.1
6
- Tested up to: 3.8
7
- Stable tag: 4.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
- This small plugin moves scripts to the footer to help speed up page load times, while keep stylesheets in the header.
12
 
13
  == Description ==
14
 
15
- This small plugin moves scripts to the footer to help speed up page load times, while keep stylesheets in the header. Note that this only works if you have plugins and a theme that utilizes wp_enqueue_scripts correctly.
 
 
 
 
 
 
16
 
17
  == Installation ==
18
 
@@ -24,8 +30,19 @@ e.g.
24
  1. Activate the plugin through the 'Plugins' menu in WordPress
25
  1. Once activated, it should work.
26
 
 
 
 
 
27
  == Changelog ==
28
 
 
 
 
29
  = 0.1 =
 
 
 
30
 
31
- Initial release
 
1
  === Scripts To Footer ===
2
  Contributors: joshuadnelson
3
+ Tags: javascript, footer, speed, head, performance
4
+ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FGQXZEW8S9UPC
5
  Requires at least: 3.0.1
6
+ Tested up to: 3.8.1
7
+ Stable tag: 0.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
11
+ This small plugin moves scripts to the footer to help speed up page load times, while keeping stylesheets in the header.
12
 
13
  == Description ==
14
 
15
+ This small plugin moves scripts to the footer to help speed up page load times, while keeping stylesheets in the header. Note that this only works if you have plugins and a theme that utilizes `wp_enqueue_scripts` correctly.
16
+
17
+ Now includes an option to disable the plugin on a specific page.
18
+
19
+ Finally, if you're comfortable with code you can use the `scripts_to_footer_post_types` filter to change the post types this applies to (it only applies to pages and posts by default).
20
+
21
+ [View this plugin on GitHub](https://github.com/joshuadavidnelson/scripts-to-footer)
22
 
23
  == Installation ==
24
 
30
  1. Activate the plugin through the 'Plugins' menu in WordPress
31
  1. Once activated, it should work.
32
 
33
+ == Screenshots ==
34
+
35
+ 1. The metabox that shows up on the Edit screen.
36
+
37
  == Changelog ==
38
 
39
+ = 0.2 =
40
+ Updating code to be object-oriented and added page metabox to disable plugin on specific pages.
41
+
42
  = 0.1 =
43
+ Initial release
44
+
45
+ == Upgrade Notice ==
46
 
47
+ = 0.2 =
48
+ This upgrade adds options to disable plugin on specific pages.
scripts-to-footer.php CHANGED
@@ -1,35 +1,189 @@
1
  <?php
2
- /*
3
- Plugin Name: Scripts-To-Footer
4
- Plugin URI: http://joshuadnelson.com/
5
- Description: This small plugin moves scripts to the footer to help speed up page load times, while keep stylesheets in the header. Note that this only works if you have plugins and a theme that utilizes wp_enqueue_scripts correctly.
6
- Version: 0.1
7
- Author: Joshua David Nelson
8
- Author URI: http://joshuadnelson.com
9
- License: GPL2
10
-
11
- Copyright 2013 Joshua David Nelson (email : josh@joshuadnelson.com)
12
-
13
- This program is free software; you can redistribute it and/or modify
14
- it under the terms of the GNU General Public License, version 2, as
15
- published by the Free Software Foundation.
16
-
17
- This program is distributed in the hope that it will be useful,
18
- but WITHOUT ANY WARRANTY; without even the implied warranty of
19
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, aka AS-IS. See the
20
- GNU General Public License for more details.
21
-
22
- You should have received a copy of the GNU General Public License
23
- along with this program; if not, write to the Free Software
24
- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
- */
26
-
27
- function stf_custom_clean_head() {
28
- remove_action( 'wp_head', 'wp_print_scripts' );
29
- remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
30
- remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
31
- }
32
- add_action( 'wp_enqueue_scripts', 'stf_custom_clean_head' );
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
 
35
  ?>
1
  <?php
2
+ /**
3
+ * Main Plugin File
4
+ *
5
+ * @package Scripts_To_Footer
6
+ * @subpackage Admin
7
+ * @author Joshua David Nelson <josh@joshuadnelson.com>
8
+ * @copyright Copyright (c) 2014, Joshua David Nelson
9
+ * @license http://www.opensource.org/licenses/gpl-license.php GPL-2.0+
10
+ * @link http://joshuadnelson.com/scripts-to-footer-plugin
11
+ *
12
+ * Plugin Name: Scripts-To-Footer
13
+ * Plugin URI: http://wordpress.org/plugins/scripts-to-footerphp/
14
+ * Description: Moves scripts to the footer to decrease page load times, while keeping stylesheets in the header. Requires that plugins and theme correctly utilizes wp_enqueue_scripts hook. Can be disabled via a checkbox on specific pages and posts.
15
+ * Version: 0.2
16
+ * Author: Joshua David Nelson
17
+ * Author URI: http://joshuadnelson.com
18
+ * License: GPL2
19
+ *
20
+ **/
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
+ /**
23
+ * Prevent direct access to this file.
24
+ *
25
+ * @since 0.2
26
+ **/
27
+ if( !defined( 'ABSPATH' ) ) {
28
+ exit( 'You are not allowed to access this file directly.' );
29
+ }
30
+
31
+ /**
32
+ * Define our plugin variables
33
+ *
34
+ * @since 0.2
35
+ **/
36
+ // Plugin Settings Field
37
+ if( !defined( 'STF_SETTINGS_FIELD' ) )
38
+ define( 'STF_SETTINGS_FIELD', 'scripts-to-footer' );
39
+
40
+ // Plugin Domain
41
+ if( !defined( 'STF_DOMAIN' ) )
42
+ define( 'STF_DOMAIN', 'stf' );
43
+
44
+ // Plugin Verison
45
+ if( !defined( 'STF_VERSION' ) )
46
+ define( 'STF_VERSION', '0.2' );
47
+
48
+ /**
49
+ * Scripts to Footer Class.
50
+ *
51
+ * Forces scripts to the footer, unless excluded in the settings page.
52
+ *
53
+ * @since 0.2
54
+ */
55
+
56
+ class JDN_Scripts_To_Footer {
57
+
58
+ /**
59
+ * Construct.
60
+ *
61
+ * Registers our activation hook and init hook.
62
+ *
63
+ * @since 0.2
64
+ * @author Joshua David Nelson
65
+ */
66
+ function __construct() {
67
+ add_action( 'init', array( $this, 'init' ) );
68
+ add_action( 'init', array( $this, 'initialize_cmb_meta_boxes' ), 50 );
69
+ }
70
+
71
+ /**
72
+ * Plugin Init.
73
+ *
74
+ * Makes some checks and runs the filter, sets up the admin settings page
75
+ * and plugin links.
76
+ *
77
+ * @since 0.2
78
+ * @author Joshua David Nelson
79
+ */
80
+ function init() {
81
+ // Run the plugin
82
+ add_action( 'wp_enqueue_scripts', array( $this, 'clean_head' ) );
83
+
84
+ // Metabox on Edit screen, for Page Override
85
+ add_filter( 'cmb_meta_boxes', array( $this, 'create_metaboxes' ) );
86
+
87
+ // Add Links to Plugin Bar
88
+ if( function_exists( 'stf_plugin_links' ) )
89
+ add_filter( 'plugin_row_meta', 'stf_plugin_links', 10, 2 );
90
+ }
91
+
92
+ /**
93
+ * Remove scripts from header, forces them to the footer.
94
+ *
95
+ * First checks to see if the current post type is excluded via the custom meta box, if so then it doesn't run.
96
+ *
97
+ * @since 0.1
98
+ **/
99
+ function clean_head() {
100
+ $excluded_pages = get_post_meta( get_queried_object_id(), 'stf_exclude', true );
101
+
102
+ if( 'on' != $excluded_pages ) {
103
+ remove_action( 'wp_head', 'wp_print_scripts' );
104
+ remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
105
+ remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
106
+ }
107
+ }
108
+
109
+ /**
110
+ * Create Page-Specific Metaboxes.
111
+ * @link http://www.billerickson.net/wordpress-metaboxes/
112
+ *
113
+ * @param array $meta_boxes, current metaboxes
114
+ * @return array $meta_boxes, current + new metaboxes
115
+ *
116
+ * @since 0.2
117
+ */
118
+ function create_metaboxes( $meta_boxes ) {
119
+ $post_types = apply_filters( 'scripts_to_footer_post_types', array( 'page', 'post' ) );
120
+ if( !empty( $post_types ) ) {
121
+ $meta_boxes[] = array(
122
+ 'id' => 'scripts-to-footer',
123
+ 'title' => __( 'Scripts to Footer Plugin Settings', STF_DOMAIN ),
124
+ 'pages' => $post_types,
125
+ 'context' => 'normal',
126
+ 'priority' => 'high',
127
+ 'show_names' => true,
128
+ 'fields' => array(
129
+ array(
130
+ 'name' => __( 'Disable Plugin', STF_DOMAIN ),
131
+ 'desc' => __( 'By default, the scripts to footer plugin is set to run. This checkbox disables the plugin on this page', STF_DOMAIN ),
132
+ 'id' => 'stf_exclude',
133
+ 'type' => 'checkbox'
134
+ )
135
+ )
136
+ );
137
+ }
138
+
139
+ return $meta_boxes;
140
+ }
141
+
142
+ /**
143
+ * Initializing Custom Metaboxes
144
+ *
145
+ * @author Bill Erickson, billerickson.net
146
+ * @since 0.2
147
+ **/
148
+ function initialize_cmb_meta_boxes() {
149
+ $post_types = apply_filters( 'scripts_to_footer_post_types', array( 'page', 'post' ) );
150
+ if( !class_exists( 'cmb_Meta_Box' ) && !empty( $post_types ) ) {
151
+ require_once( dirname( __FILE__) . '/lib/metabox/init.php' );
152
+ }
153
+ }
154
+
155
+ }
156
+ global $stf_scripts_to_footer;
157
+ $stf_scripts_to_footer = new JDN_Scripts_To_Footer();
158
+
159
+ /**
160
+ * Add various links to plugin page
161
+ *
162
+ * @since 0.2
163
+ *
164
+ * @param $links
165
+ * @param $file
166
+ *
167
+ * @return strings plugin links
168
+ */
169
+ function stf_plugin_links( $links, $file ) {
170
+ static $this_plugin;
171
+
172
+ /** Capability Check */
173
+ if( ! current_user_can( 'install_plugins' ) )
174
+ return $links;
175
+
176
+ if( !$this_plugin ) {
177
+ $this_plugin = plugin_basename(__FILE__);
178
+ }
179
+
180
+ if( $file == $this_plugin ) {
181
+ $links[] = '<a href="http://wordpress.org/support/plugin/scripts-to-footerphp" title="' . __( 'Support', STF_DOMAIN ) . '">' . __( 'Support', STF_DOMAIN ) . '</a>';
182
+
183
+ $links[] = '<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FGQXZEW8S9UPC" title="' . __( 'Donate', STF_DOMAIN ) . '">' . __( 'Donate', STF_DOMAIN ) . '</a>';
184
+ }
185
+
186
+ return $links;
187
+ }
188
 
189
  ?>
uninstall.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Scripts to Footer Uninstall File
4
+ *
5
+ * @package Scripts_To_Footer
6
+ * @subpackage Uninstall
7
+ * @author Joshua David Nelson <josh@joshuadnelson.com>
8
+ * @copyright Copyright (c) 2014, Joshua David Nelson
9
+ * @license http://www.opensource.org/licenses/gpl-license.php GPL-2.0+
10
+ * @link http://joshuadnelson.com/scripts-to-footer-plugin
11
+ *
12
+ * @since 0.2
13
+ **/
14
+
15
+ /**
16
+ * Prevent direct access to this file.
17
+ *
18
+ * @since 0.2
19
+ */
20
+ if ( !defined( 'ABSPATH' ) ) {
21
+ exit( 'You are not allowed to access this file directly.' );
22
+ }
23
+
24
+ /**
25
+ * If uninstall not called from WordPress, exit.
26
+ *
27
+ * @since 0.2
28
+ *
29
+ * @uses WP_UNINSTALL_PLUGIN
30
+ */
31
+ if( !defined( 'WP_UNINSTALL_PLUGIN' ) ) {
32
+ header( 'Status: 403 Forbidden' );
33
+ header( 'HTTP/1.1 403 Forbidden' );
34
+ exit();
35
+ }
36
+
37
+ /**
38
+ * Various user checks.
39
+ *
40
+ * @since 0.2
41
+ *
42
+ * @uses is_user_logged_in()
43
+ * @uses current_user_can()
44
+ * @uses wp_die()
45
+ */
46
+ if( !is_user_logged_in() ) {
47
+ wp_die(
48
+ __( 'You must be logged in to run this script.', STF_DOMAIN ),
49
+ __( 'Scripts To Footer', STF_DOMAIN ),
50
+ array( 'back_link' => true )
51
+ );
52
+ }
53
+
54
+ if( !current_user_can( 'install_plugins' ) ) {
55
+ wp_die(
56
+ __( 'You do not have permission to run this script.', STF_DOMAIN ),
57
+ __( 'Scripts To Footer', STF_DOMAIN ),
58
+ array( 'back_link' => true )
59
+ );
60
+ }
61
+
62
+ /**
63
+ * Delete options array (settings field) from the database.
64
+ * Note: Respects Multisite setups and single installs.
65
+ *
66
+ * @since 0.2
67
+ *
68
+ * @uses switch_to_blog()
69
+ * @uses restore_current_blog()
70
+ *
71
+ * @param array $blogs
72
+ * @param int $blog
73
+ *
74
+ * @global $wpdb
75
+ */
76
+ // First, check for Multisite, if yes, delete options on a per site basis
77
+ if ( is_multisite() ) {
78
+ global $wpdb;
79
+
80
+ // Get array of Site/Blog IDs from the database
81
+ $blogs = $wpdb->get_results( "SELECT blog_id FROM {$wpdb->blogs}", ARRAY_A );
82
+
83
+ if ( $blogs ) {
84
+
85
+ foreach ( $blogs as $blog ) {
86
+
87
+ // Repeat for every Site ID
88
+ switch_to_blog( $blog[ 'blog_id' ] );
89
+ delete_option( STF_SETTINGS_FIELD );
90
+ }
91
+
92
+ restore_current_blog();
93
+
94
+ }
95
+
96
+ } else { // Otherwise, delete options from main options table
97
+
98
+ delete_option( STF_SETTINGS_FIELD );
99
+
100
+ }