LoftLoader - Version 1.0.0

Version Description

  • Initial Public Release
Download this release

Release Info

Developer loftocean
Plugin Icon 128x128 LoftLoader
Version 1.0.0
Comparing to
See all releases

Version 1.0.0

Files changed (37) hide show
  1. configs/loftloader-config.php +326 -0
  2. css/images/ui-bg_flat_55_999999_40x100.png +0 -0
  3. css/images/ui-bg_flat_75_aaaaaa_40x100.png +0 -0
  4. css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  5. css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  6. css/images/ui-bg_glass_45_0078ae_1x400.png +0 -0
  7. css/images/ui-bg_glass_55_f8da4e_1x400.png +0 -0
  8. css/images/ui-bg_glass_75_79c9ec_1x400.png +0 -0
  9. css/images/ui-bg_gloss-wave_45_e14f1c_500x100.png +0 -0
  10. css/images/ui-bg_gloss-wave_50_6eac2c_500x100.png +0 -0
  11. css/images/ui-bg_gloss-wave_75_2191c0_500x100.png +0 -0
  12. css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  13. css/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  14. css/images/ui-icons_0078ae_256x240.png +0 -0
  15. css/images/ui-icons_056b93_256x240.png +0 -0
  16. css/images/ui-icons_acacac_256x240.png +0 -0
  17. css/images/ui-icons_e0fdff_256x240.png +0 -0
  18. css/images/ui-icons_ef8c08_256x240 1.png +0 -0
  19. css/images/ui-icons_ef8c08_256x240.png +0 -0
  20. css/images/ui-icons_f5e175_256x240.png +0 -0
  21. css/images/ui-icons_f7a50d_256x240.png +0 -0
  22. css/images/ui-icons_fcd113_256x240.png +0 -0
  23. css/jquery-ui.css +1225 -0
  24. css/loftloader-animation.css +817 -0
  25. css/settings/loftloader-media.css +23 -0
  26. css/settings/loftloader-settings.css +536 -0
  27. front/class-loftloader-front.php +85 -0
  28. img/loftloader-logo.png +0 -0
  29. js/front/loftloader.js +5 -0
  30. js/settings/loftloader-settings.js +216 -0
  31. languages/loftloader.pot +155 -0
  32. loftloader.php +92 -0
  33. readme.txt +60 -0
  34. settings/class-loftloader-settings.php +158 -0
  35. settings/form/class-loftloader-checkbox.php +42 -0
  36. settings/form/class-loftloader-form-base.php +107 -0
  37. settings/form/class-loftloader-preview.php +211 -0
configs/loftloader-config.php ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+ /**
7
+ * Configuration file for plugin option sections
8
+ * fields and the default settings
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!file_exists('loftloader_settings_fields') && !file_exists('loftloader_settings_default_value')){
19
+ add_filter('loftloader_settings_fields', 'loftloader_settings_fields');
20
+ /**
21
+ * @description hook callback function to register the fields of loftloader
22
+ * @param array $fields
23
+ * @return array merge fields to the array passed by
24
+ */
25
+ function loftloader_settings_fields($fields = array()){
26
+ return array_merge((array)$fields, array(
27
+ array(
28
+ 'title' => esc_html__('Show Preloader', 'loftloader'),
29
+ 'args' => array(),
30
+ 'content' => array(
31
+ array(
32
+ 'name' => 'enable',
33
+ 'type' => 'Checkbox',
34
+ 'title' => esc_html__('Enable loftloader', 'loftloader'),
35
+ 'description' => esc_html__('Suggest keep it enabled if the site has a lot of images or large videos.', 'loftloader'),
36
+ 'options' => array(
37
+ 'on' => array('label' => '')
38
+ )
39
+ )
40
+ )
41
+ ),
42
+ array(
43
+ 'title' => '',
44
+ 'args' => array('nolist' => true, 'nowrap' => true),
45
+ 'content' => array(
46
+ array(
47
+ 'name' => 'settings',
48
+ 'type' => 'Preloader_Preview',
49
+ 'title' => '',
50
+ 'description' => '',
51
+ 'options' => array(
52
+ array(
53
+ 'section' => 'preview',
54
+ 'title' => esc_html__('Preview', 'loftloader'),
55
+ 'description' => esc_html__('Hover onto frame below to preview ending animation.', 'loftloader')
56
+ ),
57
+ array(
58
+ 'section' => 'setting',
59
+ 'content' => array(
60
+ array(
61
+ 'title' => esc_html__('Background', 'loftloader'),
62
+ 'content' => array(
63
+ array(
64
+ 'name' => 'background[effect]',
65
+ 'type' => 'select',
66
+ 'title' => esc_html__('Select preloader ending animation', 'loftloader'),
67
+ 'options' => array(
68
+ 'fade' => array('label' => esc_html__('Fade', 'loftloader')),
69
+ 'slide-left-right' => array('label' => esc_html__('Slide Left & Right', 'loftloader')),
70
+ 'slide-up' => array('label' => esc_html__('Slide Up', 'loftloader')),
71
+ 'slide-up-down' => array('label' => esc_html__('Slide Up & Down', 'loftloader'), 'selected' => true)
72
+ ),
73
+ 'extra' => array(
74
+ 'id' => 'preloader-background-style',
75
+ )
76
+ ),
77
+ array(
78
+ 'name' => 'background[color]',
79
+ 'type' => 'color-picker',
80
+ 'title' => esc_html__('Preloader background color', 'loftloader'),
81
+ 'options' => array(
82
+ 'defaultValue' => '#222222'
83
+ ),
84
+ 'extra' => array(
85
+ 'id' => 'preloader-background-color',
86
+ )
87
+ ),
88
+ array(
89
+ 'name' => 'background[opacity]',
90
+ 'type' => 'slider',
91
+ 'title' => esc_html__('Preloader background opacity', 'loftloader'),
92
+ 'options' => array(
93
+ 'default' => 100,
94
+ 'min' => 0,
95
+ 'max' => 100,
96
+ 'step' => 5
97
+ ),
98
+ 'extra' => array(
99
+ 'class' => 'slider-opacity'
100
+ )
101
+ )
102
+ )
103
+ ),
104
+ array(
105
+ 'title' => esc_html__('Animation', 'loftloader'),
106
+ 'content' => array(
107
+ array(
108
+ 'name' => 'animation[type]',
109
+ 'type' => 'select',
110
+ 'title' => esc_html__('Select preloader loading animation', 'loftloader'),
111
+ 'options' => array(
112
+ 'pl-sun' => array('label' => esc_html__('1 - Spinning Sun', 'loftloader')),
113
+ 'pl-circles' => array('label' => esc_html__('2 - Luminous Circles', 'loftloader')),
114
+ 'pl-wave' => array('label' => esc_html__('3 - Wave', 'loftloader')),
115
+ 'pl-square' => array('label' => esc_html__('4 - Spinning Square', 'loftloader')),
116
+ 'pl-frame' => array('label' => esc_html__('5 - Drawing Frame', 'loftloader')),
117
+ 'pl-imgloading' => array('label' => esc_html__('6 - Loading Custom Image', 'loftloader'))
118
+ ),
119
+ 'extra' => array(
120
+ 'id' => 'preloader-animation',
121
+ 'class' => 'preloader-dependency-parent'
122
+ )
123
+ ),
124
+ array(
125
+ 'name' => 'animation[color]',
126
+ 'type' => 'color-picker',
127
+ 'title' => esc_html__('Preloader animation color', 'loftloader'),
128
+ 'options' => array(
129
+ 'defaultValue' => '#222222'
130
+ ),
131
+ 'extra' => array(
132
+ 'id' => 'preloader-animation-color',
133
+ 'wrapperClass' => 'preloader_animation preloader_animation-pl-sun preloader_animation-pl-circles preloader_animation-pl-wave preloader_animation-pl-square preloader_animation-pl-frame'
134
+ )
135
+ ),
136
+ array(
137
+ 'name' => 'animation[image]',
138
+ 'type' => 'media',
139
+ 'title' => esc_html__('Upload custom image/logo', 'loftloader'),
140
+ 'options' => array(
141
+ 'removeButton' => true
142
+ ),
143
+ 'extra' => array(
144
+ 'wrapperClass' => 'preloader_animation preloader_animation-pl-frame preloader_animation-pl-imgloading'
145
+ )
146
+ ),
147
+ array(
148
+ 'name' => 'animation[width]',
149
+ 'type' => 'number',
150
+ 'title' => esc_html__('Custom image width - optional (if provided, the value should be between 1 - 400)', 'loftloader'),
151
+ 'options' => array(),
152
+ 'extra' => array(
153
+ 'wrapperClass' => 'preloader_animation preloader_animation-pl-imgloading preloader-custom-image-width'
154
+ )
155
+ )
156
+ )
157
+ )
158
+ )
159
+ )
160
+ )
161
+ )
162
+ )
163
+ )
164
+ ));
165
+ }
166
+ add_filter('loftloader_settings_default_value', 'loftloader_settings_default_value');
167
+ /**
168
+ * @description hook callback function to set the default value of loftloader settings
169
+ * @param array $settings
170
+ * @return array merge values to the array passed by
171
+ */
172
+ function loftloader_settings_default_value($settings){
173
+ return array_merge((array)$settings, array(
174
+ 'enable' => 'on',
175
+ 'settings' => array(
176
+ 'background' => array(
177
+ 'effect' => 'fade',
178
+ 'color' => '#000000',
179
+ 'opacity' => '95%'
180
+ ),
181
+ 'animation' => array(
182
+ 'type' => 'pl-sun',
183
+ 'color' => '#248acc',
184
+ 'image' => array(
185
+ 'url' => LOFTLOADER_URI . 'img/loftloader-logo.png',
186
+ 'id' => ''
187
+ ),
188
+ 'width' => '76'
189
+ )
190
+ )
191
+ ));
192
+ }
193
+ }
194
+
195
+ if(!class_exists('LoftLoader_Setting_Manager')){
196
+ /**
197
+ * LoftLoader settings manager class
198
+ *
199
+ * @since LoftLoader version 1.0
200
+ */
201
+ require_once LOFTLOADER_ROOT . 'settings/form/class-loftloader-form-base.php';
202
+ require_once LOFTLOADER_ROOT . 'settings/form/class-loftloader-checkbox.php';
203
+ require_once LOFTLOADER_ROOT . 'settings/form/class-loftloader-preview.php';
204
+ class LoftLoader_Setting_Manager {
205
+ public $section_id; // Section unique id
206
+ protected $section_title; // Section title
207
+ protected $extra_info; // Other arguments needed when registered the sections
208
+ public function __construct(){
209
+ $this->section_id = 'loftloader-custom-settings';
210
+ $this->section_title = esc_html__('LoftLoader Settings', 'loftloader');
211
+ }
212
+ /**
213
+ * @description render setting section content
214
+ */
215
+ public function render_settings_section(){
216
+ // Register the section
217
+ echo '<h1 class="loftloader-option-section-title">' . $this->section_title . '</h1>';
218
+ $fields = apply_filters('loftloader_settings_fields', array()); // Get all fields of current section
219
+ if($fields && is_array($fields)){
220
+ foreach($fields as $field){
221
+ echo (isset($field['args']['nowrap']) && $field['args']['nowrap']) ? '' : '<div class="setting-group">';
222
+ echo empty ($field['title']) ? '' : '<h3>' . $field['title'] . '</h3>';
223
+ $this->render_settings_field(array('admin' => $field['args'], 'form' => $field['content']));
224
+ echo (isset($field['args']['nowrap']) && $field['args']['nowrap']) ? '' : '</div>';
225
+ }
226
+ }
227
+ $this->settings_fields(); // Show the hidden fields
228
+ }
229
+ /**
230
+ * @description output the form elements of each fields registered
231
+ */
232
+ private function render_settings_field($args){
233
+ $default = apply_filters('loftloader_settings_default_value', array());
234
+ $default = isset($default) ? $default : array();
235
+ $values = get_option($this->section_id, $default);
236
+ $inList = !empty($args['admin']['nolist']) ? false : true; // Wrap the output html in ul list or not
237
+
238
+ echo $inList ? '<ul class="form-list">' : '';
239
+ foreach($args['form'] as $element){ // Output each form elements
240
+ if(!empty($element)){
241
+ $class = 'LoftLoader_' . $element['type']; // Get class name of element type
242
+ // Get the value and name of each element
243
+ if(strpos($element['name'], '[') !== false){
244
+ $subs = strtr($element['name'], array(']' => '', '[' => ']['));
245
+ $name = $this->section_id . '[' . $subs . ']'; // Name of each form element
246
+ $value = $values;
247
+ foreach(explode('][', $subs) as $sub){
248
+ $value = !empty($value[$sub]) ? $value[$sub] : '';
249
+ }
250
+ }
251
+ else{
252
+ $name = $this->section_id . '[' . $element['name'] . ']'; // Name of each form element
253
+ $value = !empty($values[$element['name']]) ? $values[$element['name']] : ''; // Value of each element
254
+ }
255
+ $extra = isset($element['extra']) ? $element['extra'] : array(); // Any extra arguments
256
+ $options = isset($element['options']) ? $element['options'] : array(); // Options for some form elements, like checkbox/radio/select
257
+ $newField = new $class($name, $element['title'], $element['description'], $options, $value, $extra); // Instantiate the element
258
+ echo $inList ? '<li>' : '';
259
+ $newField->render(); // Output the element
260
+ echo $inList ? '</li>' : '';
261
+ }
262
+ }
263
+ echo $inList ? '</ul>' : '';
264
+ }
265
+ /*
266
+ * @description show the hidden input
267
+ */
268
+ private function settings_fields(){
269
+ $page = $this->section_id;
270
+ echo "<input type='hidden' name='option_page' value='" . $page . "' />";
271
+ echo '<input type="hidden" name="action" value="update" />';
272
+ wp_nonce_field("$page-options");
273
+ }
274
+ /**
275
+ * @description register setting for saving custom settings
276
+ */
277
+ public function register_setting(){
278
+ global $new_whitelist_options;
279
+ $option_group = $option_name = $this->section_id;
280
+ $new_whitelist_options[$option_group][] = $option_name;
281
+ add_filter("sanitize_option_{$option_name}", array($this, 'save_custom_styles'));
282
+ }
283
+ /**
284
+ * @description save the custom styles from the custom plugin settings
285
+ */
286
+ public function save_custom_styles($args){
287
+ $css = '';
288
+ if(isset($args['enable']) && ($args['enable'] === 'on')){
289
+ $color = $args['settings']['animation']['color'];
290
+ $bgColor = $args['settings']['background']['color'];
291
+ $bgOpacity = intval($args['settings']['background']['opacity']) / 100;
292
+ $css .= '#loftloader-wrapper .loader-section {' . PHP_EOL . "\t" . 'background: ' . $bgColor . ';' . PHP_EOL . "\t" . 'opacity: ' . $bgOpacity . ';' . PHP_EOL . '}' . PHP_EOL;
293
+ switch($args['settings']['animation']['type']){
294
+ case 'pl-sun':
295
+ $css .= '#loftloader-wrapper.pl-sun #loader span,' . PHP_EOL . '#loftloader-wrapper.pl-sun #loader span:before {' . PHP_EOL . "\t" . 'background: ' . $color . ';' . PHP_EOL . '}' . PHP_EOL;
296
+ break;
297
+ case 'pl-circles':
298
+ $css .= '#loftloader-wrapper.pl-circles #loader span,' . PHP_EOL . '#loftloader-wrapper.pl-circles #loader:before,' . PHP_EOL . '#loftloader-wrapper.pl-circles #loader:after {' . PHP_EOL . "\t" . 'background: ' . $color . ';' . PHP_EOL . '}' . PHP_EOL;
299
+ break;
300
+ case 'pl-wave':
301
+ $css .= '#loftloader-wrapper.pl-wave #loader span,' . PHP_EOL . '#loftloader-wrapper.pl-wave #loader:before,' . PHP_EOL . '#loftloader-wrapper.pl-wave #loader:after {' . PHP_EOL . "\t" . 'background: ' . $color . ';' . PHP_EOL . '}' . PHP_EOL;
302
+ break;
303
+ case 'pl-square':
304
+ $css .= '#loftloader-wrapper.pl-square #loader span {' . PHP_EOL . "\t" . 'border: 4px solid ' . $color . ';' . PHP_EOL . '}' . PHP_EOL;
305
+ break;
306
+ case 'pl-frame':
307
+ $css .= '#loftloader-wrapper.pl-frame #loader:before,' . PHP_EOL . '#loftloader-wrapper.pl-frame #loader:after,' . PHP_EOL . '#loftloader-wrapper.pl-frame #loader span:before,' . PHP_EOL . '#loftloader-wrapper.pl-frame #loader span:after {' . PHP_EOL . "\t" . 'background-color: ' . $color . ';' . PHP_EOL . '}' . PHP_EOL;
308
+ break;
309
+ case 'pl-imgloading':
310
+ $css .= empty($args['settings']['animation']['width']) ? '' : '#loftloader-wrapper.pl-imgloading #loader {' . PHP_EOL . "\t" . 'width: ' . $args['settings']['animation']['width'] . 'px;' . PHP_EOL . '}' . PHP_EOL;
311
+ $css .= '#loftloader-wrapper.pl-imgloading #loader span {' . PHP_EOL . "\t" . 'background-size: cover;' . PHP_EOL . "\t" . 'background-image: url(' . $args['settings']['animation']['image']['url'] . ');' . PHP_EOL . '}' . PHP_EOL;
312
+ break;
313
+ }
314
+ }
315
+ update_option('loftloader-custom-styles', $css);
316
+ return $args;
317
+ }
318
+ /**
319
+ * @description reset loader setting and custom styles
320
+ */
321
+ public function reset_settings(){
322
+ delete_option('loftloader-custom-styles');
323
+ delete_option('loftloader-custom-settings');
324
+ }
325
+ }
326
+ }
css/images/ui-bg_flat_55_999999_40x100.png ADDED
Binary file
css/images/ui-bg_flat_75_aaaaaa_40x100.png ADDED
Binary file
css/images/ui-bg_glass_100_f6f6f6_1x400.png ADDED
Binary file
css/images/ui-bg_glass_100_fdf5ce_1x400.png ADDED
Binary file
css/images/ui-bg_glass_45_0078ae_1x400.png ADDED
Binary file
css/images/ui-bg_glass_55_f8da4e_1x400.png ADDED
Binary file
css/images/ui-bg_glass_75_79c9ec_1x400.png ADDED
Binary file
css/images/ui-bg_gloss-wave_45_e14f1c_500x100.png ADDED
Binary file
css/images/ui-bg_gloss-wave_50_6eac2c_500x100.png ADDED
Binary file
css/images/ui-bg_gloss-wave_75_2191c0_500x100.png ADDED
Binary file
css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png ADDED
Binary file
css/images/ui-bg_inset-hard_100_fcfdfd_1x100.png ADDED
Binary file
css/images/ui-icons_0078ae_256x240.png ADDED
Binary file
css/images/ui-icons_056b93_256x240.png ADDED
Binary file
css/images/ui-icons_acacac_256x240.png ADDED
Binary file
css/images/ui-icons_e0fdff_256x240.png ADDED
Binary file
css/images/ui-icons_ef8c08_256x240 1.png ADDED
Binary file
css/images/ui-icons_ef8c08_256x240.png ADDED
Binary file
css/images/ui-icons_f5e175_256x240.png ADDED
Binary file
css/images/ui-icons_f7a50d_256x240.png ADDED
Binary file
css/images/ui-icons_fcd113_256x240.png ADDED
Binary file
css/jquery-ui.css ADDED
@@ -0,0 +1,1225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*! jQuery UI - v1.11.1 - 2014-08-13
2
+ * http://jqueryui.com
3
+ * Includes: core.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, draggable.css, menu.css, progressbar.css, resizable.css, selectable.css, selectmenu.css, slider.css, sortable.css, spinner.css, tabs.css, tooltip.css, theme.css
4
+ * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
5
+ * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
6
+
7
+ /* Layout helpers
8
+ ----------------------------------*/
9
+ .ui-helper-hidden {
10
+ display: none;
11
+ }
12
+ .ui-helper-hidden-accessible {
13
+ border: 0;
14
+ clip: rect(0 0 0 0);
15
+ height: 1px;
16
+ margin: -1px;
17
+ overflow: hidden;
18
+ padding: 0;
19
+ position: absolute;
20
+ width: 1px;
21
+ }
22
+ .ui-helper-reset {
23
+ margin: 0;
24
+ padding: 0;
25
+ border: 0;
26
+ outline: 0;
27
+ line-height: 1.3;
28
+ text-decoration: none;
29
+ font-size: 100%;
30
+ list-style: none;
31
+ }
32
+ .ui-helper-clearfix:before,
33
+ .ui-helper-clearfix:after {
34
+ content: "";
35
+ display: table;
36
+ border-collapse: collapse;
37
+ }
38
+ .ui-helper-clearfix:after {
39
+ clear: both;
40
+ }
41
+ .ui-helper-clearfix {
42
+ min-height: 0; /* support: IE7 */
43
+ }
44
+ .ui-helper-zfix {
45
+ width: 100%;
46
+ height: 100%;
47
+ top: 0;
48
+ left: 0;
49
+ position: absolute;
50
+ opacity: 0;
51
+ filter:Alpha(Opacity=0); /* support: IE8 */
52
+ }
53
+
54
+ .ui-front {
55
+ z-index: 100;
56
+ }
57
+
58
+
59
+ /* Interaction Cues
60
+ ----------------------------------*/
61
+ .ui-state-disabled {
62
+ cursor: default !important;
63
+ }
64
+
65
+
66
+ /* Icons
67
+ ----------------------------------*/
68
+
69
+ /* states and images */
70
+ .ui-icon {
71
+ display: block;
72
+ text-indent: -99999px;
73
+ overflow: hidden;
74
+ background-repeat: no-repeat;
75
+ }
76
+
77
+
78
+ /* Misc visuals
79
+ ----------------------------------*/
80
+
81
+ /* Overlays */
82
+ .ui-widget-overlay {
83
+ position: fixed;
84
+ top: 0;
85
+ left: 0;
86
+ width: 100%;
87
+ height: 100%;
88
+ }
89
+ .ui-accordion .ui-accordion-header {
90
+ display: block;
91
+ cursor: pointer;
92
+ position: relative;
93
+ margin: 2px 0 0 0;
94
+ padding: .5em .5em .5em .7em;
95
+ min-height: 0; /* support: IE7 */
96
+ font-size: 100%;
97
+ }
98
+ .ui-accordion .ui-accordion-icons {
99
+ padding-left: 2.2em;
100
+ }
101
+ .ui-accordion .ui-accordion-icons .ui-accordion-icons {
102
+ padding-left: 2.2em;
103
+ }
104
+ .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
105
+ position: absolute;
106
+ left: .5em;
107
+ top: 50%;
108
+ margin-top: -8px;
109
+ }
110
+ .ui-accordion .ui-accordion-content {
111
+ padding: 1em 2.2em;
112
+ border-top: 0;
113
+ overflow: auto;
114
+ }
115
+ .ui-autocomplete {
116
+ position: absolute;
117
+ top: 0;
118
+ left: 0;
119
+ cursor: default;
120
+ }
121
+ .ui-button {
122
+ display: inline-block;
123
+ position: relative;
124
+ padding: 0;
125
+ line-height: normal;
126
+ margin-right: .1em;
127
+ cursor: pointer;
128
+ vertical-align: middle;
129
+ text-align: center;
130
+ overflow: visible; /* removes extra width in IE */
131
+ }
132
+ .ui-button,
133
+ .ui-button:link,
134
+ .ui-button:visited,
135
+ .ui-button:hover,
136
+ .ui-button:active {
137
+ text-decoration: none;
138
+ }
139
+ /* to make room for the icon, a width needs to be set here */
140
+ .ui-button-icon-only {
141
+ width: 2.2em;
142
+ }
143
+ /* button elements seem to need a little more width */
144
+ button.ui-button-icon-only {
145
+ width: 2.4em;
146
+ }
147
+ .ui-button-icons-only {
148
+ width: 3.4em;
149
+ }
150
+ button.ui-button-icons-only {
151
+ width: 3.7em;
152
+ }
153
+
154
+ /* button text element */
155
+ .ui-button .ui-button-text {
156
+ display: block;
157
+ line-height: normal;
158
+ }
159
+ .ui-button-text-only .ui-button-text {
160
+ padding: .4em 1em;
161
+ }
162
+ .ui-button-icon-only .ui-button-text,
163
+ .ui-button-icons-only .ui-button-text {
164
+ padding: .4em;
165
+ text-indent: -9999999px;
166
+ }
167
+ .ui-button-text-icon-primary .ui-button-text,
168
+ .ui-button-text-icons .ui-button-text {
169
+ padding: .4em 1em .4em 2.1em;
170
+ }
171
+ .ui-button-text-icon-secondary .ui-button-text,
172
+ .ui-button-text-icons .ui-button-text {
173
+ padding: .4em 2.1em .4em 1em;
174
+ }
175
+ .ui-button-text-icons .ui-button-text {
176
+ padding-left: 2.1em;
177
+ padding-right: 2.1em;
178
+ }
179
+ /* no icon support for input elements, provide padding by default */
180
+ input.ui-button {
181
+ padding: .4em 1em;
182
+ }
183
+
184
+ /* button icon element(s) */
185
+ .ui-button-icon-only .ui-icon,
186
+ .ui-button-text-icon-primary .ui-icon,
187
+ .ui-button-text-icon-secondary .ui-icon,
188
+ .ui-button-text-icons .ui-icon,
189
+ .ui-button-icons-only .ui-icon {
190
+ position: absolute;
191
+ top: 50%;
192
+ margin-top: -8px;
193
+ }
194
+ .ui-button-icon-only .ui-icon {
195
+ left: 50%;
196
+ margin-left: -8px;
197
+ }
198
+ .ui-button-text-icon-primary .ui-button-icon-primary,
199
+ .ui-button-text-icons .ui-button-icon-primary,
200
+ .ui-button-icons-only .ui-button-icon-primary {
201
+ left: .5em;
202
+ }
203
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
204
+ .ui-button-text-icons .ui-button-icon-secondary,
205
+ .ui-button-icons-only .ui-button-icon-secondary {
206
+ right: .5em;
207
+ }
208
+
209
+ /* button sets */
210
+ .ui-buttonset {
211
+ margin-right: 7px;
212
+ }
213
+ .ui-buttonset .ui-button {
214
+ margin-left: 0;
215
+ margin-right: -.3em;
216
+ }
217
+
218
+ /* workarounds */
219
+ /* reset extra padding in Firefox, see h5bp.com/l */
220
+ input.ui-button::-moz-focus-inner,
221
+ button.ui-button::-moz-focus-inner {
222
+ border: 0;
223
+ padding: 0;
224
+ }
225
+ .ui-datepicker {
226
+ width: 17em;
227
+ padding: .2em .2em 0;
228
+ display: none;
229
+ }
230
+ .ui-datepicker .ui-datepicker-header {
231
+ position: relative;
232
+ padding: .2em 0;
233
+ }
234
+ .ui-datepicker .ui-datepicker-prev,
235
+ .ui-datepicker .ui-datepicker-next {
236
+ position: absolute;
237
+ top: 2px;
238
+ width: 1.8em;
239
+ height: 1.8em;
240
+ }
241
+ .ui-datepicker .ui-datepicker-prev-hover,
242
+ .ui-datepicker .ui-datepicker-next-hover {
243
+ top: 1px;
244
+ }
245
+ .ui-datepicker .ui-datepicker-prev {
246
+ left: 2px;
247
+ }
248
+ .ui-datepicker .ui-datepicker-next {
249
+ right: 2px;
250
+ }
251
+ .ui-datepicker .ui-datepicker-prev-hover {
252
+ left: 1px;
253
+ }
254
+ .ui-datepicker .ui-datepicker-next-hover {
255
+ right: 1px;
256
+ }
257
+ .ui-datepicker .ui-datepicker-prev span,
258
+ .ui-datepicker .ui-datepicker-next span {
259
+ display: block;
260
+ position: absolute;
261
+ left: 50%;
262
+ margin-left: -8px;
263
+ top: 50%;
264
+ margin-top: -8px;
265
+ }
266
+ .ui-datepicker .ui-datepicker-title {
267
+ margin: 0 2.3em;
268
+ line-height: 1.8em;
269
+ text-align: center;
270
+ }
271
+ .ui-datepicker .ui-datepicker-title select {
272
+ font-size: 1em;
273
+ margin: 1px 0;
274
+ }
275
+ .ui-datepicker select.ui-datepicker-month,
276
+ .ui-datepicker select.ui-datepicker-year {
277
+ width: 45%;
278
+ }
279
+ .ui-datepicker table {
280
+ width: 100%;
281
+ font-size: .9em;
282
+ border-collapse: collapse;
283
+ margin: 0 0 .4em;
284
+ }
285
+ .ui-datepicker th {
286
+ padding: .7em .3em;
287
+ text-align: center;
288
+ font-weight: bold;
289
+ border: 0;
290
+ }
291
+ .ui-datepicker td {
292
+ border: 0;
293
+ padding: 1px;
294
+ }
295
+ .ui-datepicker td span,
296
+ .ui-datepicker td a {
297
+ display: block;
298
+ padding: .2em;
299
+ text-align: right;
300
+ text-decoration: none;
301
+ }
302
+ .ui-datepicker .ui-datepicker-buttonpane {
303
+ background-image: none;
304
+ margin: .7em 0 0 0;
305
+ padding: 0 .2em;
306
+ border-left: 0;
307
+ border-right: 0;
308
+ border-bottom: 0;
309
+ }
310
+ .ui-datepicker .ui-datepicker-buttonpane button {
311
+ float: right;
312
+ margin: .5em .2em .4em;
313
+ cursor: pointer;
314
+ padding: .2em .6em .3em .6em;
315
+ width: auto;
316
+ overflow: visible;
317
+ }
318
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
319
+ float: left;
320
+ }
321
+
322
+ /* with multiple calendars */
323
+ .ui-datepicker.ui-datepicker-multi {
324
+ width: auto;
325
+ }
326
+ .ui-datepicker-multi .ui-datepicker-group {
327
+ float: left;
328
+ }
329
+ .ui-datepicker-multi .ui-datepicker-group table {
330
+ width: 95%;
331
+ margin: 0 auto .4em;
332
+ }
333
+ .ui-datepicker-multi-2 .ui-datepicker-group {
334
+ width: 50%;
335
+ }
336
+ .ui-datepicker-multi-3 .ui-datepicker-group {
337
+ width: 33.3%;
338
+ }
339
+ .ui-datepicker-multi-4 .ui-datepicker-group {
340
+ width: 25%;
341
+ }
342
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
343
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
344
+ border-left-width: 0;
345
+ }
346
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
347
+ clear: left;
348
+ }
349
+ .ui-datepicker-row-break {
350
+ clear: both;
351
+ width: 100%;
352
+ font-size: 0;
353
+ }
354
+
355
+ /* RTL support */
356
+ .ui-datepicker-rtl {
357
+ direction: rtl;
358
+ }
359
+ .ui-datepicker-rtl .ui-datepicker-prev {
360
+ right: 2px;
361
+ left: auto;
362
+ }
363
+ .ui-datepicker-rtl .ui-datepicker-next {
364
+ left: 2px;
365
+ right: auto;
366
+ }
367
+ .ui-datepicker-rtl .ui-datepicker-prev:hover {
368
+ right: 1px;
369
+ left: auto;
370
+ }
371
+ .ui-datepicker-rtl .ui-datepicker-next:hover {
372
+ left: 1px;
373
+ right: auto;
374
+ }
375
+ .ui-datepicker-rtl .ui-datepicker-buttonpane {
376
+ clear: right;
377
+ }
378
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button {
379
+ float: left;
380
+ }
381
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
382
+ .ui-datepicker-rtl .ui-datepicker-group {
383
+ float: right;
384
+ }
385
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
386
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
387
+ border-right-width: 0;
388
+ border-left-width: 1px;
389
+ }
390
+ .ui-dialog {
391
+ overflow: hidden;
392
+ position: absolute;
393
+ top: 0;
394
+ left: 0;
395
+ padding: .2em;
396
+ outline: 0;
397
+ }
398
+ .ui-dialog .ui-dialog-titlebar {
399
+ padding: .4em 1em;
400
+ position: relative;
401
+ }
402
+ .ui-dialog .ui-dialog-title {
403
+ float: left;
404
+ margin: .1em 0;
405
+ white-space: nowrap;
406
+ width: 90%;
407
+ overflow: hidden;
408
+ text-overflow: ellipsis;
409
+ }
410
+ .ui-dialog .ui-dialog-titlebar-close {
411
+ position: absolute;
412
+ right: .3em;
413
+ top: 50%;
414
+ width: 20px;
415
+ margin: -10px 0 0 0;
416
+ padding: 1px;
417
+ height: 20px;
418
+ }
419
+ .ui-dialog .ui-dialog-content {
420
+ position: relative;
421
+ border: 0;
422
+ padding: .5em 1em;
423
+ background: none;
424
+ overflow: auto;
425
+ }
426
+ .ui-dialog .ui-dialog-buttonpane {
427
+ text-align: left;
428
+ border-width: 1px 0 0 0;
429
+ background-image: none;
430
+ margin-top: .5em;
431
+ padding: .3em 1em .5em .4em;
432
+ }
433
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
434
+ float: right;
435
+ }
436
+ .ui-dialog .ui-dialog-buttonpane button {
437
+ margin: .5em .4em .5em 0;
438
+ cursor: pointer;
439
+ }
440
+ .ui-dialog .ui-resizable-se {
441
+ width: 12px;
442
+ height: 12px;
443
+ right: -5px;
444
+ bottom: -5px;
445
+ background-position: 16px 16px;
446
+ }
447
+ .ui-draggable .ui-dialog-titlebar {
448
+ cursor: move;
449
+ }
450
+ .ui-draggable-handle {
451
+ -ms-touch-action: none;
452
+ touch-action: none;
453
+ }
454
+ .ui-menu {
455
+ list-style: none;
456
+ padding: 0;
457
+ margin: 0;
458
+ display: block;
459
+ outline: none;
460
+ }
461
+ .ui-menu .ui-menu {
462
+ position: absolute;
463
+ }
464
+ .ui-menu .ui-menu-item {
465
+ position: relative;
466
+ margin: 0;
467
+ padding: 3px 1em 3px .4em;
468
+ cursor: pointer;
469
+ min-height: 0; /* support: IE7 */
470
+ /* support: IE10, see #8844 */
471
+ list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
472
+ }
473
+ .ui-menu .ui-menu-divider {
474
+ margin: 5px 0;
475
+ height: 0;
476
+ font-size: 0;
477
+ line-height: 0;
478
+ border-width: 1px 0 0 0;
479
+ }
480
+ .ui-menu .ui-state-focus,
481
+ .ui-menu .ui-state-active {
482
+ margin: -1px;
483
+ }
484
+
485
+ /* icon support */
486
+ .ui-menu-icons {
487
+ position: relative;
488
+ }
489
+ .ui-menu-icons .ui-menu-item {
490
+ padding-left: 2em;
491
+ }
492
+
493
+ /* left-aligned */
494
+ .ui-menu .ui-icon {
495
+ position: absolute;
496
+ top: 0;
497
+ bottom: 0;
498
+ left: .2em;
499
+ margin: auto 0;
500
+ }
501
+
502
+ /* right-aligned */
503
+ .ui-menu .ui-menu-icon {
504
+ left: auto;
505
+ right: 0;
506
+ }
507
+ .ui-progressbar {
508
+ height: 2em;
509
+ text-align: left;
510
+ overflow: hidden;
511
+ }
512
+ .ui-progressbar .ui-progressbar-value {
513
+ margin: -1px;
514
+ height: 100%;
515
+ }
516
+ .ui-progressbar .ui-progressbar-overlay {
517
+ background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
518
+ height: 100%;
519
+ filter: alpha(opacity=25); /* support: IE8 */
520
+ opacity: 0.25;
521
+ }
522
+ .ui-progressbar-indeterminate .ui-progressbar-value {
523
+ background-image: none;
524
+ }
525
+ .ui-resizable {
526
+ position: relative;
527
+ }
528
+ .ui-resizable-handle {
529
+ position: absolute;
530
+ font-size: 0.1px;
531
+ display: block;
532
+ -ms-touch-action: none;
533
+ touch-action: none;
534
+ }
535
+ .ui-resizable-disabled .ui-resizable-handle,
536
+ .ui-resizable-autohide .ui-resizable-handle {
537
+ display: none;
538
+ }
539
+ .ui-resizable-n {
540
+ cursor: n-resize;
541
+ height: 7px;
542
+ width: 100%;
543
+ top: -5px;
544
+ left: 0;
545
+ }
546
+ .ui-resizable-s {
547
+ cursor: s-resize;
548
+ height: 7px;
549
+ width: 100%;
550
+ bottom: -5px;
551
+ left: 0;
552
+ }
553
+ .ui-resizable-e {
554
+ cursor: e-resize;
555
+ width: 7px;
556
+ right: -5px;
557
+ top: 0;
558
+ height: 100%;
559
+ }
560
+ .ui-resizable-w {
561
+ cursor: w-resize;
562
+ width: 7px;
563
+ left: -5px;
564
+ top: 0;
565
+ height: 100%;
566
+ }
567
+ .ui-resizable-se {
568
+ cursor: se-resize;
569
+ width: 12px;
570
+ height: 12px;
571
+ right: 1px;
572
+ bottom: 1px;
573
+ }
574
+ .ui-resizable-sw {
575
+ cursor: sw-resize;
576
+ width: 9px;
577
+ height: 9px;
578
+ left: -5px;
579
+ bottom: -5px;
580
+ }
581
+ .ui-resizable-nw {
582
+ cursor: nw-resize;
583
+ width: 9px;
584
+ height: 9px;
585
+ left: -5px;
586
+ top: -5px;
587
+ }
588
+ .ui-resizable-ne {
589
+ cursor: ne-resize;
590
+ width: 9px;
591
+ height: 9px;
592
+ right: -5px;
593
+ top: -5px;
594
+ }
595
+ .ui-selectable {
596
+ -ms-touch-action: none;
597
+ touch-action: none;
598
+ }
599
+ .ui-selectable-helper {
600
+ position: absolute;
601
+ z-index: 100;
602
+ border: 1px dotted black;
603
+ }
604
+ .ui-selectmenu-menu {
605
+ padding: 0;
606
+ margin: 0;
607
+ position: absolute;
608
+ top: 0;
609
+ left: 0;
610
+ display: none;
611
+ }
612
+ .ui-selectmenu-menu .ui-menu {
613
+ overflow: auto;
614
+ /* Support: IE7 */
615
+ overflow-x: hidden;
616
+ padding-bottom: 1px;
617
+ }
618
+ .ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
619
+ font-size: 1em;
620
+ font-weight: bold;
621
+ line-height: 1.5;
622
+ padding: 2px 0.4em;
623
+ margin: 0.5em 0 0 0;
624
+ height: auto;
625
+ border: 0;
626
+ }
627
+ .ui-selectmenu-open {
628
+ display: block;
629
+ }
630
+ .ui-selectmenu-button {
631
+ display: inline-block;
632
+ overflow: hidden;
633
+ position: relative;
634
+ text-decoration: none;
635
+ cursor: pointer;
636
+ }
637
+ .ui-selectmenu-button span.ui-icon {
638
+ right: 0.5em;
639
+ left: auto;
640
+ margin-top: -8px;
641
+ position: absolute;
642
+ top: 50%;
643
+ }
644
+ .ui-selectmenu-button span.ui-selectmenu-text {
645
+ text-align: left;
646
+ padding: 0.4em 2.1em 0.4em 1em;
647
+ display: block;
648
+ line-height: 1.4;
649
+ overflow: hidden;
650
+ text-overflow: ellipsis;
651
+ white-space: nowrap;
652
+ }
653
+ .ui-slider {
654
+ position: relative;
655
+ text-align: left;
656
+ }
657
+ .ui-slider .ui-slider-handle {
658
+ position: absolute;
659
+ z-index: 2;
660
+ width: 1.2em;
661
+ height: 1.2em;
662
+ cursor: default;
663
+ -ms-touch-action: none;
664
+ touch-action: none;
665
+ }
666
+ .ui-slider .ui-slider-range {
667
+ position: absolute;
668
+ z-index: 1;
669
+ font-size: .7em;
670
+ display: block;
671
+ border: 0;
672
+ background-position: 0 0;
673
+ }
674
+
675
+ /* support: IE8 - See #6727 */
676
+ .ui-slider.ui-state-disabled .ui-slider-handle,
677
+ .ui-slider.ui-state-disabled .ui-slider-range {
678
+ filter: inherit;
679
+ }
680
+
681
+ .ui-slider-horizontal {
682
+ height: .8em;
683
+ }
684
+ .ui-slider-horizontal .ui-slider-handle {
685
+ top: -.3em;
686
+ margin-left: -.6em;
687
+ }
688
+ .ui-slider-horizontal .ui-slider-range {
689
+ top: 0;
690
+ height: 100%;
691
+ }
692
+ .ui-slider-horizontal .ui-slider-range-min {
693
+ left: 0;
694
+ }
695
+ .ui-slider-horizontal .ui-slider-range-max {
696
+ right: 0;
697
+ }
698
+
699
+ .ui-slider-vertical {
700
+ width: .8em;
701
+ height: 100px;
702
+ }
703
+ .ui-slider-vertical .ui-slider-handle {
704
+ left: -.3em;
705
+ margin-left: 0;
706
+ margin-bottom: -.6em;
707
+ }
708
+ .ui-slider-vertical .ui-slider-range {
709
+ left: 0;
710
+ width: 100%;
711
+ }
712
+ .ui-slider-vertical .ui-slider-range-min {
713
+ bottom: 0;
714
+ }
715
+ .ui-slider-vertical .ui-slider-range-max {
716
+ top: 0;
717
+ }
718
+ .ui-sortable-handle {
719
+ -ms-touch-action: none;
720
+ touch-action: none;
721
+ }
722
+ .ui-spinner {
723
+ position: relative;
724
+ display: inline-block;
725
+ overflow: hidden;
726
+ padding: 0;
727
+ vertical-align: middle;
728
+ }
729
+ .ui-spinner-input {
730
+ border: none;
731
+ background: none;
732
+ color: inherit;
733
+ padding: 0;
734
+ margin: .2em 0;
735
+ vertical-align: middle;
736
+ margin-left: .4em;
737
+ margin-right: 22px;
738
+ }
739
+ .ui-spinner-button {
740
+ width: 16px;
741
+ height: 50%;
742
+ font-size: .5em;
743
+ padding: 0;
744
+ margin: 0;
745
+ text-align: center;
746
+ position: absolute;
747
+ cursor: default;
748
+ display: block;
749
+ overflow: hidden;
750
+ right: 0;
751
+ }
752
+ /* more specificity required here to override default borders */
753
+ .ui-spinner a.ui-spinner-button {
754
+ border-top: none;
755
+ border-bottom: none;
756
+ border-right: none;
757
+ }
758
+ /* vertically center icon */
759
+ .ui-spinner .ui-icon {
760
+ position: absolute;
761
+ margin-top: -8px;
762
+ top: 50%;
763
+ left: 0;
764
+ }
765
+ .ui-spinner-up {
766
+ top: 0;
767
+ }
768
+ .ui-spinner-down {
769
+ bottom: 0;
770
+ }
771
+
772
+ /* TR overrides */
773
+ .ui-spinner .ui-icon-triangle-1-s {
774
+ /* need to fix icons sprite */
775
+ background-position: -65px -16px;
776
+ }
777
+ .ui-tabs {
778
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
779
+ padding: .2em;
780
+ }
781
+ .ui-tabs .ui-tabs-nav {
782
+ margin: 0;
783
+ padding: .2em .2em 0;
784
+ }
785
+ .ui-tabs .ui-tabs-nav li {
786
+ list-style: none;
787
+ float: left;
788
+ position: relative;
789
+ top: 0;
790
+ margin: 1px .2em 0 0;
791
+ border-bottom-width: 0;
792
+ padding: 0;
793
+ white-space: nowrap;
794
+ }
795
+ .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
796
+ float: left;
797
+ padding: .5em 1em;
798
+ text-decoration: none;
799
+ }
800
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active {
801
+ margin-bottom: -1px;
802
+ padding-bottom: 1px;
803
+ }
804
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
805
+ .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
806
+ .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
807
+ cursor: text;
808
+ }
809
+ .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
810
+ cursor: pointer;
811
+ }
812
+ .ui-tabs .ui-tabs-panel {
813
+ display: block;
814
+ border-width: 0;
815
+ padding: 1em 1.4em;
816
+ background: none;
817
+ }
818
+ .ui-tooltip {
819
+ padding: 8px;
820
+ position: absolute;
821
+ z-index: 9999;
822
+ max-width: 300px;
823
+ -webkit-box-shadow: 0 0 5px #aaa;
824
+ box-shadow: 0 0 5px #aaa;
825
+ }
826
+ body .ui-tooltip {
827
+ border-width: 2px;
828
+ }
829
+
830
+ /* Component containers
831
+ ----------------------------------*/
832
+ .ui-widget {
833
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
834
+ font-size: 1.1em;
835
+ }
836
+ .ui-widget .ui-widget {
837
+ font-size: 1em;
838
+ }
839
+ .ui-widget input,
840
+ .ui-widget select,
841
+ .ui-widget textarea,
842
+ .ui-widget button {
843
+ font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;
844
+ font-size: 1em;
845
+ }
846
+ .ui-widget-content {
847
+ border: 1px solid #dddddd;
848
+ background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;
849
+ color: #333333;
850
+ }
851
+ .ui-widget-content a {
852
+ color: #333333;
853
+ }
854
+ .ui-widget-header {
855
+ border: 1px solid #e78f08;
856
+ background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;
857
+ color: #ffffff;
858
+ font-weight: bold;
859
+ }
860
+ .ui-widget-header a {
861
+ color: #ffffff;
862
+ }
863
+
864
+ /* Interaction states
865
+ ----------------------------------*/
866
+ .ui-state-default,
867
+ .ui-widget-content .ui-state-default,
868
+ .ui-widget-header .ui-state-default {
869
+ border: 1px solid #cccccc;
870
+ background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;
871
+ font-weight: bold;
872
+ color: #1c94c4;
873
+ }
874
+ .ui-state-default a,
875
+ .ui-state-default a:link,
876
+ .ui-state-default a:visited {
877
+ color: #1c94c4;
878
+ text-decoration: none;
879
+ }
880
+ .ui-state-hover,
881
+ .ui-widget-content .ui-state-hover,
882
+ .ui-widget-header .ui-state-hover,
883
+ .ui-state-focus,
884
+ .ui-widget-content .ui-state-focus,
885
+ .ui-widget-header .ui-state-focus {
886
+ border: 1px solid #fbcb09;
887
+ background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;
888
+ font-weight: bold;
889
+ color: #c77405;
890
+ }
891
+ .ui-state-hover a,
892
+ .ui-state-hover a:hover,
893
+ .ui-state-hover a:link,
894
+ .ui-state-hover a:visited,
895
+ .ui-state-focus a,
896
+ .ui-state-focus a:hover,
897
+ .ui-state-focus a:link,
898
+ .ui-state-focus a:visited {
899
+ color: #c77405;
900
+ text-decoration: none;
901
+ }
902
+ .ui-state-active,
903
+ .ui-widget-content .ui-state-active,
904
+ .ui-widget-header .ui-state-active {
905
+ border: 1px solid #fbd850;
906
+ background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;
907
+ font-weight: bold;
908
+ color: #eb8f00;
909
+ }
910
+ .ui-state-active a,
911
+ .ui-state-active a:link,
912
+ .ui-state-active a:visited {
913
+ color: #eb8f00;
914
+ text-decoration: none;
915
+ }
916
+
917
+ /* Interaction Cues
918
+ ----------------------------------*/
919
+ .ui-state-highlight,
920
+ .ui-widget-content .ui-state-highlight,
921
+ .ui-widget-header .ui-state-highlight {
922
+ border: 1px solid #fed22f;
923
+ background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;
924
+ color: #363636;
925
+ }
926
+ .ui-state-highlight a,
927
+ .ui-widget-content .ui-state-highlight a,
928
+ .ui-widget-header .ui-state-highlight a {
929
+ color: #363636;
930
+ }
931
+ .ui-state-error,
932
+ .ui-widget-content .ui-state-error,
933
+ .ui-widget-header .ui-state-error {
934
+ border: 1px solid #cd0a0a;
935
+ background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;
936
+ color: #ffffff;
937
+ }
938
+ .ui-state-error a,
939
+ .ui-widget-content .ui-state-error a,
940
+ .ui-widget-header .ui-state-error a {
941
+ color: #ffffff;
942
+ }
943
+ .ui-state-error-text,
944
+ .ui-widget-content .ui-state-error-text,
945
+ .ui-widget-header .ui-state-error-text {
946
+ color: #ffffff;
947
+ }
948
+ .ui-priority-primary,
949
+ .ui-widget-content .ui-priority-primary,
950
+ .ui-widget-header .ui-priority-primary {
951
+ font-weight: bold;
952
+ }
953
+ .ui-priority-secondary,
954
+ .ui-widget-content .ui-priority-secondary,
955
+ .ui-widget-header .ui-priority-secondary {
956
+ opacity: .7;
957
+ filter:Alpha(Opacity=70); /* support: IE8 */
958
+ font-weight: normal;
959
+ }
960
+ .ui-state-disabled,
961
+ .ui-widget-content .ui-state-disabled,
962
+ .ui-widget-header .ui-state-disabled {
963
+ opacity: .35;
964
+ filter:Alpha(Opacity=35); /* support: IE8 */
965
+ background-image: none;
966
+ }
967
+ .ui-state-disabled .ui-icon {
968
+ filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
969
+ }
970
+
971
+ /* Icons
972
+ ----------------------------------*/
973
+
974
+ /* states and images */
975
+ .ui-icon {
976
+ width: 16px;
977
+ height: 16px;
978
+ }
979
+ .ui-icon,
980
+ .ui-widget-content .ui-icon {
981
+ background-image: url("images/ui-icons_222222_256x240.png");
982
+ }
983
+ .ui-widget-header .ui-icon {
984
+ background-image: url("images/ui-icons_ffffff_256x240.png");
985
+ }
986
+ .ui-state-default .ui-icon {
987
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
988
+ }
989
+ .ui-state-hover .ui-icon,
990
+ .ui-state-focus .ui-icon {
991
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
992
+ }
993
+ .ui-state-active .ui-icon {
994
+ background-image: url("images/ui-icons_ef8c08_256x240.png");
995
+ }
996
+ .ui-state-highlight .ui-icon {
997
+ background-image: url("images/ui-icons_228ef1_256x240.png");
998
+ }
999
+ .ui-state-error .ui-icon,
1000
+ .ui-state-error-text .ui-icon {
1001
+ background-image: url("images/ui-icons_ffd27a_256x240.png");
1002
+ }
1003
+
1004
+ /* positioning */
1005
+ .ui-icon-blank { background-position: 16px 16px; }
1006
+ .ui-icon-carat-1-n { background-position: 0 0; }
1007
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
1008
+ .ui-icon-carat-1-e { background-position: -32px 0; }
1009
+ .ui-icon-carat-1-se { background-position: -48px 0; }
1010
+ .ui-icon-carat-1-s { background-position: -64px 0; }
1011
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
1012
+ .ui-icon-carat-1-w { background-position: -96px 0; }
1013
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
1014
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
1015
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
1016
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
1017
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
1018
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
1019
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
1020
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
1021
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
1022
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
1023
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
1024
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
1025
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
1026
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
1027
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
1028
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
1029
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
1030
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
1031
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
1032
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
1033
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
1034
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
1035
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
1036
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
1037
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
1038
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
1039
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
1040
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
1041
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
1042
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
1043
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
1044
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
1045
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
1046
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
1047
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
1048
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
1049
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1050
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1051
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1052
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1053
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1054
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1055
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1056
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1057
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1058
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1059
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1060
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1061
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1062
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1063
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1064
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1065
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1066
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1067
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1068
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1069
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1070
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
1071
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1072
+ .ui-icon-extlink { background-position: -32px -80px; }
1073
+ .ui-icon-newwin { background-position: -48px -80px; }
1074
+ .ui-icon-refresh { background-position: -64px -80px; }
1075
+ .ui-icon-shuffle { background-position: -80px -80px; }
1076
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
1077
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1078
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
1079
+ .ui-icon-folder-open { background-position: -16px -96px; }
1080
+ .ui-icon-document { background-position: -32px -96px; }
1081
+ .ui-icon-document-b { background-position: -48px -96px; }
1082
+ .ui-icon-note { background-position: -64px -96px; }
1083
+ .ui-icon-mail-closed { background-position: -80px -96px; }
1084
+ .ui-icon-mail-open { background-position: -96px -96px; }
1085
+ .ui-icon-suitcase { background-position: -112px -96px; }
1086
+ .ui-icon-comment { background-position: -128px -96px; }
1087
+ .ui-icon-person { background-position: -144px -96px; }
1088
+ .ui-icon-print { background-position: -160px -96px; }
1089
+ .ui-icon-trash { background-position: -176px -96px; }
1090
+ .ui-icon-locked { background-position: -192px -96px; }
1091
+ .ui-icon-unlocked { background-position: -208px -96px; }
1092
+ .ui-icon-bookmark { background-position: -224px -96px; }
1093
+ .ui-icon-tag { background-position: -240px -96px; }
1094
+ .ui-icon-home { background-position: 0 -112px; }
1095
+ .ui-icon-flag { background-position: -16px -112px; }
1096
+ .ui-icon-calendar { background-position: -32px -112px; }
1097
+ .ui-icon-cart { background-position: -48px -112px; }
1098
+ .ui-icon-pencil { background-position: -64px -112px; }
1099
+ .ui-icon-clock { background-position: -80px -112px; }
1100
+ .ui-icon-disk { background-position: -96px -112px; }
1101
+ .ui-icon-calculator { background-position: -112px -112px; }
1102
+ .ui-icon-zoomin { background-position: -128px -112px; }
1103
+ .ui-icon-zoomout { background-position: -144px -112px; }
1104
+ .ui-icon-search { background-position: -160px -112px; }
1105
+ .ui-icon-wrench { background-position: -176px -112px; }
1106
+ .ui-icon-gear { background-position: -192px -112px; }
1107
+ .ui-icon-heart { background-position: -208px -112px; }
1108
+ .ui-icon-star { background-position: -224px -112px; }
1109
+ .ui-icon-link { background-position: -240px -112px; }
1110
+ .ui-icon-cancel { background-position: 0 -128px; }
1111
+ .ui-icon-plus { background-position: -16px -128px; }
1112
+ .ui-icon-plusthick { background-position: -32px -128px; }
1113
+ .ui-icon-minus { background-position: -48px -128px; }
1114
+ .ui-icon-minusthick { background-position: -64px -128px; }
1115
+ .ui-icon-close { background-position: -80px -128px; }
1116
+ .ui-icon-closethick { background-position: -96px -128px; }
1117
+ .ui-icon-key { background-position: -112px -128px; }
1118
+ .ui-icon-lightbulb { background-position: -128px -128px; }
1119
+ .ui-icon-scissors { background-position: -144px -128px; }
1120
+ .ui-icon-clipboard { background-position: -160px -128px; }
1121
+ .ui-icon-copy { background-position: -176px -128px; }
1122
+ .ui-icon-contact { background-position: -192px -128px; }
1123
+ .ui-icon-image { background-position: -208px -128px; }
1124
+ .ui-icon-video { background-position: -224px -128px; }
1125
+ .ui-icon-script { background-position: -240px -128px; }
1126
+ .ui-icon-alert { background-position: 0 -144px; }
1127
+ .ui-icon-info { background-position: -16px -144px; }
1128
+ .ui-icon-notice { background-position: -32px -144px; }
1129
+ .ui-icon-help { background-position: -48px -144px; }
1130
+ .ui-icon-check { background-position: -64px -144px; }
1131
+ .ui-icon-bullet { background-position: -80px -144px; }
1132
+ .ui-icon-radio-on { background-position: -96px -144px; }
1133
+ .ui-icon-radio-off { background-position: -112px -144px; }
1134
+ .ui-icon-pin-w { background-position: -128px -144px; }
1135
+ .ui-icon-pin-s { background-position: -144px -144px; }
1136
+ .ui-icon-play { background-position: 0 -160px; }
1137
+ .ui-icon-pause { background-position: -16px -160px; }
1138
+ .ui-icon-seek-next { background-position: -32px -160px; }
1139
+ .ui-icon-seek-prev { background-position: -48px -160px; }
1140
+ .ui-icon-seek-end { background-position: -64px -160px; }
1141
+ .ui-icon-seek-start { background-position: -80px -160px; }
1142
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1143
+ .ui-icon-seek-first { background-position: -80px -160px; }
1144
+ .ui-icon-stop { background-position: -96px -160px; }
1145
+ .ui-icon-eject { background-position: -112px -160px; }
1146
+ .ui-icon-volume-off { background-position: -128px -160px; }
1147
+ .ui-icon-volume-on { background-position: -144px -160px; }
1148
+ .ui-icon-power { background-position: 0 -176px; }
1149
+ .ui-icon-signal-diag { background-position: -16px -176px; }
1150
+ .ui-icon-signal { background-position: -32px -176px; }
1151
+ .ui-icon-battery-0 { background-position: -48px -176px; }
1152
+ .ui-icon-battery-1 { background-position: -64px -176px; }
1153
+ .ui-icon-battery-2 { background-position: -80px -176px; }
1154
+ .ui-icon-battery-3 { background-position: -96px -176px; }
1155
+ .ui-icon-circle-plus { background-position: 0 -192px; }
1156
+ .ui-icon-circle-minus { background-position: -16px -192px; }
1157
+ .ui-icon-circle-close { background-position: -32px -192px; }
1158
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1159
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1160
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1161
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1162
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1163
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1164
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1165
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1166
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
1167
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
1168
+ .ui-icon-circle-check { background-position: -208px -192px; }
1169
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1170
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1171
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
1172
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1173
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1174
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
1175
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1176
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1177
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1178
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1179
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1180
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1181
+
1182
+
1183
+ /* Misc visuals
1184
+ ----------------------------------*/
1185
+
1186
+ /* Corner radius */
1187
+ .ui-corner-all,
1188
+ .ui-corner-top,
1189
+ .ui-corner-left,
1190
+ .ui-corner-tl {
1191
+ border-top-left-radius: 4px;
1192
+ }
1193
+ .ui-corner-all,
1194
+ .ui-corner-top,
1195
+ .ui-corner-right,
1196
+ .ui-corner-tr {
1197
+ border-top-right-radius: 4px;
1198
+ }
1199
+ .ui-corner-all,
1200
+ .ui-corner-bottom,
1201
+ .ui-corner-left,
1202
+ .ui-corner-bl {
1203
+ border-bottom-left-radius: 4px;
1204
+ }
1205
+ .ui-corner-all,
1206
+ .ui-corner-bottom,
1207
+ .ui-corner-right,
1208
+ .ui-corner-br {
1209
+ border-bottom-right-radius: 4px;
1210
+ }
1211
+
1212
+ /* Overlays */
1213
+ .ui-widget-overlay {
1214
+ background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;
1215
+ opacity: .5;
1216
+ filter: Alpha(Opacity=50); /* support: IE8 */
1217
+ }
1218
+ .ui-widget-shadow {
1219
+ margin: -5px 0 0 -5px;
1220
+ padding: 5px;
1221
+ background: #000000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;
1222
+ opacity: .2;
1223
+ filter: Alpha(Opacity=20); /* support: IE8 */
1224
+ border-radius: 5px;
1225
+ }
css/loftloader-animation.css ADDED
@@ -0,0 +1,817 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Description: Controls the styles for LoftLoader, including loading animation and ending animation.
3
+ */
4
+
5
+
6
+ /* ==========================================================================
7
+ Basics
8
+ ========================================================================== */
9
+
10
+ #loftloader-wrapper {
11
+ position: fixed;
12
+ top: 0;
13
+ left: 0;
14
+ z-index: 1000;
15
+ width: 100%;
16
+ height: 100%;
17
+ }
18
+
19
+ .loaded #loftloader-wrapper {
20
+ width: 0;
21
+ height: 0;
22
+ visibility: hidden;
23
+ pointer-events: none;
24
+ overflow: hidden;
25
+ transition: all;
26
+ transition-delay: 1s;
27
+ }
28
+
29
+ .loaded #loftloader-wrapper.slide-vertical {
30
+ -webkit-transform: translate(-100%, 0);
31
+ -ms-transform: translate(-100%, 0);
32
+ transform: translate(-100%, 0);
33
+ }
34
+
35
+ #loftloader-wrapper .loader-inner {
36
+ position: absolute;
37
+ top: 50%;
38
+ left: 50%;
39
+ -webkit-transform: translate(-50%, -50%);
40
+ -ms-transform: translate(-50%, -50%);
41
+ transform: translate(-50%, -50%);
42
+ z-index: 1001;
43
+ text-align: center;
44
+ }
45
+
46
+ #loftloader-wrapper #loader {
47
+ position: relative;
48
+ z-index: 1002;
49
+ }
50
+
51
+
52
+ /* ==========================================================================
53
+ Loading - Spinning Sun
54
+ ========================================================================== */
55
+
56
+ #loftloader-wrapper.pl-sun #loader {
57
+ position: relative;
58
+ width: 50px;
59
+ height: 50px;
60
+ }
61
+
62
+ #loftloader-wrapper.pl-sun #loader span {
63
+ position: absolute;
64
+ top: 0;
65
+ left: 0;
66
+ display: block;
67
+ width: 50px;
68
+ height: 50px;
69
+ background: #248ACC;
70
+ opacity: 0.9;
71
+ transform-origin: 50% 50%;
72
+ -webkit-animation: spinReturn 4s ease infinite;
73
+ animation: spinReturn 4s ease infinite;
74
+ }
75
+
76
+ #loftloader-wrapper.pl-sun #loader span:before {
77
+ position: absolute;
78
+ top: 0;
79
+ left: 0;
80
+ display: block;
81
+ width: 100%;
82
+ height: 100%;
83
+ background: #248ACC;
84
+ opacity: 0.9;
85
+ content: '';
86
+ transform-origin: 50% 50%;
87
+ -webkit-transform: rotate(45deg);
88
+ -ms-transform: rotate(45deg);
89
+ transform: rotate(45deg);
90
+ }
91
+
92
+
93
+ /* ==========================================================================
94
+ Loading - Luminous Circles
95
+ ========================================================================== */
96
+
97
+ #loftloader-wrapper.pl-circles #loader {
98
+ position: relative;
99
+ width: 100px;
100
+ height: 60px;
101
+ }
102
+
103
+ #loftloader-wrapper.pl-circles #loader span,
104
+ #loftloader-wrapper.pl-circles #loader:before,
105
+ #loftloader-wrapper.pl-circles #loader:after {
106
+ position: absolute;
107
+ display: block;
108
+ width: 10px;
109
+ height: 10px;
110
+ border-radius: 50%;
111
+ opacity: 0.2;
112
+ background: #248ACC;
113
+ }
114
+
115
+ #loftloader-wrapper.pl-circles #loader span {
116
+ top: 50%;
117
+ left: 50%;
118
+ -webkit-transform: translate(-50%, -50%);
119
+ -ms-transform: translate(-50%, -50%);
120
+ transform: translate(-50%, -50%);
121
+ -webkit-animation: lightUp 1.5s linear infinite 0.5s;
122
+ animation: lightUp 1.5s linear infinite 0.5s;
123
+ }
124
+
125
+ #loftloader-wrapper.pl-circles #loader:before,
126
+ #loftloader-wrapper.pl-circles #loader:after {
127
+ content: "";
128
+ }
129
+
130
+ #loftloader-wrapper.pl-circles #loader:before {
131
+ top: 50%;
132
+ left: 0;
133
+ -webkit-transform: translate(0, -50%);
134
+ -ms-transform: translate(0, -50%);
135
+ transform: translate(0, -50%);
136
+ -webkit-animation: lightUp 1.5s linear infinite;
137
+ animation: lightUp 1.5s linear infinite;
138
+ }
139
+
140
+ #loftloader-wrapper.pl-circles #loader:after {
141
+ top: 50%;
142
+ right: 0;
143
+ -webkit-transform: translate(0, -50%);
144
+ -ms-transform: translate(0, -50%);
145
+ transform: translate(0, -50%);
146
+ -webkit-animation: lightUp 1.5s linear infinite 1s;
147
+ animation: lightUp 1.5s linear infinite 1s;
148
+ }
149
+
150
+ @-webkit-keyframes lightUp {
151
+ 0% {
152
+ opacity: 0.2;
153
+ }
154
+ 40% {
155
+ opacity: 1;
156
+ }
157
+ 60% {
158
+ opacity: 0.2;
159
+ }
160
+ 100% {
161
+ opacity: 0.2;
162
+ }
163
+ }
164
+
165
+ @keyframes lightUp {
166
+ 0% {
167
+ opacity: 0.2;
168
+ }
169
+ 40% {
170
+ opacity: 1;
171
+ }
172
+ 60% {
173
+ opacity: 0.2;
174
+ }
175
+ 100% {
176
+ opacity: 0.2;
177
+ }
178
+ }
179
+
180
+
181
+ /* ==========================================================================
182
+ Loading - Wave
183
+ ========================================================================== */
184
+
185
+ #loftloader-wrapper.pl-wave #loader {
186
+ position: relative;
187
+ width: 50px;
188
+ height: 30px;
189
+ }
190
+
191
+ #loftloader-wrapper.pl-wave #loader span,
192
+ #loftloader-wrapper.pl-wave #loader:before,
193
+ #loftloader-wrapper.pl-wave #loader:after {
194
+ position: absolute;
195
+ display: block;
196
+ width: 6px;
197
+ height: 100%;
198
+ background: #248ACC;
199
+ }
200
+
201
+ #loftloader-wrapper.pl-wave #loader span {
202
+ top: 50%;
203
+ left: 50%;
204
+ -webkit-transform: translate(-50%, -50%);
205
+ -ms-transform: translate(-50%, -50%);
206
+ transform: translate(-50%, -50%);
207
+ -webkit-animation: wave 0.9s linear infinite 0.3s;
208
+ animation: wave 0.9s linear infinite 0.3s;
209
+ }
210
+
211
+ #loftloader-wrapper.pl-wave #loader:before,
212
+ #loftloader-wrapper.pl-wave #loader:after {
213
+ content: "";
214
+ }
215
+
216
+ #loftloader-wrapper.pl-wave #loader:before {
217
+ top: 50%;
218
+ left: 0;
219
+ -webkit-transform: translate(0, -50%);
220
+ -ms-transform: translate(0, -50%);
221
+ transform: translate(0, -50%);
222
+ -webkit-animation: wave 0.9s linear infinite;
223
+ animation: wave 0.9s linear infinite;
224
+ }
225
+
226
+ #loftloader-wrapper.pl-wave #loader:after {
227
+ top: 50%;
228
+ right: 0;
229
+ -webkit-transform: translate(0, -50%);
230
+ -ms-transform: translate(0, -50%);
231
+ transform: translate(0, -50%);
232
+ -webkit-animation: wave 0.9s linear infinite 0.6s;
233
+ animation: wave 0.9s linear infinite 0.6s;
234
+ }
235
+
236
+ @-webkit-keyframes wave {
237
+ 0% {
238
+ height: 100%
239
+ }
240
+ 40% {
241
+ height: 10%;
242
+ }
243
+ 80% {
244
+ height: 100%;
245
+ }
246
+ 100% {
247
+ height: 100%;
248
+ }
249
+ }
250
+
251
+ @keyframes wave {
252
+ 0% {
253
+ height: 100%
254
+ }
255
+ 40% {
256
+ height: 10%;
257
+ }
258
+ 80% {
259
+ height: 100%;
260
+ }
261
+ 100% {
262
+ height: 100%;
263
+ }
264
+ }
265
+
266
+
267
+ /* ==========================================================================
268
+ Loading - Spinning Square
269
+ ========================================================================== */
270
+
271
+ #loftloader-wrapper.pl-square #loader {
272
+ position: relative;
273
+ width: 50px;
274
+ height: 50px;
275
+ transform-origin: 50% 50%;
276
+ -webkit-animation: spinReturn 4s ease infinite;
277
+ animation: spinReturn 4s ease infinite;
278
+ }
279
+
280
+ #loftloader-wrapper.pl-square #loader span {
281
+ position: absolute;
282
+ top: 0;
283
+ left: 0;
284
+ display: block;
285
+ width: 100%;
286
+ height: 100%;
287
+ border: 4px solid #248ACC;
288
+ transform-origin: 50% 50%;
289
+ -webkit-transform: rotate(45deg);
290
+ -ms-transform: rotate(45deg);
291
+ transform: rotate(45deg);
292
+ }
293
+
294
+ @-webkit-keyframes spinReturn {
295
+ 0% {
296
+ -webkit-transform: rotate(0deg);
297
+ }
298
+ 25% {
299
+ -webkit-transform: rotate(225deg);
300
+ }
301
+ 50% {
302
+ -webkit-transform: rotate(180deg);
303
+ }
304
+ 75% {
305
+ -webkit-transform: rotate(405deg);
306
+ }
307
+ 100% {
308
+ -webkit-transform: rotate(360deg);
309
+ }
310
+ }
311
+
312
+ @keyframes spinReturn {
313
+ 0% {
314
+ transform: rotate(0deg);
315
+ }
316
+ 25% {
317
+ transform: rotate(225deg);
318
+ }
319
+ 50% {
320
+ transform: rotate(180deg);
321
+ }
322
+ 75% {
323
+ transform: rotate(405deg);
324
+ }
325
+ 100% {
326
+ transform: rotate(360deg);
327
+ }
328
+ }
329
+
330
+
331
+ /* ==========================================================================
332
+ Loading - Drawing Frame
333
+ ========================================================================== */
334
+
335
+ #loftloader-wrapper.pl-frame #loader {
336
+ position: relative;
337
+ width: 80px;
338
+ height: 80px;
339
+ }
340
+
341
+ #loftloader-wrapper.pl-frame #loader span {
342
+ position: absolute;
343
+ top: 0;
344
+ left: 0;
345
+ display: block;
346
+ width: 100%;
347
+ height: 100%;
348
+ }
349
+
350
+ #loftloader-wrapper.pl-frame #loader img {
351
+ position: absolute;
352
+ top: 50%;
353
+ left: 50%;
354
+ display: block;
355
+ max-width: 80%;
356
+ max-height: 80%;
357
+ -webkit-transform: translate(-50%, -50%);
358
+ -ms-transform: translate(-50%, -50%);
359
+ transform: translate(-50%, -50%);
360
+ }
361
+
362
+ #loftloader-wrapper.pl-frame #loader:before {
363
+ position: absolute;
364
+ top: 0;
365
+ right: 0;
366
+ left: auto;
367
+ width: 100%;
368
+ height: 4px;
369
+ background: #248ACC;
370
+ content: "";
371
+ -webkit-animation: drawframeTop 4s linear infinite;
372
+ animation: drawframeTop 4s linear infinite;
373
+ }
374
+
375
+ #loftloader-wrapper.pl-frame #loader:after {
376
+ position: absolute;
377
+ right: auto;
378
+ bottom: 0;
379
+ left: 0;
380
+ width: 100%;
381
+ height: 4px;
382
+ background: #248ACC;
383
+ content: "";
384
+ -webkit-animation: drawframeBottom 4s linear infinite 1s;
385
+ animation: drawframeBottom 4s linear infinite 1s;
386
+ }
387
+
388
+ #loftloader-wrapper.pl-frame #loader span:before {
389
+ position: absolute;
390
+ top: auto;
391
+ right: 0;
392
+ bottom: 0;
393
+ width: 4px;
394
+ height: 100%;
395
+ background: #248ACC;
396
+ content: "";
397
+ -webkit-animation: drawframeRight 4s linear infinite 0.5s;
398
+ animation: drawframeRight 4s linear infinite 0.5s;
399
+ }
400
+
401
+ #loftloader-wrapper.pl-frame #loader span:after {
402
+ position: absolute;
403
+ top: 0;
404
+ bottom: auto;
405
+ left: 0;
406
+ width: 4px;
407
+ height: 100%;
408
+ background: #248ACC;
409
+ content: "";
410
+ -webkit-animation: drawframeLeft 4s linear infinite 1.5s;
411
+ animation: drawframeLeft 4s linear infinite 1.5s;
412
+ }
413
+
414
+ @-webkit-keyframes drawframeTop {
415
+ 0% {
416
+ right: 0;
417
+ left: auto;
418
+ width: 100%;
419
+ }
420
+ 12.5% {
421
+ right: 0;
422
+ left: auto;
423
+ width: 0%;
424
+ }
425
+ 50% {
426
+ right: auto;
427
+ left: 0;
428
+ width: 0%;
429
+ }
430
+ 62.5% {
431
+ right: auto;
432
+ left: 0;
433
+ width: 100%;
434
+ }
435
+ 100% {
436
+ right: auto;
437
+ left: 0;
438
+ width: 100%;
439
+ }
440
+ }
441
+
442
+ @keyframes drawframeTop {
443
+ 0% {
444
+ right: 0;
445
+ left: auto;
446
+ width: 100%;
447
+ }
448
+ 12.5% {
449
+ right: 0;
450
+ left: auto;
451
+ width: 0%;
452
+ }
453
+ 50% {
454
+ right: auto;
455
+ left: 0;
456
+ width: 0%;
457
+ }
458
+ 62.5% {
459
+ right: auto;
460
+ left: 0;
461
+ width: 100%;
462
+ }
463
+ 100% {
464
+ right: auto;
465
+ left: 0;
466
+ width: 100%;
467
+ }
468
+ }
469
+
470
+ @-webkit-keyframes drawframeBottom {
471
+ 0% {
472
+ right: auto;
473
+ left: 0;
474
+ width: 100%;
475
+ }
476
+ 12.5% {
477
+ right: auto;
478
+ left: 0;
479
+ width: 0%;
480
+ }
481
+ 50% {
482
+ right: 0;
483
+ left: auto;
484
+ width: 0%;
485
+ }
486
+ 62.5% {
487
+ right: 0;
488
+ left: auto;
489
+ width: 100%;
490
+ }
491
+ 100% {
492
+ right: 0;
493
+ left: auto;
494
+ width: 100%;
495
+ }
496
+ }
497
+
498
+ @keyframes drawframeBottom {
499
+ 0% {
500
+ right: auto;
501
+ left: 0;
502
+ width: 100%;
503
+ }
504
+ 12.5% {
505
+ right: auto;
506
+ left: 0;
507
+ width: 0%;
508
+ }
509
+ 50% {
510
+ right: 0;
511
+ left: auto;
512
+ width: 0%;
513
+ }
514
+ 62.5% {
515
+ right: 0;
516
+ left: auto;
517
+ width: 100%;
518
+ }
519
+ 100% {
520
+ right: 0;
521
+ left: auto;
522
+ width: 100%;
523
+ }
524
+ }
525
+
526
+ @-webkit-keyframes drawframeRight {
527
+ 0% {
528
+ top: auto;
529
+ bottom: 0;
530
+ height: 100%;
531
+ }
532
+ 12.5% {
533
+ top: auto;
534
+ bottom: 0;
535
+ height: 0%;
536
+ }
537
+ 50% {
538
+ top: 0;
539
+ bottom: auto;
540
+ height: 0%;
541
+ }
542
+ 62.5% {
543
+ top: 0;
544
+ bottom: auto;
545
+ height: 100%;
546
+ }
547
+ 100% {
548
+ top: 0;
549
+ bottom: auto;
550
+ height: 100%;
551
+ }
552
+ }
553
+
554
+ @keyframes drawframeRight {
555
+ 0% {
556
+ top: auto;
557
+ bottom: 0;
558
+ height: 100%;
559
+ }
560
+ 12.5% {
561
+ top: auto;
562
+ bottom: 0;
563
+ height: 0%;
564
+ }
565
+ 50% {
566
+ top: 0;
567
+ bottom: auto;
568
+ height: 0%;
569
+ }
570
+ 62.5% {
571
+ top: 0;
572
+ bottom: auto;
573
+ height: 100%;
574
+ }
575
+ 100% {
576
+ top: 0;
577
+ bottom: auto;
578
+ height: 100%;
579
+ }
580
+ }
581
+
582
+ @-webkit-keyframes drawframeLeft {
583
+ 0% {
584
+ top: 0;
585
+ bottom: auto;
586
+ height: 100%;
587
+ }
588
+ 12.5% {
589
+ top: 0;
590
+ bottom: auto;
591
+ height: 0%;
592
+ }
593
+ 50% {
594
+ top: auto;
595
+ bottom: 0;
596
+ height: 0%;
597
+ }
598
+ 62.5% {
599
+ top: auto;
600
+ bottom: 0;
601
+ height: 100%;
602
+ }
603
+ 100% {
604
+ top: auto;
605
+ bottom: 0;
606
+ height: 100%;
607
+ }
608
+ }
609
+
610
+ @keyframes drawframeLeft {
611
+ 0% {
612
+ top: 0;
613
+ bottom: auto;
614
+ height: 100%;
615
+ }
616
+ 12.5% {
617
+ top: 0;
618
+ bottom: auto;
619
+ height: 0%;
620
+ }
621
+ 50% {
622
+ top: auto;
623
+ bottom: 0;
624
+ height: 0%;
625
+ }
626
+ 62.5% {
627
+ top: auto;
628
+ bottom: 0;
629
+ height: 100%;
630
+ }
631
+ 100% {
632
+ top: auto;
633
+ bottom: 0;
634
+ height: 100%;
635
+ }
636
+ }
637
+
638
+
639
+ /* ==========================================================================
640
+ Loading - Loading Custom Image
641
+ ========================================================================== */
642
+
643
+ #loftloader-wrapper.pl-imgloading #loader {
644
+ position: relative;
645
+ width: auto;
646
+ height: auto;
647
+ max-width: 200px;
648
+ }
649
+
650
+ #loftloader-wrapper.pl-imgloading #loader img {
651
+ position: relative;
652
+ z-index: 1;
653
+ display: block;
654
+ width: 100%;
655
+ height: auto;
656
+ opacity: 0.3;
657
+ }
658
+
659
+ #loftloader-wrapper.pl-imgloading #loader span {
660
+ position: absolute;
661
+ bottom: 0;
662
+ left: 0;
663
+ z-index: 3;
664
+ display: block;
665
+ width: 100%;
666
+ height: 0%;
667
+ background-position: center bottom;
668
+ background-repeat: no-repeat;
669
+ background-size: cover;
670
+ -webkit-animation: imgLoading 6s linear infinite;
671
+ animation: imgLoading 6s linear infinite;
672
+ transition: 0s;
673
+ }
674
+
675
+ @-webkit-keyframes imgLoading {
676
+ 0% {
677
+ width: 100%;
678
+ height: 0%;
679
+ opacity: 1;
680
+ }
681
+ 95% {
682
+ width: 100%;
683
+ height: 100%;
684
+ opacity: 1;
685
+ }
686
+
687
+ 100% {
688
+ width: 100%;
689
+ height: 100%;
690
+ opacity: 0;
691
+ }
692
+ }
693
+
694
+ @keyframes imgLoading {
695
+ 0% {
696
+ width: 100%;
697
+ height: 0%;
698
+ opacity: 1;
699
+ }
700
+ 95% {
701
+ width: 100%;
702
+ height: 100%;
703
+ opacity: 1;
704
+ }
705
+
706
+ 100% {
707
+ width: 100%;
708
+ height: 100%;
709
+ opacity: 0;
710
+ }
711
+ }
712
+
713
+
714
+ /**
715
+ * Hide the preloader elements after the page content has been loaded.
716
+ */
717
+
718
+ .loaded #loader {
719
+ opacity: 0;
720
+ transition: all 0.3s ease-out;
721
+ }
722
+
723
+
724
+ /* ==========================================================================
725
+ Background and Ending
726
+ ========================================================================== */
727
+
728
+ #loftloader-wrapper .loader-section {
729
+ position: fixed;
730
+ top: 0;
731
+ z-index: 1000;
732
+ background: #000;
733
+ width: 50%;
734
+ height: 100%;
735
+ opacity: 0.95;
736
+ }
737
+
738
+ #loftloader-wrapper .loader-section.section-left {
739
+ left: 0;
740
+ transition: all 0s;
741
+ will-change: transform;
742
+ }
743
+
744
+ .loaded #loftloader-wrapper .loader-section.section-left {
745
+ -webkit-transform: translateX(-100%);
746
+ -ms-transform: translateX(-100%);
747
+ transform: translateX(-100%);
748
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
749
+ }
750
+
751
+ #loftloader-wrapper .loader-section.section-right {
752
+ right: 0;
753
+ transition: all 0s;
754
+ will-change: transform;
755
+ }
756
+
757
+ .loaded #loftloader-wrapper .loader-section.section-right {
758
+ -webkit-transform: translateX(100%);
759
+ -ms-transform: translateX(100%);
760
+ transform: translateX(100%);
761
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
762
+ }
763
+
764
+ #loftloader-wrapper .loader-section.section-up {
765
+ width: 100%;
766
+ height: 50%;
767
+ transition: all 0s;
768
+ will-change: transform;
769
+ }
770
+
771
+ .loaded #loftloader-wrapper .loader-section.section-up {
772
+ -webkit-transform: translateY(-100%);
773
+ -ms-transform: translateY(-100%);
774
+ transform: translateY(-100%);
775
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
776
+ }
777
+
778
+ #loftloader-wrapper .loader-section.section-down {
779
+ top: auto;
780
+ bottom: 0;
781
+ left: 0;
782
+ width: 100%;
783
+ height: 50%;
784
+ transition: all 0s;
785
+ will-change: transform;
786
+ }
787
+
788
+ .loaded #loftloader-wrapper .loader-section.section-down {
789
+ -webkit-transform: translateY(100%);
790
+ -ms-transform: translateY(100%);
791
+ transform: translateY(100%);
792
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
793
+ }
794
+
795
+ #loftloader-wrapper .loader-section.section-fade {
796
+ width: 100%;
797
+ transition: all 0s;
798
+ will-change: opacity;
799
+ }
800
+
801
+ .loaded #loftloader-wrapper .loader-section.section-fade {
802
+ opacity: 0 !important;
803
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
804
+ }
805
+
806
+ #loftloader-wrapper .loader-section.section-slide-up {
807
+ width: 100%;
808
+ transition: all 0s;
809
+ will-change: transform;
810
+ }
811
+
812
+ .loaded #loftloader-wrapper .loader-section.section-slide-up {
813
+ -webkit-transform: translateY(-100%);
814
+ -ms-transform: translateY(-100%);
815
+ transform: translateY(-100%);
816
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
817
+ }
css/settings/loftloader-media.css ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Description: Hide some widgets of WP Media Panel for use in LoftLoader
3
+ */
4
+
5
+ #loftloader-image-uploader .media-frame-content,
6
+ #loftloader-image-uploader .media-frame-router,
7
+ #loftloader-image-uploader .media-frame-title,
8
+ #loftloader-image-uploader .media-frame-toolbar {
9
+ left: 0;
10
+ }
11
+
12
+ #loftloader-image-uploader .media-frame-menu,
13
+ #loftloader-image-uploader .media-toolbar-secondary,
14
+ #loftloader-image-uploader .attachment-details,
15
+ #loftloader-image-uploader .attachment-display-settings h3 ~ .setting,
16
+ #loftloader-image-uploader .attachment-display-settings h2 ~ .setting {
17
+ display: none;
18
+ }
19
+
20
+ #loftloader-image-uploader .attachment-display-settings h3 ~ .setting:last-child,
21
+ #loftloader-image-uploader .attachment-display-settings h2 ~ .setting:last-child {
22
+ display: block;
23
+ }
css/settings/loftloader-settings.css ADDED
@@ -0,0 +1,536 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Description: Controls the layouts and styles of LoftLoader settings page.
3
+ */
4
+
5
+ /**
6
+ * Table of Contents:
7
+ *
8
+ * 1.0 - Basics
9
+ *
10
+ * 2.0 - Panel Footer
11
+ *
12
+ * 3.0 - Panel Content
13
+ *
14
+ * 4.0 - Restyle UI Slider
15
+ *
16
+ * 5.0 - Restyle Color Picker
17
+ *
18
+ * 6.0 - Loader Preview Freame
19
+ *
20
+ * 7.0 - Lodaer Preview Frame - Background and Ending
21
+ *
22
+ * 8.0 - Media Queries
23
+ */
24
+
25
+
26
+ /* ==========================================================================
27
+ 1.0 Basics
28
+ ========================================================================== */
29
+
30
+ .loftloader-options-panel {
31
+ position: relative;
32
+ padding: 20px;
33
+ box-sizing: border-box;
34
+ overflow: auto;
35
+ font-size: 13px;
36
+ }
37
+
38
+ .loftloader-options-panel * {
39
+ margin: 0 auto;
40
+ padding: 0;
41
+ box-sizing: border-box;
42
+ }
43
+
44
+ h1.loftloader-option-section-title {
45
+ position: relative;
46
+ margin-bottom: 24px;
47
+ border-bottom: 1px solid #CCC;
48
+ padding-bottom: 20px;
49
+ }
50
+
51
+ .loftloader-option-section-title:after {
52
+ position: absolute;
53
+ bottom: -2px;
54
+ left: 0;
55
+ display: block;
56
+ width: 100%;
57
+ height: 1px;
58
+ background: #FFF;
59
+ content: "";
60
+ }
61
+
62
+ .loftloader-options-panel .bg-img-holder {
63
+ display: inline-block;
64
+ background: rgba(0, 0, 0, 0.1);
65
+ border: 1px solid rgba(0, 0, 0, 0.05);
66
+ margin-right: 12px;
67
+ cursor: pointer;
68
+ }
69
+
70
+ .loftloader-options-panel .bg-img-holder:hover {
71
+ border-color: #248ACC;
72
+ }
73
+
74
+ .loftloader-options-panel .bg-img-remove {
75
+ display: inline-block;
76
+ cursor: pointer;
77
+ color: #248ACC;
78
+ }
79
+
80
+ .loftloader-options-panel .bg-img-remove:hover {
81
+ text-decoration: underline;
82
+ }
83
+
84
+ .loftloader-options-panel .bg-img-holder img {
85
+ display: block;
86
+ width: auto;
87
+ height: auto;
88
+ max-width: 120px;
89
+ max-height: 120px;
90
+ margin-left: 0;
91
+ }
92
+
93
+ .loftloader-options-panel input[type="text"],
94
+ .loftloader-options-panel input[type="number"] {
95
+ width: 80px;
96
+ padding: 3px 10px;
97
+ }
98
+
99
+ /**
100
+ * Hide elements.
101
+ */
102
+
103
+ .loftloader-options-panel .hide {
104
+ display: none !important;
105
+ }
106
+
107
+
108
+ /* ==========================================================================
109
+ 2.0 Panel Footer
110
+ ========================================================================== */
111
+
112
+ .loftloader-options-panel .panel-footer {
113
+ position: relative;
114
+ overflow: hidden;
115
+ margin: 0;
116
+ padding: 24px 0;
117
+ border-top: 1px solid #CCC;
118
+ }
119
+
120
+ .loftloader-options-panel .panel-footer:before {
121
+ position: absolute;
122
+ top: 0;
123
+ left: 0;
124
+ display: block;
125
+ width: 100%;
126
+ height: 1px;
127
+ background: #FFF;
128
+ content: "";
129
+ }
130
+
131
+ .loftloader-options-panel .panel-footer p.submit {
132
+ float: right;
133
+ margin: 0;
134
+ padding: 0;
135
+ }
136
+
137
+ .loftloader-options-panel .panel-footer p.reset {
138
+ float: left;
139
+ margin: 0;
140
+ }
141
+
142
+
143
+ /* ==========================================================================
144
+ 3.0 Panel Content
145
+ ========================================================================== */
146
+
147
+ .loftloader-options-panel .setting-group {
148
+ margin-bottom: 30px;
149
+ background: #FFF;
150
+ border: 1px solid #DDD;
151
+ border-radius: 5px;
152
+ box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.05);
153
+ }
154
+
155
+ .loftloader-options-panel .setting-group h3 {
156
+ margin: 0;
157
+ padding: 10px 20px;
158
+ background: rgba(0, 0, 0, 0.03);
159
+ border-bottom: 1px solid #DDD;
160
+ border-top-left-radius: 5px;
161
+ border-top-right-radius: 5px;
162
+ }
163
+
164
+ .loftloader-options-panel ul {
165
+ margin-left: 0;
166
+ padding: 24px 20px;
167
+ list-style: none;
168
+ }
169
+
170
+ .loftloader-options-panel ul li {
171
+ position: relative;
172
+ display: block;
173
+ margin: 0;
174
+ overflow: hidden;
175
+ }
176
+
177
+ .loftloader-options-panel ul.form-list li:after {
178
+ position: relative;
179
+ display: block;
180
+ clear: both;
181
+ content: "";
182
+ }
183
+
184
+ .loftloader-options-panel ul.form-list li .list-title,
185
+ .loftloader-options-panel ul.form-list li .list-content {
186
+ float: left;
187
+ width: 50%;
188
+ }
189
+
190
+ .loftloader-options-panel ul.form-list li .list-title {
191
+ padding-right: 50px;
192
+ }
193
+
194
+ .loftloader-options-panel ul.form-list li .list-title h4 {
195
+ margin: 0;
196
+ font-size: 14px;
197
+ line-height: 28px;
198
+ }
199
+
200
+ .loftloader-options-panel span.description {
201
+ font-weight: normal;
202
+ color: #999;
203
+ font-size: 12px;
204
+ font-style: normal;
205
+ line-height: 1em;
206
+ }
207
+
208
+ /* Restyle Checkbox
209
+ ========================================================================== */
210
+
211
+ .loftloader-options-panel label {
212
+ position: relative;
213
+ display: inline-block;
214
+ height: 30px;
215
+ }
216
+
217
+ .loftloader-options-panel input[type="checkbox"] {
218
+ position: relative;
219
+ z-index: 9;
220
+ opacity: 0;
221
+ }
222
+
223
+ .loftloader-options-panel .on-off {
224
+ position: absolute;
225
+ top: 2px;
226
+ left: 0;
227
+ z-index: 1;
228
+ display: inline-block;
229
+ width: 56px;
230
+ height: 26px;
231
+ padding: 1px;
232
+ border-radius: 13px;
233
+ background: #EEE;
234
+ border: 1px solid #DDD;
235
+ transition: 0.3s;
236
+ box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.05);
237
+ }
238
+
239
+ .loftloader-options-panel .on-off span {
240
+ -webkit-transform: translateX(30px);
241
+ -ms-transform: translateX(30px);
242
+ transform: translateX(30px);
243
+ display: inline-block;
244
+ width: 22px;
245
+ height: 22px;
246
+ background: #FFF;
247
+ border-radius: 50%;
248
+ box-shadow: 0 0 4px rgba(0, 0, 0, 0.1);
249
+ transition: 0.3s;
250
+ }
251
+
252
+ .loftloader-options-panel input[type="checkbox"]:checked + .on-off {
253
+ background: rgba(48, 154, 213, 0.7);
254
+ border-color: #248ACC;
255
+ }
256
+
257
+ .loftloader-options-panel input[type="checkbox"]:focus + .on-off {
258
+ border-color: #5B9DD9;
259
+ box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
260
+ }
261
+
262
+ .loftloader-options-panel input[type="checkbox"]:checked + .on-off span {
263
+ -webkit-transform: translateX(0);
264
+ -ms-transform: translateX(0);
265
+ transform: translateX(0);
266
+ }
267
+
268
+
269
+ /* ==========================================================================
270
+ 4.0 Restyle UI Slider
271
+ ========================================================================== */
272
+
273
+ .loftloader-options-panel .ui-slider.loader-ui-slider {
274
+ position: relative;
275
+ float: left;
276
+ display: block;
277
+ width: calc(100% - 120px);
278
+ height: 24px;
279
+ margin: 3px 0 0;
280
+ background: none;
281
+ border: none;
282
+ border-radius: 0;
283
+ cursor: pointer;
284
+ }
285
+
286
+ .loftloader-options-panel .ui-slider.loader-ui-slider:before {
287
+ position: absolute;
288
+ top: 50%;
289
+ left: 0;
290
+ display: block;
291
+ width: 100%;
292
+ height: 2px;
293
+ background: #DCDCDC;
294
+ content: "";
295
+ }
296
+
297
+ .loftloader-options-panel label.amount {
298
+ float: left;
299
+ margin-right: 20px;
300
+ }
301
+
302
+ .loftloader-options-panel .ui-slider.loader-ui-slider .ui-slider-range-min {
303
+ top: 50%;
304
+ height: 2px;
305
+ background: #248ACC;
306
+ border-radius: 0;
307
+ }
308
+
309
+ .loftloader-options-panel .ui-slider.loader-ui-slider .ui-slider-handle {
310
+ top: 8px;
311
+ width: 10px;
312
+ height: 10px;
313
+ background: #248ACC;
314
+ box-shadow: 0 0 6px rgba(0, 0, 0, 0.05);
315
+ border: 1px solid #248ACC;
316
+ border-radius: 50%;
317
+ outline: none;
318
+ cursor: pointer;
319
+ }
320
+
321
+ .loftloader-options-panel .ui-slider.loader-ui-slider .ui-slider-handle.ui-state-focus {
322
+ border-color: #5B9DD9;
323
+ box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
324
+ }
325
+
326
+
327
+ /* ==========================================================================
328
+ 5.0 Restyle Color Picker
329
+ ========================================================================== */
330
+
331
+ .loftloader-options-panel .wp-picker-container .wp-color-result {
332
+ height: 28px;
333
+ margin-right: 6px;
334
+ padding-left: 30px;
335
+ border: 1px solid #DDD;
336
+ border-radius: 5px;
337
+ box-shadow: 0 0 3px rgba(0, 0, 0, 0.08);
338
+ line-height: 26px;
339
+ }
340
+
341
+ .loftloader-options-panel .wp-picker-container .wp-color-result:after {
342
+ height: 25px;
343
+ margin: 0;
344
+ padding: 0 12px 1px;
345
+ background: #F9F9F9;
346
+ border-left: 1px solid #DDD;
347
+ -webkit-appearance: none;
348
+ border-radius: 0 4px 4px 0;
349
+ color: #999;
350
+ vertical-align: top;
351
+ font-size: 13px;
352
+ line-height: 26px;
353
+ }
354
+
355
+ .loftloader-options-panel .wp-picker-container .wp-color-result:focus {
356
+ border-color: #5B9DD9;
357
+ box-shadow: 0 0 2px rgba(30, 140, 190, 0.8);
358
+ }
359
+
360
+ .loftloader-options-panel .wp-picker-container .wp-picker-open + .wp-picker-input-wrap {
361
+ margin-top: 2px;
362
+ }
363
+
364
+
365
+ /* ==========================================================================
366
+ 6.0 Loader Preview Frame
367
+ ========================================================================== */
368
+
369
+ .loftloader-options-panel .preview-section {
370
+ position: relative;
371
+ margin-top: 40px;
372
+ }
373
+
374
+ .loftloader-options-panel .preview-wrapper {
375
+ margin-bottom: 40px;
376
+ }
377
+
378
+ .loftloader-options-panel .preview-settings {
379
+ position: relative;
380
+ display: block;
381
+ overflow: hidden;
382
+ }
383
+
384
+ .loftloader-options-panel .preview-settings .setting-group {
385
+ float: left;
386
+ width: 48%;
387
+ margin-right: 2%;
388
+ }
389
+
390
+ .loftloader-options-panel .preview-settings .setting-group:last-of-type {
391
+ margin-right: 0;
392
+ margin-left: 2%;
393
+ }
394
+
395
+ .loftloader-options-panel .preview-settings h4 {
396
+ margin-bottom: 0.5em;
397
+ }
398
+
399
+ .loftloader-options-panel .preview-settings .setting-group li {
400
+ margin-bottom: 24px;
401
+ }
402
+
403
+ .loftloader-options-panel .preview-frame {
404
+ position: relative;
405
+ width: 100%;
406
+ height: 300px;
407
+ margin-top: 30px;
408
+ border: 1px solid #DDD;
409
+ overflow: hidden;
410
+ box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.1);
411
+ }
412
+
413
+ .loftloader-options-panel .preview-frame:after {
414
+ position: absolute;
415
+ top: 50%;
416
+ left: 50%;
417
+ -webkit-transform: translate(-50%, -50%);
418
+ -ms-transform: translate(-50%, -50%);
419
+ transform: translate(-50%, -50%);
420
+ display: block;
421
+ width: 100%;
422
+ height: auto;
423
+ color: #DDD;
424
+ content: "YOUR SITE CONTENT";
425
+ font-weight: bold;
426
+ font-size: 36px;
427
+ text-align: center;
428
+ line-height: 1.5;
429
+ letter-spacing: 0.2em;
430
+ }
431
+
432
+ /**
433
+ * Hide the loading animation on hover.
434
+ */
435
+
436
+ .loftloader-options-panel .preview-frame:hover #loader {
437
+ opacity: 0;
438
+ transition: all 0.3s ease-out;
439
+ }
440
+
441
+
442
+ /* ==========================================================================
443
+ 7.0 Lodaer Preview Frame - Background and Ending
444
+ ========================================================================== */
445
+
446
+ .loftloader-options-panel .preview-frame #loftloader-wrapper {
447
+ position: relative;
448
+ }
449
+
450
+ .loftloader-options-panel .preview-frame #loftloader-wrapper .loader-section {
451
+ position: absolute;
452
+ }
453
+
454
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-left {
455
+ -webkit-transform: translateX(-100%);
456
+ -ms-transform: translateX(-100%);
457
+ transform: translateX(-100%);
458
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
459
+ }
460
+
461
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-right {
462
+ -webkit-transform: translateX(100%);
463
+ -ms-transform: translateX(100%);
464
+ transform: translateX(100%);
465
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
466
+ }
467
+
468
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-up {
469
+ -webkit-transform: translateY(-100%);
470
+ -ms-transform: translateY(-100%);
471
+ transform: translateY(-100%);
472
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
473
+ }
474
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-down {
475
+ -webkit-transform: translateY(100%);
476
+ -ms-transform: translateY(100%);
477
+ transform: translateY(100%);
478
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
479
+ }
480
+
481
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-fade {
482
+ opacity: 0 !important;
483
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
484
+ }
485
+
486
+ .loftloader-options-panel .preview-frame:hover #loftloader-wrapper .loader-section.section-slide-up {
487
+ -webkit-transform: translateY(-100%);
488
+ -ms-transform: translateY(-100%);
489
+ transform: translateY(-100%);
490
+ transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
491
+ }
492
+
493
+
494
+ /* ==========================================================================
495
+ 8.0 Media Queries
496
+ ========================================================================== */
497
+
498
+ @media screen and (max-width : 800px) {
499
+ .loftloader-options-panel .preview-settings .setting-group {
500
+ float: none;
501
+ width: 100%;
502
+ margin-right: 0;
503
+ }
504
+
505
+ .loftloader-options-panel .preview-settings .setting-group:last-of-type {
506
+ margin-left: 0;
507
+ }
508
+ }
509
+
510
+ @media screen and (max-width : 640px) {
511
+ .loftloader-options-panel ul.form-list li .list-title,
512
+ .loftloader-options-panel ul.form-list li .list-content {
513
+ float: none;
514
+ width: 100%;
515
+ }
516
+
517
+ .loftloader-options-panel ul.form-list li .list-title {
518
+ margin-bottom: 10px;
519
+ padding-right: 0;
520
+ }
521
+
522
+ .loftloader-options-panel .ui-slider.loader-ui-slider {
523
+ width: 100%;
524
+ }
525
+ }
526
+
527
+ @media only screen and (max-width : 340px) {
528
+ .loftloader-options-panel .panel-footer p.submit,
529
+ .loftloader-options-panel .panel-footer p.reset {
530
+ float: none;
531
+ }
532
+
533
+ .loftloader-options-panel .panel-footer p.submit {
534
+ margin-bottom: 10px;
535
+ }
536
+ }
front/class-loftloader-front.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+
7
+ /**
8
+ * Main class for front display
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!class_exists('LoftLoader_Front')){
19
+ class LoftLoader_Front{
20
+ private $loader_enabled; // Flag to tell whether loftloader enabled
21
+ private $loader_settings; // Get the loader settings
22
+ public function __construct(){
23
+ $this->get_settings();
24
+ if($this->loader_enabled){
25
+ add_action('wp_enqueue_scripts', array($this, 'enqueue_scripts'));
26
+ add_action('wp_head', array($this, 'loader_custom_styles'), 100);
27
+ add_action('wp_footer', array($this, 'show_loader_html'));
28
+ }
29
+ }
30
+ /**
31
+ * @description get the plugin settings
32
+ */
33
+ public function get_settings(){
34
+ $default = apply_filters('loftloader_settings_default_value', array());
35
+ $settings = get_option('loftloader-custom-settings', $default);
36
+ $this->loader_enabled = (!empty($settings['enable']) && ($settings['enable'] == 'on')) ? true : false;
37
+ $this->loader_settings = $settings;
38
+ }
39
+ /**
40
+ * @description enqueue the scripts and styles for front end
41
+ */
42
+ public function enqueue_scripts(){
43
+ wp_enqueue_script('loftloader-front-main', LOFTLOADER_JS_URI . 'front/loftloader.js', array('jquery'), '1.0', true);
44
+ wp_enqueue_style('loftloader-animation');
45
+ }
46
+ /**
47
+ * @description custom css for front end
48
+ */
49
+ public function loader_custom_styles(){
50
+ $styles = get_option('loftloader-custom-styles', '');
51
+ echo empty($styles) ? '' : '<style type="text/css">' . $styles . '</style>';
52
+ }
53
+ /**
54
+ * @description loftloader html
55
+ */
56
+ public function show_loader_html(){
57
+ $loader = $this->loader_settings['settings']; // Preloader settings
58
+ $background = $loader['background']; // Preloader background settings
59
+ $animation = $loader['animation']; // Preloader animation settings
60
+ $html = '<div id="loftloader-wrapper" class="' . $animation['type'] . '">';
61
+ $html .= '<div class="loader-inner"><div id="loader">';
62
+ $html .= in_array($animation['type'], array('pl-frame', 'pl-imgloading'))
63
+ ? '<span></span><img srcset="' . $animation['image']['url'] . '" src="' . $animation['image']['url'] . '" alt="preloder">' : '<span></span>';
64
+ $html .= '</div></div>';
65
+ switch($background['effect']){
66
+ case 'fade':
67
+ $html .= '<div class="loader-section section-fade"></div>';
68
+ break;
69
+ case 'slide-up':
70
+ $html .= '<div class="loader-section section-slide-up"></div>';
71
+ break;
72
+ case 'slide-up-down':
73
+ $html .= '<div class="loader-section section-up"></div>';
74
+ $html .= '<div class="loader-section section-down"></div>';
75
+ break;
76
+ default:
77
+ $html .= '<div class="loader-section section-left">';
78
+ $html .= '</div><div class="loader-section section-right"></div>';
79
+ }
80
+ $html .= '</div>';
81
+ echo $html;
82
+ }
83
+ }
84
+ new LoftLoader_Front();
85
+ }
img/loftloader-logo.png ADDED
Binary file
js/front/loftloader.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ (function($){
2
+ if($('#loftloader-wrapper').length){
3
+ $(window).load(function(){ $('body').addClass('loaded'); });
4
+ }
5
+ })(jQuery);
js/settings/loftloader-settings.js ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function($){
2
+ $(document).ready(function(){
3
+ var customImageSrc = $('.preloader-preview-image').val() ? $('.preloader-preview-image').val() : loftloader_vars.img_base + 'loftloader-logo.png';
4
+ // Custom media uploader
5
+ window.loftloader_set_image = {
6
+ target: '',
7
+ frame: false,
8
+ mediaFrame: function(){
9
+ if(!this.frame){
10
+ this.frame = wp.media({
11
+ id: 'loftloader-image-uploader',
12
+ frame: 'post',
13
+ state: 'insert',
14
+ editing: true,
15
+ library: {
16
+ type : 'image'
17
+ },
18
+ multiple: false // Set this to true to allow multiple files to be selected
19
+ })
20
+ .on('insert', function(){
21
+ if(window.loftloader_set_image.target){
22
+ var state = window.loftloader_set_image.frame.state(),
23
+ oImage = state.get('selection').first(),
24
+ jImage = oImage.toJSON();
25
+ if((jImage.type == 'image') && (jImage.subtype != 'svg+xml')){
26
+ var display = state.display(oImage).toJSON(),
27
+ sSize = (display && display.size && jImage.sizes && jImage.sizes[display.size]) ? display.size : 'full',
28
+ sImage = (display && display.size && jImage.sizes && jImage.sizes[display.size]) ? jImage.sizes[display.size] : jImage,
29
+ image = {url: sImage.url, id: jImage.id, caption: jImage.caption, type: jImage.subtype};
30
+
31
+ window.loftloader_set_image.target.siblings('input.admin-image-id').val(jImage.id).end().trigger('loftloader.image.change', image);
32
+ }
33
+ window.loftloader_set_image.target = false;
34
+ }
35
+ })
36
+ .on('open', function(){
37
+ var selection = window.loftloader_set_image.frame.state().get('selection'),
38
+ image_id = window.loftloader_set_image.target.siblings('input.admin-image-id').val();
39
+ selection.reset();
40
+ if(image_id && (image_id !== '')){
41
+ var attachment = wp.media.attachment(image_id);
42
+ attachment.fetch();
43
+ selection.add(attachment ? [attachment] : []);
44
+ }
45
+ });
46
+ }
47
+ return this.frame;
48
+ },
49
+ open: function(){
50
+ this.mediaFrame().open();
51
+ }
52
+ };
53
+ // set image button events handler
54
+ $('body').on('click', '.loader-set-image', function(e){
55
+ e.preventDefault();
56
+ window.loftloader_set_image.target = $(this);
57
+ window.loftloader_set_image.open();
58
+ })
59
+ .on('loftloader.image.change', '.loader-set-image', function(e, image){
60
+ e.preventDefault();
61
+ if(image && image.url){
62
+ var $parent = $(this).parent();
63
+ $parent.find('img').length ? $parent.find('img').attr('src', image.url) : $parent.prepend($('<div>').addClass('bg-img-holder').append($('<img>').attr('src', image.url)));
64
+ $(this).addClass('hide').siblings('.bg-img-remove').removeClass('hide').siblings('input.admin-image-url').val(image.url);
65
+ customImageSrc = image.url;
66
+ $('#preloader-animation').trigger('change');
67
+ }
68
+ })
69
+ .on('click', '.bg-img-remove', function(e){
70
+ e.preventDefault();
71
+ $(this).addClass('hide').siblings('input').val('').siblings('.loader-set-image').removeClass('hide').siblings('.bg-img-holder').remove();
72
+ customImageSrc = loftloader_vars.img_base + 'loftloader-logo.png';
73
+ $(this).siblings('input.admin-image-url').val(customImageSrc);
74
+ $('#preloader-animation').trigger('change');
75
+ })
76
+ .on('click', '.bg-img-holder img', function(e){
77
+ $(this).parent().siblings('.loader-set-image').trigger('click');
78
+ })
79
+ .on('click', '.button.button-primary', function(e){
80
+ if($(this).hasClass('reset')){
81
+ e.preventDefault();
82
+ if(confirm(loftloader_vars.confirm_text)){
83
+ var data = {'action' : loftloader_vars.ajax.action, 'nonce' : loftloader_vars.ajax.nonce};
84
+ $.post(loftloader_vars.ajax.url, data).done(function(response){ console.log(response);
85
+ response.success ? window.location.href = window.location.href : alert(loftloader_vars.fail_text);
86
+ }).fail(function(){ alert(loftloader_vars.fail_text); });
87
+ }
88
+ }
89
+ });
90
+
91
+ $('.loader-ui-slider').each(function(){
92
+ $(this).slider({
93
+ range: "min",
94
+ value: $(this).data('default'),
95
+ min: $(this).data('min'),
96
+ max: $(this).data('max'),
97
+ step: $(this).data('step'),
98
+ slide: function(event, ui){
99
+ if($(this).siblings('label').find('input').hasClass('opacity-amount')){
100
+ $(this).siblings('label').find('input').val(ui.value + '%');
101
+ $(this).parents('.preview-section').find('.preview-wrapper .loader-section').css('opacity' , ui.value/100);
102
+ }
103
+ },
104
+ create: function(event, ui){
105
+ $(this).parents('.preview-section').find('.preview-wrapper .loader-section').css('opacity' , $(this).attr('data-default')/100);
106
+ }
107
+ });
108
+ });
109
+ $('.loader-color-picker').wpColorPicker({
110
+ change: function(e, ui){
111
+ var color = $(this).wpColorPicker('color');
112
+ switch($(this).attr('id')){
113
+ case 'preloader-background-color':
114
+ loftloader_generate_css_background(color)
115
+ break;
116
+ case 'preloader-animation-color':
117
+ loftloader_generate_css_animation(color);
118
+ break;
119
+ }
120
+ }
121
+ });
122
+ $('.loader-color-picker').trigger('change');
123
+
124
+ // Custom image/logo width for 'pl-imgloading'
125
+ $('.preloader-custom-image-width input').change(function(e){
126
+ if($('#preloader-animation').val() == 'pl-imgloading'){
127
+ var $loader = $('#loader'),
128
+ width = $(this).val() ? parseInt($(this).val()) : false,
129
+ min = $(this).attr('min') ? parseInt($(this).attr('min')) : 0,
130
+ max = $(this).attr('max') ? parseInt($(this).attr('max')) : 400;
131
+ ((min <= width) && (width <= max)) ? $loader.css('width', width) : $loader.css('width', '');
132
+ }
133
+ });
134
+ // Select Animation
135
+ $('#preloader-animation').on('change', function() {
136
+ var customImage = $('<img>').attr('src', customImageSrc);
137
+ var selectedAnimation = $(this).val();
138
+ $('.preview-wrapper #loftloader-wrapper').removeAttr('class').addClass(selectedAnimation);
139
+ switch(selectedAnimation){
140
+ case 'pl-frame':
141
+ $('#loader span').css({'background-image': '', 'background-size': ''});
142
+ !$('#loader img').length ? $('#loader span').after(customImage) : $('#loader img').attr('src', customImageSrc);
143
+ break;
144
+ case 'pl-imgloading':
145
+ var backgroundImg = 'url('+ customImageSrc +')';
146
+ $('#loader span').css('background-image' , backgroundImg);
147
+ !$('#loader img').length ? $('#loader span').after(customImage) : $('#loader img').attr('src', customImageSrc);
148
+ $('#loader span').css('background-size', 'cover');
149
+ $('.preloader-custom-image-width input').trigger('change');
150
+ break;
151
+ default:
152
+ if($('#loader img').length){
153
+ $('#loader img').remove();
154
+ $('#loader span').css({'background-image': '', 'background-size': ''});
155
+ }
156
+ break;
157
+
158
+ }
159
+ })
160
+ .on('change', function(e){
161
+ var selectedVal = $(this).val(), $width = $('.preloader-custom-image-width input');
162
+ $('li.preloader_animation').addClass('hide');
163
+ $('li.preloader_animation-' + selectedVal).removeClass('hide');
164
+ (selectedVal == 'pl-imgloading') ? $width.attr('required', '') : $width.removeAttr('required');
165
+ (selectedVal == 'pl-imgloading') ? '' : $('#loader').css('width', '');
166
+ }).trigger('change');
167
+
168
+ var firstElement = $('.preview-frame #loftloader-wrapper').find('.loader-section').first();
169
+ var secondElement = $('.preview-frame #loftloader-wrapper').find('.loader-section').last();
170
+ $('#preloader-background-style').on('change', function(e){
171
+ switch($(this).find('option:selected').val()){
172
+ case 'fade':
173
+ secondElement.addClass('hide');
174
+ firstElement.removeAttr('class').addClass('loader-section section-fade');
175
+ break;
176
+ case 'slide-left-right':
177
+ firstElement.removeAttr('class').addClass('loader-section section-left');
178
+ secondElement.removeAttr('class').addClass('loader-section section-right');
179
+ break;
180
+ case 'slide-up':
181
+ firstElement.removeAttr('class').addClass('loader-section section-slide-up');
182
+ secondElement.addClass('hide');
183
+ break;
184
+ case 'slide-up-down':
185
+ firstElement.removeAttr('class').addClass('loader-section section-up');
186
+ secondElement.removeAttr('class').addClass('loader-section section-down');
187
+ break;
188
+ }
189
+ }).trigger('change');
190
+
191
+ function loftloader_generate_css_animation(color){
192
+ var currentStyle = $('#preloader-animation').val();
193
+ var currentColor = color;
194
+ var newStyle = '';
195
+
196
+ newStyle += '#loftloader-wrapper.pl-sun #loader span, #loftloader-wrapper.pl-sun #loader span:before {background-color: ' + currentColor + ';}';
197
+ newStyle += '#loftloader-wrapper.pl-circles #loader span, #loftloader-wrapper.pl-circles #loader:before, #loftloader-wrapper.pl-circles #loader:after {background: ' + currentColor + ';}';
198
+ newStyle += '#loftloader-wrapper.pl-wave #loader span, #loftloader-wrapper.pl-wave #loader:before, #loftloader-wrapper.pl-wave #loader:after {background: ' + currentColor + ';}';
199
+ newStyle += '#loftloader-wrapper.pl-square #loader span {border: 4px solid ' + currentColor + ';}';
200
+ newStyle += '#loftloader-wrapper.pl-frame #loader:before, #loftloader-wrapper.pl-frame #loader:after, #loftloader-wrapper.pl-frame #loader span:before, #loftloader-wrapper.pl-frame #loader span:after {background-color: ' + currentColor + ';}';
201
+
202
+ if($('body').find('#preview-animation-color').length > 0){
203
+ $('body').find('#preview-animation-color').html(newStyle);
204
+ }
205
+ else{
206
+ $('<style>' + newStyle + '</style>').attr('id', 'preview-animation-color').appendTo($('body'));
207
+ }
208
+ }
209
+ function loftloader_generate_css_background(color){
210
+ firstElement.css('background-color', color);
211
+ secondElement.css('background-color', color);
212
+ }
213
+ loftloader_generate_css_animation($('#preloader-animation-color').val());
214
+ loftloader_generate_css_background($('#preloader-background-color').val());
215
+ });
216
+ })(jQuery);
languages/loftloader.pot ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2016 LoftLoader
2
+ # This file is distributed under the same license as the LoftLoader package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: LoftLoader 1.0.0\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/loftloader\n"
7
+ "POT-Creation-Date: 2016-02-28 06:09:45+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2016-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: Suihai <cain@loftocean.com>\n"
13
+ "Language-Team: Loft Ocean <cain@loftocean.com>\n"
14
+
15
+ #: configs/loftloader-config.php:28
16
+ msgid "Show Preloader"
17
+ msgstr ""
18
+
19
+ #: configs/loftloader-config.php:34
20
+ msgid "Enable loftloader"
21
+ msgstr ""
22
+
23
+ #: configs/loftloader-config.php:35
24
+ msgid "Suggest keep it enabled if the site has a lot of images or large videos."
25
+ msgstr ""
26
+
27
+ #: configs/loftloader-config.php:54
28
+ msgid "Preview"
29
+ msgstr ""
30
+
31
+ #: configs/loftloader-config.php:55
32
+ msgid "Hover onto frame below to preview ending animation."
33
+ msgstr ""
34
+
35
+ #: configs/loftloader-config.php:61
36
+ msgid "Background"
37
+ msgstr ""
38
+
39
+ #: configs/loftloader-config.php:66
40
+ msgid "Select preloader ending animation"
41
+ msgstr ""
42
+
43
+ #: configs/loftloader-config.php:68
44
+ msgid "Fade"
45
+ msgstr ""
46
+
47
+ #: configs/loftloader-config.php:69
48
+ msgid "Slide Left & Right"
49
+ msgstr ""
50
+
51
+ #: configs/loftloader-config.php:70
52
+ msgid "Slide Up"
53
+ msgstr ""
54
+
55
+ #: configs/loftloader-config.php:71
56
+ msgid "Slide Up & Down"
57
+ msgstr ""
58
+
59
+ #: configs/loftloader-config.php:80
60
+ msgid "Preloader background color"
61
+ msgstr ""
62
+
63
+ #: configs/loftloader-config.php:91
64
+ msgid "Preloader background opacity"
65
+ msgstr ""
66
+
67
+ #: configs/loftloader-config.php:105
68
+ msgid "Animation"
69
+ msgstr ""
70
+
71
+ #: configs/loftloader-config.php:110
72
+ msgid "Select preloader loading animation"
73
+ msgstr ""
74
+
75
+ #: configs/loftloader-config.php:112
76
+ msgid "1 - Spinning Sun"
77
+ msgstr ""
78
+
79
+ #: configs/loftloader-config.php:113
80
+ msgid "2 - Luminous Circles"
81
+ msgstr ""
82
+
83
+ #: configs/loftloader-config.php:114
84
+ msgid "3 - Wave"
85
+ msgstr ""
86
+
87
+ #: configs/loftloader-config.php:115
88
+ msgid "4 - Spinning Square"
89
+ msgstr ""
90
+
91
+ #: configs/loftloader-config.php:116
92
+ msgid "5 - Drawing Frame"
93
+ msgstr ""
94
+
95
+ #: configs/loftloader-config.php:117
96
+ msgid "6 - Loading Custom Image"
97
+ msgstr ""
98
+
99
+ #: configs/loftloader-config.php:127
100
+ msgid "Preloader animation color"
101
+ msgstr ""
102
+
103
+ #: configs/loftloader-config.php:139
104
+ msgid "Upload custom image/logo"
105
+ msgstr ""
106
+
107
+ #: configs/loftloader-config.php:150
108
+ msgid "Custom image width - optional (if provided, the value should be between 1 - 400)"
109
+ msgstr ""
110
+
111
+ #: configs/loftloader-config.php:210 settings/class-loftloader-settings.php:83
112
+ msgid "LoftLoader Settings"
113
+ msgstr ""
114
+
115
+ #: settings/class-loftloader-settings.php:39
116
+ msgid "View LoftLoader Settings"
117
+ msgstr ""
118
+
119
+ #: settings/class-loftloader-settings.php:39
120
+ msgid "Settings"
121
+ msgstr ""
122
+
123
+ #: settings/class-loftloader-settings.php:56
124
+ msgid "Sorry, but the request failed. Please try again later."
125
+ msgstr ""
126
+
127
+ #: settings/class-loftloader-settings.php:57
128
+ msgid "Are you sure want to reset all settings?"
129
+ msgstr ""
130
+
131
+ #: settings/class-loftloader-settings.php:84
132
+ msgid "LoftLoader"
133
+ msgstr ""
134
+
135
+ #: settings/class-loftloader-settings.php:133
136
+ msgid "Save Changes"
137
+ msgstr ""
138
+
139
+ #: settings/class-loftloader-settings.php:134
140
+ msgid "Reset All Settings"
141
+ msgstr ""
142
+
143
+ #: settings/class-loftloader-settings.php:152
144
+ msgid "LoftLoader settings have been reset."
145
+ msgstr ""
146
+
147
+ #: settings/form/class-loftloader-preview.php:155
148
+ #: settings/form/class-loftloader-preview.php:161
149
+ msgid "Upload Image"
150
+ msgstr ""
151
+
152
+ #: settings/form/class-loftloader-preview.php:156
153
+ #: settings/form/class-loftloader-preview.php:162
154
+ msgid "Remove Image"
155
+ msgstr ""
loftloader.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: LoftLoader
4
+ Plugin URI: http://www.loftocean.com/
5
+ Description: An easy to use plugin to add an animated preloader to your website with fully customisations.
6
+ Version: 1.0.0
7
+ Author: Loft Ocean
8
+ Author URI: http://www.loftocean.com/
9
+ Text Domain: loftloader
10
+ Domain Path: /languages
11
+ License: GPLv2
12
+ License URI: https://www.gnu.org/licenses/gpl-2.0.html
13
+ */
14
+
15
+
16
+ /**
17
+ * LoftLoader main file
18
+ *
19
+ * @package LoftLoader
20
+ * @version 1.0
21
+ * @link http://www.loftocean.com/
22
+ * @author Suihai Huang from Loft Ocean Team
23
+ */
24
+
25
+ // Not allowed by directly accessing.
26
+ if(!defined('ABSPATH')){
27
+ die('Access not allowed!');
28
+ }
29
+
30
+ if(!class_exists('LoftLoader')){
31
+ register_activation_hook(__FILE__, 'loftloader_activate'); //
32
+ register_deactivation_hook(__FILE__, 'loftloader_deactivate');
33
+ /*
34
+ * Update the plugin version for initial version
35
+ */
36
+ function loftloader_activate(){
37
+ update_option('loftloader_plugin_version', '1.0.0');
38
+ }
39
+ /**
40
+ * Do nothing for initial version
41
+ */
42
+ function loftloader_deactivate(){ }
43
+ /**
44
+ * Define the constant used in this plugin
45
+ */
46
+ define('LOFTLOADER_ROOT', dirname(__FILE__) . '/');
47
+ define('LOFTLOADER_NAME', plugin_basename( __FILE__ ));
48
+ define('LOFTLOADER_URI', plugin_dir_url( __FILE__ ));
49
+ define('LOFTLOADER_JS_URI', LOFTLOADER_URI . 'js/');
50
+ define('LOFTLOADER_CSS_URI', LOFTLOADER_URI . 'css/');
51
+
52
+ /**
53
+ * Main plugin class
54
+ * @since version 1.0.0
55
+ */
56
+ class LoftLoader{
57
+ public function __construct(){
58
+ load_plugin_textdomain('loftloader', false, dirname(plugin_basename(__FILE__)) . '/languages/'); // Load the text domain
59
+ $this->load_configs();
60
+ add_action('init', array($this, 'load_settings')); // Load the plugin settings
61
+ add_action('wp', array($this, 'load_front')); // Load the front main class
62
+ add_action('wp_enqueue_scripts', array($this, 'enqueue_loader_styles'));
63
+ add_action('admin_enqueue_scripts', array($this, 'enqueue_loader_styles'));
64
+ }
65
+ /**
66
+ * @description load configuration files
67
+ */
68
+ public function load_configs(){
69
+ require_once LOFTLOADER_ROOT . 'configs/loftloader-config.php';
70
+ }
71
+ /**
72
+ * @description load plugin settings main class
73
+ */
74
+ public function load_settings(){
75
+ is_admin() ? require_once LOFTLOADER_ROOT . 'settings/class-loftloader-settings.php' : '';
76
+ }
77
+ /**
78
+ * @description load plugin front main class
79
+ */
80
+ public function load_front(){
81
+ !is_admin() ? require_once LOFTLOADER_ROOT . 'front/class-loftloader-front.php' : '';
82
+ }
83
+ /**
84
+ * @description register the loader style css for both plugin setting page and front end
85
+ */
86
+ public function enqueue_loader_styles(){
87
+ wp_register_style('loftloader-animation', LOFTLOADER_CSS_URI . 'loftloader-animation.css', array(), '1.0');
88
+ }
89
+ }
90
+ new LoftLoader(); // Enable LoftLoader
91
+ }
92
+ ?>
readme.txt ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === LoftLoader ===
2
+ Contributors: loftocean
3
+ Tags: loader, load, preloader, page preloader, prelader spinner, preloader with custom logo, animated preloader, CSS3 preloader, customize
4
+ Donate link:
5
+ Requires at least: 4.3
6
+ Tested up to: 4.4.2
7
+ Stable tag: 1.0.1
8
+ License: GPLv2 or later
9
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
+
11
+ An easy to use plugin to add an animated preloader to your website with fully customisations.
12
+
13
+ == Description ==
14
+
15
+ Small and powerful. LoftLoader helps you to add a beautiful animated preloader to your website, and have full control of its look, without writing any code.
16
+
17
+ [youtube https://www.youtube.com/watch?v=21rRzhbLM8o]
18
+
19
+ = Features & Options =
20
+ * Pure CSS3 animation. Works in any modern browser.
21
+ * 4 ending animation effects.
22
+ * 6 loading animation effects. 2 of them support custom image.
23
+ * Unlimited background color. Also can change the opacity.
24
+ * Unlimited loader color.
25
+ * Live preview while setting.
26
+ * Responsive & retina ready.
27
+ * Option to enable/disable the preloader.
28
+ * Option to enable preloader on site homepage only.
29
+ * Ready for translation (.pot file included).
30
+
31
+ == Installation ==
32
+
33
+ 1. Install the plugin either via the WordPress.org plugin directory, or by uploading the files to your server (in the /wp-content/plugins/ directory).
34
+ 2. Activate the LoftLoader plugin through the 'Plugins' menu in WordPress.
35
+ 3. In the WordPress administration screen, go to Settings > LoftLoader, check the settings there.
36
+
37
+ == Frequently Asked Questions ==
38
+
39
+ = No changes on activation/deactivation =
40
+ - If you have installed any caching plugins then clear the cache.
41
+
42
+ == Screenshots ==
43
+
44
+ 1. LoftLoader settings page
45
+ 2. LoftLoader background settings
46
+ 3. LoftLoader animation settings
47
+ 4. LoftLoader live preview
48
+
49
+ == Changelog ==
50
+
51
+ = 1.0.0 =
52
+ * Initial Public Release
53
+
54
+ = 1.0.1 =
55
+ * Add support for site homepage only
56
+
57
+ == Upgrade Notice ==
58
+
59
+ = 1.0.0 =
60
+ * Initial Public Release
settings/class-loftloader-settings.php ADDED
@@ -0,0 +1,158 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+
7
+ /**
8
+ * Main class for plugin option page
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!class_exists('LoftLoader_Settings')){
19
+ class LoftLoader_Settings{
20
+ private $page_id; // Plugin setting page id
21
+ private $setting_manager; // Settings section to render/save settings
22
+ public function __construct(){
23
+ $this->page_id = 'loftloader-settings';
24
+ $this->setting_manager = new LoftLoader_Setting_Manager();
25
+
26
+ add_filter('plugin_action_links_' . LOFTLOADER_NAME, array($this, 'plugin_action_links'));
27
+ add_action('admin_enqueue_scripts', array($this, 'enqueue_scripts'));
28
+ add_action('print_media_templates', array($this, 'media_styles')); // Print media styles for media uploader
29
+ add_action('admin_menu', array($this, 'add_settings_menu')); // Add plugin option menu item
30
+ add_action('admin_init', array($this, 'register_settings')); // Register setting fields
31
+ add_action('admin_notices', array($this, 'reset_update'));
32
+ add_action('wp_ajax_loftloader_reset_settings', array($this, 'reset_settings')); // Reset the plugin option settings
33
+ }
34
+ /**
35
+ * @description add a plugin action link to plugin setting page
36
+ */
37
+ public function plugin_action_links($links){
38
+ $action_links = array(
39
+ 'settings' => '<a href="' . admin_url('options-general.php?page=' . $this->page_id) . '" title="' . esc_attr__('View LoftLoader Settings', 'loftloader') . '">' . esc_html__('Settings', 'loftloader') . '</a>'
40
+ );
41
+ return array_merge($action_links, $links);
42
+ }
43
+ /**
44
+ * @description enqueue the style when show media uploader template
45
+ */
46
+ public function media_styles(){
47
+ wp_enqueue_style('loftloader-media-style', LOFTLOADER_CSS_URI . 'settings/loftloader-media.css');
48
+ }
49
+ /**
50
+ * @description register and enqueu scripty and styles
51
+ */
52
+ public function enqueue_scripts(){
53
+ if(isset($_GET['page']) && ($_GET['page'] == $this->page_id)){
54
+ $js_vars = array(
55
+ 'img_base' => (LOFTLOADER_URI . 'img/'),
56
+ 'fail_text' => esc_html__('Sorry, but the request failed. Please try again later.', 'loftloader'),
57
+ 'confirm_text' => esc_html__('Are you sure want to reset all settings?', 'loftloader'),
58
+ 'ajax' => array(
59
+ 'url' => admin_url('admin-ajax.php'),
60
+ 'action' => 'loftloader_reset_settings',
61
+ 'nonce' => wp_create_nonce('loftloader-reset-settings')
62
+ )
63
+ );
64
+ // Register the scripts and styles
65
+ wp_register_script('loftloader-setting', LOFTLOADER_JS_URI . 'settings/loftloader-settings.js', array('jquery', 'wp-color-picker', 'jquery-ui-slider'), '1.0');
66
+ wp_localize_script('loftloader-setting', 'loftloader_vars', $js_vars);
67
+
68
+ wp_register_style('loftloader-jqueryui', LOFTLOADER_CSS_URI . 'jquery-ui.css', array(), '1.0');
69
+ wp_register_style('loftloader-settings', LOFTLOADER_CSS_URI . 'settings/loftloader-settings.css', array('wp-color-picker', 'loftloader-jqueryui'), '1.0');
70
+
71
+ // Enqueue the scripts and styles
72
+ wp_enqueue_media();
73
+ wp_enqueue_script('loftloader-setting');
74
+ wp_enqueue_style('loftloader-settings');
75
+ wp_enqueue_style('loftloader-animation');
76
+ }
77
+ }
78
+ /**
79
+ * @description add plugin settings menu
80
+ */
81
+ public function add_settings_menu(){
82
+ add_options_page(
83
+ esc_html__('LoftLoader Settings', 'loftloader'), // Page title on html head
84
+ esc_html__('LoftLoader', 'loftloader'), // Menu item label
85
+ 'manage_options',
86
+ $this->page_id,
87
+ array($this, 'render_settings_page')
88
+ ); // Register the plugin option subpage
89
+ }
90
+ /**
91
+ * @description register the settings for saving
92
+ */
93
+ public function register_settings(){
94
+ $this->setting_manager->register_setting();
95
+ }
96
+ /**
97
+ * @description get settings content
98
+ */
99
+ private function get_settings_content(){
100
+ ob_start();
101
+ $this->setting_manager->render_settings_section();
102
+ $content = ob_get_contents();
103
+ ob_end_clean();
104
+ return $content;
105
+ }
106
+ /**
107
+ * @description get settings page template
108
+ */
109
+ public function render_settings_page(){
110
+ $footer = '<div class="panel-footer">' . $this->get_buttons() . '</div>';
111
+ $content = $this->get_settings_content();
112
+ $action = admin_url('options.php');
113
+ $html = <<<ETO
114
+ <div class="wrap">
115
+ <div id="loftloader-options-panel" class="loftloader-options-panel">
116
+ <form method="post" action="$action">
117
+ <div class="panel-content">
118
+ $content
119
+ </div>
120
+ <!-- panel-content -->
121
+ $footer
122
+ </form>
123
+ </div>
124
+ </div>
125
+ ETO;
126
+ echo $html;
127
+ }
128
+ /**
129
+ * @description get save button
130
+ * @return save button html
131
+ */
132
+ private function get_buttons(){
133
+ $btns = '<p class="submit"><input type="submit" name="submit" id="submit" class="submit button button-primary" value="' . esc_attr__('Save Changes', 'loftloader') . '"></p>';
134
+ $btns .= '<p class="reset"><input type="submit" class="button button-primary reset" value="' . esc_attr__('Reset All Settings', 'loftloader') . '"></p>';
135
+ return $btns;
136
+ }
137
+ /**
138
+ * @description reset loftloader settings
139
+ */
140
+ public function reset_settings(){
141
+ check_ajax_referer('loftloader-reset-settings', 'nonce');
142
+ $this->setting_manager->reset_settings();
143
+ update_option('loftloader_settings_reset', 'done');
144
+ wp_send_json_success();
145
+ wp_die();
146
+ }
147
+ /**
148
+ * @description show reset confirm message
149
+ */
150
+ public function reset_update(){
151
+ if(get_option('loftloader_settings_reset', '') == 'done'){
152
+ add_settings_error('loftloader-options', esc_attr('loftloader_settings_reset_notice'), esc_html__('LoftLoader settings have been reset.', 'loftloader'), 'updated');
153
+ delete_option('loftloader_settings_reset');
154
+ }
155
+ }
156
+ }
157
+ new LoftLoader_Settings();
158
+ }
settings/form/class-loftloader-checkbox.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+ /**
7
+ * Plugin option form element class
8
+ * Type Checkbox
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!class_exists('LoftLoader_Checkbox')){
19
+ class LoftLoader_Checkbox extends LoftLoader_Form_Base{
20
+ /**
21
+ * @description rewrite the content function
22
+ */
23
+ protected function content(){
24
+ $html = '';
25
+ if($this->options){
26
+ $value = $this->values;
27
+ $class = '';
28
+ $id = '';
29
+ if(count($this->options) == 1){
30
+ $class = (isset($this->extra['class']) && $this->extra['class'])? ' class="' . $this->extra['class'] . '"' : '';
31
+ $id = (isset($this->extra['id']) && $this->extra['id']) ? ' id="'. $this->extra['id'] . '"' : '';
32
+ }
33
+ foreach($this->options as $val=>$attr){
34
+ $checked = checked($value, $val, false);
35
+ $disabled = (isset($attr['disabled']) && $attr['disabled']) ? ' disabled' : '';
36
+ $html .= '<label><input' . $id . $class . ' type="checkbox" name="' . $this->name . '" value="' . $val . '"' . $checked . $disabled . '>' . $attr['label'] . '<div class="on-off"><span></span></div></label>';
37
+ }
38
+ }
39
+ return $html;
40
+ }
41
+ }
42
+ }
settings/form/class-loftloader-form-base.php ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+ /**
7
+ * Plugin option form element class
8
+ * The base class of each type of form element
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!class_exists('LoftLoader_Form_Base')){
19
+ abstract class LoftLoader_Form_Base{
20
+ protected $name; // Form element name
21
+ protected $title; // Field title
22
+ protected $description; // Field description
23
+ protected $extra; // Extra arguments, may include the class infos
24
+ protected $options; // Option for some type of form element, radio/select/check
25
+ protected $values; // Form element value
26
+ public function __construct($name, $title, $description, $options, $values, $extra = array()){
27
+ $this->name = $name;
28
+ $this->title = $title;
29
+ $this->extra = $extra;
30
+ $this->values = $values;
31
+ $this->options = $options;
32
+ $this->description = $description;
33
+ }
34
+ /**
35
+ * @description show the html of each form element
36
+ */
37
+ public function render(){
38
+ if($this->options){
39
+ $replace = array('[[TITLE]]' => $this->title, '[[DESCRIPTION]]' => $this->description(), '[[INFO]]' => $this->field_info(), '[[LINKS]]' => $this->links(), '[[CONTENT]]' => $this->content());
40
+ echo strtr($this->template(), $replace);
41
+ }
42
+ }
43
+ /**
44
+ * @description form element HTML template
45
+ */
46
+ protected function template(){
47
+ $class = (isset($this->extra['wrapperClass']) && $this->extra['wrapperClass'])? ' ' . $this->extra['wrapperClass'] : '';
48
+ $html = <<<ETO
49
+ <div class="list-title">
50
+ <h4>[[TITLE]]</h4>
51
+ [[DESCRIPTION]][[INFO]][[LINKS]]
52
+ </div>
53
+ <div class="list-content$class">
54
+ <fieldset><legend class="screen-reader-text"><span>[[TITLE]]</span></legend>[[CONTENT]]</fieldset>
55
+ </div>
56
+ ETO;
57
+ return $html;
58
+ }
59
+ /**
60
+ * @description get field content
61
+ */
62
+ protected function content(){
63
+ $html = '';
64
+ if($this->options){
65
+ foreach($this->options as $val=>$text){
66
+ $checked = ($default_value[$this->name] == $val)?' checked':'';
67
+ $html .= '<label><input type="checkbox" name="' . $this->name . '" value="' . $val . '"' . $checked . '>' . $text['label'] . '</label>';
68
+ }
69
+ }
70
+ return $html;
71
+ }
72
+ /**
73
+ * @description get field info if any, normally this should be the tips
74
+ */
75
+ protected function field_info(){
76
+ $html = '';
77
+ if(isset($this->extra['info'])){
78
+ $html .= '<p><i class="fa fa-info-circle"></i> ' . $this->extra['info'] . '</p>';
79
+ }
80
+ return $html;
81
+ }
82
+ /**
83
+ * @description field description if any
84
+ */
85
+ protected function description(){
86
+ $html = '';
87
+ if(isset($this->description) && !empty($this->description)){
88
+ $html .= '<span class="description">' . $this->description . '</span>';
89
+ }
90
+ return $html;
91
+ }
92
+ /**
93
+ * @description fields links if any
94
+ */
95
+ protected function links(){
96
+ $html = '';
97
+ if(isset($this->extra['links']) && is_array($this->extra['links'])){
98
+ $html .= '<ul>';
99
+ foreach($this->extra['links'] as $text=>$link){
100
+ $html .= '<li><a href="' . $link . '">' . $text . '</a></li>';
101
+ }
102
+ $html .= '</ul>';
103
+ }
104
+ return $html;
105
+ }
106
+ }
107
+ }
settings/form/class-loftloader-preview.php ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ // Not allowed by directly accessing.
3
+ if(!defined('ABSPATH')){
4
+ die('Access not allowed!');
5
+ }
6
+ /**
7
+ * Plugin option form element class
8
+ * Type Preloader_Preview, actually this includes a set of settings and a preview for these settings
9
+ *
10
+ * @package LoftLoader
11
+ * @version 1.0
12
+ * @link http://www.loftocean.com/
13
+ * @author Suihai Huang from Loft Ocean Team
14
+
15
+ * @since version 1.0
16
+ */
17
+
18
+ if(!class_exists('LoftLoader_Preloader_Preview')){
19
+ class LoftLoader_Preloader_Preview extends LoftLoader_Form_Base{
20
+ private $preview; // Section preview
21
+ private $setting; // Section setting
22
+ public function __construct($name, $title, $description, $options, $values, $extra = array()){
23
+ parent::__construct($name, $title, $description, $options, $values, $extra);
24
+ // Assign the setting for each section
25
+ foreach($options as $section){
26
+ switch($section['section']){
27
+ case 'preview':
28
+ $this->preview = $section;
29
+ break;
30
+ case 'setting':
31
+ $this->setting = $section;
32
+ break;
33
+ }
34
+ }
35
+ }
36
+ /**
37
+ * @description rewrite the render function
38
+ */
39
+ public function render(){
40
+ if(!empty($this->preview) && !empty($this->setting)){
41
+ $replace = array(
42
+ '[[PREVIEW-TITLE]]' => $this->preview_title(),
43
+ '[[PREVIEW-DESCRIPTION]]' => $this->preview_description(),
44
+ '[[PREVIEW-CONTENT]]' => $this->preview_content(),
45
+ '[[SETTING-CONTENT]]' => $this->setting_content()
46
+ );
47
+ echo strtr($this->template(), $replace);
48
+ }
49
+ }
50
+ /**
51
+ * @description rewrite the html template function
52
+ */
53
+ protected function template(){
54
+ $html = <<<ETO
55
+ <div class="preview-section">
56
+ <div class="preview-wrapper"><h3>[[PREVIEW-TITLE]]</h3>[[PREVIEW-DESCRIPTION]][[PREVIEW-CONTENT]]</div>
57
+ <div class="preview-settings">[[SETTING-CONTENT]]</div>
58
+ </div>
59
+ ETO;
60
+ return $html;
61
+ }
62
+ /**
63
+ * @description add new function to get the preview title
64
+ */
65
+ protected function preview_title(){
66
+ return $this->get_property($this->preview, 'title');
67
+ }
68
+ /**
69
+ * @description add new function to get the preview description
70
+ */
71
+ protected function preview_description(){
72
+ $description = $this->get_property($this->preview, 'description');
73
+ if($description){
74
+ return '<span class="description">' . $description . '</span>';
75
+ }
76
+ }
77
+ /**
78
+ * @description add new function to get the preview content
79
+ */
80
+ protected function preview_content(){
81
+ $html = '<div class="preview-frame">';
82
+ $html .= '<div id="loftloader-wrapper">';
83
+ $html .= '<div class="loader-inner"><div id="loader"><span></span></div></div>';
84
+ $html .= '<div class="loader-section section-up"></div>';
85
+ $html .= '<div class="loader-section section-down"></div>';
86
+ $html .= '</div>';
87
+ $html .= '</div>';
88
+ return $html;
89
+ }
90
+ /**
91
+ * @description add new function to get the settings content
92
+ */
93
+ protected function setting_content(){
94
+ $html = '';
95
+ if(!empty($this->setting)){
96
+ foreach((array)$this->setting['content'] as $item){
97
+ $returnHTML = $this->setting_section_html($item['content']);
98
+ if(!empty($returnHTML)){
99
+ $html .= '<div class="setting-group">';
100
+ $html .= '<h3>' . $item['title'] . '</h3>';
101
+ $html .= '<ul>' . $returnHTML . '</ul>';
102
+ $html .= '</div>';
103
+ }
104
+ }
105
+ }
106
+ return $html;
107
+ }
108
+ /**
109
+ * @description add new function to get the settings elements html
110
+ */
111
+ protected function setting_section_html($section){
112
+ $html = '';
113
+ $values = $this->values;
114
+ foreach((array)$section as $element){
115
+ $elementHTML = '';
116
+ if(strpos($element['name'], '[') !== false){
117
+ $subs = (strpos($element['name'], '[') !== false) ? strtr($element['name'], array(']' => '', '[' => '][')) : $element['name'];
118
+ $name = $this->name . '[' . $subs . ']'; // Name of the element
119
+ $value = $values;
120
+ foreach(explode('][', $subs) as $sub){
121
+ $value = $value[$sub];
122
+ }
123
+ }
124
+ else{
125
+ $name = $this->name . '[' . $element['name'] . ']'; // Element name
126
+ $value = $values[$element['name']]; // Element value
127
+ }
128
+ $value = is_array($value) ? $value : trim($value);
129
+ switch($element['type']){
130
+ case 'number':
131
+ $elementHTML .= '<input type=number name="' . $name . '" value="' . $value . '" min=1 max=400 title="Number between 1-400"> px';
132
+ break;
133
+ case 'select':
134
+ if(is_array($element['options']) && (count($element['options']) > 0)){
135
+ $class = (isset($element['extra']) && isset($element['extra']['class']) && $element['extra']['class']) ? ' class="' . $element['extra']['class'] . '"' : '';
136
+ $id = (isset($element['extra']) && isset($element['extra']['id']) && $element['extra']['id']) ? ' id="' . $element['extra']['id'] . '"' : '';
137
+ $elementHTML = '<select name="' . $name . '"'. $class . $id .'>';
138
+ foreach((array)$element['options'] as $val => $attr){
139
+ $selected = selected($value, $val, false);
140
+ $elementHTML .= '<option value="' . $val . '"' . $selected . '>' . $attr['label'] . '</option>';
141
+ }
142
+ $elementHTML .= '</select>';
143
+ }
144
+ break;
145
+ case 'color-picker':
146
+ $id = (isset($element['extra']) && isset($element['extra']['id']) && $element['extra']['id']) ? ' id="' . $element['extra']['id'] . '"' : '';
147
+ $value = !empty($value) ? $value : $element['options']['defaultValue'];
148
+ $value = !empty($value) ? $value : '#222222';
149
+ $elementHTML = '<input' . $id . ' class="loader-color-picker" type="text" name="' . $name . '" value="' . $value . '" data-default-color="' . $value . '" />';
150
+ break;
151
+ case 'media':
152
+ $val = array_filter($value);
153
+ if(!empty($val)){
154
+ $elementHTML = '<div class="bg-img-holder"><img src="' . $value['url'] . '"></div>';
155
+ $elementHTML .= '<a class="button loader-set-image hide">' . esc_html__('Upload Image', 'loftloader') . '</a>';
156
+ $elementHTML .= '<span class="bg-img-remove">' . esc_html__('Remove Image', 'loftloader') . '</span>';
157
+ $elementHTML .= '<input class="admin-image-id" type="hidden" value="' . ($value['id'] ? $value['id']: '') . '" name="' . $name . '[id]">';
158
+ $elementHTML .= '<input class="admin-image-url preloader-preview-image" type="hidden" value="' . ($value['url'] ? $value['url'] : '') . '" name="' . $name . '[url]">';
159
+ }
160
+ else{
161
+ $elementHTML = '<a class="button loader-set-image">' . esc_html__('Upload Image', 'loftloader') . '</a>';
162
+ $elementHTML .= '<span class="bg-img-remove hide">' . esc_html__('Remove Image', 'loftloader') . '</span>';
163
+ $elementHTML .= '<input class="admin-image-id" type="hidden" name="' . $name . '[id]">';
164
+ $elementHTML .= '<input class="admin-image-url preloader-preview-image" type="hidden" name="' . $name . '[url]">';
165
+ }
166
+ break;
167
+ case 'slider':
168
+ $class = (isset($element['extra']) && isset($element['extra']['class']) && $element['extra']['class']) ? ' ' . $element['extra']['class'] : '';
169
+ $value = !empty($value) ? $value : $element['options']['default'];
170
+ $value = !empty($value) ? $value : '100';
171
+ $min = (isset($element['options']) && isset($element['options']['min']) && $element['options']['min']) ? $element['options']['min'] : 0;
172
+ $max = (isset($element['options']) && isset($element['options']['max']) && $element['options']['max']) ? $element['options']['max'] : 100;
173
+ $step = (isset($element['options']) && isset($element['options']['step']) && $element['options']['step']) ? $element['options']['step'] : 5;
174
+ $elementHTML .= '<label class="amount opacity">';
175
+ $elementHTML .= '<input name="' . $name . '" type="text" class="opacity-amount" readonly value="' . $value . '">';
176
+ $elementHTML .= '</label>';
177
+ $elementHTML .= '<div class="ui-slider loader-ui-slider' . $class . '" data-default="' . intval($value) . '" data-min="' . $min . '" data-max="' . $max . '" data-step="' . $step . '"></div>';
178
+ $elementHTML .= '</fieldset>';
179
+ break;
180
+ }
181
+ $wrapperClass = (isset($element['extra']) && isset($element['extra']['wrapperClass']) && $element['extra']['wrapperClass']) ? $element['extra']['wrapperClass'] : '';
182
+ $template = $this->element_template($wrapperClass);
183
+ $replace = array('[[TITLE]]' => $element['title'], '[[CONTENT]]' => $elementHTML);
184
+ $html .= strtr($template, $replace);
185
+ }
186
+ return !empty($html) ? $html : false;
187
+ }
188
+ /**
189
+ * @description the element template
190
+ */
191
+ private function element_template($class){
192
+ $class = !empty($class) ? ' class="' . $class . '"' : '';
193
+ $html = <<<ETO
194
+ <li$class>
195
+ <h4>[[TITLE]]</h4>
196
+ <fieldset><legend class="screen-reader-text"><span>[[TITLE]]</span></legend>[[CONTENT]]</fieldset>
197
+ </li>
198
+ ETO;
199
+ return $html;
200
+ }
201
+ /**
202
+ * @description helper function to get the element from array provided
203
+ */
204
+ private function get_property($var, $index){
205
+ if(isset($var[$index])){
206
+ return $var[$index];
207
+ }
208
+ return false;
209
+ }
210
+ }
211
+ }