Easy Forms for MailChimp - Version 4.2.2

Version Description

  • Added open_basedir conditional check to toggle CURLOPT_FOLLOWLOCATION based on users server settings
  • Prevents warning being thrown for users on shared hosts with an open_basedir set
Download this release

Release Info

Developer eherman24
Plugin Icon 128x128 Easy Forms for MailChimp
Version 4.2.2
Comparing to
See all releases

Code changes from version 3.0.1 to 4.2.2

Files changed (66) hide show
  1. .gitignore +6 -0
  2. classes/MCAPI_2.0.class.php +7 -14
  3. classes/class.yksemeBase.php +1376 -241
  4. classes/set_language.php +111 -0
  5. css/animate.css +3303 -0
  6. css/fonts/yks-mc-font.eot +0 -0
  7. css/fonts/yks-mc-font.svg +13 -0
  8. css/fonts/yks-mc-font.ttf +0 -0
  9. css/fonts/yks-mc-font.woff +0 -0
  10. css/jquery-ui-1.10.4.smoothness.css +1172 -1
  11. css/jquery.dataTables.css +212 -0
  12. css/style.ykseme.css +603 -8
  13. css/yks_easy_mc_wp_3point8.css +20 -0
  14. images/pagination/back_disabled.png +0 -0
  15. images/pagination/back_enabled.png +0 -0
  16. images/pagination/back_enabled_hover.png +0 -0
  17. images/pagination/forward_disabled.png +0 -0
  18. images/pagination/forward_enabled.png +0 -0
  19. images/pagination/forward_enabled_hover.png +0 -0
  20. images/pagination/sort_asc.png +0 -0
  21. images/pagination/sort_asc_disabled.png +0 -0
  22. images/pagination/sort_both.png +0 -0
  23. images/pagination/sort_desc.png +0 -0
  24. images/pagination/sort_desc_disabled.png +0 -0
  25. images/preloader.gif +0 -0
  26. images/smoothness/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  27. images/smoothness/ui-bg_flat_75_ffffff_40x100.png +0 -0
  28. images/smoothness/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  29. images/smoothness/ui-bg_glass_65_ffffff_1x400.png +0 -0
  30. images/smoothness/ui-bg_glass_75_dadada_1x400.png +0 -0
  31. images/smoothness/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  32. images/smoothness/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  33. images/smoothness/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  34. images/smoothness/ui-icons_222222_256x240.png +0 -0
  35. images/smoothness/ui-icons_2e83ff_256x240.png +0 -0
  36. images/smoothness/ui-icons_454545_256x240.png +0 -0
  37. images/smoothness/ui-icons_888888_256x240.png +0 -0
  38. images/smoothness/ui-icons_cd0a0a_256x240.png +0 -0
  39. images/yikes_logo_widget_icon.png +0 -0
  40. images/yks_mc_lets_get_started.png +0 -0
  41. js/jQuery_1.11.0.min.js +4 -0
  42. js/jquery.dataTables.js +12098 -0
  43. js/yks_mc_tinymce_button.js +85 -0
  44. languages/Lanages To Translate To.txt +30 -0
  45. languages/yikes-inc-easy-mailchimp-extender-ar_AR.mo +0 -0
  46. languages/yikes-inc-easy-mailchimp-extender-ar_AR.po +753 -0
  47. languages/yikes-inc-easy-mailchimp-extender-cy.mo +0 -0
  48. languages/yikes-inc-easy-mailchimp-extender-cy.po +781 -0
  49. languages/yikes-inc-easy-mailchimp-extender-de_DE.mo +0 -0
  50. languages/yikes-inc-easy-mailchimp-extender-de_DE.po +800 -0
  51. languages/yikes-inc-easy-mailchimp-extender-el.mo +0 -0
  52. languages/yikes-inc-easy-mailchimp-extender-el.po +792 -0
  53. languages/yikes-inc-easy-mailchimp-extender-en_US.mo +0 -0
  54. languages/yikes-inc-easy-mailchimp-extender-en_US.po +711 -0
  55. languages/yikes-inc-easy-mailchimp-extender-es_ES.mo +0 -0
  56. languages/yikes-inc-easy-mailchimp-extender-es_ES.po +781 -0
  57. languages/yikes-inc-easy-mailchimp-extender-fa_IR.mo +0 -0
  58. languages/yikes-inc-easy-mailchimp-extender-fa_IR.po +766 -0
  59. languages/yikes-inc-easy-mailchimp-extender-he_IL.mo +0 -0
  60. languages/yikes-inc-easy-mailchimp-extender-he_IL.po +750 -0
  61. languages/yikes-inc-easy-mailchimp-extender-hi_IN.mo +0 -0
  62. languages/yikes-inc-easy-mailchimp-extender-hi_IN.po +757 -0
  63. languages/yikes-inc-easy-mailchimp-extender-it_IT.mo +0 -0
  64. languages/yikes-inc-easy-mailchimp-extender-it_IT.po +788 -0
  65. languages/yikes-inc-easy-mailchimp-extender-ja.mo +0 -0
  66. languages/yikes-inc-easy-mailchimp-extender-ja.po +708 -0
.gitignore ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ # Windows Files
2
+ Thumbs.db
3
+ desktop.ini
4
+
5
+ # OS X Files
6
+ .DS_Store
classes/MCAPI_2.0.class.php CHANGED
@@ -1,15 +1,4 @@
1
  <?php
2
-
3
- // TO DO
4
-
5
- // Go through and check that all methods are update to MC API 2.0
6
- // Confirm all functionality works correctly
7
- // Check form embed into new posts/pages
8
- // --------------------------------------------------------------------------------------- //
9
- // --------------------------------------------------------------------------------------- //
10
- // Double check all methods are MC API 2.0 appropriate
11
- // Remove PHPDebug tool and comments
12
-
13
  require_once YKSEME_PATH.'/Mailchimp/Folders.php';
14
  require_once YKSEME_PATH.'/Mailchimp/Templates.php';
15
  require_once YKSEME_PATH.'/Mailchimp/Users.php';
@@ -24,7 +13,6 @@ require_once YKSEME_PATH.'/Mailchimp/Reports.php';
24
  require_once YKSEME_PATH.'/Mailchimp/Gallery.php';
25
  require_once YKSEME_PATH.'/Mailchimp/Exceptions.php';
26
 
27
-
28
  if(!class_exists("wpyksMCAPI"))
29
  {
30
  class wpyksMCAPI {
@@ -266,10 +254,15 @@ class wpyksMCAPI {
266
  $this->ch = curl_init();
267
  curl_setopt($this->ch, CURLOPT_USERAGENT, 'MailChimp-PHP/2.0.4');
268
  curl_setopt($this->ch, CURLOPT_POST, true);
269
- curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
 
 
 
 
 
270
  curl_setopt($this->ch, CURLOPT_HEADER, false);
271
  curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
272
- curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30);
273
  curl_setopt($this->ch, CURLOPT_TIMEOUT, $opts['timeout']);
274
 
275
 
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
2
  require_once YKSEME_PATH.'/Mailchimp/Folders.php';
3
  require_once YKSEME_PATH.'/Mailchimp/Templates.php';
4
  require_once YKSEME_PATH.'/Mailchimp/Users.php';
13
  require_once YKSEME_PATH.'/Mailchimp/Gallery.php';
14
  require_once YKSEME_PATH.'/Mailchimp/Exceptions.php';
15
 
 
16
  if(!class_exists("wpyksMCAPI"))
17
  {
18
  class wpyksMCAPI {
254
  $this->ch = curl_init();
255
  curl_setopt($this->ch, CURLOPT_USERAGENT, 'MailChimp-PHP/2.0.4');
256
  curl_setopt($this->ch, CURLOPT_POST, true);
257
+ // if open base directiory is set, toggle to false, else keep true
258
+ if ( ini_get('open_basedir') ) {
259
+ curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, false);
260
+ } else {
261
+ curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true);
262
+ }
263
  curl_setopt($this->ch, CURLOPT_HEADER, false);
264
  curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, true);
265
+ curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 45);
266
  curl_setopt($this->ch, CURLOPT_TIMEOUT, $opts['timeout']);
267
 
268
 
classes/class.yksemeBase.php CHANGED
@@ -3,8 +3,6 @@ if(!class_exists("yksemeBase"))
3
  {
4
  class yksemeBase
5
  {
6
-
7
-
8
 
9
  /**
10
  * Variables
@@ -22,6 +20,7 @@ public $currentListsCt = false;
22
  public function __construct()
23
  {
24
  yksemeBase::initialize();
 
25
  }
26
 
27
  /**
@@ -38,22 +37,27 @@ public function __destruct()
38
  */
39
  public function activate()
40
  {
 
 
 
 
41
  // check if our option is already set
 
42
  if( get_option( 'api_validation' ) ) {
43
  return;
44
- } else {
45
  add_option('api_validation' , 'invalid_api_key');
46
  }
47
-
48
  }
49
  public function deactivate()
50
  {
51
- // delete_option(YKSEME_OPTION);
52
  }
53
  public function uninstall()
54
- {
55
  delete_option(YKSEME_OPTION);
56
  delete_option('api_validation');
 
57
  }
58
 
59
  /***** INITIAL SETUP
@@ -61,14 +65,32 @@ public function uninstall()
61
  public function initialize()
62
  {
63
  // If it's not already set up, initialize our plugin session
64
- if(session_id() == '') session_start();
65
- if(!is_array($_SESSION[$this->sessName]))
66
  {
67
  $_SESSION[$this->sessName] = array();
68
  }
69
  // Add the CSS/JS files
70
  add_action('admin_print_styles', array(&$this, 'addStyles'));
71
  add_action('admin_print_scripts', array(&$this, 'addScripts'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  if(!is_admin())
73
  {
74
  add_action('wp_print_styles', array(&$this, 'addStyles_frontend'));
@@ -85,24 +107,35 @@ public function initialize()
85
  $this->currentListsCt = array();
86
  // Do any update tasks if needed
87
  $this->runUpdateCheck();
 
 
88
  }
89
  public function createShortcodes()
90
  {
91
  add_shortcode('yks-mailchimp-list', array(&$this, 'processShortcode'));
92
  }
 
93
  public function getOptionValue()
94
  {
95
  $defaultVals = array(
96
  'version' => YKSEME_VERSION_CURRENT,
97
  'api-key' => '',
98
- 'flavor' => '0',
99
  'debug' => '0',
 
 
 
 
 
 
 
100
  'lists' => array()
101
  );
102
  $ov = get_option(YKSEME_OPTION, $defaultVals);
103
  $this->optionVal = $ov;
104
  return $ov;
105
  }
 
106
  private function runUpdateCheck()
107
  {
108
  if(!isset($this->optionVal['version'])
@@ -113,11 +146,13 @@ private function runUpdateCheck()
113
  }
114
 
115
 
116
-
117
-
118
-
119
  /***** FUNCTIONS
120
  ****************************************************************************************************/
 
 
 
 
 
121
  public function slugify($text)
122
  {
123
  // replace non letter or digits by -
@@ -136,11 +171,11 @@ public function slugify($text)
136
  }
137
  return $text;
138
  }
139
-
 
140
  public function getBlankFieldsArray($lid='')
141
  {
142
  $fields = array();
143
-
144
  // Add Field
145
  $name = $this->slugify('Email Address'.'-'.'EMAIL');
146
  $addField = array(
@@ -158,10 +193,11 @@ public function getBlankFieldsArray($lid='')
158
  'choices' => ''
159
  );
160
  $fields[$addField['id']] = $addField;
161
-
162
  return $fields;
163
  }
164
-
 
165
  public function getImportedFieldsArray($lid, $mv)
166
  {
167
  if(empty($mv)) {
@@ -169,12 +205,11 @@ public function getImportedFieldsArray($lid, $mv)
169
  } else {
170
  $fields = array();
171
 
172
- // Problem adding and storing fields
173
- // TODO
174
  foreach($mv['data'][0]['merge_vars'] as $field)
175
  {
176
  // Add Field
177
- $name = $this->slugify($field['label'].'-'.$field['tag']);
178
  $addField = array(
179
  'id' => $lid.'-'.$name,
180
  'name' => $lid.$field['tag'],
@@ -186,14 +221,20 @@ public function getImportedFieldsArray($lid, $mv)
186
  'sort' => $field['order'],
187
  'type' => $field['field_type'],
188
  'help' => $field['helptext'],
189
- 'defalt' => $field['default'],
 
 
 
190
  'choices' => (isset($field['choices']) ? $field['choices'] : '')
191
  );
192
  $fields[$addField['id']] = $addField;
 
193
  }
194
  return $fields;
195
  }
196
  }
 
 
197
  public function getBrowser()
198
  {
199
  $u_agent = $_SERVER['HTTP_USER_AGENT'];
@@ -286,29 +327,12 @@ public function getBrowser()
286
  'pattern' => $pattern
287
  );
288
  }
289
- public function getTrackingGif($page='')
290
- {
291
- ?>
292
- <script type="text/javascript">
293
- var _gaq = _gaq || [];
294
- _gaq.push(['_setAccount', 'UA-3024863-1']);
295
- _gaq.push(['_trackPageview', '/virtual/wordpress/plugin/yikes-inc-easy-mailchimp-extender/<?php echo $this->slugify($page); ?>']);
296
-
297
- (function() {
298
- var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
299
- ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
300
- var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
301
- })();
302
- </script>
303
- <?php
304
- }
305
-
306
-
307
-
308
 
309
 
310
  /***** CONFIGURATION
311
  ****************************************************************************************************/
 
 
312
  public function updateOptions($p)
313
  {
314
  if(!empty($p['form_data']))
@@ -317,15 +341,25 @@ public function updateOptions($p)
317
  $this->optionVal['api-key'] = $fd['yks-mailchimp-api-key'];
318
  $this->optionVal['flavor'] = $fd['yks-mailchimp-flavor'];
319
  $this->optionVal['debug'] = $fd['yks-mailchimp-debug'];
 
 
 
 
 
 
 
 
320
  return update_option(YKSEME_OPTION, $this->optionVal);
321
  }
322
  return false;
323
  }
 
324
  public function updateApiKey($k)
325
  {
326
  $this->optionVal['api-key'] = $k;
327
  return update_option(YKSEME_OPTION, $this->optionVal);
328
  }
 
329
  public function updateVersion($k)
330
  {
331
  $this->optionVal['version'] = $k;
@@ -335,7 +369,8 @@ public function updateVersion($k)
335
 
336
  /********Mailchimp Error Codes
337
  *****************************************************************************************************/
338
-
 
339
  public function YksMCErrorCodes ($error)
340
  {
341
  //Server Errors
@@ -460,7 +495,6 @@ $errorcode['508'][9] = 'Invalid_URL';
460
  $errormessage[9] = "Sorry, that URL is invalid. Please try again.";
461
 
462
  // Get error message
463
-
464
  foreach ($errorcode as $eid => $value )
465
  {
466
  if ($eid == $error)
@@ -481,20 +515,16 @@ foreach ($errorcode as $eid => $value )
481
  }
482
 
483
 
484
-
485
  /***** LIST ACTIONS
486
  ****************************************************************************************************/
487
- // update list/merge-vars to 2.0
488
- // now get the fields correct for 2.0
489
- // fields not populated correctly
490
- public function addList($lid='' , $name='')
491
  {
492
- if($lid == '' || isset($this->optionVal['lists'][$list['id']])) return false;
493
  $api = new wpyksMCAPI($this->optionVal['api-key']);
494
 
495
- // test
496
- // $fields = $api->call('lists/list', '');
497
-
498
  $mv = $api->call('lists/merge-vars', array(
499
  'id' => array($lid)
500
  )
@@ -508,21 +538,186 @@ public function addList($lid='' , $name='')
508
  'name' => $name,
509
  'fields' => $this->getImportedFieldsArray($lid, $mv)
510
  );
 
511
  $this->optionVal['lists'][$list['id']] = $list;
 
 
 
 
512
  if(update_option(YKSEME_OPTION, $this->optionVal))
513
  {
514
  return $this->generateListContainers(array($list));
515
  }
516
  }
517
  return false;
518
-
519
  }
520
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  public function getLists()
522
  {
523
  $api = new wpyksMCAPI($this->optionVal['api-key']);
524
  $lists = $this->getListsData();
525
- $listArr = ($listArr == false ? $this->optionVal['lists'] : $listArr);
526
  $theusedlist = array();
527
  if(count($listArr) > 0)
528
  {
@@ -535,6 +730,7 @@ public function getLists()
535
  {
536
  echo "<select id='yks-list-select' name='yks-list-select'>";
537
  echo "<option value=''> Select List</option>";
 
538
  foreach ($lists as $lkey => $lvalue)
539
  {
540
  if (!in_array($lkey, $theusedlist))
@@ -546,25 +742,49 @@ public function getLists()
546
  }
547
  return false;
548
  }
549
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
550
  public function getListsData()
551
  {
 
552
  $theListItems = get_transient('yks-mcp-listdata-retrieved');
553
  if (!$theListItems)
554
  {
 
555
  $api = new wpyksMCAPI($this->optionVal['api-key']);
556
  $lists = $api->call('lists/list', array( 'limit' => 100 ));
557
  if($lists)
558
  {
559
  foreach ($lists['data'] as $list)
560
  {
561
- $theListItems[$list['id']] = $list['name'];
 
562
  }
 
563
  }
564
- set_transient( 'yks-mcp-listdata-retrieved', $theListItems, 60/4 ); //cache lists for 15 seconds for testing, originally 5 mins 60*5
565
- }
566
  return $theListItems;
567
  }
 
568
  public function sortList($p)
569
  {
570
  if(empty($p['update_string'])
@@ -597,6 +817,9 @@ private function sortListfields($a,$b)
597
  }
598
  return ($a < $b) ? -1 : 1;
599
  }
 
 
 
600
  public function updateList($p)
601
  {
602
  if(!empty($p['form_data']))
@@ -604,35 +827,52 @@ public function updateList($p)
604
  parse_str($p['form_data'], $fd);
605
  if(!empty($fd['yks-mailchimp-unique-id']))
606
  {
 
607
  foreach($this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'] as $k => $v)
608
  {
609
  // Only proceed if the field is not locked
610
  if($v['require'] == 0)
611
  {
612
  // Make sure this field was included in the update
613
- $this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'][$k]['active'] = (isset($fd[$v['name']]) ? '1' : '0');
 
 
 
 
 
 
 
 
 
 
614
  }
 
615
  }
616
  return update_option(YKSEME_OPTION, $this->optionVal);
617
  }
618
  }
619
  return false;
620
  }
621
-
 
622
  public function deleteList($i=false)
623
  {
624
  if($i == false) return false;
625
  else
626
  {
627
  unset($this->optionVal['lists'][$i]);
 
628
  return update_option(YKSEME_OPTION, $this->optionVal);
629
  }
630
  }
 
 
631
  public function importList($i=false)
632
  {
633
  if($i == false) return false;
634
  else
635
  {
 
636
  $lid = $this->optionVal['lists'][$i]['list-id'];
637
  $name = $this->optionVal['lists'][$i]['name'];
638
  $api = new wpyksMCAPI($this->optionVal['api-key']);
@@ -640,6 +880,7 @@ public function importList($i=false)
640
  'id' => array( $lid )
641
  )
642
  );
 
643
  if($mv)
644
  {
645
  $mv = $this->getImportedFieldsArray($lid, $mv);
@@ -656,10 +897,249 @@ public function importList($i=false)
656
  }
657
  return false;
658
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
 
 
 
 
 
 
 
 
 
 
 
 
660
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
661
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
662
 
 
 
 
 
 
 
 
 
 
 
 
663
 
664
  /***** SCRIPTS/STYLES
665
  ****************************************************************************************************/
@@ -667,19 +1147,23 @@ public function addStyles()
667
  {
668
  // Register Styles
669
  wp_register_style('ykseme-css-base', YKSEME_URL.'css/style.ykseme.css', array(), '1.0.0', 'all');
 
670
  // Enqueue Styles
671
  wp_enqueue_style('thickbox');
672
- wp_enqueue_style('ykseme-css-base');
 
673
  }
674
 
675
  public function addStyles_frontend()
676
  {
677
  // Register Styles
678
  wp_register_style('ykseme-css-base', YKSEME_URL.'css/style.ykseme.css', array(), '1.0.0', 'all');
679
- wp_register_style('ykseme-css-smoothness', YKSEME_URL.'css/jquery-ui-1.10.4.smoothness.css', array(), '1.0.0', 'all');
 
680
  // Enqueue Styles
681
  wp_enqueue_style('ykseme-css-base');
682
  wp_enqueue_style('ykseme-css-smoothness');
 
683
  }
684
 
685
  public function addScripts()
@@ -690,21 +1174,36 @@ public function addScripts()
690
  wp_enqueue_script('jquery-ui-sortable');
691
  wp_enqueue_script('jquery-ui-tabs');
692
  wp_enqueue_script('ykseme-base', YKSEME_URL.'js/script.ykseme.js', array('jquery'));
 
 
 
 
 
 
 
 
 
 
693
  }
694
 
695
  public function addScripts_frontend()
696
  {
697
  global $wp_scripts;
 
698
  $version ='1.9.0';
699
- if ( ( version_compare( $wp_scripts -> registered[jquery] -> ver, $version ) >= 0 ) && jQuery && !is_admin() )
 
700
  {
701
  wp_enqueue_script( 'jquery' );
702
  }
703
  else
704
  {
705
- wp_deregister_script('jquery');
706
- wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/'.$version.'/jquery.min.js', false, $version );
707
- wp_enqueue_script( 'jquery' );
 
 
 
708
  }
709
  // Everything else
710
  wp_enqueue_script('jquery-ui-core');
@@ -712,17 +1211,19 @@ public function addScripts_frontend()
712
  }
713
 
714
 
715
-
716
  /***** SHORTCODES
717
  ****************************************************************************************************/
 
 
718
  public function processShortcode($p)
719
  {
720
  ob_start();
721
  if($this->optionVal['api-key'] != ''
722
- && (is_array($this->optionVal['lists'][$p['id']]) && !empty($this->optionVal['lists'][$p['id']]['list-id'])))
723
  {
724
  // Setup this list
725
  $list = $this->optionVal['lists'][$p['id']];
 
726
  // Which form are we on?
727
  if(!isset($this->currentLists[$p['id']]))
728
  $this->currentLists[$p['id']] = 0;
@@ -741,90 +1242,106 @@ public function processShortcode($p)
741
  // List form
742
  include YKSEME_PATH.'templates/shortcode_form.php';
743
  }
744
- else
 
745
  {
746
- include YKSEME_PATH.'templates/shortcode_error_data.php';
 
 
 
747
  }
748
  $shortcode = ob_get_contents();
749
  ob_end_clean();
750
  return $shortcode;
751
  }
752
- public function processSnippet($list=false)
 
 
753
  {
754
- $p = array('id' => $list);
 
 
 
755
  return $this->processShortcode($p);
756
  }
757
 
758
 
759
-
760
-
761
-
762
  /***** ADMINISTRATION MENUS
763
  ****************************************************************************************************/
764
  public function addAdministrationMenu()
765
  {
766
  // Top Level Menu
767
- add_menu_page('MailChimp Forms', 'MailChimp Forms', 'manage_options', 'yks-mailchimp-form', array(&$this, 'generatePageOptions'), YKSEME_URL.'images/ykseme_16px.png', 400);
768
  // Sub Items
769
- add_submenu_page('yks-mailchimp-form', 'MailChimp Forms', 'MailChimp Settings', 'manage_options', 'yks-mailchimp-form', array(&$this, 'generatePageOptions'));
770
- add_submenu_page('yks-mailchimp-form', 'Manage List Forms', 'Manage List Forms', 'manage_options', 'yks-mailchimp-form-lists', array(&$this, 'generatePageLists'));
771
- add_submenu_page('yks-mailchimp-form', 'About YIKES, Inc.', 'About YIKES, Inc.', 'manage_options', 'yks-mailchimp-about-yikes', array(&$this, 'generatePageAboutYikes'));
772
  }
773
 
774
 
775
-
776
-
777
-
778
  /***** ADMINISTRATION PAGES
779
  ****************************************************************************************************/
780
  public function generatePageOptions()
781
  {
782
- require_once YKSEME_PATH.'pages/options.php';
783
  }
784
  public function generatePageLists()
785
  {
786
- require_once YKSEME_PATH.'pages/lists.php';
787
  }
788
  public function generatePageAboutYikes()
789
  {
790
- require_once YKSEME_PATH.'pages/about.php';
791
  }
792
-
793
-
794
-
 
795
 
796
 
797
  /***** FORM DATA
798
- ****************************************************************************************************/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
799
 
 
 
800
  public function validateAPIkeySettings()
801
  {
802
- $apiKey = $_POST['api_key'];
803
- $dataCenter = $_POST['data_center'];
804
-
805
  $api = new wpyksMCAPI($apiKey);
806
-
807
-
808
- // if there is an error with the $resp variable
809
- // display the error
810
-
811
- // need to add an exception for mailchimp HTTP error
812
- // not sur ehow to yet.
813
  try {
814
- //First try getting our user numero uno
815
  $resp = $api->call('helper/ping', array('apikey' => $apiKey));
816
  echo $resp['msg'];
817
- update_option('api_validation', 'valid_api_key');
818
  } catch( Exception $e ) {
819
  $errorMessage = str_replace('API call to helper/ping failed:', '', $e->getMessage());
820
- echo $errorMessage;
821
  update_option('api_validation', 'invalid_api_key');
822
  }
823
-
824
-
825
  wp_die();
826
  }
827
 
 
 
828
  public function addUserToMailchimp($p)
829
  {
830
  if(!empty($p['form_data']))
@@ -832,15 +1349,15 @@ public function addUserToMailchimp($p)
832
  parse_str($p['form_data'], $fd);
833
  if(!empty($fd['yks-mailchimp-list-id']))
834
  {
 
835
  $email = false;
836
- $lid = $fd['yks-mailchimp-list-id'];
837
  $api = new wpyksMCAPI($this->optionVal['api-key']);
838
  $mv = array();
839
-
840
-
841
-
842
  foreach($this->optionVal['lists'][$lid]['fields'] as $field) : if($field['active'] == '1') :
843
-
844
  // Check to see if the field is in the post
845
  if(isset($fd[$field['name']])) :
846
 
@@ -854,6 +1371,7 @@ public function addUserToMailchimp($p)
854
  default:
855
  $mv[$field['merge']] = $fd[$field['name']];
856
  break;
 
857
  case 'address':
858
  $mv[$field['merge']] = array(
859
  'addr1' => $fd[$field['name']],
@@ -864,33 +1382,94 @@ public function addUserToMailchimp($p)
864
  'country' => 'US'
865
  );
866
  break;
 
867
  }
868
-
869
  endif;
870
  endif; endforeach;
871
 
872
- // If no email, fail
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
873
  $noemail = "The email address is blank";
874
  if($email === false) return $noemail;
875
-
876
- // By default this sends a confirmation email - you will not see new members
877
- // until the link contained in it is clicked!
878
- $retval = $api->call('lists/subscribe', array(
879
- 'id' => $lid,
880
- 'email' => array( 'email' => $email ),
881
- 'merge_vars' => $mv
882
- ));
883
-
884
- if($api->errorCode)
885
- {
886
- return $this->YksMCErrorCodes ($api->errorCode);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
887
  }
888
- else return "done";
889
  }
890
  }
891
- return "One or more fields are empty";
892
  }
893
 
 
 
 
 
 
894
  private function getFieldMergeVar($fn, $lid)
895
  {
896
  $mk = '_YKS_UNKNOWN';
@@ -915,35 +1494,44 @@ private function getFieldMergeVar($fn, $lid)
915
  }
916
  return $mk;
917
  }
 
918
 
 
 
919
  public function generateListContainers($listArr=false)
920
  {
921
  $listArr = ($listArr == false ? $this->optionVal['lists'] : $listArr);
922
  $thelistdata = $this->getListsData(); //Get list names from API
923
-
924
  if(count($listArr) > 0)
925
  {
926
-
927
  ob_start();
 
928
  foreach($listArr as $list)
929
  {
 
 
930
  ?>
931
  <div class="yks-list-container" id="yks-list-container_<?php echo $list['id']; ?>">
932
  <div class="yks-status" id="yks-status" style="display: none;">
933
- <div class="yks-success" style="padding:.25em;">Your List Was Successfully Saved!</div>
934
  </div>
935
- <span class="yikes-lists-error" style="display:none;">I'm sorry there was an error with your request.</span>
 
 
 
936
  <form method="post" name="yks-mailchimp-form" id="yks-mailchimp-form_<?php echo $list['id']; ?>" rel="<?php echo $list['id']; ?>">
937
  <input type="hidden" name="yks-mailchimp-unique-id" id="yks-mailchimp-unique-id_<?php echo $list['id']; ?>" value="<?php echo $list['id']; ?>" />
938
  <table class="form-table yks-admin-form">
939
  <tbody>
940
  <tr valign="top">
941
- <th scope="row"><label for="yks-mailchimp-api-key">MailChimp List name</label></th>
942
  <td class="yks-mailchimp-listname"><?php
943
  if ($list['name'])
944
  {
945
  $thename = $list['name'];
946
- echo $thename;
 
947
  }
948
  else
949
  {
@@ -952,77 +1540,163 @@ public function generateListContainers($listArr=false)
952
  if ($lkey == $list['id'])
953
  {
954
  $thename = $lval;
955
- echo $thename;
 
956
  }
957
  }
958
  }
959
  ?></td>
960
- </tr>
 
961
  <tr valign="top">
962
- <th scope="row"><label for="yks-mailchimp-api-key">MailChimp List ID</label></th>
963
  <td><?php echo $list['list-id']; ?>
964
  </td>
965
  </tr>
 
 
 
 
 
 
 
 
 
966
  <tr valign="top">
967
- <th scope="row"><label for="yks-mailchimp-api-key">Shortcode</label></th>
968
  <td>
969
- [yks-mailchimp-list id="<?php echo $list['id']; ?>"]
970
- <span class="description yks-margin-left">Paste this shortcode into whatever page or post you want to add this form to</span>
971
  </td>
972
  </tr>
 
973
  <tr valign="top">
974
- <th scope="row"><label for="yks-mailchimp-api-key">PHP Snippet</label></th>
975
  <td>
976
- <?php echo htmlentities('<?php echo yksemeProcessSnippet(\''.$list['id'].'\'); ?>'); ?>
977
- <span class="description yks-margin-left">Use this code to add this form to a template file</span>
978
  </td>
979
  </tr>
 
980
  <tr valign="top">
981
  <td scope="row">
982
- <label for="api-key"><strong>Form Fields</strong></label>
983
  <p class="description">
984
- Check the fields you want included in your form (Email Address is required).
985
  </p>
986
  <p class="description">
987
- Use the green arrows to drag-and-drop the fields and rearrange their order.
988
  <span class="yks-mailchimp-sorthandle-img"></span>
989
  </p>
990
  </th>
991
  <td class="yks-mailchimp-fields-td" id="yks-mailchimp-fields-td_<?php echo $list['id']; ?>">
992
  <fieldset class="yks-mailchimp-fields-container" id="yks-mailchimp-fields-container_<?php echo $list['id']; ?>">
993
- <legend class="screen-reader-text"><span>Active Fields</span></legend>
994
  <div class="yks-mailchimp-fields-list" id="yks-mailchimp-fields-list_<?php echo $list['id']; ?>" rel="<?php echo $list['id']; ?>">
995
 
996
  <!-- create sortable rows populated with mailchimp data -->
997
- <?php foreach($list['fields'] as $field) { ?>
998
-
 
999
  <div class="yks-mailchimp-fields-list-row">
1000
  <label title="<?php echo $field['name']; ?>" rel="<?php echo $field['id']; ?>">
1001
- <span class="yks-mailchimp-sorthandle">Drag &amp; drop</span>
1002
  <input type="checkbox" name="<?php echo $field['name']; ?>" id="<?php echo $field['id']; ?>" value="1" <?php echo ($field['active'] == 1 ? 'checked="checked"' : ''); ?><?php echo ($field['require'] == 1 ? 'disabled="disabled"' : ''); ?> />
1003
  &nbsp;
1004
  <div class="yks-mailchimp-field-name"><?php echo $field['label']; ?></div>
1005
  </label>
1006
- <span class="yks-mailchimp-field-merge"><span class="description">Merge field:</span> &nbsp; *|<input type="text" name="<?php echo $field['name']; ?>-merge" id="<?php echo $field['id']; ?>-merge" value="<?php echo $field['merge']; ?>"<?php echo (($field['locked'] == 1 || $field['merge'] == false) ? ' disabled="disabled"' : ''); ?> />|*</span>
 
1007
  </div>
1008
- <?php } ?>
 
 
1009
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1010
  </fieldset>
1011
  </td>
1012
  </tr>
1013
  <tr>
1014
  <td></td>
1015
  <td>
1016
- <input type="submit" name="submit" class="yks-mailchimp-list-update button-primary" value="Save Form Settings" rel="<?php echo $list['id']; ?>" />
1017
- <input type="button" name="delete" class="yks-mailchimp-delete button-primary" value="Delete Form" rel="<?php echo $list['id']; ?>" data-title="<?php echo $thename; ?>" />
1018
- <input type="button" name="import" class="yks-mailchimp-import button-primary" value="Re-Import Form Fields from MailChimp" rel="<?php echo $list['id']; ?>" />
1019
  </td>
1020
  </tr>
1021
  </tbody>
1022
  </table>
1023
-
1024
-
1025
  </form>
 
 
 
 
 
 
 
 
 
 
1026
  </div>
1027
  <?php
1028
  }
@@ -1031,62 +1705,87 @@ public function generateListContainers($listArr=false)
1031
  ob_end_clean();
1032
  return $output;
1033
  }
1034
-
1035
  public function getFrontendFormJavascript($list='')
1036
  {
1037
  if($list === '') return false;
1038
-
1039
  $js = false;
1040
  foreach($list['fields'] as $field) : if($field['active'] == 1) :
1041
- // Setup javascript
1042
  if($field['require'] == '1') :
1043
- $prefix = "$ymce";
1044
  $js .= "\n";
1045
  switch($field['type'])
1046
  {
 
1047
  default:
1048
  $prefixa = "ymce";
1049
- $js .= "if ($".$prefixa."('#{$field[id]}').val() == '')";
1050
- $js .= <<<JSC
1051
-
1052
- {
1053
- msg += '* {$field[label]}'+"\\n";
1054
- err++;
1055
- }
1056
- JSC;
 
 
 
1057
  break;
1058
- case 'address':
1059
- $js .= <<<JSC
1060
- if($prefix('#{$field[id]}').val() == '')
1061
- {
1062
- msg += '* {$field[label]}: Street Address'+"\\n";
1063
- err++;
1064
- }
1065
- if($prefix('#{$field[id]}-city').val() == '')
1066
- {
1067
- msg += '* {$field[label]}: City'+"\\n";
1068
- err++;
1069
- }
1070
- if($prefix('#{$field[id]}-state').val() == '')
1071
- {
1072
- msg += '* {$field[label]}: State'+"\\n";
1073
- err++;
1074
- }
1075
- if($prefix('#{$field[id]}-zip').val() == '')
1076
- {
1077
- msg += '* {$field[label]}: Zip Code'+"\\n";
1078
- err++;
1079
- }
1080
- JSC;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1081
  break;
 
1082
  case 'radio':
1083
- $js .= <<<JSC
1084
- if($prefix('.{$field[name]}:checked').length <= 0)
1085
- {
1086
- msg += '* {$field[label]}'+"\\n";
1087
- err++;
1088
- }
1089
- JSC;
1090
  break;
1091
  }
1092
  $js .= "\n";
@@ -1094,61 +1793,132 @@ JSC;
1094
  endif; endforeach;
1095
  return $js;
1096
  }
1097
-
1098
- public function getFrontendFormDisplay($list='')
 
1099
  {
1100
  if($list === '') return false;
1101
  ob_start();
1102
  switch($this->optionVal['flavor'])
1103
  {
1104
  default:
 
 
 
1105
  case '0':
1106
  ?>
1107
- <table class="yks-mailchimpFormTable">
1108
- <tbody>
1109
- <?php foreach($list['fields'] as $field) : if($field['active'] == 1) : ?>
1110
  <?php
1111
- if ($field['require'] == 1)
1112
- {
1113
- $reqindicator = " <span class='yks-required-label'>*</span>";
1114
- $reqlabel = " yks-mailchimpFormDivRowLabel-required";
1115
- }
1116
- else
1117
- {
1118
- $reqindicator = "";
1119
- $reqlabel = "";
1120
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1121
  ?>
1122
  <tr class="yks-mailchimpFormTableRow">
1123
- <td class="prompt yks-mailchimpFormTableRowLabel"><label class="yks-mailchimpFormTdLabel<?php echo $reqlabel; ?>" for="<?php echo $field['id']; ?>"><?php echo $field['label']; ?></label><?php echo $reqindicator; ?></td>
1124
- <td class="yks-mailchimpFormTableRowField">
1125
- <?php echo $this->getFrontendFormDisplay_field($field); ?>
1126
- </td>
1127
- </tr>
1128
- <?php endif; endforeach; ?>
1129
- <tr>
1130
- <td colspan="2" class="yks-mailchimpFormTableSubmit">
1131
- <p>
1132
- <input type="submit" class="ykfmc-submit" id="ykfmc-submit_<?php echo $list['id']; ?>" value="Submit" />
1133
- </p>
1134
  </td>
1135
  </tr>
1136
- </tbody>
1137
- </table>
1138
- <?php
1139
- break;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1140
 
 
 
 
 
1141
  case '1':
1142
  ?>
1143
  <div class="yks-mailchimpFormDiv">
1144
- <?php foreach($list['fields'] as $field) : if($field['active'] == 1) : ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1145
  <?php
1146
- if ($field['require'] == 1)
1147
  {
1148
  $reqindicator = " <span class='yks-required-label'>*</span>";
1149
  $reqlabel = " yks-mailchimpFormDivRowLabel-required";
1150
  }
1151
- else
1152
  {
1153
  $reqindicator = "";
1154
  $reqlabel = "";
@@ -1157,17 +1927,52 @@ public function getFrontendFormDisplay($list='')
1157
  <div class="yks-mailchimpFormDivRow">
1158
  <label class="prompt yks-mailchimpFormDivRowLabel<?php echo $reqlabel; ?>" for="<?php echo $field['id']; ?>"><?php echo $field['label']; ?><?php echo $reqindicator; ?></label>
1159
  <div class="yks-mailchimpFormDivRowField">
 
1160
  <?php echo $this->getFrontendFormDisplay_field($field); ?>
1161
  </div>
1162
- </div>
1163
- <?php endif; endforeach; ?>
 
 
 
1164
  <div class="yks-mailchimpFormDivRow">
 
 
1165
  <div class="yks-mailchimpFormDivSubmit">
1166
- <p><input type="submit" class="ykfmc-submit" id="ykfmc-submit_<?php echo $list['id']; ?>" value="Submit" /></p>
1167
  </div>
1168
  </div>
1169
  </div>
1170
- <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1171
  break;
1172
  }
1173
  $output = ob_get_contents();
@@ -1175,10 +1980,15 @@ public function getFrontendFormDisplay($list='')
1175
  return $output;
1176
  }
1177
 
 
 
1178
  private function getFrontendFormDisplay_field($field=false)
1179
  {
1180
  if($field === false) return false;
1181
  $o = '';
 
 
 
1182
  switch($field['type'])
1183
  {
1184
  default:
@@ -1189,7 +1999,9 @@ private function getFrontendFormDisplay_field($field=false)
1189
  case 'phone':
1190
  case 'website':
1191
  case 'imageurl':
 
1192
  $o .= '<input type="text" name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'" value="" />';
 
1193
  break;
1194
  case 'dropdown':
1195
  $o .= '<select name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'">';
@@ -1200,10 +2012,10 @@ private function getFrontendFormDisplay_field($field=false)
1200
  break;
1201
  case 'address':
1202
 
1203
- $o .= '<input type="text" name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'" value="" /><span class="yks-mailchimp-form-tooltip">Street Address</span><br />';
1204
- $o .= '<input type="text" name="'.$field['name'].'-add2" class="'.$field['name'].'-add2'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-add2" value="" /><span class="yks-mailchimp-form-tooltip">Apt/Suite</span><br />';
1205
- $o .= '<input type="text" name="'.$field['name'].'-city" class="'.$field['name'].'-city'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-city" value="" /><span class="yks-mailchimp-form-tooltip">City</span><br />';
1206
- $o .= '<input type="text" name="'.$field['name'].'-state" class="'.$field['name'].'-state'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-state" value="" /><span class="yks-mailchimp-form-tooltip">State</span><br />';
1207
  $o .= '<input type="text" name="'.$field['name'].'-zip" class="'.$field['name'].'-zip'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-zip" value="" /><span class="yks-mailchimp-form-tooltip">Zip</span>';
1208
  break;
1209
  case 'radio':
@@ -1223,11 +2035,10 @@ private function getFrontendFormDisplay_field($field=false)
1223
  }
1224
 
1225
 
1226
-
1227
-
1228
-
1229
  /***** DROPDOWNS
1230
  ****************************************************************************************************/
 
 
1231
  public function generateDropdown($name, $html='', $sel='', $type=false, $zopt=false)
1232
  {
1233
  switch($type)
@@ -1266,9 +2077,6 @@ private function andOrDropdown($name, $html, $sel)
1266
  }
1267
 
1268
 
1269
-
1270
-
1271
-
1272
  /***** UPDATES
1273
  ****************************************************************************************************/
1274
  public function runUpdateTasks()
@@ -1385,11 +2193,338 @@ private function runUpdateTasks_1_3_0()
1385
  $this->optionVal['version'] = '2.2.1';
1386
  return true;
1387
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1388
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1390
 
1391
 
 
1392
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1393
  }
1394
  }
1395
  ?>
3
  {
4
  class yksemeBase
5
  {
 
 
6
 
7
  /**
8
  * Variables
20
  public function __construct()
21
  {
22
  yksemeBase::initialize();
23
+ add_action('init', array(&$this, 'ykes_mc_apply_filters'));
24
  }
25
 
26
  /**
37
  */
38
  public function activate()
39
  {
40
+ // redirect the user on plugin activation
41
+ // to our MailChimp settings page
42
+ add_option('yks_easy_mc_plugin_do_activation_redirect', true);
43
+
44
  // check if our option is already set
45
+ // if it exists, return
46
  if( get_option( 'api_validation' ) ) {
47
  return;
48
+ } else { // else create it
49
  add_option('api_validation' , 'invalid_api_key');
50
  }
 
51
  }
52
  public function deactivate()
53
  {
54
+
55
  }
56
  public function uninstall()
57
+ { // delete options on plugin uninstall
58
  delete_option(YKSEME_OPTION);
59
  delete_option('api_validation');
60
+ delete_option('imported_lists');
61
  }
62
 
63
  /***** INITIAL SETUP
65
  public function initialize()
66
  {
67
  // If it's not already set up, initialize our plugin session
68
+ if(session_id() == '') @session_start();
69
+ if(!is_array(@$_SESSION[$this->sessName]))
70
  {
71
  $_SESSION[$this->sessName] = array();
72
  }
73
  // Add the CSS/JS files
74
  add_action('admin_print_styles', array(&$this, 'addStyles'));
75
  add_action('admin_print_scripts', array(&$this, 'addScripts'));
76
+ add_action('admin_init', array( &$this, 'yks_easy_mc_plugin_activation_redirect' ) );
77
+ // tinymce buttons
78
+ // only add filters and actions on wp 3.9 and above
79
+ if ( get_bloginfo( 'version' ) >= '3.9' ) {
80
+ add_action( 'admin_head', array(&$this, 'yks_mc_add_tinyMCE') );
81
+ add_filter( 'mce_external_plugins', array(&$this, 'yks_mc_add_tinymce_plugin') );
82
+ add_filter( 'mce_buttons', array(&$this, 'yks_mc_add_tinymce_button') );
83
+ // pass our lists data to tinyMCE button for use
84
+ foreach( array('post.php','post-new.php') as $hook )
85
+ add_action( "admin_head-$hook", array(&$this, 'yks_mc_js_admin_head') );
86
+ } else {
87
+ // if the WordPress is older than 3.9
88
+ // load jQuery UI 1.10 CSS for dialogs
89
+ wp_enqueue_style('yks_easy_mc_extender-admin-ui-css',
90
+ '//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css'
91
+ );
92
+ wp_enqueue_style('yks_easy_mc_wp_3.8', plugin_dir_url(__FILE__).'../css/yks_easy_mc_wp_3point8.css');
93
+ }
94
  if(!is_admin())
95
  {
96
  add_action('wp_print_styles', array(&$this, 'addStyles_frontend'));
107
  $this->currentListsCt = array();
108
  // Do any update tasks if needed
109
  $this->runUpdateCheck();
110
+ // Register Our Widget
111
+ $this->registerMailChimpWidget($this->optionVal['lists']);
112
  }
113
  public function createShortcodes()
114
  {
115
  add_shortcode('yks-mailchimp-list', array(&$this, 'processShortcode'));
116
  }
117
+ // Create and store our initial plugin options
118
  public function getOptionValue()
119
  {
120
  $defaultVals = array(
121
  'version' => YKSEME_VERSION_CURRENT,
122
  'api-key' => '',
123
+ 'flavor' => '1',
124
  'debug' => '0',
125
+ 'optin' => 'true',
126
+ 'single-optin-message' => __('Thank You for subscribing!', 'yikes-inc-easy-mailchimp-extender'),
127
+ 'double-optin-message' => __('Thank You for subscribing! Check your email for the confirmation message.', 'yikes-inc-easy-mailchimp-extender'),
128
+ 'interest-group-label' => __('Select Your Area of Interest', 'yikes-inc-easy-mailchimp-extender'),
129
+ 'yks-mailchimp-optIn-checkbox' => 'hide',
130
+ 'yks-mailchimp-optIn-default-list' => array(),
131
+ 'yks-mailchimp-optin-checkbox-text' => 'SIGN ME UP!',
132
  'lists' => array()
133
  );
134
  $ov = get_option(YKSEME_OPTION, $defaultVals);
135
  $this->optionVal = $ov;
136
  return $ov;
137
  }
138
+
139
  private function runUpdateCheck()
140
  {
141
  if(!isset($this->optionVal['version'])
146
  }
147
 
148
 
 
 
 
149
  /***** FUNCTIONS
150
  ****************************************************************************************************/
151
+ // check if were on the login page
152
+ function is_login_page() {
153
+ return in_array($GLOBALS['pagenow'], array('wp-login.php', 'wp-register.php'));
154
+ }
155
+ // create a slug like string, given some text (ie: this-is-the-name)
156
  public function slugify($text)
157
  {
158
  // replace non letter or digits by -
171
  }
172
  return $text;
173
  }
174
+ // create an array for any fields left blank
175
+ // not sure if still needed
176
  public function getBlankFieldsArray($lid='')
177
  {
178
  $fields = array();
 
179
  // Add Field
180
  $name = $this->slugify('Email Address'.'-'.'EMAIL');
181
  $addField = array(
193
  'choices' => ''
194
  );
195
  $fields[$addField['id']] = $addField;
196
+ // return our fields
197
  return $fields;
198
  }
199
+
200
+ // Create an array of data for imported fields based on the Merge Varaibles passed back from MailChimp
201
  public function getImportedFieldsArray($lid, $mv)
202
  {
203
  if(empty($mv)) {
205
  } else {
206
  $fields = array();
207
 
208
+ $num = 1;
 
209
  foreach($mv['data'][0]['merge_vars'] as $field)
210
  {
211
  // Add Field
212
+ $name = $this->slugify(isset($field['label']).'-'.$field['tag']);
213
  $addField = array(
214
  'id' => $lid.'-'.$name,
215
  'name' => $lid.$field['tag'],
221
  'sort' => $field['order'],
222
  'type' => $field['field_type'],
223
  'help' => $field['helptext'],
224
+ 'default' => $field['default'],
225
+ 'placeholder' => (isset($field['placeholder-'.$lid.'-'.$num]) ? $field['placeholder-'.$lid.'-'.$num] : ''),
226
+ 'redirect_checkbox' => (isset($field['yks_mailchimp_redirect_'.$lid]) ? $field['yks_mailchimp_redirect_'.$lid] : ''),
227
+ 'selected_page' => (isset($field['page_id_'.$lid]) ? $field['page_id_'.$lid] : ''),
228
  'choices' => (isset($field['choices']) ? $field['choices'] : '')
229
  );
230
  $fields[$addField['id']] = $addField;
231
+ $num++;
232
  }
233
  return $fields;
234
  }
235
  }
236
+ // Get the current users browser information
237
+ // Used specifically on the lists page
238
  public function getBrowser()
239
  {
240
  $u_agent = $_SERVER['HTTP_USER_AGENT'];
327
  'pattern' => $pattern
328
  );
329
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
330
 
331
 
332
  /***** CONFIGURATION
333
  ****************************************************************************************************/
334
+ // Update our plugin options
335
+ // Runs when the user updates the settings page with new values
336
  public function updateOptions($p)
337
  {
338
  if(!empty($p['form_data']))
341
  $this->optionVal['api-key'] = $fd['yks-mailchimp-api-key'];
342
  $this->optionVal['flavor'] = $fd['yks-mailchimp-flavor'];
343
  $this->optionVal['debug'] = $fd['yks-mailchimp-debug'];
344
+ $this->optionVal['optin'] = $fd['yks-mailchimp-optin'];
345
+ $this->optionVal['single-optin-message'] = $fd['single-optin-message'];
346
+ $this->optionVal['double-optin-message'] = $fd['double-optin-message'];
347
+ $this->optionVal['interest-group-label'] = $fd['interest-group-label'];
348
+ $this->optionVal['yks-mailchimp-optIn-checkbox'] = $fd['yks-mailchimp-optIn-checkbox'];
349
+ $this->optionVal['yks-mailchimp-optIn-default-list'] = isset($fd['yks-mailchimp-optIn-default-list']) ? $fd['yks-mailchimp-optIn-default-list'] : null; // if its set, else set to null <- fixes save form settings bug
350
+ $this->optionVal['yks-mailchimp-optin-checkbox-text'] = $fd['yks-mailchimp-optin-checkbox-text'];
351
+ update_option('api_validation', 'valid_api_key');
352
  return update_option(YKSEME_OPTION, $this->optionVal);
353
  }
354
  return false;
355
  }
356
+ // Update the API Key
357
  public function updateApiKey($k)
358
  {
359
  $this->optionVal['api-key'] = $k;
360
  return update_option(YKSEME_OPTION, $this->optionVal);
361
  }
362
+ // Update the version number
363
  public function updateVersion($k)
364
  {
365
  $this->optionVal['version'] = $k;
369
 
370
  /********Mailchimp Error Codes
371
  *****************************************************************************************************/
372
+ // not sure these are used any more
373
+ // maybe remove
374
  public function YksMCErrorCodes ($error)
375
  {
376
  //Server Errors
495
  $errormessage[9] = "Sorry, that URL is invalid. Please try again.";
496
 
497
  // Get error message
 
498
  foreach ($errorcode as $eid => $value )
499
  {
500
  if ($eid == $error)
515
  }
516
 
517
 
 
518
  /***** LIST ACTIONS
519
  ****************************************************************************************************/
520
+ // Import a list from MailChimp and add it to the lists page
521
+ // Runs when user add's a list from the drop down on the list page
522
+ // Sending a call to MailChimp api to retrieve list data
523
+ public function addList($lid='' , $name='')
524
  {
525
+ if($lid == '' || isset($this->optionVal['lists'][$lid])) return false;
526
  $api = new wpyksMCAPI($this->optionVal['api-key']);
527
 
 
 
 
528
  $mv = $api->call('lists/merge-vars', array(
529
  'id' => array($lid)
530
  )
538
  'name' => $name,
539
  'fields' => $this->getImportedFieldsArray($lid, $mv)
540
  );
541
+
542
  $this->optionVal['lists'][$list['id']] = $list;
543
+
544
+ // store newly retreived list array in imported_list global option
545
+ update_option('imported_lists', $this->optionVal['lists']);
546
+
547
  if(update_option(YKSEME_OPTION, $this->optionVal))
548
  {
549
  return $this->generateListContainers(array($list));
550
  }
551
  }
552
  return false;
 
553
  }
554
 
555
+ ///////////////////////////////////////////////////
556
+ /* Get Interest Groups */
557
+ ///////////////////////////////////////////////////
558
+ // Send request to MailChimp API to retreive interest groups associated to a sepcific list
559
+ public function getInterestGroups($list_id)
560
+ {
561
+ // store our API key
562
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
563
+
564
+ // setup switch for div/table
565
+ $yikes_mc_flavor = $this->optionVal['flavor'];
566
+
567
+ // try the request, and catch any errors
568
+ try {
569
+ $interest_groups = $api->call('lists/interest-groupings', array( 'id' => $list_id ));
570
+ // if the list has an interest group
571
+ if ($interest_groups) {
572
+ // json_encode the data, and store it in optionVal['interest-groups']
573
+ $this->optionVal['interest-groups'] = json_encode($interest_groups);
574
+
575
+ $num = 0;
576
+
577
+ switch($yikes_mc_flavor)
578
+ {
579
+ // table flavor
580
+ case '0':
581
+ // loop over each interest group returned
582
+ foreach($interest_groups as $interest_group) {
583
+ // if the interest group label is set to '' on the settings page
584
+ if ( $this->optionVal['interest-group-label'] == '' ) {
585
+ $user_set_interest_group_label = '<label class="prompt yks_table_label yks-mailchimpFormTableRowLabel yks-mailchimpFormTableRowLabel-required font-secondary label-text">'.$interest_group['name'].'</label>'; // display the interest group name from MailChimp
586
+ } else {
587
+ $user_set_interest_group_label = '<label class="prompt yks_table_label yks-mailchimpFormTableRowLabel yks-mailchimpFormTableRowLabel-required font-secondary label-text">'.$this->optionVal['interest-group-label'].'</label>'; // else display the custom name set in the settings page
588
+ }
589
+ ?>
590
+ <!-- pass interest group data in a hidden form field , required to pass the data back to the correct interest-group -->
591
+ <input type='hidden' name='interest-group-data' value='<?php echo $this->optionVal["interest-groups"]; ?>' />
592
+ <?php
593
+ // get form type
594
+ $list_form_type = $interest_group['form_field'];
595
+ $interestGroupID = $interest_group['id'];
596
+
597
+ switch($list_form_type)
598
+ {
599
+
600
+ // checkbox interest groups
601
+ case 'checkboxes':
602
+ echo '<tr class="yks_mc_table_interest_group_holder yks_mc_table_checkbox_holder">';
603
+ echo '<td class="yks_mc_table_td">';
604
+ // display the label
605
+ echo $user_set_interest_group_label;
606
+ foreach ($interest_group['groups'] as $singleGrouping) {
607
+ $checkboxValue = $interest_group['name'];
608
+ echo '<label class="yks_mc_interest_group_label" for="'.$singleGrouping['name'].'"><input type="checkbox" id="'.$singleGrouping['name'].'" class="yikes_mc_interest_group_checkbox" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'[]" value="'.$singleGrouping['name'].'">'.$singleGrouping['name'].'</label>';
609
+ }
610
+ echo '</td>';
611
+ echo '</tr>';
612
+ break;
613
+
614
+ // radiobuttons interest groups
615
+ case 'radio':
616
+ echo '<tr class="yks_mc_table_interest_group_holder yks_mc_table_radio_holder">';
617
+ echo '<td class="yks_mc_interest_radio_button_holder yks_mc_table_td">';
618
+ // display the label
619
+ echo $user_set_interest_group_label;
620
+ foreach ($interest_group['groups'] as $singleGrouping) {
621
+ $radioValue = $interest_group['name'];
622
+ echo '<label class="yks_mc_interest_group_label" for="'.$singleGrouping['name'].'"><input type="radio" id="'.$singleGrouping['name'].'" class="yikes_mc_interest_group_radio" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'" value="'.$singleGrouping['name'].'">'.$singleGrouping['name'].'</label>';
623
+ }
624
+ echo '</td>';
625
+ echo '</tr>';
626
+ break;
627
+
628
+ // drop down interest groups
629
+ case 'dropdown':
630
+ echo '<tr class="yks_mc_table_interest_group_holder yks_mc_table_dropdown_holder">';
631
+ echo '<td class="yks_mc_table_dropdown_interest_group_holder yks_mc_table_td">';
632
+ // display the label
633
+ echo $user_set_interest_group_label;
634
+ echo '<select id="yks_mc_interest_dropdown" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'" class="yks_mc_interest_group_select">';
635
+ foreach ($interest_group['groups'] as $singleGrouping) {
636
+ $dropDownValue = $interest_group['name'];
637
+ echo '<option value="'.$singleGrouping['name'].'" name="'.$dropDownValue.'">'.$singleGrouping['name'].'</option>';
638
+ }
639
+ echo '</select>';
640
+ echo '</td>';
641
+ echo '</tr>';
642
+ break;
643
+ }
644
+ $num++;
645
+ }
646
+
647
+ break;
648
+
649
+ // div flavor
650
+ case '1':
651
+ // loop over each interest group returned
652
+ foreach($interest_groups as $interest_group) {
653
+ // if the interest group label is set to '' on the settings page
654
+ if ( $this->optionVal['interest-group-label'] == '' ) {
655
+ echo '<b class="yks_mc_interest_group_text">'.$interest_group['name'].'</b>'; // display the interest group name from MailChimp
656
+ } else {
657
+ echo '<b class="yks_mc_interest_group_text">'.$this->optionVal['interest-group-label'].'</b>'; // else display the custom name set in the settings page
658
+ }
659
+ ?>
660
+ <!-- pass interest group data in a hidden form field , required to pass the data back to the correct interest-group -->
661
+ <input type='hidden' name='interest-group-data' value='<?php echo $this->optionVal["interest-groups"]; ?>' />
662
+ <?php
663
+ // get form type
664
+ $list_form_type = $interest_group['form_field'];
665
+ $interestGroupID = $interest_group['id'];
666
+
667
+ switch($list_form_type)
668
+ {
669
+
670
+ // checkbox interest groups
671
+ case 'checkboxes':
672
+ echo '<div class="yks_mc_interest_group_holder">';
673
+ foreach ($interest_group['groups'] as $singleGrouping) {
674
+ $checkboxValue = $interest_group['name'];
675
+ echo '<label class="yks_mc_interest_group_label" for="'.$singleGrouping['name'].'"><input type="checkbox" id="'.$singleGrouping['name'].'" class="yikes_mc_interest_group_checkbox" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'[]" value="'.$singleGrouping['name'].'">'.$singleGrouping['name'].'</label>';
676
+ }
677
+ echo '</div>';
678
+ break;
679
+
680
+ // radiobuttons interest groups
681
+ case 'radio':
682
+ echo '<div class="yks_mc_interest_group_holder">';
683
+ echo '<div class="yks_mc_interest_radio_button_holder">';
684
+ foreach ($interest_group['groups'] as $singleGrouping) {
685
+ $radioValue = $interest_group['name'];
686
+ echo '<label class="yks_mc_interest_group_label" for="'.$singleGrouping['name'].'"><input type="radio" id="'.$singleGrouping['name'].'" class="yikes_mc_interest_group_radio" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'" value="'.$singleGrouping['name'].'">'.$singleGrouping['name'].'</label>';
687
+ }
688
+ echo '</div>';
689
+ echo '</div>';
690
+ break;
691
+
692
+ // drop down interest groups
693
+ case 'dropdown':
694
+ echo '<div class="yks_mc_interest_group_holder">';
695
+ echo '<select id="yks_mc_interest_dropdown" name="'.$interest_group['form_field'].'-'.$interest_group['id'].'" class="yks_mc_interest_group_select">';
696
+ foreach ($interest_group['groups'] as $singleGrouping) {
697
+ $dropDownValue = $interest_group['name'];
698
+ echo '<option value="'.$singleGrouping['name'].'" name="'.$dropDownValue.'">'.$singleGrouping['name'].'</option>';
699
+ }
700
+ echo '</select>';
701
+ echo '</div>';
702
+ break;
703
+ }
704
+ $num++;
705
+ }
706
+ break;
707
+
708
+ }
709
+ }
710
+ } catch( Exception $e ) {
711
+ return;
712
+ }
713
+ return false;
714
+ }
715
+ // Send a call to the MailChimp API to retreive all lists on the account
716
  public function getLists()
717
  {
718
  $api = new wpyksMCAPI($this->optionVal['api-key']);
719
  $lists = $this->getListsData();
720
+ $listArr = (!isset($listArr) ? $this->optionVal['lists'] : $listArr);
721
  $theusedlist = array();
722
  if(count($listArr) > 0)
723
  {
730
  {
731
  echo "<select id='yks-list-select' name='yks-list-select'>";
732
  echo "<option value=''> Select List</option>";
733
+
734
  foreach ($lists as $lkey => $lvalue)
735
  {
736
  if (!in_array($lkey, $theusedlist))
742
  }
743
  return false;
744
  }
745
+ // Get lists for the settings page
746
+ // Used for default subscription list
747
+ public function getOptionsLists()
748
+ {
749
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
750
+ $lists = $this->getListsData();
751
+ $listArr = (!isset($listArr) ? $this->optionVal['lists'] : $listArr);
752
+ if($lists)
753
+ {
754
+ echo "<select id='yks-mailchimp-optIn-default-list' name='yks-mailchimp-optIn-default-list'>";
755
+ echo "<option value='select_list'> Select List</option>";
756
+ foreach ($lists as $lkey => $list_name)
757
+ {
758
+ echo "<option ".selected( isset($this->optionVal['yks-mailchimp-optIn-default-list']) ? $this->optionVal['yks-mailchimp-optIn-default-list'] : "select_list", $lkey )." value='".$lkey."'>".$list_name."</option>";
759
+ }
760
+ echo "</select>";
761
+ }
762
+ return false;
763
+ }
764
+ // Send a call to MailChimp API to get the data associated with a specific list (in this instance: the fields, and the subscriber count)
765
  public function getListsData()
766
  {
767
+ /*
768
  $theListItems = get_transient('yks-mcp-listdata-retrieved');
769
  if (!$theListItems)
770
  {
771
+ */
772
  $api = new wpyksMCAPI($this->optionVal['api-key']);
773
  $lists = $api->call('lists/list', array( 'limit' => 100 ));
774
  if($lists)
775
  {
776
  foreach ($lists['data'] as $list)
777
  {
778
+ $theListItems[$list['id']] = $list['name'];
779
+ $theListItems['subscriber-count']['subscriber-count-'.$list['id']] = $list['stats']['member_count'];
780
  }
781
+
782
  }
783
+ /* set_transient( 'yks-mcp-listdata-retrieved', $theListItems, 60/60 ); //cache lists for 15 seconds for testing, originally 5 mins 60*5 */
784
+ /* } */
785
  return $theListItems;
786
  }
787
+ // Sort through the returned data
788
  public function sortList($p)
789
  {
790
  if(empty($p['update_string'])
817
  }
818
  return ($a < $b) ? -1 : 1;
819
  }
820
+
821
+ // Update a single list on the lists page
822
+ // This function fires when the user clicks 'save settings' for a specific form on the lists page
823
  public function updateList($p)
824
  {
825
  if(!empty($p['form_data']))
827
  parse_str($p['form_data'], $fd);
828
  if(!empty($fd['yks-mailchimp-unique-id']))
829
  {
830
+ $num = 1;
831
  foreach($this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'] as $k => $v)
832
  {
833
  // Only proceed if the field is not locked
834
  if($v['require'] == 0)
835
  {
836
  // Make sure this field was included in the update
837
+ $this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'][$k]['active'] = (isset($fd[$v['name']]) ? '1' : '0');
838
+ }
839
+ // $name = $this->slugify($field['label'].'-'.$field['tag']);
840
+ $this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'][$k]['placeholder-'.$fd['yks-mailchimp-unique-id'].'-'.$num] = $fd['placeholder-'.$fd['yks-mailchimp-unique-id'].'-'.$num];
841
+
842
+ $num++;
843
+
844
+ $this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'][$k]['yks_mailchimp_redirect_'.$fd['yks-mailchimp-unique-id']] = $fd['yks_mailchimp_redirect_'.$fd['yks-mailchimp-unique-id']];
845
+
846
+ if(isset($fd['yks_mailchimp_redirect_'.$fd['yks-mailchimp-unique-id']])) {
847
+ $this->optionVal['lists'][$fd['yks-mailchimp-unique-id']]['fields'][$k]['page_id_'.$fd['yks-mailchimp-unique-id']] = $fd['page_id_'.$fd['yks-mailchimp-unique-id']];
848
  }
849
+
850
  }
851
  return update_option(YKSEME_OPTION, $this->optionVal);
852
  }
853
  }
854
  return false;
855
  }
856
+ // Remove a list from the lists page
857
+ // Runs when a user clicks 'delete list' on the lists page
858
  public function deleteList($i=false)
859
  {
860
  if($i == false) return false;
861
  else
862
  {
863
  unset($this->optionVal['lists'][$i]);
864
+ update_option('imported_lists', $this->optionVal['lists']);
865
  return update_option(YKSEME_OPTION, $this->optionVal);
866
  }
867
  }
868
+ // Import a list to the lists page
869
+ // Runs when a user adds a list from the drop down on the lists page
870
  public function importList($i=false)
871
  {
872
  if($i == false) return false;
873
  else
874
  {
875
+ // create our variables
876
  $lid = $this->optionVal['lists'][$i]['list-id'];
877
  $name = $this->optionVal['lists'][$i]['name'];
878
  $api = new wpyksMCAPI($this->optionVal['api-key']);
880
  'id' => array( $lid )
881
  )
882
  );
883
+ // if merge variables are returned
884
  if($mv)
885
  {
886
  $mv = $this->getImportedFieldsArray($lid, $mv);
897
  }
898
  return false;
899
  }
900
+ // Make a call to the MailChimp API to retrieve all subscribers to a given list
901
+ // Runs when the user clicks 'view' next to the subscriber count on the list page
902
+ public function listAllSubscribers($lid, $list_name) {
903
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
904
+ $subscribers_list = $api->call('lists/members',
905
+ array(
906
+ 'id' => $lid,
907
+ 'opts' => array(
908
+ 'limit' => '100',
909
+ 'sort_field' => 'optin_time',
910
+ 'sort_dir' => 'DESC'
911
+ )
912
+ )
913
+ );
914
+ // if the subscriber count is greater than 0
915
+ // display all subscribers in a table
916
+ if($subscribers_list['total'] > 0) {
917
+ ?>
918
+ <h2><?php echo $list_name; echo ' <span class="subscriber-count" style="font-size:11px;">(<span class="number">'.$subscribers_list['total'].'</span> subscribers)</span>'; ?></h2>
919
+ <p><?php _e('Click on a subscriber to see further information','yikes-inc-easy-mailchimp-extender'); ?></p>
920
+
921
+ <table id="yikes-mailchimp-subscribers-table" class="yks-mailchimp-fields-list" style="width:100%;">
922
+ <thead class="yikes-mailchimp-subscribers-table-head">
923
+ <tr>
924
+ <th width="50%"><?php _e('E-Mail','yikes-inc-easy-mailchimp-extender'); ?></th>
925
+ <th width="50%"><?php _e('Date Subscribed','yikes-inc-easy-mailchimp-extender'); ?></th>
926
+ </tr>
927
+ </thead>
928
+ <?php
929
+ foreach ( $subscribers_list['data'] as $subscriber ) {
930
+ $timeStamp = explode(' ', $subscriber['timestamp_opt'] );
931
+ echo '<tr class="yks-mailchimp-subscribers-list-row" id="yks-mailchimp-subscribers-list-row">';
932
+ echo '<td><a class="subscriber-mail-link" rel="'.$subscriber["email"].'" class="subscriberEmailAddress">'.$subscriber['email'].'</a></td>';
933
+ // echo '<td>'.str_replace('-', ' ', date("M-jS-Y", strtotime($subscriber['timestamp_opt']))).'</td>';
934
+ echo '<td>'.str_replace('-', ' ', date("M-jS-Y", strtotime($timeStamp[0]))).'</td></tr>';
935
+ }
936
+ ?>
937
+ </table>
938
 
939
+ <!-- display a single user profile in this div -->
940
+ <div id="individual_subscriber_information" style="display:none;"></div>
941
+ <?php
942
+ } else { // else display an error of sorts
943
+ ?>
944
+ <h2><?php echo $list_name; echo ' <span class="subscriber-count" style="font-size:11px;">(<span class="number">0</span> subscribers)</span>'; ?></h2>
945
+ <?php
946
+ _e('Sorry You Don\'t Currently Have Any Subscribers In This List!','yikes-inc-easy-mailchimp-extender');
947
+ }
948
+ wp_die();
949
+ }
950
 
951
+ // Make a call to the MailChimp API to retrieve information about a specific user
952
+ // Runs when the user clicks a subscribers email address
953
+ public function getSubscriberInfo($lid, $email) {
954
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
955
+ $subscriber_info = $api->call('lists/member-info',
956
+ array(
957
+ 'id' => $lid,
958
+ 'emails' => array(
959
+ 0 => array(
960
+ 'email' => $email,
961
+ ),
962
+ )
963
+ )
964
+ );
965
+ // if the subscriber count is greater than 0
966
+ // display all subscribers in a table
967
+ if($subscriber_info) {
968
+ // store user data into variables
969
+ $subscriber_data = $subscriber_info['data'][0];
970
+ $member_rating = $subscriber_data['member_rating'];
971
+ // firstname/lastname data inside of new array
972
+ $subscriber_data_merges = $subscriber_data['merges'];
973
+ // seperate date+time
974
+ $subscriber_data_info_changed = explode(' ' , $subscriber_data['info_changed']);
975
+ $subscriber_data_timestamp_opt = explode (' ', $subscriber_data['timestamp_opt']);
976
+ // store date+time in seperate variables
977
+ $subscriber_data_info_changed_date = $subscriber_data_info_changed[0];
978
+ $subscriber_data_info_changed_time = $subscriber_data_info_changed[1];
979
+ // store optin-time+date in seperate variables
980
+ $subscriber_data_info_optin_date = $subscriber_data_timestamp_opt[0];
981
+ $subscriber_data_info_optin_time = $subscriber_data_timestamp_opt[1];
982
+
983
+ // create our language variable dependent on what is set in MailChimp
984
+ include_once('set_language.php');
985
+
986
+ // create star rating variable, based on returned member_rating value
987
+ if(isset($member_rating)) {
988
+ if ($member_rating == 1) {
989
+ $member_rating_stars = '<div class="yks-mc-subscriber-rating"><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span></div>';
990
+ } else if ($member_rating == 2) {
991
+ $member_rating_stars = '<div class="yks-mc-subscriber-rating"><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span></div>';
992
+ } else if ($member_rating == 3) {
993
+ $member_rating_stars = '<div class="yks-mc-subscriber-rating"><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span></div>';
994
+ } else if ($member_rating == 4) {
995
+ $member_rating_stars = '<div class="yks-mc-subscriber-rating"><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-empty"></span></div>';
996
+ } else if ($member_rating == 5) {
997
+ $member_rating_stars = '<div class="yks-mc-subscriber-rating"><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span><span class="subscriber_rating_star dashicons dashicons-star-filled"></span></div>';
998
+ }
999
+ }
1000
+ ?>
1001
+
1002
+ <div class="yks-mc-subscriber-top">
1003
+ <span class="button-primary dashicons dashicons-arrow-left-alt2 yks-mc-subscriber-go-back"><?php _e('Back to Subscriber List', 'yikes-inc-easy-mailchimp-extender'); ?></span>
1004
+ <h2 class="yks-mc-subscriber-header"><?php _e('Subscriber Details', 'yikes-inc-easy-mailchimp-extender'); ?> </h2>
1005
+ <!-- display users email address -->
1006
+ <h3 id="yks-subscriber-info-email-address"><?php echo $subscriber_data['email']; ?></h3>
1007
+ <!-- display member star rating pulled from MailChimp -->
1008
+ <?php echo $member_rating_stars; ?>
1009
+ <!-- user optin time and date -->
1010
+ <span class="yks-subscriber-info-optin-data">
1011
+ <?php echo 'Subscribed on : '.date('m/d/Y',strtotime($subscriber_data_info_optin_date)); ?><?php echo ' at '.date('g:i A',strtotime($subscriber_data_info_optin_time)); ?>
1012
+ </span>
1013
+ </div>
1014
+
1015
+ <h2 class="yks-mc-subscriber-header"><?php _e('Overview', 'yikes-inc-easy-mailchimp-extender'); ?></h2>
1016
+ <div class="yks-mc-subscriber-overview">
1017
+
1018
+ <div class="yks-mc-subscriber-left-container">
1019
+
1020
+ <label class="yks-mc-overview-title"><?php _e('First Name', 'yikes-inc-easy-mailchimp-extender'); ?></label>
1021
+ <p class="yks-mc-overview-info-value yks-mc-subscriber-firstName"><?php if(!empty($subscriber_data_merges['FNAME'])) { echo $subscriber_data_merges['FNAME']; } else { echo 'not provided'; } ?></p>
1022
+
1023
+ <label class="yks-mc-overview-title"><?php _e('Last Updated', 'yikes-inc-easy-mailchimp-extender'); ?></label>
1024
+ <p class="yks-mc-overview-info-value"><?php echo date('m/d/Y',strtotime($subscriber_data_info_changed_date)); ?><?php echo ' at '.date('g:i A',strtotime($subscriber_data_info_changed_time)); ?></p>
1025
+
1026
+ <label class="yks-mc-overview-title"><?php _e('Preferred Email Type', 'yikes-inc-easy-mailchimp-extender'); ?></label>
1027
+ <p class="yks-mc-overview-info-value"><?php if(!empty($subscriber_data['email_type'])) { echo $subscriber_data['email_type']; } else { echo 'No Preference.'; } ?></p>
1028
+
1029
+ </div>
1030
 
1031
+ <div class="yks-mc-subscriber-right-container">
1032
+
1033
+ <label class="yks-mc-overview-title"><?php _e('Last Name', 'yikes-inc-easy-mailchimp-extender'); ?></label>
1034
+ <p class="yks-mc-overview-info-value yks-mc-subscriber-lastName"><?php if(!empty($subscriber_data_merges['LNAME'])) { echo $subscriber_data_merges['LNAME']; } else { echo 'not provided'; } ?></p>
1035
+
1036
+ <label class="yks-mc-overview-title"><?php _e('Language', 'yikes-inc-easy-mailchimp-extender'); ?></label>
1037
+ <p class="yks-mc-overview-info-value"><?php echo $subscriber_data_language; ?></p>
1038
+
1039
+ </div>
1040
+
1041
+
1042
+ </div>
1043
+
1044
+
1045
+ <?php
1046
+ // build our segment array to determine if the user is subscribed to any segments
1047
+ $segment_count = array();
1048
+ // check if groupings data is set (for segment and interest groups)
1049
+ // this avoids an error being thrown when no segment/interest groups have been selected
1050
+ if ( isset( $subscriber_data_merges['GROUPINGS'] ) ) {
1051
+ foreach ($subscriber_data_merges['GROUPINGS'] as $group1) {
1052
+ foreach ($group1['groups'] as $group2) {
1053
+ if ($group2['interested'] == 1) {
1054
+ array_push($segment_count, $group2['name']);
1055
+ }
1056
+ }
1057
+ }
1058
+ }
1059
+ // test $segment_count array
1060
+ // print_r($segment_count);
1061
+ ?>
1062
+ <!-- returns true always, groupings gets stored, but segments do not // need to check if there are any segments stored in the groupings array -->
1063
+ <h2 class="yks-mc-subscriber-header"><?php _e('Groups Subscribed To', 'yikes-inc-easy-mailchimp-extender'); ?></h2>
1064
+ <!-- display what groups/segments the subscriber is subscribed too -->
1065
+ <?php
1066
+
1067
+ // if the user is subscribed to some segment
1068
+ if(!empty($segment_count)) {
1069
+
1070
+ $groups_array = array(
1071
+ 'group_name' => '',
1072
+ 'segments' => array()
1073
+ );
1074
+
1075
+ $num = 0;
1076
+ foreach ($subscriber_data_merges['GROUPINGS'] as $group_name) {
1077
+ $groups_array[$num]['group_name'] = $group_name['name'];
1078
+ foreach ($group_name['groups'] as $groupData ) {
1079
+ if ($groupData['interested'] == 1) {
1080
+ $groups_array[$num]['segments'] = $groupData['name'];
1081
+ }
1082
+ }
1083
+ $num++;
1084
+ }
1085
+
1086
+ // build up the segments array that the user is subscribed too
1087
+ foreach ( $groups_array as $group_data ) {
1088
+ if(!empty($group_data['segments'])) {
1089
+ ?>
1090
+ <ul>
1091
+ <?php
1092
+ echo '<li style="font-size:16px; color:#333;">'.$group_data['group_name'].'</li>';
1093
+ if(!empty($group_data['group_name']) && isset($group_data['segments'])) {
1094
+ echo 'Segments : '; echo implode(' ,', array($group_data['segments']));
1095
+ } elseif (count($group_data['segments']) == 0) {
1096
+ echo 'n/a';
1097
+ }
1098
+ ?>
1099
+ </ul>
1100
+ <?php
1101
+ }
1102
+ }
1103
+
1104
+ } else {
1105
+ // if there are no segments subscribed too
1106
+ // just print a message none specified
1107
+ echo 'none specified';
1108
+ }
1109
+
1110
+ // display the notes associated with a user if there are any returned
1111
+ if(!empty($subscriber_data['notes'])) { ?>
1112
+ <div class="yks-mc-subscriber-bottom">
1113
+ <h2 class="yks-mc-subscriber-header"><?php _e('Subscriber Notes', 'yikes-inc-easy-mailchimp-extender'); ?></h2>
1114
+ <?php
1115
+ foreach ( $subscriber_data['notes'] as $note ) {
1116
+ ?>
1117
+ <textarea style="width:100%; height:100px; resize:none;" id="yks-mc-subscriber-notes" disabled><?php echo $note['note']; ?></textarea>
1118
+ <span style="font-size:11px; opacity:.75;"><?php _e('Written by', 'yikes-inc-easy-mailchimp-extender'); ?>: <?php echo $note['created_by_name']; ?> // <?php _e('Created on', 'yikes-inc-easy-mailchimp-extender'); ?>: <?php echo date('m/d/Y',strtotime($note['created'])); ?></span>
1119
+ <?php
1120
+ }
1121
+ ?>
1122
+ </div>
1123
+ <?php } ?>
1124
+
1125
+ <!-- <h2>Var Dump</h2> -->
1126
+ <?php /* print_r($subscriber_info); // testing the returned subscriber info data */
1127
+
1128
+ }
1129
+ wp_die();
1130
+ }
1131
 
1132
+ // Make a call to the MailChimp API to remove a specified user from a given list
1133
+ // Runs when the user clicks the 'X' next to a subscriber when viewing all subscribers on the lists page
1134
+ public function yks_removeSubscriber($lid, $user_email) {
1135
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
1136
+ $subscribers_list = $api->call('lists/unsubscribe', array(
1137
+ 'id' => $lid,
1138
+ 'email' => array(
1139
+ 'email' => $user_email
1140
+ )
1141
+ ));
1142
+ }
1143
 
1144
  /***** SCRIPTS/STYLES
1145
  ****************************************************************************************************/
1147
  {
1148
  // Register Styles
1149
  wp_register_style('ykseme-css-base', YKSEME_URL.'css/style.ykseme.css', array(), '1.0.0', 'all');
1150
+ wp_register_style('jquery-datatables-pagination', YKSEME_URL.'css/jquery.dataTables.css', array(), '1.0.0', 'all');
1151
  // Enqueue Styles
1152
  wp_enqueue_style('thickbox');
1153
+ wp_enqueue_style('ykseme-css-base');
1154
+ wp_enqueue_style('jquery-datatables-pagination');
1155
  }
1156
 
1157
  public function addStyles_frontend()
1158
  {
1159
  // Register Styles
1160
  wp_register_style('ykseme-css-base', YKSEME_URL.'css/style.ykseme.css', array(), '1.0.0', 'all');
1161
+ wp_register_style('ykseme-css-smoothness', '//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css', array(), '1.0.0', 'all');
1162
+ wp_register_style('ykseme-animate-css', YKSEME_URL.'css/animate.css', array(), '1.0.0', 'all');
1163
  // Enqueue Styles
1164
  wp_enqueue_style('ykseme-css-base');
1165
  wp_enqueue_style('ykseme-css-smoothness');
1166
+ wp_enqueue_style('ykseme-animate-css');
1167
  }
1168
 
1169
  public function addScripts()
1174
  wp_enqueue_script('jquery-ui-sortable');
1175
  wp_enqueue_script('jquery-ui-tabs');
1176
  wp_enqueue_script('ykseme-base', YKSEME_URL.'js/script.ykseme.js', array('jquery'));
1177
+ wp_enqueue_script('jquery-datatables-pagination', YKSEME_URL.'js/jquery.dataTables.js', array('jquery'));
1178
+ }
1179
+
1180
+ // redirect the user to the settings page on initial activation
1181
+ function yks_easy_mc_plugin_activation_redirect() {
1182
+ if (get_option('yks_easy_mc_plugin_do_activation_redirect', false)) {
1183
+ delete_option('yks_easy_mc_plugin_do_activation_redirect');
1184
+ // redirect to settings page
1185
+ wp_redirect(admin_url('/admin.php?page=yks-mailchimp-form'));
1186
+ }
1187
  }
1188
 
1189
  public function addScripts_frontend()
1190
  {
1191
  global $wp_scripts;
1192
+
1193
  $version ='1.9.0';
1194
+ // compare the registered version of jQuery with 1.9.0
1195
+ if ( ( version_compare( @$wp_scripts->registered['jquery']->ver, $version ) >= 0 ) && !is_admin() )
1196
  {
1197
  wp_enqueue_script( 'jquery' );
1198
  }
1199
  else
1200
  {
1201
+ if ( !is_admin() && !$this->is_login_page() ) {
1202
+ // if its older, or non-existent, load the newest version from google CDN
1203
+ wp_deregister_script('jquery');
1204
+ wp_register_script('jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/'.$version.'/jquery.min.js', false, $version );
1205
+ wp_enqueue_script( 'jquery' );
1206
+ }
1207
  }
1208
  // Everything else
1209
  wp_enqueue_script('jquery-ui-core');
1211
  }
1212
 
1213
 
 
1214
  /***** SHORTCODES
1215
  ****************************************************************************************************/
1216
+ // Function to process the shortcode provided by the plugin
1217
+ // $p is the data associated with the shortcode (ie: form id and submit button text)
1218
  public function processShortcode($p)
1219
  {
1220
  ob_start();
1221
  if($this->optionVal['api-key'] != ''
1222
+ && (is_array($this->optionVal['lists'][$p['id']]) && !empty($this->optionVal['lists'][$p['id']])))
1223
  {
1224
  // Setup this list
1225
  $list = $this->optionVal['lists'][$p['id']];
1226
+ $submit_text = $p['submit_text'];
1227
  // Which form are we on?
1228
  if(!isset($this->currentLists[$p['id']]))
1229
  $this->currentLists[$p['id']] = 0;
1242
  // List form
1243
  include YKSEME_PATH.'templates/shortcode_form.php';
1244
  }
1245
+ // if there is no api key entered, or it's an invalid api key
1246
+ else if ( $this->optionVal['api-key'] == '' || get_option( 'api_validation' ) == 'invalid_api_key' )
1247
  {
1248
+ include YKSEME_PATH.'templates/shortcode_error_no_API_key.php';
1249
+ // else if the form was removed from the lists page
1250
+ } else {
1251
+ include YKSEME_PATH.'templates/shortcode_error_data.php';
1252
  }
1253
  $shortcode = ob_get_contents();
1254
  ob_end_clean();
1255
  return $shortcode;
1256
  }
1257
+ // Function to process the PHP snippet provided by the plugin
1258
+ // Again the data passed in, is the shortcode/php snippet paramaters (form id, submit button text)
1259
+ public function processSnippet($list=false, $submit_text)
1260
  {
1261
+ $p = array(
1262
+ 'id' => $list,
1263
+ 'submit_text' => $submit_text
1264
+ );
1265
  return $this->processShortcode($p);
1266
  }
1267
 
1268
 
 
 
 
1269
  /***** ADMINISTRATION MENUS
1270
  ****************************************************************************************************/
1271
  public function addAdministrationMenu()
1272
  {
1273
  // Top Level Menu
1274
+ add_menu_page( __('MailChimp Forms','yikes-inc-easy-mailchimp-extender'), __('MailChimp Forms','yikes-inc-easy-mailchimp-extender'), 'manage_options', 'yks-mailchimp-form', array(&$this, 'generatePageOptions'), 'dashicons-welcome-write-blog', 400);
1275
  // Sub Items
1276
+ add_submenu_page('yks-mailchimp-form', __('MailChimp Forms','yikes-inc-easy-mailchimp-extender'), __('MailChimp Settings','yikes-inc-easy-mailchimp-extender'), 'manage_options', 'yks-mailchimp-form', array(&$this, 'generatePageOptions'));
1277
+ add_submenu_page('yks-mailchimp-form', __('Manage List Forms','yikes-inc-easy-mailchimp-extender'), __('Manage List Forms','yikes-inc-easy-mailchimp-extender'), 'manage_options', 'yks-mailchimp-form-lists', array(&$this, 'generatePageLists'));
1278
+ add_submenu_page('yks-mailchimp-form', __('About YIKES, Inc.','yikes-inc-easy-mailchimp-extender'), __('About YIKES, Inc.','yikes-inc-easy-mailchimp-extender'), 'manage_options', 'yks-mailchimp-about-yikes', array(&$this, 'generatePageAboutYikes'));
1279
  }
1280
 
1281
 
 
 
 
1282
  /***** ADMINISTRATION PAGES
1283
  ****************************************************************************************************/
1284
  public function generatePageOptions()
1285
  {
1286
+ require_once YKSEME_PATH.'pages/options.php'; // include our options page
1287
  }
1288
  public function generatePageLists()
1289
  {
1290
+ require_once YKSEME_PATH.'pages/lists.php'; // include our lists page
1291
  }
1292
  public function generatePageAboutYikes()
1293
  {
1294
+ require_once YKSEME_PATH.'pages/about.php'; // include our about page
1295
  }
1296
+ public function registerMailChimpWidget()
1297
+ {
1298
+ require_once YKSEME_PATH.'templates/yikes-mailchimp-widget.php'; // include our widget
1299
+ }
1300
 
1301
 
1302
  /***** FORM DATA
1303
+ ****************************************************************************************************/
1304
+ public function yks_resetPluginSettings() {
1305
+ // reset the plugin settings back to defaults
1306
+ $this->optionVal['api-key'] = '';
1307
+ $this->optionVal['flavor'] = '1';
1308
+ $this->optionVal['debug'] = '0';
1309
+ $this->optionVal['optin'] = 'true';
1310
+ $this->optionVal['single-optin-message'] = __('Thank You for subscribing!', 'yikes-inc-easy-mailchimp-extender');
1311
+ $this->optionVal['double-optin-message'] = __('Thank You for subscribing! Check your email for the confirmation message.', 'yikes-inc-easy-mailchimp-extender');
1312
+ $this->optionVal['interest-group-label'] = '';
1313
+ $this->optionVal['yks-mailchimp-optIn-checkbox'] = 'hide';
1314
+ $this->optionVal['yks-mailchimp-optIn-default-list'] = array();
1315
+ $this->optionVal['yks-mailchimp-optin-checkbox-text'] = 'SIGN ME UP!';
1316
+ update_option('api_validation' , 'invalid_api_key');
1317
+ return update_option(YKSEME_OPTION, $this->optionVal);
1318
+
1319
+ }
1320
 
1321
+ // Make a call to MailChimp API to validate the provided API key
1322
+ // calls the helper/ping method, and returns true or false
1323
  public function validateAPIkeySettings()
1324
  {
1325
+ // Create and store our variables to pass to MailChimp
1326
+ $apiKey = $_POST['api_key']; // api key
1327
+ $dataCenter = $_POST['data_center']; // data center (ie: us3)
1328
  $api = new wpyksMCAPI($apiKey);
1329
+ // try the call, catch any errors that may be thrown
 
 
 
 
 
 
1330
  try {
 
1331
  $resp = $api->call('helper/ping', array('apikey' => $apiKey));
1332
  echo $resp['msg'];
1333
+ $this->getOptionsLists();
1334
  } catch( Exception $e ) {
1335
  $errorMessage = str_replace('API call to helper/ping failed:', '', $e->getMessage());
1336
+ _e($errorMessage,'yikes-inc-easy-mailchimp-extender');
1337
  update_option('api_validation', 'invalid_api_key');
1338
  }
1339
+ // always die or it will always return 1
 
1340
  wp_die();
1341
  }
1342
 
1343
+ // Make a call to MailChimp API to add a new subscriber to a specified list
1344
+ // Runs when a user fills out the form on the frontend of the site
1345
  public function addUserToMailchimp($p)
1346
  {
1347
  if(!empty($p['form_data']))
1349
  parse_str($p['form_data'], $fd);
1350
  if(!empty($fd['yks-mailchimp-list-id']))
1351
  {
1352
+ // Create and store the variables needed to add a new subscriber
1353
  $email = false;
1354
+ $lid = $fd['yks-mailchimp-list-id'];
1355
  $api = new wpyksMCAPI($this->optionVal['api-key']);
1356
  $mv = array();
1357
+ $optin = $this->optionVal['optin'];
1358
+
 
1359
  foreach($this->optionVal['lists'][$lid]['fields'] as $field) : if($field['active'] == '1') :
1360
+
1361
  // Check to see if the field is in the post
1362
  if(isset($fd[$field['name']])) :
1363
 
1371
  default:
1372
  $mv[$field['merge']] = $fd[$field['name']];
1373
  break;
1374
+
1375
  case 'address':
1376
  $mv[$field['merge']] = array(
1377
  'addr1' => $fd[$field['name']],
1382
  'country' => 'US'
1383
  );
1384
  break;
1385
+
1386
  }
1387
+
1388
  endif;
1389
  endif; endforeach;
1390
 
1391
+ // Interest group loop to build the GROUPINGS array
1392
+ // The GROUPINGS array passes our interest group, and values back to the specific form
1393
+ $interest_group_option = json_decode($fd['interest-group-data'], true);
1394
+
1395
+ // if interest groups exist, continue and form an array
1396
+ if ( $interest_group_option ) {
1397
+
1398
+ // print_r($interest_group_option);
1399
+ $mv['GROUPINGS'] = array();
1400
+
1401
+ // loop over each interest group
1402
+ foreach ($interest_group_option as $group ) :
1403
+
1404
+ switch($group['form_field'])
1405
+ {
1406
+ case 'radio':
1407
+ case 'dropdown':
1408
+ array_push($mv['GROUPINGS'], array(
1409
+ 'id' => $group['id'],
1410
+ // 'groups' => array($fd['interest-group'])
1411
+ 'groups' => array(isset($fd[$group['form_field'].'-'.$group['id']]) ? $fd[$group['form_field'].'-'.$group['id']] : '')
1412
+ )
1413
+ );
1414
+ break;
1415
+
1416
+ case 'checkboxes':
1417
+ array_push($mv['GROUPINGS'], array(
1418
+ 'id' => $group['id'],
1419
+ // 'groups' => array($fd['interest-group'])
1420
+ 'groups' => (isset($fd[$group['form_field'].'-'.$group['id']]) ? $fd[$group['form_field'].'-'.$group['id']] : '')
1421
+ // $fd[$group['form_field'].'-'.$group['id']]
1422
+
1423
+ )
1424
+ );
1425
+ break;
1426
+ }
1427
+ endforeach; // end loop
1428
+
1429
+ }
1430
+
1431
+ // If no email provided, fail
1432
  $noemail = "The email address is blank";
1433
  if($email === false) return $noemail;
1434
+
1435
+ // Add custom filter here, to capture user submitted
1436
+ // data before it's sent off to MailChimp
1437
+ $form_data = apply_filters( 'yikes_mc_get_form_data', $lid, $mv );
1438
+ $specific_form_data = apply_filters( 'yikes_mc_get_form_data_'.$lid, $lid, $mv );
1439
+
1440
+
1441
+ // try adding subscriber, catch any error thrown
1442
+ try {
1443
+ $retval = $api->call('lists/subscribe', array(
1444
+ 'id' => $lid, // form id
1445
+ 'email' => array( 'email' => $email ), // user email
1446
+ 'merge_vars' => $mv, // merge variables (ie: fields and interest groups)
1447
+ 'double_optin' => $optin // double optin value (retreived from the settings page)
1448
+ ));
1449
+ return "done";
1450
+ } catch( Exception $e ) { // catch any errors returned from MailChimp
1451
+ $errorCode = $e->getCode();
1452
+ if ( $errorCode = '214' ) {
1453
+ $errorMessage = str_replace('Click here to update your profile.', '', $e->getMessage());
1454
+ $error_catch = explode('to list', $errorMessage);
1455
+ echo $error_catch[0].'.';
1456
+ die();
1457
+ } else {
1458
+ echo $e->getMessage();
1459
+ die();
1460
+ }
1461
  }
1462
+
1463
  }
1464
  }
1465
+ return __('One or more fields are empty','yikes-inc-easy-mailchimp-extender'); // return an error if your leaving any necessary fields empty
1466
  }
1467
 
1468
+
1469
+ // get our merge variables associated with a sepcific list
1470
+ // may not need any more
1471
+ // maybe remove
1472
+ /*
1473
  private function getFieldMergeVar($fn, $lid)
1474
  {
1475
  $mk = '_YKS_UNKNOWN';
1494
  }
1495
  return $mk;
1496
  }
1497
+ */
1498
 
1499
+ // Generate the lists containers on the lists page
1500
+ // This function gets any imported lists, and builds up the lists page
1501
  public function generateListContainers($listArr=false)
1502
  {
1503
  $listArr = ($listArr == false ? $this->optionVal['lists'] : $listArr);
1504
  $thelistdata = $this->getListsData(); //Get list names from API
1505
+ // if there are any imported lists in the array
1506
  if(count($listArr) > 0)
1507
  {
 
1508
  ob_start();
1509
+ // loop over each lists and build the page
1510
  foreach($listArr as $list)
1511
  {
1512
+
1513
+ $get_list_data = $this->getListsData();
1514
  ?>
1515
  <div class="yks-list-container" id="yks-list-container_<?php echo $list['id']; ?>">
1516
  <div class="yks-status" id="yks-status" style="display: none;">
1517
+ <div class="yks-success" style="padding:.25em;"><p>&nbsp;<?php _e('Your List Was Successfully Saved!','yikes-inc-easy-mailchimp-extender'); ?></p></div>
1518
  </div>
1519
+ <div class="yks-status-error" id="yks-status-error" style="display: none;">
1520
+ <div class="yks-error" style="padding:.25em;"><p>&nbsp;<?php _e('Your settings were not saved (or you did not change them).','yikes-inc-easy-mailchimp-extender'); ?></p></div>
1521
+ </div>
1522
+ <span class="yikes-lists-error" style="display:none;"><?php _e('I\'m sorry there was an error with your request.','yikes-inc-easy-mailchimp-extender'); ?></span>
1523
  <form method="post" name="yks-mailchimp-form" id="yks-mailchimp-form_<?php echo $list['id']; ?>" rel="<?php echo $list['id']; ?>">
1524
  <input type="hidden" name="yks-mailchimp-unique-id" id="yks-mailchimp-unique-id_<?php echo $list['id']; ?>" value="<?php echo $list['id']; ?>" />
1525
  <table class="form-table yks-admin-form">
1526
  <tbody>
1527
  <tr valign="top">
1528
+ <th scope="row"><label for="yks-mailchimp-api-key"><?php _e('MailChimp List name','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1529
  <td class="yks-mailchimp-listname"><?php
1530
  if ($list['name'])
1531
  {
1532
  $thename = $list['name'];
1533
+ //echo $thename;
1534
+ printf( __( '%1$s', 'yikes-inc-easy-mailchimp-extender' ), $thename );
1535
  }
1536
  else
1537
  {
1540
  if ($lkey == $list['id'])
1541
  {
1542
  $thename = $lval;
1543
+ //echo $thename;
1544
+ printf( __( '%1$s', 'yikes-inc-easy-mailchimp-extender' ), $thename );
1545
  }
1546
  }
1547
  }
1548
  ?></td>
1549
+ </tr>
1550
+ <!-- display the specific MailChimp list ID back to the user -->
1551
  <tr valign="top">
1552
+ <th scope="row"><label for="yks-mailchimp-api-key"><?php _e('MailChimp List ID','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1553
  <td><?php echo $list['list-id']; ?>
1554
  </td>
1555
  </tr>
1556
+ <!-- display the shortcode with the specific list ID -->
1557
+ <tr valign="top">
1558
+ <th scope="row"><label for="yks-mailchimp-api-key"><?php _e('Shortcode','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1559
+ <td>
1560
+ [yks-mailchimp-list id="<?php echo $list['id']; ?>" submit_text="Submit"]
1561
+ <span class="description yks-margin-left"><?php _e('Paste this shortcode into whatever page or post you want to add this form to','yikes-inc-easy-mailchimp-extender'); ?></span>
1562
+ </td>
1563
+ </tr>
1564
+ <!-- display the PHP snippet with the specific list ID -->
1565
  <tr valign="top">
1566
+ <th scope="row"><label for="yks-mailchimp-api-key"><?php _e('PHP Snippet','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1567
  <td>
1568
+ <?php echo htmlentities('<?php echo yksemeProcessSnippet(\''.$list['id'].'\', \'Submit\'); ?>'); ?>
1569
+ <span class="description yks-margin-left"><?php _e('Use this code to add this form to a template file','yikes-inc-easy-mailchimp-extender'); ?></span>
1570
  </td>
1571
  </tr>
1572
+ <!-- display subscriber count here -->
1573
  <tr valign="top">
1574
+ <th scope="row"><label for="yks-mailchimp-api-key"><?php _e('Number of Subscribers','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1575
  <td>
1576
+ <!-- rel contains list id that we pass along to our function to ajax retreive all subscribers -->
1577
+ <span class="number-of-subscribers-<?php echo $list['id']; ?>"><?php echo $get_list_data['subscriber-count']['subscriber-count-'.$list['id']]; ?>&nbsp;</span><a href="#TB_inline?width=600&height=550&inlineId=yikes-mailchimp-subscribers-box" class="thickbox displayListSubscribers" rel="<?php echo $list['id']; ?>">View</a>
1578
  </td>
1579
  </tr>
1580
+ <!-- display the forms fields, with options to customize -->
1581
  <tr valign="top">
1582
  <td scope="row">
1583
+ <label for="api-key"><strong><?php _e('Form Fields','yikes-inc-easy-mailchimp-extender'); ?></strong></label>
1584
  <p class="description">
1585
+ <?php _e('Check the fields you want included in your form (Email Address is required).','yikes-inc-easy-mailchimp-extender'); ?>
1586
  </p>
1587
  <p class="description">
1588
+ <?php _e('Use the green arrows to drag-and-drop the fields and rearrange their order.','yikes-inc-easy-mailchimp-extender'); ?>
1589
  <span class="yks-mailchimp-sorthandle-img"></span>
1590
  </p>
1591
  </th>
1592
  <td class="yks-mailchimp-fields-td" id="yks-mailchimp-fields-td_<?php echo $list['id']; ?>">
1593
  <fieldset class="yks-mailchimp-fields-container" id="yks-mailchimp-fields-container_<?php echo $list['id']; ?>">
1594
+ <legend class="screen-reader-text"><span><?php _e('Active Fields','yikes-inc-easy-mailchimp-extender'); ?></span></legend>
1595
  <div class="yks-mailchimp-fields-list" id="yks-mailchimp-fields-list_<?php echo $list['id']; ?>" rel="<?php echo $list['id']; ?>">
1596
 
1597
  <!-- create sortable rows populated with mailchimp data -->
1598
+ <?php
1599
+ $num = 1;
1600
+ foreach($list['fields'] as $field) { ?>
1601
  <div class="yks-mailchimp-fields-list-row">
1602
  <label title="<?php echo $field['name']; ?>" rel="<?php echo $field['id']; ?>">
1603
+ <span class="yks-mailchimp-sorthandle"><?php _e('Drag','yikes-inc-easy-mailchimp-extender'); ?> &amp; <?php _e('drop','yikes-inc-easy-mailchimp-extender'); ?></span>
1604
  <input type="checkbox" name="<?php echo $field['name']; ?>" id="<?php echo $field['id']; ?>" value="1" <?php echo ($field['active'] == 1 ? 'checked="checked"' : ''); ?><?php echo ($field['require'] == 1 ? 'disabled="disabled"' : ''); ?> />
1605
  &nbsp;
1606
  <div class="yks-mailchimp-field-name"><?php echo $field['label']; ?></div>
1607
  </label>
1608
+ <span class="yks-mailchimp-field-merge"><span class="description"><?php _e('Merge field','yikes-inc-easy-mailchimp-extender'); ?>:</span> &nbsp; *|<input type="text" name="<?php echo $field['name']; ?>-merge" id="<?php echo $field['id']; ?>-merge" value="<?php echo $field['merge']; ?>"<?php echo (($field['locked'] == 1 || $field['merge'] == false) ? ' disabled="disabled"' : ''); ?> />|*</span>
1609
+ <span class="yks-mailchimp-field-placeholder"><span class="description"><?php _e('Placeholder','yikes-inc-easy-mailchimp-extender'); ?>:</span> &nbsp; *|<input type="text" name="placeholder-<?php echo $list['id'].'-'.$num; ?>" id="<?php echo $field['id']; ?>-placeholder" placeholder="<?php echo $field['label']; ?>" value="<?php if(isset($field['placeholder-'.$list['id'].'-'.$num])) { echo $field['placeholder-'.$list['id'].'-'.$num]; } ?>" />|*</span>
1610
  </div>
1611
+ <?php
1612
+ $num++;
1613
+ } ?>
1614
  </div>
1615
+ <!-- display redirect checkbox here -->
1616
+ <tr valign="top">
1617
+ <th scope="row"><label for="yks-mailchimp-url-redirect"><?php _e('Redirect User On Submission','yikes-inc-easy-mailchimp-extender'); ?></label></th>
1618
+ <td>
1619
+ <span class="yks-mailchimp-redirect-checkbox-holder">
1620
+ <input type="checkbox" name="yks_mailchimp_redirect_<?php echo $list['id']; ?>" class="yks_mailchimp_redirect" id="yks-mailchimp-redirect-<?php echo $list['id']; ?>" value="1" <?php if(isset($field['yks_mailchimp_redirect_'.$list['id']])) { echo ($field['yks_mailchimp_redirect_'.$list['id']] == 1 ? 'checked="checked"' : ''); } ?> />
1621
+ <span class="description yks-margin-left"><?php _e('choose a page to redirect the user to after they submit the form.', 'yikes-inc-easy-mailchimp-extender'); ?></span>
1622
+ <!-- drop down of registered posts/pages -->
1623
+ <li id="pages" class="yks_mc_pages_dropdown_<?php echo $list['id']; ?>" <?php if(!isset($field['yks_mailchimp_redirect_'.$list['id']])) { echo 'style="list-style:none;display:none;"'; } else { echo 'style="list-style:none;"'; } ?> >
1624
+ <h3><?php _e('Select A Post/Page', 'yikes-inc-easy-mailchimp-extender'); ?></h3>
1625
+ <form action="<? bloginfo('url'); ?>" method="get">
1626
+ <select id="page_id" name="page_id_<?php echo $list['id']; ?>" >
1627
+ <?php
1628
+ // set up variables for the queries
1629
+ global $post;
1630
+ global $page;
1631
+ $args_posts = array( 'numberposts' => -1);
1632
+ $args_pages = array(
1633
+ 'sort_order' => 'ASC',
1634
+ 'sort_column' => 'post_title',
1635
+ 'hierarchical' => 1,
1636
+ 'exclude' => '',
1637
+ 'include' => '',
1638
+ 'meta_key' => '',
1639
+ 'meta_value' => '',
1640
+ 'authors' => '',
1641
+ 'child_of' => 0,
1642
+ 'parent' => -1,
1643
+ 'exclude_tree' => '',
1644
+ 'number' => '',
1645
+ 'offset' => 0,
1646
+ 'post_type' => 'page',
1647
+ 'post_status' => 'publish'
1648
+ );
1649
+ $pages = get_pages($args_pages);
1650
+ // print_r($pages);
1651
+
1652
+ $posts = get_posts($args_posts);
1653
+ // print_r($posts);
1654
+ ?>
1655
+ <optgroup label="Posts"><?php
1656
+
1657
+ // throwing error -> must resolve
1658
+ foreach( $posts as $post ) : setup_postdata($post); ?>
1659
+ <option <?php if(isset($field['page_id_'.$list['id']])) { selected( $field['page_id_'.$list['id']], $post->ID ); } ?> value="<?php echo $post->ID; ?>"><?php the_title(); ?></option>
1660
+ <?php endforeach; ?>
1661
+
1662
+ </optgroup>
1663
+ <optgroup label="Pages">
1664
+ <?php
1665
+ foreach( $pages as $page ) : ?>
1666
+ <option <?php if(isset($field['page_id_'.$list['id']])) { selected( $field['page_id_'.$list['id']], $page->ID ); } ?> value="<?php echo $page->ID; ?>"><?php echo $page->post_title; ?></option>
1667
+ <?php endforeach; ?>
1668
+ </optgroup>
1669
+ </select>
1670
+ </form>
1671
+ </li>
1672
+ </span>
1673
+ </td>
1674
+ </tr>
1675
  </fieldset>
1676
  </td>
1677
  </tr>
1678
  <tr>
1679
  <td></td>
1680
  <td>
1681
+ <input type="submit" name="submit" class="yks-mailchimp-list-update button-primary" value="<?php _e('Save Form Settings', 'yikes-inc-easy-mailchimp-extender'); ?>" rel="<?php echo $list['id']; ?>" />
1682
+ <input type="button" name="delete" class="yks-mailchimp-delete button-primary" value="<?php _e('Delete Form', 'yikes-inc-easy-mailchimp-extender'); ?>" rel="<?php echo $list['id']; ?>" data-title="<?php echo $thename; ?>" />
1683
+ <input type="button" name="import" class="yks-mailchimp-import button-primary" value="<?php _e('Re-Import Form Fields from MailChimp', 'yikes-inc-easy-mailchimp-extender'); ?>" rel="<?php echo $list['id']; ?>" />
1684
  </td>
1685
  </tr>
1686
  </tbody>
1687
  </table>
1688
+
 
1689
  </form>
1690
+
1691
+ <!-- run loop to display content here -->
1692
+ <!-- thickbox for our hidden content, we will display subscribed peoples here based on which link is clicked -->
1693
+ <?php add_thickbox(); ?>
1694
+ <div id="yikes-mailchimp-subscribers-box" style="display:none;">
1695
+ <img class="mailChimp_get_subscribers_preloader" src="<?php echo admin_url().'/images/wpspin_light.gif'; ?>" alt="preloader" >
1696
+ <div class="yks_mc_subscribers">
1697
+ </div>
1698
+ </div>
1699
+
1700
  </div>
1701
  <?php
1702
  }
1705
  ob_end_clean();
1706
  return $output;
1707
  }
1708
+ // Generate our front end JavaScript , used to submit forms
1709
  public function getFrontendFormJavascript($list='')
1710
  {
1711
  if($list === '') return false;
 
1712
  $js = false;
1713
  foreach($list['fields'] as $field) : if($field['active'] == 1) :
1714
+ // Setup JavaScript
1715
  if($field['require'] == '1') :
1716
+ $prefix = "ymce";
1717
  $js .= "\n";
1718
  switch($field['type'])
1719
  {
1720
+ // default
1721
  default:
1722
  $prefixa = "ymce";
1723
+ $js .= "if ($".$prefixa."('#".$field['id']."').val() == '')";
1724
+ $js .= "{
1725
+ msg += '<li>".$field['label']."'+'\\n</li>';
1726
+ err++;
1727
+ $".$prefixa."('#".$field['id']."').addClass('yks_error_field_required shake animated').delay(1200).queue(function(next){
1728
+ $".$prefixa."(this).removeClass('shake animated');
1729
+ next();
1730
+ });
1731
+ } else {
1732
+ $".$prefixa."('#".$field['id']."').removeClass('yks_error_field_required');
1733
+ }";
1734
  break;
1735
+ // address
1736
+ case 'address':
1737
+ $js .= "if($".$prefix."('#".$field['id']."').val() == '')
1738
+ {
1739
+ msg += '<li>Street Address'+'\\n</li>';
1740
+ err++;
1741
+ $".$prefixa."('#".$field['id']."').addClass('yks_error_field_required shake animated').delay(800).queue(function(next){
1742
+ $".$prefixa."(this).removeClass('shake animated');
1743
+ next();
1744
+ });
1745
+ } else {
1746
+ $".$prefixa."('#".$field['id']."').removeClass('yks_error_field_required')
1747
+ }
1748
+ if($".$prefix."('#".$field['id']."-city').val() == '')
1749
+ {
1750
+ msg += '<li>City'+'\\n</li>';
1751
+ err++;
1752
+ $".$prefixa."('#".$field['id']."-city').addClass('yks_error_field_required shake animated').delay(800).queue(function(next){
1753
+ $".$prefixa."(this).removeClass('shake animated');
1754
+ next();
1755
+ });
1756
+ } else {
1757
+ $".$prefixa."('#".$field['id']."-city').removeClass('yks_error_field_required')
1758
+ }
1759
+ if($".$prefix."('#".$field['id']."-state').val() == '')
1760
+ {
1761
+ msg += '<li>State'+'\\n</li>';
1762
+ err++;
1763
+ $".$prefixa."('#".$field['id']."-state').addClass('yks_error_field_required shake animated').delay(800).queue(function(next){
1764
+ $".$prefixa."(this).removeClass('shake animated');
1765
+ next();
1766
+ });
1767
+ } else {
1768
+ $".$prefixa."('#".$field['id']."-state').removeClass('yks_error_field_required')
1769
+ }
1770
+ if($".$prefix."('#".$field['id']."-zip').val() == '')
1771
+ {
1772
+ msg += '<li>Zip Code'+'\\n</li>';
1773
+ err++;
1774
+ $".$prefixa."('#".$field['id']."-zip').addClass('yks_error_field_required shake animated').delay(800).queue(function(next){
1775
+ $".$prefixa."(this).removeClass('shake animated');
1776
+ next();
1777
+ });
1778
+ } else {
1779
+ $".$prefixa."('#".$field['id']."-zip').removeClass('yks_error_field_required')
1780
+ }";
1781
  break;
1782
+ // radio
1783
  case 'radio':
1784
+ $js .= "if($".$prefix."('.{".$field['name']."}:checked').length <= 0)
1785
+ {
1786
+ msg += '* {".$field['label']."}'+'\\n';
1787
+ err++;
1788
+ }";
 
 
1789
  break;
1790
  }
1791
  $js .= "\n";
1793
  endif; endforeach;
1794
  return $js;
1795
  }
1796
+ // Generate the form on the front end of the site
1797
+ // this is what the user will see, and interact with
1798
+ public function getFrontendFormDisplay($list='', $submit_text)
1799
  {
1800
  if($list === '') return false;
1801
  ob_start();
1802
  switch($this->optionVal['flavor'])
1803
  {
1804
  default:
1805
+ // Display the form inside of a table
1806
+ // if the user has selected table as their flavor on the settings page
1807
+ // make sure this matches exactly with the div flavor below (currently does not)
1808
  case '0':
1809
  ?>
1810
+ <!-- BEGIN TABLE FLAVOR -->
1811
+ <table class="yks-mailchimpFormTable">
 
1812
  <?php
1813
+ $num = 1;
1814
+ foreach($list['fields'] as $field) : if($field['active'] == 1) :
1815
+ // get field placeholders
1816
+ $form_id = explode( '-', $field['id']);
1817
+ $field_placeholder_ = (isset($field['placeholder-'.$form_id[1].'-'.$num]) ? $field['placeholder-'.$form_id[1].'-'.$num] : '');
1818
+ echo '<input type="hidden" class="'.$field['name'].'_placeholder_value" value="'.$field_placeholder_.'">';
1819
+ ?>
1820
+ <!-- javascript to populate the correct form fields, with the specified place-holder value, on the lists page -->
1821
+ <script>
1822
+ jQuery(document).ready(function() {
1823
+ var hiddenInputClass = '<?php echo $field['name']; ?>';
1824
+ // alert('<?php echo $num; ?>');
1825
+ var hiddenInputClassValue = jQuery('.'+hiddenInputClass+'_placeholder_value').val();
1826
+ jQuery('input[name="'+hiddenInputClass+'"]').attr("placeholder", hiddenInputClassValue);
1827
+ });
1828
+ </script>
1829
+ <?php
1830
+ if ($field['require'] == 1) // if the field is required (set in MailChimp), display the red required star
1831
+ {
1832
+ $reqindicator = " <span class='yks-required-label'>*</span>";
1833
+ $reqlabel = " yks-mailchimpFormTableRowLabel-required";
1834
+ }
1835
+ else // else don't
1836
+ {
1837
+ $reqindicator = "";
1838
+ $reqlabel = "";
1839
+ }
1840
+ ?>
1841
+ <tr class="yks-mailchimpFormTableRow">
1842
+ <td class="prompt yks-mailchimpFormTableRowLabel"><label class="prompt yks-mailchimpFormTableRowLabel<?php echo $reqlabel; ?>" for="<?php echo $field['id']; ?>"><?php echo $field['label']; ?><?php echo $reqindicator; ?></label>
1843
+ <!-- run our function to generate the input fields for the form, passing in the field -->
1844
+ <?php echo $this->getFrontendFormDisplay_field($field); ?>
1845
+ </td>
1846
+ </tr>
1847
+ <?php
1848
+ $num++;
1849
+ endif; endforeach;
1850
  ?>
1851
  <tr class="yks-mailchimpFormTableRow">
1852
+ <!-- run our function to generate the interest group fields for the form, passing in the form id -->
1853
+ <?php echo $this->getInterestGroups($form_id[1]); ?>
1854
+ <td class="yks-mailchimpFormTableSubmit">
1855
+ <input type="submit" class="ykfmc-submit" id="ykfmc-submit_<?php echo $list['id']; ?>" value="<?php if($submit_text != '') { echo $submit_text; } else { echo 'Sign Up'; } ?>" />
 
 
 
 
 
 
 
1856
  </td>
1857
  </tr>
1858
+ </table>
1859
+ <?php
1860
+ // Create and store our variables for the redirection
1861
+ $form_id = explode('-', $field['id']); // get the form ID
1862
+ $redirect_value = (isset($field['yks_mailchimp_redirect_'.$form_id[1]]) ? $field['yks_mailchimp_redirect_'.$form_id[1]] : ''); // get the redirect value from the lists page redirect checkbox
1863
+ $redirect_page = (isset($field['page_id_'.$form_id[1]]) ? $field['page_id_'.$form_id[1]] : '') ; // get the redirect page that was set in the pages dropdown on the lists page
1864
+ $site_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // grab and store the current sites URL
1865
+ $redirect_url = get_permalink($redirect_page); // get the permalink of the page we are going to redirect too
1866
+ // if redirection was set up for this form, print out our javascript to complete the redirect
1867
+ if ($redirect_value == 1) { // only redirect if successful form submission <-----
1868
+ ?>
1869
+ <script>
1870
+ jQuery(document).ready(function() {
1871
+ // jquery redirect on form submission
1872
+ var formRedirectPage = '<?php echo $redirect_url ?>';
1873
+ var formID = '<?php echo $form_id[1] ?>';
1874
+ jQuery('#yks-mailchimp-form_0-'+formID).submit(function() {
1875
+ var i = 0;
1876
+ setInterval(function(){
1877
+ if ( jQuery('.yks-success').is(':visible') ) {
1878
+ i++;
1879
+ if ( i == 1 ) {
1880
+ window.location.replace(formRedirectPage);
1881
+ }
1882
+ }
1883
+ }, 1000);
1884
+ });
1885
+ });
1886
+ </script>
1887
+ <?php
1888
+ }
1889
+ break;
1890
 
1891
+ // END TABLE FLAVOR
1892
+
1893
+ // Display the form inside of a div
1894
+ // if the user has selected div as their flavor on the settings page
1895
  case '1':
1896
  ?>
1897
  <div class="yks-mailchimpFormDiv">
1898
+ <?php
1899
+ $num = 1;
1900
+ foreach($list['fields'] as $field) : if($field['active'] == 1) :
1901
+ // get field placeholders
1902
+ $form_id = explode( '-', $field['id']);
1903
+ $field_placeholder_ = (isset($field['placeholder-'.$form_id[1].'-'.$num]) ? $field['placeholder-'.$form_id[1].'-'.$num] : '');
1904
+ echo '<input type="hidden" class="'.$field['name'].'_placeholder_value" value="'.$field_placeholder_.'">';
1905
+ ?>
1906
+ <!-- javascript to populate the correct form fields, with the specified place-holder value, on the lists page -->
1907
+ <script>
1908
+ jQuery(document).ready(function() {
1909
+ var hiddenInputClass = '<?php echo $field['name']; ?>';
1910
+ // alert('<?php echo $num; ?>');
1911
+ var hiddenInputClassValue = jQuery('.'+hiddenInputClass+'_placeholder_value').val();
1912
+ jQuery('input[name="'+hiddenInputClass+'"]').attr("placeholder", hiddenInputClassValue);
1913
+ });
1914
+ </script>
1915
  <?php
1916
+ if ($field['require'] == 1) // if the field is required (set in MailChimp), display the red required star
1917
  {
1918
  $reqindicator = " <span class='yks-required-label'>*</span>";
1919
  $reqlabel = " yks-mailchimpFormDivRowLabel-required";
1920
  }
1921
+ else // else don't
1922
  {
1923
  $reqindicator = "";
1924
  $reqlabel = "";
1927
  <div class="yks-mailchimpFormDivRow">
1928
  <label class="prompt yks-mailchimpFormDivRowLabel<?php echo $reqlabel; ?>" for="<?php echo $field['id']; ?>"><?php echo $field['label']; ?><?php echo $reqindicator; ?></label>
1929
  <div class="yks-mailchimpFormDivRowField">
1930
+ <!-- run our function to generate the input fields for the form, passing in the field -->
1931
  <?php echo $this->getFrontendFormDisplay_field($field); ?>
1932
  </div>
1933
+ </div>
1934
+ <?php
1935
+ $num++;
1936
+ endif; endforeach;
1937
+ ?>
1938
  <div class="yks-mailchimpFormDivRow">
1939
+ <!-- run our function to generate the interest group fields for the form, passing in the form id -->
1940
+ <?php $this->getInterestGroups($form_id[1]); ?>
1941
  <div class="yks-mailchimpFormDivSubmit">
1942
+ <p><input type="submit" class="ykfmc-submit" id="ykfmc-submit_<?php echo $list['id']; ?>" value="<?php if($submit_text != '') { echo $submit_text; } else { echo 'Sign Up'; } ?>" /></p>
1943
  </div>
1944
  </div>
1945
  </div>
1946
+ <?php
1947
+ // Create and store our variables for the redirection
1948
+ $form_id = explode('-', $field['id']); // get the form ID
1949
+ $redirect_value = (isset($field['yks_mailchimp_redirect_'.$form_id[1]]) ? $field['yks_mailchimp_redirect_'.$form_id[1]] : ''); // get the redirect value from the lists page redirect checkbox
1950
+ $redirect_page = (isset($field['page_id_'.$form_id[1]]) ? $field['page_id_'.$form_id[1]] : '') ; // get the redirect page that was set in the pages dropdown on the lists page
1951
+ $site_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // grab and store the current sites URL
1952
+ $redirect_url = get_permalink($redirect_page); // get the permalink of the page we are going to redirect too
1953
+ // if redirection was set up for this form, print out our javascript to complete the redirect
1954
+ if ($redirect_value == 1) {
1955
+ ?>
1956
+ <script>
1957
+ jQuery(document).ready(function() {
1958
+ // jquery redirect on form submission
1959
+ var formRedirectPage = '<?php echo $redirect_url ?>';
1960
+ var formID = '<?php echo $form_id[1] ?>';
1961
+ jQuery('#yks-mailchimp-form_0-'+formID).submit(function() {
1962
+ var i = 0;
1963
+ setInterval(function(){
1964
+ if ( jQuery('.yks-success').is(':visible') ) {
1965
+ i++;
1966
+ if ( i == 1 ) {
1967
+ window.location.replace(formRedirectPage);
1968
+ }
1969
+ }
1970
+ }, 1000);
1971
+ });
1972
+ });
1973
+ </script>
1974
+ <?php
1975
+ }
1976
  break;
1977
  }
1978
  $output = ob_get_contents();
1980
  return $output;
1981
  }
1982
 
1983
+ // Generate the input fields for the form on the front end of the site
1984
+ // based on the $field['type'] that is returned from MailChimp
1985
  private function getFrontendFormDisplay_field($field=false)
1986
  {
1987
  if($field === false) return false;
1988
  $o = '';
1989
+ $num = 1;
1990
+ $fieldID = $field['id'];
1991
+
1992
  switch($field['type'])
1993
  {
1994
  default:
1999
  case 'phone':
2000
  case 'website':
2001
  case 'imageurl':
2002
+ // custom placeholder value goes here
2003
  $o .= '<input type="text" name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'" value="" />';
2004
+ $num++;
2005
  break;
2006
  case 'dropdown':
2007
  $o .= '<select name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'">';
2012
  break;
2013
  case 'address':
2014
 
2015
+ $o .= '<input type="text" name="'.$field['name'].'" class="'.$field['name'].($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'" value="" /><span class="yks-mailchimp-form-tooltip">Street Address</span>';
2016
+ $o .= '<input type="text" name="'.$field['name'].'-add2" class="'.$field['name'].'-add2'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-add2" value="" /><span class="yks-mailchimp-form-tooltip">Apt/Suite</span>';
2017
+ $o .= '<input type="text" name="'.$field['name'].'-city" class="'.$field['name'].'-city'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-city" value="" /><span class="yks-mailchimp-form-tooltip">City</span>';
2018
+ $o .= '<input type="text" name="'.$field['name'].'-state" class="'.$field['name'].'-state'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-state" value="" /><span class="yks-mailchimp-form-tooltip">State</span>';
2019
  $o .= '<input type="text" name="'.$field['name'].'-zip" class="'.$field['name'].'-zip'.($field['require'] == 1 ? ' yks-require' : '').'" id="'.$field['id'].'-zip" value="" /><span class="yks-mailchimp-form-tooltip">Zip</span>';
2020
  break;
2021
  case 'radio':
2035
  }
2036
 
2037
 
 
 
 
2038
  /***** DROPDOWNS
2039
  ****************************************************************************************************/
2040
+ // not sure we need these any more
2041
+ // generate some dropdowns (not sure where)
2042
  public function generateDropdown($name, $html='', $sel='', $type=false, $zopt=false)
2043
  {
2044
  switch($type)
2077
  }
2078
 
2079
 
 
 
 
2080
  /***** UPDATES
2081
  ****************************************************************************************************/
2082
  public function runUpdateTasks()
2193
  $this->optionVal['version'] = '2.2.1';
2194
  return true;
2195
  }
2196
+
2197
+
2198
+ //
2199
+ // Adding Opt-In Checkbox to comment forms
2200
+ // To Do : Add setting to show/hide checkbox on frontend
2201
+ //
2202
+ // display a checkbox in the comment form
2203
+ // submit the user to mailchimp on a successful comment submission
2204
+ function ymc_add_meta_settings($comment_id) {
2205
+ add_comment_meta(
2206
+ $comment_id,
2207
+ 'mailchimp_subscribe',
2208
+ $_POST['mailchimp_subscribe'],
2209
+ true
2210
+ );
2211
+ }
2212
+
2213
+ function add_after_comment_form($arg) {
2214
+ $custom_text = trim($this->optionVal['yks-mailchimp-optin-checkbox-text']);
2215
+ if ( $custom_text == '' ) {
2216
+ $custom_text = __("Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter", "gettext");
2217
+ } else {
2218
+ $custom_text = $custom_text;
2219
+ }
2220
 
2221
+ $arg['comment_notes_after'] = '<label for="yikes_mailchimp_comment_subscribe">
2222
+ <input type="checkbox" name="mailchimp_subscribe" id="yikes_mailchimp_comment_subscribe" checked="checked" />
2223
+ '.$custom_text.'
2224
+ </label>';
2225
+ return $arg;
2226
+ }
2227
+
2228
+ // Replacing 'MAILCHIMP-REPLACE-THIS-TEXT' text with sitename
2229
+ function yikes_mc_replace_this_text( $text ) {
2230
+ $newtext = get_bloginfo('name');
2231
+ $text = str_replace( 'MAILCHIMP-REPLACE-THIS-TEXT', $newtext, $text );
2232
+ return $text;
2233
+ }
2234
+
2235
 
2236
+ function ymc_subscription_add( $cid, $comment='' ) {
2237
+ $cid = (int) $cid;
2238
+ $yikes_api_key = $this->optionVal['api-key'];
2239
+ $exploded_api_key = explode('-',$yikes_api_key);
2240
+ $yikes_data_center = $exploded_api_key[1];
2241
+
2242
+ if ( !is_object($comment) )
2243
+ $comment = get_comment($cid);
2244
+
2245
+ if ( $comment->comment_karma == 0 ) {
2246
+ $subscribe = get_comment_meta($cid, 'mailchimp_subscribe', true);
2247
+ if ( $subscribe == 'on' ) {
2248
+ global $current_user;
2249
+ get_currentuserinfo();
2250
+ $commenter_first_name = trim($current_user->user_firstname);
2251
+ $commenter_last_name = trim($current_user->user_lastname);
2252
+
2253
+ if( isset( $commenter_first_name ) && $commenter_first_name != '' ) {
2254
+ $commenter_first_name = $commenter_first_name; // use the users first name set in the profile
2255
+ } else {
2256
+ $commenter_first_name = $comment->comment_author; // if no first name is set in the user profile, we will use the account name
2257
+ }
2258
+
2259
+ if( isset( $commenter_last_name ) && $commenter_last_name != '' ) {
2260
+ $commenter_last_name = $commenter_last_name; // use the users last name set in the profile
2261
+ } else {
2262
+ $commenter_last_name = 'n/a'; // if the user has not set a last name in their profile, we set it to n/a
2263
+ }
2264
+
2265
+ // store our API key
2266
+ // on the settings page, if they have chosen to display the checkbox
2267
+ $api = new wpyksMCAPI($this->optionVal['api-key']);
2268
+
2269
+ $apikey = $yikes_api_key;
2270
+ $listid = $this->optionVal['yks-mailchimp-optIn-default-list']; // Need to set up a default list to subscribe all users to
2271
+ $endpoint = 'https://api.mailchimp.com';
2272
+ $optin = $this->optionVal['optin'];
2273
+
2274
+ // try adding subscriber, catch any error thrown
2275
+ try {
2276
+ $retval = $api->call('lists/subscribe', array(
2277
+ 'id' => $listid, // form id
2278
+ 'email' => array(
2279
+ 'email' => $comment->comment_author_email
2280
+ ),
2281
+ 'merge_vars' => array(
2282
+ 'FNAME' => $commenter_first_name,
2283
+ 'LNAME' => $commenter_last_name
2284
+ ),
2285
+ 'double_optin' => $optin, // double optin value (retreived from the settings page)
2286
+ 'update_existing' => true // used to avoid the error thrown when user is already subscribed
2287
+ ));
2288
+ return "done";
2289
+ } catch( Exception $e ) { // catch any errors returned from MailChimp
2290
+ $error_message = $e->getMessage();
2291
+ if (strpos($error_message,'Click here to update your profile.') !== false) {
2292
+ $errorMessage = str_replace('Click here to update your profile.', '', $e->getMessage());
2293
+ $errorMessage_explode = explode('to list', $errorMessage);
2294
+ echo $errorMessage_explode[0].'.';
2295
+ die();
2296
+ }
2297
+ if (strpos($error_message,'Invalid') !== false) {
2298
+ $display_errorMessage = str_replace('Invalid MailChimp List ID:', "Oops! The Webmaster hasn't set up the default MailChimp list to subscribe you too. Please contact them and let them know of this error. In the meantime, un-check the subscription checkbox in the comment form when submitting comments.", $error_message);
2299
+ echo $display_errorMessage;
2300
+ die();
2301
+ } else {
2302
+ // str_replace('Invalid MailChimp List ID: .', 'The Webmaster hasn\t set up the default MailChimp list to subscribe you too. Please contact them and let them know of this error. In the meantime, un-check the subscription checkbox in the comment form when submitting comments.', $e->getMessage());
2303
+ echo $errorMessage;
2304
+ die();
2305
+ }
2306
+ }
2307
+
2308
+
2309
+ }
2310
+ }
2311
+ }
2312
+
2313
+ // add our actions on initialize
2314
+ // inside of __construct()
2315
+ public function ykes_mc_apply_filters() {
2316
+ // if the optin checkbox setting is set to show
2317
+ // we wiill display the checkbox on the front end
2318
+ if ( $this->optionVal['yks-mailchimp-optIn-checkbox'] == 1 ) {
2319
+ add_action('comment_post', array(&$this, 'ymc_add_meta_settings'), 10, 2);
2320
+ add_action('comment_approved_', array(&$this, 'ymc_subscription_add'), 60, 2);
2321
+ add_action('comment_post', array(&$this, 'ymc_subscription_add'));
2322
+ add_filter('gettext', array(&$this, 'yikes_mc_replace_this_text'));
2323
+ add_filter('comment_form_defaults', array(&$this, 'add_after_comment_form'));
2324
+ }
2325
+ }
2326
+
2327
+
2328
+ // Check if cURL is enabled at the server level
2329
+ // used on the options.php page
2330
+ public function yikes_curl_check() {
2331
+ if (in_array ('curl', get_loaded_extensions())) {
2332
+ return true;
2333
+ }
2334
+ else {
2335
+ return false;
2336
+ }
2337
+ }
2338
+
2339
+ // check if php.ini exists in the site root
2340
+ function yks_check_if_php_ini_exists() {
2341
+
2342
+ // get php ini path from
2343
+ // the actively loaded php ini file
2344
+ $wordpress_site_root = str_replace('php.ini','',php_ini_loaded_file());
2345
+ // file name
2346
+ $filename = '/php.ini';
2347
+
2348
+ $php_ini_location = php_ini_loaded_file();
2349
+
2350
+ if (file_exists($wordpress_site_root.$filename)) {
2351
+ echo "<span class='yks_mc_no_phpini_success'>Good News </span>: We have located your <strong>".str_replace('/','',$filename)."</strong> file inside the directory <strong>".$wordpress_site_root."</strong>";
2352
+ $filename = '/php.ini';
2353
+ } else {
2354
+ echo "<span class='yks_mc_no_phpini_alert'>Alert </span>: No <strong>".str_replace('/','',$filename)."</strong> was located in <strong>".$wordpress_site_root.'/'."</strong>.";
2355
+ $filename = '/php.ini';
2356
+ }
2357
 
2358
 
2359
+ }
2360
 
2361
+ // display the php.ini location to the user
2362
+ function yks_display_php_ini_location() {
2363
+ echo php_ini_loaded_file();
2364
+ }
2365
+
2366
+
2367
+ //
2368
+ // Add TinyMCE Buttons to the TinyMCE Editor
2369
+ // We'll use the button to place form shortcodes!
2370
+ // NOTE: This only runs on 3.9 or greater -> due to tinyMCE 4.0
2371
+ //
2372
+ // Custom TinyMCE Button to insert form shortcodes onto pages and posts
2373
+ function yks_mc_add_tinyMCE() {
2374
+
2375
+ global $typenow;
2376
+ // only on Post Type: post and page
2377
+ if( ! in_array( $typenow, array( 'post', 'page' ) ) )
2378
+ return ;
2379
+
2380
+ }
2381
+
2382
+ // inlcude the js for tinymce
2383
+ function yks_mc_add_tinymce_plugin( $plugin_array ) {
2384
+
2385
+ $plugin_array['yks_mc_tinymce_button'] = plugins_url( '/../js/yks_mc_tinymce_button.js', __FILE__ );
2386
+ // Print all plugin js path
2387
+ // var_dump( $plugin_array );
2388
+ return $plugin_array;
2389
+
2390
+ }
2391
+
2392
+ // Add the button key for address via JS
2393
+ function yks_mc_add_tinymce_button( $buttons ) {
2394
+
2395
+ array_push( $buttons, 'yks_mc_tinymce_button_key' );
2396
+ // Print all buttons
2397
+ // var_dump( $buttons );
2398
+ return $buttons;
2399
+
2400
+ }
2401
+
2402
+ /**
2403
+ * Localize Script
2404
+ * Pass our imported list data, to the JS file
2405
+ * to build the dropdown list in the modal
2406
+ */
2407
+ function yks_mc_js_admin_head()
2408
+ {
2409
+
2410
+ $yks_mc_imported_list_data = $this->optionVal['lists'];
2411
+ // our list data array, we will pass to the js file
2412
+ $list_value_array = array();
2413
+ $i = 0;
2414
+ // loop over the list data
2415
+ foreach ( $yks_mc_imported_list_data as $single_list ) {
2416
+ // store it temporarily and push it back to our array
2417
+ $list_value_array[$i]['text'] = $single_list['name'];
2418
+ $list_value_array[$i]['value'] = $single_list['id'];
2419
+ $i++;
2420
+ }
2421
+ ?>
2422
+ <!-- TinyMCE Shortcode Plugin -->
2423
+ <script type='text/javascript'>
2424
+ var yks_mc_lists_data = {
2425
+ 'lists': <?php echo json_encode($list_value_array); ?>
2426
+ };
2427
+ </script>
2428
+ <!-- TinyMCE Shortcode Plugin -->
2429
+ <?php
2430
+
2431
+ }
2432
+
2433
+
2434
+ /* Checking if the user is on localhost */
2435
+ /* If they are we want to display a warning about SSL on localhost */
2436
+ function yks_mc_is_user_localhost() {
2437
+ $whitelist = array( '127.0.0.1', '::1' );
2438
+ if( in_array( $_SERVER['REMOTE_ADDR'], $whitelist) )
2439
+ return true;
2440
+ }
2441
+
2442
+ /*******************************************************/
2443
+ /* Helper Functions */
2444
+ /******************************************************/
2445
+ /*
2446
+ *
2447
+ * Helper function when testing user submitted data
2448
+ * to be used inside of the yikes_mc_get_form_data filter
2449
+ *
2450
+ */
2451
+ function yks_mc_print_user_data( $form_ID, $merge_variables ) {
2452
+
2453
+ echo '<h3>The Data Returned From This Form</h3>';
2454
+
2455
+ echo '<strong>MailChimp List ID : </strong> '.$form_ID.' <br />';
2456
+
2457
+ echo '<hr />';
2458
+
2459
+ if ( isset( $merge_variables['FNAME'] ) && $merge_variables['FNAME'] != '' ) {
2460
+ echo '<strong>User\'s Name : </strong> '.$merge_variables['FNAME'].' <br />';
2461
+
2462
+ echo '<hr />';
2463
+
2464
+ }
2465
+
2466
+ if ( isset( $merge_variables['LNAME'] ) && $merge_variables['LNAME'] != '' ) {
2467
+ echo '<strong>User\'s Name : </strong> '.$merge_variables['LNAME'].' <br />';
2468
+
2469
+ echo '<hr />';
2470
+
2471
+ }
2472
+
2473
+ echo '<strong>Users Email : </strong>'.$merge_variables['EMAIL'].' <br />';
2474
+
2475
+ if ( isset( $merge_variables['GROUPINGS'] ) ) {
2476
+
2477
+ echo '<hr />';
2478
+
2479
+ echo '<strong>Interest Group Data : </strong><br /><br />';
2480
+
2481
+ foreach ( $merge_variables['GROUPINGS'] as $grouping_variable ) {
2482
+
2483
+ echo '<ol style="list-style:none;">Interest Group : '.$grouping_variable['id'].'</ol>';
2484
+
2485
+ if ( !isset($grouping_variable['groups'][0]) || $grouping_variable['groups'][0] == '' ) {
2486
+
2487
+ echo '<li style="list-style:none;">No interest groups selected</li><br />';
2488
+
2489
+ } else {
2490
+
2491
+ // loop over interest groups to build array
2492
+ $interest_group_array = array();
2493
+ foreach ( $grouping_variable['groups'] as $interest_group ) {
2494
+ array_push( $interest_group_array , $interest_group );
2495
+ }
2496
+
2497
+ if ( count($interest_group_array) > 0 ) {
2498
+ foreach ( $interest_group_array as $interest_group_label ) {
2499
+ echo '<li style="list-style:none;">'.$interest_group_label.'</li>';
2500
+ }
2501
+ echo '<br />';
2502
+ }
2503
+
2504
+ }
2505
+ }
2506
+
2507
+ }
2508
+
2509
+ echo '<em style="color:rgb(238, 93, 93);">Form data has not been sent to MailChimp</em><br />';
2510
+
2511
+ die(); // die to prevent data being sent over to MailChimp
2512
+
2513
+ }
2514
+ /*
2515
+ *
2516
+ * Helper function when testing user submitted data
2517
+ * print_r($merge_variables) is returned
2518
+ *
2519
+ */
2520
+ function yks_mc_dump_user_data( $form_ID, $merge_variables ) {
2521
+ echo '<strong>Form ID :</strong> '.$form_ID. '<br />';
2522
+ echo '<strong>Merge Variables :</strong><br />';
2523
+ print_r($merge_variables);
2524
+ echo '<br /><em style="color:rgb(238, 93, 93);">Form data has not been sent to MailChimp</em>';
2525
+ die(); // die to prevent data being sent over to MailChimp
2526
+ }
2527
+
2528
  }
2529
  }
2530
  ?>
classes/set_language.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ // create our language variable dependent on what is set in MailChimp
4
+ if(!empty($subscriber_data['language'])) {
5
+ $subscriber_data_language = $subscriber_data['language'];
6
+ if ( $subscriber_data_language == 'en' ) {
7
+ $subscriber_data_language = 'English';
8
+ } elseif ( $subscriber_data_language == 'ar' ) {
9
+ $subscriber_data_language = 'Arabic';
10
+ } elseif ( $subscriber_data_language == 'af' ) {
11
+ $subscriber_data_language = 'Afrikaans';
12
+ } elseif ( $subscriber_data_language == 'be' ) {
13
+ $subscriber_data_language = 'Belarusian';
14
+ } elseif ( $subscriber_data_language == 'bg' ) {
15
+ $subscriber_data_language = 'Bulgarian';
16
+ } elseif ( $subscriber_data_language == 'ca' ) {
17
+ $subscriber_data_language = 'Catalan';
18
+ } elseif ( $subscriber_data_language == 'zh' ) {
19
+ $subscriber_data_language = 'Chinese';
20
+ } elseif ( $subscriber_data_language == 'hr' ) {
21
+ $subscriber_data_language = 'Croatian';
22
+ } elseif ( $subscriber_data_language == 'cs' ) {
23
+ $subscriber_data_language = 'Czech';
24
+ } elseif ( $subscriber_data_language == 'da' ) {
25
+ $subscriber_data_language = 'Danish';
26
+ } elseif ( $subscriber_data_language == 'nl' ) {
27
+ $subscriber_data_language = 'Dutch';
28
+ } elseif ( $subscriber_data_language == 'et' ) {
29
+ $subscriber_data_language = 'Estonian';
30
+ } elseif ( $subscriber_data_language == 'fa' ) {
31
+ $subscriber_data_language = 'Farsi';
32
+ } elseif ( $subscriber_data_language == 'fi' ) {
33
+ $subscriber_data_language = 'Finnish';
34
+ } elseif ( $subscriber_data_language == 'fr' ) {
35
+ $subscriber_data_language = 'French';
36
+ } elseif ( $subscriber_data_language == 'fr_CA' ) {
37
+ $subscriber_data_language = 'French (Canada)';
38
+ } elseif ( $subscriber_data_language == 'de' ) {
39
+ $subscriber_data_language = 'German';
40
+ } elseif ( $subscriber_data_language == 'el' ) {
41
+ $subscriber_data_language = 'Greek';
42
+ } elseif ( $subscriber_data_language == 'he' ) {
43
+ $subscriber_data_language = 'Hebrew';
44
+ } elseif ( $subscriber_data_language == 'hi' ) {
45
+ $subscriber_data_language = 'Hindi';
46
+ } elseif ( $subscriber_data_language == 'hu' ) {
47
+ $subscriber_data_language = 'Hungarian';
48
+ } elseif ( $subscriber_data_language == 'is' ) {
49
+ $subscriber_data_language = 'Icelandic';
50
+ } elseif ( $subscriber_data_language == 'id' ) {
51
+ $subscriber_data_language = 'Indonesian';
52
+ } elseif ( $subscriber_data_language == 'ga' ) {
53
+ $subscriber_data_language = 'Irish';
54
+ } elseif ( $subscriber_data_language == 'it' ) {
55
+ $subscriber_data_language = 'Italian';
56
+ } elseif ( $subscriber_data_language == 'ja' ) {
57
+ $subscriber_data_language = 'Japanese';
58
+ } elseif ( $subscriber_data_language == 'km' ) {
59
+ $subscriber_data_language = 'Khmer';
60
+ } elseif ( $subscriber_data_language == 'ko' ) {
61
+ $subscriber_data_language = 'Korean';
62
+ } elseif ( $subscriber_data_language == 'lv' ) {
63
+ $subscriber_data_language = 'Latvian';
64
+ } elseif ( $subscriber_data_language == 'lt' ) {
65
+ $subscriber_data_language = 'Lithuanian';
66
+ } elseif ( $subscriber_data_language == 'mt' ) {
67
+ $subscriber_data_language = 'Maltese';
68
+ } elseif ( $subscriber_data_language == 'ms' ) {
69
+ $subscriber_data_language = 'Malay';
70
+ } elseif ( $subscriber_data_language == 'mk' ) {
71
+ $subscriber_data_language = 'Macedonian';
72
+ } elseif ( $subscriber_data_language == 'no' ) {
73
+ $subscriber_data_language = 'Norwegian';
74
+ } elseif ( $subscriber_data_language == 'pl' ) {
75
+ $subscriber_data_language = 'Polish';
76
+ } elseif ( $subscriber_data_language == 'pt' ) {
77
+ $subscriber_data_language = 'Portuguese (Brazil)';
78
+ } elseif ( $subscriber_data_language == 'pt_PT' ) {
79
+ $subscriber_data_language = 'Portuguese (Portugal)';
80
+ } elseif ( $subscriber_data_language == 'ro' ) {
81
+ $subscriber_data_language = 'Romanian';
82
+ } elseif ( $subscriber_data_language == 'ru' ) {
83
+ $subscriber_data_language = 'Russian';
84
+ } elseif ( $subscriber_data_language == 'sr' ) {
85
+ $subscriber_data_language = 'Serbian';
86
+ } elseif ( $subscriber_data_language == 'sl' ) {
87
+ $subscriber_data_language = 'Slovak';
88
+ } elseif ( $subscriber_data_language == 'sl' ) {
89
+ $subscriber_data_language = 'Slovenian';
90
+ } elseif ( $subscriber_data_language == 'es' ) {
91
+ $subscriber_data_language = 'Spanish (Mexico)';
92
+ } elseif ( $subscriber_data_language == 'es_ES' ) {
93
+ $subscriber_data_language = 'Spanish (Spain)';
94
+ } elseif ( $subscriber_data_language == 'sw' ) {
95
+ $subscriber_data_language = 'Swahili';
96
+ } elseif ( $subscriber_data_language == 'sv' ) {
97
+ $subscriber_data_language = 'Swedish';
98
+ } elseif ( $subscriber_data_language == 'ta' ) {
99
+ $subscriber_data_language = 'Tamil';
100
+ } elseif ( $subscriber_data_language == 'th' ) {
101
+ $subscriber_data_language = 'Thai';
102
+ } elseif ( $subscriber_data_language == 'tr' ) {
103
+ $subscriber_data_language = 'Turkish';
104
+ } elseif ( $subscriber_data_language == 'uk' ) {
105
+ $subscriber_data_language = 'Ukrainian';
106
+ } elseif ( $subscriber_data_language == 'vi' ) {
107
+ $subscriber_data_language = 'Vietnamese';
108
+ }
109
+ } else {
110
+ $subscriber_data_language = 'Not Set.';
111
+ }
css/animate.css ADDED
@@ -0,0 +1,3303 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+
3
+ /*!
4
+ Animate.css - http://daneden.me/animate
5
+ Licensed under the MIT license
6
+
7
+ Copyright (c) 2013 Daniel Eden
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
14
+ */
15
+
16
+ .animated {
17
+ -webkit-animation-duration: 1s;
18
+ animation-duration: 1s;
19
+ -webkit-animation-fill-mode: both;
20
+ animation-fill-mode: both;
21
+ }
22
+
23
+ .animated.infinite {
24
+ -webkit-animation-iteration-count: infinite;
25
+ animation-iteration-count: infinite;
26
+ }
27
+
28
+ .animated.hinge {
29
+ -webkit-animation-duration: 2s;
30
+ animation-duration: 2s;
31
+ }
32
+
33
+ @-webkit-keyframes bounce {
34
+ 0%, 20%, 50%, 80%, 100% {
35
+ -webkit-transform: translateY(0);
36
+ transform: translateY(0);
37
+ }
38
+
39
+ 40% {
40
+ -webkit-transform: translateY(-30px);
41
+ transform: translateY(-30px);
42
+ }
43
+
44
+ 60% {
45
+ -webkit-transform: translateY(-15px);
46
+ transform: translateY(-15px);
47
+ }
48
+ }
49
+
50
+ @keyframes bounce {
51
+ 0%, 20%, 50%, 80%, 100% {
52
+ -webkit-transform: translateY(0);
53
+ -ms-transform: translateY(0);
54
+ transform: translateY(0);
55
+ }
56
+
57
+ 40% {
58
+ -webkit-transform: translateY(-30px);
59
+ -ms-transform: translateY(-30px);
60
+ transform: translateY(-30px);
61
+ }
62
+
63
+ 60% {
64
+ -webkit-transform: translateY(-15px);
65
+ -ms-transform: translateY(-15px);
66
+ transform: translateY(-15px);
67
+ }
68
+ }
69
+
70
+ .bounce {
71
+ -webkit-animation-name: bounce;
72
+ animation-name: bounce;
73
+ }
74
+
75
+ @-webkit-keyframes flash {
76
+ 0%, 50%, 100% {
77
+ opacity: 1;
78
+ }
79
+
80
+ 25%, 75% {
81
+ opacity: 0;
82
+ }
83
+ }
84
+
85
+ @keyframes flash {
86
+ 0%, 50%, 100% {
87
+ opacity: 1;
88
+ }
89
+
90
+ 25%, 75% {
91
+ opacity: 0;
92
+ }
93
+ }
94
+
95
+ .flash {
96
+ -webkit-animation-name: flash;
97
+ animation-name: flash;
98
+ }
99
+
100
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
101
+
102
+ @-webkit-keyframes pulse {
103
+ 0% {
104
+ -webkit-transform: scale(1);
105
+ transform: scale(1);
106
+ }
107
+
108
+ 50% {
109
+ -webkit-transform: scale(1.1);
110
+ transform: scale(1.1);
111
+ }
112
+
113
+ 100% {
114
+ -webkit-transform: scale(1);
115
+ transform: scale(1);
116
+ }
117
+ }
118
+
119
+ @keyframes pulse {
120
+ 0% {
121
+ -webkit-transform: scale(1);
122
+ -ms-transform: scale(1);
123
+ transform: scale(1);
124
+ }
125
+
126
+ 50% {
127
+ -webkit-transform: scale(1.1);
128
+ -ms-transform: scale(1.1);
129
+ transform: scale(1.1);
130
+ }
131
+
132
+ 100% {
133
+ -webkit-transform: scale(1);
134
+ -ms-transform: scale(1);
135
+ transform: scale(1);
136
+ }
137
+ }
138
+
139
+ .pulse {
140
+ -webkit-animation-name: pulse;
141
+ animation-name: pulse;
142
+ }
143
+
144
+ @-webkit-keyframes rubberBand {
145
+ 0% {
146
+ -webkit-transform: scale(1);
147
+ transform: scale(1);
148
+ }
149
+
150
+ 30% {
151
+ -webkit-transform: scaleX(1.25) scaleY(0.75);
152
+ transform: scaleX(1.25) scaleY(0.75);
153
+ }
154
+
155
+ 40% {
156
+ -webkit-transform: scaleX(0.75) scaleY(1.25);
157
+ transform: scaleX(0.75) scaleY(1.25);
158
+ }
159
+
160
+ 60% {
161
+ -webkit-transform: scaleX(1.15) scaleY(0.85);
162
+ transform: scaleX(1.15) scaleY(0.85);
163
+ }
164
+
165
+ 100% {
166
+ -webkit-transform: scale(1);
167
+ transform: scale(1);
168
+ }
169
+ }
170
+
171
+ @keyframes rubberBand {
172
+ 0% {
173
+ -webkit-transform: scale(1);
174
+ -ms-transform: scale(1);
175
+ transform: scale(1);
176
+ }
177
+
178
+ 30% {
179
+ -webkit-transform: scaleX(1.25) scaleY(0.75);
180
+ -ms-transform: scaleX(1.25) scaleY(0.75);
181
+ transform: scaleX(1.25) scaleY(0.75);
182
+ }
183
+
184
+ 40% {
185
+ -webkit-transform: scaleX(0.75) scaleY(1.25);
186
+ -ms-transform: scaleX(0.75) scaleY(1.25);
187
+ transform: scaleX(0.75) scaleY(1.25);
188
+ }
189
+
190
+ 60% {
191
+ -webkit-transform: scaleX(1.15) scaleY(0.85);
192
+ -ms-transform: scaleX(1.15) scaleY(0.85);
193
+ transform: scaleX(1.15) scaleY(0.85);
194
+ }
195
+
196
+ 100% {
197
+ -webkit-transform: scale(1);
198
+ -ms-transform: scale(1);
199
+ transform: scale(1);
200
+ }
201
+ }
202
+
203
+ .rubberBand {
204
+ -webkit-animation-name: rubberBand;
205
+ animation-name: rubberBand;
206
+ }
207
+
208
+ @-webkit-keyframes shake {
209
+ 0%, 100% {
210
+ -webkit-transform: translateX(0);
211
+ transform: translateX(0);
212
+ }
213
+
214
+ 10%, 30%, 50%, 70%, 90% {
215
+ -webkit-transform: translateX(-10px);
216
+ transform: translateX(-10px);
217
+ }
218
+
219
+ 20%, 40%, 60%, 80% {
220
+ -webkit-transform: translateX(10px);
221
+ transform: translateX(10px);
222
+ }
223
+ }
224
+
225
+ @keyframes shake {
226
+ 0%, 100% {
227
+ -webkit-transform: translateX(0);
228
+ -ms-transform: translateX(0);
229
+ transform: translateX(0);
230
+ }
231
+
232
+ 10%, 30%, 50%, 70%, 90% {
233
+ -webkit-transform: translateX(-10px);
234
+ -ms-transform: translateX(-10px);
235
+ transform: translateX(-10px);
236
+ }
237
+
238
+ 20%, 40%, 60%, 80% {
239
+ -webkit-transform: translateX(10px);
240
+ -ms-transform: translateX(10px);
241
+ transform: translateX(10px);
242
+ }
243
+ }
244
+
245
+ .shake {
246
+ -webkit-animation-name: shake;
247
+ animation-name: shake;
248
+ }
249
+
250
+ @-webkit-keyframes swing {
251
+ 20% {
252
+ -webkit-transform: rotate(15deg);
253
+ transform: rotate(15deg);
254
+ }
255
+
256
+ 40% {
257
+ -webkit-transform: rotate(-10deg);
258
+ transform: rotate(-10deg);
259
+ }
260
+
261
+ 60% {
262
+ -webkit-transform: rotate(5deg);
263
+ transform: rotate(5deg);
264
+ }
265
+
266
+ 80% {
267
+ -webkit-transform: rotate(-5deg);
268
+ transform: rotate(-5deg);
269
+ }
270
+
271
+ 100% {
272
+ -webkit-transform: rotate(0deg);
273
+ transform: rotate(0deg);
274
+ }
275
+ }
276
+
277
+ @keyframes swing {
278
+ 20% {
279
+ -webkit-transform: rotate(15deg);
280
+ -ms-transform: rotate(15deg);
281
+ transform: rotate(15deg);
282
+ }
283
+
284
+ 40% {
285
+ -webkit-transform: rotate(-10deg);
286
+ -ms-transform: rotate(-10deg);
287
+ transform: rotate(-10deg);
288
+ }
289
+
290
+ 60% {
291
+ -webkit-transform: rotate(5deg);
292
+ -ms-transform: rotate(5deg);
293
+ transform: rotate(5deg);
294
+ }
295
+
296
+ 80% {
297
+ -webkit-transform: rotate(-5deg);
298
+ -ms-transform: rotate(-5deg);
299
+ transform: rotate(-5deg);
300
+ }
301
+
302
+ 100% {
303
+ -webkit-transform: rotate(0deg);
304
+ -ms-transform: rotate(0deg);
305
+ transform: rotate(0deg);
306
+ }
307
+ }
308
+
309
+ .swing {
310
+ -webkit-transform-origin: top center;
311
+ -ms-transform-origin: top center;
312
+ transform-origin: top center;
313
+ -webkit-animation-name: swing;
314
+ animation-name: swing;
315
+ }
316
+
317
+ @-webkit-keyframes tada {
318
+ 0% {
319
+ -webkit-transform: scale(1);
320
+ transform: scale(1);
321
+ }
322
+
323
+ 10%, 20% {
324
+ -webkit-transform: scale(0.9) rotate(-3deg);
325
+ transform: scale(0.9) rotate(-3deg);
326
+ }
327
+
328
+ 30%, 50%, 70%, 90% {
329
+ -webkit-transform: scale(1.1) rotate(3deg);
330
+ transform: scale(1.1) rotate(3deg);
331
+ }
332
+
333
+ 40%, 60%, 80% {
334
+ -webkit-transform: scale(1.1) rotate(-3deg);
335
+ transform: scale(1.1) rotate(-3deg);
336
+ }
337
+
338
+ 100% {
339
+ -webkit-transform: scale(1) rotate(0);
340
+ transform: scale(1) rotate(0);
341
+ }
342
+ }
343
+
344
+ @keyframes tada {
345
+ 0% {
346
+ -webkit-transform: scale(1);
347
+ -ms-transform: scale(1);
348
+ transform: scale(1);
349
+ }
350
+
351
+ 10%, 20% {
352
+ -webkit-transform: scale(0.9) rotate(-3deg);
353
+ -ms-transform: scale(0.9) rotate(-3deg);
354
+ transform: scale(0.9) rotate(-3deg);
355
+ }
356
+
357
+ 30%, 50%, 70%, 90% {
358
+ -webkit-transform: scale(1.1) rotate(3deg);
359
+ -ms-transform: scale(1.1) rotate(3deg);
360
+ transform: scale(1.1) rotate(3deg);
361
+ }
362
+
363
+ 40%, 60%, 80% {
364
+ -webkit-transform: scale(1.1) rotate(-3deg);
365
+ -ms-transform: scale(1.1) rotate(-3deg);
366
+ transform: scale(1.1) rotate(-3deg);
367
+ }
368
+
369
+ 100% {
370
+ -webkit-transform: scale(1) rotate(0);
371
+ -ms-transform: scale(1) rotate(0);
372
+ transform: scale(1) rotate(0);
373
+ }
374
+ }
375
+
376
+ .tada {
377
+ -webkit-animation-name: tada;
378
+ animation-name: tada;
379
+ }
380
+
381
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
382
+
383
+ @-webkit-keyframes wobble {
384
+ 0% {
385
+ -webkit-transform: translateX(0%);
386
+ transform: translateX(0%);
387
+ }
388
+
389
+ 15% {
390
+ -webkit-transform: translateX(-25%) rotate(-5deg);
391
+ transform: translateX(-25%) rotate(-5deg);
392
+ }
393
+
394
+ 30% {
395
+ -webkit-transform: translateX(20%) rotate(3deg);
396
+ transform: translateX(20%) rotate(3deg);
397
+ }
398
+
399
+ 45% {
400
+ -webkit-transform: translateX(-15%) rotate(-3deg);
401
+ transform: translateX(-15%) rotate(-3deg);
402
+ }
403
+
404
+ 60% {
405
+ -webkit-transform: translateX(10%) rotate(2deg);
406
+ transform: translateX(10%) rotate(2deg);
407
+ }
408
+
409
+ 75% {
410
+ -webkit-transform: translateX(-5%) rotate(-1deg);
411
+ transform: translateX(-5%) rotate(-1deg);
412
+ }
413
+
414
+ 100% {
415
+ -webkit-transform: translateX(0%);
416
+ transform: translateX(0%);
417
+ }
418
+ }
419
+
420
+ @keyframes wobble {
421
+ 0% {
422
+ -webkit-transform: translateX(0%);
423
+ -ms-transform: translateX(0%);
424
+ transform: translateX(0%);
425
+ }
426
+
427
+ 15% {
428
+ -webkit-transform: translateX(-25%) rotate(-5deg);
429
+ -ms-transform: translateX(-25%) rotate(-5deg);
430
+ transform: translateX(-25%) rotate(-5deg);
431
+ }
432
+
433
+ 30% {
434
+ -webkit-transform: translateX(20%) rotate(3deg);
435
+ -ms-transform: translateX(20%) rotate(3deg);
436
+ transform: translateX(20%) rotate(3deg);
437
+ }
438
+
439
+ 45% {
440
+ -webkit-transform: translateX(-15%) rotate(-3deg);
441
+ -ms-transform: translateX(-15%) rotate(-3deg);
442
+ transform: translateX(-15%) rotate(-3deg);
443
+ }
444
+
445
+ 60% {
446
+ -webkit-transform: translateX(10%) rotate(2deg);
447
+ -ms-transform: translateX(10%) rotate(2deg);
448
+ transform: translateX(10%) rotate(2deg);
449
+ }
450
+
451
+ 75% {
452
+ -webkit-transform: translateX(-5%) rotate(-1deg);
453
+ -ms-transform: translateX(-5%) rotate(-1deg);
454
+ transform: translateX(-5%) rotate(-1deg);
455
+ }
456
+
457
+ 100% {
458
+ -webkit-transform: translateX(0%);
459
+ -ms-transform: translateX(0%);
460
+ transform: translateX(0%);
461
+ }
462
+ }
463
+
464
+ .wobble {
465
+ -webkit-animation-name: wobble;
466
+ animation-name: wobble;
467
+ }
468
+
469
+ @-webkit-keyframes bounceIn {
470
+ 0% {
471
+ opacity: 0;
472
+ -webkit-transform: scale(.3);
473
+ transform: scale(.3);
474
+ }
475
+
476
+ 50% {
477
+ opacity: 1;
478
+ -webkit-transform: scale(1.05);
479
+ transform: scale(1.05);
480
+ }
481
+
482
+ 70% {
483
+ -webkit-transform: scale(.9);
484
+ transform: scale(.9);
485
+ }
486
+
487
+ 100% {
488
+ opacity: 1;
489
+ -webkit-transform: scale(1);
490
+ transform: scale(1);
491
+ }
492
+ }
493
+
494
+ @keyframes bounceIn {
495
+ 0% {
496
+ opacity: 0;
497
+ -webkit-transform: scale(.3);
498
+ -ms-transform: scale(.3);
499
+ transform: scale(.3);
500
+ }
501
+
502
+ 50% {
503
+ opacity: 1;
504
+ -webkit-transform: scale(1.05);
505
+ -ms-transform: scale(1.05);
506
+ transform: scale(1.05);
507
+ }
508
+
509
+ 70% {
510
+ -webkit-transform: scale(.9);
511
+ -ms-transform: scale(.9);
512
+ transform: scale(.9);
513
+ }
514
+
515
+ 100% {
516
+ opacity: 1;
517
+ -webkit-transform: scale(1);
518
+ -ms-transform: scale(1);
519
+ transform: scale(1);
520
+ }
521
+ }
522
+
523
+ .bounceIn {
524
+ -webkit-animation-name: bounceIn;
525
+ animation-name: bounceIn;
526
+ }
527
+
528
+ @-webkit-keyframes bounceInDown {
529
+ 0% {
530
+ opacity: 0;
531
+ -webkit-transform: translateY(-2000px);
532
+ transform: translateY(-2000px);
533
+ }
534
+
535
+ 60% {
536
+ opacity: 1;
537
+ -webkit-transform: translateY(30px);
538
+ transform: translateY(30px);
539
+ }
540
+
541
+ 80% {
542
+ -webkit-transform: translateY(-10px);
543
+ transform: translateY(-10px);
544
+ }
545
+
546
+ 100% {
547
+ -webkit-transform: translateY(0);
548
+ transform: translateY(0);
549
+ }
550
+ }
551
+
552
+ @keyframes bounceInDown {
553
+ 0% {
554
+ opacity: 0;
555
+ -webkit-transform: translateY(-2000px);
556
+ -ms-transform: translateY(-2000px);
557
+ transform: translateY(-2000px);
558
+ }
559
+
560
+ 60% {
561
+ opacity: 1;
562
+ -webkit-transform: translateY(30px);
563
+ -ms-transform: translateY(30px);
564
+ transform: translateY(30px);
565
+ }
566
+
567
+ 80% {
568
+ -webkit-transform: translateY(-10px);
569
+ -ms-transform: translateY(-10px);
570
+ transform: translateY(-10px);
571
+ }
572
+
573
+ 100% {
574
+ -webkit-transform: translateY(0);
575
+ -ms-transform: translateY(0);
576
+ transform: translateY(0);
577
+ }
578
+ }
579
+
580
+ .bounceInDown {
581
+ -webkit-animation-name: bounceInDown;
582
+ animation-name: bounceInDown;
583
+ }
584
+
585
+ @-webkit-keyframes bounceInLeft {
586
+ 0% {
587
+ opacity: 0;
588
+ -webkit-transform: translateX(-2000px);
589
+ transform: translateX(-2000px);
590
+ }
591
+
592
+ 60% {
593
+ opacity: 1;
594
+ -webkit-transform: translateX(30px);
595
+ transform: translateX(30px);
596
+ }
597
+
598
+ 80% {
599
+ -webkit-transform: translateX(-10px);
600
+ transform: translateX(-10px);
601
+ }
602
+
603
+ 100% {
604
+ -webkit-transform: translateX(0);
605
+ transform: translateX(0);
606
+ }
607
+ }
608
+
609
+ @keyframes bounceInLeft {
610
+ 0% {
611
+ opacity: 0;
612
+ -webkit-transform: translateX(-2000px);
613
+ -ms-transform: translateX(-2000px);
614
+ transform: translateX(-2000px);
615
+ }
616
+
617
+ 60% {
618
+ opacity: 1;
619
+ -webkit-transform: translateX(30px);
620
+ -ms-transform: translateX(30px);
621
+ transform: translateX(30px);
622
+ }
623
+
624
+ 80% {
625
+ -webkit-transform: translateX(-10px);
626
+ -ms-transform: translateX(-10px);
627
+ transform: translateX(-10px);
628
+ }
629
+
630
+ 100% {
631
+ -webkit-transform: translateX(0);
632
+ -ms-transform: translateX(0);
633
+ transform: translateX(0);
634
+ }
635
+ }
636
+
637
+ .bounceInLeft {
638
+ -webkit-animation-name: bounceInLeft;
639
+ animation-name: bounceInLeft;
640
+ }
641
+
642
+ @-webkit-keyframes bounceInRight {
643
+ 0% {
644
+ opacity: 0;
645
+ -webkit-transform: translateX(2000px);
646
+ transform: translateX(2000px);
647
+ }
648
+
649
+ 60% {
650
+ opacity: 1;
651
+ -webkit-transform: translateX(-30px);
652
+ transform: translateX(-30px);
653
+ }
654
+
655
+ 80% {
656
+ -webkit-transform: translateX(10px);
657
+ transform: translateX(10px);
658
+ }
659
+
660
+ 100% {
661
+ -webkit-transform: translateX(0);
662
+ transform: translateX(0);
663
+ }
664
+ }
665
+
666
+ @keyframes bounceInRight {
667
+ 0% {
668
+ opacity: 0;
669
+ -webkit-transform: translateX(2000px);
670
+ -ms-transform: translateX(2000px);
671
+ transform: translateX(2000px);
672
+ }
673
+
674
+ 60% {
675
+ opacity: 1;
676
+ -webkit-transform: translateX(-30px);
677
+ -ms-transform: translateX(-30px);
678
+ transform: translateX(-30px);
679
+ }
680
+
681
+ 80% {
682
+ -webkit-transform: translateX(10px);
683
+ -ms-transform: translateX(10px);
684
+ transform: translateX(10px);
685
+ }
686
+
687
+ 100% {
688
+ -webkit-transform: translateX(0);
689
+ -ms-transform: translateX(0);
690
+ transform: translateX(0);
691
+ }
692
+ }
693
+
694
+ .bounceInRight {
695
+ -webkit-animation-name: bounceInRight;
696
+ animation-name: bounceInRight;
697
+ }
698
+
699
+ @-webkit-keyframes bounceInUp {
700
+ 0% {
701
+ opacity: 0;
702
+ -webkit-transform: translateY(2000px);
703
+ transform: translateY(2000px);
704
+ }
705
+
706
+ 60% {
707
+ opacity: 1;
708
+ -webkit-transform: translateY(-30px);
709
+ transform: translateY(-30px);
710
+ }
711
+
712
+ 80% {
713
+ -webkit-transform: translateY(10px);
714
+ transform: translateY(10px);
715
+ }
716
+
717
+ 100% {
718
+ -webkit-transform: translateY(0);
719
+ transform: translateY(0);
720
+ }
721
+ }
722
+
723
+ @keyframes bounceInUp {
724
+ 0% {
725
+ opacity: 0;
726
+ -webkit-transform: translateY(2000px);
727
+ -ms-transform: translateY(2000px);
728
+ transform: translateY(2000px);
729
+ }
730
+
731
+ 60% {
732
+ opacity: 1;
733
+ -webkit-transform: translateY(-30px);
734
+ -ms-transform: translateY(-30px);
735
+ transform: translateY(-30px);
736
+ }
737
+
738
+ 80% {
739
+ -webkit-transform: translateY(10px);
740
+ -ms-transform: translateY(10px);
741
+ transform: translateY(10px);
742
+ }
743
+
744
+ 100% {
745
+ -webkit-transform: translateY(0);
746
+ -ms-transform: translateY(0);
747
+ transform: translateY(0);
748
+ }
749
+ }
750
+
751
+ .bounceInUp {
752
+ -webkit-animation-name: bounceInUp;
753
+ animation-name: bounceInUp;
754
+ }
755
+
756
+ @-webkit-keyframes bounceOut {
757
+ 0% {
758
+ -webkit-transform: scale(1);
759
+ transform: scale(1);
760
+ }
761
+
762
+ 25% {
763
+ -webkit-transform: scale(.95);
764
+ transform: scale(.95);
765
+ }
766
+
767
+ 50% {
768
+ opacity: 1;
769
+ -webkit-transform: scale(1.1);
770
+ transform: scale(1.1);
771
+ }
772
+
773
+ 100% {
774
+ opacity: 0;
775
+ -webkit-transform: scale(.3);
776
+ transform: scale(.3);
777
+ }
778
+ }
779
+
780
+ @keyframes bounceOut {
781
+ 0% {
782
+ -webkit-transform: scale(1);
783
+ -ms-transform: scale(1);
784
+ transform: scale(1);
785
+ }
786
+
787
+ 25% {
788
+ -webkit-transform: scale(.95);
789
+ -ms-transform: scale(.95);
790
+ transform: scale(.95);
791
+ }
792
+
793
+ 50% {
794
+ opacity: 1;
795
+ -webkit-transform: scale(1.1);
796
+ -ms-transform: scale(1.1);
797
+ transform: scale(1.1);
798
+ }
799
+
800
+ 100% {
801
+ opacity: 0;
802
+ -webkit-transform: scale(.3);
803
+ -ms-transform: scale(.3);
804
+ transform: scale(.3);
805
+ }
806
+ }
807
+
808
+ .bounceOut {
809
+ -webkit-animation-name: bounceOut;
810
+ animation-name: bounceOut;
811
+ }
812
+
813
+ @-webkit-keyframes bounceOutDown {
814
+ 0% {
815
+ -webkit-transform: translateY(0);
816
+ transform: translateY(0);
817
+ }
818
+
819
+ 20% {
820
+ opacity: 1;
821
+ -webkit-transform: translateY(-20px);
822
+ transform: translateY(-20px);
823
+ }
824
+
825
+ 100% {
826
+ opacity: 0;
827
+ -webkit-transform: translateY(2000px);
828
+ transform: translateY(2000px);
829
+ }
830
+ }
831
+
832
+ @keyframes bounceOutDown {
833
+ 0% {
834
+ -webkit-transform: translateY(0);
835
+ -ms-transform: translateY(0);
836
+ transform: translateY(0);
837
+ }
838
+
839
+ 20% {
840
+ opacity: 1;
841
+ -webkit-transform: translateY(-20px);
842
+ -ms-transform: translateY(-20px);
843
+ transform: translateY(-20px);
844
+ }
845
+
846
+ 100% {
847
+ opacity: 0;
848
+ -webkit-transform: translateY(2000px);
849
+ -ms-transform: translateY(2000px);
850
+ transform: translateY(2000px);
851
+ }
852
+ }
853
+
854
+ .bounceOutDown {
855
+ -webkit-animation-name: bounceOutDown;
856
+ animation-name: bounceOutDown;
857
+ }
858
+
859
+ @-webkit-keyframes bounceOutLeft {
860
+ 0% {
861
+ -webkit-transform: translateX(0);
862
+ transform: translateX(0);
863
+ }
864
+
865
+ 20% {
866
+ opacity: 1;
867
+ -webkit-transform: translateX(20px);
868
+ transform: translateX(20px);
869
+ }
870
+
871
+ 100% {
872
+ opacity: 0;
873
+ -webkit-transform: translateX(-2000px);
874
+ transform: translateX(-2000px);
875
+ }
876
+ }
877
+
878
+ @keyframes bounceOutLeft {
879
+ 0% {
880
+ -webkit-transform: translateX(0);
881
+ -ms-transform: translateX(0);
882
+ transform: translateX(0);
883
+ }
884
+
885
+ 20% {
886
+ opacity: 1;
887
+ -webkit-transform: translateX(20px);
888
+ -ms-transform: translateX(20px);
889
+ transform: translateX(20px);
890
+ }
891
+
892
+ 100% {
893
+ opacity: 0;
894
+ -webkit-transform: translateX(-2000px);
895
+ -ms-transform: translateX(-2000px);
896
+ transform: translateX(-2000px);
897
+ }
898
+ }
899
+
900
+ .bounceOutLeft {
901
+ -webkit-animation-name: bounceOutLeft;
902
+ animation-name: bounceOutLeft;
903
+ }
904
+
905
+ @-webkit-keyframes bounceOutRight {
906
+ 0% {
907
+ -webkit-transform: translateX(0);
908
+ transform: translateX(0);
909
+ }
910
+
911
+ 20% {
912
+ opacity: 1;
913
+ -webkit-transform: translateX(-20px);
914
+ transform: translateX(-20px);
915
+ }
916
+
917
+ 100% {
918
+ opacity: 0;
919
+ -webkit-transform: translateX(2000px);
920
+ transform: translateX(2000px);
921
+ }
922
+ }
923
+
924
+ @keyframes bounceOutRight {
925
+ 0% {
926
+ -webkit-transform: translateX(0);
927
+ -ms-transform: translateX(0);
928
+ transform: translateX(0);
929
+ }
930
+
931
+ 20% {
932
+ opacity: 1;
933
+ -webkit-transform: translateX(-20px);
934
+ -ms-transform: translateX(-20px);
935
+ transform: translateX(-20px);
936
+ }
937
+
938
+ 100% {
939
+ opacity: 0;
940
+ -webkit-transform: translateX(2000px);
941
+ -ms-transform: translateX(2000px);
942
+ transform: translateX(2000px);
943
+ }
944
+ }
945
+
946
+ .bounceOutRight {
947
+ -webkit-animation-name: bounceOutRight;
948
+ animation-name: bounceOutRight;
949
+ }
950
+
951
+ @-webkit-keyframes bounceOutUp {
952
+ 0% {
953
+ -webkit-transform: translateY(0);
954
+ transform: translateY(0);
955
+ }
956
+
957
+ 20% {
958
+ opacity: 1;
959
+ -webkit-transform: translateY(20px);
960
+ transform: translateY(20px);
961
+ }
962
+
963
+ 100% {
964
+ opacity: 0;
965
+ -webkit-transform: translateY(-2000px);
966
+ transform: translateY(-2000px);
967
+ }
968
+ }
969
+
970
+ @keyframes bounceOutUp {
971
+ 0% {
972
+ -webkit-transform: translateY(0);
973
+ -ms-transform: translateY(0);
974
+ transform: translateY(0);
975
+ }
976
+
977
+ 20% {
978
+ opacity: 1;
979
+ -webkit-transform: translateY(20px);
980
+ -ms-transform: translateY(20px);
981
+ transform: translateY(20px);
982
+ }
983
+
984
+ 100% {
985
+ opacity: 0;
986
+ -webkit-transform: translateY(-2000px);
987
+ -ms-transform: translateY(-2000px);
988
+ transform: translateY(-2000px);
989
+ }
990
+ }
991
+
992
+ .bounceOutUp {
993
+ -webkit-animation-name: bounceOutUp;
994
+ animation-name: bounceOutUp;
995
+ }
996
+
997
+ @-webkit-keyframes fadeIn {
998
+ 0% {
999
+ opacity: 0;
1000
+ }
1001
+
1002
+ 100% {
1003
+ opacity: 1;
1004
+ }
1005
+ }
1006
+
1007
+ @keyframes fadeIn {
1008
+ 0% {
1009
+ opacity: 0;
1010
+ }
1011
+
1012
+ 100% {
1013
+ opacity: 1;
1014
+ }
1015
+ }
1016
+
1017
+ .fadeIn {
1018
+ -webkit-animation-name: fadeIn;
1019
+ animation-name: fadeIn;
1020
+ }
1021
+
1022
+ @-webkit-keyframes fadeInDown {
1023
+ 0% {
1024
+ opacity: 0;
1025
+ -webkit-transform: translateY(-20px);
1026
+ transform: translateY(-20px);
1027
+ }
1028
+
1029
+ 100% {
1030
+ opacity: 1;
1031
+ -webkit-transform: translateY(0);
1032
+ transform: translateY(0);
1033
+ }
1034
+ }
1035
+
1036
+ @keyframes fadeInDown {
1037
+ 0% {
1038
+ opacity: 0;
1039
+ -webkit-transform: translateY(-20px);
1040
+ -ms-transform: translateY(-20px);
1041
+ transform: translateY(-20px);
1042
+ }
1043
+
1044
+ 100% {
1045
+ opacity: 1;
1046
+ -webkit-transform: translateY(0);
1047
+ -ms-transform: translateY(0);
1048
+ transform: translateY(0);
1049
+ }
1050
+ }
1051
+
1052
+ .fadeInDown {
1053
+ -webkit-animation-name: fadeInDown;
1054
+ animation-name: fadeInDown;
1055
+ }
1056
+
1057
+ @-webkit-keyframes fadeInDownBig {
1058
+ 0% {
1059
+ opacity: 0;
1060
+ -webkit-transform: translateY(-2000px);
1061
+ transform: translateY(-2000px);
1062
+ }
1063
+
1064
+ 100% {
1065
+ opacity: 1;
1066
+ -webkit-transform: translateY(0);
1067
+ transform: translateY(0);
1068
+ }
1069
+ }
1070
+
1071
+ @keyframes fadeInDownBig {
1072
+ 0% {
1073
+ opacity: 0;
1074
+ -webkit-transform: translateY(-2000px);
1075
+ -ms-transform: translateY(-2000px);
1076
+ transform: translateY(-2000px);
1077
+ }
1078
+
1079
+ 100% {
1080
+ opacity: 1;
1081
+ -webkit-transform: translateY(0);
1082
+ -ms-transform: translateY(0);
1083
+ transform: translateY(0);
1084
+ }
1085
+ }
1086
+
1087
+ .fadeInDownBig {
1088
+ -webkit-animation-name: fadeInDownBig;
1089
+ animation-name: fadeInDownBig;
1090
+ }
1091
+
1092
+ @-webkit-keyframes fadeInLeft {
1093
+ 0% {
1094
+ opacity: 0;
1095
+ -webkit-transform: translateX(-20px);
1096
+ transform: translateX(-20px);
1097
+ }
1098
+
1099
+ 100% {
1100
+ opacity: 1;
1101
+ -webkit-transform: translateX(0);
1102
+ transform: translateX(0);
1103
+ }
1104
+ }
1105
+
1106
+ @keyframes fadeInLeft {
1107
+ 0% {
1108
+ opacity: 0;
1109
+ -webkit-transform: translateX(-20px);
1110
+ -ms-transform: translateX(-20px);
1111
+ transform: translateX(-20px);
1112
+ }
1113
+
1114
+ 100% {
1115
+ opacity: 1;
1116
+ -webkit-transform: translateX(0);
1117
+ -ms-transform: translateX(0);
1118
+ transform: translateX(0);
1119
+ }
1120
+ }
1121
+
1122
+ .fadeInLeft {
1123
+ -webkit-animation-name: fadeInLeft;
1124
+ animation-name: fadeInLeft;
1125
+ }
1126
+
1127
+ @-webkit-keyframes fadeInLeftBig {
1128
+ 0% {
1129
+ opacity: 0;
1130
+ -webkit-transform: translateX(-2000px);
1131
+ transform: translateX(-2000px);
1132
+ }
1133
+
1134
+ 100% {
1135
+ opacity: 1;
1136
+ -webkit-transform: translateX(0);
1137
+ transform: translateX(0);
1138
+ }
1139
+ }
1140
+
1141
+ @keyframes fadeInLeftBig {
1142
+ 0% {
1143
+ opacity: 0;
1144
+ -webkit-transform: translateX(-2000px);
1145
+ -ms-transform: translateX(-2000px);
1146
+ transform: translateX(-2000px);
1147
+ }
1148
+
1149
+ 100% {
1150
+ opacity: 1;
1151
+ -webkit-transform: translateX(0);
1152
+ -ms-transform: translateX(0);
1153
+ transform: translateX(0);
1154
+ }
1155
+ }
1156
+
1157
+ .fadeInLeftBig {
1158
+ -webkit-animation-name: fadeInLeftBig;
1159
+ animation-name: fadeInLeftBig;
1160
+ }
1161
+
1162
+ @-webkit-keyframes fadeInRight {
1163
+ 0% {
1164
+ opacity: 0;
1165
+ -webkit-transform: translateX(20px);
1166
+ transform: translateX(20px);
1167
+ }
1168
+
1169
+ 100% {
1170
+ opacity: 1;
1171
+ -webkit-transform: translateX(0);
1172
+ transform: translateX(0);
1173
+ }
1174
+ }
1175
+
1176
+ @keyframes fadeInRight {
1177
+ 0% {
1178
+ opacity: 0;
1179
+ -webkit-transform: translateX(20px);
1180
+ -ms-transform: translateX(20px);
1181
+ transform: translateX(20px);
1182
+ }
1183
+
1184
+ 100% {
1185
+ opacity: 1;
1186
+ -webkit-transform: translateX(0);
1187
+ -ms-transform: translateX(0);
1188
+ transform: translateX(0);
1189
+ }
1190
+ }
1191
+
1192
+ .fadeInRight {
1193
+ -webkit-animation-name: fadeInRight;
1194
+ animation-name: fadeInRight;
1195
+ }
1196
+
1197
+ @-webkit-keyframes fadeInRightBig {
1198
+ 0% {
1199
+ opacity: 0;
1200
+ -webkit-transform: translateX(2000px);
1201
+ transform: translateX(2000px);
1202
+ }
1203
+
1204
+ 100% {
1205
+ opacity: 1;
1206
+ -webkit-transform: translateX(0);
1207
+ transform: translateX(0);
1208
+ }
1209
+ }
1210
+
1211
+ @keyframes fadeInRightBig {
1212
+ 0% {
1213
+ opacity: 0;
1214
+ -webkit-transform: translateX(2000px);
1215
+ -ms-transform: translateX(2000px);
1216
+ transform: translateX(2000px);
1217
+ }
1218
+
1219
+ 100% {
1220
+ opacity: 1;
1221
+ -webkit-transform: translateX(0);
1222
+ -ms-transform: translateX(0);
1223
+ transform: translateX(0);
1224
+ }
1225
+ }
1226
+
1227
+ .fadeInRightBig {
1228
+ -webkit-animation-name: fadeInRightBig;
1229
+ animation-name: fadeInRightBig;
1230
+ }
1231
+
1232
+ @-webkit-keyframes fadeInUp {
1233
+ 0% {
1234
+ opacity: 0;
1235
+ -webkit-transform: translateY(20px);
1236
+ transform: translateY(20px);
1237
+ }
1238
+
1239
+ 100% {
1240
+ opacity: 1;
1241
+ -webkit-transform: translateY(0);
1242
+ transform: translateY(0);
1243
+ }
1244
+ }
1245
+
1246
+ @keyframes fadeInUp {
1247
+ 0% {
1248
+ opacity: 0;
1249
+ -webkit-transform: translateY(20px);
1250
+ -ms-transform: translateY(20px);
1251
+ transform: translateY(20px);
1252
+ }
1253
+
1254
+ 100% {
1255
+ opacity: 1;
1256
+ -webkit-transform: translateY(0);
1257
+ -ms-transform: translateY(0);
1258
+ transform: translateY(0);
1259
+ }
1260
+ }
1261
+
1262
+ .fadeInUp {
1263
+ -webkit-animation-name: fadeInUp;
1264
+ animation-name: fadeInUp;
1265
+ }
1266
+
1267
+ @-webkit-keyframes fadeInUpBig {
1268
+ 0% {
1269
+ opacity: 0;
1270
+ -webkit-transform: translateY(2000px);
1271
+ transform: translateY(2000px);
1272
+ }
1273
+
1274
+ 100% {
1275
+ opacity: 1;
1276
+ -webkit-transform: translateY(0);
1277
+ transform: translateY(0);
1278
+ }
1279
+ }
1280
+
1281
+ @keyframes fadeInUpBig {
1282
+ 0% {
1283
+ opacity: 0;
1284
+ -webkit-transform: translateY(2000px);
1285
+ -ms-transform: translateY(2000px);
1286
+ transform: translateY(2000px);
1287
+ }
1288
+
1289
+ 100% {
1290
+ opacity: 1;
1291
+ -webkit-transform: translateY(0);
1292
+ -ms-transform: translateY(0);
1293
+ transform: translateY(0);
1294
+ }
1295
+ }
1296
+
1297
+ .fadeInUpBig {
1298
+ -webkit-animation-name: fadeInUpBig;
1299
+ animation-name: fadeInUpBig;
1300
+ }
1301
+
1302
+ @-webkit-keyframes fadeOut {
1303
+ 0% {
1304
+ opacity: 1;
1305
+ }
1306
+
1307
+ 100% {
1308
+ opacity: 0;
1309
+ }
1310
+ }
1311
+
1312
+ @keyframes fadeOut {
1313
+ 0% {
1314
+ opacity: 1;
1315
+ }
1316
+
1317
+ 100% {
1318
+ opacity: 0;
1319
+ }
1320
+ }
1321
+
1322
+ .fadeOut {
1323
+ -webkit-animation-name: fadeOut;
1324
+ animation-name: fadeOut;
1325
+ }
1326
+
1327
+ @-webkit-keyframes fadeOutDown {
1328
+ 0% {
1329
+ opacity: 1;
1330
+ -webkit-transform: translateY(0);
1331
+ transform: translateY(0);
1332
+ }
1333
+
1334
+ 100% {
1335
+ opacity: 0;
1336
+ -webkit-transform: translateY(20px);
1337
+ transform: translateY(20px);
1338
+ }
1339
+ }
1340
+
1341
+ @keyframes fadeOutDown {
1342
+ 0% {
1343
+ opacity: 1;
1344
+ -webkit-transform: translateY(0);
1345
+ -ms-transform: translateY(0);
1346
+ transform: translateY(0);
1347
+ }
1348
+
1349
+ 100% {
1350
+ opacity: 0;
1351
+ -webkit-transform: translateY(20px);
1352
+ -ms-transform: translateY(20px);
1353
+ transform: translateY(20px);
1354
+ }
1355
+ }
1356
+
1357
+ .fadeOutDown {
1358
+ -webkit-animation-name: fadeOutDown;
1359
+ animation-name: fadeOutDown;
1360
+ }
1361
+
1362
+ @-webkit-keyframes fadeOutDownBig {
1363
+ 0% {
1364
+ opacity: 1;
1365
+ -webkit-transform: translateY(0);
1366
+ transform: translateY(0);
1367
+ }
1368
+
1369
+ 100% {
1370
+ opacity: 0;
1371
+ -webkit-transform: translateY(2000px);
1372
+ transform: translateY(2000px);
1373
+ }
1374
+ }
1375
+
1376
+ @keyframes fadeOutDownBig {
1377
+ 0% {
1378
+ opacity: 1;
1379
+ -webkit-transform: translateY(0);
1380
+ -ms-transform: translateY(0);
1381
+ transform: translateY(0);
1382
+ }
1383
+
1384
+ 100% {
1385
+ opacity: 0;
1386
+ -webkit-transform: translateY(2000px);
1387
+ -ms-transform: translateY(2000px);
1388
+ transform: translateY(2000px);
1389
+ }
1390
+ }
1391
+
1392
+ .fadeOutDownBig {
1393
+ -webkit-animation-name: fadeOutDownBig;
1394
+ animation-name: fadeOutDownBig;
1395
+ }
1396
+
1397
+ @-webkit-keyframes fadeOutLeft {
1398
+ 0% {
1399
+ opacity: 1;
1400
+ -webkit-transform: translateX(0);
1401
+ transform: translateX(0);
1402
+ }
1403
+
1404
+ 100% {
1405
+ opacity: 0;
1406
+ -webkit-transform: translateX(-20px);
1407
+ transform: translateX(-20px);
1408
+ }
1409
+ }
1410
+
1411
+ @keyframes fadeOutLeft {
1412
+ 0% {
1413
+ opacity: 1;
1414
+ -webkit-transform: translateX(0);
1415
+ -ms-transform: translateX(0);
1416
+ transform: translateX(0);
1417
+ }
1418
+
1419
+ 100% {
1420
+ opacity: 0;
1421
+ -webkit-transform: translateX(-20px);
1422
+ -ms-transform: translateX(-20px);
1423
+ transform: translateX(-20px);
1424
+ }
1425
+ }
1426
+
1427
+ .fadeOutLeft {
1428
+ -webkit-animation-name: fadeOutLeft;
1429
+ animation-name: fadeOutLeft;
1430
+ }
1431
+
1432
+ @-webkit-keyframes fadeOutLeftBig {
1433
+ 0% {
1434
+ opacity: 1;
1435
+ -webkit-transform: translateX(0);
1436
+ transform: translateX(0);
1437
+ }
1438
+
1439
+ 100% {
1440
+ opacity: 0;
1441
+ -webkit-transform: translateX(-2000px);
1442
+ transform: translateX(-2000px);
1443
+ }
1444
+ }
1445
+
1446
+ @keyframes fadeOutLeftBig {
1447
+ 0% {
1448
+ opacity: 1;
1449
+ -webkit-transform: translateX(0);
1450
+ -ms-transform: translateX(0);
1451
+ transform: translateX(0);
1452
+ }
1453
+
1454
+ 100% {
1455
+ opacity: 0;
1456
+ -webkit-transform: translateX(-2000px);
1457
+ -ms-transform: translateX(-2000px);
1458
+ transform: translateX(-2000px);
1459
+ }
1460
+ }
1461
+
1462
+ .fadeOutLeftBig {
1463
+ -webkit-animation-name: fadeOutLeftBig;
1464
+ animation-name: fadeOutLeftBig;
1465
+ }
1466
+
1467
+ @-webkit-keyframes fadeOutRight {
1468
+ 0% {
1469
+ opacity: 1;
1470
+ -webkit-transform: translateX(0);
1471
+ transform: translateX(0);
1472
+ }
1473
+
1474
+ 100% {
1475
+ opacity: 0;
1476
+ -webkit-transform: translateX(20px);
1477
+ transform: translateX(20px);
1478
+ }
1479
+ }
1480
+
1481
+ @keyframes fadeOutRight {
1482
+ 0% {
1483
+ opacity: 1;
1484
+ -webkit-transform: translateX(0);
1485
+ -ms-transform: translateX(0);
1486
+ transform: translateX(0);
1487
+ }
1488
+
1489
+ 100% {
1490
+ opacity: 0;
1491
+ -webkit-transform: translateX(20px);
1492
+ -ms-transform: translateX(20px);
1493
+ transform: translateX(20px);
1494
+ }
1495
+ }
1496
+
1497
+ .fadeOutRight {
1498
+ -webkit-animation-name: fadeOutRight;
1499
+ animation-name: fadeOutRight;
1500
+ }
1501
+
1502
+ @-webkit-keyframes fadeOutRightBig {
1503
+ 0% {
1504
+ opacity: 1;
1505
+ -webkit-transform: translateX(0);
1506
+ transform: translateX(0);
1507
+ }
1508
+
1509
+ 100% {
1510
+ opacity: 0;
1511
+ -webkit-transform: translateX(2000px);
1512
+ transform: translateX(2000px);
1513
+ }
1514
+ }
1515
+
1516
+ @keyframes fadeOutRightBig {
1517
+ 0% {
1518
+ opacity: 1;
1519
+ -webkit-transform: translateX(0);
1520
+ -ms-transform: translateX(0);
1521
+ transform: translateX(0);
1522
+ }
1523
+
1524
+ 100% {
1525
+ opacity: 0;
1526
+ -webkit-transform: translateX(2000px);
1527
+ -ms-transform: translateX(2000px);
1528
+ transform: translateX(2000px);
1529
+ }
1530
+ }
1531
+
1532
+ .fadeOutRightBig {
1533
+ -webkit-animation-name: fadeOutRightBig;
1534
+ animation-name: fadeOutRightBig;
1535
+ }
1536
+
1537
+ @-webkit-keyframes fadeOutUp {
1538
+ 0% {
1539
+ opacity: 1;
1540
+ -webkit-transform: translateY(0);
1541
+ transform: translateY(0);
1542
+ }
1543
+
1544
+ 100% {
1545
+ opacity: 0;
1546
+ -webkit-transform: translateY(-20px);
1547
+ transform: translateY(-20px);
1548
+ }
1549
+ }
1550
+
1551
+ @keyframes fadeOutUp {
1552
+ 0% {
1553
+ opacity: 1;
1554
+ -webkit-transform: translateY(0);
1555
+ -ms-transform: translateY(0);
1556
+ transform: translateY(0);
1557
+ }
1558
+
1559
+ 100% {
1560
+ opacity: 0;
1561
+ -webkit-transform: translateY(-20px);
1562
+ -ms-transform: translateY(-20px);
1563
+ transform: translateY(-20px);
1564
+ }
1565
+ }
1566
+
1567
+ .fadeOutUp {
1568
+ -webkit-animation-name: fadeOutUp;
1569
+ animation-name: fadeOutUp;
1570
+ }
1571
+
1572
+ @-webkit-keyframes fadeOutUpBig {
1573
+ 0% {
1574
+ opacity: 1;
1575
+ -webkit-transform: translateY(0);
1576
+ transform: translateY(0);
1577
+ }
1578
+
1579
+ 100% {
1580
+ opacity: 0;
1581
+ -webkit-transform: translateY(-2000px);
1582
+ transform: translateY(-2000px);
1583
+ }
1584
+ }
1585
+
1586
+ @keyframes fadeOutUpBig {
1587
+ 0% {
1588
+ opacity: 1;
1589
+ -webkit-transform: translateY(0);
1590
+ -ms-transform: translateY(0);
1591
+ transform: translateY(0);
1592
+ }
1593
+
1594
+ 100% {
1595
+ opacity: 0;
1596
+ -webkit-transform: translateY(-2000px);
1597
+ -ms-transform: translateY(-2000px);
1598
+ transform: translateY(-2000px);
1599
+ }
1600
+ }
1601
+
1602
+ .fadeOutUpBig {
1603
+ -webkit-animation-name: fadeOutUpBig;
1604
+ animation-name: fadeOutUpBig;
1605
+ }
1606
+
1607
+ @-webkit-keyframes flip {
1608
+ 0% {
1609
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
1610
+ transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
1611
+ -webkit-animation-timing-function: ease-out;
1612
+ animation-timing-function: ease-out;
1613
+ }
1614
+
1615
+ 40% {
1616
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
1617
+ transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
1618
+ -webkit-animation-timing-function: ease-out;
1619
+ animation-timing-function: ease-out;
1620
+ }
1621
+
1622
+ 50% {
1623
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
1624
+ transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
1625
+ -webkit-animation-timing-function: ease-in;
1626
+ animation-timing-function: ease-in;
1627
+ }
1628
+
1629
+ 80% {
1630
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
1631
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
1632
+ -webkit-animation-timing-function: ease-in;
1633
+ animation-timing-function: ease-in;
1634
+ }
1635
+
1636
+ 100% {
1637
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
1638
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
1639
+ -webkit-animation-timing-function: ease-in;
1640
+ animation-timing-function: ease-in;
1641
+ }
1642
+ }
1643
+
1644
+ @keyframes flip {
1645
+ 0% {
1646
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
1647
+ -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
1648
+ transform: perspective(400px) translateZ(0) rotateY(0) scale(1);
1649
+ -webkit-animation-timing-function: ease-out;
1650
+ animation-timing-function: ease-out;
1651
+ }
1652
+
1653
+ 40% {
1654
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
1655
+ -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
1656
+ transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1);
1657
+ -webkit-animation-timing-function: ease-out;
1658
+ animation-timing-function: ease-out;
1659
+ }
1660
+
1661
+ 50% {
1662
+ -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
1663
+ -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
1664
+ transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1);
1665
+ -webkit-animation-timing-function: ease-in;
1666
+ animation-timing-function: ease-in;
1667
+ }
1668
+
1669
+ 80% {
1670
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
1671
+ -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
1672
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95);
1673
+ -webkit-animation-timing-function: ease-in;
1674
+ animation-timing-function: ease-in;
1675
+ }
1676
+
1677
+ 100% {
1678
+ -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
1679
+ -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
1680
+ transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1);
1681
+ -webkit-animation-timing-function: ease-in;
1682
+ animation-timing-function: ease-in;
1683
+ }
1684
+ }
1685
+
1686
+ .animated.flip {
1687
+ -webkit-backface-visibility: visible;
1688
+ -ms-backface-visibility: visible;
1689
+ backface-visibility: visible;
1690
+ -webkit-animation-name: flip;
1691
+ animation-name: flip;
1692
+ }
1693
+
1694
+ @-webkit-keyframes flipInX {
1695
+ 0% {
1696
+ -webkit-transform: perspective(400px) rotateX(90deg);
1697
+ transform: perspective(400px) rotateX(90deg);
1698
+ opacity: 0;
1699
+ }
1700
+
1701
+ 40% {
1702
+ -webkit-transform: perspective(400px) rotateX(-10deg);
1703
+ transform: perspective(400px) rotateX(-10deg);
1704
+ }
1705
+
1706
+ 70% {
1707
+ -webkit-transform: perspective(400px) rotateX(10deg);
1708
+ transform: perspective(400px) rotateX(10deg);
1709
+ }
1710
+
1711
+ 100% {
1712
+ -webkit-transform: perspective(400px) rotateX(0deg);
1713
+ transform: perspective(400px) rotateX(0deg);
1714
+ opacity: 1;
1715
+ }
1716
+ }
1717
+
1718
+ @keyframes flipInX {
1719
+ 0% {
1720
+ -webkit-transform: perspective(400px) rotateX(90deg);
1721
+ -ms-transform: perspective(400px) rotateX(90deg);
1722
+ transform: perspective(400px) rotateX(90deg);
1723
+ opacity: 0;
1724
+ }
1725
+
1726
+ 40% {
1727
+ -webkit-transform: perspective(400px) rotateX(-10deg);
1728
+ -ms-transform: perspective(400px) rotateX(-10deg);
1729
+ transform: perspective(400px) rotateX(-10deg);
1730
+ }
1731
+
1732
+ 70% {
1733
+ -webkit-transform: perspective(400px) rotateX(10deg);
1734
+ -ms-transform: perspective(400px) rotateX(10deg);
1735
+ transform: perspective(400px) rotateX(10deg);
1736
+ }
1737
+
1738
+ 100% {
1739
+ -webkit-transform: perspective(400px) rotateX(0deg);
1740
+ -ms-transform: perspective(400px) rotateX(0deg);
1741
+ transform: perspective(400px) rotateX(0deg);
1742
+ opacity: 1;
1743
+ }
1744
+ }
1745
+
1746
+ .flipInX {
1747
+ -webkit-backface-visibility: visible !important;
1748
+ -ms-backface-visibility: visible !important;
1749
+ backface-visibility: visible !important;
1750
+ -webkit-animation-name: flipInX;
1751
+ animation-name: flipInX;
1752
+ }
1753
+
1754
+ @-webkit-keyframes flipInY {
1755
+ 0% {
1756
+ -webkit-transform: perspective(400px) rotateY(90deg);
1757
+ transform: perspective(400px) rotateY(90deg);
1758
+ opacity: 0;
1759
+ }
1760
+
1761
+ 40% {
1762
+ -webkit-transform: perspective(400px) rotateY(-10deg);
1763
+ transform: perspective(400px) rotateY(-10deg);
1764
+ }
1765
+
1766
+ 70% {
1767
+ -webkit-transform: perspective(400px) rotateY(10deg);
1768
+ transform: perspective(400px) rotateY(10deg);
1769
+ }
1770
+
1771
+ 100% {
1772
+ -webkit-transform: perspective(400px) rotateY(0deg);
1773
+ transform: perspective(400px) rotateY(0deg);
1774
+ opacity: 1;
1775
+ }
1776
+ }
1777
+
1778
+ @keyframes flipInY {
1779
+ 0% {
1780
+ -webkit-transform: perspective(400px) rotateY(90deg);
1781
+ -ms-transform: perspective(400px) rotateY(90deg);
1782
+ transform: perspective(400px) rotateY(90deg);
1783
+ opacity: 0;
1784
+ }
1785
+
1786
+ 40% {
1787
+ -webkit-transform: perspective(400px) rotateY(-10deg);
1788
+ -ms-transform: perspective(400px) rotateY(-10deg);
1789
+ transform: perspective(400px) rotateY(-10deg);
1790
+ }
1791
+
1792
+ 70% {
1793
+ -webkit-transform: perspective(400px) rotateY(10deg);
1794
+ -ms-transform: perspective(400px) rotateY(10deg);
1795
+ transform: perspective(400px) rotateY(10deg);
1796
+ }
1797
+
1798
+ 100% {
1799
+ -webkit-transform: perspective(400px) rotateY(0deg);
1800
+ -ms-transform: perspective(400px) rotateY(0deg);
1801
+ transform: perspective(400px) rotateY(0deg);
1802
+ opacity: 1;
1803
+ }
1804
+ }
1805
+
1806
+ .flipInY {
1807
+ -webkit-backface-visibility: visible !important;
1808
+ -ms-backface-visibility: visible !important;
1809
+ backface-visibility: visible !important;
1810
+ -webkit-animation-name: flipInY;
1811
+ animation-name: flipInY;
1812
+ }
1813
+
1814
+ @-webkit-keyframes flipOutX {
1815
+ 0% {
1816
+ -webkit-transform: perspective(400px) rotateX(0deg);
1817
+ transform: perspective(400px) rotateX(0deg);
1818
+ opacity: 1;
1819
+ }
1820
+
1821
+ 100% {
1822
+ -webkit-transform: perspective(400px) rotateX(90deg);
1823
+ transform: perspective(400px) rotateX(90deg);
1824
+ opacity: 0;
1825
+ }
1826
+ }
1827
+
1828
+ @keyframes flipOutX {
1829
+ 0% {
1830
+ -webkit-transform: perspective(400px) rotateX(0deg);
1831
+ -ms-transform: perspective(400px) rotateX(0deg);
1832
+ transform: perspective(400px) rotateX(0deg);
1833
+ opacity: 1;
1834
+ }
1835
+
1836
+ 100% {
1837
+ -webkit-transform: perspective(400px) rotateX(90deg);
1838
+ -ms-transform: perspective(400px) rotateX(90deg);
1839
+ transform: perspective(400px) rotateX(90deg);
1840
+ opacity: 0;
1841
+ }
1842
+ }
1843
+
1844
+ .flipOutX {
1845
+ -webkit-animation-name: flipOutX;
1846
+ animation-name: flipOutX;
1847
+ -webkit-backface-visibility: visible !important;
1848
+ -ms-backface-visibility: visible !important;
1849
+ backface-visibility: visible !important;
1850
+ }
1851
+
1852
+ @-webkit-keyframes flipOutY {
1853
+ 0% {
1854
+ -webkit-transform: perspective(400px) rotateY(0deg);
1855
+ transform: perspective(400px) rotateY(0deg);
1856
+ opacity: 1;
1857
+ }
1858
+
1859
+ 100% {
1860
+ -webkit-transform: perspective(400px) rotateY(90deg);
1861
+ transform: perspective(400px) rotateY(90deg);
1862
+ opacity: 0;
1863
+ }
1864
+ }
1865
+
1866
+ @keyframes flipOutY {
1867
+ 0% {
1868
+ -webkit-transform: perspective(400px) rotateY(0deg);
1869
+ -ms-transform: perspective(400px) rotateY(0deg);
1870
+ transform: perspective(400px) rotateY(0deg);
1871
+ opacity: 1;
1872
+ }
1873
+
1874
+ 100% {
1875
+ -webkit-transform: perspective(400px) rotateY(90deg);
1876
+ -ms-transform: perspective(400px) rotateY(90deg);
1877
+ transform: perspective(400px) rotateY(90deg);
1878
+ opacity: 0;
1879
+ }
1880
+ }
1881
+
1882
+ .flipOutY {
1883
+ -webkit-backface-visibility: visible !important;
1884
+ -ms-backface-visibility: visible !important;
1885
+ backface-visibility: visible !important;
1886
+ -webkit-animation-name: flipOutY;
1887
+ animation-name: flipOutY;
1888
+ }
1889
+
1890
+ @-webkit-keyframes lightSpeedIn {
1891
+ 0% {
1892
+ -webkit-transform: translateX(100%) skewX(-30deg);
1893
+ transform: translateX(100%) skewX(-30deg);
1894
+ opacity: 0;
1895
+ }
1896
+
1897
+ 60% {
1898
+ -webkit-transform: translateX(-20%) skewX(30deg);
1899
+ transform: translateX(-20%) skewX(30deg);
1900
+ opacity: 1;
1901
+ }
1902
+
1903
+ 80% {
1904
+ -webkit-transform: translateX(0%) skewX(-15deg);
1905
+ transform: translateX(0%) skewX(-15deg);
1906
+ opacity: 1;
1907
+ }
1908
+
1909
+ 100% {
1910
+ -webkit-transform: translateX(0%) skewX(0deg);
1911
+ transform: translateX(0%) skewX(0deg);
1912
+ opacity: 1;
1913
+ }
1914
+ }
1915
+
1916
+ @keyframes lightSpeedIn {
1917
+ 0% {
1918
+ -webkit-transform: translateX(100%) skewX(-30deg);
1919
+ -ms-transform: translateX(100%) skewX(-30deg);
1920
+ transform: translateX(100%) skewX(-30deg);
1921
+ opacity: 0;
1922
+ }
1923
+
1924
+ 60% {
1925
+ -webkit-transform: translateX(-20%) skewX(30deg);
1926
+ -ms-transform: translateX(-20%) skewX(30deg);
1927
+ transform: translateX(-20%) skewX(30deg);
1928
+ opacity: 1;
1929
+ }
1930
+
1931
+ 80% {
1932
+ -webkit-transform: translateX(0%) skewX(-15deg);
1933
+ -ms-transform: translateX(0%) skewX(-15deg);
1934
+ transform: translateX(0%) skewX(-15deg);
1935
+ opacity: 1;
1936
+ }
1937
+
1938
+ 100% {
1939
+ -webkit-transform: translateX(0%) skewX(0deg);
1940
+ -ms-transform: translateX(0%) skewX(0deg);
1941
+ transform: translateX(0%) skewX(0deg);
1942
+ opacity: 1;
1943
+ }
1944
+ }
1945
+
1946
+ .lightSpeedIn {
1947
+ -webkit-animation-name: lightSpeedIn;
1948
+ animation-name: lightSpeedIn;
1949
+ -webkit-animation-timing-function: ease-out;
1950
+ animation-timing-function: ease-out;
1951
+ }
1952
+
1953
+ @-webkit-keyframes lightSpeedOut {
1954
+ 0% {
1955
+ -webkit-transform: translateX(0%) skewX(0deg);
1956
+ transform: translateX(0%) skewX(0deg);
1957
+ opacity: 1;
1958
+ }
1959
+
1960
+ 100% {
1961
+ -webkit-transform: translateX(100%) skewX(-30deg);
1962
+ transform: translateX(100%) skewX(-30deg);
1963
+ opacity: 0;
1964
+ }
1965
+ }
1966
+
1967
+ @keyframes lightSpeedOut {
1968
+ 0% {
1969
+ -webkit-transform: translateX(0%) skewX(0deg);
1970
+ -ms-transform: translateX(0%) skewX(0deg);
1971
+ transform: translateX(0%) skewX(0deg);
1972
+ opacity: 1;
1973
+ }
1974
+
1975
+ 100% {
1976
+ -webkit-transform: translateX(100%) skewX(-30deg);
1977
+ -ms-transform: translateX(100%) skewX(-30deg);
1978
+ transform: translateX(100%) skewX(-30deg);
1979
+ opacity: 0;
1980
+ }
1981
+ }
1982
+
1983
+ .lightSpeedOut {
1984
+ -webkit-animation-name: lightSpeedOut;
1985
+ animation-name: lightSpeedOut;
1986
+ -webkit-animation-timing-function: ease-in;
1987
+ animation-timing-function: ease-in;
1988
+ }
1989
+
1990
+ @-webkit-keyframes rotateIn {
1991
+ 0% {
1992
+ -webkit-transform-origin: center center;
1993
+ transform-origin: center center;
1994
+ -webkit-transform: rotate(-200deg);
1995
+ transform: rotate(-200deg);
1996
+ opacity: 0;
1997
+ }
1998
+
1999
+ 100% {
2000
+ -webkit-transform-origin: center center;
2001
+ transform-origin: center center;
2002
+ -webkit-transform: rotate(0);
2003
+ transform: rotate(0);
2004
+ opacity: 1;
2005
+ }
2006
+ }
2007
+
2008
+ @keyframes rotateIn {
2009
+ 0% {
2010
+ -webkit-transform-origin: center center;
2011
+ -ms-transform-origin: center center;
2012
+ transform-origin: center center;
2013
+ -webkit-transform: rotate(-200deg);
2014
+ -ms-transform: rotate(-200deg);
2015
+ transform: rotate(-200deg);
2016
+ opacity: 0;
2017
+ }
2018
+
2019
+ 100% {
2020
+ -webkit-transform-origin: center center;
2021
+ -ms-transform-origin: center center;
2022
+ transform-origin: center center;
2023
+ -webkit-transform: rotate(0);
2024
+ -ms-transform: rotate(0);
2025
+ transform: rotate(0);
2026
+ opacity: 1;
2027
+ }
2028
+ }
2029
+
2030
+ .rotateIn {
2031
+ -webkit-animation-name: rotateIn;
2032
+ animation-name: rotateIn;
2033
+ }
2034
+
2035
+ @-webkit-keyframes rotateInDownLeft {
2036
+ 0% {
2037
+ -webkit-transform-origin: left bottom;
2038
+ transform-origin: left bottom;
2039
+ -webkit-transform: rotate(-90deg);
2040
+ transform: rotate(-90deg);
2041
+ opacity: 0;
2042
+ }
2043
+
2044
+ 100% {
2045
+ -webkit-transform-origin: left bottom;
2046
+ transform-origin: left bottom;
2047
+ -webkit-transform: rotate(0);
2048
+ transform: rotate(0);
2049
+ opacity: 1;
2050
+ }
2051
+ }
2052
+
2053
+ @keyframes rotateInDownLeft {
2054
+ 0% {
2055
+ -webkit-transform-origin: left bottom;
2056
+ -ms-transform-origin: left bottom;
2057
+ transform-origin: left bottom;
2058
+ -webkit-transform: rotate(-90deg);
2059
+ -ms-transform: rotate(-90deg);
2060
+ transform: rotate(-90deg);
2061
+ opacity: 0;
2062
+ }
2063
+
2064
+ 100% {
2065
+ -webkit-transform-origin: left bottom;
2066
+ -ms-transform-origin: left bottom;
2067
+ transform-origin: left bottom;
2068
+ -webkit-transform: rotate(0);
2069
+ -ms-transform: rotate(0);
2070
+ transform: rotate(0);
2071
+ opacity: 1;
2072
+ }
2073
+ }
2074
+
2075
+ .rotateInDownLeft {
2076
+ -webkit-animation-name: rotateInDownLeft;
2077
+ animation-name: rotateInDownLeft;
2078
+ }
2079
+
2080
+ @-webkit-keyframes rotateInDownRight {
2081
+ 0% {
2082
+ -webkit-transform-origin: right bottom;
2083
+ transform-origin: right bottom;
2084
+ -webkit-transform: rotate(90deg);
2085
+ transform: rotate(90deg);
2086
+ opacity: 0;
2087
+ }
2088
+
2089
+ 100% {
2090
+ -webkit-transform-origin: right bottom;
2091
+ transform-origin: right bottom;
2092
+ -webkit-transform: rotate(0);
2093
+ transform: rotate(0);
2094
+ opacity: 1;
2095
+ }
2096
+ }
2097
+
2098
+ @keyframes rotateInDownRight {
2099
+ 0% {
2100
+ -webkit-transform-origin: right bottom;
2101
+ -ms-transform-origin: right bottom;
2102
+ transform-origin: right bottom;
2103
+ -webkit-transform: rotate(90deg);
2104
+ -ms-transform: rotate(90deg);
2105
+ transform: rotate(90deg);
2106
+ opacity: 0;
2107
+ }
2108
+
2109
+ 100% {
2110
+ -webkit-transform-origin: right bottom;
2111
+ -ms-transform-origin: right bottom;
2112
+ transform-origin: right bottom;
2113
+ -webkit-transform: rotate(0);
2114
+ -ms-transform: rotate(0);
2115
+ transform: rotate(0);
2116
+ opacity: 1;
2117
+ }
2118
+ }
2119
+
2120
+ .rotateInDownRight {
2121
+ -webkit-animation-name: rotateInDownRight;
2122
+ animation-name: rotateInDownRight;
2123
+ }
2124
+
2125
+ @-webkit-keyframes rotateInUpLeft {
2126
+ 0% {
2127
+ -webkit-transform-origin: left bottom;
2128
+ transform-origin: left bottom;
2129
+ -webkit-transform: rotate(90deg);
2130
+ transform: rotate(90deg);
2131
+ opacity: 0;
2132
+ }
2133
+
2134
+ 100% {
2135
+ -webkit-transform-origin: left bottom;
2136
+ transform-origin: left bottom;
2137
+ -webkit-transform: rotate(0);
2138
+ transform: rotate(0);
2139
+ opacity: 1;
2140
+ }
2141
+ }
2142
+
2143
+ @keyframes rotateInUpLeft {
2144
+ 0% {
2145
+ -webkit-transform-origin: left bottom;
2146
+ -ms-transform-origin: left bottom;
2147
+ transform-origin: left bottom;
2148
+ -webkit-transform: rotate(90deg);
2149
+ -ms-transform: rotate(90deg);
2150
+ transform: rotate(90deg);
2151
+ opacity: 0;
2152
+ }
2153
+
2154
+ 100% {
2155
+ -webkit-transform-origin: left bottom;
2156
+ -ms-transform-origin: left bottom;
2157
+ transform-origin: left bottom;
2158
+ -webkit-transform: rotate(0);
2159
+ -ms-transform: rotate(0);
2160
+ transform: rotate(0);
2161
+ opacity: 1;
2162
+ }
2163
+ }
2164
+
2165
+ .rotateInUpLeft {
2166
+ -webkit-animation-name: rotateInUpLeft;
2167
+ animation-name: rotateInUpLeft;
2168
+ }
2169
+
2170
+ @-webkit-keyframes rotateInUpRight {
2171
+ 0% {
2172
+ -webkit-transform-origin: right bottom;
2173
+ transform-origin: right bottom;
2174
+ -webkit-transform: rotate(-90deg);
2175
+ transform: rotate(-90deg);
2176
+ opacity: 0;
2177
+ }
2178
+
2179
+ 100% {
2180
+ -webkit-transform-origin: right bottom;
2181
+ transform-origin: right bottom;
2182
+ -webkit-transform: rotate(0);
2183
+ transform: rotate(0);
2184
+ opacity: 1;
2185
+ }
2186
+ }
2187
+
2188
+ @keyframes rotateInUpRight {
2189
+ 0% {
2190
+ -webkit-transform-origin: right bottom;
2191
+ -ms-transform-origin: right bottom;
2192
+ transform-origin: right bottom;
2193
+ -webkit-transform: rotate(-90deg);
2194
+ -ms-transform: rotate(-90deg);
2195
+ transform: rotate(-90deg);
2196
+ opacity: 0;
2197
+ }
2198
+
2199
+ 100% {
2200
+ -webkit-transform-origin: right bottom;
2201
+ -ms-transform-origin: right bottom;
2202
+ transform-origin: right bottom;
2203
+ -webkit-transform: rotate(0);
2204
+ -ms-transform: rotate(0);
2205
+ transform: rotate(0);
2206
+ opacity: 1;
2207
+ }
2208
+ }
2209
+
2210
+ .rotateInUpRight {
2211
+ -webkit-animation-name: rotateInUpRight;
2212
+ animation-name: rotateInUpRight;
2213
+ }
2214
+
2215
+ @-webkit-keyframes rotateOut {
2216
+ 0% {
2217
+ -webkit-transform-origin: center center;
2218
+ transform-origin: center center;
2219
+ -webkit-transform: rotate(0);
2220
+ transform: rotate(0);
2221
+ opacity: 1;
2222
+ }
2223
+
2224
+ 100% {
2225
+ -webkit-transform-origin: center center;
2226
+ transform-origin: center center;
2227
+ -webkit-transform: rotate(200deg);
2228
+ transform: rotate(200deg);
2229
+ opacity: 0;
2230
+ }
2231
+ }
2232
+
2233
+ @keyframes rotateOut {
2234
+ 0% {
2235
+ -webkit-transform-origin: center center;
2236
+ -ms-transform-origin: center center;
2237
+ transform-origin: center center;
2238
+ -webkit-transform: rotate(0);
2239
+ -ms-transform: rotate(0);
2240
+ transform: rotate(0);
2241
+ opacity: 1;
2242
+ }
2243
+
2244
+ 100% {
2245
+ -webkit-transform-origin: center center;
2246
+ -ms-transform-origin: center center;
2247
+ transform-origin: center center;
2248
+ -webkit-transform: rotate(200deg);
2249
+ -ms-transform: rotate(200deg);
2250
+ transform: rotate(200deg);
2251
+ opacity: 0;
2252
+ }
2253
+ }
2254
+
2255
+ .rotateOut {
2256
+ -webkit-animation-name: rotateOut;
2257
+ animation-name: rotateOut;
2258
+ }
2259
+
2260
+ @-webkit-keyframes rotateOutDownLeft {
2261
+ 0% {
2262
+ -webkit-transform-origin: left bottom;
2263
+ transform-origin: left bottom;
2264
+ -webkit-transform: rotate(0);
2265
+ transform: rotate(0);
2266
+ opacity: 1;
2267
+ }
2268
+
2269
+ 100% {
2270
+ -webkit-transform-origin: left bottom;
2271
+ transform-origin: left bottom;
2272
+ -webkit-transform: rotate(90deg);
2273
+ transform: rotate(90deg);
2274
+ opacity: 0;
2275
+ }
2276
+ }
2277
+
2278
+ @keyframes rotateOutDownLeft {
2279
+ 0% {
2280
+ -webkit-transform-origin: left bottom;
2281
+ -ms-transform-origin: left bottom;
2282
+ transform-origin: left bottom;
2283
+ -webkit-transform: rotate(0);
2284
+ -ms-transform: rotate(0);
2285
+ transform: rotate(0);
2286
+ opacity: 1;
2287
+ }
2288
+
2289
+ 100% {
2290
+ -webkit-transform-origin: left bottom;
2291
+ -ms-transform-origin: left bottom;
2292
+ transform-origin: left bottom;
2293
+ -webkit-transform: rotate(90deg);
2294
+ -ms-transform: rotate(90deg);
2295
+ transform: rotate(90deg);
2296
+ opacity: 0;
2297
+ }
2298
+ }
2299
+
2300
+ .rotateOutDownLeft {
2301
+ -webkit-animation-name: rotateOutDownLeft;
2302
+ animation-name: rotateOutDownLeft;
2303
+ }
2304
+
2305
+ @-webkit-keyframes rotateOutDownRight {
2306
+ 0% {
2307
+ -webkit-transform-origin: right bottom;
2308
+ transform-origin: right bottom;
2309
+ -webkit-transform: rotate(0);
2310
+ transform: rotate(0);
2311
+ opacity: 1;
2312
+ }
2313
+
2314
+ 100% {
2315
+ -webkit-transform-origin: right bottom;
2316
+ transform-origin: right bottom;
2317
+ -webkit-transform: rotate(-90deg);
2318
+ transform: rotate(-90deg);
2319
+ opacity: 0;
2320
+ }
2321
+ }
2322
+
2323
+ @keyframes rotateOutDownRight {
2324
+ 0% {
2325
+ -webkit-transform-origin: right bottom;
2326
+ -ms-transform-origin: right bottom;
2327
+ transform-origin: right bottom;
2328
+ -webkit-transform: rotate(0);
2329
+ -ms-transform: rotate(0);
2330
+ transform: rotate(0);
2331
+ opacity: 1;
2332
+ }
2333
+
2334
+ 100% {
2335
+ -webkit-transform-origin: right bottom;
2336
+ -ms-transform-origin: right bottom;
2337
+ transform-origin: right bottom;
2338
+ -webkit-transform: rotate(-90deg);
2339
+ -ms-transform: rotate(-90deg);
2340
+ transform: rotate(-90deg);
2341
+ opacity: 0;
2342
+ }
2343
+ }
2344
+
2345
+ .rotateOutDownRight {
2346
+ -webkit-animation-name: rotateOutDownRight;
2347
+ animation-name: rotateOutDownRight;
2348
+ }
2349
+
2350
+ @-webkit-keyframes rotateOutUpLeft {
2351
+ 0% {
2352
+ -webkit-transform-origin: left bottom;
2353
+ transform-origin: left bottom;
2354
+ -webkit-transform: rotate(0);
2355
+ transform: rotate(0);
2356
+ opacity: 1;
2357
+ }
2358
+
2359
+ 100% {
2360
+ -webkit-transform-origin: left bottom;
2361
+ transform-origin: left bottom;
2362
+ -webkit-transform: rotate(-90deg);
2363
+ transform: rotate(-90deg);
2364
+ opacity: 0;
2365
+ }
2366
+ }
2367
+
2368
+ @keyframes rotateOutUpLeft {
2369
+ 0% {
2370
+ -webkit-transform-origin: left bottom;
2371
+ -ms-transform-origin: left bottom;
2372
+ transform-origin: left bottom;
2373
+ -webkit-transform: rotate(0);
2374
+ -ms-transform: rotate(0);
2375
+ transform: rotate(0);
2376
+ opacity: 1;
2377
+ }
2378
+
2379
+ 100% {
2380
+ -webkit-transform-origin: left bottom;
2381
+ -ms-transform-origin: left bottom;
2382
+ transform-origin: left bottom;
2383
+ -webkit-transform: rotate(-90deg);
2384
+ -ms-transform: rotate(-90deg);
2385
+ transform: rotate(-90deg);
2386
+ opacity: 0;
2387
+ }
2388
+ }
2389
+
2390
+ .rotateOutUpLeft {
2391
+ -webkit-animation-name: rotateOutUpLeft;
2392
+ animation-name: rotateOutUpLeft;
2393
+ }
2394
+
2395
+ @-webkit-keyframes rotateOutUpRight {
2396
+ 0% {
2397
+ -webkit-transform-origin: right bottom;
2398
+ transform-origin: right bottom;
2399
+ -webkit-transform: rotate(0);
2400
+ transform: rotate(0);
2401
+ opacity: 1;
2402
+ }
2403
+
2404
+ 100% {
2405
+ -webkit-transform-origin: right bottom;
2406
+ transform-origin: right bottom;
2407
+ -webkit-transform: rotate(90deg);
2408
+ transform: rotate(90deg);
2409
+ opacity: 0;
2410
+ }
2411
+ }
2412
+
2413
+ @keyframes rotateOutUpRight {
2414
+ 0% {
2415
+ -webkit-transform-origin: right bottom;
2416
+ -ms-transform-origin: right bottom;
2417
+ transform-origin: right bottom;
2418
+ -webkit-transform: rotate(0);
2419
+ -ms-transform: rotate(0);
2420
+ transform: rotate(0);
2421
+ opacity: 1;
2422
+ }
2423
+
2424
+ 100% {
2425
+ -webkit-transform-origin: right bottom;
2426
+ -ms-transform-origin: right bottom;
2427
+ transform-origin: right bottom;
2428
+ -webkit-transform: rotate(90deg);
2429
+ -ms-transform: rotate(90deg);
2430
+ transform: rotate(90deg);
2431
+ opacity: 0;
2432
+ }
2433
+ }
2434
+
2435
+ .rotateOutUpRight {
2436
+ -webkit-animation-name: rotateOutUpRight;
2437
+ animation-name: rotateOutUpRight;
2438
+ }
2439
+
2440
+ @-webkit-keyframes slideInDown {
2441
+ 0% {
2442
+ opacity: 0;
2443
+ -webkit-transform: translateY(-2000px);
2444
+ transform: translateY(-2000px);
2445
+ }
2446
+
2447
+ 100% {
2448
+ -webkit-transform: translateY(0);
2449
+ transform: translateY(0);
2450
+ }
2451
+ }
2452
+
2453
+ @keyframes slideInDown {
2454
+ 0% {
2455
+ opacity: 0;
2456
+ -webkit-transform: translateY(-2000px);
2457
+ -ms-transform: translateY(-2000px);
2458
+ transform: translateY(-2000px);
2459
+ }
2460
+
2461
+ 100% {
2462
+ -webkit-transform: translateY(0);
2463
+ -ms-transform: translateY(0);
2464
+ transform: translateY(0);
2465
+ }
2466
+ }
2467
+
2468
+ .slideInDown {
2469
+ -webkit-animation-name: slideInDown;
2470
+ animation-name: slideInDown;
2471
+ }
2472
+
2473
+ @-webkit-keyframes slideInLeft {
2474
+ 0% {
2475
+ opacity: 0;
2476
+ -webkit-transform: translateX(-2000px);
2477
+ transform: translateX(-2000px);
2478
+ }
2479
+
2480
+ 100% {
2481
+ -webkit-transform: translateX(0);
2482
+ transform: translateX(0);
2483
+ }
2484
+ }
2485
+
2486
+ @keyframes slideInLeft {
2487
+ 0% {
2488
+ opacity: 0;
2489
+ -webkit-transform: translateX(-2000px);
2490
+ -ms-transform: translateX(-2000px);
2491
+ transform: translateX(-2000px);
2492
+ }
2493
+
2494
+ 100% {
2495
+ -webkit-transform: translateX(0);
2496
+ -ms-transform: translateX(0);
2497
+ transform: translateX(0);
2498
+ }
2499
+ }
2500
+
2501
+ .slideInLeft {
2502
+ -webkit-animation-name: slideInLeft;
2503
+ animation-name: slideInLeft;
2504
+ }
2505
+
2506
+ @-webkit-keyframes slideInRight {
2507
+ 0% {
2508
+ opacity: 0;
2509
+ -webkit-transform: translateX(2000px);
2510
+ transform: translateX(2000px);
2511
+ }
2512
+
2513
+ 100% {
2514
+ -webkit-transform: translateX(0);
2515
+ transform: translateX(0);
2516
+ }
2517
+ }
2518
+
2519
+ @keyframes slideInRight {
2520
+ 0% {
2521
+ opacity: 0;
2522
+ -webkit-transform: translateX(2000px);
2523
+ -ms-transform: translateX(2000px);
2524
+ transform: translateX(2000px);
2525
+ }
2526
+
2527
+ 100% {
2528
+ -webkit-transform: translateX(0);
2529
+ -ms-transform: translateX(0);
2530
+ transform: translateX(0);
2531
+ }
2532
+ }
2533
+
2534
+ .slideInRight {
2535
+ -webkit-animation-name: slideInRight;
2536
+ animation-name: slideInRight;
2537
+ }
2538
+
2539
+ @-webkit-keyframes slideOutLeft {
2540
+ 0% {
2541
+ -webkit-transform: translateX(0);
2542
+ transform: translateX(0);
2543
+ }
2544
+
2545
+ 100% {
2546
+ opacity: 0;
2547
+ -webkit-transform: translateX(-2000px);
2548
+ transform: translateX(-2000px);
2549
+ }
2550
+ }
2551
+
2552
+ @keyframes slideOutLeft {
2553
+ 0% {
2554
+ -webkit-transform: translateX(0);
2555
+ -ms-transform: translateX(0);
2556
+ transform: translateX(0);
2557
+ }
2558
+
2559
+ 100% {
2560
+ opacity: 0;
2561
+ -webkit-transform: translateX(-2000px);
2562
+ -ms-transform: translateX(-2000px);
2563
+ transform: translateX(-2000px);
2564
+ }
2565
+ }
2566
+
2567
+ .slideOutLeft {
2568
+ -webkit-animation-name: slideOutLeft;
2569
+ animation-name: slideOutLeft;
2570
+ }
2571
+
2572
+ @-webkit-keyframes slideOutRight {
2573
+ 0% {
2574
+ -webkit-transform: translateX(0);
2575
+ transform: translateX(0);
2576
+ }
2577
+
2578
+ 100% {
2579
+ opacity: 0;
2580
+ -webkit-transform: translateX(2000px);
2581
+ transform: translateX(2000px);
2582
+ }
2583
+ }
2584
+
2585
+ @keyframes slideOutRight {
2586
+ 0% {
2587
+ -webkit-transform: translateX(0);
2588
+ -ms-transform: translateX(0);
2589
+ transform: translateX(0);
2590
+ }
2591
+
2592
+ 100% {
2593
+ opacity: 0;
2594
+ -webkit-transform: translateX(2000px);
2595
+ -ms-transform: translateX(2000px);
2596
+ transform: translateX(2000px);
2597
+ }
2598
+ }
2599
+
2600
+ .slideOutRight {
2601
+ -webkit-animation-name: slideOutRight;
2602
+ animation-name: slideOutRight;
2603
+ }
2604
+
2605
+ @-webkit-keyframes slideOutUp {
2606
+ 0% {
2607
+ -webkit-transform: translateY(0);
2608
+ transform: translateY(0);
2609
+ }
2610
+
2611
+ 100% {
2612
+ opacity: 0;
2613
+ -webkit-transform: translateY(-2000px);
2614
+ transform: translateY(-2000px);
2615
+ }
2616
+ }
2617
+
2618
+ @keyframes slideOutUp {
2619
+ 0% {
2620
+ -webkit-transform: translateY(0);
2621
+ -ms-transform: translateY(0);
2622
+ transform: translateY(0);
2623
+ }
2624
+
2625
+ 100% {
2626
+ opacity: 0;
2627
+ -webkit-transform: translateY(-2000px);
2628
+ -ms-transform: translateY(-2000px);
2629
+ transform: translateY(-2000px);
2630
+ }
2631
+ }
2632
+
2633
+ .slideOutUp {
2634
+ -webkit-animation-name: slideOutUp;
2635
+ animation-name: slideOutUp;
2636
+ }
2637
+
2638
+ @-webkit-keyframes slideInUp {
2639
+ 0% {
2640
+ opacity: 0;
2641
+ -webkit-transform: translateY(2000px);
2642
+ transform: translateY(2000px);
2643
+ }
2644
+
2645
+ 100% {
2646
+ opacity: 1;
2647
+ -webkit-transform: translateY(0);
2648
+ transform: translateY(0);
2649
+ }
2650
+ }
2651
+
2652
+ @keyframes slideInUp {
2653
+ 0% {
2654
+ opacity: 0;
2655
+ -webkit-transform: translateY(2000px);
2656
+ -ms-transform: translateY(2000px);
2657
+ transform: translateY(2000px);
2658
+ }
2659
+
2660
+ 100% {
2661
+ opacity: 1;
2662
+ -webkit-transform: translateY(0);
2663
+ -ms-transform: translateY(0);
2664
+ transform: translateY(0);
2665
+ }
2666
+ }
2667
+
2668
+ .slideInUp {
2669
+ -webkit-animation-name: slideInUp;
2670
+ animation-name: slideInUp;
2671
+ }
2672
+
2673
+ @-webkit-keyframes slideOutDown {
2674
+ 0% {
2675
+ -webkit-transform: translateY(0);
2676
+ transform: translateY(0);
2677
+ }
2678
+
2679
+ 100% {
2680
+ opacity: 0;
2681
+ -webkit-transform: translateY(2000px);
2682
+ transform: translateY(2000px);
2683
+ }
2684
+ }
2685
+
2686
+ @keyframes slideOutDown {
2687
+ 0% {
2688
+ -webkit-transform: translateY(0);
2689
+ -ms-transform: translateY(0);
2690
+ transform: translateY(0);
2691
+ }
2692
+
2693
+ 100% {
2694
+ opacity: 0;
2695
+ -webkit-transform: translateY(2000px);
2696
+ -ms-transform: translateY(2000px);
2697
+ transform: translateY(2000px);
2698
+ }
2699
+ }
2700
+
2701
+ .slideOutDown {
2702
+ -webkit-animation-name: slideOutDown;
2703
+ animation-name: slideOutDown;
2704
+ }
2705
+
2706
+ @-webkit-keyframes hinge {
2707
+ 0% {
2708
+ -webkit-transform: rotate(0);
2709
+ transform: rotate(0);
2710
+ -webkit-transform-origin: top left;
2711
+ transform-origin: top left;
2712
+ -webkit-animation-timing-function: ease-in-out;
2713
+ animation-timing-function: ease-in-out;
2714
+ }
2715
+
2716
+ 20%, 60% {
2717
+ -webkit-transform: rotate(80deg);
2718
+ transform: rotate(80deg);
2719
+ -webkit-transform-origin: top left;
2720
+ transform-origin: top left;
2721
+ -webkit-animation-timing-function: ease-in-out;
2722
+ animation-timing-function: ease-in-out;
2723
+ }
2724
+
2725
+ 40% {
2726
+ -webkit-transform: rotate(60deg);
2727
+ transform: rotate(60deg);
2728
+ -webkit-transform-origin: top left;
2729
+ transform-origin: top left;
2730
+ -webkit-animation-timing-function: ease-in-out;
2731
+ animation-timing-function: ease-in-out;
2732
+ }
2733
+
2734
+ 80% {
2735
+ -webkit-transform: rotate(60deg) translateY(0);
2736
+ transform: rotate(60deg) translateY(0);
2737
+ -webkit-transform-origin: top left;
2738
+ transform-origin: top left;
2739
+ -webkit-animation-timing-function: ease-in-out;
2740
+ animation-timing-function: ease-in-out;
2741
+ opacity: 1;
2742
+ }
2743
+
2744
+ 100% {
2745
+ -webkit-transform: translateY(700px);
2746
+ transform: translateY(700px);
2747
+ opacity: 0;
2748
+ }
2749
+ }
2750
+
2751
+ @keyframes hinge {
2752
+ 0% {
2753
+ -webkit-transform: rotate(0);
2754
+ -ms-transform: rotate(0);
2755
+ transform: rotate(0);
2756
+ -webkit-transform-origin: top left;
2757
+ -ms-transform-origin: top left;
2758
+ transform-origin: top left;
2759
+ -webkit-animation-timing-function: ease-in-out;
2760
+ animation-timing-function: ease-in-out;
2761
+ }
2762
+
2763
+ 20%, 60% {
2764
+ -webkit-transform: rotate(80deg);
2765
+ -ms-transform: rotate(80deg);
2766
+ transform: rotate(80deg);
2767
+ -webkit-transform-origin: top left;
2768
+ -ms-transform-origin: top left;
2769
+ transform-origin: top left;
2770
+ -webkit-animation-timing-function: ease-in-out;
2771
+ animation-timing-function: ease-in-out;
2772
+ }
2773
+
2774
+ 40% {
2775
+ -webkit-transform: rotate(60deg);
2776
+ -ms-transform: rotate(60deg);
2777
+ transform: rotate(60deg);
2778
+ -webkit-transform-origin: top left;
2779
+ -ms-transform-origin: top left;
2780
+ transform-origin: top left;
2781
+ -webkit-animation-timing-function: ease-in-out;
2782
+ animation-timing-function: ease-in-out;
2783
+ }
2784
+
2785
+ 80% {
2786
+ -webkit-transform: rotate(60deg) translateY(0);
2787
+ -ms-transform: rotate(60deg) translateY(0);
2788
+ transform: rotate(60deg) translateY(0);
2789
+ -webkit-transform-origin: top left;
2790
+ -ms-transform-origin: top left;
2791
+ transform-origin: top left;
2792
+ -webkit-animation-timing-function: ease-in-out;
2793
+ animation-timing-function: ease-in-out;
2794
+ opacity: 1;
2795
+ }
2796
+
2797
+ 100% {
2798
+ -webkit-transform: translateY(700px);
2799
+ -ms-transform: translateY(700px);
2800
+ transform: translateY(700px);
2801
+ opacity: 0;
2802
+ }
2803
+ }
2804
+
2805
+ .hinge {
2806
+ -webkit-animation-name: hinge;
2807
+ animation-name: hinge;
2808
+ }
2809
+
2810
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2811
+
2812
+ @-webkit-keyframes rollIn {
2813
+ 0% {
2814
+ opacity: 0;
2815
+ -webkit-transform: translateX(-100%) rotate(-120deg);
2816
+ transform: translateX(-100%) rotate(-120deg);
2817
+ }
2818
+
2819
+ 100% {
2820
+ opacity: 1;
2821
+ -webkit-transform: translateX(0px) rotate(0deg);
2822
+ transform: translateX(0px) rotate(0deg);
2823
+ }
2824
+ }
2825
+
2826
+ @keyframes rollIn {
2827
+ 0% {
2828
+ opacity: 0;
2829
+ -webkit-transform: translateX(-100%) rotate(-120deg);
2830
+ -ms-transform: translateX(-100%) rotate(-120deg);
2831
+ transform: translateX(-100%) rotate(-120deg);
2832
+ }
2833
+
2834
+ 100% {
2835
+ opacity: 1;
2836
+ -webkit-transform: translateX(0px) rotate(0deg);
2837
+ -ms-transform: translateX(0px) rotate(0deg);
2838
+ transform: translateX(0px) rotate(0deg);
2839
+ }
2840
+ }
2841
+
2842
+ .rollIn {
2843
+ -webkit-animation-name: rollIn;
2844
+ animation-name: rollIn;
2845
+ }
2846
+
2847
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
2848
+
2849
+ @-webkit-keyframes rollOut {
2850
+ 0% {
2851
+ opacity: 1;
2852
+ -webkit-transform: translateX(0px) rotate(0deg);
2853
+ transform: translateX(0px) rotate(0deg);
2854
+ }
2855
+
2856
+ 100% {
2857
+ opacity: 0;
2858
+ -webkit-transform: translateX(100%) rotate(120deg);
2859
+ transform: translateX(100%) rotate(120deg);
2860
+ }
2861
+ }
2862
+
2863
+ @keyframes rollOut {
2864
+ 0% {
2865
+ opacity: 1;
2866
+ -webkit-transform: translateX(0px) rotate(0deg);
2867
+ -ms-transform: translateX(0px) rotate(0deg);
2868
+ transform: translateX(0px) rotate(0deg);
2869
+ }
2870
+
2871
+ 100% {
2872
+ opacity: 0;
2873
+ -webkit-transform: translateX(100%) rotate(120deg);
2874
+ -ms-transform: translateX(100%) rotate(120deg);
2875
+ transform: translateX(100%) rotate(120deg);
2876
+ }
2877
+ }
2878
+
2879
+ .rollOut {
2880
+ -webkit-animation-name: rollOut;
2881
+ animation-name: rollOut;
2882
+ }
2883
+
2884
+ @-webkit-keyframes zoomIn {
2885
+ 0% {
2886
+ opacity: 0;
2887
+ -webkit-transform: scale(.3);
2888
+ transform: scale(.3);
2889
+ }
2890
+
2891
+ 50% {
2892
+ opacity: 1;
2893
+ }
2894
+ }
2895
+
2896
+ @keyframes zoomIn {
2897
+ 0% {
2898
+ opacity: 0;
2899
+ -webkit-transform: scale(.3);
2900
+ -ms-transform: scale(.3);
2901
+ transform: scale(.3);
2902
+ }
2903
+
2904
+ 50% {
2905
+ opacity: 1;
2906
+ }
2907
+ }
2908
+
2909
+ .zoomIn {
2910
+ -webkit-animation-name: zoomIn;
2911
+ animation-name: zoomIn;
2912
+ }
2913
+
2914
+ @-webkit-keyframes zoomInDown {
2915
+ 0% {
2916
+ opacity: 0;
2917
+ -webkit-transform: scale(.1) translateY(-2000px);
2918
+ transform: scale(.1) translateY(-2000px);
2919
+ -webkit-animation-timing-function: ease-in-out;
2920
+ animation-timing-function: ease-in-out;
2921
+ }
2922
+
2923
+ 60% {
2924
+ opacity: 1;
2925
+ -webkit-transform: scale(.475) translateY(60px);
2926
+ transform: scale(.475) translateY(60px);
2927
+ -webkit-animation-timing-function: ease-out;
2928
+ animation-timing-function: ease-out;
2929
+ }
2930
+ }
2931
+
2932
+ @keyframes zoomInDown {
2933
+ 0% {
2934
+ opacity: 0;
2935
+ -webkit-transform: scale(.1) translateY(-2000px);
2936
+ -ms-transform: scale(.1) translateY(-2000px);
2937
+ transform: scale(.1) translateY(-2000px);
2938
+ -webkit-animation-timing-function: ease-in-out;
2939
+ animation-timing-function: ease-in-out;
2940
+ }
2941
+
2942
+ 60% {
2943
+ opacity: 1;
2944
+ -webkit-transform: scale(.475) translateY(60px);
2945
+ -ms-transform: scale(.475) translateY(60px);
2946
+ transform: scale(.475) translateY(60px);
2947
+ -webkit-animation-timing-function: ease-out;
2948
+ animation-timing-function: ease-out;
2949
+ }
2950
+ }
2951
+
2952
+ .zoomInDown {
2953
+ -webkit-animation-name: zoomInDown;
2954
+ animation-name: zoomInDown;
2955
+ }
2956
+
2957
+ @-webkit-keyframes zoomInLeft {
2958
+ 0% {
2959
+ opacity: 0;
2960
+ -webkit-transform: scale(.1) translateX(-2000px);
2961
+ transform: scale(.1) translateX(-2000px);
2962
+ -webkit-animation-timing-function: ease-in-out;
2963
+ animation-timing-function: ease-in-out;
2964
+ }
2965
+
2966
+ 60% {
2967
+ opacity: 1;
2968
+ -webkit-transform: scale(.475) translateX(48px);
2969
+ transform: scale(.475) translateX(48px);
2970
+ -webkit-animation-timing-function: ease-out;
2971
+ animation-timing-function: ease-out;
2972
+ }
2973
+ }
2974
+
2975
+ @keyframes zoomInLeft {
2976
+ 0% {
2977
+ opacity: 0;
2978
+ -webkit-transform: scale(.1) translateX(-2000px);
2979
+ -ms-transform: scale(.1) translateX(-2000px);
2980
+ transform: scale(.1) translateX(-2000px);
2981
+ -webkit-animation-timing-function: ease-in-out;
2982
+ animation-timing-function: ease-in-out;
2983
+ }
2984
+
2985
+ 60% {
2986
+ opacity: 1;
2987
+ -webkit-transform: scale(.475) translateX(48px);
2988
+ -ms-transform: scale(.475) translateX(48px);
2989
+ transform: scale(.475) translateX(48px);
2990
+ -webkit-animation-timing-function: ease-out;
2991
+ animation-timing-function: ease-out;
2992
+ }
2993
+ }
2994
+
2995
+ .zoomInLeft {
2996
+ -webkit-animation-name: zoomInLeft;
2997
+ animation-name: zoomInLeft;
2998
+ }
2999
+
3000
+ @-webkit-keyframes zoomInRight {
3001
+ 0% {
3002
+ opacity: 0;
3003
+ -webkit-transform: scale(.1) translateX(2000px);
3004
+ transform: scale(.1) translateX(2000px);
3005
+ -webkit-animation-timing-function: ease-in-out;
3006
+ animation-timing-function: ease-in-out;
3007
+ }
3008
+
3009
+ 60% {
3010
+ opacity: 1;
3011
+ -webkit-transform: scale(.475) translateX(-48px);
3012
+ transform: scale(.475) translateX(-48px);
3013
+ -webkit-animation-timing-function: ease-out;
3014
+ animation-timing-function: ease-out;
3015
+ }
3016
+ }
3017
+
3018
+ @keyframes zoomInRight {
3019
+ 0% {
3020
+ opacity: 0;
3021
+ -webkit-transform: scale(.1) translateX(2000px);
3022
+ -ms-transform: scale(.1) translateX(2000px);
3023
+ transform: scale(.1) translateX(2000px);
3024
+ -webkit-animation-timing-function: ease-in-out;
3025
+ animation-timing-function: ease-in-out;
3026
+ }
3027
+
3028
+ 60% {
3029
+ opacity: 1;
3030
+ -webkit-transform: scale(.475) translateX(-48px);
3031
+ -ms-transform: scale(.475) translateX(-48px);
3032
+ transform: scale(.475) translateX(-48px);
3033
+ -webkit-animation-timing-function: ease-out;
3034
+ animation-timing-function: ease-out;
3035
+ }
3036
+ }
3037
+
3038
+ .zoomInRight {
3039
+ -webkit-animation-name: zoomInRight;
3040
+ animation-name: zoomInRight;
3041
+ }
3042
+
3043
+ @-webkit-keyframes zoomInUp {
3044
+ 0% {
3045
+ opacity: 0;
3046
+ -webkit-transform: scale(.1) translateY(2000px);
3047
+ transform: scale(.1) translateY(2000px);
3048
+ -webkit-animation-timing-function: ease-in-out;
3049
+ animation-timing-function: ease-in-out;
3050
+ }
3051
+
3052
+ 60% {
3053
+ opacity: 1;
3054
+ -webkit-transform: scale(.475) translateY(-60px);
3055
+ transform: scale(.475) translateY(-60px);
3056
+ -webkit-animation-timing-function: ease-out;
3057
+ animation-timing-function: ease-out;
3058
+ }
3059
+ }
3060
+
3061
+ @keyframes zoomInUp {
3062
+ 0% {
3063
+ opacity: 0;
3064
+ -webkit-transform: scale(.1) translateY(2000px);
3065
+ -ms-transform: scale(.1) translateY(2000px);
3066
+ transform: scale(.1) translateY(2000px);
3067
+ -webkit-animation-timing-function: ease-in-out;
3068
+ animation-timing-function: ease-in-out;
3069
+ }
3070
+
3071
+ 60% {
3072
+ opacity: 1;
3073
+ -webkit-transform: scale(.475) translateY(-60px);
3074
+ -ms-transform: scale(.475) translateY(-60px);
3075
+ transform: scale(.475) translateY(-60px);
3076
+ -webkit-animation-timing-function: ease-out;
3077
+ animation-timing-function: ease-out;
3078
+ }
3079
+ }
3080
+
3081
+ .zoomInUp {
3082
+ -webkit-animation-name: zoomInUp;
3083
+ animation-name: zoomInUp;
3084
+ }
3085
+
3086
+ @-webkit-keyframes zoomOut {
3087
+ 0% {
3088
+ opacity: 1;
3089
+ -webkit-transform: scale(1);
3090
+ transform: scale(1);
3091
+ }
3092
+
3093
+ 50% {
3094
+ opacity: 0;
3095
+ -webkit-transform: scale(.3);
3096
+ transform: scale(.3);
3097
+ }
3098
+
3099
+ 100% {
3100
+ opacity: 0;
3101
+ }
3102
+ }
3103
+
3104
+ @keyframes zoomOut {
3105
+ 0% {
3106
+ opacity: 1;
3107
+ -webkit-transform: scale(1);
3108
+ -ms-transform: scale(1);
3109
+ transform: scale(1);
3110
+ }
3111
+
3112
+ 50% {
3113
+ opacity: 0;
3114
+ -webkit-transform: scale(.3);
3115
+ -ms-transform: scale(.3);
3116
+ transform: scale(.3);
3117
+ }
3118
+
3119
+ 100% {
3120
+ opacity: 0;
3121
+ }
3122
+ }
3123
+
3124
+ .zoomOut {
3125
+ -webkit-animation-name: zoomOut;
3126
+ animation-name: zoomOut;
3127
+ }
3128
+
3129
+ @-webkit-keyframes zoomOutDown {
3130
+ 40% {
3131
+ opacity: 1;
3132
+ -webkit-transform: scale(.475) translateY(-60px);
3133
+ transform: scale(.475) translateY(-60px);
3134
+ -webkit-animation-timing-function: linear;
3135
+ animation-timing-function: linear;
3136
+ }
3137
+
3138
+ 100% {
3139
+ opacity: 0;
3140
+ -webkit-transform: scale(.1) translateY(2000px);
3141
+ transform: scale(.1) translateY(2000px);
3142
+ -webkit-transform-origin: center bottom;
3143
+ transform-origin: center bottom;
3144
+ }
3145
+ }
3146
+
3147
+ @keyframes zoomOutDown {
3148
+ 40% {
3149
+ opacity: 1;
3150
+ -webkit-transform: scale(.475) translateY(-60px);
3151
+ -ms-transform: scale(.475) translateY(-60px);
3152
+ transform: scale(.475) translateY(-60px);
3153
+ -webkit-animation-timing-function: linear;
3154
+ animation-timing-function: linear;
3155
+ }
3156
+
3157
+ 100% {
3158
+ opacity: 0;
3159
+ -webkit-transform: scale(.1) translateY(2000px);
3160
+ -ms-transform: scale(.1) translateY(2000px);
3161
+ transform: scale(.1) translateY(2000px);
3162
+ -webkit-transform-origin: center bottom;
3163
+ -ms-transform-origin: center bottom;
3164
+ transform-origin: center bottom;
3165
+ }
3166
+ }
3167
+
3168
+ .zoomOutDown {
3169
+ -webkit-animation-name: zoomOutDown;
3170
+ animation-name: zoomOutDown;
3171
+ }
3172
+
3173
+ @-webkit-keyframes zoomOutLeft {
3174
+ 40% {
3175
+ opacity: 1;
3176
+ -webkit-transform: scale(.475) translateX(42px);
3177
+ transform: scale(.475) translateX(42px);
3178
+ -webkit-animation-timing-function: linear;
3179
+ animation-timing-function: linear;
3180
+ }
3181
+
3182
+ 100% {
3183
+ opacity: 0;
3184
+ -webkit-transform: scale(.1) translateX(-2000px);
3185
+ transform: scale(.1) translateX(-2000px);
3186
+ -webkit-transform-origin: left center;
3187
+ transform-origin: left center;
3188
+ }
3189
+ }
3190
+
3191
+ @keyframes zoomOutLeft {
3192
+ 40% {
3193
+ opacity: 1;
3194
+ -webkit-transform: scale(.475) translateX(42px);
3195
+ -ms-transform: scale(.475) translateX(42px);
3196
+ transform: scale(.475) translateX(42px);
3197
+ -webkit-animation-timing-function: linear;
3198
+ animation-timing-function: linear;
3199
+ }
3200
+
3201
+ 100% {
3202
+ opacity: 0;
3203
+ -webkit-transform: scale(.1) translateX(-2000px);
3204
+ -ms-transform: scale(.1) translateX(-2000px);
3205
+ transform: scale(.1) translateX(-2000px);
3206
+ -webkit-transform-origin: left center;
3207
+ -ms-transform-origin: left center;
3208
+ transform-origin: left center;
3209
+ }
3210
+ }
3211
+
3212
+ .zoomOutLeft {
3213
+ -webkit-animation-name: zoomOutLeft;
3214
+ animation-name: zoomOutLeft;
3215
+ }
3216
+
3217
+ @-webkit-keyframes zoomOutRight {
3218
+ 40% {
3219
+ opacity: 1;
3220
+ -webkit-transform: scale(.475) translateX(-42px);
3221
+ transform: scale(.475) translateX(-42px);
3222
+ -webkit-animation-timing-function: linear;
3223
+ animation-timing-function: linear;
3224
+ }
3225
+
3226
+ 100% {
3227
+ opacity: 0;
3228
+ -webkit-transform: scale(.1) translateX(2000px);
3229
+ transform: scale(.1) translateX(2000px);
3230
+ -webkit-transform-origin: right center;
3231
+ transform-origin: right center;
3232
+ }
3233
+ }
3234
+
3235
+ @keyframes zoomOutRight {
3236
+ 40% {
3237
+ opacity: 1;
3238
+ -webkit-transform: scale(.475) translateX(-42px);
3239
+ -ms-transform: scale(.475) translateX(-42px);
3240
+ transform: scale(.475) translateX(-42px);
3241
+ -webkit-animation-timing-function: linear;
3242
+ animation-timing-function: linear;
3243
+ }
3244
+
3245
+ 100% {
3246
+ opacity: 0;
3247
+ -webkit-transform: scale(.1) translateX(2000px);
3248
+ -ms-transform: scale(.1) translateX(2000px);
3249
+ transform: scale(.1) translateX(2000px);
3250
+ -webkit-transform-origin: right center;
3251
+ -ms-transform-origin: right center;
3252
+ transform-origin: right center;
3253
+ }
3254
+ }
3255
+
3256
+ .zoomOutRight {
3257
+ -webkit-animation-name: zoomOutRight;
3258
+ animation-name: zoomOutRight;
3259
+ }
3260
+
3261
+ @-webkit-keyframes zoomOutUp {
3262
+ 40% {
3263
+ opacity: 1;
3264
+ -webkit-transform: scale(.475) translateY(60px);
3265
+ transform: scale(.475) translateY(60px);
3266
+ -webkit-animation-timing-function: linear;
3267
+ animation-timing-function: linear;
3268
+ }
3269
+
3270
+ 100% {
3271
+ opacity: 0;
3272
+ -webkit-transform: scale(.1) translateY(-2000px);
3273
+ transform: scale(.1) translateY(-2000px);
3274
+ -webkit-transform-origin: center top;
3275
+ transform-origin: center top;
3276
+ }
3277
+ }
3278
+
3279
+ @keyframes zoomOutUp {
3280
+ 40% {
3281
+ opacity: 1;
3282
+ -webkit-transform: scale(.475) translateY(60px);
3283
+ -ms-transform: scale(.475) translateY(60px);
3284
+ transform: scale(.475) translateY(60px);
3285
+ -webkit-animation-timing-function: linear;
3286
+ animation-timing-function: linear;
3287
+ }
3288
+
3289
+ 100% {
3290
+ opacity: 0;
3291
+ -webkit-transform: scale(.1) translateY(-2000px);
3292
+ -ms-transform: scale(.1) translateY(-2000px);
3293
+ transform: scale(.1) translateY(-2000px);
3294
+ -webkit-transform-origin: center top;
3295
+ -ms-transform-origin: center top;
3296
+ transform-origin: center top;
3297
+ }
3298
+ }
3299
+
3300
+ .zoomOutUp {
3301
+ -webkit-animation-name: zoomOutUp;
3302
+ animation-name: zoomOutUp;
3303
+ }
css/fonts/yks-mc-font.eot ADDED
Binary file
css/fonts/yks-mc-font.svg ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
3
+ <svg xmlns="http://www.w3.org/2000/svg">
4
+ <metadata>Generated by IcoMoon</metadata>
5
+ <defs>
6
+ <font id="yks-mc-font" horiz-adv-x="512">
7
+ <font-face units-per-em="512" ascent="480" descent="-32" />
8
+ <missing-glyph horiz-adv-x="512" />
9
+ <glyph unicode="&#x20;" d="" horiz-adv-x="256" />
10
+ <glyph unicode="&#xe600;" d="M0 265.739v-214.261h136.348l0.279-32.556c0.279-18.087 0.279-35.618 0.279-38.957-0.279-3.618 0.279-6.4 0.835-6.4 0.556 0 19.756 17.531 42.296 38.957l40.905 38.957h207.582v428.522h-428.522v-214.261zM258.226 359.791c1.948-1.948 3.339-5.008 3.339-6.957 0-3.618-66.782-165.287-74.017-179.478-6.4-12.243-23.374-9.183-23.374 4.174 0 4.731 36.174 94.052 64.556 160 10.018 23.096 11.965 25.6 18.643 25.6 4.174 0 8.905-1.392 10.852-3.339zM144.696 331.409c0-18.365-0.556-20.87-5.565-22.539-3.061-0.835-16.974-7.792-30.887-15.026l-25.322-13.635 30.887-16.139 30.887-16.417v-20.313c0-11.408-1.113-20.035-2.226-19.479-1.113 0.557-25.6 13.356-54.261 28.382l-52.035 27.826v32.279l13.356 7.235c57.044 31.165 88.765 47.861 91.826 48.139 2.226 0.279 3.339-5.565 3.339-20.313zM336.418 324.174l50.365-26.435v-34.505l-35.339-18.644c-19.757-10.296-43.409-22.817-52.87-28.105l-17.531-9.461v41.739l22.261 11.687c12.8 6.678 21.426 12.8 20.313 14.469-0.835 1.67-0.279 1.948 1.392 0.835 1.67-1.113 6.4-0.279 10.017 1.67 6.678 3.618 5.844 4.174-23.652 18.921l-30.331 15.305v20.313c0 11.409 1.113 20.035 2.505 19.478 1.392-0.279 25.043-12.8 52.87-27.269z" horiz-adv-x="429" />
11
+ <glyph unicode="&#xe601;" d="M248 432c-119.296 0-216-96.704-216-216s96.704-216 216-216 216 96.704 216 216-96.704 216-216 216zM248 48c-92.784 0-168 75.216-168 168s75.216 168 168 168 168-75.216 168-168-75.216-168-168-168zM248 320c-13.248 0-24-10.736-24-24v-80.992c0-13.248 10.752-24 24-24s24 10.752 24 24v80.992c0 13.264-10.752 24-24 24zM248 160c-13.248 0-24-10.752-24-24s10.752-24 24-24 24 10.752 24 24-10.752 24-24 24z" />
12
+ <glyph unicode="&#xe602;" d="M478.464 167.142l-44.211 39.424c-12.8 11.418-12.8 30.054 0 41.472l44.211 39.398c12.8 11.417 9.37 22.041-7.603 23.654l-58.599 5.555c-16.973 1.613-26.112 16.205-20.275 32.435l31.104 86.579c5.837 16.231-1.305 22.144-15.846 13.133l-69.145-42.752c-14.541-9.011-33.331-4.096-41.754 10.931l-25.063 44.697c-8.397 15.027-22.323 15.104-30.899 0.179l-23.27-40.499c-8.576-14.925-28.288-21.299-43.802-14.157l-40.96 18.816c-15.539 7.117-27.469-1.127-26.547-18.381l2.227-41.344c0.921-17.229-11.802-34.995-28.263-39.424l-39.552-10.624c-16.461-4.454-19.482-17.408-6.681-28.825l44.211-39.399c12.8-11.392 12.8-30.055 0-41.447l-44.211-39.373c-12.8-11.443-9.421-22.451 7.501-24.499l53.632-6.502c16.922-2.099 26.368-17.203 20.966-33.562l-27.52-83.405c-5.401-16.409 2.304-22.81 17.101-14.208l63.053 36.454c14.822 8.601 34.714 3.84 44.237-10.445l26.189-39.347c9.498-14.361 23.808-13.543 31.719 1.741l23.014 44.339c7.962 15.309 26.957 21.555 42.214 13.901l44.391-22.195c15.309-7.654 27.059 0.205 26.137 17.459l-2.227 41.344c-0.921 17.255 11.801 34.995 28.262 39.45l39.526 10.599c16.512 4.48 19.533 17.433 6.733 28.825zM281.6 119.808h-51.2v53.76h51.2v-53.76zM281.6 201.702h-51.2v133.12h51.2v-133.12z" />
13
+ </font></defs></svg>
css/fonts/yks-mc-font.ttf ADDED
Binary file
css/fonts/yks-mc-font.woff ADDED
Binary file
css/jquery-ui-1.10.4.smoothness.css CHANGED
@@ -4,4 +4,1175 @@
4
  * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
5
  * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */
6
 
7
- .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin-top:2px;padding:.5em .5em .5em .7em;min-height:0}.ui-accordion .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-noicons{padding-left:.7em}.ui-accordion .ui-accordion-icons .ui-accordion-icons{padding-left:2.2em}.ui-accordion .ui-accordion-header .ui-accordion-header-icon{position:absolute;left:.5em;top:50%;margin-top:-8px}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-button{display:inline-block;position:relative;padding:0;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2.2em}button.ui-button-icon-only{width:2.4em}.ui-button-icons-only{width:3.4em}button.ui-button-icons-only{width:3.7em}.ui-button .ui-button-text{display:block;line-height:normal}.ui-button-text-only .ui-button-text{padding:.4em 1em}.ui-button-icon-only .ui-button-text,.ui-button-icons-only .ui-button-text{padding:.4em;text-indent:-9999999px}.ui-button-text-icon-primary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 1em .4em 2.1em}.ui-button-text-icon-secondary .ui-button-text,.ui-button-text-icons .ui-button-text{padding:.4em 2.1em .4em 1em}.ui-button-text-icons .ui-button-text{padding-left:2.1em;padding-right:2.1em}input.ui-button{padding:.4em 1em}.ui-button-icon-only .ui-icon,.ui-button-text-icon-primary .ui-icon,.ui-button-text-icon-secondary .ui-icon,.ui-button-text-icons .ui-icon,.ui-button-icons-only .ui-icon{position:absolute;top:50%;margin-top:-8px}.ui-button-icon-only .ui-icon{left:50%;margin-left:-8px}.ui-button-text-icon-primary .ui-button-icon-primary,.ui-button-text-icons .ui-button-icon-primary,.ui-button-icons-only .ui-button-icon-primary{left:.5em}.ui-button-text-icon-secondary .ui-button-icon-secondary,.ui-button-text-icons .ui-button-icon-secondary,.ui-button-icons-only .ui-button-icon-secondary{right:.5em}.ui-buttonset{margin-right:7px}.ui-buttonset .ui-button{margin-left:0;margin-right:-.3em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:49%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-dialog{overflow:hidden;position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-se{width:12px;height:12px;right:-5px;bottom:-5px;background-position:16px 16px}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-menu{list-style:none;padding:2px;margin:0;display:block;outline:none}.ui-menu .ui-menu{margin-top:-3px;position:absolute}.ui-menu .ui-menu-item{margin:0;padding:0;width:100%;list-style-image:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}.ui-menu .ui-menu-divider{margin:5px -2px 5px -2px;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-menu-item a{text-decoration:none;display:block;padding:2px .4em;line-height:1.5;min-height:0;font-weight:normal}.ui-menu .ui-menu-item a.ui-state-focus,.ui-menu .ui-menu-item a.ui-state-active{font-weight:normal;margin:-1px}.ui-menu .ui-state-disabled{font-weight:normal;margin:.4em 0 .2em;line-height:1.5}.ui-menu .ui-state-disabled a{cursor:default}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item a{position:relative;padding-left:2em}.ui-menu .ui-icon{position:absolute;top:.2em;left:.2em}.ui-menu .ui-menu-icon{position:static;float:right}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("images/animated-overlay.gif");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:22px}.ui-spinner-button{width:16px;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top:none;border-bottom:none;border-right:none}.ui-spinner .ui-icon{position:absolute;margin-top:-8px;top:50%;left:0}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-spinner .ui-icon-triangle-1-s{background-position:-65px -16px}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-widget-header .ui-icon{background-image:url(images/ui-icons_222222_256x240.png)}.ui-state-default .ui-icon{background-image:url(images/ui-icons_888888_256x240.png)}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-active .ui-icon{background-image:url(images/ui-icons_454545_256x240.png)}.ui-state-highlight .ui-icon{background-image:url(images/ui-icons_2e83ff_256x240.png)}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url(images/ui-icons_cd0a0a_256x240.png)}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
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);
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-top: 2px;
94
+ padding: .5em .5em .5em .7em;
95
+ min-height: 0; /* support: IE7 */
96
+ }
97
+ .ui-accordion .ui-accordion-icons {
98
+ padding-left: 2.2em;
99
+ }
100
+ .ui-accordion .ui-accordion-noicons {
101
+ padding-left: .7em;
102
+ }
103
+ .ui-accordion .ui-accordion-icons .ui-accordion-icons {
104
+ padding-left: 2.2em;
105
+ }
106
+ .ui-accordion .ui-accordion-header .ui-accordion-header-icon {
107
+ position: absolute;
108
+ left: .5em;
109
+ top: 50%;
110
+ margin-top: -8px;
111
+ }
112
+ .ui-accordion .ui-accordion-content {
113
+ padding: 1em 2.2em;
114
+ border-top: 0;
115
+ overflow: auto;
116
+ }
117
+ .ui-autocomplete {
118
+ position: absolute;
119
+ top: 0;
120
+ left: 0;
121
+ cursor: default;
122
+ }
123
+ .ui-button {
124
+ display: inline-block;
125
+ position: relative;
126
+ padding: 0;
127
+ line-height: normal;
128
+ margin-right: .1em;
129
+ cursor: pointer;
130
+ vertical-align: middle;
131
+ text-align: center;
132
+ overflow: visible; /* removes extra width in IE */
133
+ }
134
+ .ui-button,
135
+ .ui-button:link,
136
+ .ui-button:visited,
137
+ .ui-button:hover,
138
+ .ui-button:active {
139
+ text-decoration: none;
140
+ }
141
+ /* to make room for the icon, a width needs to be set here */
142
+ .ui-button-icon-only {
143
+ width: 2.2em;
144
+ }
145
+ /* button elements seem to need a little more width */
146
+ button.ui-button-icon-only {
147
+ width: 2.4em;
148
+ }
149
+ .ui-button-icons-only {
150
+ width: 3.4em;
151
+ }
152
+ button.ui-button-icons-only {
153
+ width: 3.7em;
154
+ }
155
+
156
+ /* button text element */
157
+ .ui-button .ui-button-text {
158
+ display: block;
159
+ line-height: normal;
160
+ }
161
+ .ui-button-text-only .ui-button-text {
162
+ padding: .4em 1em;
163
+ }
164
+ .ui-button-icon-only .ui-button-text,
165
+ .ui-button-icons-only .ui-button-text {
166
+ padding: .4em;
167
+ text-indent: -9999999px;
168
+ }
169
+ .ui-button-text-icon-primary .ui-button-text,
170
+ .ui-button-text-icons .ui-button-text {
171
+ padding: .4em 1em .4em 2.1em;
172
+ }
173
+ .ui-button-text-icon-secondary .ui-button-text,
174
+ .ui-button-text-icons .ui-button-text {
175
+ padding: .4em 2.1em .4em 1em;
176
+ }
177
+ .ui-button-text-icons .ui-button-text {
178
+ padding-left: 2.1em;
179
+ padding-right: 2.1em;
180
+ }
181
+ /* no icon support for input elements, provide padding by default */
182
+ input.ui-button {
183
+ padding: .4em 1em;
184
+ }
185
+
186
+ /* button icon element(s) */
187
+ .ui-button-icon-only .ui-icon,
188
+ .ui-button-text-icon-primary .ui-icon,
189
+ .ui-button-text-icon-secondary .ui-icon,
190
+ .ui-button-text-icons .ui-icon,
191
+ .ui-button-icons-only .ui-icon {
192
+ position: absolute;
193
+ top: 50%;
194
+ margin-top: -8px;
195
+ }
196
+ .ui-button-icon-only .ui-icon {
197
+ left: 50%;
198
+ margin-left: -8px;
199
+ }
200
+ .ui-button-text-icon-primary .ui-button-icon-primary,
201
+ .ui-button-text-icons .ui-button-icon-primary,
202
+ .ui-button-icons-only .ui-button-icon-primary {
203
+ left: .5em;
204
+ }
205
+ .ui-button-text-icon-secondary .ui-button-icon-secondary,
206
+ .ui-button-text-icons .ui-button-icon-secondary,
207
+ .ui-button-icons-only .ui-button-icon-secondary {
208
+ right: .5em;
209
+ }
210
+
211
+ /* button sets */
212
+ .ui-buttonset {
213
+ margin-right: 7px;
214
+ }
215
+ .ui-buttonset .ui-button {
216
+ margin-left: 0;
217
+ margin-right: -.3em;
218
+ }
219
+
220
+ /* workarounds */
221
+ /* reset extra padding in Firefox, see h5bp.com/l */
222
+ input.ui-button::-moz-focus-inner,
223
+ button.ui-button::-moz-focus-inner {
224
+ border: 0;
225
+ padding: 0;
226
+ }
227
+ .ui-datepicker {
228
+ width: 17em;
229
+ padding: .2em .2em 0;
230
+ display: none;
231
+ }
232
+ .ui-datepicker .ui-datepicker-header {
233
+ position: relative;
234
+ padding: .2em 0;
235
+ }
236
+ .ui-datepicker .ui-datepicker-prev,
237
+ .ui-datepicker .ui-datepicker-next {
238
+ position: absolute;
239
+ top: 2px;
240
+ width: 1.8em;
241
+ height: 1.8em;
242
+ }
243
+ .ui-datepicker .ui-datepicker-prev-hover,
244
+ .ui-datepicker .ui-datepicker-next-hover {
245
+ top: 1px;
246
+ }
247
+ .ui-datepicker .ui-datepicker-prev {
248
+ left: 2px;
249
+ }
250
+ .ui-datepicker .ui-datepicker-next {
251
+ right: 2px;
252
+ }
253
+ .ui-datepicker .ui-datepicker-prev-hover {
254
+ left: 1px;
255
+ }
256
+ .ui-datepicker .ui-datepicker-next-hover {
257
+ right: 1px;
258
+ }
259
+ .ui-datepicker .ui-datepicker-prev span,
260
+ .ui-datepicker .ui-datepicker-next span {
261
+ display: block;
262
+ position: absolute;
263
+ left: 50%;
264
+ margin-left: -8px;
265
+ top: 50%;
266
+ margin-top: -8px;
267
+ }
268
+ .ui-datepicker .ui-datepicker-title {
269
+ margin: 0 2.3em;
270
+ line-height: 1.8em;
271
+ text-align: center;
272
+ }
273
+ .ui-datepicker .ui-datepicker-title select {
274
+ font-size: 1em;
275
+ margin: 1px 0;
276
+ }
277
+ .ui-datepicker select.ui-datepicker-month,
278
+ .ui-datepicker select.ui-datepicker-year {
279
+ width: 49%;
280
+ }
281
+ .ui-datepicker table {
282
+ width: 100%;
283
+ font-size: .9em;
284
+ border-collapse: collapse;
285
+ margin: 0 0 .4em;
286
+ }
287
+ .ui-datepicker th {
288
+ padding: .7em .3em;
289
+ text-align: center;
290
+ font-weight: bold;
291
+ border: 0;
292
+ }
293
+ .ui-datepicker td {
294
+ border: 0;
295
+ padding: 1px;
296
+ }
297
+ .ui-datepicker td span,
298
+ .ui-datepicker td a {
299
+ display: block;
300
+ padding: .2em;
301
+ text-align: right;
302
+ text-decoration: none;
303
+ }
304
+ .ui-datepicker .ui-datepicker-buttonpane {
305
+ background-image: none;
306
+ margin: .7em 0 0 0;
307
+ padding: 0 .2em;
308
+ border-left: 0;
309
+ border-right: 0;
310
+ border-bottom: 0;
311
+ }
312
+ .ui-datepicker .ui-datepicker-buttonpane button {
313
+ float: right;
314
+ margin: .5em .2em .4em;
315
+ cursor: pointer;
316
+ padding: .2em .6em .3em .6em;
317
+ width: auto;
318
+ overflow: visible;
319
+ }
320
+ .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
321
+ float: left;
322
+ }
323
+
324
+ /* with multiple calendars */
325
+ .ui-datepicker.ui-datepicker-multi {
326
+ width: auto;
327
+ }
328
+ .ui-datepicker-multi .ui-datepicker-group {
329
+ float: left;
330
+ }
331
+ .ui-datepicker-multi .ui-datepicker-group table {
332
+ width: 95%;
333
+ margin: 0 auto .4em;
334
+ }
335
+ .ui-datepicker-multi-2 .ui-datepicker-group {
336
+ width: 50%;
337
+ }
338
+ .ui-datepicker-multi-3 .ui-datepicker-group {
339
+ width: 33.3%;
340
+ }
341
+ .ui-datepicker-multi-4 .ui-datepicker-group {
342
+ width: 25%;
343
+ }
344
+ .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
345
+ .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
346
+ border-left-width: 0;
347
+ }
348
+ .ui-datepicker-multi .ui-datepicker-buttonpane {
349
+ clear: left;
350
+ }
351
+ .ui-datepicker-row-break {
352
+ clear: both;
353
+ width: 100%;
354
+ font-size: 0;
355
+ }
356
+
357
+ /* RTL support */
358
+ .ui-datepicker-rtl {
359
+ direction: rtl;
360
+ }
361
+ .ui-datepicker-rtl .ui-datepicker-prev {
362
+ right: 2px;
363
+ left: auto;
364
+ }
365
+ .ui-datepicker-rtl .ui-datepicker-next {
366
+ left: 2px;
367
+ right: auto;
368
+ }
369
+ .ui-datepicker-rtl .ui-datepicker-prev:hover {
370
+ right: 1px;
371
+ left: auto;
372
+ }
373
+ .ui-datepicker-rtl .ui-datepicker-next:hover {
374
+ left: 1px;
375
+ right: auto;
376
+ }
377
+ .ui-datepicker-rtl .ui-datepicker-buttonpane {
378
+ clear: right;
379
+ }
380
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button {
381
+ float: left;
382
+ }
383
+ .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
384
+ .ui-datepicker-rtl .ui-datepicker-group {
385
+ float: right;
386
+ }
387
+ .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
388
+ .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
389
+ border-right-width: 0;
390
+ border-left-width: 1px;
391
+ }
392
+ .ui-dialog {
393
+ overflow: hidden;
394
+ position: absolute;
395
+ top: 0;
396
+ left: 0;
397
+ padding: .2em;
398
+ outline: 0;
399
+ }
400
+ .ui-dialog .ui-dialog-titlebar {
401
+ padding: .4em 1em;
402
+ position: relative;
403
+ }
404
+ .ui-dialog .ui-dialog-title {
405
+ float: left;
406
+ margin: .1em 0;
407
+ white-space: nowrap;
408
+ width: 90%;
409
+ overflow: hidden;
410
+ text-overflow: ellipsis;
411
+ }
412
+ .ui-dialog .ui-dialog-titlebar-close {
413
+ position: absolute;
414
+ right: .3em;
415
+ top: 50%;
416
+ width: 20px;
417
+ margin: -10px 0 0 0;
418
+ padding: 1px;
419
+ height: 20px;
420
+ }
421
+ .ui-dialog .ui-dialog-content {
422
+ position: relative;
423
+ border: 0;
424
+ padding: .5em 1em;
425
+ background: none;
426
+ overflow: auto;
427
+ }
428
+ .ui-dialog .ui-dialog-buttonpane {
429
+ text-align: left;
430
+ border-width: 1px 0 0 0;
431
+ background-image: none;
432
+ margin-top: .5em;
433
+ padding: .3em 1em .5em .4em;
434
+ }
435
+ .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
436
+ float: right;
437
+ }
438
+ .ui-dialog .ui-dialog-buttonpane button {
439
+ margin: .5em .4em .5em 0;
440
+ cursor: pointer;
441
+ }
442
+ .ui-dialog .ui-resizable-se {
443
+ width: 12px;
444
+ height: 12px;
445
+ right: -5px;
446
+ bottom: -5px;
447
+ background-position: 16px 16px;
448
+ }
449
+ .ui-draggable .ui-dialog-titlebar {
450
+ cursor: move;
451
+ }
452
+ .ui-menu {
453
+ list-style: none;
454
+ padding: 2px;
455
+ margin: 0;
456
+ display: block;
457
+ outline: none;
458
+ }
459
+ .ui-menu .ui-menu {
460
+ margin-top: -3px;
461
+ position: absolute;
462
+ }
463
+ .ui-menu .ui-menu-item {
464
+ margin: 0;
465
+ padding: 0;
466
+ width: 100%;
467
+ /* support: IE10, see #8844 */
468
+ list-style-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7);
469
+ }
470
+ .ui-menu .ui-menu-divider {
471
+ margin: 5px -2px 5px -2px;
472
+ height: 0;
473
+ font-size: 0;
474
+ line-height: 0;
475
+ border-width: 1px 0 0 0;
476
+ }
477
+ .ui-menu .ui-menu-item a {
478
+ text-decoration: none;
479
+ display: block;
480
+ padding: 2px .4em;
481
+ line-height: 1.5;
482
+ min-height: 0; /* support: IE7 */
483
+ font-weight: normal;
484
+ }
485
+ .ui-menu .ui-menu-item a.ui-state-focus,
486
+ .ui-menu .ui-menu-item a.ui-state-active {
487
+ font-weight: normal;
488
+ margin: -1px;
489
+ }
490
+
491
+ .ui-menu .ui-state-disabled {
492
+ font-weight: normal;
493
+ margin: .4em 0 .2em;
494
+ line-height: 1.5;
495
+ }
496
+ .ui-menu .ui-state-disabled a {
497
+ cursor: default;
498
+ }
499
+
500
+ /* icon support */
501
+ .ui-menu-icons {
502
+ position: relative;
503
+ }
504
+ .ui-menu-icons .ui-menu-item a {
505
+ position: relative;
506
+ padding-left: 2em;
507
+ }
508
+
509
+ /* left-aligned */
510
+ .ui-menu .ui-icon {
511
+ position: absolute;
512
+ top: .2em;
513
+ left: .2em;
514
+ }
515
+
516
+ /* right-aligned */
517
+ .ui-menu .ui-menu-icon {
518
+ position: static;
519
+ float: right;
520
+ }
521
+ .ui-progressbar {
522
+ height: 2em;
523
+ text-align: left;
524
+ overflow: hidden;
525
+ }
526
+ .ui-progressbar .ui-progressbar-value {
527
+ margin: -1px;
528
+ height: 100%;
529
+ }
530
+ .ui-progressbar .ui-progressbar-overlay {
531
+ background: url("images/animated-overlay.gif");
532
+ height: 100%;
533
+ filter: alpha(opacity=25);
534
+ opacity: 0.25;
535
+ }
536
+ .ui-progressbar-indeterminate .ui-progressbar-value {
537
+ background-image: none;
538
+ }
539
+ .ui-resizable {
540
+ position: relative;
541
+ }
542
+ .ui-resizable-handle {
543
+ position: absolute;
544
+ font-size: 0.1px;
545
+ display: block;
546
+ }
547
+ .ui-resizable-disabled .ui-resizable-handle,
548
+ .ui-resizable-autohide .ui-resizable-handle {
549
+ display: none;
550
+ }
551
+ .ui-resizable-n {
552
+ cursor: n-resize;
553
+ height: 7px;
554
+ width: 100%;
555
+ top: -5px;
556
+ left: 0;
557
+ }
558
+ .ui-resizable-s {
559
+ cursor: s-resize;
560
+ height: 7px;
561
+ width: 100%;
562
+ bottom: -5px;
563
+ left: 0;
564
+ }
565
+ .ui-resizable-e {
566
+ cursor: e-resize;
567
+ width: 7px;
568
+ right: -5px;
569
+ top: 0;
570
+ height: 100%;
571
+ }
572
+ .ui-resizable-w {
573
+ cursor: w-resize;
574
+ width: 7px;
575
+ left: -5px;
576
+ top: 0;
577
+ height: 100%;
578
+ }
579
+ .ui-resizable-se {
580
+ cursor: se-resize;
581
+ width: 12px;
582
+ height: 12px;
583
+ right: 1px;
584
+ bottom: 1px;
585
+ }
586
+ .ui-resizable-sw {
587
+ cursor: sw-resize;
588
+ width: 9px;
589
+ height: 9px;
590
+ left: -5px;
591
+ bottom: -5px;
592
+ }
593
+ .ui-resizable-nw {
594
+ cursor: nw-resize;
595
+ width: 9px;
596
+ height: 9px;
597
+ left: -5px;
598
+ top: -5px;
599
+ }
600
+ .ui-resizable-ne {
601
+ cursor: ne-resize;
602
+ width: 9px;
603
+ height: 9px;
604
+ right: -5px;
605
+ top: -5px;
606
+ }
607
+ .ui-selectable-helper {
608
+ position: absolute;
609
+ z-index: 100;
610
+ border: 1px dotted black;
611
+ }
612
+ .ui-slider {
613
+ position: relative;
614
+ text-align: left;
615
+ }
616
+ .ui-slider .ui-slider-handle {
617
+ position: absolute;
618
+ z-index: 2;
619
+ width: 1.2em;
620
+ height: 1.2em;
621
+ cursor: default;
622
+ }
623
+ .ui-slider .ui-slider-range {
624
+ position: absolute;
625
+ z-index: 1;
626
+ font-size: .7em;
627
+ display: block;
628
+ border: 0;
629
+ background-position: 0 0;
630
+ }
631
+
632
+ /* For IE8 - See #6727 */
633
+ .ui-slider.ui-state-disabled .ui-slider-handle,
634
+ .ui-slider.ui-state-disabled .ui-slider-range {
635
+ filter: inherit;
636
+ }
637
+
638
+ .ui-slider-horizontal {
639
+ height: .8em;
640
+ }
641
+ .ui-slider-horizontal .ui-slider-handle {
642
+ top: -.3em;
643
+ margin-left: -.6em;
644
+ }
645
+ .ui-slider-horizontal .ui-slider-range {
646
+ top: 0;
647
+ height: 100%;
648
+ }
649
+ .ui-slider-horizontal .ui-slider-range-min {
650
+ left: 0;
651
+ }
652
+ .ui-slider-horizontal .ui-slider-range-max {
653
+ right: 0;
654
+ }
655
+
656
+ .ui-slider-vertical {
657
+ width: .8em;
658
+ height: 100px;
659
+ }
660
+ .ui-slider-vertical .ui-slider-handle {
661
+ left: -.3em;
662
+ margin-left: 0;
663
+ margin-bottom: -.6em;
664
+ }
665
+ .ui-slider-vertical .ui-slider-range {
666
+ left: 0;
667
+ width: 100%;
668
+ }
669
+ .ui-slider-vertical .ui-slider-range-min {
670
+ bottom: 0;
671
+ }
672
+ .ui-slider-vertical .ui-slider-range-max {
673
+ top: 0;
674
+ }
675
+ .ui-spinner {
676
+ position: relative;
677
+ display: inline-block;
678
+ overflow: hidden;
679
+ padding: 0;
680
+ vertical-align: middle;
681
+ }
682
+ .ui-spinner-input {
683
+ border: none;
684
+ background: none;
685
+ color: inherit;
686
+ padding: 0;
687
+ margin: .2em 0;
688
+ vertical-align: middle;
689
+ margin-left: .4em;
690
+ margin-right: 22px;
691
+ }
692
+ .ui-spinner-button {
693
+ width: 16px;
694
+ height: 50%;
695
+ font-size: .5em;
696
+ padding: 0;
697
+ margin: 0;
698
+ text-align: center;
699
+ position: absolute;
700
+ cursor: default;
701
+ display: block;
702
+ overflow: hidden;
703
+ right: 0;
704
+ }
705
+ /* more specificity required here to override default borders */
706
+ .ui-spinner a.ui-spinner-button {
707
+ border-top: none;
708
+ border-bottom: none;
709
+ border-right: none;
710
+ }
711
+ /* vertically center icon */
712
+ .ui-spinner .ui-icon {
713
+ position: absolute;
714
+ margin-top: -8px;
715
+ top: 50%;
716
+ left: 0;
717
+ }
718
+ .ui-spinner-up {
719
+ top: 0;
720
+ }
721
+ .ui-spinner-down {
722
+ bottom: 0;
723
+ }
724
+
725
+ /* TR overrides */
726
+ .ui-spinner .ui-icon-triangle-1-s {
727
+ /* need to fix icons sprite */
728
+ background-position: -65px -16px;
729
+ }
730
+ .ui-tabs {
731
+ position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
732
+ padding: .2em;
733
+ }
734
+ .ui-tabs .ui-tabs-nav {
735
+ margin: 0;
736
+ padding: .2em .2em 0;
737
+ }
738
+ .ui-tabs .ui-tabs-nav li {
739
+ list-style: none;
740
+ float: left;
741
+ position: relative;
742
+ top: 0;
743
+ margin: 1px .2em 0 0;
744
+ border-bottom-width: 0;
745
+ padding: 0;
746
+ white-space: nowrap;
747
+ }
748
+ .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
749
+ float: left;
750
+ padding: .5em 1em;
751
+ text-decoration: none;
752
+ }
753
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active {
754
+ margin-bottom: -1px;
755
+ padding-bottom: 1px;
756
+ }
757
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
758
+ .ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
759
+ .ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
760
+ cursor: text;
761
+ }
762
+ .ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
763
+ cursor: pointer;
764
+ }
765
+ .ui-tabs .ui-tabs-panel {
766
+ display: block;
767
+ border-width: 0;
768
+ padding: 1em 1.4em;
769
+ background: none;
770
+ }
771
+ .ui-tooltip {
772
+ padding: 8px;
773
+ position: absolute;
774
+ z-index: 9999;
775
+ max-width: 300px;
776
+ -webkit-box-shadow: 0 0 5px #aaa;
777
+ box-shadow: 0 0 5px #aaa;
778
+ }
779
+ body .ui-tooltip {
780
+ border-width: 2px;
781
+ }
782
+
783
+ /* Component containers
784
+ ----------------------------------*/
785
+ .ui-widget {
786
+ font-family: Verdana,Arial,sans-serif;
787
+ font-size: 1.1em;
788
+ }
789
+ .ui-widget .ui-widget {
790
+ font-size: 1em;
791
+ }
792
+ .ui-widget input,
793
+ .ui-widget select,
794
+ .ui-widget textarea,
795
+ .ui-widget button {
796
+ font-family: Verdana,Arial,sans-serif;
797
+ font-size: 1em;
798
+ }
799
+ .ui-widget-content {
800
+ border: 1px solid #aaaaaa;
801
+ background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x;
802
+ color: #222222;
803
+ }
804
+ .ui-widget-content a {
805
+ color: #222222;
806
+ }
807
+ .ui-widget-header {
808
+ border: 1px solid #aaaaaa;
809
+ background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x;
810
+ color: #222222;
811
+ font-weight: bold;
812
+ }
813
+ .ui-widget-header a {
814
+ color: #222222;
815
+ }
816
+
817
+ /* Interaction states
818
+ ----------------------------------*/
819
+ .ui-state-default,
820
+ .ui-widget-content .ui-state-default,
821
+ .ui-widget-header .ui-state-default {
822
+ border: 1px solid #d3d3d3;
823
+ background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x;
824
+ font-weight: normal;
825
+ color: #555555;
826
+ }
827
+ .ui-state-default a,
828
+ .ui-state-default a:link,
829
+ .ui-state-default a:visited {
830
+ color: #555555;
831
+ text-decoration: none;
832
+ }
833
+ .ui-state-hover,
834
+ .ui-widget-content .ui-state-hover,
835
+ .ui-widget-header .ui-state-hover,
836
+ .ui-state-focus,
837
+ .ui-widget-content .ui-state-focus,
838
+ .ui-widget-header .ui-state-focus {
839
+ border: 1px solid #999999;
840
+ background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x;
841
+ font-weight: normal;
842
+ color: #212121;
843
+ }
844
+ .ui-state-hover a,
845
+ .ui-state-hover a:hover,
846
+ .ui-state-hover a:link,
847
+ .ui-state-hover a:visited,
848
+ .ui-state-focus a,
849
+ .ui-state-focus a:hover,
850
+ .ui-state-focus a:link,
851
+ .ui-state-focus a:visited {
852
+ color: #212121;
853
+ text-decoration: none;
854
+ }
855
+ .ui-state-active,
856
+ .ui-widget-content .ui-state-active,
857
+ .ui-widget-header .ui-state-active {
858
+ border: 1px solid #aaaaaa;
859
+ background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x;
860
+ font-weight: normal;
861
+ color: #212121;
862
+ }
863
+ .ui-state-active a,
864
+ .ui-state-active a:link,
865
+ .ui-state-active a:visited {
866
+ color: #212121;
867
+ text-decoration: none;
868
+ }
869
+
870
+ /* Interaction Cues
871
+ ----------------------------------*/
872
+ .ui-state-highlight,
873
+ .ui-widget-content .ui-state-highlight,
874
+ .ui-widget-header .ui-state-highlight {
875
+ border: 1px solid #fcefa1;
876
+ background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x;
877
+ color: #363636;
878
+ }
879
+ .ui-state-highlight a,
880
+ .ui-widget-content .ui-state-highlight a,
881
+ .ui-widget-header .ui-state-highlight a {
882
+ color: #363636;
883
+ }
884
+ .ui-state-error,
885
+ .ui-widget-content .ui-state-error,
886
+ .ui-widget-header .ui-state-error {
887
+ border: 1px solid #cd0a0a;
888
+ background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x;
889
+ color: #cd0a0a;
890
+ }
891
+ .ui-state-error a,
892
+ .ui-widget-content .ui-state-error a,
893
+ .ui-widget-header .ui-state-error a {
894
+ color: #cd0a0a;
895
+ }
896
+ .ui-state-error-text,
897
+ .ui-widget-content .ui-state-error-text,
898
+ .ui-widget-header .ui-state-error-text {
899
+ color: #cd0a0a;
900
+ }
901
+ .ui-priority-primary,
902
+ .ui-widget-content .ui-priority-primary,
903
+ .ui-widget-header .ui-priority-primary {
904
+ font-weight: bold;
905
+ }
906
+ .ui-priority-secondary,
907
+ .ui-widget-content .ui-priority-secondary,
908
+ .ui-widget-header .ui-priority-secondary {
909
+ opacity: .7;
910
+ filter:Alpha(Opacity=70);
911
+ font-weight: normal;
912
+ }
913
+ .ui-state-disabled,
914
+ .ui-widget-content .ui-state-disabled,
915
+ .ui-widget-header .ui-state-disabled {
916
+ opacity: .35;
917
+ filter:Alpha(Opacity=35);
918
+ background-image: none;
919
+ }
920
+ .ui-state-disabled .ui-icon {
921
+ filter:Alpha(Opacity=35); /* For IE8 - See #6059 */
922
+ }
923
+
924
+ /* Icons
925
+ ----------------------------------*/
926
+
927
+ /* states and images */
928
+ .ui-icon {
929
+ width: 16px;
930
+ height: 16px;
931
+ }
932
+ .ui-icon,
933
+ .ui-widget-content .ui-icon {
934
+ background-image: url(images/ui-icons_222222_256x240.png);
935
+ }
936
+ .ui-widget-header .ui-icon {
937
+ background-image: url(images/ui-icons_222222_256x240.png);
938
+ }
939
+ .ui-state-default .ui-icon {
940
+ background-image: url(images/ui-icons_888888_256x240.png);
941
+ }
942
+ .ui-state-hover .ui-icon,
943
+ .ui-state-focus .ui-icon {
944
+ background-image: url(images/ui-icons_454545_256x240.png);
945
+ }
946
+ .ui-state-active .ui-icon {
947
+ background-image: url(images/ui-icons_454545_256x240.png);
948
+ }
949
+ .ui-state-highlight .ui-icon {
950
+ background-image: url(images/ui-icons_2e83ff_256x240.png);
951
+ }
952
+ .ui-state-error .ui-icon,
953
+ .ui-state-error-text .ui-icon {
954
+ background-image: url(images/ui-icons_cd0a0a_256x240.png);
955
+ }
956
+
957
+ /* positioning */
958
+ .ui-icon-blank { background-position: 16px 16px; }
959
+ .ui-icon-carat-1-n { background-position: 0 0; }
960
+ .ui-icon-carat-1-ne { background-position: -16px 0; }
961
+ .ui-icon-carat-1-e { background-position: -32px 0; }
962
+ .ui-icon-carat-1-se { background-position: -48px 0; }
963
+ .ui-icon-carat-1-s { background-position: -64px 0; }
964
+ .ui-icon-carat-1-sw { background-position: -80px 0; }
965
+ .ui-icon-carat-1-w { background-position: -96px 0; }
966
+ .ui-icon-carat-1-nw { background-position: -112px 0; }
967
+ .ui-icon-carat-2-n-s { background-position: -128px 0; }
968
+ .ui-icon-carat-2-e-w { background-position: -144px 0; }
969
+ .ui-icon-triangle-1-n { background-position: 0 -16px; }
970
+ .ui-icon-triangle-1-ne { background-position: -16px -16px; }
971
+ .ui-icon-triangle-1-e { background-position: -32px -16px; }
972
+ .ui-icon-triangle-1-se { background-position: -48px -16px; }
973
+ .ui-icon-triangle-1-s { background-position: -64px -16px; }
974
+ .ui-icon-triangle-1-sw { background-position: -80px -16px; }
975
+ .ui-icon-triangle-1-w { background-position: -96px -16px; }
976
+ .ui-icon-triangle-1-nw { background-position: -112px -16px; }
977
+ .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
978
+ .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
979
+ .ui-icon-arrow-1-n { background-position: 0 -32px; }
980
+ .ui-icon-arrow-1-ne { background-position: -16px -32px; }
981
+ .ui-icon-arrow-1-e { background-position: -32px -32px; }
982
+ .ui-icon-arrow-1-se { background-position: -48px -32px; }
983
+ .ui-icon-arrow-1-s { background-position: -64px -32px; }
984
+ .ui-icon-arrow-1-sw { background-position: -80px -32px; }
985
+ .ui-icon-arrow-1-w { background-position: -96px -32px; }
986
+ .ui-icon-arrow-1-nw { background-position: -112px -32px; }
987
+ .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
988
+ .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
989
+ .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
990
+ .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
991
+ .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
992
+ .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
993
+ .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
994
+ .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
995
+ .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
996
+ .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
997
+ .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
998
+ .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
999
+ .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
1000
+ .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
1001
+ .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
1002
+ .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
1003
+ .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
1004
+ .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
1005
+ .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
1006
+ .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
1007
+ .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
1008
+ .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
1009
+ .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
1010
+ .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
1011
+ .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
1012
+ .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
1013
+ .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
1014
+ .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
1015
+ .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
1016
+ .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
1017
+ .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
1018
+ .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
1019
+ .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
1020
+ .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
1021
+ .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
1022
+ .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
1023
+ .ui-icon-arrow-4 { background-position: 0 -80px; }
1024
+ .ui-icon-arrow-4-diag { background-position: -16px -80px; }
1025
+ .ui-icon-extlink { background-position: -32px -80px; }
1026
+ .ui-icon-newwin { background-position: -48px -80px; }
1027
+ .ui-icon-refresh { background-position: -64px -80px; }
1028
+ .ui-icon-shuffle { background-position: -80px -80px; }
1029
+ .ui-icon-transfer-e-w { background-position: -96px -80px; }
1030
+ .ui-icon-transferthick-e-w { background-position: -112px -80px; }
1031
+ .ui-icon-folder-collapsed { background-position: 0 -96px; }
1032
+ .ui-icon-folder-open { background-position: -16px -96px; }
1033
+ .ui-icon-document { background-position: -32px -96px; }
1034
+ .ui-icon-document-b { background-position: -48px -96px; }
1035
+ .ui-icon-note { background-position: -64px -96px; }
1036
+ .ui-icon-mail-closed { background-position: -80px -96px; }
1037
+ .ui-icon-mail-open { background-position: -96px -96px; }
1038
+ .ui-icon-suitcase { background-position: -112px -96px; }
1039
+ .ui-icon-comment { background-position: -128px -96px; }
1040
+ .ui-icon-person { background-position: -144px -96px; }
1041
+ .ui-icon-print { background-position: -160px -96px; }
1042
+ .ui-icon-trash { background-position: -176px -96px; }
1043
+ .ui-icon-locked { background-position: -192px -96px; }
1044
+ .ui-icon-unlocked { background-position: -208px -96px; }
1045
+ .ui-icon-bookmark { background-position: -224px -96px; }
1046
+ .ui-icon-tag { background-position: -240px -96px; }
1047
+ .ui-icon-home { background-position: 0 -112px; }
1048
+ .ui-icon-flag { background-position: -16px -112px; }
1049
+ .ui-icon-calendar { background-position: -32px -112px; }
1050
+ .ui-icon-cart { background-position: -48px -112px; }
1051
+ .ui-icon-pencil { background-position: -64px -112px; }
1052
+ .ui-icon-clock { background-position: -80px -112px; }
1053
+ .ui-icon-disk { background-position: -96px -112px; }
1054
+ .ui-icon-calculator { background-position: -112px -112px; }
1055
+ .ui-icon-zoomin { background-position: -128px -112px; }
1056
+ .ui-icon-zoomout { background-position: -144px -112px; }
1057
+ .ui-icon-search { background-position: -160px -112px; }
1058
+ .ui-icon-wrench { background-position: -176px -112px; }
1059
+ .ui-icon-gear { background-position: -192px -112px; }
1060
+ .ui-icon-heart { background-position: -208px -112px; }
1061
+ .ui-icon-star { background-position: -224px -112px; }
1062
+ .ui-icon-link { background-position: -240px -112px; }
1063
+ .ui-icon-cancel { background-position: 0 -128px; }
1064
+ .ui-icon-plus { background-position: -16px -128px; }
1065
+ .ui-icon-plusthick { background-position: -32px -128px; }
1066
+ .ui-icon-minus { background-position: -48px -128px; }
1067
+ .ui-icon-minusthick { background-position: -64px -128px; }
1068
+ .ui-icon-close { background-position: -80px -128px; }
1069
+ .ui-icon-closethick { background-position: -96px -128px; }
1070
+ .ui-icon-key { background-position: -112px -128px; }
1071
+ .ui-icon-lightbulb { background-position: -128px -128px; }
1072
+ .ui-icon-scissors { background-position: -144px -128px; }
1073
+ .ui-icon-clipboard { background-position: -160px -128px; }
1074
+ .ui-icon-copy { background-position: -176px -128px; }
1075
+ .ui-icon-contact { background-position: -192px -128px; }
1076
+ .ui-icon-image { background-position: -208px -128px; }
1077
+ .ui-icon-video { background-position: -224px -128px; }
1078
+ .ui-icon-script { background-position: -240px -128px; }
1079
+ .ui-icon-alert { background-position: 0 -144px; }
1080
+ .ui-icon-info { background-position: -16px -144px; }
1081
+ .ui-icon-notice { background-position: -32px -144px; }
1082
+ .ui-icon-help { background-position: -48px -144px; }
1083
+ .ui-icon-check { background-position: -64px -144px; }
1084
+ .ui-icon-bullet { background-position: -80px -144px; }
1085
+ .ui-icon-radio-on { background-position: -96px -144px; }
1086
+ .ui-icon-radio-off { background-position: -112px -144px; }
1087
+ .ui-icon-pin-w { background-position: -128px -144px; }
1088
+ .ui-icon-pin-s { background-position: -144px -144px; }
1089
+ .ui-icon-play { background-position: 0 -160px; }
1090
+ .ui-icon-pause { background-position: -16px -160px; }
1091
+ .ui-icon-seek-next { background-position: -32px -160px; }
1092
+ .ui-icon-seek-prev { background-position: -48px -160px; }
1093
+ .ui-icon-seek-end { background-position: -64px -160px; }
1094
+ .ui-icon-seek-start { background-position: -80px -160px; }
1095
+ /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
1096
+ .ui-icon-seek-first { background-position: -80px -160px; }
1097
+ .ui-icon-stop { background-position: -96px -160px; }
1098
+ .ui-icon-eject { background-position: -112px -160px; }
1099
+ .ui-icon-volume-off { background-position: -128px -160px; }
1100
+ .ui-icon-volume-on { background-position: -144px -160px; }
1101
+ .ui-icon-power { background-position: 0 -176px; }
1102
+ .ui-icon-signal-diag { background-position: -16px -176px; }
1103
+ .ui-icon-signal { background-position: -32px -176px; }
1104
+ .ui-icon-battery-0 { background-position: -48px -176px; }
1105
+ .ui-icon-battery-1 { background-position: -64px -176px; }
1106
+ .ui-icon-battery-2 { background-position: -80px -176px; }
1107
+ .ui-icon-battery-3 { background-position: -96px -176px; }
1108
+ .ui-icon-circle-plus { background-position: 0 -192px; }
1109
+ .ui-icon-circle-minus { background-position: -16px -192px; }
1110
+ .ui-icon-circle-close { background-position: -32px -192px; }
1111
+ .ui-icon-circle-triangle-e { background-position: -48px -192px; }
1112
+ .ui-icon-circle-triangle-s { background-position: -64px -192px; }
1113
+ .ui-icon-circle-triangle-w { background-position: -80px -192px; }
1114
+ .ui-icon-circle-triangle-n { background-position: -96px -192px; }
1115
+ .ui-icon-circle-arrow-e { background-position: -112px -192px; }
1116
+ .ui-icon-circle-arrow-s { background-position: -128px -192px; }
1117
+ .ui-icon-circle-arrow-w { background-position: -144px -192px; }
1118
+ .ui-icon-circle-arrow-n { background-position: -160px -192px; }
1119
+ .ui-icon-circle-zoomin { background-position: -176px -192px; }
1120
+ .ui-icon-circle-zoomout { background-position: -192px -192px; }
1121
+ .ui-icon-circle-check { background-position: -208px -192px; }
1122
+ .ui-icon-circlesmall-plus { background-position: 0 -208px; }
1123
+ .ui-icon-circlesmall-minus { background-position: -16px -208px; }
1124
+ .ui-icon-circlesmall-close { background-position: -32px -208px; }
1125
+ .ui-icon-squaresmall-plus { background-position: -48px -208px; }
1126
+ .ui-icon-squaresmall-minus { background-position: -64px -208px; }
1127
+ .ui-icon-squaresmall-close { background-position: -80px -208px; }
1128
+ .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
1129
+ .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
1130
+ .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
1131
+ .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
1132
+ .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
1133
+ .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
1134
+
1135
+
1136
+ /* Misc visuals
1137
+ ----------------------------------*/
1138
+
1139
+ /* Corner radius */
1140
+ .ui-corner-all,
1141
+ .ui-corner-top,
1142
+ .ui-corner-left,
1143
+ .ui-corner-tl {
1144
+ border-top-left-radius: 4px;
1145
+ }
1146
+ .ui-corner-all,
1147
+ .ui-corner-top,
1148
+ .ui-corner-right,
1149
+ .ui-corner-tr {
1150
+ border-top-right-radius: 4px;
1151
+ }
1152
+ .ui-corner-all,
1153
+ .ui-corner-bottom,
1154
+ .ui-corner-left,
1155
+ .ui-corner-bl {
1156
+ border-bottom-left-radius: 4px;
1157
+ }
1158
+ .ui-corner-all,
1159
+ .ui-corner-bottom,
1160
+ .ui-corner-right,
1161
+ .ui-corner-br {
1162
+ border-bottom-right-radius: 4px;
1163
+ }
1164
+
1165
+ /* Overlays */
1166
+ .ui-widget-overlay {
1167
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
1168
+ opacity: .3;
1169
+ filter: Alpha(Opacity=30);
1170
+ }
1171
+ .ui-widget-shadow {
1172
+ margin: -8px 0 0 -8px;
1173
+ padding: 8px;
1174
+ background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x;
1175
+ opacity: .3;
1176
+ filter: Alpha(Opacity=30);
1177
+ border-radius: 8px;
1178
+ }
css/jquery.dataTables.css ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * Table
3
+ */
4
+ table.dataTable {
5
+ margin: 0 auto;
6
+ clear: both;
7
+ width: 100%;
8
+ margin-bottom: .5em;
9
+ }
10
+
11
+ table.dataTable thead th {
12
+ padding: 3px 18px 3px 10px;
13
+ border-bottom: 1px solid lightgrey;
14
+ font-weight: bold;
15
+ cursor: pointer;
16
+ *cursor: hand;
17
+ }
18
+
19
+ table.dataTable tfoot th {
20
+ padding: 3px 18px 3px 10px;
21
+ border-top: 1px solid black;
22
+ font-weight: bold;
23
+ }
24
+
25
+ table.dataTable td {
26
+ padding: 3px 10px;
27
+ }
28
+
29
+ table.dataTable td.center,
30
+ table.dataTable td.dataTables_empty {
31
+ text-align: center;
32
+ }
33
+
34
+
35
+ /*
36
+ * Table wrapper
37
+ */
38
+ .dataTables_wrapper {
39
+ position: relative;
40
+ clear: both;
41
+ *zoom: 1;
42
+ }
43
+
44
+
45
+ /*
46
+ * Page length menu
47
+ */
48
+ .dataTables_length {
49
+ float: left;
50
+ margin-bottom: .75em;
51
+ }
52
+
53
+
54
+ /*
55
+ * Filter
56
+ */
57
+ .dataTables_filter {
58
+ float: right;
59
+ text-align: right;
60
+ }
61
+
62
+
63
+ /*
64
+ * Table information
65
+ */
66
+ .dataTables_info {
67
+ clear: both;
68
+ float: left;
69
+ }
70
+
71
+
72
+ /*
73
+ * Pagination
74
+ */
75
+ .dataTables_paginate {
76
+ float: right;
77
+ text-align: right;
78
+ }
79
+
80
+ /* Two button pagination - previous / next */
81
+ .paginate_disabled_previous,
82
+ .paginate_enabled_previous,
83
+ .paginate_disabled_next,
84
+ .paginate_enabled_next {
85
+ height: 19px;
86
+ float: left;
87
+ cursor: pointer;
88
+ *cursor: hand;
89
+ color: #111 !important;
90
+ }
91
+ .paginate_disabled_previous:hover,
92
+ .paginate_enabled_previous:hover,
93
+ .paginate_disabled_next:hover,
94
+ .paginate_enabled_next:hover {
95
+ text-decoration: none !important;
96
+ }
97
+ .paginate_disabled_previous:active,
98
+ .paginate_enabled_previous:active,
99
+ .paginate_disabled_next:active,
100
+ .paginate_enabled_next:active {
101
+ outline: none;
102
+ }
103
+
104
+ .paginate_disabled_previous,
105
+ .paginate_disabled_next {
106
+ color: #666 !important;
107
+ }
108
+ .paginate_disabled_previous,
109
+ .paginate_enabled_previous {
110
+ padding-left: 23px;
111
+ }
112
+ .paginate_disabled_next,
113
+ .paginate_enabled_next {
114
+ padding-right: 23px;
115
+ margin-left: 10px;
116
+ }
117
+
118
+ .paginate_enabled_previous { background: url('../images/pagination/back_enabled.png') no-repeat top left; }
119
+ .paginate_enabled_previous:hover { background: url('../images/pagination/back_enabled_hover.png') no-repeat top left; }
120
+ .paginate_disabled_previous { background: url('../images/pagination/back_disabled.png') no-repeat top left; }
121
+
122
+ .paginate_enabled_next { background: url('../images/pagination/forward_enabled.png') no-repeat top right; }
123
+ .paginate_enabled_next:hover { background: url('../images/pagination/forward_enabled_hover.png') no-repeat top right; }
124
+ .paginate_disabled_next { background: url('../images/pagination/forward_disabled.png') no-repeat top right; }
125
+
126
+ /* Full number pagination */
127
+ .paging_full_numbers {
128
+ height: 22px;
129
+ line-height: 22px;
130
+ }
131
+ .paging_full_numbers a:active {
132
+ outline: none
133
+ }
134
+ .paging_full_numbers a:hover {
135
+ text-decoration: none;
136
+ }
137
+
138
+ .paging_full_numbers a.paginate_button,
139
+ .paging_full_numbers a.paginate_active {
140
+ border: 1px solid #aaa;
141
+ -webkit-border-radius: 5px;
142
+ -moz-border-radius: 5px;
143
+ border-radius: 5px;
144
+ padding: 2px 5px;
145
+ margin: 0 3px;
146
+ cursor: pointer;
147
+ *cursor: hand;
148
+ color: #333 !important;
149
+ }
150
+
151
+ .paging_full_numbers a.paginate_button {
152
+ background-color: #ddd;
153
+ }
154
+
155
+ .paging_full_numbers a.paginate_button:hover {
156
+ background-color: #ccc;
157
+ text-decoration: none !important;
158
+ }
159
+
160
+ .paging_full_numbers a.paginate_active {
161
+ background-color: #99B3FF;
162
+ }
163
+
164
+
165
+ /*
166
+ * Processing indicator
167
+ */
168
+ .dataTables_processing {
169
+ position: absolute;
170
+ top: 50%;
171
+ left: 50%;
172
+ width: 250px;
173
+ height: 30px;
174
+ margin-left: -125px;
175
+ margin-top: -15px;
176
+ padding: 14px 0 2px 0;
177
+ border: 1px solid #ddd;
178
+ text-align: center;
179
+ color: #999;
180
+ font-size: 14px;
181
+ background-color: white;
182
+ }
183
+
184
+
185
+ /*
186
+ * Sorting
187
+ */
188
+ .sorting { background: url('../images/pagination/sort_both.png') no-repeat center right; }
189
+ .sorting_asc { background: url('../images/pagination/sort_asc.png') no-repeat center right; }
190
+ .sorting_desc { background: url('../images/pagination/sort_desc.png') no-repeat center right; }
191
+
192
+ .sorting_asc_disabled { background: url('../images/pagination/sort_asc_disabled.png') no-repeat center right; }
193
+ .sorting_desc_disabled { background: url('../images/pagination/sort_desc_disabled.png') no-repeat center right; }
194
+
195
+ table.dataTable thead th:active,
196
+ table.dataTable thead td:active {
197
+ outline: none;
198
+ }
199
+
200
+
201
+ /*
202
+ * Scrolling
203
+ */
204
+ .dataTables_scroll {
205
+ clear: both;
206
+ }
207
+
208
+ .dataTables_scrollBody {
209
+ *margin-top: -1px;
210
+ -webkit-overflow-scrolling: touch;
211
+ }
212
+
css/style.ykseme.css CHANGED
@@ -12,20 +12,298 @@
12
  .yks-margin-left {margin-left: 2em;}
13
 
14
 
15
- /* =========== Admin screens =========== */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
 
17
  /* general */
18
 
19
  #ykseme-icon {
20
  background: transparent url('../images/ykseme_32px_color.png') no-repeat 0 0;
 
 
 
 
 
 
21
  }
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  .yks-status {
24
  display: none;
25
  width: 100%;
26
  clear: both;
27
  }
 
28
  .yks-status .yks-success {
 
29
  color: #000;
30
  width: 80%;
31
  height: auto;
@@ -34,8 +312,19 @@
34
  clear: both;
35
  margin: 15px auto 15px auto;
36
  text-align: center;
 
 
 
 
 
 
 
 
 
37
  }
38
- .yks-status .yks-error {
 
 
39
  color: #000;
40
  width: 80%;
41
  height: auto;
@@ -44,6 +333,15 @@
44
  clear: both;
45
  margin: 15px auto 15px auto;
46
  text-align: center;
 
 
 
 
 
 
 
 
 
47
  }
48
  .yks-status .yks-error p, .yks-status .yks-success p {
49
  margin: .4em 0;
@@ -79,7 +377,7 @@
79
  .yks-status .yks-notice p {
80
  padding: 5px;
81
  }
82
-
83
  /* Plugin settings page*/
84
 
85
  .yks-admin-form {
@@ -95,6 +393,15 @@
95
  color: #666;
96
  }
97
 
 
 
 
 
 
 
 
 
 
98
 
99
  /* Configure Lists page*/
100
 
@@ -187,6 +494,78 @@
187
  font-weight: 600;
188
  }
189
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  /* About page */
191
 
192
  .yksme-page-about {
@@ -217,6 +596,7 @@
217
  .yks-mailchimp-fields-td {
218
  display: block;
219
  padding: 15px 0 15px 0;
 
220
  }
221
 
222
  .yks-mailchimp-fields-container label {
@@ -248,11 +628,15 @@
248
  .yks-mailchimpFormTableRow, .yks-mailchimpFormDivRow {
249
  width: 100%;
250
  }
 
 
 
 
251
  .yks-mailchimpFormTableRowLabel, .yks-mailchimpFormTableRowField,
252
  .yks-mailchimpFormDivRowLabel, .yks-mailchimpFormDivRowField {
253
  vertical-align: top !important;
254
  }
255
- .yks-mailchimpFormDivRowLabel, .yks-mailchimpFormDivRowField {
256
  display: inline-block;
257
  width: 50%;
258
  }
@@ -264,9 +648,9 @@
264
 
265
  .yks-mailchimp-form-tooltip {
266
  color: #CCC !important;
267
- font-size: 10px;
268
- margin: 0;
269
- padding: 0 0 0 10px;
270
  }
271
 
272
  #yks-mailchimp-debug-info, #yks-mailchimp-debug-info table,
@@ -298,4 +682,215 @@
298
  .yikes-api-key-error {
299
  display:none;
300
  color:red;
301
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  .yks-margin-left {margin-left: 2em;}
13
 
14
 
15
+ /*******************************************/
16
+ /**** Include Our Custom Web Font ****/
17
+ @font-face {
18
+ font-family: 'yks-mc-font';
19
+ src:url('fonts/yks-mc-font.eot?-e5ggdf');
20
+ src:url('fonts/yks-mc-font.eot?#iefix-e5ggdf') format('embedded-opentype'),
21
+ url('fonts/yks-mc-font.woff?-e5ggdf') format('woff'),
22
+ url('fonts/yks-mc-font.ttf?-e5ggdf') format('truetype'),
23
+ url('fonts/yks-mc-font.svg?-e5ggdf#yks-mc-font') format('svg');
24
+ font-weight: normal;
25
+ font-style: normal;
26
+ }
27
+
28
+ .yks_mc_error_x {
29
+ color:#DD3D36;
30
+ }
31
+
32
+ /* TinyMCE Button Class */
33
+ /* Icon Fonts */
34
+ .mce-i-yks-mc-icon-yikes-button-image:before {
35
+ content: "\e600" !important;
36
+ font-family: 'yks-mc-font' !important;
37
+ }
38
+
39
+ .toplevel_page_yks-mailchimp-form .update-nag {
40
+ padding-top:0;
41
+ margin-top:0;
42
+ width:95%;
43
+ }
44
+
45
+ .yks-mc-icon-notice {
46
+ display:block;
47
+ }
48
+
49
+ .update-nag .yks-mc-icon-notice:before {
50
+ content: "\e601" !important;
51
+ font-family: 'yks-mc-font' !important;
52
+ float:left;
53
+ font-size:1.5em;
54
+ color: #FFBA00;
55
+ display:block;
56
+ margin-right: .25em;
57
+ }
58
+
59
+ /* Reset Plugin Modal and Icons */
60
+ .yks-mc-icon-yks-mc-warning:before {
61
+ content: "\e602";
62
+ font-family: 'yks-mc-font' !important;
63
+ }
64
+
65
+ .yks-mc-reset-warning-icon {
66
+ font-size: 3.25em;
67
+ color: rgb(255, 76, 76);
68
+ text-align:center;
69
+ float:left;
70
+ margin-right:.25em;
71
+ margin-top:.75em;
72
+ }
73
+
74
+ .yks_mc_about_icon {
75
+ display:block;
76
+ float:left;
77
+ margin-top:2em;
78
+ }
79
+
80
+ .yks-mc-delete-form-warning-icon {
81
+ font-size: 3.25em;
82
+ color: rgb(255, 76, 76);
83
+ text-align:center;
84
+ float:left;
85
+ margin-right:.25em;
86
+ margin-top:.55em;
87
+ }
88
+
89
+ .yks-mc-success-icon {
90
+ font-size: 3.25em;
91
+ color: rgb(126, 207, 110);
92
+ text-align:center;
93
+ margin-top: .25em;
94
+ margin-right: .75em;
95
+ float:left;
96
+ }
97
+
98
+ .yks-mc-reset-plugin-settings-preloader {
99
+ width: 15px;
100
+ text-align:center;
101
+ display:block;
102
+ margin:0 auto;
103
+ }
104
+
105
+ .yks-mc-reset-plugin-settings-preloader-container {
106
+ width:100%;
107
+ text-align:center;
108
+ }
109
+
110
+ #yks_mc_reset_plugin_settings p {
111
+ float:left;
112
+ width:80%;
113
+ }
114
+
115
+ /* Widget Icon !! */
116
+ /* including an image in the widget box */
117
+ *[id*="_yikes_mc_widget"] > div.widget-top > div.widget-title > h4:before {
118
+ content: url('../images/yikes_logo_widget_icon.png');
119
+ width:33px;
120
+ float:left;
121
+ height:8px;
122
+ margin: -5px 8px 0 -5px;
123
+ }
124
+
125
+
126
+ /* Red Button Style */
127
+ .wp-core-ui .yikes-mc-button-red {
128
+ background-color: #9B2124;
129
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#C5292E), to(#9B2124));
130
+ background-image: -webkit-linear-gradient(top, #C5292E, #9B2124);
131
+ background-image: -moz-linear-gradient(top, #C5292E, #9B2124);
132
+ background-image: -ms-linear-gradient(top, #C5292E, #9B2124);
133
+ background-image: -o-linear-gradient(top, #C5292E, #9B2124);
134
+ background-image: linear-gradient(to bottom, #C5292E, #9B2124);
135
+ border-color: #9B2124;
136
+ border-bottom-color: #8D1F21;
137
+ -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);
138
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.5);
139
+ color: #fff;
140
+ text-decoration: none;
141
+ text-shadow: 0 1px 0 rgba(0,0,0,0.1);
142
+ margin-left: 2em;
143
+ width:150px;
144
+ text-align:center;
145
+ }
146
+
147
+ .wp-core-ui .yikes-mc-button-red.hover,
148
+ .wp-core-ui .yikes-mc-button-red:hover,
149
+ .wp-core-ui .yikes-mc-button-red.focus,
150
+ .wp-core-ui .yikes-mc-button-red:focus {
151
+ background-color: #B72629;
152
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#D22E30), to(#9B2124));
153
+ background-image: -webkit-linear-gradient(top, #D22E30, #9B2124);
154
+ background-image: -moz-linear-gradient(top, #D22E30, #9B2124);
155
+ background-image: -ms-linear-gradient(top, #D22E30, #9B2124);
156
+ background-image: -o-linear-gradient(top, #D22E30, #9B2124);
157
+ background-image: linear-gradient(to bottom, #D22E30, #9B2124);
158
+ border-color: #7F1C1F;
159
+ -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);
160
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.6);
161
+ color: #fff;
162
+ text-shadow: 0 -1px 0 rgba(0,0,0,0.3);
163
+ }
164
+
165
+ .wp-core-ui .yikes-mc-button-red.focus,
166
+ .wp-core-ui .yikes-mc-button-red:focus {
167
+ border-color: #500F0E;
168
+ -webkit-box-shadow: inset 0 1px 0 rgba(120,200,230,0.6), 1px 1px 2px rgba(0,0,0,0.4);
169
+ box-shadow: inset 0 1px 0 rgba(120,200,230,0.6), 1px 1px 2px rgba(0,0,0,0.4);
170
+ }
171
+
172
+ .wp-core-ui .yikes-mc-button-red.active,
173
+ .wp-core-ui .yikes-mc-button-red.active:hover,
174
+ .wp-core-ui .yikes-mc-button-red.active:focus,
175
+ .wp-core-ui .yikes-mc-button-red:active {
176
+ background: #7F1C1F;
177
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#9B2124), to(#B72629));
178
+ background-image: -webkit-linear-gradient(top, #9B2124, #B72629);
179
+ background-image: -moz-linear-gradient(top, #9B2124, #B72629);
180
+ background-image: -ms-linear-gradient(top, #9B2124, #B72629);
181
+ background-image: -o-linear-gradient(top, #9B2124, #B72629);
182
+ background-image: linear-gradient(to bottom, #9B2124, #B72629);
183
+ border-color: #601312 #AE2426 #AE2426 #AE2426;
184
+ color: rgba(255,255,255,0.95);
185
+ -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
186
+ box-shadow: inset 0 1px 0 rgba(0,0,0,0.1);
187
+ text-shadow: 0 1px 0 rgba(0,0,0,0.1);
188
+ }
189
+
190
+ .wp-core-ui .yikes-mc-button-red[disabled],
191
+ .wp-core-ui .yikes-mc-button-red:disabled,
192
+ .wp-core-ui .yikes-mc-button-red-disabled {
193
+ color: #E79496 !important;
194
+ background: #BA292B !important;
195
+ border-color: #7F1C1F !important;
196
+ -webkit-box-shadow: none !important;
197
+ box-shadow: none !important;
198
+ text-shadow: 0 -1px 0 rgba(0,0,0,0.1) !important;
199
+ cursor: default;
200
+ }
201
+
202
+
203
+ /********* User Profile Box And Fields *********/
204
+ #userInformation {
205
+ width:400px;
206
+ height:125px;
207
+ position:absolute;
208
+ right:0;
209
+ top:0;
210
+ margin-top:2em;
211
+ margin-right:2em;
212
+ /* border:1px dashed rgb(206, 206, 206); */
213
+ padding:10px;
214
+ font-size:1.8em;
215
+ }
216
+ #userInformation p, #userInformation span {
217
+ margin:0;
218
+ }
219
+
220
+ #userInformation span {
221
+ text-decoration:underline;
222
+ }
223
+
224
+ #yikes-mailchimp-avatar {
225
+ position:absolute;
226
+ top:0;
227
+ left:0;
228
+ margin-left:10px;
229
+ margin-top:1.8em;
230
+ width:100px;
231
+ }
232
+
233
+ .userProfileInformation {
234
+ margin-left:110px;
235
+ margin-top:5px;
236
+ }
237
+
238
+ .userProfileInformation p {
239
+ margin: 5px 0 5px 0 !important;
240
+ font-size:16px;
241
+ }
242
+
243
+
244
+ /* Widget Styles */
245
+ .yikes_widget_form_description, .yikes_mc_widget_selected_form_dropdown {
246
+ width:100%;
247
+ height:200px;
248
+ resize:none;
249
+ }
250
+
251
+ .widget_yikes_mc_widget p {
252
+ margin-bottom:10px;
253
+ }
254
+
255
+ .widget .yks_mc_interest_group_label {
256
+ text-align:center;
257
+ width:45%;
258
+ float:left;
259
+ word-break: break-word;
260
+ }
261
+
262
+ .widget_yikes_mc_widget input, .widget_yikes_mc_widget .yks-mailchimpFormDivRowField {
263
+ width:100%;
264
+ }
265
+ .yks-mailchimpFormDivRowField input {
266
+ width: 100%;
267
+ }
268
+
269
+ .widget_yikes_mc_widget .yks-require-description {
270
+ padding-top:0;
271
+ }
272
 
273
  /* general */
274
 
275
  #ykseme-icon {
276
  background: transparent url('../images/ykseme_32px_color.png') no-repeat 0 0;
277
+ display:block;
278
+ float:left;
279
+ padding: 0 0 0 .5em;
280
+ height: 35px;
281
+ width:35px;
282
+ background-size: contain;
283
  }
284
 
285
+ .wrap #ykseme-page-header {
286
+ padding-top:0;
287
+ margin-bottom:1.5em;
288
+ }
289
+
290
+ body.toplevel_page_yks-mailchimp-form .wrap {
291
+ margin-top:2em;
292
+ }
293
+
294
+ body.mailchimp-forms_page_yks-mailchimp-about-yikes #ykseme-page-header {
295
+ margin-top:1em;
296
+ }
297
+
298
+
299
  .yks-status {
300
  display: none;
301
  width: 100%;
302
  clear: both;
303
  }
304
+
305
  .yks-status .yks-success {
306
+ /*
307
  color: #000;
308
  width: 80%;
309
  height: auto;
312
  clear: both;
313
  margin: 15px auto 15px auto;
314
  text-align: center;
315
+ */
316
+ border-left: 4px solid #7ad03a;
317
+ padding: 5px 15px;
318
+ background-color:#fff;
319
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
320
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
321
+ min-height:25px;
322
+ line-height: 1.2;
323
+ margin-top:1em;
324
  }
325
+
326
+ .yks-status-error .yks-error {
327
+ /*
328
  color: #000;
329
  width: 80%;
330
  height: auto;
333
  clear: both;
334
  margin: 15px auto 15px auto;
335
  text-align: center;
336
+ */
337
+ border-left: 4px solid #dd3d36;
338
+ background-color: #fff;
339
+ padding: 1px 12px;
340
+ -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
341
+ box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
342
+ min-height:25px;
343
+ line-height: 3.2;
344
+ margin-top:1em;
345
  }
346
  .yks-status .yks-error p, .yks-status .yks-success p {
347
  margin: .4em 0;
377
  .yks-status .yks-notice p {
378
  padding: 5px;
379
  }
380
+
381
  /* Plugin settings page*/
382
 
383
  .yks-admin-form {
393
  color: #666;
394
  }
395
 
396
+ #single-optin-message, #double-optin-message {
397
+ height:150px;
398
+ width:600px;
399
+ resize:none;
400
+ }
401
+
402
+ .yks-mailchimp-interest-group-label {
403
+ width:350px;
404
+ }
405
 
406
  /* Configure Lists page*/
407
 
494
  font-weight: 600;
495
  }
496
 
497
+ .yks-mailchimp-redirect-checkbox-holder {
498
+ display:block;
499
+ margin-top:.5em;
500
+ }
501
+
502
+ /* Subscribers table */
503
+ .yks-mailchimp-subscribers-list-row {
504
+ height: 30px;
505
+ padding-top: 3px;
506
+ font-size:1.2em;
507
+ }
508
+
509
+ .yikes-mailchimp-subscribers-table-head {
510
+ border-bottom:1px solid grey;
511
+ font-size:1.3em;
512
+ }
513
+
514
+ .yks-mailchimp-subscribers-list-row:nth-child(even) {
515
+ background-color: #EEE;
516
+ }
517
+
518
+ .yks-mailchimp-subscribers-list-row:hover {
519
+ cursor:pointer;
520
+ background:rgba(208, 235, 241, 0.58);
521
+ }
522
+
523
+ .subscriber-mail-link {
524
+ text-decoration:none;
525
+ }
526
+
527
+ .displayListSubscribers {
528
+ font-size:10px;
529
+ }
530
+
531
+ .yks-view-subscriber-profile {
532
+ float:right;
533
+ margin-right:.35em;
534
+ margin-top:-.2em;
535
+ opacity:.5;
536
+ color:rgb(24, 138, 56) !important;
537
+ line-height:1.35;
538
+ }
539
+
540
+ .yks-view-subscriber-profile:hover {
541
+ opacity:1;
542
+ }
543
+
544
+ .yks-remove-subscriber {
545
+ float:right;
546
+ margin-right:.5em;
547
+ margin-top:-.2em;
548
+ opacity:.5;
549
+ color:rgb(223, 111, 111);
550
+ line-height:1.35;
551
+ }
552
+ .yks-remove-subscriber:hover {
553
+ opacity:1;
554
+ }
555
+
556
+ .yks-email-subscriber {
557
+ float:right;
558
+ margin-right:.25em;
559
+ margin-top:-.2em;
560
+ opacity:.5;
561
+ color:rgb(60, 143, 175) !important;
562
+ line-height:1.35;
563
+ }
564
+
565
+ .yks-email-subscriber:hover {
566
+ opacity:1;
567
+ }
568
+
569
  /* About page */
570
 
571
  .yksme-page-about {
596
  .yks-mailchimp-fields-td {
597
  display: block;
598
  padding: 15px 0 15px 0;
599
+ min-width:880px;
600
  }
601
 
602
  .yks-mailchimp-fields-container label {
628
  .yks-mailchimpFormTableRow, .yks-mailchimpFormDivRow {
629
  width: 100%;
630
  }
631
+ .yks-mailchimpFormDivRow {
632
+ margin: .5em 0 .5em 0;
633
+ }
634
+
635
  .yks-mailchimpFormTableRowLabel, .yks-mailchimpFormTableRowField,
636
  .yks-mailchimpFormDivRowLabel, .yks-mailchimpFormDivRowField {
637
  vertical-align: top !important;
638
  }
639
+ .yks-mailchimpFormDivRowLabel {
640
  display: inline-block;
641
  width: 50%;
642
  }
648
 
649
  .yks-mailchimp-form-tooltip {
650
  color: #CCC !important;
651
+ font-size: 12px;
652
+ display:block;
653
+ margin: 0 0 15px 0;
654
  }
655
 
656
  #yks-mailchimp-debug-info, #yks-mailchimp-debug-info table,
682
  .yikes-api-key-error {
683
  display:none;
684
  color:red;
685
+ }
686
+
687
+ /****** Interest Group Stypes ******/
688
+ .yks_mc_interest_group_text:first-child {
689
+ display:block;
690
+ margin-top:1em;
691
+ }
692
+
693
+ .yks_mc_interest_group_holder {
694
+ display:inline-block;
695
+ width:100%;
696
+ text-align:center;
697
+ margin-bottom:.5em;
698
+ }
699
+
700
+ /* Table Interest Group Styles */
701
+ td.yks_mc_table_dropdown_interest_group_holder, td.yks-mailchimpFormTableSubmit {
702
+ border-top:0;
703
+ }
704
+ .yks_table_label {
705
+ display:block;
706
+ margin:.75em 0;
707
+ }
708
+
709
+ .yks_mc_table_interest_group_holder {
710
+ width: 100%;
711
+ margin-bottom: 0;
712
+ display:block;
713
+ }
714
+ .yks_mc_table_dropdown_interest_group_holder {
715
+ display:block;
716
+ }
717
+
718
+ .yks_mc_interest_group_holder select {
719
+ width:100%;
720
+ }
721
+
722
+ .yikes_mc_interest_group_checkbox, .yks_mc_interest_group_label {
723
+ display:inline-block;
724
+ margin: 0 5px;
725
+ }
726
+
727
+ .widget .yks_mc_table_td:last-child {
728
+ border-top:0;
729
+ border-bottom:0;
730
+ }
731
+
732
+ .yikes_mc_interest_group_radio {
733
+ margin-right: .5em;
734
+ }
735
+
736
+ .content .yks_mc_interest_radio_button_holder, .content .yks_mc_table_td {
737
+ display:inline-block;
738
+ width:100%;
739
+ }
740
+
741
+ /*** Subscriber List Styles ***/
742
+ .yks-mc-subscriber-go-back {
743
+ font-size:12px;
744
+ font-weight:bold;
745
+ color: #333;
746
+ opacity: .5;
747
+ width:300px;
748
+ display:block;
749
+ text-align:left;
750
+ margin-top: 1em !important;
751
+ width: auto;
752
+ }
753
+ .yks-mc-subscriber-go-back:hover {
754
+ opacity: 1;
755
+ cursor:pointer;
756
+ }
757
+
758
+ .yks-mc-subscriber-overview {
759
+ display:block;
760
+ float: left;
761
+ width: 100%;
762
+ }
763
+
764
+ .dashicons-arrow-left-alt2:before {
765
+ display:inline-block;
766
+ margin-top:.15em;
767
+ }
768
+
769
+ .dashicons-star-filled {color:#FEBE12;}
770
+
771
+ .yks-mc-subscriber-star-rating {
772
+ margin-top: 0;
773
+ }
774
+
775
+ #yks-subscriber-info-email-address {
776
+ margin-bottom:.5em !important;
777
+ }
778
+
779
+ .yks-mc-overview-title {
780
+ font-size:16px;
781
+ color: #666;
782
+ opacity:.8;
783
+ margin-bottom:0 !important;
784
+ }
785
+
786
+ .yks-mc-overview-info-value {
787
+ font-size:14px;
788
+ color: #222222;
789
+ margin-top:0 !important;
790
+ }
791
+
792
+ .yks-mc-subscriber-firstName, .yks-mc-subscriber-lastName {
793
+ text-transform: capitalize;
794
+ }
795
+
796
+ .yks-subscriber-info-optin-data {
797
+ display:block;
798
+ margin-top:.5em;
799
+ }
800
+
801
+ .yks-mc-subscriber-bottom {
802
+ display:block;
803
+ float:left;
804
+ width:100%;
805
+ }
806
+
807
+ .yks-mc-subscriber-top {
808
+ margin-bottom: 1.5em;
809
+ }
810
+
811
+ .yks-mc-subscriber-header {
812
+ border-bottom:1px dashed grey;
813
+ padding-bottom:.5em;
814
+ }
815
+
816
+ .yks-mc-subscriber-left-container, .yks-mc-subscriber-right-container {
817
+ float:left;
818
+ width:50%;
819
+ }
820
+ label[for="yikes_mailchimp_comment_subscribe"] {
821
+ display:block;
822
+ margin: .5em 0 .5em 0;
823
+ }
824
+ label[for="yikes_mailchimp_comment_subscribe"]:hover {
825
+ cursor:pointer;
826
+ }
827
+
828
+ label[for="single-optin-message"], label[for="double-optin-message"] {
829
+ display:block;
830
+ width:55%;
831
+ }
832
+
833
+ #wp-double_optin_message-wrap, #wp-single_optin_message-wrap {
834
+ display:block;
835
+ margin-top:1.5em;
836
+ }
837
+
838
+ .yikes_widget_logo {
839
+ display:block;
840
+ margin:0 auto;
841
+ width: 80px;
842
+ }
843
+
844
+ .yikes_cURL_instructions_hidden, .yikes_phpinfo_container {
845
+ display:none;
846
+ }
847
+
848
+ .yikes_cURL_help_button {
849
+ margin-bottom: 1em !important;
850
+ }
851
+
852
+ .yks_mc_php_ini_file_location {
853
+ margin: .5em 0 .5em 0;
854
+ font-style:italic;
855
+ }
856
+
857
+ .yks_mc_no_phpini_alert {
858
+ color :#C93232;
859
+ font-weight:bold;
860
+ }
861
+
862
+ .yks_mc_no_phpini_success {
863
+ color :#29CA01;
864
+ font-weight:bold;
865
+ }
866
+
867
+
868
+ /** Date Picker Styles **/
869
+ .yks-mailchimpFormDatepickerContainer .ui-datepicker-prev, .yks-mailchimpFormDatepickerContainer .ui-datepicker-next {
870
+ margin-top:.5em;
871
+ }
872
+
873
+ /* Form Error Classes */
874
+ .yks_error_field_required {
875
+ border: 1px solid rgb(252, 182, 182) !important;
876
+ background: rgb(255, 213, 213) !important;
877
+ }
878
+
879
+ #yks_form_error_message {
880
+ padding:.75em;
881
+ font-size:12px;
882
+ float:left;
883
+ margin-bottom:1em;
884
+ display:none;
885
+ }
886
+ #yks_form_error_message ul {
887
+ list-style-type: square;
888
+ width: 100%;
889
+ float:left;
890
+ margin-top:.5em;
891
+ margin: 0.75em 0 1.25em 1.25em;
892
+ }
893
+ #yks_form_error_message ul li {
894
+ width: 33%;
895
+ float:left;
896
+ }
css/yks_easy_mc_wp_3point8.css ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Styles to make sure jquery ui modal
4
+ * is compatable with WordPress 3.8 and below
5
+ * - Even tho users should have updated by now!
6
+ **/
7
+
8
+ #yks_mc_reset_plugin_settings p {
9
+ width:77% !important;
10
+ }
11
+
12
+ #yks_mc_reset_plugin_settings .yks-mc-reset-plugin-settings-preloader {
13
+ margin-bottom:1em;
14
+ }
15
+
16
+ /* Dialog Styles */
17
+ /* Should always remain on top */
18
+ .ui-dialog {
19
+ z-index: 999999 !important
20
+ }
images/pagination/back_disabled.png ADDED
Binary file
images/pagination/back_enabled.png ADDED
Binary file
images/pagination/back_enabled_hover.png ADDED
Binary file
images/pagination/forward_disabled.png ADDED
Binary file
images/pagination/forward_enabled.png ADDED
Binary file
images/pagination/forward_enabled_hover.png ADDED
Binary file
images/pagination/sort_asc.png ADDED
Binary file
images/pagination/sort_asc_disabled.png ADDED
Binary file
images/pagination/sort_both.png ADDED
Binary file
images/pagination/sort_desc.png ADDED
Binary file
images/pagination/sort_desc_disabled.png ADDED
Binary file
images/preloader.gif ADDED
Binary file
images/smoothness/ui-bg_flat_0_aaaaaa_40x100.png CHANGED
File without changes
images/smoothness/ui-bg_flat_75_ffffff_40x100.png CHANGED
File without changes
images/smoothness/ui-bg_glass_55_fbf9ee_1x400.png CHANGED
File without changes
images/smoothness/ui-bg_glass_65_ffffff_1x400.png CHANGED
File without changes
images/smoothness/ui-bg_glass_75_dadada_1x400.png CHANGED
File without changes
images/smoothness/ui-bg_glass_75_e6e6e6_1x400.png CHANGED
File without changes
images/smoothness/ui-bg_glass_95_fef1ec_1x400.png CHANGED
File without changes
images/smoothness/ui-bg_highlight-soft_75_cccccc_1x100.png CHANGED
File without changes
images/smoothness/ui-icons_222222_256x240.png CHANGED
File without changes
images/smoothness/ui-icons_2e83ff_256x240.png CHANGED
File without changes
images/smoothness/ui-icons_454545_256x240.png CHANGED
File without changes
images/smoothness/ui-icons_888888_256x240.png CHANGED
File without changes
images/smoothness/ui-icons_cd0a0a_256x240.png CHANGED
File without changes
images/yikes_logo_widget_icon.png ADDED
Binary file
images/yks_mc_lets_get_started.png ADDED
Binary file
js/jQuery_1.11.0.min.js ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ /*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */
2
+ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="<div class='a'></div><div class='a i'></div>",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="<select t=''><option selected=''></option></select>",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=jb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=kb(b);function nb(){}nb.prototype=d.filters=d.pseudos,d.setFilters=new nb;function ob(a,b){var c,e,f,g,h,i,j,k=x[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?db.error(a):x(a,i).slice(0)}function pb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f
3
+ }}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=["Top","Right","Bottom","Left"],V=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)},W=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a>",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=$.test(e)?this.mouseHooks:Z.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new n.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||z),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||z,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==db()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===db()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=n.extend(new n.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?n.event.trigger(e,null,b):n.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=z.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===L&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&(a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault())?bb:cb):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={isDefaultPrevented:cb,isPropagationStopped:cb,isImmediatePropagationStopped:cb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=bb,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=bb,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submitBubbles||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?b.form:void 0;c&&!n._data(c,"submitBubbles")&&(n.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),n._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.changeBubbles||(n.event.special.change={setup:function(){return Y.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),n.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),n.event.simulate("change",this,a,!0)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;Y.test(b.nodeName)&&!n._data(b,"changeBubbles")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a,!0)}),n._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!Y.test(this.nodeName)}}),l.focusinBubbles||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a),!0)};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=cb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return n().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=n.guid++)),this.each(function(){n.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=cb),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});function eb(a){var b=fb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var fb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gb=/ jQuery\d+="(?:null|\d+)"/g,hb=new RegExp("<(?:"+fb+")[\\s/>]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/<tbody/i,mb=/<|&#?\w+;/,nb=/<(?:script|style|link)/i,ob=/checked\s*(?:[^=]|=\s*.checked.)/i,pb=/^$|\/(?:java|ecma)script/i,qb=/^true\/(.*)/,rb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,sb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1></$2>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?"<table>"!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Db[0].contentWindow||Db[0].contentDocument).document,b.write(),b.close(),c=Fb(a,b),Db.detach()),Eb[a]=c),c}!function(){var a,b,c=z.createElement("div"),d="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],a.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(a.style.opacity),l.cssFloat=!!a.style.cssFloat,c.style.backgroundClip="content-box",c.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===c.style.backgroundClip,a=c=null,l.shrinkWrapBlocks=function(){var a,c,e,f;if(null==b){if(a=z.getElementsByTagName("body")[0],!a)return;f="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",c=z.createElement("div"),e=z.createElement("div"),a.appendChild(c).appendChild(e),b=!1,typeof e.style.zoom!==L&&(e.style.cssText=d+";width:1px;padding:1px;zoom:1",e.innerHTML="<div></div>",e.firstChild.style.width="5px",b=3!==e.offsetWidth),a.removeChild(c),a=c=e=null}return b}}();var Hb=/^margin/,Ib=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Jb,Kb,Lb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Jb=function(a){return a.ownerDocument.defaultView.getComputedStyle(a,null)},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),Ib.test(g)&&Hb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):z.documentElement.currentStyle&&(Jb=function(a){return a.currentStyle},Kb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Jb(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Ib.test(g)&&!Lb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Mb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h=z.createElement("div"),i="border:0;width:0;height:0;position:absolute;top:0;left:-9999px",j="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";h.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",b=h.getElementsByTagName("a")[0],b.style.cssText="float:left;opacity:.5",l.opacity=/^0.5/.test(b.style.opacity),l.cssFloat=!!b.style.cssFloat,h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,b=h=null,n.extend(l,{reliableHiddenOffsets:function(){if(null!=c)return c;var a,b,d,e=z.createElement("div"),f=z.getElementsByTagName("body")[0];if(f)return e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=z.createElement("div"),a.style.cssText=i,f.appendChild(a).appendChild(e),e.innerHTML="<table><tr><td></td><td>t</td></tr></table>",b=e.getElementsByTagName("td"),b[0].style.cssText="padding:0;margin:0;border:0;display:none",d=0===b[0].offsetHeight,b[0].style.display="",b[1].style.display="none",c=d&&0===b[0].offsetHeight,f.removeChild(a),e=f=null,c},boxSizing:function(){return null==d&&k(),d},boxSizingReliable:function(){return null==e&&k(),e},pixelPosition:function(){return null==f&&k(),f},reliableMarginRight:function(){var b,c,d,e;if(null==g&&a.getComputedStyle){if(b=z.getElementsByTagName("body")[0],!b)return;c=z.createElement("div"),d=z.createElement("div"),c.style.cssText=i,b.appendChild(c).appendChild(d),e=d.appendChild(z.createElement("div")),e.style.cssText=d.style.cssText=j,e.style.marginRight=e.style.width="0",d.style.width="1px",g=!parseFloat((a.getComputedStyle(e,null)||{}).marginRight),b.removeChild(c)}return g}});function k(){var b,c,h=z.getElementsByTagName("body")[0];h&&(b=z.createElement("div"),c=z.createElement("div"),b.style.cssText=i,h.appendChild(b).appendChild(c),c.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%",n.swap(h,null!=h.style.zoom?{zoom:1}:{},function(){d=4===c.offsetWidth}),e=!0,f=!1,g=!0,a.getComputedStyle&&(f="1%"!==(a.getComputedStyle(c,null)||{}).top,e="4px"===(a.getComputedStyle(c,null)||{width:"4px"}).width),h.removeChild(b),c=h=null)}}(),n.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Nb=/alpha\([^)]*\)/i,Ob=/opacity\s*=\s*([^)]*)/,Pb=/^(none|table(?!-c[ea]).+)/,Qb=new RegExp("^("+T+")(.*)$","i"),Rb=new RegExp("^([+-])=("+T+")","i"),Sb={position:"absolute",visibility:"hidden",display:"block"},Tb={letterSpacing:0,fontWeight:400},Ub=["Webkit","O","Moz","ms"];function Vb(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Ub.length;while(e--)if(b=Ub[e]+c,b in a)return b;return d}function Wb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&V(d)&&(f[g]=n._data(d,"olddisplay",Gb(d.nodeName)))):f[g]||(e=V(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Xb(a,b,c){var d=Qb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Yb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+U[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+U[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+U[f]+"Width",!0,e))):(g+=n.css(a,"padding"+U[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+U[f]+"Width",!0,e)));return g}function Zb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Jb(a),g=l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Kb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Ib.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Yb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Kb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=Vb(i,h)),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Rb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(n.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||n.cssNumber[h]||(c+="px"),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]="",i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=Vb(a.style,h)),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Kb(a,b,d)),"normal"===f&&b in Tb&&(f=Tb[b]),""===c||c?(e=parseFloat(f),c===!0||n.isNumeric(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?0===a.offsetWidth&&Pb.test(n.css(a,"display"))?n.swap(a,Sb,function(){return Zb(a,b,d)}):Zb(a,b,d):void 0},set:function(a,c,d){var e=d&&Jb(a);return Xb(a,c,d?Yb(a,b,d,l.boxSizing()&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Ob.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Nb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Nb.test(f)?f.replace(Nb,e):f+" "+e)}}),n.cssHooks.marginRight=Mb(l.reliableMarginRight,function(a,b){return b?n.swap(a,{display:"inline-block"},Kb,[a,"marginRight"]):void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+U[d]+b]=f[d]||f[d-2]||f[0];return e}},Hb.test(a)||(n.cssHooks[a+b].set=Xb)}),n.fn.extend({css:function(a,b){return W(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Jb(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)
4
+ },a,b,arguments.length>1)},show:function(){return Wb(this,!0)},hide:function(){return Wb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){V(this)?n(this).show():n(this).hide()})}});function $b(a,b,c,d,e){return new $b.prototype.init(a,b,c,d,e)}n.Tween=$b,$b.prototype={constructor:$b,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=$b.propHooks[this.prop];return a&&a.get?a.get(this):$b.propHooks._default.get(this)},run:function(a){var b,c=$b.propHooks[this.prop];return this.pos=b=this.options.duration?n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):$b.propHooks._default.set(this),this}},$b.prototype.init.prototype=$b.prototype,$b.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[n.cssProps[a.prop]]||n.cssHooks[a.prop])?n.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},$b.propHooks.scrollTop=$b.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},n.fx=$b.prototype.init,n.fx.step={};var _b,ac,bc=/^(?:toggle|show|hide)$/,cc=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),dc=/queueHooks$/,ec=[jc],fc={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=cc.exec(b),f=e&&e[3]||(n.cssNumber[a]?"":"px"),g=(n.cssNumber[a]||"px"!==f&&+d)&&cc.exec(n.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,n.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function gc(){return setTimeout(function(){_b=void 0}),_b=n.now()}function hc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=U[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function ic(a,b,c){for(var d,e=(fc[b]||[]).concat(fc["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function jc(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&V(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k=Gb(a.nodeName),"none"===j&&(j=k),"inline"===j&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==k?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],bc.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}if(!n.isEmptyObject(o)){r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=ic(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function kc(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function lc(a,b,c){var d,e,f=0,g=ec.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=_b||gc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:_b||gc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(kc(k,j.opts.specialEasing);g>f;f++)if(d=ec[f].call(j,a,k,j.opts))return d;return n.map(k,ic,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(lc,{tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],fc[c]=fc[c]||[],fc[c].unshift(b)},prefilter:function(a,b){b?ec.unshift(a):ec.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(V).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=lc(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&dc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(hc(b,!0),a,d,e)}}),n.each({slideDown:hc("show"),slideUp:hc("hide"),slideToggle:hc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(_b=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),_b=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ac||(ac=setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){clearInterval(ac),ac=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(a,b){return a=n.fx?n.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e=z.createElement("div");e.setAttribute("className","t"),e.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=e.getElementsByTagName("a")[0],c=z.createElement("select"),d=c.appendChild(z.createElement("option")),b=e.getElementsByTagName("input")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==e.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=d.selected,l.enctype=!!z.createElement("form").enctype,c.disabled=!0,l.optDisabled=!d.disabled,b=z.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value,a=b=c=d=e=null}();var mc=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(mc,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.text(a)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(l.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>=0:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var nc,oc,pc=n.expr.attrHandle,qc=/^(?:checked|selected)$/i,rc=l.getSetAttribute,sc=l.input;n.fn.extend({attr:function(a,b){return W(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===L?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),d=n.attrHooks[b]||(n.expr.match.bool.test(b)?oc:nc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=n.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void n.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(F);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?sc&&rc||!qc.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(rc?c:d)},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),oc={set:function(a,b,c){return b===!1?n.removeAttr(a,c):sc&&rc||!qc.test(c)?a.setAttribute(!rc&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=pc[b]||n.find.attr;pc[b]=sc&&rc||!qc.test(b)?function(a,b,d){var e,f;return d||(f=pc[b],pc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,pc[b]=f),e}:function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),sc&&rc||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):nc&&nc.set(a,b,c)}}),rc||(nc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},pc.id=pc.name=pc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:nc.set},n.attrHooks.contenteditable={set:function(a,b,c){nc.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var tc=/^(?:input|select|textarea|button|object)$/i,uc=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return W(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!n.isXMLDoc(a),f&&(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):tc.test(a.nodeName)||uc.test(a.nodeName)&&a.href?0:-1}}}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var vc=/[\t\r\n\f]/g;n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=n.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(F)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(vc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?n.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(n.isFunction(a)?function(c){n(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=n(this),f=a.match(F)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===L||"boolean"===c)&&(this.className&&n._data(this,"__className__",this.className),this.className=this.className||a===!1?"":n._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(vc," ").indexOf(b)>=0)return!0;return!1}}),n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var wc=n.now(),xc=/\?/,yc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(yc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var zc,Ac,Bc=/#.*$/,Cc=/([?&])_=[^&]*/,Dc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Ec=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Fc=/^(?:GET|HEAD)$/,Gc=/^\/\//,Hc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ic={},Jc={},Kc="*/".concat("*");try{Ac=location.href}catch(Lc){Ac=z.createElement("a"),Ac.href="",Ac=Ac.href}zc=Hc.exec(Ac.toLowerCase())||[];function Mc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(F)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nc(a,b,c,d){var e={},f=a===Jc;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Oc(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Pc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Qc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ac,type:"GET",isLocal:Ec.test(zc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Oc(Oc(a,n.ajaxSettings),b):Oc(n.ajaxSettings,a)},ajaxPrefilter:Mc(Ic),ajaxTransport:Mc(Jc),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=n.ajaxSetup({},b),l=k.context||k,m=k.context&&(l.nodeType||l.jquery)?n(l):n.event,o=n.Deferred(),p=n.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Dc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||Ac)+"").replace(Bc,"").replace(Gc,zc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=n.trim(k.dataType||"*").toLowerCase().match(F)||[""],null==k.crossDomain&&(c=Hc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===zc[1]&&c[2]===zc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(zc[3]||("http:"===zc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=n.param(k.data,k.traditional)),Nc(Ic,k,b,v),2===t)return v;h=k.global,h&&0===n.active++&&n.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Fc.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(xc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Cc.test(e)?e.replace(Cc,"$1_="+wc++):e+(xc.test(e)?"&":"?")+"_="+wc++)),k.ifModified&&(n.lastModified[e]&&v.setRequestHeader("If-Modified-Since",n.lastModified[e]),n.etag[e]&&v.setRequestHeader("If-None-Match",n.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Kc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Nc(Jc,k,b,v)){v.readyState=1,h&&m.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Pc(k,v,c)),u=Qc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(n.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(n.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&m.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(m.trigger("ajaxComplete",[v,k]),--n.active||n.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(n.isFunction(a)?function(b){n(this).wrapInner(a.call(this,b))}:function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}}),n.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!l.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||n.css(a,"display"))},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Rc=/%20/g,Sc=/\[\]$/,Tc=/\r?\n/g,Uc=/^(?:submit|button|image|reset|file)$/i,Vc=/^(?:input|select|textarea|keygen)/i;function Wc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||Sc.test(a)?d(a,e):Wc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)Wc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)Wc(c,a[c],b,e);return d.join("&").replace(Rc,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&Vc.test(this.nodeName)&&!Uc.test(a)&&(this.checked||!X.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(Tc,"\r\n")}}):{name:b.name,value:c.replace(Tc,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&$c()||_c()}:$c;var Xc=0,Yc={},Zc=n.ajaxSettings.xhr();a.ActiveXObject&&n(a).on("unload",function(){for(var a in Yc)Yc[a](void 0,!0)}),l.cors=!!Zc&&"withCredentials"in Zc,Zc=l.ajax=!!Zc,Zc&&n.ajaxTransport(function(a){if(!a.crossDomain||l.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Xc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Yc[g],b=void 0,f.onreadystatechange=n.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Yc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function $c(){try{return new a.XMLHttpRequest}catch(b){}}function _c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=z.head||n("head")[0]||z.documentElement;return{send:function(d,e){b=z.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ad=[],bd=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ad.pop()||n.expando+"_"+wc++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(bd.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&bd.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(bd,"$1"+e):b.jsonp!==!1&&(b.url+=(xc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ad.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||z;var d=v.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=n.buildFragment([a],b,e),e&&e.length&&n(e).remove(),n.merge([],d.childNodes))};var cd=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&cd)return cd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=a.slice(h,a.length),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&n.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};var dd=a.document.documentElement;function ed(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?(typeof e.getBoundingClientRect!==L&&(d=e.getBoundingClientRect()),c=ed(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||dd;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||dd})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return W(this,function(a,d,e){var f=ed(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Mb(l.pixelPosition,function(a,c){return c?(c=Kb(a,b),Ib.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return W(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var fd=a.jQuery,gd=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=gd),b&&a.jQuery===n&&(a.jQuery=fd),n},typeof b===L&&(a.jQuery=a.$=n),n});
js/jquery.dataTables.js ADDED
@@ -0,0 +1,12098 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @summary DataTables
3
+ * @description Paginate, search and sort HTML tables
4
+ * @version 1.9.4
5
+ * @file jquery.dataTables.js
6
+ * @author Allan Jardine (www.sprymedia.co.uk)
7
+ * @contact www.sprymedia.co.uk/contact
8
+ *
9
+ * @copyright Copyright 2008-2012 Allan Jardine, all rights reserved.
10
+ *
11
+ * This source file is free software, under either the GPL v2 license or a
12
+ * BSD style license, available at:
13
+ * http://datatables.net/license_gpl2
14
+ * http://datatables.net/license_bsd
15
+ *
16
+ * This source file is distributed in the hope that it will be useful, but
17
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
19
+ *
20
+ * For details please refer to: http://www.datatables.net
21
+ */
22
+
23
+ /*jslint evil: true, undef: true, browser: true */
24
+ /*globals $, jQuery,define,_fnExternApiFunc,_fnInitialise,_fnInitComplete,_fnLanguageCompat,_fnAddColumn,_fnColumnOptions,_fnAddData,_fnCreateTr,_fnGatherData,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnServerParams,_fnAddOptionsHtml,_fnFeatureHtmlTable,_fnScrollDraw,_fnAdjustColumnSizing,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnBuildSearchArray,_fnBuildSearchRow,_fnFilterCreateSearch,_fnDataToSearch,_fnSort,_fnSortAttachListener,_fnSortingClasses,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnFeatureHtmlLength,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnNodeToDataIndex,_fnVisbleColumns,_fnCalculateEnd,_fnConvertToWidth,_fnCalculateColumnWidths,_fnScrollingWidthAdjust,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnDetectType,_fnSettingsFromNode,_fnGetDataMaster,_fnGetTrNodes,_fnGetTdNodes,_fnEscapeRegex,_fnDeleteIndex,_fnReOrderIndex,_fnColumnOrdering,_fnLog,_fnClearTable,_fnSaveState,_fnLoadState,_fnCreateCookie,_fnReadCookie,_fnDetectHeader,_fnGetUniqueThs,_fnScrollBarWidth,_fnApplyToChildren,_fnMap,_fnGetRowData,_fnGetCellData,_fnSetCellData,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnApplyColumnDefs,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnJsonString,_fnRender,_fnNodeToColumnIndex,_fnInfoMacros,_fnBrowserDetect,_fnGetColumns*/
25
+
26
+ (/** @lends <global> */function( window, document, undefined ) {
27
+
28
+ (function( factory ) {
29
+ "use strict";
30
+
31
+ // Define as an AMD module if possible
32
+ if ( typeof define === 'function' && define.amd )
33
+ {
34
+ define( ['jquery'], factory );
35
+ }
36
+ /* Define using browser globals otherwise
37
+ * Prevent multiple instantiations if the script is loaded twice
38
+ */
39
+ else if ( jQuery && !jQuery.fn.dataTable )
40
+ {
41
+ factory( jQuery );
42
+ }
43
+ }
44
+ (/** @lends <global> */function( $ ) {
45
+ "use strict";
46
+ /**
47
+ * DataTables is a plug-in for the jQuery Javascript library. It is a
48
+ * highly flexible tool, based upon the foundations of progressive
49
+ * enhancement, which will add advanced interaction controls to any
50
+ * HTML table. For a full list of features please refer to
51
+ * <a href="http://datatables.net">DataTables.net</a>.
52
+ *
53
+ * Note that the <i>DataTable</i> object is not a global variable but is
54
+ * aliased to <i>jQuery.fn.DataTable</i> and <i>jQuery.fn.dataTable</i> through which
55
+ * it may be accessed.
56
+ *
57
+ * @class
58
+ * @param {object} [oInit={}] Configuration object for DataTables. Options
59
+ * are defined by {@link DataTable.defaults}
60
+ * @requires jQuery 1.3+
61
+ *
62
+ * @example
63
+ * // Basic initialisation
64
+ * $(document).ready( function {
65
+ * $('#example').dataTable();
66
+ * } );
67
+ *
68
+ * @example
69
+ * // Initialisation with configuration options - in this case, disable
70
+ * // pagination and sorting.
71
+ * $(document).ready( function {
72
+ * $('#example').dataTable( {
73
+ * "bPaginate": false,
74
+ * "bSort": false
75
+ * } );
76
+ * } );
77
+ */
78
+ var DataTable = function( oInit )
79
+ {
80
+
81
+
82
+ /**
83
+ * Add a column to the list used for the table with default values
84
+ * @param {object} oSettings dataTables settings object
85
+ * @param {node} nTh The th element for this column
86
+ * @memberof DataTable#oApi
87
+ */
88
+ function _fnAddColumn( oSettings, nTh )
89
+ {
90
+ var oDefaults = DataTable.defaults.columns;
91
+ var iCol = oSettings.aoColumns.length;
92
+ var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
93
+ "sSortingClass": oSettings.oClasses.sSortable,
94
+ "sSortingClassJUI": oSettings.oClasses.sSortJUI,
95
+ "nTh": nTh ? nTh : document.createElement('th'),
96
+ "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
97
+ "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
98
+ "mData": oDefaults.mData ? oDefaults.oDefaults : iCol
99
+ } );
100
+ oSettings.aoColumns.push( oCol );
101
+
102
+ /* Add a column specific filter */
103
+ if ( oSettings.aoPreSearchCols[ iCol ] === undefined || oSettings.aoPreSearchCols[ iCol ] === null )
104
+ {
105
+ oSettings.aoPreSearchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch );
106
+ }
107
+ else
108
+ {
109
+ var oPre = oSettings.aoPreSearchCols[ iCol ];
110
+
111
+ /* Don't require that the user must specify bRegex, bSmart or bCaseInsensitive */
112
+ if ( oPre.bRegex === undefined )
113
+ {
114
+ oPre.bRegex = true;
115
+ }
116
+
117
+ if ( oPre.bSmart === undefined )
118
+ {
119
+ oPre.bSmart = true;
120
+ }
121
+
122
+ if ( oPre.bCaseInsensitive === undefined )
123
+ {
124
+ oPre.bCaseInsensitive = true;
125
+ }
126
+ }
127
+
128
+ /* Use the column options function to initialise classes etc */
129
+ _fnColumnOptions( oSettings, iCol, null );
130
+ }
131
+
132
+
133
+ /**
134
+ * Apply options for a column
135
+ * @param {object} oSettings dataTables settings object
136
+ * @param {int} iCol column index to consider
137
+ * @param {object} oOptions object with sType, bVisible and bSearchable etc
138
+ * @memberof DataTable#oApi
139
+ */
140
+ function _fnColumnOptions( oSettings, iCol, oOptions )
141
+ {
142
+ var oCol = oSettings.aoColumns[ iCol ];
143
+
144
+ /* User specified column options */
145
+ if ( oOptions !== undefined && oOptions !== null )
146
+ {
147
+ /* Backwards compatibility for mDataProp */
148
+ if ( oOptions.mDataProp && !oOptions.mData )
149
+ {
150
+ oOptions.mData = oOptions.mDataProp;
151
+ }
152
+
153
+ if ( oOptions.sType !== undefined )
154
+ {
155
+ oCol.sType = oOptions.sType;
156
+ oCol._bAutoType = false;
157
+ }
158
+
159
+ $.extend( oCol, oOptions );
160
+ _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
161
+
162
+ /* iDataSort to be applied (backwards compatibility), but aDataSort will take
163
+ * priority if defined
164
+ */
165
+ if ( oOptions.iDataSort !== undefined )
166
+ {
167
+ oCol.aDataSort = [ oOptions.iDataSort ];
168
+ }
169
+ _fnMap( oCol, oOptions, "aDataSort" );
170
+ }
171
+
172
+ /* Cache the data get and set functions for speed */
173
+ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
174
+ var mData = _fnGetObjectDataFn( oCol.mData );
175
+
176
+ oCol.fnGetData = function (oData, sSpecific) {
177
+ var innerData = mData( oData, sSpecific );
178
+
179
+ if ( oCol.mRender && (sSpecific && sSpecific !== '') )
180
+ {
181
+ return mRender( innerData, sSpecific, oData );
182
+ }
183
+ return innerData;
184
+ };
185
+ oCol.fnSetData = _fnSetObjectDataFn( oCol.mData );
186
+
187
+ /* Feature sorting overrides column specific when off */
188
+ if ( !oSettings.oFeatures.bSort )
189
+ {
190
+ oCol.bSortable = false;
191
+ }
192
+
193
+ /* Check that the class assignment is correct for sorting */
194
+ if ( !oCol.bSortable ||
195
+ ($.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1) )
196
+ {
197
+ oCol.sSortingClass = oSettings.oClasses.sSortableNone;
198
+ oCol.sSortingClassJUI = "";
199
+ }
200
+ else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) == -1 )
201
+ {
202
+ oCol.sSortingClass = oSettings.oClasses.sSortable;
203
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUI;
204
+ }
205
+ else if ( $.inArray('asc', oCol.asSorting) != -1 && $.inArray('desc', oCol.asSorting) == -1 )
206
+ {
207
+ oCol.sSortingClass = oSettings.oClasses.sSortableAsc;
208
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIAscAllowed;
209
+ }
210
+ else if ( $.inArray('asc', oCol.asSorting) == -1 && $.inArray('desc', oCol.asSorting) != -1 )
211
+ {
212
+ oCol.sSortingClass = oSettings.oClasses.sSortableDesc;
213
+ oCol.sSortingClassJUI = oSettings.oClasses.sSortJUIDescAllowed;
214
+ }
215
+ }
216
+
217
+
218
+ /**
219
+ * Adjust the table column widths for new data. Note: you would probably want to
220
+ * do a redraw after calling this function!
221
+ * @param {object} oSettings dataTables settings object
222
+ * @memberof DataTable#oApi
223
+ */
224
+ function _fnAdjustColumnSizing ( oSettings )
225
+ {
226
+ /* Not interested in doing column width calculation if auto-width is disabled */
227
+ if ( oSettings.oFeatures.bAutoWidth === false )
228
+ {
229
+ return false;
230
+ }
231
+
232
+ _fnCalculateColumnWidths( oSettings );
233
+ for ( var i=0 , iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
234
+ {
235
+ oSettings.aoColumns[i].nTh.style.width = oSettings.aoColumns[i].sWidth;
236
+ }
237
+ }
238
+
239
+
240
+ /**
241
+ * Covert the index of a visible column to the index in the data array (take account
242
+ * of hidden columns)
243
+ * @param {object} oSettings dataTables settings object
244
+ * @param {int} iMatch Visible column index to lookup
245
+ * @returns {int} i the data index
246
+ * @memberof DataTable#oApi
247
+ */
248
+ function _fnVisibleToColumnIndex( oSettings, iMatch )
249
+ {
250
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
251
+
252
+ return typeof aiVis[iMatch] === 'number' ?
253
+ aiVis[iMatch] :
254
+ null;
255
+ }
256
+
257
+
258
+ /**
259
+ * Covert the index of an index in the data array and convert it to the visible
260
+ * column index (take account of hidden columns)
261
+ * @param {int} iMatch Column index to lookup
262
+ * @param {object} oSettings dataTables settings object
263
+ * @returns {int} i the data index
264
+ * @memberof DataTable#oApi
265
+ */
266
+ function _fnColumnIndexToVisible( oSettings, iMatch )
267
+ {
268
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
269
+ var iPos = $.inArray( iMatch, aiVis );
270
+
271
+ return iPos !== -1 ? iPos : null;
272
+ }
273
+
274
+
275
+ /**
276
+ * Get the number of visible columns
277
+ * @param {object} oSettings dataTables settings object
278
+ * @returns {int} i the number of visible columns
279
+ * @memberof DataTable#oApi
280
+ */
281
+ function _fnVisbleColumns( oSettings )
282
+ {
283
+ return _fnGetColumns( oSettings, 'bVisible' ).length;
284
+ }
285
+
286
+
287
+ /**
288
+ * Get an array of column indexes that match a given property
289
+ * @param {object} oSettings dataTables settings object
290
+ * @param {string} sParam Parameter in aoColumns to look for - typically
291
+ * bVisible or bSearchable
292
+ * @returns {array} Array of indexes with matched properties
293
+ * @memberof DataTable#oApi
294
+ */
295
+ function _fnGetColumns( oSettings, sParam )
296
+ {
297
+ var a = [];
298
+
299
+ $.map( oSettings.aoColumns, function(val, i) {
300
+ if ( val[sParam] ) {
301
+ a.push( i );
302
+ }
303
+ } );
304
+
305
+ return a;
306
+ }
307
+
308
+
309
+ /**
310
+ * Get the sort type based on an input string
311
+ * @param {string} sData data we wish to know the type of
312
+ * @returns {string} type (defaults to 'string' if no type can be detected)
313
+ * @memberof DataTable#oApi
314
+ */
315
+ function _fnDetectType( sData )
316
+ {
317
+ var aTypes = DataTable.ext.aTypes;
318
+ var iLen = aTypes.length;
319
+
320
+ for ( var i=0 ; i<iLen ; i++ )
321
+ {
322
+ var sType = aTypes[i]( sData );
323
+ if ( sType !== null )
324
+ {
325
+ return sType;
326
+ }
327
+ }
328
+
329
+ return 'string';
330
+ }
331
+
332
+
333
+ /**
334
+ * Figure out how to reorder a display list
335
+ * @param {object} oSettings dataTables settings object
336
+ * @returns array {int} aiReturn index list for reordering
337
+ * @memberof DataTable#oApi
338
+ */
339
+ function _fnReOrderIndex ( oSettings, sColumns )
340
+ {
341
+ var aColumns = sColumns.split(',');
342
+ var aiReturn = [];
343
+
344
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
345
+ {
346
+ for ( var j=0 ; j<iLen ; j++ )
347
+ {
348
+ if ( oSettings.aoColumns[i].sName == aColumns[j] )
349
+ {
350
+ aiReturn.push( j );
351
+ break;
352
+ }
353
+ }
354
+ }
355
+
356
+ return aiReturn;
357
+ }
358
+
359
+
360
+ /**
361
+ * Get the column ordering that DataTables expects
362
+ * @param {object} oSettings dataTables settings object
363
+ * @returns {string} comma separated list of names
364
+ * @memberof DataTable#oApi
365
+ */
366
+ function _fnColumnOrdering ( oSettings )
367
+ {
368
+ var sNames = '';
369
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
370
+ {
371
+ sNames += oSettings.aoColumns[i].sName+',';
372
+ }
373
+ if ( sNames.length == iLen )
374
+ {
375
+ return "";
376
+ }
377
+ return sNames.slice(0, -1);
378
+ }
379
+
380
+
381
+ /**
382
+ * Take the column definitions and static columns arrays and calculate how
383
+ * they relate to column indexes. The callback function will then apply the
384
+ * definition found for a column to a suitable configuration object.
385
+ * @param {object} oSettings dataTables settings object
386
+ * @param {array} aoColDefs The aoColumnDefs array that is to be applied
387
+ * @param {array} aoCols The aoColumns array that defines columns individually
388
+ * @param {function} fn Callback function - takes two parameters, the calculated
389
+ * column index and the definition for that column.
390
+ * @memberof DataTable#oApi
391
+ */
392
+ function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
393
+ {
394
+ var i, iLen, j, jLen, k, kLen;
395
+
396
+ // Column definitions with aTargets
397
+ if ( aoColDefs )
398
+ {
399
+ /* Loop over the definitions array - loop in reverse so first instance has priority */
400
+ for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
401
+ {
402
+ /* Each definition can target multiple columns, as it is an array */
403
+ var aTargets = aoColDefs[i].aTargets;
404
+ if ( !$.isArray( aTargets ) )
405
+ {
406
+ _fnLog( oSettings, 1, 'aTargets must be an array of targets, not a '+(typeof aTargets) );
407
+ }
408
+
409
+ for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
410
+ {
411
+ if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
412
+ {
413
+ /* Add columns that we don't yet know about */
414
+ while( oSettings.aoColumns.length <= aTargets[j] )
415
+ {
416
+ _fnAddColumn( oSettings );
417
+ }
418
+
419
+ /* Integer, basic index */
420
+ fn( aTargets[j], aoColDefs[i] );
421
+ }
422
+ else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
423
+ {
424
+ /* Negative integer, right to left column counting */
425
+ fn( oSettings.aoColumns.length+aTargets[j], aoColDefs[i] );
426
+ }
427
+ else if ( typeof aTargets[j] === 'string' )
428
+ {
429
+ /* Class name matching on TH element */
430
+ for ( k=0, kLen=oSettings.aoColumns.length ; k<kLen ; k++ )
431
+ {
432
+ if ( aTargets[j] == "_all" ||
433
+ $(oSettings.aoColumns[k].nTh).hasClass( aTargets[j] ) )
434
+ {
435
+ fn( k, aoColDefs[i] );
436
+ }
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+
443
+ // Statically defined columns array
444
+ if ( aoCols )
445
+ {
446
+ for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
447
+ {
448
+ fn( i, aoCols[i] );
449
+ }
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Add a data array to the table, creating DOM node etc. This is the parallel to
455
+ * _fnGatherData, but for adding rows from a Javascript source, rather than a
456
+ * DOM source.
457
+ * @param {object} oSettings dataTables settings object
458
+ * @param {array} aData data array to be added
459
+ * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
460
+ * @memberof DataTable#oApi
461
+ */
462
+ function _fnAddData ( oSettings, aDataSupplied )
463
+ {
464
+ var oCol;
465
+
466
+ /* Take an independent copy of the data source so we can bash it about as we wish */
467
+ var aDataIn = ($.isArray(aDataSupplied)) ?
468
+ aDataSupplied.slice() :
469
+ $.extend( true, {}, aDataSupplied );
470
+
471
+ /* Create the object for storing information about this new row */
472
+ var iRow = oSettings.aoData.length;
473
+ var oData = $.extend( true, {}, DataTable.models.oRow );
474
+ oData._aData = aDataIn;
475
+ oSettings.aoData.push( oData );
476
+
477
+ /* Create the cells */
478
+ var nTd, sThisType;
479
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
480
+ {
481
+ oCol = oSettings.aoColumns[i];
482
+
483
+ /* Use rendered data for filtering / sorting */
484
+ if ( typeof oCol.fnRender === 'function' && oCol.bUseRendered && oCol.mData !== null )
485
+ {
486
+ _fnSetCellData( oSettings, iRow, i, _fnRender(oSettings, iRow, i) );
487
+ }
488
+ else
489
+ {
490
+ _fnSetCellData( oSettings, iRow, i, _fnGetCellData( oSettings, iRow, i ) );
491
+ }
492
+
493
+ /* See if we should auto-detect the column type */
494
+ if ( oCol._bAutoType && oCol.sType != 'string' )
495
+ {
496
+ /* Attempt to auto detect the type - same as _fnGatherData() */
497
+ var sVarType = _fnGetCellData( oSettings, iRow, i, 'type' );
498
+ if ( sVarType !== null && sVarType !== '' )
499
+ {
500
+ sThisType = _fnDetectType( sVarType );
501
+ if ( oCol.sType === null )
502
+ {
503
+ oCol.sType = sThisType;
504
+ }
505
+ else if ( oCol.sType != sThisType && oCol.sType != "html" )
506
+ {
507
+ /* String is always the 'fallback' option */
508
+ oCol.sType = 'string';
509
+ }
510
+ }
511
+ }
512
+ }
513
+
514
+ /* Add to the display array */
515
+ oSettings.aiDisplayMaster.push( iRow );
516
+
517
+ /* Create the DOM information */
518
+ if ( !oSettings.oFeatures.bDeferRender )
519
+ {
520
+ _fnCreateTr( oSettings, iRow );
521
+ }
522
+
523
+ return iRow;
524
+ }
525
+
526
+
527
+ /**
528
+ * Read in the data from the target table from the DOM
529
+ * @param {object} oSettings dataTables settings object
530
+ * @memberof DataTable#oApi
531
+ */
532
+ function _fnGatherData( oSettings )
533
+ {
534
+ var iLoop, i, iLen, j, jLen, jInner,
535
+ nTds, nTrs, nTd, nTr, aLocalData, iThisIndex,
536
+ iRow, iRows, iColumn, iColumns, sNodeName,
537
+ oCol, oData;
538
+
539
+ /*
540
+ * Process by row first
541
+ * Add the data object for the whole table - storing the tr node. Note - no point in getting
542
+ * DOM based data if we are going to go and replace it with Ajax source data.
543
+ */
544
+ if ( oSettings.bDeferLoading || oSettings.sAjaxSource === null )
545
+ {
546
+ nTr = oSettings.nTBody.firstChild;
547
+ while ( nTr )
548
+ {
549
+ if ( nTr.nodeName.toUpperCase() == "TR" )
550
+ {
551
+ iThisIndex = oSettings.aoData.length;
552
+ nTr._DT_RowIndex = iThisIndex;
553
+ oSettings.aoData.push( $.extend( true, {}, DataTable.models.oRow, {
554
+ "nTr": nTr
555
+ } ) );
556
+
557
+ oSettings.aiDisplayMaster.push( iThisIndex );
558
+ nTd = nTr.firstChild;
559
+ jInner = 0;
560
+ while ( nTd )
561
+ {
562
+ sNodeName = nTd.nodeName.toUpperCase();
563
+ if ( sNodeName == "TD" || sNodeName == "TH" )
564
+ {
565
+ _fnSetCellData( oSettings, iThisIndex, jInner, $.trim(nTd.innerHTML) );
566
+ jInner++;
567
+ }
568
+ nTd = nTd.nextSibling;
569
+ }
570
+ }
571
+ nTr = nTr.nextSibling;
572
+ }
573
+ }
574
+
575
+ /* Gather in the TD elements of the Table - note that this is basically the same as
576
+ * fnGetTdNodes, but that function takes account of hidden columns, which we haven't yet
577
+ * setup!
578
+ */
579
+ nTrs = _fnGetTrNodes( oSettings );
580
+ nTds = [];
581
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
582
+ {
583
+ nTd = nTrs[i].firstChild;
584
+ while ( nTd )
585
+ {
586
+ sNodeName = nTd.nodeName.toUpperCase();
587
+ if ( sNodeName == "TD" || sNodeName == "TH" )
588
+ {
589
+ nTds.push( nTd );
590
+ }
591
+ nTd = nTd.nextSibling;
592
+ }
593
+ }
594
+
595
+ /* Now process by column */
596
+ for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
597
+ {
598
+ oCol = oSettings.aoColumns[iColumn];
599
+
600
+ /* Get the title of the column - unless there is a user set one */
601
+ if ( oCol.sTitle === null )
602
+ {
603
+ oCol.sTitle = oCol.nTh.innerHTML;
604
+ }
605
+
606
+ var
607
+ bAutoType = oCol._bAutoType,
608
+ bRender = typeof oCol.fnRender === 'function',
609
+ bClass = oCol.sClass !== null,
610
+ bVisible = oCol.bVisible,
611
+ nCell, sThisType, sRendered, sValType;
612
+
613
+ /* A single loop to rule them all (and be more efficient) */
614
+ if ( bAutoType || bRender || bClass || !bVisible )
615
+ {
616
+ for ( iRow=0, iRows=oSettings.aoData.length ; iRow<iRows ; iRow++ )
617
+ {
618
+ oData = oSettings.aoData[iRow];
619
+ nCell = nTds[ (iRow*iColumns) + iColumn ];
620
+
621
+ /* Type detection */
622
+ if ( bAutoType && oCol.sType != 'string' )
623
+ {
624
+ sValType = _fnGetCellData( oSettings, iRow, iColumn, 'type' );
625
+ if ( sValType !== '' )
626
+ {
627
+ sThisType = _fnDetectType( sValType );
628
+ if ( oCol.sType === null )
629
+ {
630
+ oCol.sType = sThisType;
631
+ }
632
+ else if ( oCol.sType != sThisType &&
633
+ oCol.sType != "html" )
634
+ {
635
+ /* String is always the 'fallback' option */
636
+ oCol.sType = 'string';
637
+ }
638
+ }
639
+ }
640
+
641
+ if ( oCol.mRender )
642
+ {
643
+ // mRender has been defined, so we need to get the value and set it
644
+ nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
645
+ }
646
+ else if ( oCol.mData !== iColumn )
647
+ {
648
+ // If mData is not the same as the column number, then we need to
649
+ // get the dev set value. If it is the column, no point in wasting
650
+ // time setting the value that is already there!
651
+ nCell.innerHTML = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
652
+ }
653
+
654
+ /* Rendering */
655
+ if ( bRender )
656
+ {
657
+ sRendered = _fnRender( oSettings, iRow, iColumn );
658
+ nCell.innerHTML = sRendered;
659
+ if ( oCol.bUseRendered )
660
+ {
661
+ /* Use the rendered data for filtering / sorting */
662
+ _fnSetCellData( oSettings, iRow, iColumn, sRendered );
663
+ }
664
+ }
665
+
666
+ /* Classes */
667
+ if ( bClass )
668
+ {
669
+ nCell.className += ' '+oCol.sClass;
670
+ }
671
+
672
+ /* Column visibility */
673
+ if ( !bVisible )
674
+ {
675
+ oData._anHidden[iColumn] = nCell;
676
+ nCell.parentNode.removeChild( nCell );
677
+ }
678
+ else
679
+ {
680
+ oData._anHidden[iColumn] = null;
681
+ }
682
+
683
+ if ( oCol.fnCreatedCell )
684
+ {
685
+ oCol.fnCreatedCell.call( oSettings.oInstance,
686
+ nCell, _fnGetCellData( oSettings, iRow, iColumn, 'display' ), oData._aData, iRow, iColumn
687
+ );
688
+ }
689
+ }
690
+ }
691
+ }
692
+
693
+ /* Row created callbacks */
694
+ if ( oSettings.aoRowCreatedCallback.length !== 0 )
695
+ {
696
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
697
+ {
698
+ oData = oSettings.aoData[i];
699
+ _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, i] );
700
+ }
701
+ }
702
+ }
703
+
704
+
705
+ /**
706
+ * Take a TR element and convert it to an index in aoData
707
+ * @param {object} oSettings dataTables settings object
708
+ * @param {node} n the TR element to find
709
+ * @returns {int} index if the node is found, null if not
710
+ * @memberof DataTable#oApi
711
+ */
712
+ function _fnNodeToDataIndex( oSettings, n )
713
+ {
714
+ return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
715
+ }
716
+
717
+
718
+ /**
719
+ * Take a TD element and convert it into a column data index (not the visible index)
720
+ * @param {object} oSettings dataTables settings object
721
+ * @param {int} iRow The row number the TD/TH can be found in
722
+ * @param {node} n The TD/TH element to find
723
+ * @returns {int} index if the node is found, -1 if not
724
+ * @memberof DataTable#oApi
725
+ */
726
+ function _fnNodeToColumnIndex( oSettings, iRow, n )
727
+ {
728
+ var anCells = _fnGetTdNodes( oSettings, iRow );
729
+
730
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
731
+ {
732
+ if ( anCells[i] === n )
733
+ {
734
+ return i;
735
+ }
736
+ }
737
+ return -1;
738
+ }
739
+
740
+
741
+ /**
742
+ * Get an array of data for a given row from the internal data cache
743
+ * @param {object} oSettings dataTables settings object
744
+ * @param {int} iRow aoData row id
745
+ * @param {string} sSpecific data get type ('type' 'filter' 'sort')
746
+ * @param {array} aiColumns Array of column indexes to get data from
747
+ * @returns {array} Data array
748
+ * @memberof DataTable#oApi
749
+ */
750
+ function _fnGetRowData( oSettings, iRow, sSpecific, aiColumns )
751
+ {
752
+ var out = [];
753
+ for ( var i=0, iLen=aiColumns.length ; i<iLen ; i++ )
754
+ {
755
+ out.push( _fnGetCellData( oSettings, iRow, aiColumns[i], sSpecific ) );
756
+ }
757
+ return out;
758
+ }
759
+
760
+
761
+ /**
762
+ * Get the data for a given cell from the internal cache, taking into account data mapping
763
+ * @param {object} oSettings dataTables settings object
764
+ * @param {int} iRow aoData row id
765
+ * @param {int} iCol Column index
766
+ * @param {string} sSpecific data get type ('display', 'type' 'filter' 'sort')
767
+ * @returns {*} Cell data
768
+ * @memberof DataTable#oApi
769
+ */
770
+ function _fnGetCellData( oSettings, iRow, iCol, sSpecific )
771
+ {
772
+ var sData;
773
+ var oCol = oSettings.aoColumns[iCol];
774
+ var oData = oSettings.aoData[iRow]._aData;
775
+
776
+ if ( (sData=oCol.fnGetData( oData, sSpecific )) === undefined )
777
+ {
778
+ if ( oSettings.iDrawError != oSettings.iDraw && oCol.sDefaultContent === null )
779
+ {
780
+ _fnLog( oSettings, 0, "Requested unknown parameter "+
781
+ (typeof oCol.mData=='function' ? '{mData function}' : "'"+oCol.mData+"'")+
782
+ " from the data source for row "+iRow );
783
+ oSettings.iDrawError = oSettings.iDraw;
784
+ }
785
+ return oCol.sDefaultContent;
786
+ }
787
+
788
+ /* When the data source is null, we can use default column data */
789
+ if ( sData === null && oCol.sDefaultContent !== null )
790
+ {
791
+ sData = oCol.sDefaultContent;
792
+ }
793
+ else if ( typeof sData === 'function' )
794
+ {
795
+ /* If the data source is a function, then we run it and use the return */
796
+ return sData();
797
+ }
798
+
799
+ if ( sSpecific == 'display' && sData === null )
800
+ {
801
+ return '';
802
+ }
803
+ return sData;
804
+ }
805
+
806
+
807
+ /**
808
+ * Set the value for a specific cell, into the internal data cache
809
+ * @param {object} oSettings dataTables settings object
810
+ * @param {int} iRow aoData row id
811
+ * @param {int} iCol Column index
812
+ * @param {*} val Value to set
813
+ * @memberof DataTable#oApi
814
+ */
815
+ function _fnSetCellData( oSettings, iRow, iCol, val )
816
+ {
817
+ var oCol = oSettings.aoColumns[iCol];
818
+ var oData = oSettings.aoData[iRow]._aData;
819
+
820
+ oCol.fnSetData( oData, val );
821
+ }
822
+
823
+
824
+ // Private variable that is used to match array syntax in the data property object
825
+ var __reArray = /\[.*?\]$/;
826
+
827
+ /**
828
+ * Return a function that can be used to get data from a source object, taking
829
+ * into account the ability to use nested objects as a source
830
+ * @param {string|int|function} mSource The data source for the object
831
+ * @returns {function} Data get function
832
+ * @memberof DataTable#oApi
833
+ */
834
+ function _fnGetObjectDataFn( mSource )
835
+ {
836
+ if ( mSource === null )
837
+ {
838
+ /* Give an empty string for rendering / sorting etc */
839
+ return function (data, type) {
840
+ return null;
841
+ };
842
+ }
843
+ else if ( typeof mSource === 'function' )
844
+ {
845
+ return function (data, type, extra) {
846
+ return mSource( data, type, extra );
847
+ };
848
+ }
849
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
850
+ {
851
+ /* If there is a . in the source string then the data source is in a
852
+ * nested object so we loop over the data for each level to get the next
853
+ * level down. On each loop we test for undefined, and if found immediately
854
+ * return. This allows entire objects to be missing and sDefaultContent to
855
+ * be used if defined, rather than throwing an error
856
+ */
857
+ var fetchData = function (data, type, src) {
858
+ var a = src.split('.');
859
+ var arrayNotation, out, innerSrc;
860
+
861
+ if ( src !== "" )
862
+ {
863
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
864
+ {
865
+ // Check if we are dealing with an array notation request
866
+ arrayNotation = a[i].match(__reArray);
867
+
868
+ if ( arrayNotation ) {
869
+ a[i] = a[i].replace(__reArray, '');
870
+
871
+ // Condition allows simply [] to be passed in
872
+ if ( a[i] !== "" ) {
873
+ data = data[ a[i] ];
874
+ }
875
+ out = [];
876
+
877
+ // Get the remainder of the nested object to get
878
+ a.splice( 0, i+1 );
879
+ innerSrc = a.join('.');
880
+
881
+ // Traverse each entry in the array getting the properties requested
882
+ for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
883
+ out.push( fetchData( data[j], type, innerSrc ) );
884
+ }
885
+
886
+ // If a string is given in between the array notation indicators, that
887
+ // is used to join the strings together, otherwise an array is returned
888
+ var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
889
+ data = (join==="") ? out : out.join(join);
890
+
891
+ // The inner call to fetchData has already traversed through the remainder
892
+ // of the source requested, so we exit from the loop
893
+ break;
894
+ }
895
+
896
+ if ( data === null || data[ a[i] ] === undefined )
897
+ {
898
+ return undefined;
899
+ }
900
+ data = data[ a[i] ];
901
+ }
902
+ }
903
+
904
+ return data;
905
+ };
906
+
907
+ return function (data, type) {
908
+ return fetchData( data, type, mSource );
909
+ };
910
+ }
911
+ else
912
+ {
913
+ /* Array or flat object mapping */
914
+ return function (data, type) {
915
+ return data[mSource];
916
+ };
917
+ }
918
+ }
919
+
920
+
921
+ /**
922
+ * Return a function that can be used to set data from a source object, taking
923
+ * into account the ability to use nested objects as a source
924
+ * @param {string|int|function} mSource The data source for the object
925
+ * @returns {function} Data set function
926
+ * @memberof DataTable#oApi
927
+ */
928
+ function _fnSetObjectDataFn( mSource )
929
+ {
930
+ if ( mSource === null )
931
+ {
932
+ /* Nothing to do when the data source is null */
933
+ return function (data, val) {};
934
+ }
935
+ else if ( typeof mSource === 'function' )
936
+ {
937
+ return function (data, val) {
938
+ mSource( data, 'set', val );
939
+ };
940
+ }
941
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || mSource.indexOf('[') !== -1) )
942
+ {
943
+ /* Like the get, we need to get data from a nested object */
944
+ var setData = function (data, val, src) {
945
+ var a = src.split('.'), b;
946
+ var arrayNotation, o, innerSrc;
947
+
948
+ for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
949
+ {
950
+ // Check if we are dealing with an array notation request
951
+ arrayNotation = a[i].match(__reArray);
952
+
953
+ if ( arrayNotation )
954
+ {
955
+ a[i] = a[i].replace(__reArray, '');
956
+ data[ a[i] ] = [];
957
+
958
+ // Get the remainder of the nested object to set so we can recurse
959
+ b = a.slice();
960
+ b.splice( 0, i+1 );
961
+ innerSrc = b.join('.');
962
+
963
+ // Traverse each entry in the array setting the properties requested
964
+ for ( var j=0, jLen=val.length ; j<jLen ; j++ )
965
+ {
966
+ o = {};
967
+ setData( o, val[j], innerSrc );
968
+ data[ a[i] ].push( o );
969
+ }
970
+
971
+ // The inner call to setData has already traversed through the remainder
972
+ // of the source and has set the data, thus we can exit here
973
+ return;
974
+ }
975
+
976
+ // If the nested object doesn't currently exist - since we are
977
+ // trying to set the value - create it
978
+ if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
979
+ {
980
+ data[ a[i] ] = {};
981
+ }
982
+ data = data[ a[i] ];
983
+ }
984
+
985
+ // If array notation is used, we just want to strip it and use the property name
986
+ // and assign the value. If it isn't used, then we get the result we want anyway
987
+ data[ a[a.length-1].replace(__reArray, '') ] = val;
988
+ };
989
+
990
+ return function (data, val) {
991
+ return setData( data, val, mSource );
992
+ };
993
+ }
994
+ else
995
+ {
996
+ /* Array or flat object mapping */
997
+ return function (data, val) {
998
+ data[mSource] = val;
999
+ };
1000
+ }
1001
+ }
1002
+
1003
+
1004
+ /**
1005
+ * Return an array with the full table data
1006
+ * @param {object} oSettings dataTables settings object
1007
+ * @returns array {array} aData Master data array
1008
+ * @memberof DataTable#oApi
1009
+ */
1010
+ function _fnGetDataMaster ( oSettings )
1011
+ {
1012
+ var aData = [];
1013
+ var iLen = oSettings.aoData.length;
1014
+ for ( var i=0 ; i<iLen; i++ )
1015
+ {
1016
+ aData.push( oSettings.aoData[i]._aData );
1017
+ }
1018
+ return aData;
1019
+ }
1020
+
1021
+
1022
+ /**
1023
+ * Nuke the table
1024
+ * @param {object} oSettings dataTables settings object
1025
+ * @memberof DataTable#oApi
1026
+ */
1027
+ function _fnClearTable( oSettings )
1028
+ {
1029
+ oSettings.aoData.splice( 0, oSettings.aoData.length );
1030
+ oSettings.aiDisplayMaster.splice( 0, oSettings.aiDisplayMaster.length );
1031
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length );
1032
+ _fnCalculateEnd( oSettings );
1033
+ }
1034
+
1035
+
1036
+ /**
1037
+ * Take an array of integers (index array) and remove a target integer (value - not
1038
+ * the key!)
1039
+ * @param {array} a Index array to target
1040
+ * @param {int} iTarget value to find
1041
+ * @memberof DataTable#oApi
1042
+ */
1043
+ function _fnDeleteIndex( a, iTarget )
1044
+ {
1045
+ var iTargetIndex = -1;
1046
+
1047
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
1048
+ {
1049
+ if ( a[i] == iTarget )
1050
+ {
1051
+ iTargetIndex = i;
1052
+ }
1053
+ else if ( a[i] > iTarget )
1054
+ {
1055
+ a[i]--;
1056
+ }
1057
+ }
1058
+
1059
+ if ( iTargetIndex != -1 )
1060
+ {
1061
+ a.splice( iTargetIndex, 1 );
1062
+ }
1063
+ }
1064
+
1065
+
1066
+ /**
1067
+ * Call the developer defined fnRender function for a given cell (row/column) with
1068
+ * the required parameters and return the result.
1069
+ * @param {object} oSettings dataTables settings object
1070
+ * @param {int} iRow aoData index for the row
1071
+ * @param {int} iCol aoColumns index for the column
1072
+ * @returns {*} Return of the developer's fnRender function
1073
+ * @memberof DataTable#oApi
1074
+ */
1075
+ function _fnRender( oSettings, iRow, iCol )
1076
+ {
1077
+ var oCol = oSettings.aoColumns[iCol];
1078
+
1079
+ return oCol.fnRender( {
1080
+ "iDataRow": iRow,
1081
+ "iDataColumn": iCol,
1082
+ "oSettings": oSettings,
1083
+ "aData": oSettings.aoData[iRow]._aData,
1084
+ "mDataProp": oCol.mData
1085
+ }, _fnGetCellData(oSettings, iRow, iCol, 'display') );
1086
+ }
1087
+ /**
1088
+ * Create a new TR element (and it's TD children) for a row
1089
+ * @param {object} oSettings dataTables settings object
1090
+ * @param {int} iRow Row to consider
1091
+ * @memberof DataTable#oApi
1092
+ */
1093
+ function _fnCreateTr ( oSettings, iRow )
1094
+ {
1095
+ var oData = oSettings.aoData[iRow];
1096
+ var nTd;
1097
+
1098
+ if ( oData.nTr === null )
1099
+ {
1100
+ oData.nTr = document.createElement('tr');
1101
+
1102
+ /* Use a private property on the node to allow reserve mapping from the node
1103
+ * to the aoData array for fast look up
1104
+ */
1105
+ oData.nTr._DT_RowIndex = iRow;
1106
+
1107
+ /* Special parameters can be given by the data source to be used on the row */
1108
+ if ( oData._aData.DT_RowId )
1109
+ {
1110
+ oData.nTr.id = oData._aData.DT_RowId;
1111
+ }
1112
+
1113
+ if ( oData._aData.DT_RowClass )
1114
+ {
1115
+ oData.nTr.className = oData._aData.DT_RowClass;
1116
+ }
1117
+
1118
+ /* Process each column */
1119
+ for ( var i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1120
+ {
1121
+ var oCol = oSettings.aoColumns[i];
1122
+ nTd = document.createElement( oCol.sCellType );
1123
+
1124
+ /* Render if needed - if bUseRendered is true then we already have the rendered
1125
+ * value in the data source - so can just use that
1126
+ */
1127
+ nTd.innerHTML = (typeof oCol.fnRender === 'function' && (!oCol.bUseRendered || oCol.mData === null)) ?
1128
+ _fnRender( oSettings, iRow, i ) :
1129
+ _fnGetCellData( oSettings, iRow, i, 'display' );
1130
+
1131
+ /* Add user defined class */
1132
+ if ( oCol.sClass !== null )
1133
+ {
1134
+ nTd.className = oCol.sClass;
1135
+ }
1136
+
1137
+ if ( oCol.bVisible )
1138
+ {
1139
+ oData.nTr.appendChild( nTd );
1140
+ oData._anHidden[i] = null;
1141
+ }
1142
+ else
1143
+ {
1144
+ oData._anHidden[i] = nTd;
1145
+ }
1146
+
1147
+ if ( oCol.fnCreatedCell )
1148
+ {
1149
+ oCol.fnCreatedCell.call( oSettings.oInstance,
1150
+ nTd, _fnGetCellData( oSettings, iRow, i, 'display' ), oData._aData, iRow, i
1151
+ );
1152
+ }
1153
+ }
1154
+
1155
+ _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [oData.nTr, oData._aData, iRow] );
1156
+ }
1157
+ }
1158
+
1159
+
1160
+ /**
1161
+ * Create the HTML header for the table
1162
+ * @param {object} oSettings dataTables settings object
1163
+ * @memberof DataTable#oApi
1164
+ */
1165
+ function _fnBuildHead( oSettings )
1166
+ {
1167
+ var i, nTh, iLen, j, jLen;
1168
+ var iThs = $('th, td', oSettings.nTHead).length;
1169
+ var iCorrector = 0;
1170
+ var jqChildren;
1171
+
1172
+ /* If there is a header in place - then use it - otherwise it's going to get nuked... */
1173
+ if ( iThs !== 0 )
1174
+ {
1175
+ /* We've got a thead from the DOM, so remove hidden columns and apply width to vis cols */
1176
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1177
+ {
1178
+ nTh = oSettings.aoColumns[i].nTh;
1179
+ nTh.setAttribute('role', 'columnheader');
1180
+ if ( oSettings.aoColumns[i].bSortable )
1181
+ {
1182
+ nTh.setAttribute('tabindex', oSettings.iTabIndex);
1183
+ nTh.setAttribute('aria-controls', oSettings.sTableId);
1184
+ }
1185
+
1186
+ if ( oSettings.aoColumns[i].sClass !== null )
1187
+ {
1188
+ $(nTh).addClass( oSettings.aoColumns[i].sClass );
1189
+ }
1190
+
1191
+ /* Set the title of the column if it is user defined (not what was auto detected) */
1192
+ if ( oSettings.aoColumns[i].sTitle != nTh.innerHTML )
1193
+ {
1194
+ nTh.innerHTML = oSettings.aoColumns[i].sTitle;
1195
+ }
1196
+ }
1197
+ }
1198
+ else
1199
+ {
1200
+ /* We don't have a header in the DOM - so we are going to have to create one */
1201
+ var nTr = document.createElement( "tr" );
1202
+
1203
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1204
+ {
1205
+ nTh = oSettings.aoColumns[i].nTh;
1206
+ nTh.innerHTML = oSettings.aoColumns[i].sTitle;
1207
+ nTh.setAttribute('tabindex', '0');
1208
+
1209
+ if ( oSettings.aoColumns[i].sClass !== null )
1210
+ {
1211
+ $(nTh).addClass( oSettings.aoColumns[i].sClass );
1212
+ }
1213
+
1214
+ nTr.appendChild( nTh );
1215
+ }
1216
+ $(oSettings.nTHead).html( '' )[0].appendChild( nTr );
1217
+ _fnDetectHeader( oSettings.aoHeader, oSettings.nTHead );
1218
+ }
1219
+
1220
+ /* ARIA role for the rows */
1221
+ $(oSettings.nTHead).children('tr').attr('role', 'row');
1222
+
1223
+ /* Add the extra markup needed by jQuery UI's themes */
1224
+ if ( oSettings.bJUI )
1225
+ {
1226
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1227
+ {
1228
+ nTh = oSettings.aoColumns[i].nTh;
1229
+
1230
+ var nDiv = document.createElement('div');
1231
+ nDiv.className = oSettings.oClasses.sSortJUIWrapper;
1232
+ $(nTh).contents().appendTo(nDiv);
1233
+
1234
+ var nSpan = document.createElement('span');
1235
+ nSpan.className = oSettings.oClasses.sSortIcon;
1236
+ nDiv.appendChild( nSpan );
1237
+ nTh.appendChild( nDiv );
1238
+ }
1239
+ }
1240
+
1241
+ if ( oSettings.oFeatures.bSort )
1242
+ {
1243
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
1244
+ {
1245
+ if ( oSettings.aoColumns[i].bSortable !== false )
1246
+ {
1247
+ _fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i );
1248
+ }
1249
+ else
1250
+ {
1251
+ $(oSettings.aoColumns[i].nTh).addClass( oSettings.oClasses.sSortableNone );
1252
+ }
1253
+ }
1254
+ }
1255
+
1256
+ /* Deal with the footer - add classes if required */
1257
+ if ( oSettings.oClasses.sFooterTH !== "" )
1258
+ {
1259
+ $(oSettings.nTFoot).children('tr').children('th').addClass( oSettings.oClasses.sFooterTH );
1260
+ }
1261
+
1262
+ /* Cache the footer elements */
1263
+ if ( oSettings.nTFoot !== null )
1264
+ {
1265
+ var anCells = _fnGetUniqueThs( oSettings, null, oSettings.aoFooter );
1266
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
1267
+ {
1268
+ if ( anCells[i] )
1269
+ {
1270
+ oSettings.aoColumns[i].nTf = anCells[i];
1271
+ if ( oSettings.aoColumns[i].sClass )
1272
+ {
1273
+ $(anCells[i]).addClass( oSettings.aoColumns[i].sClass );
1274
+ }
1275
+ }
1276
+ }
1277
+ }
1278
+ }
1279
+
1280
+
1281
+ /**
1282
+ * Draw the header (or footer) element based on the column visibility states. The
1283
+ * methodology here is to use the layout array from _fnDetectHeader, modified for
1284
+ * the instantaneous column visibility, to construct the new layout. The grid is
1285
+ * traversed over cell at a time in a rows x columns grid fashion, although each
1286
+ * cell insert can cover multiple elements in the grid - which is tracks using the
1287
+ * aApplied array. Cell inserts in the grid will only occur where there isn't
1288
+ * already a cell in that position.
1289
+ * @param {object} oSettings dataTables settings object
1290
+ * @param array {objects} aoSource Layout array from _fnDetectHeader
1291
+ * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
1292
+ * @memberof DataTable#oApi
1293
+ */
1294
+ function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
1295
+ {
1296
+ var i, iLen, j, jLen, k, kLen, n, nLocalTr;
1297
+ var aoLocal = [];
1298
+ var aApplied = [];
1299
+ var iColumns = oSettings.aoColumns.length;
1300
+ var iRowspan, iColspan;
1301
+
1302
+ if ( bIncludeHidden === undefined )
1303
+ {
1304
+ bIncludeHidden = false;
1305
+ }
1306
+
1307
+ /* Make a copy of the master layout array, but without the visible columns in it */
1308
+ for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
1309
+ {
1310
+ aoLocal[i] = aoSource[i].slice();
1311
+ aoLocal[i].nTr = aoSource[i].nTr;
1312
+
1313
+ /* Remove any columns which are currently hidden */
1314
+ for ( j=iColumns-1 ; j>=0 ; j-- )
1315
+ {
1316
+ if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
1317
+ {
1318
+ aoLocal[i].splice( j, 1 );
1319
+ }
1320
+ }
1321
+
1322
+ /* Prep the applied array - it needs an element for each row */
1323
+ aApplied.push( [] );
1324
+ }
1325
+
1326
+ for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
1327
+ {
1328
+ nLocalTr = aoLocal[i].nTr;
1329
+
1330
+ /* All cells are going to be replaced, so empty out the row */
1331
+ if ( nLocalTr )
1332
+ {
1333
+ while( (n = nLocalTr.firstChild) )
1334
+ {
1335
+ nLocalTr.removeChild( n );
1336
+ }
1337
+ }
1338
+
1339
+ for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
1340
+ {
1341
+ iRowspan = 1;
1342
+ iColspan = 1;
1343
+
1344
+ /* Check to see if there is already a cell (row/colspan) covering our target
1345
+ * insert point. If there is, then there is nothing to do.
1346
+ */
1347
+ if ( aApplied[i][j] === undefined )
1348
+ {
1349
+ nLocalTr.appendChild( aoLocal[i][j].cell );
1350
+ aApplied[i][j] = 1;
1351
+
1352
+ /* Expand the cell to cover as many rows as needed */
1353
+ while ( aoLocal[i+iRowspan] !== undefined &&
1354
+ aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
1355
+ {
1356
+ aApplied[i+iRowspan][j] = 1;
1357
+ iRowspan++;
1358
+ }
1359
+
1360
+ /* Expand the cell to cover as many columns as needed */
1361
+ while ( aoLocal[i][j+iColspan] !== undefined &&
1362
+ aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
1363
+ {
1364
+ /* Must update the applied array over the rows for the columns */
1365
+ for ( k=0 ; k<iRowspan ; k++ )
1366
+ {
1367
+ aApplied[i+k][j+iColspan] = 1;
1368
+ }
1369
+ iColspan++;
1370
+ }
1371
+
1372
+ /* Do the actual expansion in the DOM */
1373
+ aoLocal[i][j].cell.rowSpan = iRowspan;
1374
+ aoLocal[i][j].cell.colSpan = iColspan;
1375
+ }
1376
+ }
1377
+ }
1378
+ }
1379
+
1380
+
1381
+ /**
1382
+ * Insert the required TR nodes into the table for display
1383
+ * @param {object} oSettings dataTables settings object
1384
+ * @memberof DataTable#oApi
1385
+ */
1386
+ function _fnDraw( oSettings )
1387
+ {
1388
+ /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
1389
+ var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
1390
+ if ( $.inArray( false, aPreDraw ) !== -1 )
1391
+ {
1392
+ _fnProcessingDisplay( oSettings, false );
1393
+ return;
1394
+ }
1395
+
1396
+ var i, iLen, n;
1397
+ var anRows = [];
1398
+ var iRowCount = 0;
1399
+ var iStripes = oSettings.asStripeClasses.length;
1400
+ var iOpenRows = oSettings.aoOpenRows.length;
1401
+
1402
+ oSettings.bDrawing = true;
1403
+
1404
+ /* Check and see if we have an initial draw position from state saving */
1405
+ if ( oSettings.iInitDisplayStart !== undefined && oSettings.iInitDisplayStart != -1 )
1406
+ {
1407
+ if ( oSettings.oFeatures.bServerSide )
1408
+ {
1409
+ oSettings._iDisplayStart = oSettings.iInitDisplayStart;
1410
+ }
1411
+ else
1412
+ {
1413
+ oSettings._iDisplayStart = (oSettings.iInitDisplayStart >= oSettings.fnRecordsDisplay()) ?
1414
+ 0 : oSettings.iInitDisplayStart;
1415
+ }
1416
+ oSettings.iInitDisplayStart = -1;
1417
+ _fnCalculateEnd( oSettings );
1418
+ }
1419
+
1420
+ /* Server-side processing draw intercept */
1421
+ if ( oSettings.bDeferLoading )
1422
+ {
1423
+ oSettings.bDeferLoading = false;
1424
+ oSettings.iDraw++;
1425
+ }
1426
+ else if ( !oSettings.oFeatures.bServerSide )
1427
+ {
1428
+ oSettings.iDraw++;
1429
+ }
1430
+ else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
1431
+ {
1432
+ return;
1433
+ }
1434
+
1435
+ if ( oSettings.aiDisplay.length !== 0 )
1436
+ {
1437
+ var iStart = oSettings._iDisplayStart;
1438
+ var iEnd = oSettings._iDisplayEnd;
1439
+
1440
+ if ( oSettings.oFeatures.bServerSide )
1441
+ {
1442
+ iStart = 0;
1443
+ iEnd = oSettings.aoData.length;
1444
+ }
1445
+
1446
+ for ( var j=iStart ; j<iEnd ; j++ )
1447
+ {
1448
+ var aoData = oSettings.aoData[ oSettings.aiDisplay[j] ];
1449
+ if ( aoData.nTr === null )
1450
+ {
1451
+ _fnCreateTr( oSettings, oSettings.aiDisplay[j] );
1452
+ }
1453
+
1454
+ var nRow = aoData.nTr;
1455
+
1456
+ /* Remove the old striping classes and then add the new one */
1457
+ if ( iStripes !== 0 )
1458
+ {
1459
+ var sStripe = oSettings.asStripeClasses[ iRowCount % iStripes ];
1460
+ if ( aoData._sRowStripe != sStripe )
1461
+ {
1462
+ $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
1463
+ aoData._sRowStripe = sStripe;
1464
+ }
1465
+ }
1466
+
1467
+ /* Row callback functions - might want to manipulate the row */
1468
+ _fnCallbackFire( oSettings, 'aoRowCallback', null,
1469
+ [nRow, oSettings.aoData[ oSettings.aiDisplay[j] ]._aData, iRowCount, j] );
1470
+
1471
+ anRows.push( nRow );
1472
+ iRowCount++;
1473
+
1474
+ /* If there is an open row - and it is attached to this parent - attach it on redraw */
1475
+ if ( iOpenRows !== 0 )
1476
+ {
1477
+ for ( var k=0 ; k<iOpenRows ; k++ )
1478
+ {
1479
+ if ( nRow == oSettings.aoOpenRows[k].nParent )
1480
+ {
1481
+ anRows.push( oSettings.aoOpenRows[k].nTr );
1482
+ break;
1483
+ }
1484
+ }
1485
+ }
1486
+ }
1487
+ }
1488
+ else
1489
+ {
1490
+ /* Table is empty - create a row with an empty message in it */
1491
+ anRows[ 0 ] = document.createElement( 'tr' );
1492
+
1493
+ if ( oSettings.asStripeClasses[0] )
1494
+ {
1495
+ anRows[ 0 ].className = oSettings.asStripeClasses[0];
1496
+ }
1497
+
1498
+ var oLang = oSettings.oLanguage;
1499
+ var sZero = oLang.sZeroRecords;
1500
+ if ( oSettings.iDraw == 1 && oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
1501
+ {
1502
+ sZero = oLang.sLoadingRecords;
1503
+ }
1504
+ else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
1505
+ {
1506
+ sZero = oLang.sEmptyTable;
1507
+ }
1508
+
1509
+ var nTd = document.createElement( 'td' );
1510
+ nTd.setAttribute( 'valign', "top" );
1511
+ nTd.colSpan = _fnVisbleColumns( oSettings );
1512
+ nTd.className = oSettings.oClasses.sRowEmpty;
1513
+ nTd.innerHTML = _fnInfoMacros( oSettings, sZero );
1514
+
1515
+ anRows[ iRowCount ].appendChild( nTd );
1516
+ }
1517
+
1518
+ /* Header and footer callbacks */
1519
+ _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
1520
+ _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
1521
+
1522
+ _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
1523
+ _fnGetDataMaster( oSettings ), oSettings._iDisplayStart, oSettings.fnDisplayEnd(), oSettings.aiDisplay ] );
1524
+
1525
+ /*
1526
+ * Need to remove any old row from the display - note we can't just empty the tbody using
1527
+ * $().html('') since this will unbind the jQuery event handlers (even although the node
1528
+ * still exists!) - equally we can't use innerHTML, since IE throws an exception.
1529
+ */
1530
+ var
1531
+ nAddFrag = document.createDocumentFragment(),
1532
+ nRemoveFrag = document.createDocumentFragment(),
1533
+ nBodyPar, nTrs;
1534
+
1535
+ if ( oSettings.nTBody )
1536
+ {
1537
+ nBodyPar = oSettings.nTBody.parentNode;
1538
+ nRemoveFrag.appendChild( oSettings.nTBody );
1539
+
1540
+ /* When doing infinite scrolling, only remove child rows when sorting, filtering or start
1541
+ * up. When not infinite scroll, always do it.
1542
+ */
1543
+ if ( !oSettings.oScroll.bInfinite || !oSettings._bInitComplete ||
1544
+ oSettings.bSorted || oSettings.bFiltered )
1545
+ {
1546
+ while( (n = oSettings.nTBody.firstChild) )
1547
+ {
1548
+ oSettings.nTBody.removeChild( n );
1549
+ }
1550
+ }
1551
+
1552
+ /* Put the draw table into the dom */
1553
+ for ( i=0, iLen=anRows.length ; i<iLen ; i++ )
1554
+ {
1555
+ nAddFrag.appendChild( anRows[i] );
1556
+ }
1557
+
1558
+ oSettings.nTBody.appendChild( nAddFrag );
1559
+ if ( nBodyPar !== null )
1560
+ {
1561
+ nBodyPar.appendChild( oSettings.nTBody );
1562
+ }
1563
+ }
1564
+
1565
+ /* Call all required callback functions for the end of a draw */
1566
+ _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
1567
+
1568
+ /* Draw is complete, sorting and filtering must be as well */
1569
+ oSettings.bSorted = false;
1570
+ oSettings.bFiltered = false;
1571
+ oSettings.bDrawing = false;
1572
+
1573
+ if ( oSettings.oFeatures.bServerSide )
1574
+ {
1575
+ _fnProcessingDisplay( oSettings, false );
1576
+ if ( !oSettings._bInitComplete )
1577
+ {
1578
+ _fnInitComplete( oSettings );
1579
+ }
1580
+ }
1581
+ }
1582
+
1583
+
1584
+ /**
1585
+ * Redraw the table - taking account of the various features which are enabled
1586
+ * @param {object} oSettings dataTables settings object
1587
+ * @memberof DataTable#oApi
1588
+ */
1589
+ function _fnReDraw( oSettings )
1590
+ {
1591
+ if ( oSettings.oFeatures.bSort )
1592
+ {
1593
+ /* Sorting will refilter and draw for us */
1594
+ _fnSort( oSettings, oSettings.oPreviousSearch );
1595
+ }
1596
+ else if ( oSettings.oFeatures.bFilter )
1597
+ {
1598
+ /* Filtering will redraw for us */
1599
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
1600
+ }
1601
+ else
1602
+ {
1603
+ _fnCalculateEnd( oSettings );
1604
+ _fnDraw( oSettings );
1605
+ }
1606
+ }
1607
+
1608
+
1609
+ /**
1610
+ * Add the options to the page HTML for the table
1611
+ * @param {object} oSettings dataTables settings object
1612
+ * @memberof DataTable#oApi
1613
+ */
1614
+ function _fnAddOptionsHtml ( oSettings )
1615
+ {
1616
+ /*
1617
+ * Create a temporary, empty, div which we can later on replace with what we have generated
1618
+ * we do it this way to rendering the 'options' html offline - speed :-)
1619
+ */
1620
+ var nHolding = $('<div></div>')[0];
1621
+ oSettings.nTable.parentNode.insertBefore( nHolding, oSettings.nTable );
1622
+
1623
+ /*
1624
+ * All DataTables are wrapped in a div
1625
+ */
1626
+ oSettings.nTableWrapper = $('<div id="'+oSettings.sTableId+'_wrapper" class="'+oSettings.oClasses.sWrapper+'" role="grid"></div>')[0];
1627
+ oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
1628
+
1629
+ /* Track where we want to insert the option */
1630
+ var nInsertNode = oSettings.nTableWrapper;
1631
+
1632
+ /* Loop over the user set positioning and place the elements as needed */
1633
+ var aDom = oSettings.sDom.split('');
1634
+ var nTmp, iPushFeature, cOption, nNewNode, cNext, sAttr, j;
1635
+ for ( var i=0 ; i<aDom.length ; i++ )
1636
+ {
1637
+ iPushFeature = 0;
1638
+ cOption = aDom[i];
1639
+
1640
+ if ( cOption == '<' )
1641
+ {
1642
+ /* New container div */
1643
+ nNewNode = $('<div></div>')[0];
1644
+
1645
+ /* Check to see if we should append an id and/or a class name to the container */
1646
+ cNext = aDom[i+1];
1647
+ if ( cNext == "'" || cNext == '"' )
1648
+ {
1649
+ sAttr = "";
1650
+ j = 2;
1651
+ while ( aDom[i+j] != cNext )
1652
+ {
1653
+ sAttr += aDom[i+j];
1654
+ j++;
1655
+ }
1656
+
1657
+ /* Replace jQuery UI constants */
1658
+ if ( sAttr == "H" )
1659
+ {
1660
+ sAttr = oSettings.oClasses.sJUIHeader;
1661
+ }
1662
+ else if ( sAttr == "F" )
1663
+ {
1664
+ sAttr = oSettings.oClasses.sJUIFooter;
1665
+ }
1666
+
1667
+ /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
1668
+ * breaks the string into parts and applies them as needed
1669
+ */
1670
+ if ( sAttr.indexOf('.') != -1 )
1671
+ {
1672
+ var aSplit = sAttr.split('.');
1673
+ nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
1674
+ nNewNode.className = aSplit[1];
1675
+ }
1676
+ else if ( sAttr.charAt(0) == "#" )
1677
+ {
1678
+ nNewNode.id = sAttr.substr(1, sAttr.length-1);
1679
+ }
1680
+ else
1681
+ {
1682
+ nNewNode.className = sAttr;
1683
+ }
1684
+
1685
+ i += j; /* Move along the position array */
1686
+ }
1687
+
1688
+ nInsertNode.appendChild( nNewNode );
1689
+ nInsertNode = nNewNode;
1690
+ }
1691
+ else if ( cOption == '>' )
1692
+ {
1693
+ /* End container div */
1694
+ nInsertNode = nInsertNode.parentNode;
1695
+ }
1696
+ else if ( cOption == 'l' && oSettings.oFeatures.bPaginate && oSettings.oFeatures.bLengthChange )
1697
+ {
1698
+ /* Length */
1699
+ nTmp = _fnFeatureHtmlLength( oSettings );
1700
+ iPushFeature = 1;
1701
+ }
1702
+ else if ( cOption == 'f' && oSettings.oFeatures.bFilter )
1703
+ {
1704
+ /* Filter */
1705
+ nTmp = _fnFeatureHtmlFilter( oSettings );
1706
+ iPushFeature = 1;
1707
+ }
1708
+ else if ( cOption == 'r' && oSettings.oFeatures.bProcessing )
1709
+ {
1710
+ /* pRocessing */
1711
+ nTmp = _fnFeatureHtmlProcessing( oSettings );
1712
+ iPushFeature = 1;
1713
+ }
1714
+ else if ( cOption == 't' )
1715
+ {
1716
+ /* Table */
1717
+ nTmp = _fnFeatureHtmlTable( oSettings );
1718
+ iPushFeature = 1;
1719
+ }
1720
+ else if ( cOption == 'i' && oSettings.oFeatures.bInfo )
1721
+ {
1722
+ /* Info */
1723
+ nTmp = _fnFeatureHtmlInfo( oSettings );
1724
+ iPushFeature = 1;
1725
+ }
1726
+ else if ( cOption == 'p' && oSettings.oFeatures.bPaginate )
1727
+ {
1728
+ /* Pagination */
1729
+ nTmp = _fnFeatureHtmlPaginate( oSettings );
1730
+ iPushFeature = 1;
1731
+ }
1732
+ else if ( DataTable.ext.aoFeatures.length !== 0 )
1733
+ {
1734
+ /* Plug-in features */
1735
+ var aoFeatures = DataTable.ext.aoFeatures;
1736
+ for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
1737
+ {
1738
+ if ( cOption == aoFeatures[k].cFeature )
1739
+ {
1740
+ nTmp = aoFeatures[k].fnInit( oSettings );
1741
+ if ( nTmp )
1742
+ {
1743
+ iPushFeature = 1;
1744
+ }
1745
+ break;
1746
+ }
1747
+ }
1748
+ }
1749
+
1750
+ /* Add to the 2D features array */
1751
+ if ( iPushFeature == 1 && nTmp !== null )
1752
+ {
1753
+ if ( typeof oSettings.aanFeatures[cOption] !== 'object' )
1754
+ {
1755
+ oSettings.aanFeatures[cOption] = [];
1756
+ }
1757
+ oSettings.aanFeatures[cOption].push( nTmp );
1758
+ nInsertNode.appendChild( nTmp );
1759
+ }
1760
+ }
1761
+
1762
+ /* Built our DOM structure - replace the holding div with what we want */
1763
+ nHolding.parentNode.replaceChild( oSettings.nTableWrapper, nHolding );
1764
+ }
1765
+
1766
+
1767
+ /**
1768
+ * Use the DOM source to create up an array of header cells. The idea here is to
1769
+ * create a layout grid (array) of rows x columns, which contains a reference
1770
+ * to the cell that that point in the grid (regardless of col/rowspan), such that
1771
+ * any column / row could be removed and the new grid constructed
1772
+ * @param array {object} aLayout Array to store the calculated layout in
1773
+ * @param {node} nThead The header/footer element for the table
1774
+ * @memberof DataTable#oApi
1775
+ */
1776
+ function _fnDetectHeader ( aLayout, nThead )
1777
+ {
1778
+ var nTrs = $(nThead).children('tr');
1779
+ var nTr, nCell;
1780
+ var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
1781
+ var bUnique;
1782
+ var fnShiftCol = function ( a, i, j ) {
1783
+ var k = a[i];
1784
+ while ( k[j] ) {
1785
+ j++;
1786
+ }
1787
+ return j;
1788
+ };
1789
+
1790
+ aLayout.splice( 0, aLayout.length );
1791
+
1792
+ /* We know how many rows there are in the layout - so prep it */
1793
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1794
+ {
1795
+ aLayout.push( [] );
1796
+ }
1797
+
1798
+ /* Calculate a layout array */
1799
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
1800
+ {
1801
+ nTr = nTrs[i];
1802
+ iColumn = 0;
1803
+
1804
+ /* For every cell in the row... */
1805
+ nCell = nTr.firstChild;
1806
+ while ( nCell ) {
1807
+ if ( nCell.nodeName.toUpperCase() == "TD" ||
1808
+ nCell.nodeName.toUpperCase() == "TH" )
1809
+ {
1810
+ /* Get the col and rowspan attributes from the DOM and sanitise them */
1811
+ iColspan = nCell.getAttribute('colspan') * 1;
1812
+ iRowspan = nCell.getAttribute('rowspan') * 1;
1813
+ iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
1814
+ iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
1815
+
1816
+ /* There might be colspan cells already in this row, so shift our target
1817
+ * accordingly
1818
+ */
1819
+ iColShifted = fnShiftCol( aLayout, i, iColumn );
1820
+
1821
+ /* Cache calculation for unique columns */
1822
+ bUnique = iColspan === 1 ? true : false;
1823
+
1824
+ /* If there is col / rowspan, copy the information into the layout grid */
1825
+ for ( l=0 ; l<iColspan ; l++ )
1826
+ {
1827
+ for ( k=0 ; k<iRowspan ; k++ )
1828
+ {
1829
+ aLayout[i+k][iColShifted+l] = {
1830
+ "cell": nCell,
1831
+ "unique": bUnique
1832
+ };
1833
+ aLayout[i+k].nTr = nTr;
1834
+ }
1835
+ }
1836
+ }
1837
+ nCell = nCell.nextSibling;
1838
+ }
1839
+ }
1840
+ }
1841
+
1842
+
1843
+ /**
1844
+ * Get an array of unique th elements, one for each column
1845
+ * @param {object} oSettings dataTables settings object
1846
+ * @param {node} nHeader automatically detect the layout from this node - optional
1847
+ * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
1848
+ * @returns array {node} aReturn list of unique th's
1849
+ * @memberof DataTable#oApi
1850
+ */
1851
+ function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
1852
+ {
1853
+ var aReturn = [];
1854
+ if ( !aLayout )
1855
+ {
1856
+ aLayout = oSettings.aoHeader;
1857
+ if ( nHeader )
1858
+ {
1859
+ aLayout = [];
1860
+ _fnDetectHeader( aLayout, nHeader );
1861
+ }
1862
+ }
1863
+
1864
+ for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
1865
+ {
1866
+ for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
1867
+ {
1868
+ if ( aLayout[i][j].unique &&
1869
+ (!aReturn[j] || !oSettings.bSortCellsTop) )
1870
+ {
1871
+ aReturn[j] = aLayout[i][j].cell;
1872
+ }
1873
+ }
1874
+ }
1875
+
1876
+ return aReturn;
1877
+ }
1878
+
1879
+
1880
+
1881
+ /**
1882
+ * Update the table using an Ajax call
1883
+ * @param {object} oSettings dataTables settings object
1884
+ * @returns {boolean} Block the table drawing or not
1885
+ * @memberof DataTable#oApi
1886
+ */
1887
+ function _fnAjaxUpdate( oSettings )
1888
+ {
1889
+ if ( oSettings.bAjaxDataGet )
1890
+ {
1891
+ oSettings.iDraw++;
1892
+ _fnProcessingDisplay( oSettings, true );
1893
+ var iColumns = oSettings.aoColumns.length;
1894
+ var aoData = _fnAjaxParameters( oSettings );
1895
+ _fnServerParams( oSettings, aoData );
1896
+
1897
+ oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData,
1898
+ function(json) {
1899
+ _fnAjaxUpdateDraw( oSettings, json );
1900
+ }, oSettings );
1901
+ return false;
1902
+ }
1903
+ else
1904
+ {
1905
+ return true;
1906
+ }
1907
+ }
1908
+
1909
+
1910
+ /**
1911
+ * Build up the parameters in an object needed for a server-side processing request
1912
+ * @param {object} oSettings dataTables settings object
1913
+ * @returns {bool} block the table drawing or not
1914
+ * @memberof DataTable#oApi
1915
+ */
1916
+ function _fnAjaxParameters( oSettings )
1917
+ {
1918
+ var iColumns = oSettings.aoColumns.length;
1919
+ var aoData = [], mDataProp, aaSort, aDataSort;
1920
+ var i, j;
1921
+
1922
+ aoData.push( { "name": "sEcho", "value": oSettings.iDraw } );
1923
+ aoData.push( { "name": "iColumns", "value": iColumns } );
1924
+ aoData.push( { "name": "sColumns", "value": _fnColumnOrdering(oSettings) } );
1925
+ aoData.push( { "name": "iDisplayStart", "value": oSettings._iDisplayStart } );
1926
+ aoData.push( { "name": "iDisplayLength", "value": oSettings.oFeatures.bPaginate !== false ?
1927
+ oSettings._iDisplayLength : -1 } );
1928
+
1929
+ for ( i=0 ; i<iColumns ; i++ )
1930
+ {
1931
+ mDataProp = oSettings.aoColumns[i].mData;
1932
+ aoData.push( { "name": "mDataProp_"+i, "value": typeof(mDataProp)==="function" ? 'function' : mDataProp } );
1933
+ }
1934
+
1935
+ /* Filtering */
1936
+ if ( oSettings.oFeatures.bFilter !== false )
1937
+ {
1938
+ aoData.push( { "name": "sSearch", "value": oSettings.oPreviousSearch.sSearch } );
1939
+ aoData.push( { "name": "bRegex", "value": oSettings.oPreviousSearch.bRegex } );
1940
+ for ( i=0 ; i<iColumns ; i++ )
1941
+ {
1942
+ aoData.push( { "name": "sSearch_"+i, "value": oSettings.aoPreSearchCols[i].sSearch } );
1943
+ aoData.push( { "name": "bRegex_"+i, "value": oSettings.aoPreSearchCols[i].bRegex } );
1944
+ aoData.push( { "name": "bSearchable_"+i, "value": oSettings.aoColumns[i].bSearchable } );
1945
+ }
1946
+ }
1947
+
1948
+ /* Sorting */
1949
+ if ( oSettings.oFeatures.bSort !== false )
1950
+ {
1951
+ var iCounter = 0;
1952
+
1953
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
1954
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
1955
+ oSettings.aaSorting.slice();
1956
+
1957
+ for ( i=0 ; i<aaSort.length ; i++ )
1958
+ {
1959
+ aDataSort = oSettings.aoColumns[ aaSort[i][0] ].aDataSort;
1960
+
1961
+ for ( j=0 ; j<aDataSort.length ; j++ )
1962
+ {
1963
+ aoData.push( { "name": "iSortCol_"+iCounter, "value": aDataSort[j] } );
1964
+ aoData.push( { "name": "sSortDir_"+iCounter, "value": aaSort[i][1] } );
1965
+ iCounter++;
1966
+ }
1967
+ }
1968
+ aoData.push( { "name": "iSortingCols", "value": iCounter } );
1969
+
1970
+ for ( i=0 ; i<iColumns ; i++ )
1971
+ {
1972
+ aoData.push( { "name": "bSortable_"+i, "value": oSettings.aoColumns[i].bSortable } );
1973
+ }
1974
+ }
1975
+
1976
+ return aoData;
1977
+ }
1978
+
1979
+
1980
+ /**
1981
+ * Add Ajax parameters from plug-ins
1982
+ * @param {object} oSettings dataTables settings object
1983
+ * @param array {objects} aoData name/value pairs to send to the server
1984
+ * @memberof DataTable#oApi
1985
+ */
1986
+ function _fnServerParams( oSettings, aoData )
1987
+ {
1988
+ _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [aoData] );
1989
+ }
1990
+
1991
+
1992
+ /**
1993
+ * Data the data from the server (nuking the old) and redraw the table
1994
+ * @param {object} oSettings dataTables settings object
1995
+ * @param {object} json json data return from the server.
1996
+ * @param {string} json.sEcho Tracking flag for DataTables to match requests
1997
+ * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
1998
+ * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
1999
+ * @param {array} json.aaData The data to display on this page
2000
+ * @param {string} [json.sColumns] Column ordering (sName, comma separated)
2001
+ * @memberof DataTable#oApi
2002
+ */
2003
+ function _fnAjaxUpdateDraw ( oSettings, json )
2004
+ {
2005
+ if ( json.sEcho !== undefined )
2006
+ {
2007
+ /* Protect against old returns over-writing a new one. Possible when you get
2008
+ * very fast interaction, and later queries are completed much faster
2009
+ */
2010
+ if ( json.sEcho*1 < oSettings.iDraw )
2011
+ {
2012
+ return;
2013
+ }
2014
+ else
2015
+ {
2016
+ oSettings.iDraw = json.sEcho * 1;
2017
+ }
2018
+ }
2019
+
2020
+ if ( !oSettings.oScroll.bInfinite ||
2021
+ (oSettings.oScroll.bInfinite && (oSettings.bSorted || oSettings.bFiltered)) )
2022
+ {
2023
+ _fnClearTable( oSettings );
2024
+ }
2025
+ oSettings._iRecordsTotal = parseInt(json.iTotalRecords, 10);
2026
+ oSettings._iRecordsDisplay = parseInt(json.iTotalDisplayRecords, 10);
2027
+
2028
+ /* Determine if reordering is required */
2029
+ var sOrdering = _fnColumnOrdering(oSettings);
2030
+ var bReOrder = (json.sColumns !== undefined && sOrdering !== "" && json.sColumns != sOrdering );
2031
+ var aiIndex;
2032
+ if ( bReOrder )
2033
+ {
2034
+ aiIndex = _fnReOrderIndex( oSettings, json.sColumns );
2035
+ }
2036
+
2037
+ var aData = _fnGetObjectDataFn( oSettings.sAjaxDataProp )( json );
2038
+ for ( var i=0, iLen=aData.length ; i<iLen ; i++ )
2039
+ {
2040
+ if ( bReOrder )
2041
+ {
2042
+ /* If we need to re-order, then create a new array with the correct order and add it */
2043
+ var aDataSorted = [];
2044
+ for ( var j=0, jLen=oSettings.aoColumns.length ; j<jLen ; j++ )
2045
+ {
2046
+ aDataSorted.push( aData[i][ aiIndex[j] ] );
2047
+ }
2048
+ _fnAddData( oSettings, aDataSorted );
2049
+ }
2050
+ else
2051
+ {
2052
+ /* No re-order required, sever got it "right" - just straight add */
2053
+ _fnAddData( oSettings, aData[i] );
2054
+ }
2055
+ }
2056
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2057
+
2058
+ oSettings.bAjaxDataGet = false;
2059
+ _fnDraw( oSettings );
2060
+ oSettings.bAjaxDataGet = true;
2061
+ _fnProcessingDisplay( oSettings, false );
2062
+ }
2063
+
2064
+
2065
+
2066
+ /**
2067
+ * Generate the node required for filtering text
2068
+ * @returns {node} Filter control element
2069
+ * @param {object} oSettings dataTables settings object
2070
+ * @memberof DataTable#oApi
2071
+ */
2072
+ function _fnFeatureHtmlFilter ( oSettings )
2073
+ {
2074
+ var oPreviousSearch = oSettings.oPreviousSearch;
2075
+
2076
+ var sSearchStr = oSettings.oLanguage.sSearch;
2077
+ sSearchStr = (sSearchStr.indexOf('_INPUT_') !== -1) ?
2078
+ sSearchStr.replace('_INPUT_', '<input type="text" />') :
2079
+ sSearchStr==="" ? '<input type="text" />' : sSearchStr+' <input type="text" />';
2080
+
2081
+ var nFilter = document.createElement( 'div' );
2082
+ nFilter.className = oSettings.oClasses.sFilter;
2083
+ nFilter.innerHTML = '<label>'+sSearchStr+'</label>';
2084
+ if ( !oSettings.aanFeatures.f )
2085
+ {
2086
+ nFilter.id = oSettings.sTableId+'_filter';
2087
+ }
2088
+
2089
+ var jqFilter = $('input[type="text"]', nFilter);
2090
+
2091
+ // Store a reference to the input element, so other input elements could be
2092
+ // added to the filter wrapper if needed (submit button for example)
2093
+ nFilter._DT_Input = jqFilter[0];
2094
+
2095
+ jqFilter.val( oPreviousSearch.sSearch.replace('"','&quot;') );
2096
+ jqFilter.bind( 'keyup.DT', function(e) {
2097
+ /* Update all other filter input elements for the new display */
2098
+ var n = oSettings.aanFeatures.f;
2099
+ var val = this.value==="" ? "" : this.value; // mental IE8 fix :-(
2100
+
2101
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
2102
+ {
2103
+ if ( n[i] != $(this).parents('div.dataTables_filter')[0] )
2104
+ {
2105
+ $(n[i]._DT_Input).val( val );
2106
+ }
2107
+ }
2108
+
2109
+ /* Now do the filter */
2110
+ if ( val != oPreviousSearch.sSearch )
2111
+ {
2112
+ _fnFilterComplete( oSettings, {
2113
+ "sSearch": val,
2114
+ "bRegex": oPreviousSearch.bRegex,
2115
+ "bSmart": oPreviousSearch.bSmart ,
2116
+ "bCaseInsensitive": oPreviousSearch.bCaseInsensitive
2117
+ } );
2118
+ }
2119
+ } );
2120
+
2121
+ jqFilter
2122
+ .attr('aria-controls', oSettings.sTableId)
2123
+ .bind( 'keypress.DT', function(e) {
2124
+ /* Prevent form submission */
2125
+ if ( e.keyCode == 13 )
2126
+ {
2127
+ return false;
2128
+ }
2129
+ }
2130
+ );
2131
+
2132
+ return nFilter;
2133
+ }
2134
+
2135
+
2136
+ /**
2137
+ * Filter the table using both the global filter and column based filtering
2138
+ * @param {object} oSettings dataTables settings object
2139
+ * @param {object} oSearch search information
2140
+ * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
2141
+ * @memberof DataTable#oApi
2142
+ */
2143
+ function _fnFilterComplete ( oSettings, oInput, iForce )
2144
+ {
2145
+ var oPrevSearch = oSettings.oPreviousSearch;
2146
+ var aoPrevSearch = oSettings.aoPreSearchCols;
2147
+ var fnSaveFilter = function ( oFilter ) {
2148
+ /* Save the filtering values */
2149
+ oPrevSearch.sSearch = oFilter.sSearch;
2150
+ oPrevSearch.bRegex = oFilter.bRegex;
2151
+ oPrevSearch.bSmart = oFilter.bSmart;
2152
+ oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
2153
+ };
2154
+
2155
+ /* In server-side processing all filtering is done by the server, so no point hanging around here */
2156
+ if ( !oSettings.oFeatures.bServerSide )
2157
+ {
2158
+ /* Global filter */
2159
+ _fnFilter( oSettings, oInput.sSearch, iForce, oInput.bRegex, oInput.bSmart, oInput.bCaseInsensitive );
2160
+ fnSaveFilter( oInput );
2161
+
2162
+ /* Now do the individual column filter */
2163
+ for ( var i=0 ; i<oSettings.aoPreSearchCols.length ; i++ )
2164
+ {
2165
+ _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, aoPrevSearch[i].bRegex,
2166
+ aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
2167
+ }
2168
+
2169
+ /* Custom filtering */
2170
+ _fnFilterCustom( oSettings );
2171
+ }
2172
+ else
2173
+ {
2174
+ fnSaveFilter( oInput );
2175
+ }
2176
+
2177
+ /* Tell the draw function we have been filtering */
2178
+ oSettings.bFiltered = true;
2179
+ $(oSettings.oInstance).trigger('filter', oSettings);
2180
+
2181
+ /* Redraw the table */
2182
+ oSettings._iDisplayStart = 0;
2183
+ _fnCalculateEnd( oSettings );
2184
+ _fnDraw( oSettings );
2185
+
2186
+ /* Rebuild search array 'offline' */
2187
+ _fnBuildSearchArray( oSettings, 0 );
2188
+ }
2189
+
2190
+
2191
+ /**
2192
+ * Apply custom filtering functions
2193
+ * @param {object} oSettings dataTables settings object
2194
+ * @memberof DataTable#oApi
2195
+ */
2196
+ function _fnFilterCustom( oSettings )
2197
+ {
2198
+ var afnFilters = DataTable.ext.afnFiltering;
2199
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2200
+
2201
+ for ( var i=0, iLen=afnFilters.length ; i<iLen ; i++ )
2202
+ {
2203
+ var iCorrector = 0;
2204
+ for ( var j=0, jLen=oSettings.aiDisplay.length ; j<jLen ; j++ )
2205
+ {
2206
+ var iDisIndex = oSettings.aiDisplay[j-iCorrector];
2207
+ var bTest = afnFilters[i](
2208
+ oSettings,
2209
+ _fnGetRowData( oSettings, iDisIndex, 'filter', aiFilterColumns ),
2210
+ iDisIndex
2211
+ );
2212
+
2213
+ /* Check if we should use this row based on the filtering function */
2214
+ if ( !bTest )
2215
+ {
2216
+ oSettings.aiDisplay.splice( j-iCorrector, 1 );
2217
+ iCorrector++;
2218
+ }
2219
+ }
2220
+ }
2221
+ }
2222
+
2223
+
2224
+ /**
2225
+ * Filter the table on a per-column basis
2226
+ * @param {object} oSettings dataTables settings object
2227
+ * @param {string} sInput string to filter on
2228
+ * @param {int} iColumn column to filter
2229
+ * @param {bool} bRegex treat search string as a regular expression or not
2230
+ * @param {bool} bSmart use smart filtering or not
2231
+ * @param {bool} bCaseInsensitive Do case insenstive matching or not
2232
+ * @memberof DataTable#oApi
2233
+ */
2234
+ function _fnFilterColumn ( oSettings, sInput, iColumn, bRegex, bSmart, bCaseInsensitive )
2235
+ {
2236
+ if ( sInput === "" )
2237
+ {
2238
+ return;
2239
+ }
2240
+
2241
+ var iIndexCorrector = 0;
2242
+ var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
2243
+
2244
+ for ( var i=oSettings.aiDisplay.length-1 ; i>=0 ; i-- )
2245
+ {
2246
+ var sData = _fnDataToSearch( _fnGetCellData( oSettings, oSettings.aiDisplay[i], iColumn, 'filter' ),
2247
+ oSettings.aoColumns[iColumn].sType );
2248
+ if ( ! rpSearch.test( sData ) )
2249
+ {
2250
+ oSettings.aiDisplay.splice( i, 1 );
2251
+ iIndexCorrector++;
2252
+ }
2253
+ }
2254
+ }
2255
+
2256
+
2257
+ /**
2258
+ * Filter the data table based on user input and draw the table
2259
+ * @param {object} oSettings dataTables settings object
2260
+ * @param {string} sInput string to filter on
2261
+ * @param {int} iForce optional - force a research of the master array (1) or not (undefined or 0)
2262
+ * @param {bool} bRegex treat as a regular expression or not
2263
+ * @param {bool} bSmart perform smart filtering or not
2264
+ * @param {bool} bCaseInsensitive Do case insenstive matching or not
2265
+ * @memberof DataTable#oApi
2266
+ */
2267
+ function _fnFilter( oSettings, sInput, iForce, bRegex, bSmart, bCaseInsensitive )
2268
+ {
2269
+ var i;
2270
+ var rpSearch = _fnFilterCreateSearch( sInput, bRegex, bSmart, bCaseInsensitive );
2271
+ var oPrevSearch = oSettings.oPreviousSearch;
2272
+
2273
+ /* Check if we are forcing or not - optional parameter */
2274
+ if ( !iForce )
2275
+ {
2276
+ iForce = 0;
2277
+ }
2278
+
2279
+ /* Need to take account of custom filtering functions - always filter */
2280
+ if ( DataTable.ext.afnFiltering.length !== 0 )
2281
+ {
2282
+ iForce = 1;
2283
+ }
2284
+
2285
+ /*
2286
+ * If the input is blank - we want the full data set
2287
+ */
2288
+ if ( sInput.length <= 0 )
2289
+ {
2290
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
2291
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2292
+ }
2293
+ else
2294
+ {
2295
+ /*
2296
+ * We are starting a new search or the new search string is smaller
2297
+ * then the old one (i.e. delete). Search from the master array
2298
+ */
2299
+ if ( oSettings.aiDisplay.length == oSettings.aiDisplayMaster.length ||
2300
+ oPrevSearch.sSearch.length > sInput.length || iForce == 1 ||
2301
+ sInput.indexOf(oPrevSearch.sSearch) !== 0 )
2302
+ {
2303
+ /* Nuke the old display array - we are going to rebuild it */
2304
+ oSettings.aiDisplay.splice( 0, oSettings.aiDisplay.length);
2305
+
2306
+ /* Force a rebuild of the search array */
2307
+ _fnBuildSearchArray( oSettings, 1 );
2308
+
2309
+ /* Search through all records to populate the search array
2310
+ * The the oSettings.aiDisplayMaster and asDataSearch arrays have 1 to 1
2311
+ * mapping
2312
+ */
2313
+ for ( i=0 ; i<oSettings.aiDisplayMaster.length ; i++ )
2314
+ {
2315
+ if ( rpSearch.test(oSettings.asDataSearch[i]) )
2316
+ {
2317
+ oSettings.aiDisplay.push( oSettings.aiDisplayMaster[i] );
2318
+ }
2319
+ }
2320
+ }
2321
+ else
2322
+ {
2323
+ /* Using old search array - refine it - do it this way for speed
2324
+ * Don't have to search the whole master array again
2325
+ */
2326
+ var iIndexCorrector = 0;
2327
+
2328
+ /* Search the current results */
2329
+ for ( i=0 ; i<oSettings.asDataSearch.length ; i++ )
2330
+ {
2331
+ if ( ! rpSearch.test(oSettings.asDataSearch[i]) )
2332
+ {
2333
+ oSettings.aiDisplay.splice( i-iIndexCorrector, 1 );
2334
+ iIndexCorrector++;
2335
+ }
2336
+ }
2337
+ }
2338
+ }
2339
+ }
2340
+
2341
+
2342
+ /**
2343
+ * Create an array which can be quickly search through
2344
+ * @param {object} oSettings dataTables settings object
2345
+ * @param {int} iMaster use the master data array - optional
2346
+ * @memberof DataTable#oApi
2347
+ */
2348
+ function _fnBuildSearchArray ( oSettings, iMaster )
2349
+ {
2350
+ if ( !oSettings.oFeatures.bServerSide )
2351
+ {
2352
+ /* Clear out the old data */
2353
+ oSettings.asDataSearch = [];
2354
+
2355
+ var aiFilterColumns = _fnGetColumns( oSettings, 'bSearchable' );
2356
+ var aiIndex = (iMaster===1) ?
2357
+ oSettings.aiDisplayMaster :
2358
+ oSettings.aiDisplay;
2359
+
2360
+ for ( var i=0, iLen=aiIndex.length ; i<iLen ; i++ )
2361
+ {
2362
+ oSettings.asDataSearch[i] = _fnBuildSearchRow(
2363
+ oSettings,
2364
+ _fnGetRowData( oSettings, aiIndex[i], 'filter', aiFilterColumns )
2365
+ );
2366
+ }
2367
+ }
2368
+ }
2369
+
2370
+
2371
+ /**
2372
+ * Create a searchable string from a single data row
2373
+ * @param {object} oSettings dataTables settings object
2374
+ * @param {array} aData Row data array to use for the data to search
2375
+ * @memberof DataTable#oApi
2376
+ */
2377
+ function _fnBuildSearchRow( oSettings, aData )
2378
+ {
2379
+ var sSearch = aData.join(' ');
2380
+
2381
+ /* If it looks like there is an HTML entity in the string, attempt to decode it */
2382
+ if ( sSearch.indexOf('&') !== -1 )
2383
+ {
2384
+ sSearch = $('<div>').html(sSearch).text();
2385
+ }
2386
+
2387
+ // Strip newline characters
2388
+ return sSearch.replace( /[\n\r]/g, " " );
2389
+ }
2390
+
2391
+ /**
2392
+ * Build a regular expression object suitable for searching a table
2393
+ * @param {string} sSearch string to search for
2394
+ * @param {bool} bRegex treat as a regular expression or not
2395
+ * @param {bool} bSmart perform smart filtering or not
2396
+ * @param {bool} bCaseInsensitive Do case insensitive matching or not
2397
+ * @returns {RegExp} constructed object
2398
+ * @memberof DataTable#oApi
2399
+ */
2400
+ function _fnFilterCreateSearch( sSearch, bRegex, bSmart, bCaseInsensitive )
2401
+ {
2402
+ var asSearch, sRegExpString;
2403
+
2404
+ if ( bSmart )
2405
+ {
2406
+ /* Generate the regular expression to use. Something along the lines of:
2407
+ * ^(?=.*?\bone\b)(?=.*?\btwo\b)(?=.*?\bthree\b).*$
2408
+ */
2409
+ asSearch = bRegex ? sSearch.split( ' ' ) : _fnEscapeRegex( sSearch ).split( ' ' );
2410
+ sRegExpString = '^(?=.*?'+asSearch.join( ')(?=.*?' )+').*$';
2411
+ return new RegExp( sRegExpString, bCaseInsensitive ? "i" : "" );
2412
+ }
2413
+ else
2414
+ {
2415
+ sSearch = bRegex ? sSearch : _fnEscapeRegex( sSearch );
2416
+ return new RegExp( sSearch, bCaseInsensitive ? "i" : "" );
2417
+ }
2418
+ }
2419
+
2420
+
2421
+ /**
2422
+ * Convert raw data into something that the user can search on
2423
+ * @param {string} sData data to be modified
2424
+ * @param {string} sType data type
2425
+ * @returns {string} search string
2426
+ * @memberof DataTable#oApi
2427
+ */
2428
+ function _fnDataToSearch ( sData, sType )
2429
+ {
2430
+ if ( typeof DataTable.ext.ofnSearch[sType] === "function" )
2431
+ {
2432
+ return DataTable.ext.ofnSearch[sType]( sData );
2433
+ }
2434
+ else if ( sData === null )
2435
+ {
2436
+ return '';
2437
+ }
2438
+ else if ( sType == "html" )
2439
+ {
2440
+ return sData.replace(/[\r\n]/g," ").replace( /<.*?>/g, "" );
2441
+ }
2442
+ else if ( typeof sData === "string" )
2443
+ {
2444
+ return sData.replace(/[\r\n]/g," ");
2445
+ }
2446
+ return sData;
2447
+ }
2448
+
2449
+
2450
+ /**
2451
+ * scape a string such that it can be used in a regular expression
2452
+ * @param {string} sVal string to escape
2453
+ * @returns {string} escaped string
2454
+ * @memberof DataTable#oApi
2455
+ */
2456
+ function _fnEscapeRegex ( sVal )
2457
+ {
2458
+ var acEscape = [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ];
2459
+ var reReplace = new RegExp( '(\\' + acEscape.join('|\\') + ')', 'g' );
2460
+ return sVal.replace(reReplace, '\\$1');
2461
+ }
2462
+
2463
+
2464
+ /**
2465
+ * Generate the node required for the info display
2466
+ * @param {object} oSettings dataTables settings object
2467
+ * @returns {node} Information element
2468
+ * @memberof DataTable#oApi
2469
+ */
2470
+ function _fnFeatureHtmlInfo ( oSettings )
2471
+ {
2472
+ var nInfo = document.createElement( 'div' );
2473
+ nInfo.className = oSettings.oClasses.sInfo;
2474
+
2475
+ /* Actions that are to be taken once only for this feature */
2476
+ if ( !oSettings.aanFeatures.i )
2477
+ {
2478
+ /* Add draw callback */
2479
+ oSettings.aoDrawCallback.push( {
2480
+ "fn": _fnUpdateInfo,
2481
+ "sName": "information"
2482
+ } );
2483
+
2484
+ /* Add id */
2485
+ nInfo.id = oSettings.sTableId+'_info';
2486
+ }
2487
+ oSettings.nTable.setAttribute( 'aria-describedby', oSettings.sTableId+'_info' );
2488
+
2489
+ return nInfo;
2490
+ }
2491
+
2492
+
2493
+ /**
2494
+ * Update the information elements in the display
2495
+ * @param {object} oSettings dataTables settings object
2496
+ * @memberof DataTable#oApi
2497
+ */
2498
+ function _fnUpdateInfo ( oSettings )
2499
+ {
2500
+ /* Show information about the table */
2501
+ if ( !oSettings.oFeatures.bInfo || oSettings.aanFeatures.i.length === 0 )
2502
+ {
2503
+ return;
2504
+ }
2505
+
2506
+ var
2507
+ oLang = oSettings.oLanguage,
2508
+ iStart = oSettings._iDisplayStart+1,
2509
+ iEnd = oSettings.fnDisplayEnd(),
2510
+ iMax = oSettings.fnRecordsTotal(),
2511
+ iTotal = oSettings.fnRecordsDisplay(),
2512
+ sOut;
2513
+
2514
+ if ( iTotal === 0 )
2515
+ {
2516
+ /* Empty record set */
2517
+ sOut = oLang.sInfoEmpty;
2518
+ }
2519
+ else {
2520
+ /* Normal record set */
2521
+ sOut = oLang.sInfo;
2522
+ }
2523
+
2524
+ if ( iTotal != iMax )
2525
+ {
2526
+ /* Record set after filtering */
2527
+ sOut += ' ' + oLang.sInfoFiltered;
2528
+ }
2529
+
2530
+ // Convert the macros
2531
+ sOut += oLang.sInfoPostFix;
2532
+ sOut = _fnInfoMacros( oSettings, sOut );
2533
+
2534
+ if ( oLang.fnInfoCallback !== null )
2535
+ {
2536
+ sOut = oLang.fnInfoCallback.call( oSettings.oInstance,
2537
+ oSettings, iStart, iEnd, iMax, iTotal, sOut );
2538
+ }
2539
+
2540
+ var n = oSettings.aanFeatures.i;
2541
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
2542
+ {
2543
+ $(n[i]).html( sOut );
2544
+ }
2545
+ }
2546
+
2547
+
2548
+ function _fnInfoMacros ( oSettings, str )
2549
+ {
2550
+ var
2551
+ iStart = oSettings._iDisplayStart+1,
2552
+ sStart = oSettings.fnFormatNumber( iStart ),
2553
+ iEnd = oSettings.fnDisplayEnd(),
2554
+ sEnd = oSettings.fnFormatNumber( iEnd ),
2555
+ iTotal = oSettings.fnRecordsDisplay(),
2556
+ sTotal = oSettings.fnFormatNumber( iTotal ),
2557
+ iMax = oSettings.fnRecordsTotal(),
2558
+ sMax = oSettings.fnFormatNumber( iMax );
2559
+
2560
+ // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
2561
+ // internally
2562
+ if ( oSettings.oScroll.bInfinite )
2563
+ {
2564
+ sStart = oSettings.fnFormatNumber( 1 );
2565
+ }
2566
+
2567
+ return str.
2568
+ replace(/_START_/g, sStart).
2569
+ replace(/_END_/g, sEnd).
2570
+ replace(/_TOTAL_/g, sTotal).
2571
+ replace(/_MAX_/g, sMax);
2572
+ }
2573
+
2574
+
2575
+
2576
+ /**
2577
+ * Draw the table for the first time, adding all required features
2578
+ * @param {object} oSettings dataTables settings object
2579
+ * @memberof DataTable#oApi
2580
+ */
2581
+ function _fnInitialise ( oSettings )
2582
+ {
2583
+ var i, iLen, iAjaxStart=oSettings.iInitDisplayStart;
2584
+
2585
+ /* Ensure that the table data is fully initialised */
2586
+ if ( oSettings.bInitialised === false )
2587
+ {
2588
+ setTimeout( function(){ _fnInitialise( oSettings ); }, 200 );
2589
+ return;
2590
+ }
2591
+
2592
+ /* Show the display HTML options */
2593
+ _fnAddOptionsHtml( oSettings );
2594
+
2595
+ /* Build and draw the header / footer for the table */
2596
+ _fnBuildHead( oSettings );
2597
+ _fnDrawHead( oSettings, oSettings.aoHeader );
2598
+ if ( oSettings.nTFoot )
2599
+ {
2600
+ _fnDrawHead( oSettings, oSettings.aoFooter );
2601
+ }
2602
+
2603
+ /* Okay to show that something is going on now */
2604
+ _fnProcessingDisplay( oSettings, true );
2605
+
2606
+ /* Calculate sizes for columns */
2607
+ if ( oSettings.oFeatures.bAutoWidth )
2608
+ {
2609
+ _fnCalculateColumnWidths( oSettings );
2610
+ }
2611
+
2612
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
2613
+ {
2614
+ if ( oSettings.aoColumns[i].sWidth !== null )
2615
+ {
2616
+ oSettings.aoColumns[i].nTh.style.width = _fnStringToCss( oSettings.aoColumns[i].sWidth );
2617
+ }
2618
+ }
2619
+
2620
+ /* If there is default sorting required - let's do it. The sort function will do the
2621
+ * drawing for us. Otherwise we draw the table regardless of the Ajax source - this allows
2622
+ * the table to look initialised for Ajax sourcing data (show 'loading' message possibly)
2623
+ */
2624
+ if ( oSettings.oFeatures.bSort )
2625
+ {
2626
+ _fnSort( oSettings );
2627
+ }
2628
+ else if ( oSettings.oFeatures.bFilter )
2629
+ {
2630
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch );
2631
+ }
2632
+ else
2633
+ {
2634
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2635
+ _fnCalculateEnd( oSettings );
2636
+ _fnDraw( oSettings );
2637
+ }
2638
+
2639
+ /* if there is an ajax source load the data */
2640
+ if ( oSettings.sAjaxSource !== null && !oSettings.oFeatures.bServerSide )
2641
+ {
2642
+ var aoData = [];
2643
+ _fnServerParams( oSettings, aoData );
2644
+ oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aoData, function(json) {
2645
+ var aData = (oSettings.sAjaxDataProp !== "") ?
2646
+ _fnGetObjectDataFn( oSettings.sAjaxDataProp )(json) : json;
2647
+
2648
+ /* Got the data - add it to the table */
2649
+ for ( i=0 ; i<aData.length ; i++ )
2650
+ {
2651
+ _fnAddData( oSettings, aData[i] );
2652
+ }
2653
+
2654
+ /* Reset the init display for cookie saving. We've already done a filter, and
2655
+ * therefore cleared it before. So we need to make it appear 'fresh'
2656
+ */
2657
+ oSettings.iInitDisplayStart = iAjaxStart;
2658
+
2659
+ if ( oSettings.oFeatures.bSort )
2660
+ {
2661
+ _fnSort( oSettings );
2662
+ }
2663
+ else
2664
+ {
2665
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
2666
+ _fnCalculateEnd( oSettings );
2667
+ _fnDraw( oSettings );
2668
+ }
2669
+
2670
+ _fnProcessingDisplay( oSettings, false );
2671
+ _fnInitComplete( oSettings, json );
2672
+ }, oSettings );
2673
+ return;
2674
+ }
2675
+
2676
+ /* Server-side processing initialisation complete is done at the end of _fnDraw */
2677
+ if ( !oSettings.oFeatures.bServerSide )
2678
+ {
2679
+ _fnProcessingDisplay( oSettings, false );
2680
+ _fnInitComplete( oSettings );
2681
+ }
2682
+ }
2683
+
2684
+
2685
+ /**
2686
+ * Draw the table for the first time, adding all required features
2687
+ * @param {object} oSettings dataTables settings object
2688
+ * @param {object} [json] JSON from the server that completed the table, if using Ajax source
2689
+ * with client-side processing (optional)
2690
+ * @memberof DataTable#oApi
2691
+ */
2692
+ function _fnInitComplete ( oSettings, json )
2693
+ {
2694
+ oSettings._bInitComplete = true;
2695
+ _fnCallbackFire( oSettings, 'aoInitComplete', 'init', [oSettings, json] );
2696
+ }
2697
+
2698
+
2699
+ /**
2700
+ * Language compatibility - when certain options are given, and others aren't, we
2701
+ * need to duplicate the values over, in order to provide backwards compatibility
2702
+ * with older language files.
2703
+ * @param {object} oSettings dataTables settings object
2704
+ * @memberof DataTable#oApi
2705
+ */
2706
+ function _fnLanguageCompat( oLanguage )
2707
+ {
2708
+ var oDefaults = DataTable.defaults.oLanguage;
2709
+
2710
+ /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
2711
+ * sZeroRecords - assuming that is given.
2712
+ */
2713
+ if ( !oLanguage.sEmptyTable && oLanguage.sZeroRecords &&
2714
+ oDefaults.sEmptyTable === "No data available in table" )
2715
+ {
2716
+ _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sEmptyTable' );
2717
+ }
2718
+
2719
+ /* Likewise with loading records */
2720
+ if ( !oLanguage.sLoadingRecords && oLanguage.sZeroRecords &&
2721
+ oDefaults.sLoadingRecords === "Loading..." )
2722
+ {
2723
+ _fnMap( oLanguage, oLanguage, 'sZeroRecords', 'sLoadingRecords' );
2724
+ }
2725
+ }
2726
+
2727
+
2728
+
2729
+ /**
2730
+ * Generate the node required for user display length changing
2731
+ * @param {object} oSettings dataTables settings object
2732
+ * @returns {node} Display length feature node
2733
+ * @memberof DataTable#oApi
2734
+ */
2735
+ function _fnFeatureHtmlLength ( oSettings )
2736
+ {
2737
+ if ( oSettings.oScroll.bInfinite )
2738
+ {
2739
+ return null;
2740
+ }
2741
+
2742
+ /* This can be overruled by not using the _MENU_ var/macro in the language variable */
2743
+ var sName = 'name="'+oSettings.sTableId+'_length"';
2744
+ var sStdMenu = '<select size="1" '+sName+'>';
2745
+ var i, iLen;
2746
+ var aLengthMenu = oSettings.aLengthMenu;
2747
+
2748
+ if ( aLengthMenu.length == 2 && typeof aLengthMenu[0] === 'object' &&
2749
+ typeof aLengthMenu[1] === 'object' )
2750
+ {
2751
+ for ( i=0, iLen=aLengthMenu[0].length ; i<iLen ; i++ )
2752
+ {
2753
+ sStdMenu += '<option value="'+aLengthMenu[0][i]+'">'+aLengthMenu[1][i]+'</option>';
2754
+ }
2755
+ }
2756
+ else
2757
+ {
2758
+ for ( i=0, iLen=aLengthMenu.length ; i<iLen ; i++ )
2759
+ {
2760
+ sStdMenu += '<option value="'+aLengthMenu[i]+'">'+aLengthMenu[i]+'</option>';
2761
+ }
2762
+ }
2763
+ sStdMenu += '</select>';
2764
+
2765
+ var nLength = document.createElement( 'div' );
2766
+ if ( !oSettings.aanFeatures.l )
2767
+ {
2768
+ nLength.id = oSettings.sTableId+'_length';
2769
+ }
2770
+ nLength.className = oSettings.oClasses.sLength;
2771
+ nLength.innerHTML = '<label>'+oSettings.oLanguage.sLengthMenu.replace( '_MENU_', sStdMenu )+'</label>';
2772
+ /*
2773
+ * Set the length to the current display length - thanks to Andrea Pavlovic for this fix,
2774
+ * and Stefan Skopnik for fixing the fix!
2775
+ */
2776
+ $('select option[value="'+oSettings._iDisplayLength+'"]', nLength).attr("selected", true);
2777
+
2778
+ $('select', nLength).bind( 'change.DT', function(e) {
2779
+ var iVal = $(this).val();
2780
+
2781
+ /* Update all other length options for the new display */
2782
+ var n = oSettings.aanFeatures.l;
2783
+ for ( i=0, iLen=n.length ; i<iLen ; i++ )
2784
+ {
2785
+ if ( n[i] != this.parentNode )
2786
+ {
2787
+ $('select', n[i]).val( iVal );
2788
+ }
2789
+ }
2790
+
2791
+ /* Redraw the table */
2792
+ oSettings._iDisplayLength = parseInt(iVal, 10);
2793
+ _fnCalculateEnd( oSettings );
2794
+
2795
+ /* If we have space to show extra rows (backing up from the end point - then do so */
2796
+ if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() )
2797
+ {
2798
+ oSettings._iDisplayStart = oSettings.fnDisplayEnd() - oSettings._iDisplayLength;
2799
+ if ( oSettings._iDisplayStart < 0 )
2800
+ {
2801
+ oSettings._iDisplayStart = 0;
2802
+ }
2803
+ }
2804
+
2805
+ if ( oSettings._iDisplayLength == -1 )
2806
+ {
2807
+ oSettings._iDisplayStart = 0;
2808
+ }
2809
+
2810
+ _fnDraw( oSettings );
2811
+ } );
2812
+
2813
+
2814
+ $('select', nLength).attr('aria-controls', oSettings.sTableId);
2815
+
2816
+ return nLength;
2817
+ }
2818
+
2819
+
2820
+ /**
2821
+ * Recalculate the end point based on the start point
2822
+ * @param {object} oSettings dataTables settings object
2823
+ * @memberof DataTable#oApi
2824
+ */
2825
+ function _fnCalculateEnd( oSettings )
2826
+ {
2827
+ if ( oSettings.oFeatures.bPaginate === false )
2828
+ {
2829
+ oSettings._iDisplayEnd = oSettings.aiDisplay.length;
2830
+ }
2831
+ else
2832
+ {
2833
+ /* Set the end point of the display - based on how many elements there are
2834
+ * still to display
2835
+ */
2836
+ if ( oSettings._iDisplayStart + oSettings._iDisplayLength > oSettings.aiDisplay.length ||
2837
+ oSettings._iDisplayLength == -1 )
2838
+ {
2839
+ oSettings._iDisplayEnd = oSettings.aiDisplay.length;
2840
+ }
2841
+ else
2842
+ {
2843
+ oSettings._iDisplayEnd = oSettings._iDisplayStart + oSettings._iDisplayLength;
2844
+ }
2845
+ }
2846
+ }
2847
+
2848
+
2849
+
2850
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2851
+ * Note that most of the paging logic is done in
2852
+ * DataTable.ext.oPagination
2853
+ */
2854
+
2855
+ /**
2856
+ * Generate the node required for default pagination
2857
+ * @param {object} oSettings dataTables settings object
2858
+ * @returns {node} Pagination feature node
2859
+ * @memberof DataTable#oApi
2860
+ */
2861
+ function _fnFeatureHtmlPaginate ( oSettings )
2862
+ {
2863
+ if ( oSettings.oScroll.bInfinite )
2864
+ {
2865
+ return null;
2866
+ }
2867
+
2868
+ var nPaginate = document.createElement( 'div' );
2869
+ nPaginate.className = oSettings.oClasses.sPaging+oSettings.sPaginationType;
2870
+
2871
+ DataTable.ext.oPagination[ oSettings.sPaginationType ].fnInit( oSettings, nPaginate,
2872
+ function( oSettings ) {
2873
+ _fnCalculateEnd( oSettings );
2874
+ _fnDraw( oSettings );
2875
+ }
2876
+ );
2877
+
2878
+ /* Add a draw callback for the pagination on first instance, to update the paging display */
2879
+ if ( !oSettings.aanFeatures.p )
2880
+ {
2881
+ oSettings.aoDrawCallback.push( {
2882
+ "fn": function( oSettings ) {
2883
+ DataTable.ext.oPagination[ oSettings.sPaginationType ].fnUpdate( oSettings, function( oSettings ) {
2884
+ _fnCalculateEnd( oSettings );
2885
+ _fnDraw( oSettings );
2886
+ } );
2887
+ },
2888
+ "sName": "pagination"
2889
+ } );
2890
+ }
2891
+ return nPaginate;
2892
+ }
2893
+
2894
+
2895
+ /**
2896
+ * Alter the display settings to change the page
2897
+ * @param {object} oSettings dataTables settings object
2898
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
2899
+ * or page number to jump to (integer)
2900
+ * @returns {bool} true page has changed, false - no change (no effect) eg 'first' on page 1
2901
+ * @memberof DataTable#oApi
2902
+ */
2903
+ function _fnPageChange ( oSettings, mAction )
2904
+ {
2905
+ var iOldStart = oSettings._iDisplayStart;
2906
+
2907
+ if ( typeof mAction === "number" )
2908
+ {
2909
+ oSettings._iDisplayStart = mAction * oSettings._iDisplayLength;
2910
+ if ( oSettings._iDisplayStart > oSettings.fnRecordsDisplay() )
2911
+ {
2912
+ oSettings._iDisplayStart = 0;
2913
+ }
2914
+ }
2915
+ else if ( mAction == "first" )
2916
+ {
2917
+ oSettings._iDisplayStart = 0;
2918
+ }
2919
+ else if ( mAction == "previous" )
2920
+ {
2921
+ oSettings._iDisplayStart = oSettings._iDisplayLength>=0 ?
2922
+ oSettings._iDisplayStart - oSettings._iDisplayLength :
2923
+ 0;
2924
+
2925
+ /* Correct for under-run */
2926
+ if ( oSettings._iDisplayStart < 0 )
2927
+ {
2928
+ oSettings._iDisplayStart = 0;
2929
+ }
2930
+ }
2931
+ else if ( mAction == "next" )
2932
+ {
2933
+ if ( oSettings._iDisplayLength >= 0 )
2934
+ {
2935
+ /* Make sure we are not over running the display array */
2936
+ if ( oSettings._iDisplayStart + oSettings._iDisplayLength < oSettings.fnRecordsDisplay() )
2937
+ {
2938
+ oSettings._iDisplayStart += oSettings._iDisplayLength;
2939
+ }
2940
+ }
2941
+ else
2942
+ {
2943
+ oSettings._iDisplayStart = 0;
2944
+ }
2945
+ }
2946
+ else if ( mAction == "last" )
2947
+ {
2948
+ if ( oSettings._iDisplayLength >= 0 )
2949
+ {
2950
+ var iPages = parseInt( (oSettings.fnRecordsDisplay()-1) / oSettings._iDisplayLength, 10 ) + 1;
2951
+ oSettings._iDisplayStart = (iPages-1) * oSettings._iDisplayLength;
2952
+ }
2953
+ else
2954
+ {
2955
+ oSettings._iDisplayStart = 0;
2956
+ }
2957
+ }
2958
+ else
2959
+ {
2960
+ _fnLog( oSettings, 0, "Unknown paging action: "+mAction );
2961
+ }
2962
+ $(oSettings.oInstance).trigger('page', oSettings);
2963
+
2964
+ return iOldStart != oSettings._iDisplayStart;
2965
+ }
2966
+
2967
+
2968
+
2969
+ /**
2970
+ * Generate the node required for the processing node
2971
+ * @param {object} oSettings dataTables settings object
2972
+ * @returns {node} Processing element
2973
+ * @memberof DataTable#oApi
2974
+ */
2975
+ function _fnFeatureHtmlProcessing ( oSettings )
2976
+ {
2977
+ var nProcessing = document.createElement( 'div' );
2978
+
2979
+ if ( !oSettings.aanFeatures.r )
2980
+ {
2981
+ nProcessing.id = oSettings.sTableId+'_processing';
2982
+ }
2983
+ nProcessing.innerHTML = oSettings.oLanguage.sProcessing;
2984
+ nProcessing.className = oSettings.oClasses.sProcessing;
2985
+ oSettings.nTable.parentNode.insertBefore( nProcessing, oSettings.nTable );
2986
+
2987
+ return nProcessing;
2988
+ }
2989
+
2990
+
2991
+ /**
2992
+ * Display or hide the processing indicator
2993
+ * @param {object} oSettings dataTables settings object
2994
+ * @param {bool} bShow Show the processing indicator (true) or not (false)
2995
+ * @memberof DataTable#oApi
2996
+ */
2997
+ function _fnProcessingDisplay ( oSettings, bShow )
2998
+ {
2999
+ if ( oSettings.oFeatures.bProcessing )
3000
+ {
3001
+ var an = oSettings.aanFeatures.r;
3002
+ for ( var i=0, iLen=an.length ; i<iLen ; i++ )
3003
+ {
3004
+ an[i].style.visibility = bShow ? "visible" : "hidden";
3005
+ }
3006
+ }
3007
+
3008
+ $(oSettings.oInstance).trigger('processing', [oSettings, bShow]);
3009
+ }
3010
+
3011
+ /**
3012
+ * Add any control elements for the table - specifically scrolling
3013
+ * @param {object} oSettings dataTables settings object
3014
+ * @returns {node} Node to add to the DOM
3015
+ * @memberof DataTable#oApi
3016
+ */
3017
+ function _fnFeatureHtmlTable ( oSettings )
3018
+ {
3019
+ /* Check if scrolling is enabled or not - if not then leave the DOM unaltered */
3020
+ if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
3021
+ {
3022
+ return oSettings.nTable;
3023
+ }
3024
+
3025
+ /*
3026
+ * The HTML structure that we want to generate in this function is:
3027
+ * div - nScroller
3028
+ * div - nScrollHead
3029
+ * div - nScrollHeadInner
3030
+ * table - nScrollHeadTable
3031
+ * thead - nThead
3032
+ * div - nScrollBody
3033
+ * table - oSettings.nTable
3034
+ * thead - nTheadSize
3035
+ * tbody - nTbody
3036
+ * div - nScrollFoot
3037
+ * div - nScrollFootInner
3038
+ * table - nScrollFootTable
3039
+ * tfoot - nTfoot
3040
+ */
3041
+ var
3042
+ nScroller = document.createElement('div'),
3043
+ nScrollHead = document.createElement('div'),
3044
+ nScrollHeadInner = document.createElement('div'),
3045
+ nScrollBody = document.createElement('div'),
3046
+ nScrollFoot = document.createElement('div'),
3047
+ nScrollFootInner = document.createElement('div'),
3048
+ nScrollHeadTable = oSettings.nTable.cloneNode(false),
3049
+ nScrollFootTable = oSettings.nTable.cloneNode(false),
3050
+ nThead = oSettings.nTable.getElementsByTagName('thead')[0],
3051
+ nTfoot = oSettings.nTable.getElementsByTagName('tfoot').length === 0 ? null :
3052
+ oSettings.nTable.getElementsByTagName('tfoot')[0],
3053
+ oClasses = oSettings.oClasses;
3054
+
3055
+ nScrollHead.appendChild( nScrollHeadInner );
3056
+ nScrollFoot.appendChild( nScrollFootInner );
3057
+ nScrollBody.appendChild( oSettings.nTable );
3058
+ nScroller.appendChild( nScrollHead );
3059
+ nScroller.appendChild( nScrollBody );
3060
+ nScrollHeadInner.appendChild( nScrollHeadTable );
3061
+ nScrollHeadTable.appendChild( nThead );
3062
+ if ( nTfoot !== null )
3063
+ {
3064
+ nScroller.appendChild( nScrollFoot );
3065
+ nScrollFootInner.appendChild( nScrollFootTable );
3066
+ nScrollFootTable.appendChild( nTfoot );
3067
+ }
3068
+
3069
+ nScroller.className = oClasses.sScrollWrapper;
3070
+ nScrollHead.className = oClasses.sScrollHead;
3071
+ nScrollHeadInner.className = oClasses.sScrollHeadInner;
3072
+ nScrollBody.className = oClasses.sScrollBody;
3073
+ nScrollFoot.className = oClasses.sScrollFoot;
3074
+ nScrollFootInner.className = oClasses.sScrollFootInner;
3075
+
3076
+ if ( oSettings.oScroll.bAutoCss )
3077
+ {
3078
+ nScrollHead.style.overflow = "hidden";
3079
+ nScrollHead.style.position = "relative";
3080
+ nScrollFoot.style.overflow = "hidden";
3081
+ nScrollBody.style.overflow = "auto";
3082
+ }
3083
+
3084
+ nScrollHead.style.border = "0";
3085
+ nScrollHead.style.width = "100%";
3086
+ nScrollFoot.style.border = "0";
3087
+ nScrollHeadInner.style.width = oSettings.oScroll.sXInner !== "" ?
3088
+ oSettings.oScroll.sXInner : "100%"; /* will be overwritten */
3089
+
3090
+ /* Modify attributes to respect the clones */
3091
+ nScrollHeadTable.removeAttribute('id');
3092
+ nScrollHeadTable.style.marginLeft = "0";
3093
+ oSettings.nTable.style.marginLeft = "0";
3094
+ if ( nTfoot !== null )
3095
+ {
3096
+ nScrollFootTable.removeAttribute('id');
3097
+ nScrollFootTable.style.marginLeft = "0";
3098
+ }
3099
+
3100
+ /* Move caption elements from the body to the header, footer or leave where it is
3101
+ * depending on the configuration. Note that the DTD says there can be only one caption */
3102
+ var nCaption = $(oSettings.nTable).children('caption');
3103
+ if ( nCaption.length > 0 )
3104
+ {
3105
+ nCaption = nCaption[0];
3106
+ if ( nCaption._captionSide === "top" )
3107
+ {
3108
+ nScrollHeadTable.appendChild( nCaption );
3109
+ }
3110
+ else if ( nCaption._captionSide === "bottom" && nTfoot )
3111
+ {
3112
+ nScrollFootTable.appendChild( nCaption );
3113
+ }
3114
+ }
3115
+
3116
+ /*
3117
+ * Sizing
3118
+ */
3119
+ /* When x-scrolling add the width and a scroller to move the header with the body */
3120
+ if ( oSettings.oScroll.sX !== "" )
3121
+ {
3122
+ nScrollHead.style.width = _fnStringToCss( oSettings.oScroll.sX );
3123
+ nScrollBody.style.width = _fnStringToCss( oSettings.oScroll.sX );
3124
+
3125
+ if ( nTfoot !== null )
3126
+ {
3127
+ nScrollFoot.style.width = _fnStringToCss( oSettings.oScroll.sX );
3128
+ }
3129
+
3130
+ /* When the body is scrolled, then we also want to scroll the headers */
3131
+ $(nScrollBody).scroll( function (e) {
3132
+ nScrollHead.scrollLeft = this.scrollLeft;
3133
+
3134
+ if ( nTfoot !== null )
3135
+ {
3136
+ nScrollFoot.scrollLeft = this.scrollLeft;
3137
+ }
3138
+ } );
3139
+ }
3140
+
3141
+ /* When yscrolling, add the height */
3142
+ if ( oSettings.oScroll.sY !== "" )
3143
+ {
3144
+ nScrollBody.style.height = _fnStringToCss( oSettings.oScroll.sY );
3145
+ }
3146
+
3147
+ /* Redraw - align columns across the tables */
3148
+ oSettings.aoDrawCallback.push( {
3149
+ "fn": _fnScrollDraw,
3150
+ "sName": "scrolling"
3151
+ } );
3152
+
3153
+ /* Infinite scrolling event handlers */
3154
+ if ( oSettings.oScroll.bInfinite )
3155
+ {
3156
+ $(nScrollBody).scroll( function() {
3157
+ /* Use a blocker to stop scrolling from loading more data while other data is still loading */
3158
+ if ( !oSettings.bDrawing && $(this).scrollTop() !== 0 )
3159
+ {
3160
+ /* Check if we should load the next data set */
3161
+ if ( $(this).scrollTop() + $(this).height() >
3162
+ $(oSettings.nTable).height() - oSettings.oScroll.iLoadGap )
3163
+ {
3164
+ /* Only do the redraw if we have to - we might be at the end of the data */
3165
+ if ( oSettings.fnDisplayEnd() < oSettings.fnRecordsDisplay() )
3166
+ {
3167
+ _fnPageChange( oSettings, 'next' );
3168
+ _fnCalculateEnd( oSettings );
3169
+ _fnDraw( oSettings );
3170
+ }
3171
+ }
3172
+ }
3173
+ } );
3174
+ }
3175
+
3176
+ oSettings.nScrollHead = nScrollHead;
3177
+ oSettings.nScrollFoot = nScrollFoot;
3178
+
3179
+ return nScroller;
3180
+ }
3181
+
3182
+
3183
+ /**
3184
+ * Update the various tables for resizing. It's a bit of a pig this function, but
3185
+ * basically the idea to:
3186
+ * 1. Re-create the table inside the scrolling div
3187
+ * 2. Take live measurements from the DOM
3188
+ * 3. Apply the measurements
3189
+ * 4. Clean up
3190
+ * @param {object} o dataTables settings object
3191
+ * @returns {node} Node to add to the DOM
3192
+ * @memberof DataTable#oApi
3193
+ */
3194
+ function _fnScrollDraw ( o )
3195
+ {
3196
+ var
3197
+ nScrollHeadInner = o.nScrollHead.getElementsByTagName('div')[0],
3198
+ nScrollHeadTable = nScrollHeadInner.getElementsByTagName('table')[0],
3199
+ nScrollBody = o.nTable.parentNode,
3200
+ i, iLen, j, jLen, anHeadToSize, anHeadSizers, anFootSizers, anFootToSize, oStyle, iVis,
3201
+ nTheadSize, nTfootSize,
3202
+ iWidth, aApplied=[], aAppliedFooter=[], iSanityWidth,
3203
+ nScrollFootInner = (o.nTFoot !== null) ? o.nScrollFoot.getElementsByTagName('div')[0] : null,
3204
+ nScrollFootTable = (o.nTFoot !== null) ? nScrollFootInner.getElementsByTagName('table')[0] : null,
3205
+ ie67 = o.oBrowser.bScrollOversize,
3206
+ zeroOut = function(nSizer) {
3207
+ oStyle = nSizer.style;
3208
+ oStyle.paddingTop = "0";
3209
+ oStyle.paddingBottom = "0";
3210
+ oStyle.borderTopWidth = "0";
3211
+ oStyle.borderBottomWidth = "0";
3212
+ oStyle.height = 0;
3213
+ };
3214
+
3215
+ /*
3216
+ * 1. Re-create the table inside the scrolling div
3217
+ */
3218
+
3219
+ /* Remove the old minimised thead and tfoot elements in the inner table */
3220
+ $(o.nTable).children('thead, tfoot').remove();
3221
+
3222
+ /* Clone the current header and footer elements and then place it into the inner table */
3223
+ nTheadSize = $(o.nTHead).clone()[0];
3224
+ o.nTable.insertBefore( nTheadSize, o.nTable.childNodes[0] );
3225
+ anHeadToSize = o.nTHead.getElementsByTagName('tr');
3226
+ anHeadSizers = nTheadSize.getElementsByTagName('tr');
3227
+
3228
+ if ( o.nTFoot !== null )
3229
+ {
3230
+ nTfootSize = $(o.nTFoot).clone()[0];
3231
+ o.nTable.insertBefore( nTfootSize, o.nTable.childNodes[1] );
3232
+ anFootToSize = o.nTFoot.getElementsByTagName('tr');
3233
+ anFootSizers = nTfootSize.getElementsByTagName('tr');
3234
+ }
3235
+
3236
+ /*
3237
+ * 2. Take live measurements from the DOM - do not alter the DOM itself!
3238
+ */
3239
+
3240
+ /* Remove old sizing and apply the calculated column widths
3241
+ * Get the unique column headers in the newly created (cloned) header. We want to apply the
3242
+ * calculated sizes to this header
3243
+ */
3244
+ if ( o.oScroll.sX === "" )
3245
+ {
3246
+ nScrollBody.style.width = '100%';
3247
+ nScrollHeadInner.parentNode.style.width = '100%';
3248
+ }
3249
+
3250
+ var nThs = _fnGetUniqueThs( o, nTheadSize );
3251
+ for ( i=0, iLen=nThs.length ; i<iLen ; i++ )
3252
+ {
3253
+ iVis = _fnVisibleToColumnIndex( o, i );
3254
+ nThs[i].style.width = o.aoColumns[iVis].sWidth;
3255
+ }
3256
+
3257
+ if ( o.nTFoot !== null )
3258
+ {
3259
+ _fnApplyToChildren( function(n) {
3260
+ n.style.width = "";
3261
+ }, anFootSizers );
3262
+ }
3263
+
3264
+ // If scroll collapse is enabled, when we put the headers back into the body for sizing, we
3265
+ // will end up forcing the scrollbar to appear, making our measurements wrong for when we
3266
+ // then hide it (end of this function), so add the header height to the body scroller.
3267
+ if ( o.oScroll.bCollapse && o.oScroll.sY !== "" )
3268
+ {
3269
+ nScrollBody.style.height = (nScrollBody.offsetHeight + o.nTHead.offsetHeight)+"px";
3270
+ }
3271
+
3272
+ /* Size the table as a whole */
3273
+ iSanityWidth = $(o.nTable).outerWidth();
3274
+ if ( o.oScroll.sX === "" )
3275
+ {
3276
+ /* No x scrolling */
3277
+ o.nTable.style.width = "100%";
3278
+
3279
+ /* I know this is rubbish - but IE7 will make the width of the table when 100% include
3280
+ * the scrollbar - which is shouldn't. When there is a scrollbar we need to take this
3281
+ * into account.
3282
+ */
3283
+ if ( ie67 && ($('tbody', nScrollBody).height() > nScrollBody.offsetHeight ||
3284
+ $(nScrollBody).css('overflow-y') == "scroll") )
3285
+ {
3286
+ o.nTable.style.width = _fnStringToCss( $(o.nTable).outerWidth() - o.oScroll.iBarWidth);
3287
+ }
3288
+ }
3289
+ else
3290
+ {
3291
+ if ( o.oScroll.sXInner !== "" )
3292
+ {
3293
+ /* x scroll inner has been given - use it */
3294
+ o.nTable.style.width = _fnStringToCss(o.oScroll.sXInner);
3295
+ }
3296
+ else if ( iSanityWidth == $(nScrollBody).width() &&
3297
+ $(nScrollBody).height() < $(o.nTable).height() )
3298
+ {
3299
+ /* There is y-scrolling - try to take account of the y scroll bar */
3300
+ o.nTable.style.width = _fnStringToCss( iSanityWidth-o.oScroll.iBarWidth );
3301
+ if ( $(o.nTable).outerWidth() > iSanityWidth-o.oScroll.iBarWidth )
3302
+ {
3303
+ /* Not possible to take account of it */
3304
+ o.nTable.style.width = _fnStringToCss( iSanityWidth );
3305
+ }
3306
+ }
3307
+ else
3308
+ {
3309
+ /* All else fails */
3310
+ o.nTable.style.width = _fnStringToCss( iSanityWidth );
3311
+ }
3312
+ }
3313
+
3314
+ /* Recalculate the sanity width - now that we've applied the required width, before it was
3315
+ * a temporary variable. This is required because the column width calculation is done
3316
+ * before this table DOM is created.
3317
+ */
3318
+ iSanityWidth = $(o.nTable).outerWidth();
3319
+
3320
+ /* We want the hidden header to have zero height, so remove padding and borders. Then
3321
+ * set the width based on the real headers
3322
+ */
3323
+
3324
+ // Apply all styles in one pass. Invalidates layout only once because we don't read any
3325
+ // DOM properties.
3326
+ _fnApplyToChildren( zeroOut, anHeadSizers );
3327
+
3328
+ // Read all widths in next pass. Forces layout only once because we do not change
3329
+ // any DOM properties.
3330
+ _fnApplyToChildren( function(nSizer) {
3331
+ aApplied.push( _fnStringToCss( $(nSizer).width() ) );
3332
+ }, anHeadSizers );
3333
+
3334
+ // Apply all widths in final pass. Invalidates layout only once because we do not
3335
+ // read any DOM properties.
3336
+ _fnApplyToChildren( function(nToSize, i) {
3337
+ nToSize.style.width = aApplied[i];
3338
+ }, anHeadToSize );
3339
+
3340
+ $(anHeadSizers).height(0);
3341
+
3342
+ /* Same again with the footer if we have one */
3343
+ if ( o.nTFoot !== null )
3344
+ {
3345
+ _fnApplyToChildren( zeroOut, anFootSizers );
3346
+
3347
+ _fnApplyToChildren( function(nSizer) {
3348
+ aAppliedFooter.push( _fnStringToCss( $(nSizer).width() ) );
3349
+ }, anFootSizers );
3350
+
3351
+ _fnApplyToChildren( function(nToSize, i) {
3352
+ nToSize.style.width = aAppliedFooter[i];
3353
+ }, anFootToSize );
3354
+
3355
+ $(anFootSizers).height(0);
3356
+ }
3357
+
3358
+ /*
3359
+ * 3. Apply the measurements
3360
+ */
3361
+
3362
+ /* "Hide" the header and footer that we used for the sizing. We want to also fix their width
3363
+ * to what they currently are
3364
+ */
3365
+ _fnApplyToChildren( function(nSizer, i) {
3366
+ nSizer.innerHTML = "";
3367
+ nSizer.style.width = aApplied[i];
3368
+ }, anHeadSizers );
3369
+
3370
+ if ( o.nTFoot !== null )
3371
+ {
3372
+ _fnApplyToChildren( function(nSizer, i) {
3373
+ nSizer.innerHTML = "";
3374
+ nSizer.style.width = aAppliedFooter[i];
3375
+ }, anFootSizers );
3376
+ }
3377
+
3378
+ /* Sanity check that the table is of a sensible width. If not then we are going to get
3379
+ * misalignment - try to prevent this by not allowing the table to shrink below its min width
3380
+ */
3381
+ if ( $(o.nTable).outerWidth() < iSanityWidth )
3382
+ {
3383
+ /* The min width depends upon if we have a vertical scrollbar visible or not */
3384
+ var iCorrection = ((nScrollBody.scrollHeight > nScrollBody.offsetHeight ||
3385
+ $(nScrollBody).css('overflow-y') == "scroll")) ?
3386
+ iSanityWidth+o.oScroll.iBarWidth : iSanityWidth;
3387
+
3388
+ /* IE6/7 are a law unto themselves... */
3389
+ if ( ie67 && (nScrollBody.scrollHeight >
3390
+ nScrollBody.offsetHeight || $(nScrollBody).css('overflow-y') == "scroll") )
3391
+ {
3392
+ o.nTable.style.width = _fnStringToCss( iCorrection-o.oScroll.iBarWidth );
3393
+ }
3394
+
3395
+ /* Apply the calculated minimum width to the table wrappers */
3396
+ nScrollBody.style.width = _fnStringToCss( iCorrection );
3397
+ o.nScrollHead.style.width = _fnStringToCss( iCorrection );
3398
+
3399
+ if ( o.nTFoot !== null )
3400
+ {
3401
+ o.nScrollFoot.style.width = _fnStringToCss( iCorrection );
3402
+ }
3403
+
3404
+ /* And give the user a warning that we've stopped the table getting too small */
3405
+ if ( o.oScroll.sX === "" )
3406
+ {
3407
+ _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
3408
+ " misalignment. The table has been drawn at its minimum possible width." );
3409
+ }
3410
+ else if ( o.oScroll.sXInner !== "" )
3411
+ {
3412
+ _fnLog( o, 1, "The table cannot fit into the current element which will cause column"+
3413
+ " misalignment. Increase the sScrollXInner value or remove it to allow automatic"+
3414
+ " calculation" );
3415
+ }
3416
+ }
3417
+ else
3418
+ {
3419
+ nScrollBody.style.width = _fnStringToCss( '100%' );
3420
+ o.nScrollHead.style.width = _fnStringToCss( '100%' );
3421
+
3422
+ if ( o.nTFoot !== null )
3423
+ {
3424
+ o.nScrollFoot.style.width = _fnStringToCss( '100%' );
3425
+ }
3426
+ }
3427
+
3428
+
3429
+ /*
3430
+ * 4. Clean up
3431
+ */
3432
+ if ( o.oScroll.sY === "" )
3433
+ {
3434
+ /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
3435
+ * the scrollbar height from the visible display, rather than adding it on. We need to
3436
+ * set the height in order to sort this. Don't want to do it in any other browsers.
3437
+ */
3438
+ if ( ie67 )
3439
+ {
3440
+ nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+o.oScroll.iBarWidth );
3441
+ }
3442
+ }
3443
+
3444
+ if ( o.oScroll.sY !== "" && o.oScroll.bCollapse )
3445
+ {
3446
+ nScrollBody.style.height = _fnStringToCss( o.oScroll.sY );
3447
+
3448
+ var iExtra = (o.oScroll.sX !== "" && o.nTable.offsetWidth > nScrollBody.offsetWidth) ?
3449
+ o.oScroll.iBarWidth : 0;
3450
+ if ( o.nTable.offsetHeight < nScrollBody.offsetHeight )
3451
+ {
3452
+ nScrollBody.style.height = _fnStringToCss( o.nTable.offsetHeight+iExtra );
3453
+ }
3454
+ }
3455
+
3456
+ /* Finally set the width's of the header and footer tables */
3457
+ var iOuterWidth = $(o.nTable).outerWidth();
3458
+ nScrollHeadTable.style.width = _fnStringToCss( iOuterWidth );
3459
+ nScrollHeadInner.style.width = _fnStringToCss( iOuterWidth );
3460
+
3461
+ // Figure out if there are scrollbar present - if so then we need a the header and footer to
3462
+ // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
3463
+ var bScrolling = $(o.nTable).height() > nScrollBody.clientHeight || $(nScrollBody).css('overflow-y') == "scroll";
3464
+ nScrollHeadInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3465
+
3466
+ if ( o.nTFoot !== null )
3467
+ {
3468
+ nScrollFootTable.style.width = _fnStringToCss( iOuterWidth );
3469
+ nScrollFootInner.style.width = _fnStringToCss( iOuterWidth );
3470
+ nScrollFootInner.style.paddingRight = bScrolling ? o.oScroll.iBarWidth+"px" : "0px";
3471
+ }
3472
+
3473
+ /* Adjust the position of the header in case we loose the y-scrollbar */
3474
+ $(nScrollBody).scroll();
3475
+
3476
+ /* If sorting or filtering has occurred, jump the scrolling back to the top */
3477
+ if ( o.bSorted || o.bFiltered )
3478
+ {
3479
+ nScrollBody.scrollTop = 0;
3480
+ }
3481
+ }
3482
+
3483
+
3484
+ /**
3485
+ * Apply a given function to the display child nodes of an element array (typically
3486
+ * TD children of TR rows
3487
+ * @param {function} fn Method to apply to the objects
3488
+ * @param array {nodes} an1 List of elements to look through for display children
3489
+ * @param array {nodes} an2 Another list (identical structure to the first) - optional
3490
+ * @memberof DataTable#oApi
3491
+ */
3492
+ function _fnApplyToChildren( fn, an1, an2 )
3493
+ {
3494
+ var index=0, i=0, iLen=an1.length;
3495
+ var nNode1, nNode2;
3496
+
3497
+ while ( i < iLen )
3498
+ {
3499
+ nNode1 = an1[i].firstChild;
3500
+ nNode2 = an2 ? an2[i].firstChild : null;
3501
+ while ( nNode1 )
3502
+ {
3503
+ if ( nNode1.nodeType === 1 )
3504
+ {
3505
+ if ( an2 )
3506
+ {
3507
+ fn( nNode1, nNode2, index );
3508
+ }
3509
+ else
3510
+ {
3511
+ fn( nNode1, index );
3512
+ }
3513
+ index++;
3514
+ }
3515
+ nNode1 = nNode1.nextSibling;
3516
+ nNode2 = an2 ? nNode2.nextSibling : null;
3517
+ }
3518
+ i++;
3519
+ }
3520
+ }
3521
+
3522
+ /**
3523
+ * Convert a CSS unit width to pixels (e.g. 2em)
3524
+ * @param {string} sWidth width to be converted
3525
+ * @param {node} nParent parent to get the with for (required for relative widths) - optional
3526
+ * @returns {int} iWidth width in pixels
3527
+ * @memberof DataTable#oApi
3528
+ */
3529
+ function _fnConvertToWidth ( sWidth, nParent )
3530
+ {
3531
+ if ( !sWidth || sWidth === null || sWidth === '' )
3532
+ {
3533
+ return 0;
3534
+ }
3535
+
3536
+ if ( !nParent )
3537
+ {
3538
+ nParent = document.body;
3539
+ }
3540
+
3541
+ var iWidth;
3542
+ var nTmp = document.createElement( "div" );
3543
+ nTmp.style.width = _fnStringToCss( sWidth );
3544
+
3545
+ nParent.appendChild( nTmp );
3546
+ iWidth = nTmp.offsetWidth;
3547
+ nParent.removeChild( nTmp );
3548
+
3549
+ return ( iWidth );
3550
+ }
3551
+
3552
+
3553
+ /**
3554
+ * Calculate the width of columns for the table
3555
+ * @param {object} oSettings dataTables settings object
3556
+ * @memberof DataTable#oApi
3557
+ */
3558
+ function _fnCalculateColumnWidths ( oSettings )
3559
+ {
3560
+ var iTableWidth = oSettings.nTable.offsetWidth;
3561
+ var iUserInputs = 0;
3562
+ var iTmpWidth;
3563
+ var iVisibleColumns = 0;
3564
+ var iColums = oSettings.aoColumns.length;
3565
+ var i, iIndex, iCorrector, iWidth;
3566
+ var oHeaders = $('th', oSettings.nTHead);
3567
+ var widthAttr = oSettings.nTable.getAttribute('width');
3568
+ var nWrapper = oSettings.nTable.parentNode;
3569
+
3570
+ /* Convert any user input sizes into pixel sizes */
3571
+ for ( i=0 ; i<iColums ; i++ )
3572
+ {
3573
+ if ( oSettings.aoColumns[i].bVisible )
3574
+ {
3575
+ iVisibleColumns++;
3576
+
3577
+ if ( oSettings.aoColumns[i].sWidth !== null )
3578
+ {
3579
+ iTmpWidth = _fnConvertToWidth( oSettings.aoColumns[i].sWidthOrig,
3580
+ nWrapper );
3581
+ if ( iTmpWidth !== null )
3582
+ {
3583
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
3584
+ }
3585
+
3586
+ iUserInputs++;
3587
+ }
3588
+ }
3589
+ }
3590
+
3591
+ /* If the number of columns in the DOM equals the number that we have to process in
3592
+ * DataTables, then we can use the offsets that are created by the web-browser. No custom
3593
+ * sizes can be set in order for this to happen, nor scrolling used
3594
+ */
3595
+ if ( iColums == oHeaders.length && iUserInputs === 0 && iVisibleColumns == iColums &&
3596
+ oSettings.oScroll.sX === "" && oSettings.oScroll.sY === "" )
3597
+ {
3598
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3599
+ {
3600
+ iTmpWidth = $(oHeaders[i]).width();
3601
+ if ( iTmpWidth !== null )
3602
+ {
3603
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iTmpWidth );
3604
+ }
3605
+ }
3606
+ }
3607
+ else
3608
+ {
3609
+ /* Otherwise we are going to have to do some calculations to get the width of each column.
3610
+ * Construct a 1 row table with the widest node in the data, and any user defined widths,
3611
+ * then insert it into the DOM and allow the browser to do all the hard work of
3612
+ * calculating table widths.
3613
+ */
3614
+ var
3615
+ nCalcTmp = oSettings.nTable.cloneNode( false ),
3616
+ nTheadClone = oSettings.nTHead.cloneNode(true),
3617
+ nBody = document.createElement( 'tbody' ),
3618
+ nTr = document.createElement( 'tr' ),
3619
+ nDivSizing;
3620
+
3621
+ nCalcTmp.removeAttribute( "id" );
3622
+ nCalcTmp.appendChild( nTheadClone );
3623
+ if ( oSettings.nTFoot !== null )
3624
+ {
3625
+ nCalcTmp.appendChild( oSettings.nTFoot.cloneNode(true) );
3626
+ _fnApplyToChildren( function(n) {
3627
+ n.style.width = "";
3628
+ }, nCalcTmp.getElementsByTagName('tr') );
3629
+ }
3630
+
3631
+ nCalcTmp.appendChild( nBody );
3632
+ nBody.appendChild( nTr );
3633
+
3634
+ /* Remove any sizing that was previously applied by the styles */
3635
+ var jqColSizing = $('thead th', nCalcTmp);
3636
+ if ( jqColSizing.length === 0 )
3637
+ {
3638
+ jqColSizing = $('tbody tr:eq(0)>td', nCalcTmp);
3639
+ }
3640
+
3641
+ /* Apply custom sizing to the cloned header */
3642
+ var nThs = _fnGetUniqueThs( oSettings, nTheadClone );
3643
+ iCorrector = 0;
3644
+ for ( i=0 ; i<iColums ; i++ )
3645
+ {
3646
+ var oColumn = oSettings.aoColumns[i];
3647
+ if ( oColumn.bVisible && oColumn.sWidthOrig !== null && oColumn.sWidthOrig !== "" )
3648
+ {
3649
+ nThs[i-iCorrector].style.width = _fnStringToCss( oColumn.sWidthOrig );
3650
+ }
3651
+ else if ( oColumn.bVisible )
3652
+ {
3653
+ nThs[i-iCorrector].style.width = "";
3654
+ }
3655
+ else
3656
+ {
3657
+ iCorrector++;
3658
+ }
3659
+ }
3660
+
3661
+ /* Find the biggest td for each column and put it into the table */
3662
+ for ( i=0 ; i<iColums ; i++ )
3663
+ {
3664
+ if ( oSettings.aoColumns[i].bVisible )
3665
+ {
3666
+ var nTd = _fnGetWidestNode( oSettings, i );
3667
+ if ( nTd !== null )
3668
+ {
3669
+ nTd = nTd.cloneNode(true);
3670
+ if ( oSettings.aoColumns[i].sContentPadding !== "" )
3671
+ {
3672
+ nTd.innerHTML += oSettings.aoColumns[i].sContentPadding;
3673
+ }
3674
+ nTr.appendChild( nTd );
3675
+ }
3676
+ }
3677
+ }
3678
+
3679
+ /* Build the table and 'display' it */
3680
+ nWrapper.appendChild( nCalcTmp );
3681
+
3682
+ /* When scrolling (X or Y) we want to set the width of the table as appropriate. However,
3683
+ * when not scrolling leave the table width as it is. This results in slightly different,
3684
+ * but I think correct behaviour
3685
+ */
3686
+ if ( oSettings.oScroll.sX !== "" && oSettings.oScroll.sXInner !== "" )
3687
+ {
3688
+ nCalcTmp.style.width = _fnStringToCss(oSettings.oScroll.sXInner);
3689
+ }
3690
+ else if ( oSettings.oScroll.sX !== "" )
3691
+ {
3692
+ nCalcTmp.style.width = "";
3693
+ if ( $(nCalcTmp).width() < nWrapper.offsetWidth )
3694
+ {
3695
+ nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
3696
+ }
3697
+ }
3698
+ else if ( oSettings.oScroll.sY !== "" )
3699
+ {
3700
+ nCalcTmp.style.width = _fnStringToCss( nWrapper.offsetWidth );
3701
+ }
3702
+ else if ( widthAttr )
3703
+ {
3704
+ nCalcTmp.style.width = _fnStringToCss( widthAttr );
3705
+ }
3706
+ nCalcTmp.style.visibility = "hidden";
3707
+
3708
+ /* Scrolling considerations */
3709
+ _fnScrollingWidthAdjust( oSettings, nCalcTmp );
3710
+
3711
+ /* Read the width's calculated by the browser and store them for use by the caller. We
3712
+ * first of all try to use the elements in the body, but it is possible that there are
3713
+ * no elements there, under which circumstances we use the header elements
3714
+ */
3715
+ var oNodes = $("tbody tr:eq(0)", nCalcTmp).children();
3716
+ if ( oNodes.length === 0 )
3717
+ {
3718
+ oNodes = _fnGetUniqueThs( oSettings, $('thead', nCalcTmp)[0] );
3719
+ }
3720
+
3721
+ /* Browsers need a bit of a hand when a width is assigned to any columns when
3722
+ * x-scrolling as they tend to collapse the table to the min-width, even if
3723
+ * we sent the column widths. So we need to keep track of what the table width
3724
+ * should be by summing the user given values, and the automatic values
3725
+ */
3726
+ if ( oSettings.oScroll.sX !== "" )
3727
+ {
3728
+ var iTotal = 0;
3729
+ iCorrector = 0;
3730
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3731
+ {
3732
+ if ( oSettings.aoColumns[i].bVisible )
3733
+ {
3734
+ if ( oSettings.aoColumns[i].sWidthOrig === null )
3735
+ {
3736
+ iTotal += $(oNodes[iCorrector]).outerWidth();
3737
+ }
3738
+ else
3739
+ {
3740
+ iTotal += parseInt(oSettings.aoColumns[i].sWidth.replace('px',''), 10) +
3741
+ ($(oNodes[iCorrector]).outerWidth() - $(oNodes[iCorrector]).width());
3742
+ }
3743
+ iCorrector++;
3744
+ }
3745
+ }
3746
+
3747
+ nCalcTmp.style.width = _fnStringToCss( iTotal );
3748
+ oSettings.nTable.style.width = _fnStringToCss( iTotal );
3749
+ }
3750
+
3751
+ iCorrector = 0;
3752
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
3753
+ {
3754
+ if ( oSettings.aoColumns[i].bVisible )
3755
+ {
3756
+ iWidth = $(oNodes[iCorrector]).width();
3757
+ if ( iWidth !== null && iWidth > 0 )
3758
+ {
3759
+ oSettings.aoColumns[i].sWidth = _fnStringToCss( iWidth );
3760
+ }
3761
+ iCorrector++;
3762
+ }
3763
+ }
3764
+
3765
+ var cssWidth = $(nCalcTmp).css('width');
3766
+ oSettings.nTable.style.width = (cssWidth.indexOf('%') !== -1) ?
3767
+ cssWidth : _fnStringToCss( $(nCalcTmp).outerWidth() );
3768
+ nCalcTmp.parentNode.removeChild( nCalcTmp );
3769
+ }
3770
+
3771
+ if ( widthAttr )
3772
+ {
3773
+ oSettings.nTable.style.width = _fnStringToCss( widthAttr );
3774
+ }
3775
+ }
3776
+
3777
+
3778
+ /**
3779
+ * Adjust a table's width to take account of scrolling
3780
+ * @param {object} oSettings dataTables settings object
3781
+ * @param {node} n table node
3782
+ * @memberof DataTable#oApi
3783
+ */
3784
+ function _fnScrollingWidthAdjust ( oSettings, n )
3785
+ {
3786
+ if ( oSettings.oScroll.sX === "" && oSettings.oScroll.sY !== "" )
3787
+ {
3788
+ /* When y-scrolling only, we want to remove the width of the scroll bar so the table
3789
+ * + scroll bar will fit into the area avaialble.
3790
+ */
3791
+ var iOrigWidth = $(n).width();
3792
+ n.style.width = _fnStringToCss( $(n).outerWidth()-oSettings.oScroll.iBarWidth );
3793
+ }
3794
+ else if ( oSettings.oScroll.sX !== "" )
3795
+ {
3796
+ /* When x-scrolling both ways, fix the table at it's current size, without adjusting */
3797
+ n.style.width = _fnStringToCss( $(n).outerWidth() );
3798
+ }
3799
+ }
3800
+
3801
+
3802
+ /**
3803
+ * Get the widest node
3804
+ * @param {object} oSettings dataTables settings object
3805
+ * @param {int} iCol column of interest
3806
+ * @returns {node} widest table node
3807
+ * @memberof DataTable#oApi
3808
+ */
3809
+ function _fnGetWidestNode( oSettings, iCol )
3810
+ {
3811
+ var iMaxIndex = _fnGetMaxLenString( oSettings, iCol );
3812
+ if ( iMaxIndex < 0 )
3813
+ {
3814
+ return null;
3815
+ }
3816
+
3817
+ if ( oSettings.aoData[iMaxIndex].nTr === null )
3818
+ {
3819
+ var n = document.createElement('td');
3820
+ n.innerHTML = _fnGetCellData( oSettings, iMaxIndex, iCol, '' );
3821
+ return n;
3822
+ }
3823
+ return _fnGetTdNodes(oSettings, iMaxIndex)[iCol];
3824
+ }
3825
+
3826
+
3827
+ /**
3828
+ * Get the maximum strlen for each data column
3829
+ * @param {object} oSettings dataTables settings object
3830
+ * @param {int} iCol column of interest
3831
+ * @returns {string} max string length for each column
3832
+ * @memberof DataTable#oApi
3833
+ */
3834
+ function _fnGetMaxLenString( oSettings, iCol )
3835
+ {
3836
+ var iMax = -1;
3837
+ var iMaxIndex = -1;
3838
+
3839
+ for ( var i=0 ; i<oSettings.aoData.length ; i++ )
3840
+ {
3841
+ var s = _fnGetCellData( oSettings, i, iCol, 'display' )+"";
3842
+ s = s.replace( /<.*?>/g, "" );
3843
+ if ( s.length > iMax )
3844
+ {
3845
+ iMax = s.length;
3846
+ iMaxIndex = i;
3847
+ }
3848
+ }
3849
+
3850
+ return iMaxIndex;
3851
+ }
3852
+
3853
+
3854
+ /**
3855
+ * Append a CSS unit (only if required) to a string
3856
+ * @param {array} aArray1 first array
3857
+ * @param {array} aArray2 second array
3858
+ * @returns {int} 0 if match, 1 if length is different, 2 if no match
3859
+ * @memberof DataTable#oApi
3860
+ */
3861
+ function _fnStringToCss( s )
3862
+ {
3863
+ if ( s === null )
3864
+ {
3865
+ return "0px";
3866
+ }
3867
+
3868
+ if ( typeof s == 'number' )
3869
+ {
3870
+ if ( s < 0 )
3871
+ {
3872
+ return "0px";
3873
+ }
3874
+ return s+"px";
3875
+ }
3876
+
3877
+ /* Check if the last character is not 0-9 */
3878
+ var c = s.charCodeAt( s.length-1 );
3879
+ if (c < 0x30 || c > 0x39)
3880
+ {
3881
+ return s;
3882
+ }
3883
+ return s+"px";
3884
+ }
3885
+
3886
+
3887
+ /**
3888
+ * Get the width of a scroll bar in this browser being used
3889
+ * @returns {int} width in pixels
3890
+ * @memberof DataTable#oApi
3891
+ */
3892
+ function _fnScrollBarWidth ()
3893
+ {
3894
+ var inner = document.createElement('p');
3895
+ var style = inner.style;
3896
+ style.width = "100%";
3897
+ style.height = "200px";
3898
+ style.padding = "0px";
3899
+
3900
+ var outer = document.createElement('div');
3901
+ style = outer.style;
3902
+ style.position = "absolute";
3903
+ style.top = "0px";
3904
+ style.left = "0px";
3905
+ style.visibility = "hidden";
3906
+ style.width = "200px";
3907
+ style.height = "150px";
3908
+ style.padding = "0px";
3909
+ style.overflow = "hidden";
3910
+ outer.appendChild(inner);
3911
+
3912
+ document.body.appendChild(outer);
3913
+ var w1 = inner.offsetWidth;
3914
+ outer.style.overflow = 'scroll';
3915
+ var w2 = inner.offsetWidth;
3916
+ if ( w1 == w2 )
3917
+ {
3918
+ w2 = outer.clientWidth;
3919
+ }
3920
+
3921
+ document.body.removeChild(outer);
3922
+ return (w1 - w2);
3923
+ }
3924
+
3925
+ /**
3926
+ * Change the order of the table
3927
+ * @param {object} oSettings dataTables settings object
3928
+ * @param {bool} bApplyClasses optional - should we apply classes or not
3929
+ * @memberof DataTable#oApi
3930
+ */
3931
+ function _fnSort ( oSettings, bApplyClasses )
3932
+ {
3933
+ var
3934
+ i, iLen, j, jLen, k, kLen,
3935
+ sDataType, nTh,
3936
+ aaSort = [],
3937
+ aiOrig = [],
3938
+ oSort = DataTable.ext.oSort,
3939
+ aoData = oSettings.aoData,
3940
+ aoColumns = oSettings.aoColumns,
3941
+ oAria = oSettings.oLanguage.oAria;
3942
+
3943
+ /* No sorting required if server-side or no sorting array */
3944
+ if ( !oSettings.oFeatures.bServerSide &&
3945
+ (oSettings.aaSorting.length !== 0 || oSettings.aaSortingFixed !== null) )
3946
+ {
3947
+ aaSort = ( oSettings.aaSortingFixed !== null ) ?
3948
+ oSettings.aaSortingFixed.concat( oSettings.aaSorting ) :
3949
+ oSettings.aaSorting.slice();
3950
+
3951
+ /* If there is a sorting data type, and a function belonging to it, then we need to
3952
+ * get the data from the developer's function and apply it for this column
3953
+ */
3954
+ for ( i=0 ; i<aaSort.length ; i++ )
3955
+ {
3956
+ var iColumn = aaSort[i][0];
3957
+ var iVisColumn = _fnColumnIndexToVisible( oSettings, iColumn );
3958
+ sDataType = oSettings.aoColumns[ iColumn ].sSortDataType;
3959
+ if ( DataTable.ext.afnSortData[sDataType] )
3960
+ {
3961
+ var aData = DataTable.ext.afnSortData[sDataType].call(
3962
+ oSettings.oInstance, oSettings, iColumn, iVisColumn
3963
+ );
3964
+ if ( aData.length === aoData.length )
3965
+ {
3966
+ for ( j=0, jLen=aoData.length ; j<jLen ; j++ )
3967
+ {
3968
+ _fnSetCellData( oSettings, j, iColumn, aData[j] );
3969
+ }
3970
+ }
3971
+ else
3972
+ {
3973
+ _fnLog( oSettings, 0, "Returned data sort array (col "+iColumn+") is the wrong length" );
3974
+ }
3975
+ }
3976
+ }
3977
+
3978
+ /* Create a value - key array of the current row positions such that we can use their
3979
+ * current position during the sort, if values match, in order to perform stable sorting
3980
+ */
3981
+ for ( i=0, iLen=oSettings.aiDisplayMaster.length ; i<iLen ; i++ )
3982
+ {
3983
+ aiOrig[ oSettings.aiDisplayMaster[i] ] = i;
3984
+ }
3985
+
3986
+ /* Build an internal data array which is specific to the sort, so we can get and prep
3987
+ * the data to be sorted only once, rather than needing to do it every time the sorting
3988
+ * function runs. This make the sorting function a very simple comparison
3989
+ */
3990
+ var iSortLen = aaSort.length;
3991
+ var fnSortFormat, aDataSort;
3992
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
3993
+ {
3994
+ for ( j=0 ; j<iSortLen ; j++ )
3995
+ {
3996
+ aDataSort = aoColumns[ aaSort[j][0] ].aDataSort;
3997
+
3998
+ for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
3999
+ {
4000
+ sDataType = aoColumns[ aDataSort[k] ].sType;
4001
+ fnSortFormat = oSort[ (sDataType ? sDataType : 'string')+"-pre" ];
4002
+
4003
+ aoData[i]._aSortData[ aDataSort[k] ] = fnSortFormat ?
4004
+ fnSortFormat( _fnGetCellData( oSettings, i, aDataSort[k], 'sort' ) ) :
4005
+ _fnGetCellData( oSettings, i, aDataSort[k], 'sort' );
4006
+ }
4007
+ }
4008
+ }
4009
+
4010
+ /* Do the sort - here we want multi-column sorting based on a given data source (column)
4011
+ * and sorting function (from oSort) in a certain direction. It's reasonably complex to
4012
+ * follow on it's own, but this is what we want (example two column sorting):
4013
+ * fnLocalSorting = function(a,b){
4014
+ * var iTest;
4015
+ * iTest = oSort['string-asc']('data11', 'data12');
4016
+ * if (iTest !== 0)
4017
+ * return iTest;
4018
+ * iTest = oSort['numeric-desc']('data21', 'data22');
4019
+ * if (iTest !== 0)
4020
+ * return iTest;
4021
+ * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
4022
+ * }
4023
+ * Basically we have a test for each sorting column, if the data in that column is equal,
4024
+ * test the next column. If all columns match, then we use a numeric sort on the row
4025
+ * positions in the original data array to provide a stable sort.
4026
+ */
4027
+ oSettings.aiDisplayMaster.sort( function ( a, b ) {
4028
+ var k, l, lLen, iTest, aDataSort, sDataType;
4029
+ for ( k=0 ; k<iSortLen ; k++ )
4030
+ {
4031
+ aDataSort = aoColumns[ aaSort[k][0] ].aDataSort;
4032
+
4033
+ for ( l=0, lLen=aDataSort.length ; l<lLen ; l++ )
4034
+ {
4035
+ sDataType = aoColumns[ aDataSort[l] ].sType;
4036
+
4037
+ iTest = oSort[ (sDataType ? sDataType : 'string')+"-"+aaSort[k][1] ](
4038
+ aoData[a]._aSortData[ aDataSort[l] ],
4039
+ aoData[b]._aSortData[ aDataSort[l] ]
4040
+ );
4041
+
4042
+ if ( iTest !== 0 )
4043
+ {
4044
+ return iTest;
4045
+ }
4046
+ }
4047
+ }
4048
+
4049
+ return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
4050
+ } );
4051
+ }
4052
+
4053
+ /* Alter the sorting classes to take account of the changes */
4054
+ if ( (bApplyClasses === undefined || bApplyClasses) && !oSettings.oFeatures.bDeferRender )
4055
+ {
4056
+ _fnSortingClasses( oSettings );
4057
+ }
4058
+
4059
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
4060
+ {
4061
+ var sTitle = aoColumns[i].sTitle.replace( /<.*?>/g, "" );
4062
+ nTh = aoColumns[i].nTh;
4063
+ nTh.removeAttribute('aria-sort');
4064
+ nTh.removeAttribute('aria-label');
4065
+
4066
+ /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
4067
+ if ( aoColumns[i].bSortable )
4068
+ {
4069
+ if ( aaSort.length > 0 && aaSort[0][0] == i )
4070
+ {
4071
+ nTh.setAttribute('aria-sort', aaSort[0][1]=="asc" ? "ascending" : "descending" );
4072
+
4073
+ var nextSort = (aoColumns[i].asSorting[ aaSort[0][2]+1 ]) ?
4074
+ aoColumns[i].asSorting[ aaSort[0][2]+1 ] : aoColumns[i].asSorting[0];
4075
+ nTh.setAttribute('aria-label', sTitle+
4076
+ (nextSort=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4077
+ }
4078
+ else
4079
+ {
4080
+ nTh.setAttribute('aria-label', sTitle+
4081
+ (aoColumns[i].asSorting[0]=="asc" ? oAria.sSortAscending : oAria.sSortDescending) );
4082
+ }
4083
+ }
4084
+ else
4085
+ {
4086
+ nTh.setAttribute('aria-label', sTitle);
4087
+ }
4088
+ }
4089
+
4090
+ /* Tell the draw function that we have sorted the data */
4091
+ oSettings.bSorted = true;
4092
+ $(oSettings.oInstance).trigger('sort', oSettings);
4093
+
4094
+ /* Copy the master data into the draw array and re-draw */
4095
+ if ( oSettings.oFeatures.bFilter )
4096
+ {
4097
+ /* _fnFilter() will redraw the table for us */
4098
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
4099
+ }
4100
+ else
4101
+ {
4102
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
4103
+ oSettings._iDisplayStart = 0; /* reset display back to page 0 */
4104
+ _fnCalculateEnd( oSettings );
4105
+ _fnDraw( oSettings );
4106
+ }
4107
+ }
4108
+
4109
+
4110
+ /**
4111
+ * Attach a sort handler (click) to a node
4112
+ * @param {object} oSettings dataTables settings object
4113
+ * @param {node} nNode node to attach the handler to
4114
+ * @param {int} iDataIndex column sorting index
4115
+ * @param {function} [fnCallback] callback function
4116
+ * @memberof DataTable#oApi
4117
+ */
4118
+ function _fnSortAttachListener ( oSettings, nNode, iDataIndex, fnCallback )
4119
+ {
4120
+ _fnBindAction( nNode, {}, function (e) {
4121
+ /* If the column is not sortable - don't to anything */
4122
+ if ( oSettings.aoColumns[iDataIndex].bSortable === false )
4123
+ {
4124
+ return;
4125
+ }
4126
+
4127
+ /*
4128
+ * This is a little bit odd I admit... I declare a temporary function inside the scope of
4129
+ * _fnBuildHead and the click handler in order that the code presented here can be used
4130
+ * twice - once for when bProcessing is enabled, and another time for when it is
4131
+ * disabled, as we need to perform slightly different actions.
4132
+ * Basically the issue here is that the Javascript engine in modern browsers don't
4133
+ * appear to allow the rendering engine to update the display while it is still executing
4134
+ * it's thread (well - it does but only after long intervals). This means that the
4135
+ * 'processing' display doesn't appear for a table sort. To break the js thread up a bit
4136
+ * I force an execution break by using setTimeout - but this breaks the expected
4137
+ * thread continuation for the end-developer's point of view (their code would execute
4138
+ * too early), so we only do it when we absolutely have to.
4139
+ */
4140
+ var fnInnerSorting = function () {
4141
+ var iColumn, iNextSort;
4142
+
4143
+ /* If the shift key is pressed then we are multiple column sorting */
4144
+ if ( e.shiftKey )
4145
+ {
4146
+ /* Are we already doing some kind of sort on this column? */
4147
+ var bFound = false;
4148
+ for ( var i=0 ; i<oSettings.aaSorting.length ; i++ )
4149
+ {
4150
+ if ( oSettings.aaSorting[i][0] == iDataIndex )
4151
+ {
4152
+ bFound = true;
4153
+ iColumn = oSettings.aaSorting[i][0];
4154
+ iNextSort = oSettings.aaSorting[i][2]+1;
4155
+
4156
+ if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
4157
+ {
4158
+ /* Reached the end of the sorting options, remove from multi-col sort */
4159
+ oSettings.aaSorting.splice( i, 1 );
4160
+ }
4161
+ else
4162
+ {
4163
+ /* Move onto next sorting direction */
4164
+ oSettings.aaSorting[i][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
4165
+ oSettings.aaSorting[i][2] = iNextSort;
4166
+ }
4167
+ break;
4168
+ }
4169
+ }
4170
+
4171
+ /* No sort yet - add it in */
4172
+ if ( bFound === false )
4173
+ {
4174
+ oSettings.aaSorting.push( [ iDataIndex,
4175
+ oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
4176
+ }
4177
+ }
4178
+ else
4179
+ {
4180
+ /* If no shift key then single column sort */
4181
+ if ( oSettings.aaSorting.length == 1 && oSettings.aaSorting[0][0] == iDataIndex )
4182
+ {
4183
+ iColumn = oSettings.aaSorting[0][0];
4184
+ iNextSort = oSettings.aaSorting[0][2]+1;
4185
+ if ( !oSettings.aoColumns[iColumn].asSorting[iNextSort] )
4186
+ {
4187
+ iNextSort = 0;
4188
+ }
4189
+ oSettings.aaSorting[0][1] = oSettings.aoColumns[iColumn].asSorting[iNextSort];
4190
+ oSettings.aaSorting[0][2] = iNextSort;
4191
+ }
4192
+ else
4193
+ {
4194
+ oSettings.aaSorting.splice( 0, oSettings.aaSorting.length );
4195
+ oSettings.aaSorting.push( [ iDataIndex,
4196
+ oSettings.aoColumns[iDataIndex].asSorting[0], 0 ] );
4197
+ }
4198
+ }
4199
+
4200
+ /* Run the sort */
4201
+ _fnSort( oSettings );
4202
+ }; /* /fnInnerSorting */
4203
+
4204
+ if ( !oSettings.oFeatures.bProcessing )
4205
+ {
4206
+ fnInnerSorting();
4207
+ }
4208
+ else
4209
+ {
4210
+ _fnProcessingDisplay( oSettings, true );
4211
+ setTimeout( function() {
4212
+ fnInnerSorting();
4213
+ if ( !oSettings.oFeatures.bServerSide )
4214
+ {
4215
+ _fnProcessingDisplay( oSettings, false );
4216
+ }
4217
+ }, 0 );
4218
+ }
4219
+
4220
+ /* Call the user specified callback function - used for async user interaction */
4221
+ if ( typeof fnCallback == 'function' )
4222
+ {
4223
+ fnCallback( oSettings );
4224
+ }
4225
+ } );
4226
+ }
4227
+
4228
+
4229
+ /**
4230
+ * Set the sorting classes on the header, Note: it is safe to call this function
4231
+ * when bSort and bSortClasses are false
4232
+ * @param {object} oSettings dataTables settings object
4233
+ * @memberof DataTable#oApi
4234
+ */
4235
+ function _fnSortingClasses( oSettings )
4236
+ {
4237
+ var i, iLen, j, jLen, iFound;
4238
+ var aaSort, sClass;
4239
+ var iColumns = oSettings.aoColumns.length;
4240
+ var oClasses = oSettings.oClasses;
4241
+
4242
+ for ( i=0 ; i<iColumns ; i++ )
4243
+ {
4244
+ if ( oSettings.aoColumns[i].bSortable )
4245
+ {
4246
+ $(oSettings.aoColumns[i].nTh).removeClass( oClasses.sSortAsc +" "+ oClasses.sSortDesc +
4247
+ " "+ oSettings.aoColumns[i].sSortingClass );
4248
+ }
4249
+ }
4250
+
4251
+ if ( oSettings.aaSortingFixed !== null )
4252
+ {
4253
+ aaSort = oSettings.aaSortingFixed.concat( oSettings.aaSorting );
4254
+ }
4255
+ else
4256
+ {
4257
+ aaSort = oSettings.aaSorting.slice();
4258
+ }
4259
+
4260
+ /* Apply the required classes to the header */
4261
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
4262
+ {
4263
+ if ( oSettings.aoColumns[i].bSortable )
4264
+ {
4265
+ sClass = oSettings.aoColumns[i].sSortingClass;
4266
+ iFound = -1;
4267
+ for ( j=0 ; j<aaSort.length ; j++ )
4268
+ {
4269
+ if ( aaSort[j][0] == i )
4270
+ {
4271
+ sClass = ( aaSort[j][1] == "asc" ) ?
4272
+ oClasses.sSortAsc : oClasses.sSortDesc;
4273
+ iFound = j;
4274
+ break;
4275
+ }
4276
+ }
4277
+ $(oSettings.aoColumns[i].nTh).addClass( sClass );
4278
+
4279
+ if ( oSettings.bJUI )
4280
+ {
4281
+ /* jQuery UI uses extra markup */
4282
+ var jqSpan = $("span."+oClasses.sSortIcon, oSettings.aoColumns[i].nTh);
4283
+ jqSpan.removeClass(oClasses.sSortJUIAsc +" "+ oClasses.sSortJUIDesc +" "+
4284
+ oClasses.sSortJUI +" "+ oClasses.sSortJUIAscAllowed +" "+ oClasses.sSortJUIDescAllowed );
4285
+
4286
+ var sSpanClass;
4287
+ if ( iFound == -1 )
4288
+ {
4289
+ sSpanClass = oSettings.aoColumns[i].sSortingClassJUI;
4290
+ }
4291
+ else if ( aaSort[iFound][1] == "asc" )
4292
+ {
4293
+ sSpanClass = oClasses.sSortJUIAsc;
4294
+ }
4295
+ else
4296
+ {
4297
+ sSpanClass = oClasses.sSortJUIDesc;
4298
+ }
4299
+
4300
+ jqSpan.addClass( sSpanClass );
4301
+ }
4302
+ }
4303
+ else
4304
+ {
4305
+ /* No sorting on this column, so add the base class. This will have been assigned by
4306
+ * _fnAddColumn
4307
+ */
4308
+ $(oSettings.aoColumns[i].nTh).addClass( oSettings.aoColumns[i].sSortingClass );
4309
+ }
4310
+ }
4311
+
4312
+ /*
4313
+ * Apply the required classes to the table body
4314
+ * Note that this is given as a feature switch since it can significantly slow down a sort
4315
+ * on large data sets (adding and removing of classes is always slow at the best of times..)
4316
+ * Further to this, note that this code is admittedly fairly ugly. It could be made a lot
4317
+ * simpler using jQuery selectors and add/removeClass, but that is significantly slower
4318
+ * (on the order of 5 times slower) - hence the direct DOM manipulation here.
4319
+ * Note that for deferred drawing we do use jQuery - the reason being that taking the first
4320
+ * row found to see if the whole column needs processed can miss classes since the first
4321
+ * column might be new.
4322
+ */
4323
+ sClass = oClasses.sSortColumn;
4324
+
4325
+ if ( oSettings.oFeatures.bSort && oSettings.oFeatures.bSortClasses )
4326
+ {
4327
+ var nTds = _fnGetTdNodes( oSettings );
4328
+
4329
+ /* Determine what the sorting class for each column should be */
4330
+ var iClass, iTargetCol;
4331
+ var asClasses = [];
4332
+ for (i = 0; i < iColumns; i++)
4333
+ {
4334
+ asClasses.push("");
4335
+ }
4336
+ for (i = 0, iClass = 1; i < aaSort.length; i++)
4337
+ {
4338
+ iTargetCol = parseInt( aaSort[i][0], 10 );
4339
+ asClasses[iTargetCol] = sClass + iClass;
4340
+
4341
+ if ( iClass < 3 )
4342
+ {
4343
+ iClass++;
4344
+ }
4345
+ }
4346
+
4347
+ /* Make changes to the classes for each cell as needed */
4348
+ var reClass = new RegExp(sClass + "[123]");
4349
+ var sTmpClass, sCurrentClass, sNewClass;
4350
+ for ( i=0, iLen=nTds.length; i<iLen; i++ )
4351
+ {
4352
+ /* Determine which column we're looking at */
4353
+ iTargetCol = i % iColumns;
4354
+
4355
+ /* What is the full list of classes now */
4356
+ sCurrentClass = nTds[i].className;
4357
+ /* What sorting class should be applied? */
4358
+ sNewClass = asClasses[iTargetCol];
4359
+ /* What would the new full list be if we did a replacement? */
4360
+ sTmpClass = sCurrentClass.replace(reClass, sNewClass);
4361
+
4362
+ if ( sTmpClass != sCurrentClass )
4363
+ {
4364
+ /* We changed something */
4365
+ nTds[i].className = $.trim( sTmpClass );
4366
+ }
4367
+ else if ( sNewClass.length > 0 && sCurrentClass.indexOf(sNewClass) == -1 )
4368
+ {
4369
+ /* We need to add a class */
4370
+ nTds[i].className = sCurrentClass + " " + sNewClass;
4371
+ }
4372
+ }
4373
+ }
4374
+ }
4375
+
4376
+
4377
+
4378
+ /**
4379
+ * Save the state of a table in a cookie such that the page can be reloaded
4380
+ * @param {object} oSettings dataTables settings object
4381
+ * @memberof DataTable#oApi
4382
+ */
4383
+ function _fnSaveState ( oSettings )
4384
+ {
4385
+ if ( !oSettings.oFeatures.bStateSave || oSettings.bDestroying )
4386
+ {
4387
+ return;
4388
+ }
4389
+
4390
+ /* Store the interesting variables */
4391
+ var i, iLen, bInfinite=oSettings.oScroll.bInfinite;
4392
+ var oState = {
4393
+ "iCreate": new Date().getTime(),
4394
+ "iStart": (bInfinite ? 0 : oSettings._iDisplayStart),
4395
+ "iEnd": (bInfinite ? oSettings._iDisplayLength : oSettings._iDisplayEnd),
4396
+ "iLength": oSettings._iDisplayLength,
4397
+ "aaSorting": $.extend( true, [], oSettings.aaSorting ),
4398
+ "oSearch": $.extend( true, {}, oSettings.oPreviousSearch ),
4399
+ "aoSearchCols": $.extend( true, [], oSettings.aoPreSearchCols ),
4400
+ "abVisCols": []
4401
+ };
4402
+
4403
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
4404
+ {
4405
+ oState.abVisCols.push( oSettings.aoColumns[i].bVisible );
4406
+ }
4407
+
4408
+ _fnCallbackFire( oSettings, "aoStateSaveParams", 'stateSaveParams', [oSettings, oState] );
4409
+
4410
+ oSettings.fnStateSave.call( oSettings.oInstance, oSettings, oState );
4411
+ }
4412
+
4413
+
4414
+ /**
4415
+ * Attempt to load a saved table state from a cookie
4416
+ * @param {object} oSettings dataTables settings object
4417
+ * @param {object} oInit DataTables init object so we can override settings
4418
+ * @memberof DataTable#oApi
4419
+ */
4420
+ function _fnLoadState ( oSettings, oInit )
4421
+ {
4422
+ if ( !oSettings.oFeatures.bStateSave )
4423
+ {
4424
+ return;
4425
+ }
4426
+
4427
+ var oData = oSettings.fnStateLoad.call( oSettings.oInstance, oSettings );
4428
+ if ( !oData )
4429
+ {
4430
+ return;
4431
+ }
4432
+
4433
+ /* Allow custom and plug-in manipulation functions to alter the saved data set and
4434
+ * cancelling of loading by returning false
4435
+ */
4436
+ var abStateLoad = _fnCallbackFire( oSettings, 'aoStateLoadParams', 'stateLoadParams', [oSettings, oData] );
4437
+ if ( $.inArray( false, abStateLoad ) !== -1 )
4438
+ {
4439
+ return;
4440
+ }
4441
+
4442
+ /* Store the saved state so it might be accessed at any time */
4443
+ oSettings.oLoadedState = $.extend( true, {}, oData );
4444
+
4445
+ /* Restore key features */
4446
+ oSettings._iDisplayStart = oData.iStart;
4447
+ oSettings.iInitDisplayStart = oData.iStart;
4448
+ oSettings._iDisplayEnd = oData.iEnd;
4449
+ oSettings._iDisplayLength = oData.iLength;
4450
+ oSettings.aaSorting = oData.aaSorting.slice();
4451
+ oSettings.saved_aaSorting = oData.aaSorting.slice();
4452
+
4453
+ /* Search filtering */
4454
+ $.extend( oSettings.oPreviousSearch, oData.oSearch );
4455
+ $.extend( true, oSettings.aoPreSearchCols, oData.aoSearchCols );
4456
+
4457
+ /* Column visibility state
4458
+ * Pass back visibility settings to the init handler, but to do not here override
4459
+ * the init object that the user might have passed in
4460
+ */
4461
+ oInit.saved_aoColumns = [];
4462
+ for ( var i=0 ; i<oData.abVisCols.length ; i++ )
4463
+ {
4464
+ oInit.saved_aoColumns[i] = {};
4465
+ oInit.saved_aoColumns[i].bVisible = oData.abVisCols[i];
4466
+ }
4467
+
4468
+ _fnCallbackFire( oSettings, 'aoStateLoaded', 'stateLoaded', [oSettings, oData] );
4469
+ }
4470
+
4471
+
4472
+ /**
4473
+ * Create a new cookie with a value to store the state of a table
4474
+ * @param {string} sName name of the cookie to create
4475
+ * @param {string} sValue the value the cookie should take
4476
+ * @param {int} iSecs duration of the cookie
4477
+ * @param {string} sBaseName sName is made up of the base + file name - this is the base
4478
+ * @param {function} fnCallback User definable function to modify the cookie
4479
+ * @memberof DataTable#oApi
4480
+ */
4481
+ function _fnCreateCookie ( sName, sValue, iSecs, sBaseName, fnCallback )
4482
+ {
4483
+ var date = new Date();
4484
+ date.setTime( date.getTime()+(iSecs*1000) );
4485
+
4486
+ /*
4487
+ * Shocking but true - it would appear IE has major issues with having the path not having
4488
+ * a trailing slash on it. We need the cookie to be available based on the path, so we
4489
+ * have to append the file name to the cookie name. Appalling. Thanks to vex for adding the
4490
+ * patch to use at least some of the path
4491
+ */
4492
+ var aParts = window.location.pathname.split('/');
4493
+ var sNameFile = sName + '_' + aParts.pop().replace(/[\/:]/g,"").toLowerCase();
4494
+ var sFullCookie, oData;
4495
+
4496
+ if ( fnCallback !== null )
4497
+ {
4498
+ oData = (typeof $.parseJSON === 'function') ?
4499
+ $.parseJSON( sValue ) : eval( '('+sValue+')' );
4500
+ sFullCookie = fnCallback( sNameFile, oData, date.toGMTString(),
4501
+ aParts.join('/')+"/" );
4502
+ }
4503
+ else
4504
+ {
4505
+ sFullCookie = sNameFile + "=" + encodeURIComponent(sValue) +
4506
+ "; expires=" + date.toGMTString() +"; path=" + aParts.join('/')+"/";
4507
+ }
4508
+
4509
+ /* Are we going to go over the cookie limit of 4KiB? If so, try to delete a cookies
4510
+ * belonging to DataTables.
4511
+ */
4512
+ var
4513
+ aCookies =document.cookie.split(';'),
4514
+ iNewCookieLen = sFullCookie.split(';')[0].length,
4515
+ aOldCookies = [];
4516
+
4517
+ if ( iNewCookieLen+document.cookie.length+10 > 4096 ) /* Magic 10 for padding */
4518
+ {
4519
+ for ( var i=0, iLen=aCookies.length ; i<iLen ; i++ )
4520
+ {
4521
+ if ( aCookies[i].indexOf( sBaseName ) != -1 )
4522
+ {
4523
+ /* It's a DataTables cookie, so eval it and check the time stamp */
4524
+ var aSplitCookie = aCookies[i].split('=');
4525
+ try {
4526
+ oData = eval( '('+decodeURIComponent(aSplitCookie[1])+')' );
4527
+
4528
+ if ( oData && oData.iCreate )
4529
+ {
4530
+ aOldCookies.push( {
4531
+ "name": aSplitCookie[0],
4532
+ "time": oData.iCreate
4533
+ } );
4534
+ }
4535
+ }
4536
+ catch( e ) {}
4537
+ }
4538
+ }
4539
+
4540
+ // Make sure we delete the oldest ones first
4541
+ aOldCookies.sort( function (a, b) {
4542
+ return b.time - a.time;
4543
+ } );
4544
+
4545
+ // Eliminate as many old DataTables cookies as we need to
4546
+ while ( iNewCookieLen + document.cookie.length + 10 > 4096 ) {
4547
+ if ( aOldCookies.length === 0 ) {
4548
+ // Deleted all DT cookies and still not enough space. Can't state save
4549
+ return;
4550
+ }
4551
+
4552
+ var old = aOldCookies.pop();
4553
+ document.cookie = old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+
4554
+ aParts.join('/') + "/";
4555
+ }
4556
+ }
4557
+
4558
+ document.cookie = sFullCookie;
4559
+ }
4560
+
4561
+
4562
+ /**
4563
+ * Read an old cookie to get a cookie with an old table state
4564
+ * @param {string} sName name of the cookie to read
4565
+ * @returns {string} contents of the cookie - or null if no cookie with that name found
4566
+ * @memberof DataTable#oApi
4567
+ */
4568
+ function _fnReadCookie ( sName )
4569
+ {
4570
+ var
4571
+ aParts = window.location.pathname.split('/'),
4572
+ sNameEQ = sName + '_' + aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase() + '=',
4573
+ sCookieContents = document.cookie.split(';');
4574
+
4575
+ for( var i=0 ; i<sCookieContents.length ; i++ )
4576
+ {
4577
+ var c = sCookieContents[i];
4578
+
4579
+ while (c.charAt(0)==' ')
4580
+ {
4581
+ c = c.substring(1,c.length);
4582
+ }
4583
+
4584
+ if (c.indexOf(sNameEQ) === 0)
4585
+ {
4586
+ return decodeURIComponent( c.substring(sNameEQ.length,c.length) );
4587
+ }
4588
+ }
4589
+ return null;
4590
+ }
4591
+
4592
+
4593
+ /**
4594
+ * Return the settings object for a particular table
4595
+ * @param {node} nTable table we are using as a dataTable
4596
+ * @returns {object} Settings object - or null if not found
4597
+ * @memberof DataTable#oApi
4598
+ */
4599
+ function _fnSettingsFromNode ( nTable )
4600
+ {
4601
+ for ( var i=0 ; i<DataTable.settings.length ; i++ )
4602
+ {
4603
+ if ( DataTable.settings[i].nTable === nTable )
4604
+ {
4605
+ return DataTable.settings[i];
4606
+ }
4607
+ }
4608
+
4609
+ return null;
4610
+ }
4611
+
4612
+
4613
+ /**
4614
+ * Return an array with the TR nodes for the table
4615
+ * @param {object} oSettings dataTables settings object
4616
+ * @returns {array} TR array
4617
+ * @memberof DataTable#oApi
4618
+ */
4619
+ function _fnGetTrNodes ( oSettings )
4620
+ {
4621
+ var aNodes = [];
4622
+ var aoData = oSettings.aoData;
4623
+ for ( var i=0, iLen=aoData.length ; i<iLen ; i++ )
4624
+ {
4625
+ if ( aoData[i].nTr !== null )
4626
+ {
4627
+ aNodes.push( aoData[i].nTr );
4628
+ }
4629
+ }
4630
+ return aNodes;
4631
+ }
4632
+
4633
+
4634
+ /**
4635
+ * Return an flat array with all TD nodes for the table, or row
4636
+ * @param {object} oSettings dataTables settings object
4637
+ * @param {int} [iIndividualRow] aoData index to get the nodes for - optional
4638
+ * if not given then the return array will contain all nodes for the table
4639
+ * @returns {array} TD array
4640
+ * @memberof DataTable#oApi
4641
+ */
4642
+ function _fnGetTdNodes ( oSettings, iIndividualRow )
4643
+ {
4644
+ var anReturn = [];
4645
+ var iCorrector;
4646
+ var anTds, nTd;
4647
+ var iRow, iRows=oSettings.aoData.length,
4648
+ iColumn, iColumns, oData, sNodeName, iStart=0, iEnd=iRows;
4649
+
4650
+ /* Allow the collection to be limited to just one row */
4651
+ if ( iIndividualRow !== undefined )
4652
+ {
4653
+ iStart = iIndividualRow;
4654
+ iEnd = iIndividualRow+1;
4655
+ }
4656
+
4657
+ for ( iRow=iStart ; iRow<iEnd ; iRow++ )
4658
+ {
4659
+ oData = oSettings.aoData[iRow];
4660
+ if ( oData.nTr !== null )
4661
+ {
4662
+ /* get the TD child nodes - taking into account text etc nodes */
4663
+ anTds = [];
4664
+ nTd = oData.nTr.firstChild;
4665
+ while ( nTd )
4666
+ {
4667
+ sNodeName = nTd.nodeName.toLowerCase();
4668
+ if ( sNodeName == 'td' || sNodeName == 'th' )
4669
+ {
4670
+ anTds.push( nTd );
4671
+ }
4672
+ nTd = nTd.nextSibling;
4673
+ }
4674
+
4675
+ iCorrector = 0;
4676
+ for ( iColumn=0, iColumns=oSettings.aoColumns.length ; iColumn<iColumns ; iColumn++ )
4677
+ {
4678
+ if ( oSettings.aoColumns[iColumn].bVisible )
4679
+ {
4680
+ anReturn.push( anTds[iColumn-iCorrector] );
4681
+ }
4682
+ else
4683
+ {
4684
+ anReturn.push( oData._anHidden[iColumn] );
4685
+ iCorrector++;
4686
+ }
4687
+ }
4688
+ }
4689
+ }
4690
+
4691
+ return anReturn;
4692
+ }
4693
+
4694
+
4695
+ /**
4696
+ * Log an error message
4697
+ * @param {object} oSettings dataTables settings object
4698
+ * @param {int} iLevel log error messages, or display them to the user
4699
+ * @param {string} sMesg error message
4700
+ * @memberof DataTable#oApi
4701
+ */
4702
+ function _fnLog( oSettings, iLevel, sMesg )
4703
+ {
4704
+ var sAlert = (oSettings===null) ?
4705
+ "DataTables warning: "+sMesg :
4706
+ "DataTables warning (table id = '"+oSettings.sTableId+"'): "+sMesg;
4707
+
4708
+ if ( iLevel === 0 )
4709
+ {
4710
+ if ( DataTable.ext.sErrMode == 'alert' )
4711
+ {
4712
+ alert( sAlert );
4713
+ }
4714
+ else
4715
+ {
4716
+ throw new Error(sAlert);
4717
+ }
4718
+ return;
4719
+ }
4720
+ else if ( window.console && console.log )
4721
+ {
4722
+ console.log( sAlert );
4723
+ }
4724
+ }
4725
+
4726
+
4727
+ /**
4728
+ * See if a property is defined on one object, if so assign it to the other object
4729
+ * @param {object} oRet target object
4730
+ * @param {object} oSrc source object
4731
+ * @param {string} sName property
4732
+ * @param {string} [sMappedName] name to map too - optional, sName used if not given
4733
+ * @memberof DataTable#oApi
4734
+ */
4735
+ function _fnMap( oRet, oSrc, sName, sMappedName )
4736
+ {
4737
+ if ( sMappedName === undefined )
4738
+ {
4739
+ sMappedName = sName;
4740
+ }
4741
+ if ( oSrc[sName] !== undefined )
4742
+ {
4743
+ oRet[sMappedName] = oSrc[sName];
4744
+ }
4745
+ }
4746
+
4747
+
4748
+ /**
4749
+ * Extend objects - very similar to jQuery.extend, but deep copy objects, and shallow
4750
+ * copy arrays. The reason we need to do this, is that we don't want to deep copy array
4751
+ * init values (such as aaSorting) since the dev wouldn't be able to override them, but
4752
+ * we do want to deep copy arrays.
4753
+ * @param {object} oOut Object to extend
4754
+ * @param {object} oExtender Object from which the properties will be applied to oOut
4755
+ * @returns {object} oOut Reference, just for convenience - oOut === the return.
4756
+ * @memberof DataTable#oApi
4757
+ * @todo This doesn't take account of arrays inside the deep copied objects.
4758
+ */
4759
+ function _fnExtend( oOut, oExtender )
4760
+ {
4761
+ var val;
4762
+
4763
+ for ( var prop in oExtender )
4764
+ {
4765
+ if ( oExtender.hasOwnProperty(prop) )
4766
+ {
4767
+ val = oExtender[prop];
4768
+
4769
+ if ( typeof oInit[prop] === 'object' && val !== null && $.isArray(val) === false )
4770
+ {
4771
+ $.extend( true, oOut[prop], val );
4772
+ }
4773
+ else
4774
+ {
4775
+ oOut[prop] = val;
4776
+ }
4777
+ }
4778
+ }
4779
+
4780
+ return oOut;
4781
+ }
4782
+
4783
+
4784
+ /**
4785
+ * Bind an event handers to allow a click or return key to activate the callback.
4786
+ * This is good for accessibility since a return on the keyboard will have the
4787
+ * same effect as a click, if the element has focus.
4788
+ * @param {element} n Element to bind the action to
4789
+ * @param {object} oData Data object to pass to the triggered function
4790
+ * @param {function} fn Callback function for when the event is triggered
4791
+ * @memberof DataTable#oApi
4792
+ */
4793
+ function _fnBindAction( n, oData, fn )
4794
+ {
4795
+ $(n)
4796
+ .bind( 'click.DT', oData, function (e) {
4797
+ n.blur(); // Remove focus outline for mouse users
4798
+ fn(e);
4799
+ } )
4800
+ .bind( 'keypress.DT', oData, function (e){
4801
+ if ( e.which === 13 ) {
4802
+ fn(e);
4803
+ } } )
4804
+ .bind( 'selectstart.DT', function () {
4805
+ /* Take the brutal approach to cancelling text selection */
4806
+ return false;
4807
+ } );
4808
+ }
4809
+
4810
+
4811
+ /**
4812
+ * Register a callback function. Easily allows a callback function to be added to
4813
+ * an array store of callback functions that can then all be called together.
4814
+ * @param {object} oSettings dataTables settings object
4815
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
4816
+ * @param {function} fn Function to be called back
4817
+ * @param {string} sName Identifying name for the callback (i.e. a label)
4818
+ * @memberof DataTable#oApi
4819
+ */
4820
+ function _fnCallbackReg( oSettings, sStore, fn, sName )
4821
+ {
4822
+ if ( fn )
4823
+ {
4824
+ oSettings[sStore].push( {
4825
+ "fn": fn,
4826
+ "sName": sName
4827
+ } );
4828
+ }
4829
+ }
4830
+
4831
+
4832
+ /**
4833
+ * Fire callback functions and trigger events. Note that the loop over the callback
4834
+ * array store is done backwards! Further note that you do not want to fire off triggers
4835
+ * in time sensitive applications (for example cell creation) as its slow.
4836
+ * @param {object} oSettings dataTables settings object
4837
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
4838
+ * @param {string} sTrigger Name of the jQuery custom event to trigger. If null no trigger
4839
+ * is fired
4840
+ * @param {array} aArgs Array of arguments to pass to the callback function / trigger
4841
+ * @memberof DataTable#oApi
4842
+ */
4843
+ function _fnCallbackFire( oSettings, sStore, sTrigger, aArgs )
4844
+ {
4845
+ var aoStore = oSettings[sStore];
4846
+ var aRet =[];
4847
+
4848
+ for ( var i=aoStore.length-1 ; i>=0 ; i-- )
4849
+ {
4850
+ aRet.push( aoStore[i].fn.apply( oSettings.oInstance, aArgs ) );
4851
+ }
4852
+
4853
+ if ( sTrigger !== null )
4854
+ {
4855
+ $(oSettings.oInstance).trigger(sTrigger, aArgs);
4856
+ }
4857
+
4858
+ return aRet;
4859
+ }
4860
+
4861
+
4862
+ /**
4863
+ * JSON stringify. If JSON.stringify it provided by the browser, json2.js or any other
4864
+ * library, then we use that as it is fast, safe and accurate. If the function isn't
4865
+ * available then we need to built it ourselves - the inspiration for this function comes
4866
+ * from Craig Buckler ( http://www.sitepoint.com/javascript-json-serialization/ ). It is
4867
+ * not perfect and absolutely should not be used as a replacement to json2.js - but it does
4868
+ * do what we need, without requiring a dependency for DataTables.
4869
+ * @param {object} o JSON object to be converted
4870
+ * @returns {string} JSON string
4871
+ * @memberof DataTable#oApi
4872
+ */
4873
+ var _fnJsonString = (window.JSON) ? JSON.stringify : function( o )
4874
+ {
4875
+ /* Not an object or array */
4876
+ var sType = typeof o;
4877
+ if (sType !== "object" || o === null)
4878
+ {
4879
+ // simple data type
4880
+ if (sType === "string")
4881
+ {
4882
+ o = '"'+o+'"';
4883
+ }
4884
+ return o+"";
4885
+ }
4886
+
4887
+ /* If object or array, need to recurse over it */
4888
+ var
4889
+ sProp, mValue,
4890
+ json = [],
4891
+ bArr = $.isArray(o);
4892
+
4893
+ for (sProp in o)
4894
+ {
4895
+ mValue = o[sProp];
4896
+ sType = typeof mValue;
4897
+
4898
+ if (sType === "string")
4899
+ {
4900
+ mValue = '"'+mValue+'"';
4901
+ }
4902
+ else if (sType === "object" && mValue !== null)
4903
+ {
4904
+ mValue = _fnJsonString(mValue);
4905
+ }
4906
+
4907
+ json.push((bArr ? "" : '"'+sProp+'":') + mValue);
4908
+ }
4909
+
4910
+ return (bArr ? "[" : "{") + json + (bArr ? "]" : "}");
4911
+ };
4912
+
4913
+
4914
+ /**
4915
+ * From some browsers (specifically IE6/7) we need special handling to work around browser
4916
+ * bugs - this function is used to detect when these workarounds are needed.
4917
+ * @param {object} oSettings dataTables settings object
4918
+ * @memberof DataTable#oApi
4919
+ */
4920
+ function _fnBrowserDetect( oSettings )
4921
+ {
4922
+ /* IE6/7 will oversize a width 100% element inside a scrolling element, to include the
4923
+ * width of the scrollbar, while other browsers ensure the inner element is contained
4924
+ * without forcing scrolling
4925
+ */
4926
+ var n = $(
4927
+ '<div style="position:absolute; top:0; left:0; height:1px; width:1px; overflow:hidden">'+
4928
+ '<div style="position:absolute; top:1px; left:1px; width:100px; overflow:scroll;">'+
4929
+ '<div id="DT_BrowserTest" style="width:100%; height:10px;"></div>'+
4930
+ '</div>'+
4931
+ '</div>')[0];
4932
+
4933
+ document.body.appendChild( n );
4934
+ oSettings.oBrowser.bScrollOversize = $('#DT_BrowserTest', n)[0].offsetWidth === 100 ? true : false;
4935
+ document.body.removeChild( n );
4936
+ }
4937
+
4938
+
4939
+ /**
4940
+ * Perform a jQuery selector action on the table's TR elements (from the tbody) and
4941
+ * return the resulting jQuery object.
4942
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
4943
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
4944
+ * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
4945
+ * criterion ("applied") or all TR elements (i.e. no filter).
4946
+ * @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
4947
+ * Can be either 'current', whereby the current sorting of the table is used, or
4948
+ * 'original' whereby the original order the data was read into the table is used.
4949
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
4950
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
4951
+ * 'current' and filter is 'applied', regardless of what they might be given as.
4952
+ * @returns {object} jQuery object, filtered by the given selector.
4953
+ * @dtopt API
4954
+ *
4955
+ * @example
4956
+ * $(document).ready(function() {
4957
+ * var oTable = $('#example').dataTable();
4958
+ *
4959
+ * // Highlight every second row
4960
+ * oTable.$('tr:odd').css('backgroundColor', 'blue');
4961
+ * } );
4962
+ *
4963
+ * @example
4964
+ * $(document).ready(function() {
4965
+ * var oTable = $('#example').dataTable();
4966
+ *
4967
+ * // Filter to rows with 'Webkit' in them, add a background colour and then
4968
+ * // remove the filter, thus highlighting the 'Webkit' rows only.
4969
+ * oTable.fnFilter('Webkit');
4970
+ * oTable.$('tr', {"filter": "applied"}).css('backgroundColor', 'blue');
4971
+ * oTable.fnFilter('');
4972
+ * } );
4973
+ */
4974
+ this.$ = function ( sSelector, oOpts )
4975
+ {
4976
+ var i, iLen, a = [], tr;
4977
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
4978
+ var aoData = oSettings.aoData;
4979
+ var aiDisplay = oSettings.aiDisplay;
4980
+ var aiDisplayMaster = oSettings.aiDisplayMaster;
4981
+
4982
+ if ( !oOpts )
4983
+ {
4984
+ oOpts = {};
4985
+ }
4986
+
4987
+ oOpts = $.extend( {}, {
4988
+ "filter": "none", // applied
4989
+ "order": "current", // "original"
4990
+ "page": "all" // current
4991
+ }, oOpts );
4992
+
4993
+ // Current page implies that order=current and fitler=applied, since it is fairly
4994
+ // senseless otherwise
4995
+ if ( oOpts.page == 'current' )
4996
+ {
4997
+ for ( i=oSettings._iDisplayStart, iLen=oSettings.fnDisplayEnd() ; i<iLen ; i++ )
4998
+ {
4999
+ tr = aoData[ aiDisplay[i] ].nTr;
5000
+ if ( tr )
5001
+ {
5002
+ a.push( tr );
5003
+ }
5004
+ }
5005
+ }
5006
+ else if ( oOpts.order == "current" && oOpts.filter == "none" )
5007
+ {
5008
+ for ( i=0, iLen=aiDisplayMaster.length ; i<iLen ; i++ )
5009
+ {
5010
+ tr = aoData[ aiDisplayMaster[i] ].nTr;
5011
+ if ( tr )
5012
+ {
5013
+ a.push( tr );
5014
+ }
5015
+ }
5016
+ }
5017
+ else if ( oOpts.order == "current" && oOpts.filter == "applied" )
5018
+ {
5019
+ for ( i=0, iLen=aiDisplay.length ; i<iLen ; i++ )
5020
+ {
5021
+ tr = aoData[ aiDisplay[i] ].nTr;
5022
+ if ( tr )
5023
+ {
5024
+ a.push( tr );
5025
+ }
5026
+ }
5027
+ }
5028
+ else if ( oOpts.order == "original" && oOpts.filter == "none" )
5029
+ {
5030
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5031
+ {
5032
+ tr = aoData[ i ].nTr ;
5033
+ if ( tr )
5034
+ {
5035
+ a.push( tr );
5036
+ }
5037
+ }
5038
+ }
5039
+ else if ( oOpts.order == "original" && oOpts.filter == "applied" )
5040
+ {
5041
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5042
+ {
5043
+ tr = aoData[ i ].nTr;
5044
+ if ( $.inArray( i, aiDisplay ) !== -1 && tr )
5045
+ {
5046
+ a.push( tr );
5047
+ }
5048
+ }
5049
+ }
5050
+ else
5051
+ {
5052
+ _fnLog( oSettings, 1, "Unknown selection options" );
5053
+ }
5054
+
5055
+ /* We need to filter on the TR elements and also 'find' in their descendants
5056
+ * to make the selector act like it would in a full table - so we need
5057
+ * to build both results and then combine them together
5058
+ */
5059
+ var jqA = $(a);
5060
+ var jqTRs = jqA.filter( sSelector );
5061
+ var jqDescendants = jqA.find( sSelector );
5062
+
5063
+ return $( [].concat($.makeArray(jqTRs), $.makeArray(jqDescendants)) );
5064
+ };
5065
+
5066
+
5067
+ /**
5068
+ * Almost identical to $ in operation, but in this case returns the data for the matched
5069
+ * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
5070
+ * rather than any descendants, so the data can be obtained for the row/cell. If matching
5071
+ * rows are found, the data returned is the original data array/object that was used to
5072
+ * create the row (or a generated array if from a DOM source).
5073
+ *
5074
+ * This method is often useful in-combination with $ where both functions are given the
5075
+ * same parameters and the array indexes will match identically.
5076
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
5077
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
5078
+ * @param {string} [oOpts.filter=none] Select elements that meet the current filter
5079
+ * criterion ("applied") or all elements (i.e. no filter).
5080
+ * @param {string} [oOpts.order=current] Order of the data in the processed array.
5081
+ * Can be either 'current', whereby the current sorting of the table is used, or
5082
+ * 'original' whereby the original order the data was read into the table is used.
5083
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
5084
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
5085
+ * 'current' and filter is 'applied', regardless of what they might be given as.
5086
+ * @returns {array} Data for the matched elements. If any elements, as a result of the
5087
+ * selector, were not TR, TD or TH elements in the DataTable, they will have a null
5088
+ * entry in the array.
5089
+ * @dtopt API
5090
+ *
5091
+ * @example
5092
+ * $(document).ready(function() {
5093
+ * var oTable = $('#example').dataTable();
5094
+ *
5095
+ * // Get the data from the first row in the table
5096
+ * var data = oTable._('tr:first');
5097
+ *
5098
+ * // Do something useful with the data
5099
+ * alert( "First cell is: "+data[0] );
5100
+ * } );
5101
+ *
5102
+ * @example
5103
+ * $(document).ready(function() {
5104
+ * var oTable = $('#example').dataTable();
5105
+ *
5106
+ * // Filter to 'Webkit' and get all data for
5107
+ * oTable.fnFilter('Webkit');
5108
+ * var data = oTable._('tr', {"filter": "applied"});
5109
+ *
5110
+ * // Do something with the data
5111
+ * alert( data.length+" rows matched the filter" );
5112
+ * } );
5113
+ */
5114
+ this._ = function ( sSelector, oOpts )
5115
+ {
5116
+ var aOut = [];
5117
+ var i, iLen, iIndex;
5118
+ var aTrs = this.$( sSelector, oOpts );
5119
+
5120
+ for ( i=0, iLen=aTrs.length ; i<iLen ; i++ )
5121
+ {
5122
+ aOut.push( this.fnGetData(aTrs[i]) );
5123
+ }
5124
+
5125
+ return aOut;
5126
+ };
5127
+
5128
+
5129
+ /**
5130
+ * Add a single new row or multiple rows of data to the table. Please note
5131
+ * that this is suitable for client-side processing only - if you are using
5132
+ * server-side processing (i.e. "bServerSide": true), then to add data, you
5133
+ * must add it to the data source, i.e. the server-side, through an Ajax call.
5134
+ * @param {array|object} mData The data to be added to the table. This can be:
5135
+ * <ul>
5136
+ * <li>1D array of data - add a single row with the data provided</li>
5137
+ * <li>2D array of arrays - add multiple rows in a single call</li>
5138
+ * <li>object - data object when using <i>mData</i></li>
5139
+ * <li>array of objects - multiple data objects when using <i>mData</i></li>
5140
+ * </ul>
5141
+ * @param {bool} [bRedraw=true] redraw the table or not
5142
+ * @returns {array} An array of integers, representing the list of indexes in
5143
+ * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
5144
+ * the table.
5145
+ * @dtopt API
5146
+ *
5147
+ * @example
5148
+ * // Global var for counter
5149
+ * var giCount = 2;
5150
+ *
5151
+ * $(document).ready(function() {
5152
+ * $('#example').dataTable();
5153
+ * } );
5154
+ *
5155
+ * function fnClickAddRow() {
5156
+ * $('#example').dataTable().fnAddData( [
5157
+ * giCount+".1",
5158
+ * giCount+".2",
5159
+ * giCount+".3",
5160
+ * giCount+".4" ]
5161
+ * );
5162
+ *
5163
+ * giCount++;
5164
+ * }
5165
+ */
5166
+ this.fnAddData = function( mData, bRedraw )
5167
+ {
5168
+ if ( mData.length === 0 )
5169
+ {
5170
+ return [];
5171
+ }
5172
+
5173
+ var aiReturn = [];
5174
+ var iTest;
5175
+
5176
+ /* Find settings from table node */
5177
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5178
+
5179
+ /* Check if we want to add multiple rows or not */
5180
+ if ( typeof mData[0] === "object" && mData[0] !== null )
5181
+ {
5182
+ for ( var i=0 ; i<mData.length ; i++ )
5183
+ {
5184
+ iTest = _fnAddData( oSettings, mData[i] );
5185
+ if ( iTest == -1 )
5186
+ {
5187
+ return aiReturn;
5188
+ }
5189
+ aiReturn.push( iTest );
5190
+ }
5191
+ }
5192
+ else
5193
+ {
5194
+ iTest = _fnAddData( oSettings, mData );
5195
+ if ( iTest == -1 )
5196
+ {
5197
+ return aiReturn;
5198
+ }
5199
+ aiReturn.push( iTest );
5200
+ }
5201
+
5202
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
5203
+
5204
+ if ( bRedraw === undefined || bRedraw )
5205
+ {
5206
+ _fnReDraw( oSettings );
5207
+ }
5208
+ return aiReturn;
5209
+ };
5210
+
5211
+
5212
+ /**
5213
+ * This function will make DataTables recalculate the column sizes, based on the data
5214
+ * contained in the table and the sizes applied to the columns (in the DOM, CSS or
5215
+ * through the sWidth parameter). This can be useful when the width of the table's
5216
+ * parent element changes (for example a window resize).
5217
+ * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
5218
+ * @dtopt API
5219
+ *
5220
+ * @example
5221
+ * $(document).ready(function() {
5222
+ * var oTable = $('#example').dataTable( {
5223
+ * "sScrollY": "200px",
5224
+ * "bPaginate": false
5225
+ * } );
5226
+ *
5227
+ * $(window).bind('resize', function () {
5228
+ * oTable.fnAdjustColumnSizing();
5229
+ * } );
5230
+ * } );
5231
+ */
5232
+ this.fnAdjustColumnSizing = function ( bRedraw )
5233
+ {
5234
+ var oSettings = _fnSettingsFromNode(this[DataTable.ext.iApiIndex]);
5235
+ _fnAdjustColumnSizing( oSettings );
5236
+
5237
+ if ( bRedraw === undefined || bRedraw )
5238
+ {
5239
+ this.fnDraw( false );
5240
+ }
5241
+ else if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
5242
+ {
5243
+ /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
5244
+ this.oApi._fnScrollDraw(oSettings);
5245
+ }
5246
+ };
5247
+
5248
+
5249
+ /**
5250
+ * Quickly and simply clear a table
5251
+ * @param {bool} [bRedraw=true] redraw the table or not
5252
+ * @dtopt API
5253
+ *
5254
+ * @example
5255
+ * $(document).ready(function() {
5256
+ * var oTable = $('#example').dataTable();
5257
+ *
5258
+ * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
5259
+ * oTable.fnClearTable();
5260
+ * } );
5261
+ */
5262
+ this.fnClearTable = function( bRedraw )
5263
+ {
5264
+ /* Find settings from table node */
5265
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5266
+ _fnClearTable( oSettings );
5267
+
5268
+ if ( bRedraw === undefined || bRedraw )
5269
+ {
5270
+ _fnDraw( oSettings );
5271
+ }
5272
+ };
5273
+
5274
+
5275
+ /**
5276
+ * The exact opposite of 'opening' a row, this function will close any rows which
5277
+ * are currently 'open'.
5278
+ * @param {node} nTr the table row to 'close'
5279
+ * @returns {int} 0 on success, or 1 if failed (can't find the row)
5280
+ * @dtopt API
5281
+ *
5282
+ * @example
5283
+ * $(document).ready(function() {
5284
+ * var oTable;
5285
+ *
5286
+ * // 'open' an information row when a row is clicked on
5287
+ * $('#example tbody tr').click( function () {
5288
+ * if ( oTable.fnIsOpen(this) ) {
5289
+ * oTable.fnClose( this );
5290
+ * } else {
5291
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
5292
+ * }
5293
+ * } );
5294
+ *
5295
+ * oTable = $('#example').dataTable();
5296
+ * } );
5297
+ */
5298
+ this.fnClose = function( nTr )
5299
+ {
5300
+ /* Find settings from table node */
5301
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5302
+
5303
+ for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
5304
+ {
5305
+ if ( oSettings.aoOpenRows[i].nParent == nTr )
5306
+ {
5307
+ var nTrParent = oSettings.aoOpenRows[i].nTr.parentNode;
5308
+ if ( nTrParent )
5309
+ {
5310
+ /* Remove it if it is currently on display */
5311
+ nTrParent.removeChild( oSettings.aoOpenRows[i].nTr );
5312
+ }
5313
+ oSettings.aoOpenRows.splice( i, 1 );
5314
+ return 0;
5315
+ }
5316
+ }
5317
+ return 1;
5318
+ };
5319
+
5320
+
5321
+ /**
5322
+ * Remove a row for the table
5323
+ * @param {mixed} mTarget The index of the row from aoData to be deleted, or
5324
+ * the TR element you want to delete
5325
+ * @param {function|null} [fnCallBack] Callback function
5326
+ * @param {bool} [bRedraw=true] Redraw the table or not
5327
+ * @returns {array} The row that was deleted
5328
+ * @dtopt API
5329
+ *
5330
+ * @example
5331
+ * $(document).ready(function() {
5332
+ * var oTable = $('#example').dataTable();
5333
+ *
5334
+ * // Immediately remove the first row
5335
+ * oTable.fnDeleteRow( 0 );
5336
+ * } );
5337
+ */
5338
+ this.fnDeleteRow = function( mTarget, fnCallBack, bRedraw )
5339
+ {
5340
+ /* Find settings from table node */
5341
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5342
+ var i, iLen, iAODataIndex;
5343
+
5344
+ iAODataIndex = (typeof mTarget === 'object') ?
5345
+ _fnNodeToDataIndex(oSettings, mTarget) : mTarget;
5346
+
5347
+ /* Return the data array from this row */
5348
+ var oData = oSettings.aoData.splice( iAODataIndex, 1 );
5349
+
5350
+ /* Update the _DT_RowIndex parameter */
5351
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
5352
+ {
5353
+ if ( oSettings.aoData[i].nTr !== null )
5354
+ {
5355
+ oSettings.aoData[i].nTr._DT_RowIndex = i;
5356
+ }
5357
+ }
5358
+
5359
+ /* Remove the target row from the search array */
5360
+ var iDisplayIndex = $.inArray( iAODataIndex, oSettings.aiDisplay );
5361
+ oSettings.asDataSearch.splice( iDisplayIndex, 1 );
5362
+
5363
+ /* Delete from the display arrays */
5364
+ _fnDeleteIndex( oSettings.aiDisplayMaster, iAODataIndex );
5365
+ _fnDeleteIndex( oSettings.aiDisplay, iAODataIndex );
5366
+
5367
+ /* If there is a user callback function - call it */
5368
+ if ( typeof fnCallBack === "function" )
5369
+ {
5370
+ fnCallBack.call( this, oSettings, oData );
5371
+ }
5372
+
5373
+ /* Check for an 'overflow' they case for displaying the table */
5374
+ if ( oSettings._iDisplayStart >= oSettings.fnRecordsDisplay() )
5375
+ {
5376
+ oSettings._iDisplayStart -= oSettings._iDisplayLength;
5377
+ if ( oSettings._iDisplayStart < 0 )
5378
+ {
5379
+ oSettings._iDisplayStart = 0;
5380
+ }
5381
+ }
5382
+
5383
+ if ( bRedraw === undefined || bRedraw )
5384
+ {
5385
+ _fnCalculateEnd( oSettings );
5386
+ _fnDraw( oSettings );
5387
+ }
5388
+
5389
+ return oData;
5390
+ };
5391
+
5392
+
5393
+ /**
5394
+ * Restore the table to it's original state in the DOM by removing all of DataTables
5395
+ * enhancements, alterations to the DOM structure of the table and event listeners.
5396
+ * @param {boolean} [bRemove=false] Completely remove the table from the DOM
5397
+ * @dtopt API
5398
+ *
5399
+ * @example
5400
+ * $(document).ready(function() {
5401
+ * // This example is fairly pointless in reality, but shows how fnDestroy can be used
5402
+ * var oTable = $('#example').dataTable();
5403
+ * oTable.fnDestroy();
5404
+ * } );
5405
+ */
5406
+ this.fnDestroy = function ( bRemove )
5407
+ {
5408
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5409
+ var nOrig = oSettings.nTableWrapper.parentNode;
5410
+ var nBody = oSettings.nTBody;
5411
+ var i, iLen;
5412
+
5413
+ bRemove = (bRemove===undefined) ? false : bRemove;
5414
+
5415
+ /* Flag to note that the table is currently being destroyed - no action should be taken */
5416
+ oSettings.bDestroying = true;
5417
+
5418
+ /* Fire off the destroy callbacks for plug-ins etc */
5419
+ _fnCallbackFire( oSettings, "aoDestroyCallback", "destroy", [oSettings] );
5420
+
5421
+ /* If the table is not being removed, restore the hidden columns */
5422
+ if ( !bRemove )
5423
+ {
5424
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
5425
+ {
5426
+ if ( oSettings.aoColumns[i].bVisible === false )
5427
+ {
5428
+ this.fnSetColumnVis( i, true );
5429
+ }
5430
+ }
5431
+ }
5432
+
5433
+ /* Blitz all DT events */
5434
+ $(oSettings.nTableWrapper).find('*').andSelf().unbind('.DT');
5435
+
5436
+ /* If there is an 'empty' indicator row, remove it */
5437
+ $('tbody>tr>td.'+oSettings.oClasses.sRowEmpty, oSettings.nTable).parent().remove();
5438
+
5439
+ /* When scrolling we had to break the table up - restore it */
5440
+ if ( oSettings.nTable != oSettings.nTHead.parentNode )
5441
+ {
5442
+ $(oSettings.nTable).children('thead').remove();
5443
+ oSettings.nTable.appendChild( oSettings.nTHead );
5444
+ }
5445
+
5446
+ if ( oSettings.nTFoot && oSettings.nTable != oSettings.nTFoot.parentNode )
5447
+ {
5448
+ $(oSettings.nTable).children('tfoot').remove();
5449
+ oSettings.nTable.appendChild( oSettings.nTFoot );
5450
+ }
5451
+
5452
+ /* Remove the DataTables generated nodes, events and classes */
5453
+ oSettings.nTable.parentNode.removeChild( oSettings.nTable );
5454
+ $(oSettings.nTableWrapper).remove();
5455
+
5456
+ oSettings.aaSorting = [];
5457
+ oSettings.aaSortingFixed = [];
5458
+ _fnSortingClasses( oSettings );
5459
+
5460
+ $(_fnGetTrNodes( oSettings )).removeClass( oSettings.asStripeClasses.join(' ') );
5461
+
5462
+ $('th, td', oSettings.nTHead).removeClass( [
5463
+ oSettings.oClasses.sSortable,
5464
+ oSettings.oClasses.sSortableAsc,
5465
+ oSettings.oClasses.sSortableDesc,
5466
+ oSettings.oClasses.sSortableNone ].join(' ')
5467
+ );
5468
+ if ( oSettings.bJUI )
5469
+ {
5470
+ $('th span.'+oSettings.oClasses.sSortIcon
5471
+ + ', td span.'+oSettings.oClasses.sSortIcon, oSettings.nTHead).remove();
5472
+
5473
+ $('th, td', oSettings.nTHead).each( function () {
5474
+ var jqWrapper = $('div.'+oSettings.oClasses.sSortJUIWrapper, this);
5475
+ var kids = jqWrapper.contents();
5476
+ $(this).append( kids );
5477
+ jqWrapper.remove();
5478
+ } );
5479
+ }
5480
+
5481
+ /* Add the TR elements back into the table in their original order */
5482
+ if ( !bRemove && oSettings.nTableReinsertBefore )
5483
+ {
5484
+ nOrig.insertBefore( oSettings.nTable, oSettings.nTableReinsertBefore );
5485
+ }
5486
+ else if ( !bRemove )
5487
+ {
5488
+ nOrig.appendChild( oSettings.nTable );
5489
+ }
5490
+
5491
+ for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ )
5492
+ {
5493
+ if ( oSettings.aoData[i].nTr !== null )
5494
+ {
5495
+ nBody.appendChild( oSettings.aoData[i].nTr );
5496
+ }
5497
+ }
5498
+
5499
+ /* Restore the width of the original table */
5500
+ if ( oSettings.oFeatures.bAutoWidth === true )
5501
+ {
5502
+ oSettings.nTable.style.width = _fnStringToCss(oSettings.sDestroyWidth);
5503
+ }
5504
+
5505
+ /* If the were originally stripe classes - then we add them back here. Note
5506
+ * this is not fool proof (for example if not all rows had stripe classes - but
5507
+ * it's a good effort without getting carried away
5508
+ */
5509
+ iLen = oSettings.asDestroyStripes.length;
5510
+ if (iLen)
5511
+ {
5512
+ var anRows = $(nBody).children('tr');
5513
+ for ( i=0 ; i<iLen ; i++ )
5514
+ {
5515
+ anRows.filter(':nth-child(' + iLen + 'n + ' + i + ')').addClass( oSettings.asDestroyStripes[i] );
5516
+ }
5517
+ }
5518
+
5519
+ /* Remove the settings object from the settings array */
5520
+ for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
5521
+ {
5522
+ if ( DataTable.settings[i] == oSettings )
5523
+ {
5524
+ DataTable.settings.splice( i, 1 );
5525
+ }
5526
+ }
5527
+
5528
+ /* End it all */
5529
+ oSettings = null;
5530
+ oInit = null;
5531
+ };
5532
+
5533
+
5534
+ /**
5535
+ * Redraw the table
5536
+ * @param {bool} [bComplete=true] Re-filter and resort (if enabled) the table before the draw.
5537
+ * @dtopt API
5538
+ *
5539
+ * @example
5540
+ * $(document).ready(function() {
5541
+ * var oTable = $('#example').dataTable();
5542
+ *
5543
+ * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
5544
+ * oTable.fnDraw();
5545
+ * } );
5546
+ */
5547
+ this.fnDraw = function( bComplete )
5548
+ {
5549
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5550
+ if ( bComplete === false )
5551
+ {
5552
+ _fnCalculateEnd( oSettings );
5553
+ _fnDraw( oSettings );
5554
+ }
5555
+ else
5556
+ {
5557
+ _fnReDraw( oSettings );
5558
+ }
5559
+ };
5560
+
5561
+
5562
+ /**
5563
+ * Filter the input based on data
5564
+ * @param {string} sInput String to filter the table on
5565
+ * @param {int|null} [iColumn] Column to limit filtering to
5566
+ * @param {bool} [bRegex=false] Treat as regular expression or not
5567
+ * @param {bool} [bSmart=true] Perform smart filtering or not
5568
+ * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
5569
+ * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
5570
+ * @dtopt API
5571
+ *
5572
+ * @example
5573
+ * $(document).ready(function() {
5574
+ * var oTable = $('#example').dataTable();
5575
+ *
5576
+ * // Sometime later - filter...
5577
+ * oTable.fnFilter( 'test string' );
5578
+ * } );
5579
+ */
5580
+ this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
5581
+ {
5582
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5583
+
5584
+ if ( !oSettings.oFeatures.bFilter )
5585
+ {
5586
+ return;
5587
+ }
5588
+
5589
+ if ( bRegex === undefined || bRegex === null )
5590
+ {
5591
+ bRegex = false;
5592
+ }
5593
+
5594
+ if ( bSmart === undefined || bSmart === null )
5595
+ {
5596
+ bSmart = true;
5597
+ }
5598
+
5599
+ if ( bShowGlobal === undefined || bShowGlobal === null )
5600
+ {
5601
+ bShowGlobal = true;
5602
+ }
5603
+
5604
+ if ( bCaseInsensitive === undefined || bCaseInsensitive === null )
5605
+ {
5606
+ bCaseInsensitive = true;
5607
+ }
5608
+
5609
+ if ( iColumn === undefined || iColumn === null )
5610
+ {
5611
+ /* Global filter */
5612
+ _fnFilterComplete( oSettings, {
5613
+ "sSearch":sInput+"",
5614
+ "bRegex": bRegex,
5615
+ "bSmart": bSmart,
5616
+ "bCaseInsensitive": bCaseInsensitive
5617
+ }, 1 );
5618
+
5619
+ if ( bShowGlobal && oSettings.aanFeatures.f )
5620
+ {
5621
+ var n = oSettings.aanFeatures.f;
5622
+ for ( var i=0, iLen=n.length ; i<iLen ; i++ )
5623
+ {
5624
+ // IE9 throws an 'unknown error' if document.activeElement is used
5625
+ // inside an iframe or frame...
5626
+ try {
5627
+ if ( n[i]._DT_Input != document.activeElement )
5628
+ {
5629
+ $(n[i]._DT_Input).val( sInput );
5630
+ }
5631
+ }
5632
+ catch ( e ) {
5633
+ $(n[i]._DT_Input).val( sInput );
5634
+ }
5635
+ }
5636
+ }
5637
+ }
5638
+ else
5639
+ {
5640
+ /* Single column filter */
5641
+ $.extend( oSettings.aoPreSearchCols[ iColumn ], {
5642
+ "sSearch": sInput+"",
5643
+ "bRegex": bRegex,
5644
+ "bSmart": bSmart,
5645
+ "bCaseInsensitive": bCaseInsensitive
5646
+ } );
5647
+ _fnFilterComplete( oSettings, oSettings.oPreviousSearch, 1 );
5648
+ }
5649
+ };
5650
+
5651
+
5652
+ /**
5653
+ * Get the data for the whole table, an individual row or an individual cell based on the
5654
+ * provided parameters.
5655
+ * @param {int|node} [mRow] A TR row node, TD/TH cell node or an integer. If given as
5656
+ * a TR node then the data source for the whole row will be returned. If given as a
5657
+ * TD/TH cell node then iCol will be automatically calculated and the data for the
5658
+ * cell returned. If given as an integer, then this is treated as the aoData internal
5659
+ * data index for the row (see fnGetPosition) and the data for that row used.
5660
+ * @param {int} [iCol] Optional column index that you want the data of.
5661
+ * @returns {array|object|string} If mRow is undefined, then the data for all rows is
5662
+ * returned. If mRow is defined, just data for that row, and is iCol is
5663
+ * defined, only data for the designated cell is returned.
5664
+ * @dtopt API
5665
+ *
5666
+ * @example
5667
+ * // Row data
5668
+ * $(document).ready(function() {
5669
+ * oTable = $('#example').dataTable();
5670
+ *
5671
+ * oTable.$('tr').click( function () {
5672
+ * var data = oTable.fnGetData( this );
5673
+ * // ... do something with the array / object of data for the row
5674
+ * } );
5675
+ * } );
5676
+ *
5677
+ * @example
5678
+ * // Individual cell data
5679
+ * $(document).ready(function() {
5680
+ * oTable = $('#example').dataTable();
5681
+ *
5682
+ * oTable.$('td').click( function () {
5683
+ * var sData = oTable.fnGetData( this );
5684
+ * alert( 'The cell clicked on had the value of '+sData );
5685
+ * } );
5686
+ * } );
5687
+ */
5688
+ this.fnGetData = function( mRow, iCol )
5689
+ {
5690
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5691
+
5692
+ if ( mRow !== undefined )
5693
+ {
5694
+ var iRow = mRow;
5695
+ if ( typeof mRow === 'object' )
5696
+ {
5697
+ var sNode = mRow.nodeName.toLowerCase();
5698
+ if (sNode === "tr" )
5699
+ {
5700
+ iRow = _fnNodeToDataIndex(oSettings, mRow);
5701
+ }
5702
+ else if ( sNode === "td" )
5703
+ {
5704
+ iRow = _fnNodeToDataIndex(oSettings, mRow.parentNode);
5705
+ iCol = _fnNodeToColumnIndex( oSettings, iRow, mRow );
5706
+ }
5707
+ }
5708
+
5709
+ if ( iCol !== undefined )
5710
+ {
5711
+ return _fnGetCellData( oSettings, iRow, iCol, '' );
5712
+ }
5713
+ return (oSettings.aoData[iRow]!==undefined) ?
5714
+ oSettings.aoData[iRow]._aData : null;
5715
+ }
5716
+ return _fnGetDataMaster( oSettings );
5717
+ };
5718
+
5719
+
5720
+ /**
5721
+ * Get an array of the TR nodes that are used in the table's body. Note that you will
5722
+ * typically want to use the '$' API method in preference to this as it is more
5723
+ * flexible.
5724
+ * @param {int} [iRow] Optional row index for the TR element you want
5725
+ * @returns {array|node} If iRow is undefined, returns an array of all TR elements
5726
+ * in the table's body, or iRow is defined, just the TR element requested.
5727
+ * @dtopt API
5728
+ *
5729
+ * @example
5730
+ * $(document).ready(function() {
5731
+ * var oTable = $('#example').dataTable();
5732
+ *
5733
+ * // Get the nodes from the table
5734
+ * var nNodes = oTable.fnGetNodes( );
5735
+ * } );
5736
+ */
5737
+ this.fnGetNodes = function( iRow )
5738
+ {
5739
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5740
+
5741
+ if ( iRow !== undefined ) {
5742
+ return (oSettings.aoData[iRow]!==undefined) ?
5743
+ oSettings.aoData[iRow].nTr : null;
5744
+ }
5745
+ return _fnGetTrNodes( oSettings );
5746
+ };
5747
+
5748
+
5749
+ /**
5750
+ * Get the array indexes of a particular cell from it's DOM element
5751
+ * and column index including hidden columns
5752
+ * @param {node} nNode this can either be a TR, TD or TH in the table's body
5753
+ * @returns {int} If nNode is given as a TR, then a single index is returned, or
5754
+ * if given as a cell, an array of [row index, column index (visible),
5755
+ * column index (all)] is given.
5756
+ * @dtopt API
5757
+ *
5758
+ * @example
5759
+ * $(document).ready(function() {
5760
+ * $('#example tbody td').click( function () {
5761
+ * // Get the position of the current data from the node
5762
+ * var aPos = oTable.fnGetPosition( this );
5763
+ *
5764
+ * // Get the data array for this row
5765
+ * var aData = oTable.fnGetData( aPos[0] );
5766
+ *
5767
+ * // Update the data array and return the value
5768
+ * aData[ aPos[1] ] = 'clicked';
5769
+ * this.innerHTML = 'clicked';
5770
+ * } );
5771
+ *
5772
+ * // Init DataTables
5773
+ * oTable = $('#example').dataTable();
5774
+ * } );
5775
+ */
5776
+ this.fnGetPosition = function( nNode )
5777
+ {
5778
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5779
+ var sNodeName = nNode.nodeName.toUpperCase();
5780
+
5781
+ if ( sNodeName == "TR" )
5782
+ {
5783
+ return _fnNodeToDataIndex(oSettings, nNode);
5784
+ }
5785
+ else if ( sNodeName == "TD" || sNodeName == "TH" )
5786
+ {
5787
+ var iDataIndex = _fnNodeToDataIndex( oSettings, nNode.parentNode );
5788
+ var iColumnIndex = _fnNodeToColumnIndex( oSettings, iDataIndex, nNode );
5789
+ return [ iDataIndex, _fnColumnIndexToVisible(oSettings, iColumnIndex ), iColumnIndex ];
5790
+ }
5791
+ return null;
5792
+ };
5793
+
5794
+
5795
+ /**
5796
+ * Check to see if a row is 'open' or not.
5797
+ * @param {node} nTr the table row to check
5798
+ * @returns {boolean} true if the row is currently open, false otherwise
5799
+ * @dtopt API
5800
+ *
5801
+ * @example
5802
+ * $(document).ready(function() {
5803
+ * var oTable;
5804
+ *
5805
+ * // 'open' an information row when a row is clicked on
5806
+ * $('#example tbody tr').click( function () {
5807
+ * if ( oTable.fnIsOpen(this) ) {
5808
+ * oTable.fnClose( this );
5809
+ * } else {
5810
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
5811
+ * }
5812
+ * } );
5813
+ *
5814
+ * oTable = $('#example').dataTable();
5815
+ * } );
5816
+ */
5817
+ this.fnIsOpen = function( nTr )
5818
+ {
5819
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5820
+ var aoOpenRows = oSettings.aoOpenRows;
5821
+
5822
+ for ( var i=0 ; i<oSettings.aoOpenRows.length ; i++ )
5823
+ {
5824
+ if ( oSettings.aoOpenRows[i].nParent == nTr )
5825
+ {
5826
+ return true;
5827
+ }
5828
+ }
5829
+ return false;
5830
+ };
5831
+
5832
+
5833
+ /**
5834
+ * This function will place a new row directly after a row which is currently
5835
+ * on display on the page, with the HTML contents that is passed into the
5836
+ * function. This can be used, for example, to ask for confirmation that a
5837
+ * particular record should be deleted.
5838
+ * @param {node} nTr The table row to 'open'
5839
+ * @param {string|node|jQuery} mHtml The HTML to put into the row
5840
+ * @param {string} sClass Class to give the new TD cell
5841
+ * @returns {node} The row opened. Note that if the table row passed in as the
5842
+ * first parameter, is not found in the table, this method will silently
5843
+ * return.
5844
+ * @dtopt API
5845
+ *
5846
+ * @example
5847
+ * $(document).ready(function() {
5848
+ * var oTable;
5849
+ *
5850
+ * // 'open' an information row when a row is clicked on
5851
+ * $('#example tbody tr').click( function () {
5852
+ * if ( oTable.fnIsOpen(this) ) {
5853
+ * oTable.fnClose( this );
5854
+ * } else {
5855
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
5856
+ * }
5857
+ * } );
5858
+ *
5859
+ * oTable = $('#example').dataTable();
5860
+ * } );
5861
+ */
5862
+ this.fnOpen = function( nTr, mHtml, sClass )
5863
+ {
5864
+ /* Find settings from table node */
5865
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5866
+
5867
+ /* Check that the row given is in the table */
5868
+ var nTableRows = _fnGetTrNodes( oSettings );
5869
+ if ( $.inArray(nTr, nTableRows) === -1 )
5870
+ {
5871
+ return;
5872
+ }
5873
+
5874
+ /* the old open one if there is one */
5875
+ this.fnClose( nTr );
5876
+
5877
+ var nNewRow = document.createElement("tr");
5878
+ var nNewCell = document.createElement("td");
5879
+ nNewRow.appendChild( nNewCell );
5880
+ nNewCell.className = sClass;
5881
+ nNewCell.colSpan = _fnVisbleColumns( oSettings );
5882
+
5883
+ if (typeof mHtml === "string")
5884
+ {
5885
+ nNewCell.innerHTML = mHtml;
5886
+ }
5887
+ else
5888
+ {
5889
+ $(nNewCell).html( mHtml );
5890
+ }
5891
+
5892
+ /* If the nTr isn't on the page at the moment - then we don't insert at the moment */
5893
+ var nTrs = $('tr', oSettings.nTBody);
5894
+ if ( $.inArray(nTr, nTrs) != -1 )
5895
+ {
5896
+ $(nNewRow).insertAfter(nTr);
5897
+ }
5898
+
5899
+ oSettings.aoOpenRows.push( {
5900
+ "nTr": nNewRow,
5901
+ "nParent": nTr
5902
+ } );
5903
+
5904
+ return nNewRow;
5905
+ };
5906
+
5907
+
5908
+ /**
5909
+ * Change the pagination - provides the internal logic for pagination in a simple API
5910
+ * function. With this function you can have a DataTables table go to the next,
5911
+ * previous, first or last pages.
5912
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
5913
+ * or page number to jump to (integer), note that page 0 is the first page.
5914
+ * @param {bool} [bRedraw=true] Redraw the table or not
5915
+ * @dtopt API
5916
+ *
5917
+ * @example
5918
+ * $(document).ready(function() {
5919
+ * var oTable = $('#example').dataTable();
5920
+ * oTable.fnPageChange( 'next' );
5921
+ * } );
5922
+ */
5923
+ this.fnPageChange = function ( mAction, bRedraw )
5924
+ {
5925
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5926
+ _fnPageChange( oSettings, mAction );
5927
+ _fnCalculateEnd( oSettings );
5928
+
5929
+ if ( bRedraw === undefined || bRedraw )
5930
+ {
5931
+ _fnDraw( oSettings );
5932
+ }
5933
+ };
5934
+
5935
+
5936
+ /**
5937
+ * Show a particular column
5938
+ * @param {int} iCol The column whose display should be changed
5939
+ * @param {bool} bShow Show (true) or hide (false) the column
5940
+ * @param {bool} [bRedraw=true] Redraw the table or not
5941
+ * @dtopt API
5942
+ *
5943
+ * @example
5944
+ * $(document).ready(function() {
5945
+ * var oTable = $('#example').dataTable();
5946
+ *
5947
+ * // Hide the second column after initialisation
5948
+ * oTable.fnSetColumnVis( 1, false );
5949
+ * } );
5950
+ */
5951
+ this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
5952
+ {
5953
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
5954
+ var i, iLen;
5955
+ var aoColumns = oSettings.aoColumns;
5956
+ var aoData = oSettings.aoData;
5957
+ var nTd, bAppend, iBefore;
5958
+
5959
+ /* No point in doing anything if we are requesting what is already true */
5960
+ if ( aoColumns[iCol].bVisible == bShow )
5961
+ {
5962
+ return;
5963
+ }
5964
+
5965
+ /* Show the column */
5966
+ if ( bShow )
5967
+ {
5968
+ var iInsert = 0;
5969
+ for ( i=0 ; i<iCol ; i++ )
5970
+ {
5971
+ if ( aoColumns[i].bVisible )
5972
+ {
5973
+ iInsert++;
5974
+ }
5975
+ }
5976
+
5977
+ /* Need to decide if we should use appendChild or insertBefore */
5978
+ bAppend = (iInsert >= _fnVisbleColumns( oSettings ));
5979
+
5980
+ /* Which coloumn should we be inserting before? */
5981
+ if ( !bAppend )
5982
+ {
5983
+ for ( i=iCol ; i<aoColumns.length ; i++ )
5984
+ {
5985
+ if ( aoColumns[i].bVisible )
5986
+ {
5987
+ iBefore = i;
5988
+ break;
5989
+ }
5990
+ }
5991
+ }
5992
+
5993
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
5994
+ {
5995
+ if ( aoData[i].nTr !== null )
5996
+ {
5997
+ if ( bAppend )
5998
+ {
5999
+ aoData[i].nTr.appendChild(
6000
+ aoData[i]._anHidden[iCol]
6001
+ );
6002
+ }
6003
+ else
6004
+ {
6005
+ aoData[i].nTr.insertBefore(
6006
+ aoData[i]._anHidden[iCol],
6007
+ _fnGetTdNodes( oSettings, i )[iBefore] );
6008
+ }
6009
+ }
6010
+ }
6011
+ }
6012
+ else
6013
+ {
6014
+ /* Remove a column from display */
6015
+ for ( i=0, iLen=aoData.length ; i<iLen ; i++ )
6016
+ {
6017
+ if ( aoData[i].nTr !== null )
6018
+ {
6019
+ nTd = _fnGetTdNodes( oSettings, i )[iCol];
6020
+ aoData[i]._anHidden[iCol] = nTd;
6021
+ nTd.parentNode.removeChild( nTd );
6022
+ }
6023
+ }
6024
+ }
6025
+
6026
+ /* Clear to set the visible flag */
6027
+ aoColumns[iCol].bVisible = bShow;
6028
+
6029
+ /* Redraw the header and footer based on the new column visibility */
6030
+ _fnDrawHead( oSettings, oSettings.aoHeader );
6031
+ if ( oSettings.nTFoot )
6032
+ {
6033
+ _fnDrawHead( oSettings, oSettings.aoFooter );
6034
+ }
6035
+
6036
+ /* If there are any 'open' rows, then we need to alter the colspan for this col change */
6037
+ for ( i=0, iLen=oSettings.aoOpenRows.length ; i<iLen ; i++ )
6038
+ {
6039
+ oSettings.aoOpenRows[i].nTr.colSpan = _fnVisbleColumns( oSettings );
6040
+ }
6041
+
6042
+ /* Do a redraw incase anything depending on the table columns needs it
6043
+ * (built-in: scrolling)
6044
+ */
6045
+ if ( bRedraw === undefined || bRedraw )
6046
+ {
6047
+ _fnAdjustColumnSizing( oSettings );
6048
+ _fnDraw( oSettings );
6049
+ }
6050
+
6051
+ _fnSaveState( oSettings );
6052
+ };
6053
+
6054
+
6055
+ /**
6056
+ * Get the settings for a particular table for external manipulation
6057
+ * @returns {object} DataTables settings object. See
6058
+ * {@link DataTable.models.oSettings}
6059
+ * @dtopt API
6060
+ *
6061
+ * @example
6062
+ * $(document).ready(function() {
6063
+ * var oTable = $('#example').dataTable();
6064
+ * var oSettings = oTable.fnSettings();
6065
+ *
6066
+ * // Show an example parameter from the settings
6067
+ * alert( oSettings._iDisplayStart );
6068
+ * } );
6069
+ */
6070
+ this.fnSettings = function()
6071
+ {
6072
+ return _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6073
+ };
6074
+
6075
+
6076
+ /**
6077
+ * Sort the table by a particular column
6078
+ * @param {int} iCol the data index to sort on. Note that this will not match the
6079
+ * 'display index' if you have hidden data entries
6080
+ * @dtopt API
6081
+ *
6082
+ * @example
6083
+ * $(document).ready(function() {
6084
+ * var oTable = $('#example').dataTable();
6085
+ *
6086
+ * // Sort immediately with columns 0 and 1
6087
+ * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
6088
+ * } );
6089
+ */
6090
+ this.fnSort = function( aaSort )
6091
+ {
6092
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6093
+ oSettings.aaSorting = aaSort;
6094
+ _fnSort( oSettings );
6095
+ };
6096
+
6097
+
6098
+ /**
6099
+ * Attach a sort listener to an element for a given column
6100
+ * @param {node} nNode the element to attach the sort listener to
6101
+ * @param {int} iColumn the column that a click on this node will sort on
6102
+ * @param {function} [fnCallback] callback function when sort is run
6103
+ * @dtopt API
6104
+ *
6105
+ * @example
6106
+ * $(document).ready(function() {
6107
+ * var oTable = $('#example').dataTable();
6108
+ *
6109
+ * // Sort on column 1, when 'sorter' is clicked on
6110
+ * oTable.fnSortListener( document.getElementById('sorter'), 1 );
6111
+ * } );
6112
+ */
6113
+ this.fnSortListener = function( nNode, iColumn, fnCallback )
6114
+ {
6115
+ _fnSortAttachListener( _fnSettingsFromNode( this[DataTable.ext.iApiIndex] ), nNode, iColumn,
6116
+ fnCallback );
6117
+ };
6118
+
6119
+
6120
+ /**
6121
+ * Update a table cell or row - this method will accept either a single value to
6122
+ * update the cell with, an array of values with one element for each column or
6123
+ * an object in the same format as the original data source. The function is
6124
+ * self-referencing in order to make the multi column updates easier.
6125
+ * @param {object|array|string} mData Data to update the cell/row with
6126
+ * @param {node|int} mRow TR element you want to update or the aoData index
6127
+ * @param {int} [iColumn] The column to update (not used of mData is an array or object)
6128
+ * @param {bool} [bRedraw=true] Redraw the table or not
6129
+ * @param {bool} [bAction=true] Perform pre-draw actions or not
6130
+ * @returns {int} 0 on success, 1 on error
6131
+ * @dtopt API
6132
+ *
6133
+ * @example
6134
+ * $(document).ready(function() {
6135
+ * var oTable = $('#example').dataTable();
6136
+ * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
6137
+ * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], 1, 0 ); // Row
6138
+ * } );
6139
+ */
6140
+ this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
6141
+ {
6142
+ var oSettings = _fnSettingsFromNode( this[DataTable.ext.iApiIndex] );
6143
+ var i, iLen, sDisplay;
6144
+ var iRow = (typeof mRow === 'object') ?
6145
+ _fnNodeToDataIndex(oSettings, mRow) : mRow;
6146
+
6147
+ if ( $.isArray(mData) && iColumn === undefined )
6148
+ {
6149
+ /* Array update - update the whole row */
6150
+ oSettings.aoData[iRow]._aData = mData.slice();
6151
+
6152
+ /* Flag to the function that we are recursing */
6153
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6154
+ {
6155
+ this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6156
+ }
6157
+ }
6158
+ else if ( $.isPlainObject(mData) && iColumn === undefined )
6159
+ {
6160
+ /* Object update - update the whole row - assume the developer gets the object right */
6161
+ oSettings.aoData[iRow]._aData = $.extend( true, {}, mData );
6162
+
6163
+ for ( i=0 ; i<oSettings.aoColumns.length ; i++ )
6164
+ {
6165
+ this.fnUpdate( _fnGetCellData( oSettings, iRow, i ), iRow, i, false, false );
6166
+ }
6167
+ }
6168
+ else
6169
+ {
6170
+ /* Individual cell update */
6171
+ _fnSetCellData( oSettings, iRow, iColumn, mData );
6172
+ sDisplay = _fnGetCellData( oSettings, iRow, iColumn, 'display' );
6173
+
6174
+ var oCol = oSettings.aoColumns[iColumn];
6175
+ if ( oCol.fnRender !== null )
6176
+ {
6177
+ sDisplay = _fnRender( oSettings, iRow, iColumn );
6178
+ if ( oCol.bUseRendered )
6179
+ {
6180
+ _fnSetCellData( oSettings, iRow, iColumn, sDisplay );
6181
+ }
6182
+ }
6183
+
6184
+ if ( oSettings.aoData[iRow].nTr !== null )
6185
+ {
6186
+ /* Do the actual HTML update */
6187
+ _fnGetTdNodes( oSettings, iRow )[iColumn].innerHTML = sDisplay;
6188
+ }
6189
+ }
6190
+
6191
+ /* Modify the search index for this row (strictly this is likely not needed, since fnReDraw
6192
+ * will rebuild the search array - however, the redraw might be disabled by the user)
6193
+ */
6194
+ var iDisplayIndex = $.inArray( iRow, oSettings.aiDisplay );
6195
+ oSettings.asDataSearch[iDisplayIndex] = _fnBuildSearchRow(
6196
+ oSettings,
6197
+ _fnGetRowData( oSettings, iRow, 'filter', _fnGetColumns( oSettings, 'bSearchable' ) )
6198
+ );
6199
+
6200
+ /* Perform pre-draw actions */
6201
+ if ( bAction === undefined || bAction )
6202
+ {
6203
+ _fnAdjustColumnSizing( oSettings );
6204
+ }
6205
+
6206
+ /* Redraw the table */
6207
+ if ( bRedraw === undefined || bRedraw )
6208
+ {
6209
+ _fnReDraw( oSettings );
6210
+ }
6211
+ return 0;
6212
+ };
6213
+
6214
+
6215
+ /**
6216
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
6217
+ * to ensure compatibility.
6218
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
6219
+ * formats "X" and "X.Y" are also acceptable.
6220
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
6221
+ * version, or false if this version of DataTales is not suitable
6222
+ * @method
6223
+ * @dtopt API
6224
+ *
6225
+ * @example
6226
+ * $(document).ready(function() {
6227
+ * var oTable = $('#example').dataTable();
6228
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
6229
+ * } );
6230
+ */
6231
+ this.fnVersionCheck = DataTable.ext.fnVersionCheck;
6232
+
6233
+
6234
+ /*
6235
+ * This is really a good bit rubbish this method of exposing the internal methods
6236
+ * publicly... - To be fixed in 2.0 using methods on the prototype
6237
+ */
6238
+
6239
+
6240
+ /**
6241
+ * Create a wrapper function for exporting an internal functions to an external API.
6242
+ * @param {string} sFunc API function name
6243
+ * @returns {function} wrapped function
6244
+ * @memberof DataTable#oApi
6245
+ */
6246
+ function _fnExternApiFunc (sFunc)
6247
+ {
6248
+ return function() {
6249
+ var aArgs = [_fnSettingsFromNode(this[DataTable.ext.iApiIndex])].concat(
6250
+ Array.prototype.slice.call(arguments) );
6251
+ return DataTable.ext.oApi[sFunc].apply( this, aArgs );
6252
+ };
6253
+ }
6254
+
6255
+
6256
+ /**
6257
+ * Reference to internal functions for use by plug-in developers. Note that these
6258
+ * methods are references to internal functions and are considered to be private.
6259
+ * If you use these methods, be aware that they are liable to change between versions
6260
+ * (check the upgrade notes).
6261
+ * @namespace
6262
+ */
6263
+ this.oApi = {
6264
+ "_fnExternApiFunc": _fnExternApiFunc,
6265
+ "_fnInitialise": _fnInitialise,
6266
+ "_fnInitComplete": _fnInitComplete,
6267
+ "_fnLanguageCompat": _fnLanguageCompat,
6268
+ "_fnAddColumn": _fnAddColumn,
6269
+ "_fnColumnOptions": _fnColumnOptions,
6270
+ "_fnAddData": _fnAddData,
6271
+ "_fnCreateTr": _fnCreateTr,
6272
+ "_fnGatherData": _fnGatherData,
6273
+ "_fnBuildHead": _fnBuildHead,
6274
+ "_fnDrawHead": _fnDrawHead,
6275
+ "_fnDraw": _fnDraw,
6276
+ "_fnReDraw": _fnReDraw,
6277
+ "_fnAjaxUpdate": _fnAjaxUpdate,
6278
+ "_fnAjaxParameters": _fnAjaxParameters,
6279
+ "_fnAjaxUpdateDraw": _fnAjaxUpdateDraw,
6280
+ "_fnServerParams": _fnServerParams,
6281
+ "_fnAddOptionsHtml": _fnAddOptionsHtml,
6282
+ "_fnFeatureHtmlTable": _fnFeatureHtmlTable,
6283
+ "_fnScrollDraw": _fnScrollDraw,
6284
+ "_fnAdjustColumnSizing": _fnAdjustColumnSizing,
6285
+ "_fnFeatureHtmlFilter": _fnFeatureHtmlFilter,
6286
+ "_fnFilterComplete": _fnFilterComplete,
6287
+ "_fnFilterCustom": _fnFilterCustom,
6288
+ "_fnFilterColumn": _fnFilterColumn,
6289
+ "_fnFilter": _fnFilter,
6290
+ "_fnBuildSearchArray": _fnBuildSearchArray,
6291
+ "_fnBuildSearchRow": _fnBuildSearchRow,
6292
+ "_fnFilterCreateSearch": _fnFilterCreateSearch,
6293
+ "_fnDataToSearch": _fnDataToSearch,
6294
+ "_fnSort": _fnSort,
6295
+ "_fnSortAttachListener": _fnSortAttachListener,
6296
+ "_fnSortingClasses": _fnSortingClasses,
6297
+ "_fnFeatureHtmlPaginate": _fnFeatureHtmlPaginate,
6298
+ "_fnPageChange": _fnPageChange,
6299
+ "_fnFeatureHtmlInfo": _fnFeatureHtmlInfo,
6300
+ "_fnUpdateInfo": _fnUpdateInfo,
6301
+ "_fnFeatureHtmlLength": _fnFeatureHtmlLength,
6302
+ "_fnFeatureHtmlProcessing": _fnFeatureHtmlProcessing,
6303
+ "_fnProcessingDisplay": _fnProcessingDisplay,
6304
+ "_fnVisibleToColumnIndex": _fnVisibleToColumnIndex,
6305
+ "_fnColumnIndexToVisible": _fnColumnIndexToVisible,
6306
+ "_fnNodeToDataIndex": _fnNodeToDataIndex,
6307
+ "_fnVisbleColumns": _fnVisbleColumns,
6308
+ "_fnCalculateEnd": _fnCalculateEnd,
6309
+ "_fnConvertToWidth": _fnConvertToWidth,
6310
+ "_fnCalculateColumnWidths": _fnCalculateColumnWidths,
6311
+ "_fnScrollingWidthAdjust": _fnScrollingWidthAdjust,
6312
+ "_fnGetWidestNode": _fnGetWidestNode,
6313
+ "_fnGetMaxLenString": _fnGetMaxLenString,
6314
+ "_fnStringToCss": _fnStringToCss,
6315
+ "_fnDetectType": _fnDetectType,
6316
+ "_fnSettingsFromNode": _fnSettingsFromNode,
6317
+ "_fnGetDataMaster": _fnGetDataMaster,
6318
+ "_fnGetTrNodes": _fnGetTrNodes,
6319
+ "_fnGetTdNodes": _fnGetTdNodes,
6320
+ "_fnEscapeRegex": _fnEscapeRegex,
6321
+ "_fnDeleteIndex": _fnDeleteIndex,
6322
+ "_fnReOrderIndex": _fnReOrderIndex,
6323
+ "_fnColumnOrdering": _fnColumnOrdering,
6324
+ "_fnLog": _fnLog,
6325
+ "_fnClearTable": _fnClearTable,
6326
+ "_fnSaveState": _fnSaveState,
6327
+ "_fnLoadState": _fnLoadState,
6328
+ "_fnCreateCookie": _fnCreateCookie,
6329
+ "_fnReadCookie": _fnReadCookie,
6330
+ "_fnDetectHeader": _fnDetectHeader,
6331
+ "_fnGetUniqueThs": _fnGetUniqueThs,
6332
+ "_fnScrollBarWidth": _fnScrollBarWidth,
6333
+ "_fnApplyToChildren": _fnApplyToChildren,
6334
+ "_fnMap": _fnMap,
6335
+ "_fnGetRowData": _fnGetRowData,
6336
+ "_fnGetCellData": _fnGetCellData,
6337
+ "_fnSetCellData": _fnSetCellData,
6338
+ "_fnGetObjectDataFn": _fnGetObjectDataFn,
6339
+ "_fnSetObjectDataFn": _fnSetObjectDataFn,
6340
+ "_fnApplyColumnDefs": _fnApplyColumnDefs,
6341
+ "_fnBindAction": _fnBindAction,
6342
+ "_fnExtend": _fnExtend,
6343
+ "_fnCallbackReg": _fnCallbackReg,
6344
+ "_fnCallbackFire": _fnCallbackFire,
6345
+ "_fnJsonString": _fnJsonString,
6346
+ "_fnRender": _fnRender,
6347
+ "_fnNodeToColumnIndex": _fnNodeToColumnIndex,
6348
+ "_fnInfoMacros": _fnInfoMacros,
6349
+ "_fnBrowserDetect": _fnBrowserDetect,
6350
+ "_fnGetColumns": _fnGetColumns
6351
+ };
6352
+
6353
+ $.extend( DataTable.ext.oApi, this.oApi );
6354
+
6355
+ for ( var sFunc in DataTable.ext.oApi )
6356
+ {
6357
+ if ( sFunc )
6358
+ {
6359
+ this[sFunc] = _fnExternApiFunc(sFunc);
6360
+ }
6361
+ }
6362
+
6363
+
6364
+ var _that = this;
6365
+ this.each(function() {
6366
+ var i=0, iLen, j, jLen, k, kLen;
6367
+ var sId = this.getAttribute( 'id' );
6368
+ var bInitHandedOff = false;
6369
+ var bUsePassedData = false;
6370
+
6371
+
6372
+ /* Sanity check */
6373
+ if ( this.nodeName.toLowerCase() != 'table' )
6374
+ {
6375
+ _fnLog( null, 0, "Attempted to initialise DataTables on a node which is not a "+
6376
+ "table: "+this.nodeName );
6377
+ return;
6378
+ }
6379
+
6380
+ /* Check to see if we are re-initialising a table */
6381
+ for ( i=0, iLen=DataTable.settings.length ; i<iLen ; i++ )
6382
+ {
6383
+ /* Base check on table node */
6384
+ if ( DataTable.settings[i].nTable == this )
6385
+ {
6386
+ if ( oInit === undefined || oInit.bRetrieve )
6387
+ {
6388
+ return DataTable.settings[i].oInstance;
6389
+ }
6390
+ else if ( oInit.bDestroy )
6391
+ {
6392
+ DataTable.settings[i].oInstance.fnDestroy();
6393
+ break;
6394
+ }
6395
+ else
6396
+ {
6397
+ _fnLog( DataTable.settings[i], 0, "Cannot reinitialise DataTable.\n\n"+
6398
+ "To retrieve the DataTables object for this table, pass no arguments or see "+
6399
+ "the docs for bRetrieve and bDestroy" );
6400
+ return;
6401
+ }
6402
+ }
6403
+
6404
+ /* If the element we are initialising has the same ID as a table which was previously
6405
+ * initialised, but the table nodes don't match (from before) then we destroy the old
6406
+ * instance by simply deleting it. This is under the assumption that the table has been
6407
+ * destroyed by other methods. Anyone using non-id selectors will need to do this manually
6408
+ */
6409
+ if ( DataTable.settings[i].sTableId == this.id )
6410
+ {
6411
+ DataTable.settings.splice( i, 1 );
6412
+ break;
6413
+ }
6414
+ }
6415
+
6416
+ /* Ensure the table has an ID - required for accessibility */
6417
+ if ( sId === null || sId === "" )
6418
+ {
6419
+ sId = "DataTables_Table_"+(DataTable.ext._oExternConfig.iNextUnique++);
6420
+ this.id = sId;
6421
+ }
6422
+
6423
+ /* Create the settings object for this table and set some of the default parameters */
6424
+ var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
6425
+ "nTable": this,
6426
+ "oApi": _that.oApi,
6427
+ "oInit": oInit,
6428
+ "sDestroyWidth": $(this).width(),
6429
+ "sInstance": sId,
6430
+ "sTableId": sId
6431
+ } );
6432
+ DataTable.settings.push( oSettings );
6433
+
6434
+ // Need to add the instance after the instance after the settings object has been added
6435
+ // to the settings array, so we can self reference the table instance if more than one
6436
+ oSettings.oInstance = (_that.length===1) ? _that : $(this).dataTable();
6437
+
6438
+ /* Setting up the initialisation object */
6439
+ if ( !oInit )
6440
+ {
6441
+ oInit = {};
6442
+ }
6443
+
6444
+ // Backwards compatibility, before we apply all the defaults
6445
+ if ( oInit.oLanguage )
6446
+ {
6447
+ _fnLanguageCompat( oInit.oLanguage );
6448
+ }
6449
+
6450
+ oInit = _fnExtend( $.extend(true, {}, DataTable.defaults), oInit );
6451
+
6452
+ // Map the initialisation options onto the settings object
6453
+ _fnMap( oSettings.oFeatures, oInit, "bPaginate" );
6454
+ _fnMap( oSettings.oFeatures, oInit, "bLengthChange" );
6455
+ _fnMap( oSettings.oFeatures, oInit, "bFilter" );
6456
+ _fnMap( oSettings.oFeatures, oInit, "bSort" );
6457
+ _fnMap( oSettings.oFeatures, oInit, "bInfo" );
6458
+ _fnMap( oSettings.oFeatures, oInit, "bProcessing" );
6459
+ _fnMap( oSettings.oFeatures, oInit, "bAutoWidth" );
6460
+ _fnMap( oSettings.oFeatures, oInit, "bSortClasses" );
6461
+ _fnMap( oSettings.oFeatures, oInit, "bServerSide" );
6462
+ _fnMap( oSettings.oFeatures, oInit, "bDeferRender" );
6463
+ _fnMap( oSettings.oScroll, oInit, "sScrollX", "sX" );
6464
+ _fnMap( oSettings.oScroll, oInit, "sScrollXInner", "sXInner" );
6465
+ _fnMap( oSettings.oScroll, oInit, "sScrollY", "sY" );
6466
+ _fnMap( oSettings.oScroll, oInit, "bScrollCollapse", "bCollapse" );
6467
+ _fnMap( oSettings.oScroll, oInit, "bScrollInfinite", "bInfinite" );
6468
+ _fnMap( oSettings.oScroll, oInit, "iScrollLoadGap", "iLoadGap" );
6469
+ _fnMap( oSettings.oScroll, oInit, "bScrollAutoCss", "bAutoCss" );
6470
+ _fnMap( oSettings, oInit, "asStripeClasses" );
6471
+ _fnMap( oSettings, oInit, "asStripClasses", "asStripeClasses" ); // legacy
6472
+ _fnMap( oSettings, oInit, "fnServerData" );
6473
+ _fnMap( oSettings, oInit, "fnFormatNumber" );
6474
+ _fnMap( oSettings, oInit, "sServerMethod" );
6475
+ _fnMap( oSettings, oInit, "aaSorting" );
6476
+ _fnMap( oSettings, oInit, "aaSortingFixed" );
6477
+ _fnMap( oSettings, oInit, "aLengthMenu" );
6478
+ _fnMap( oSettings, oInit, "sPaginationType" );
6479
+ _fnMap( oSettings, oInit, "sAjaxSource" );
6480
+ _fnMap( oSettings, oInit, "sAjaxDataProp" );
6481
+ _fnMap( oSettings, oInit, "iCookieDuration" );
6482
+ _fnMap( oSettings, oInit, "sCookiePrefix" );
6483
+ _fnMap( oSettings, oInit, "sDom" );
6484
+ _fnMap( oSettings, oInit, "bSortCellsTop" );
6485
+ _fnMap( oSettings, oInit, "iTabIndex" );
6486
+ _fnMap( oSettings, oInit, "oSearch", "oPreviousSearch" );
6487
+ _fnMap( oSettings, oInit, "aoSearchCols", "aoPreSearchCols" );
6488
+ _fnMap( oSettings, oInit, "iDisplayLength", "_iDisplayLength" );
6489
+ _fnMap( oSettings, oInit, "bJQueryUI", "bJUI" );
6490
+ _fnMap( oSettings, oInit, "fnCookieCallback" );
6491
+ _fnMap( oSettings, oInit, "fnStateLoad" );
6492
+ _fnMap( oSettings, oInit, "fnStateSave" );
6493
+ _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
6494
+
6495
+ /* Callback functions which are array driven */
6496
+ _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' );
6497
+ _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' );
6498
+ _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' );
6499
+ _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' );
6500
+ _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' );
6501
+ _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' );
6502
+ _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' );
6503
+ _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' );
6504
+ _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' );
6505
+ _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' );
6506
+ _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' );
6507
+
6508
+ if ( oSettings.oFeatures.bServerSide && oSettings.oFeatures.bSort &&
6509
+ oSettings.oFeatures.bSortClasses )
6510
+ {
6511
+ /* Enable sort classes for server-side processing. Safe to do it here, since server-side
6512
+ * processing must be enabled by the developer
6513
+ */
6514
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'server_side_sort_classes' );
6515
+ }
6516
+ else if ( oSettings.oFeatures.bDeferRender )
6517
+ {
6518
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSortingClasses, 'defer_sort_classes' );
6519
+ }
6520
+
6521
+ if ( oInit.bJQueryUI )
6522
+ {
6523
+ /* Use the JUI classes object for display. You could clone the oStdClasses object if
6524
+ * you want to have multiple tables with multiple independent classes
6525
+ */
6526
+ $.extend( oSettings.oClasses, DataTable.ext.oJUIClasses );
6527
+
6528
+ if ( oInit.sDom === DataTable.defaults.sDom && DataTable.defaults.sDom === "lfrtip" )
6529
+ {
6530
+ /* Set the DOM to use a layout suitable for jQuery UI's theming */
6531
+ oSettings.sDom = '<"H"lfr>t<"F"ip>';
6532
+ }
6533
+ }
6534
+ else
6535
+ {
6536
+ $.extend( oSettings.oClasses, DataTable.ext.oStdClasses );
6537
+ }
6538
+ $(this).addClass( oSettings.oClasses.sTable );
6539
+
6540
+ /* Calculate the scroll bar width and cache it for use later on */
6541
+ if ( oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "" )
6542
+ {
6543
+ oSettings.oScroll.iBarWidth = _fnScrollBarWidth();
6544
+ }
6545
+
6546
+ if ( oSettings.iInitDisplayStart === undefined )
6547
+ {
6548
+ /* Display start point, taking into account the save saving */
6549
+ oSettings.iInitDisplayStart = oInit.iDisplayStart;
6550
+ oSettings._iDisplayStart = oInit.iDisplayStart;
6551
+ }
6552
+
6553
+ /* Must be done after everything which can be overridden by a cookie! */
6554
+ if ( oInit.bStateSave )
6555
+ {
6556
+ oSettings.oFeatures.bStateSave = true;
6557
+ _fnLoadState( oSettings, oInit );
6558
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
6559
+ }
6560
+
6561
+ if ( oInit.iDeferLoading !== null )
6562
+ {
6563
+ oSettings.bDeferLoading = true;
6564
+ var tmp = $.isArray( oInit.iDeferLoading );
6565
+ oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
6566
+ oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
6567
+ }
6568
+
6569
+ if ( oInit.aaData !== null )
6570
+ {
6571
+ bUsePassedData = true;
6572
+ }
6573
+
6574
+ /* Language definitions */
6575
+ if ( oInit.oLanguage.sUrl !== "" )
6576
+ {
6577
+ /* Get the language definitions from a file - because this Ajax call makes the language
6578
+ * get async to the remainder of this function we use bInitHandedOff to indicate that
6579
+ * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
6580
+ */
6581
+ oSettings.oLanguage.sUrl = oInit.oLanguage.sUrl;
6582
+ $.getJSON( oSettings.oLanguage.sUrl, null, function( json ) {
6583
+ _fnLanguageCompat( json );
6584
+ $.extend( true, oSettings.oLanguage, oInit.oLanguage, json );
6585
+ _fnInitialise( oSettings );
6586
+ } );
6587
+ bInitHandedOff = true;
6588
+ }
6589
+ else
6590
+ {
6591
+ $.extend( true, oSettings.oLanguage, oInit.oLanguage );
6592
+ }
6593
+
6594
+
6595
+ /*
6596
+ * Stripes
6597
+ */
6598
+ if ( oInit.asStripeClasses === null )
6599
+ {
6600
+ oSettings.asStripeClasses =[
6601
+ oSettings.oClasses.sStripeOdd,
6602
+ oSettings.oClasses.sStripeEven
6603
+ ];
6604
+ }
6605
+
6606
+ /* Remove row stripe classes if they are already on the table row */
6607
+ iLen=oSettings.asStripeClasses.length;
6608
+ oSettings.asDestroyStripes = [];
6609
+ if (iLen)
6610
+ {
6611
+ var bStripeRemove = false;
6612
+ var anRows = $(this).children('tbody').children('tr:lt(' + iLen + ')');
6613
+ for ( i=0 ; i<iLen ; i++ )
6614
+ {
6615
+ if ( anRows.hasClass( oSettings.asStripeClasses[i] ) )
6616
+ {
6617
+ bStripeRemove = true;
6618
+
6619
+ /* Store the classes which we are about to remove so they can be re-added on destroy */
6620
+ oSettings.asDestroyStripes.push( oSettings.asStripeClasses[i] );
6621
+ }
6622
+ }
6623
+
6624
+ if ( bStripeRemove )
6625
+ {
6626
+ anRows.removeClass( oSettings.asStripeClasses.join(' ') );
6627
+ }
6628
+ }
6629
+
6630
+ /*
6631
+ * Columns
6632
+ * See if we should load columns automatically or use defined ones
6633
+ */
6634
+ var anThs = [];
6635
+ var aoColumnsInit;
6636
+ var nThead = this.getElementsByTagName('thead');
6637
+ if ( nThead.length !== 0 )
6638
+ {
6639
+ _fnDetectHeader( oSettings.aoHeader, nThead[0] );
6640
+ anThs = _fnGetUniqueThs( oSettings );
6641
+ }
6642
+
6643
+ /* If not given a column array, generate one with nulls */
6644
+ if ( oInit.aoColumns === null )
6645
+ {
6646
+ aoColumnsInit = [];
6647
+ for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
6648
+ {
6649
+ aoColumnsInit.push( null );
6650
+ }
6651
+ }
6652
+ else
6653
+ {
6654
+ aoColumnsInit = oInit.aoColumns;
6655
+ }
6656
+
6657
+ /* Add the columns */
6658
+ for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
6659
+ {
6660
+ /* Short cut - use the loop to check if we have column visibility state to restore */
6661
+ if ( oInit.saved_aoColumns !== undefined && oInit.saved_aoColumns.length == iLen )
6662
+ {
6663
+ if ( aoColumnsInit[i] === null )
6664
+ {
6665
+ aoColumnsInit[i] = {};
6666
+ }
6667
+ aoColumnsInit[i].bVisible = oInit.saved_aoColumns[i].bVisible;
6668
+ }
6669
+
6670
+ _fnAddColumn( oSettings, anThs ? anThs[i] : null );
6671
+ }
6672
+
6673
+ /* Apply the column definitions */
6674
+ _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
6675
+ _fnColumnOptions( oSettings, iCol, oDef );
6676
+ } );
6677
+
6678
+
6679
+ /*
6680
+ * Sorting
6681
+ * Check the aaSorting array
6682
+ */
6683
+ for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ )
6684
+ {
6685
+ if ( oSettings.aaSorting[i][0] >= oSettings.aoColumns.length )
6686
+ {
6687
+ oSettings.aaSorting[i][0] = 0;
6688
+ }
6689
+ var oColumn = oSettings.aoColumns[ oSettings.aaSorting[i][0] ];
6690
+
6691
+ /* Add a default sorting index */
6692
+ if ( oSettings.aaSorting[i][2] === undefined )
6693
+ {
6694
+ oSettings.aaSorting[i][2] = 0;
6695
+ }
6696
+
6697
+ /* If aaSorting is not defined, then we use the first indicator in asSorting */
6698
+ if ( oInit.aaSorting === undefined && oSettings.saved_aaSorting === undefined )
6699
+ {
6700
+ oSettings.aaSorting[i][1] = oColumn.asSorting[0];
6701
+ }
6702
+
6703
+ /* Set the current sorting index based on aoColumns.asSorting */
6704
+ for ( j=0, jLen=oColumn.asSorting.length ; j<jLen ; j++ )
6705
+ {
6706
+ if ( oSettings.aaSorting[i][1] == oColumn.asSorting[j] )
6707
+ {
6708
+ oSettings.aaSorting[i][2] = j;
6709
+ break;
6710
+ }
6711
+ }
6712
+ }
6713
+
6714
+ /* Do a first pass on the sorting classes (allows any size changes to be taken into
6715
+ * account, and also will apply sorting disabled classes if disabled
6716
+ */
6717
+ _fnSortingClasses( oSettings );
6718
+
6719
+
6720
+ /*
6721
+ * Final init
6722
+ * Cache the header, body and footer as required, creating them if needed
6723
+ */
6724
+
6725
+ /* Browser support detection */
6726
+ _fnBrowserDetect( oSettings );
6727
+
6728
+ // Work around for Webkit bug 83867 - store the caption-side before removing from doc
6729
+ var captions = $(this).children('caption').each( function () {
6730
+ this._captionSide = $(this).css('caption-side');
6731
+ } );
6732
+
6733
+ var thead = $(this).children('thead');
6734
+ if ( thead.length === 0 )
6735
+ {
6736
+ thead = [ document.createElement( 'thead' ) ];
6737
+ this.appendChild( thead[0] );
6738
+ }
6739
+ oSettings.nTHead = thead[0];
6740
+
6741
+ var tbody = $(this).children('tbody');
6742
+ if ( tbody.length === 0 )
6743
+ {
6744
+ tbody = [ document.createElement( 'tbody' ) ];
6745
+ this.appendChild( tbody[0] );
6746
+ }
6747
+ oSettings.nTBody = tbody[0];
6748
+ oSettings.nTBody.setAttribute( "role", "alert" );
6749
+ oSettings.nTBody.setAttribute( "aria-live", "polite" );
6750
+ oSettings.nTBody.setAttribute( "aria-relevant", "all" );
6751
+
6752
+ var tfoot = $(this).children('tfoot');
6753
+ if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
6754
+ {
6755
+ // If we are a scrolling table, and no footer has been given, then we need to create
6756
+ // a tfoot element for the caption element to be appended to
6757
+ tfoot = [ document.createElement( 'tfoot' ) ];
6758
+ this.appendChild( tfoot[0] );
6759
+ }
6760
+
6761
+ if ( tfoot.length > 0 )
6762
+ {
6763
+ oSettings.nTFoot = tfoot[0];
6764
+ _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
6765
+ }
6766
+
6767
+ /* Check if there is data passing into the constructor */
6768
+ if ( bUsePassedData )
6769
+ {
6770
+ for ( i=0 ; i<oInit.aaData.length ; i++ )
6771
+ {
6772
+ _fnAddData( oSettings, oInit.aaData[ i ] );
6773
+ }
6774
+ }
6775
+ else
6776
+ {
6777
+ /* Grab the data from the page */
6778
+ _fnGatherData( oSettings );
6779
+ }
6780
+
6781
+ /* Copy the data index array */
6782
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
6783
+
6784
+ /* Initialisation complete - table can be drawn */
6785
+ oSettings.bInitialised = true;
6786
+
6787
+ /* Check if we need to initialise the table (it might not have been handed off to the
6788
+ * language processor)
6789
+ */
6790
+ if ( bInitHandedOff === false )
6791
+ {
6792
+ _fnInitialise( oSettings );
6793
+ }
6794
+ } );
6795
+ _that = null;
6796
+ return this;
6797
+ };
6798
+
6799
+
6800
+
6801
+ /**
6802
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
6803
+ * to ensure compatibility.
6804
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
6805
+ * formats "X" and "X.Y" are also acceptable.
6806
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
6807
+ * version, or false if this version of DataTales is not suitable
6808
+ * @static
6809
+ * @dtopt API-Static
6810
+ *
6811
+ * @example
6812
+ * alert( $.fn.dataTable.fnVersionCheck( '1.9.0' ) );
6813
+ */
6814
+ DataTable.fnVersionCheck = function( sVersion )
6815
+ {
6816
+ /* This is cheap, but effective */
6817
+ var fnZPad = function (Zpad, count)
6818
+ {
6819
+ while(Zpad.length < count) {
6820
+ Zpad += '0';
6821
+ }
6822
+ return Zpad;
6823
+ };
6824
+ var aThis = DataTable.ext.sVersion.split('.');
6825
+ var aThat = sVersion.split('.');
6826
+ var sThis = '', sThat = '';
6827
+
6828
+ for ( var i=0, iLen=aThat.length ; i<iLen ; i++ )
6829
+ {
6830
+ sThis += fnZPad( aThis[i], 3 );
6831
+ sThat += fnZPad( aThat[i], 3 );
6832
+ }
6833
+
6834
+ return parseInt(sThis, 10) >= parseInt(sThat, 10);
6835
+ };
6836
+
6837
+
6838
+ /**
6839
+ * Check if a TABLE node is a DataTable table already or not.
6840
+ * @param {node} nTable The TABLE node to check if it is a DataTable or not (note that other
6841
+ * node types can be passed in, but will always return false).
6842
+ * @returns {boolean} true the table given is a DataTable, or false otherwise
6843
+ * @static
6844
+ * @dtopt API-Static
6845
+ *
6846
+ * @example
6847
+ * var ex = document.getElementById('example');
6848
+ * if ( ! $.fn.DataTable.fnIsDataTable( ex ) ) {
6849
+ * $(ex).dataTable();
6850
+ * }
6851
+ */
6852
+ DataTable.fnIsDataTable = function ( nTable )
6853
+ {
6854
+ var o = DataTable.settings;
6855
+
6856
+ for ( var i=0 ; i<o.length ; i++ )
6857
+ {
6858
+ if ( o[i].nTable === nTable || o[i].nScrollHead === nTable || o[i].nScrollFoot === nTable )
6859
+ {
6860
+ return true;
6861
+ }
6862
+ }
6863
+
6864
+ return false;
6865
+ };
6866
+
6867
+
6868
+ /**
6869
+ * Get all DataTable tables that have been initialised - optionally you can select to
6870
+ * get only currently visible tables.
6871
+ * @param {boolean} [bVisible=false] Flag to indicate if you want all (default) or
6872
+ * visible tables only.
6873
+ * @returns {array} Array of TABLE nodes (not DataTable instances) which are DataTables
6874
+ * @static
6875
+ * @dtopt API-Static
6876
+ *
6877
+ * @example
6878
+ * var table = $.fn.dataTable.fnTables(true);
6879
+ * if ( table.length > 0 ) {
6880
+ * $(table).dataTable().fnAdjustColumnSizing();
6881
+ * }
6882
+ */
6883
+ DataTable.fnTables = function ( bVisible )
6884
+ {
6885
+ var out = [];
6886
+
6887
+ jQuery.each( DataTable.settings, function (i, o) {
6888
+ if ( !bVisible || (bVisible === true && $(o.nTable).is(':visible')) )
6889
+ {
6890
+ out.push( o.nTable );
6891
+ }
6892
+ } );
6893
+
6894
+ return out;
6895
+ };
6896
+
6897
+
6898
+ /**
6899
+ * Version string for plug-ins to check compatibility. Allowed format is
6900
+ * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
6901
+ * e are optional
6902
+ * @member
6903
+ * @type string
6904
+ * @default Version number
6905
+ */
6906
+ DataTable.version = "1.9.4";
6907
+
6908
+ /**
6909
+ * Private data store, containing all of the settings objects that are created for the
6910
+ * tables on a given page.
6911
+ *
6912
+ * Note that the <i>DataTable.settings</i> object is aliased to <i>jQuery.fn.dataTableExt</i>
6913
+ * through which it may be accessed and manipulated, or <i>jQuery.fn.dataTable.settings</i>.
6914
+ * @member
6915
+ * @type array
6916
+ * @default []
6917
+ * @private
6918
+ */
6919
+ DataTable.settings = [];
6920
+
6921
+ /**
6922
+ * Object models container, for the various models that DataTables has available
6923
+ * to it. These models define the objects that are used to hold the active state
6924
+ * and configuration of the table.
6925
+ * @namespace
6926
+ */
6927
+ DataTable.models = {};
6928
+
6929
+
6930
+ /**
6931
+ * DataTables extension options and plug-ins. This namespace acts as a collection "area"
6932
+ * for plug-ins that can be used to extend the default DataTables behaviour - indeed many
6933
+ * of the build in methods use this method to provide their own capabilities (sorting methods
6934
+ * for example).
6935
+ *
6936
+ * Note that this namespace is aliased to jQuery.fn.dataTableExt so it can be readily accessed
6937
+ * and modified by plug-ins.
6938
+ * @namespace
6939
+ */
6940
+ DataTable.models.ext = {
6941
+ /**
6942
+ * Plug-in filtering functions - this method of filtering is complimentary to the default
6943
+ * type based filtering, and a lot more comprehensive as it allows you complete control
6944
+ * over the filtering logic. Each element in this array is a function (parameters
6945
+ * described below) that is called for every row in the table, and your logic decides if
6946
+ * it should be included in the filtered data set or not.
6947
+ * <ul>
6948
+ * <li>
6949
+ * Function input parameters:
6950
+ * <ul>
6951
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
6952
+ * <li>{array|object} Data for the row to be processed (same as the original format
6953
+ * that was passed in as the data source, or an array from a DOM data source</li>
6954
+ * <li>{int} Row index in aoData ({@link DataTable.models.oSettings.aoData}), which can
6955
+ * be useful to retrieve the TR element if you need DOM interaction.</li>
6956
+ * </ul>
6957
+ * </li>
6958
+ * <li>
6959
+ * Function return:
6960
+ * <ul>
6961
+ * <li>{boolean} Include the row in the filtered result set (true) or not (false)</li>
6962
+ * </ul>
6963
+ * </il>
6964
+ * </ul>
6965
+ * @type array
6966
+ * @default []
6967
+ *
6968
+ * @example
6969
+ * // The following example shows custom filtering being applied to the fourth column (i.e.
6970
+ * // the aData[3] index) based on two input values from the end-user, matching the data in
6971
+ * // a certain range.
6972
+ * $.fn.dataTableExt.afnFiltering.push(
6973
+ * function( oSettings, aData, iDataIndex ) {
6974
+ * var iMin = document.getElementById('min').value * 1;
6975
+ * var iMax = document.getElementById('max').value * 1;
6976
+ * var iVersion = aData[3] == "-" ? 0 : aData[3]*1;
6977
+ * if ( iMin == "" && iMax == "" ) {
6978
+ * return true;
6979
+ * }
6980
+ * else if ( iMin == "" && iVersion < iMax ) {
6981
+ * return true;
6982
+ * }
6983
+ * else if ( iMin < iVersion && "" == iMax ) {
6984
+ * return true;
6985
+ * }
6986
+ * else if ( iMin < iVersion && iVersion < iMax ) {
6987
+ * return true;
6988
+ * }
6989
+ * return false;
6990
+ * }
6991
+ * );
6992
+ */
6993
+ "afnFiltering": [],
6994
+
6995
+
6996
+ /**
6997
+ * Plug-in sorting functions - this method of sorting is complimentary to the default type
6998
+ * based sorting that DataTables does automatically, allowing much greater control over the
6999
+ * the data that is being used to sort a column. This is useful if you want to do sorting
7000
+ * based on live data (for example the contents of an 'input' element) rather than just the
7001
+ * static string that DataTables knows of. The way these plug-ins work is that you create
7002
+ * an array of the values you wish to be sorted for the column in question and then return
7003
+ * that array. Which pre-sorting function is run here depends on the sSortDataType parameter
7004
+ * that is used for the column (if any). This is the corollary of <i>ofnSearch</i> for sort
7005
+ * data.
7006
+ * <ul>
7007
+ * <li>
7008
+ * Function input parameters:
7009
+ * <ul>
7010
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7011
+ * <li>{int} Target column index</li>
7012
+ * </ul>
7013
+ * </li>
7014
+ * <li>
7015
+ * Function return:
7016
+ * <ul>
7017
+ * <li>{array} Data for the column to be sorted upon</li>
7018
+ * </ul>
7019
+ * </il>
7020
+ * </ul>
7021
+ *
7022
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7023
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7024
+ * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
7025
+ * prepare the data as required for the different types. As such, this method is deprecated.
7026
+ * @type array
7027
+ * @default []
7028
+ * @deprecated
7029
+ *
7030
+ * @example
7031
+ * // Updating the cached sorting information with user entered values in HTML input elements
7032
+ * jQuery.fn.dataTableExt.afnSortData['dom-text'] = function ( oSettings, iColumn )
7033
+ * {
7034
+ * var aData = [];
7035
+ * $( 'td:eq('+iColumn+') input', oSettings.oApi._fnGetTrNodes(oSettings) ).each( function () {
7036
+ * aData.push( this.value );
7037
+ * } );
7038
+ * return aData;
7039
+ * }
7040
+ */
7041
+ "afnSortData": [],
7042
+
7043
+
7044
+ /**
7045
+ * Feature plug-ins - This is an array of objects which describe the feature plug-ins that are
7046
+ * available to DataTables. These feature plug-ins are accessible through the sDom initialisation
7047
+ * option. As such, each feature plug-in must describe a function that is used to initialise
7048
+ * itself (fnInit), a character so the feature can be enabled by sDom (cFeature) and the name
7049
+ * of the feature (sFeature). Thus the objects attached to this method must provide:
7050
+ * <ul>
7051
+ * <li>{function} fnInit Initialisation of the plug-in
7052
+ * <ul>
7053
+ * <li>
7054
+ * Function input parameters:
7055
+ * <ul>
7056
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7057
+ * </ul>
7058
+ * </li>
7059
+ * <li>
7060
+ * Function return:
7061
+ * <ul>
7062
+ * <li>{node|null} The element which contains your feature. Note that the return
7063
+ * may also be void if your plug-in does not require to inject any DOM elements
7064
+ * into DataTables control (sDom) - for example this might be useful when
7065
+ * developing a plug-in which allows table control via keyboard entry.</li>
7066
+ * </ul>
7067
+ * </il>
7068
+ * </ul>
7069
+ * </li>
7070
+ * <li>{character} cFeature Character that will be matched in sDom - case sensitive</li>
7071
+ * <li>{string} sFeature Feature name</li>
7072
+ * </ul>
7073
+ * @type array
7074
+ * @default []
7075
+ *
7076
+ * @example
7077
+ * // How TableTools initialises itself.
7078
+ * $.fn.dataTableExt.aoFeatures.push( {
7079
+ * "fnInit": function( oSettings ) {
7080
+ * return new TableTools( { "oDTSettings": oSettings } );
7081
+ * },
7082
+ * "cFeature": "T",
7083
+ * "sFeature": "TableTools"
7084
+ * } );
7085
+ */
7086
+ "aoFeatures": [],
7087
+
7088
+
7089
+ /**
7090
+ * Type detection plug-in functions - DataTables utilises types to define how sorting and
7091
+ * filtering behave, and types can be either be defined by the developer (sType for the
7092
+ * column) or they can be automatically detected by the methods in this array. The functions
7093
+ * defined in the array are quite simple, taking a single parameter (the data to analyse)
7094
+ * and returning the type if it is a known type, or null otherwise.
7095
+ * <ul>
7096
+ * <li>
7097
+ * Function input parameters:
7098
+ * <ul>
7099
+ * <li>{*} Data from the column cell to be analysed</li>
7100
+ * </ul>
7101
+ * </li>
7102
+ * <li>
7103
+ * Function return:
7104
+ * <ul>
7105
+ * <li>{string|null} Data type detected, or null if unknown (and thus pass it
7106
+ * on to the other type detection functions.</li>
7107
+ * </ul>
7108
+ * </il>
7109
+ * </ul>
7110
+ * @type array
7111
+ * @default []
7112
+ *
7113
+ * @example
7114
+ * // Currency type detection plug-in:
7115
+ * jQuery.fn.dataTableExt.aTypes.push(
7116
+ * function ( sData ) {
7117
+ * var sValidChars = "0123456789.-";
7118
+ * var Char;
7119
+ *
7120
+ * // Check the numeric part
7121
+ * for ( i=1 ; i<sData.length ; i++ ) {
7122
+ * Char = sData.charAt(i);
7123
+ * if (sValidChars.indexOf(Char) == -1) {
7124
+ * return null;
7125
+ * }
7126
+ * }
7127
+ *
7128
+ * // Check prefixed by currency
7129
+ * if ( sData.charAt(0) == '$' || sData.charAt(0) == '&pound;' ) {
7130
+ * return 'currency';
7131
+ * }
7132
+ * return null;
7133
+ * }
7134
+ * );
7135
+ */
7136
+ "aTypes": [],
7137
+
7138
+
7139
+ /**
7140
+ * Provide a common method for plug-ins to check the version of DataTables being used,
7141
+ * in order to ensure compatibility.
7142
+ * @type function
7143
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note
7144
+ * that the formats "X" and "X.Y" are also acceptable.
7145
+ * @returns {boolean} true if this version of DataTables is greater or equal to the
7146
+ * required version, or false if this version of DataTales is not suitable
7147
+ *
7148
+ * @example
7149
+ * $(document).ready(function() {
7150
+ * var oTable = $('#example').dataTable();
7151
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
7152
+ * } );
7153
+ */
7154
+ "fnVersionCheck": DataTable.fnVersionCheck,
7155
+
7156
+
7157
+ /**
7158
+ * Index for what 'this' index API functions should use
7159
+ * @type int
7160
+ * @default 0
7161
+ */
7162
+ "iApiIndex": 0,
7163
+
7164
+
7165
+ /**
7166
+ * Pre-processing of filtering data plug-ins - When you assign the sType for a column
7167
+ * (or have it automatically detected for you by DataTables or a type detection plug-in),
7168
+ * you will typically be using this for custom sorting, but it can also be used to provide
7169
+ * custom filtering by allowing you to pre-processing the data and returning the data in
7170
+ * the format that should be filtered upon. This is done by adding functions this object
7171
+ * with a parameter name which matches the sType for that target column. This is the
7172
+ * corollary of <i>afnSortData</i> for filtering data.
7173
+ * <ul>
7174
+ * <li>
7175
+ * Function input parameters:
7176
+ * <ul>
7177
+ * <li>{*} Data from the column cell to be prepared for filtering</li>
7178
+ * </ul>
7179
+ * </li>
7180
+ * <li>
7181
+ * Function return:
7182
+ * <ul>
7183
+ * <li>{string|null} Formatted string that will be used for the filtering.</li>
7184
+ * </ul>
7185
+ * </il>
7186
+ * </ul>
7187
+ *
7188
+ * Note that as of v1.9, it is typically preferable to use <i>mData</i> to prepare data for
7189
+ * the different uses that DataTables can put the data to. Specifically <i>mData</i> when
7190
+ * used as a function will give you a 'type' (sorting, filtering etc) that you can use to
7191
+ * prepare the data as required for the different types. As such, this method is deprecated.
7192
+ * @type object
7193
+ * @default {}
7194
+ * @deprecated
7195
+ *
7196
+ * @example
7197
+ * $.fn.dataTableExt.ofnSearch['title-numeric'] = function ( sData ) {
7198
+ * return sData.replace(/\n/g," ").replace( /<.*?>/g, "" );
7199
+ * }
7200
+ */
7201
+ "ofnSearch": {},
7202
+
7203
+
7204
+ /**
7205
+ * Container for all private functions in DataTables so they can be exposed externally
7206
+ * @type object
7207
+ * @default {}
7208
+ */
7209
+ "oApi": {},
7210
+
7211
+
7212
+ /**
7213
+ * Storage for the various classes that DataTables uses
7214
+ * @type object
7215
+ * @default {}
7216
+ */
7217
+ "oStdClasses": {},
7218
+
7219
+
7220
+ /**
7221
+ * Storage for the various classes that DataTables uses - jQuery UI suitable
7222
+ * @type object
7223
+ * @default {}
7224
+ */
7225
+ "oJUIClasses": {},
7226
+
7227
+
7228
+ /**
7229
+ * Pagination plug-in methods - The style and controls of the pagination can significantly
7230
+ * impact on how the end user interacts with the data in your table, and DataTables allows
7231
+ * the addition of pagination controls by extending this object, which can then be enabled
7232
+ * through the <i>sPaginationType</i> initialisation parameter. Each pagination type that
7233
+ * is added is an object (the property name of which is what <i>sPaginationType</i> refers
7234
+ * to) that has two properties, both methods that are used by DataTables to update the
7235
+ * control's state.
7236
+ * <ul>
7237
+ * <li>
7238
+ * fnInit - Initialisation of the paging controls. Called only during initialisation
7239
+ * of the table. It is expected that this function will add the required DOM elements
7240
+ * to the page for the paging controls to work. The element pointer
7241
+ * 'oSettings.aanFeatures.p' array is provided by DataTables to contain the paging
7242
+ * controls (note that this is a 2D array to allow for multiple instances of each
7243
+ * DataTables DOM element). It is suggested that you add the controls to this element
7244
+ * as children
7245
+ * <ul>
7246
+ * <li>
7247
+ * Function input parameters:
7248
+ * <ul>
7249
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7250
+ * <li>{node} Container into which the pagination controls must be inserted</li>
7251
+ * <li>{function} Draw callback function - whenever the controls cause a page
7252
+ * change, this method must be called to redraw the table.</li>
7253
+ * </ul>
7254
+ * </li>
7255
+ * <li>
7256
+ * Function return:
7257
+ * <ul>
7258
+ * <li>No return required</li>
7259
+ * </ul>
7260
+ * </il>
7261
+ * </ul>
7262
+ * </il>
7263
+ * <li>
7264
+ * fnInit - This function is called whenever the paging status of the table changes and is
7265
+ * typically used to update classes and/or text of the paging controls to reflex the new
7266
+ * status.
7267
+ * <ul>
7268
+ * <li>
7269
+ * Function input parameters:
7270
+ * <ul>
7271
+ * <li>{object} DataTables settings object: see {@link DataTable.models.oSettings}.</li>
7272
+ * <li>{function} Draw callback function - in case you need to redraw the table again
7273
+ * or attach new event listeners</li>
7274
+ * </ul>
7275
+ * </li>
7276
+ * <li>
7277
+ * Function return:
7278
+ * <ul>
7279
+ * <li>No return required</li>
7280
+ * </ul>
7281
+ * </il>
7282
+ * </ul>
7283
+ * </il>
7284
+ * </ul>
7285
+ * @type object
7286
+ * @default {}
7287
+ *
7288
+ * @example
7289
+ * $.fn.dataTableExt.oPagination.four_button = {
7290
+ * "fnInit": function ( oSettings, nPaging, fnCallbackDraw ) {
7291
+ * nFirst = document.createElement( 'span' );
7292
+ * nPrevious = document.createElement( 'span' );
7293
+ * nNext = document.createElement( 'span' );
7294
+ * nLast = document.createElement( 'span' );
7295
+ *
7296
+ * nFirst.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sFirst ) );
7297
+ * nPrevious.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sPrevious ) );
7298
+ * nNext.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sNext ) );
7299
+ * nLast.appendChild( document.createTextNode( oSettings.oLanguage.oPaginate.sLast ) );
7300
+ *
7301
+ * nFirst.className = "paginate_button first";
7302
+ * nPrevious.className = "paginate_button previous";
7303
+ * nNext.className="paginate_button next";
7304
+ * nLast.className = "paginate_button last";
7305
+ *
7306
+ * nPaging.appendChild( nFirst );
7307
+ * nPaging.appendChild( nPrevious );
7308
+ * nPaging.appendChild( nNext );
7309
+ * nPaging.appendChild( nLast );
7310
+ *
7311
+ * $(nFirst).click( function () {
7312
+ * oSettings.oApi._fnPageChange( oSettings, "first" );
7313
+ * fnCallbackDraw( oSettings );
7314
+ * } );
7315
+ *
7316
+ * $(nPrevious).click( function() {
7317
+ * oSettings.oApi._fnPageChange( oSettings, "previous" );
7318
+ * fnCallbackDraw( oSettings );
7319
+ * } );
7320
+ *
7321
+ * $(nNext).click( function() {
7322
+ * oSettings.oApi._fnPageChange( oSettings, "next" );
7323
+ * fnCallbackDraw( oSettings );
7324
+ * } );
7325
+ *
7326
+ * $(nLast).click( function() {
7327
+ * oSettings.oApi._fnPageChange( oSettings, "last" );
7328
+ * fnCallbackDraw( oSettings );
7329
+ * } );
7330
+ *
7331
+ * $(nFirst).bind( 'selectstart', function () { return false; } );
7332
+ * $(nPrevious).bind( 'selectstart', function () { return false; } );
7333
+ * $(nNext).bind( 'selectstart', function () { return false; } );
7334
+ * $(nLast).bind( 'selectstart', function () { return false; } );
7335
+ * },
7336
+ *
7337
+ * "fnUpdate": function ( oSettings, fnCallbackDraw ) {
7338
+ * if ( !oSettings.aanFeatures.p ) {
7339
+ * return;
7340
+ * }
7341
+ *
7342
+ * // Loop over each instance of the pager
7343
+ * var an = oSettings.aanFeatures.p;
7344
+ * for ( var i=0, iLen=an.length ; i<iLen ; i++ ) {
7345
+ * var buttons = an[i].getElementsByTagName('span');
7346
+ * if ( oSettings._iDisplayStart === 0 ) {
7347
+ * buttons[0].className = "paginate_disabled_previous";
7348
+ * buttons[1].className = "paginate_disabled_previous";
7349
+ * }
7350
+ * else {
7351
+ * buttons[0].className = "paginate_enabled_previous";
7352
+ * buttons[1].className = "paginate_enabled_previous";
7353
+ * }
7354
+ *
7355
+ * if ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) {
7356
+ * buttons[2].className = "paginate_disabled_next";
7357
+ * buttons[3].className = "paginate_disabled_next";
7358
+ * }
7359
+ * else {
7360
+ * buttons[2].className = "paginate_enabled_next";
7361
+ * buttons[3].className = "paginate_enabled_next";
7362
+ * }
7363
+ * }
7364
+ * }
7365
+ * };
7366
+ */
7367
+ "oPagination": {},
7368
+
7369
+
7370
+ /**
7371
+ * Sorting plug-in methods - Sorting in DataTables is based on the detected type of the
7372
+ * data column (you can add your own type detection functions, or override automatic
7373
+ * detection using sType). With this specific type given to the column, DataTables will
7374
+ * apply the required sort from the functions in the object. Each sort type must provide
7375
+ * two mandatory methods, one each for ascending and descending sorting, and can optionally
7376
+ * provide a pre-formatting method that will help speed up sorting by allowing DataTables
7377
+ * to pre-format the sort data only once (rather than every time the actual sort functions
7378
+ * are run). The two sorting functions are typical Javascript sort methods:
7379
+ * <ul>
7380
+ * <li>
7381
+ * Function input parameters:
7382
+ * <ul>
7383
+ * <li>{*} Data to compare to the second parameter</li>
7384
+ * <li>{*} Data to compare to the first parameter</li>
7385
+ * </ul>
7386
+ * </li>
7387
+ * <li>
7388
+ * Function return:
7389
+ * <ul>
7390
+ * <li>{int} Sorting match: <0 if first parameter should be sorted lower than
7391
+ * the second parameter, ===0 if the two parameters are equal and >0 if
7392
+ * the first parameter should be sorted height than the second parameter.</li>
7393
+ * </ul>
7394
+ * </il>
7395
+ * </ul>
7396
+ * @type object
7397
+ * @default {}
7398
+ *
7399
+ * @example
7400
+ * // Case-sensitive string sorting, with no pre-formatting method
7401
+ * $.extend( $.fn.dataTableExt.oSort, {
7402
+ * "string-case-asc": function(x,y) {
7403
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
7404
+ * },
7405
+ * "string-case-desc": function(x,y) {
7406
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
7407
+ * }
7408
+ * } );
7409
+ *
7410
+ * @example
7411
+ * // Case-insensitive string sorting, with pre-formatting
7412
+ * $.extend( $.fn.dataTableExt.oSort, {
7413
+ * "string-pre": function(x) {
7414
+ * return x.toLowerCase();
7415
+ * },
7416
+ * "string-asc": function(x,y) {
7417
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
7418
+ * },
7419
+ * "string-desc": function(x,y) {
7420
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
7421
+ * }
7422
+ * } );
7423
+ */
7424
+ "oSort": {},
7425
+
7426
+
7427
+ /**
7428
+ * Version string for plug-ins to check compatibility. Allowed format is
7429
+ * a.b.c.d.e where: a:int, b:int, c:int, d:string(dev|beta), e:int. d and
7430
+ * e are optional
7431
+ * @type string
7432
+ * @default Version number
7433
+ */
7434
+ "sVersion": DataTable.version,
7435
+
7436
+
7437
+ /**
7438
+ * How should DataTables report an error. Can take the value 'alert' or 'throw'
7439
+ * @type string
7440
+ * @default alert
7441
+ */
7442
+ "sErrMode": "alert",
7443
+
7444
+
7445
+ /**
7446
+ * Store information for DataTables to access globally about other instances
7447
+ * @namespace
7448
+ * @private
7449
+ */
7450
+ "_oExternConfig": {
7451
+ /* int:iNextUnique - next unique number for an instance */
7452
+ "iNextUnique": 0
7453
+ }
7454
+ };
7455
+
7456
+
7457
+
7458
+
7459
+ /**
7460
+ * Template object for the way in which DataTables holds information about
7461
+ * search information for the global filter and individual column filters.
7462
+ * @namespace
7463
+ */
7464
+ DataTable.models.oSearch = {
7465
+ /**
7466
+ * Flag to indicate if the filtering should be case insensitive or not
7467
+ * @type boolean
7468
+ * @default true
7469
+ */
7470
+ "bCaseInsensitive": true,
7471
+
7472
+ /**
7473
+ * Applied search term
7474
+ * @type string
7475
+ * @default <i>Empty string</i>
7476
+ */
7477
+ "sSearch": "",
7478
+
7479
+ /**
7480
+ * Flag to indicate if the search term should be interpreted as a
7481
+ * regular expression (true) or not (false) and therefore and special
7482
+ * regex characters escaped.
7483
+ * @type boolean
7484
+ * @default false
7485
+ */
7486
+ "bRegex": false,
7487
+
7488
+ /**
7489
+ * Flag to indicate if DataTables is to use its smart filtering or not.
7490
+ * @type boolean
7491
+ * @default true
7492
+ */
7493
+ "bSmart": true
7494
+ };
7495
+
7496
+
7497
+
7498
+
7499
+ /**
7500
+ * Template object for the way in which DataTables holds information about
7501
+ * each individual row. This is the object format used for the settings
7502
+ * aoData array.
7503
+ * @namespace
7504
+ */
7505
+ DataTable.models.oRow = {
7506
+ /**
7507
+ * TR element for the row
7508
+ * @type node
7509
+ * @default null
7510
+ */
7511
+ "nTr": null,
7512
+
7513
+ /**
7514
+ * Data object from the original data source for the row. This is either
7515
+ * an array if using the traditional form of DataTables, or an object if
7516
+ * using mData options. The exact type will depend on the passed in
7517
+ * data from the data source, or will be an array if using DOM a data
7518
+ * source.
7519
+ * @type array|object
7520
+ * @default []
7521
+ */
7522
+ "_aData": [],
7523
+
7524
+ /**
7525
+ * Sorting data cache - this array is ostensibly the same length as the
7526
+ * number of columns (although each index is generated only as it is
7527
+ * needed), and holds the data that is used for sorting each column in the
7528
+ * row. We do this cache generation at the start of the sort in order that
7529
+ * the formatting of the sort data need be done only once for each cell
7530
+ * per sort. This array should not be read from or written to by anything
7531
+ * other than the master sorting methods.
7532
+ * @type array
7533
+ * @default []
7534
+ * @private
7535
+ */
7536
+ "_aSortData": [],
7537
+
7538
+ /**
7539
+ * Array of TD elements that are cached for hidden rows, so they can be
7540
+ * reinserted into the table if a column is made visible again (or to act
7541
+ * as a store if a column is made hidden). Only hidden columns have a
7542
+ * reference in the array. For non-hidden columns the value is either
7543
+ * undefined or null.
7544
+ * @type array nodes
7545
+ * @default []
7546
+ * @private
7547
+ */
7548
+ "_anHidden": [],
7549
+
7550
+ /**
7551
+ * Cache of the class name that DataTables has applied to the row, so we
7552
+ * can quickly look at this variable rather than needing to do a DOM check
7553
+ * on className for the nTr property.
7554
+ * @type string
7555
+ * @default <i>Empty string</i>
7556
+ * @private
7557
+ */
7558
+ "_sRowStripe": ""
7559
+ };
7560
+
7561
+
7562
+
7563
+ /**
7564
+ * Template object for the column information object in DataTables. This object
7565
+ * is held in the settings aoColumns array and contains all the information that
7566
+ * DataTables needs about each individual column.
7567
+ *
7568
+ * Note that this object is related to {@link DataTable.defaults.columns}
7569
+ * but this one is the internal data store for DataTables's cache of columns.
7570
+ * It should NOT be manipulated outside of DataTables. Any configuration should
7571
+ * be done through the initialisation options.
7572
+ * @namespace
7573
+ */
7574
+ DataTable.models.oColumn = {
7575
+ /**
7576
+ * A list of the columns that sorting should occur on when this column
7577
+ * is sorted. That this property is an array allows multi-column sorting
7578
+ * to be defined for a column (for example first name / last name columns
7579
+ * would benefit from this). The values are integers pointing to the
7580
+ * columns to be sorted on (typically it will be a single integer pointing
7581
+ * at itself, but that doesn't need to be the case).
7582
+ * @type array
7583
+ */
7584
+ "aDataSort": null,
7585
+
7586
+ /**
7587
+ * Define the sorting directions that are applied to the column, in sequence
7588
+ * as the column is repeatedly sorted upon - i.e. the first value is used
7589
+ * as the sorting direction when the column if first sorted (clicked on).
7590
+ * Sort it again (click again) and it will move on to the next index.
7591
+ * Repeat until loop.
7592
+ * @type array
7593
+ */
7594
+ "asSorting": null,
7595
+
7596
+ /**
7597
+ * Flag to indicate if the column is searchable, and thus should be included
7598
+ * in the filtering or not.
7599
+ * @type boolean
7600
+ */
7601
+ "bSearchable": null,
7602
+
7603
+ /**
7604
+ * Flag to indicate if the column is sortable or not.
7605
+ * @type boolean
7606
+ */
7607
+ "bSortable": null,
7608
+
7609
+ /**
7610
+ * <code>Deprecated</code> When using fnRender, you have two options for what
7611
+ * to do with the data, and this property serves as the switch. Firstly, you
7612
+ * can have the sorting and filtering use the rendered value (true - default),
7613
+ * or you can have the sorting and filtering us the original value (false).
7614
+ *
7615
+ * Please note that this option has now been deprecated and will be removed
7616
+ * in the next version of DataTables. Please use mRender / mData rather than
7617
+ * fnRender.
7618
+ * @type boolean
7619
+ * @deprecated
7620
+ */
7621
+ "bUseRendered": null,
7622
+
7623
+ /**
7624
+ * Flag to indicate if the column is currently visible in the table or not
7625
+ * @type boolean
7626
+ */
7627
+ "bVisible": null,
7628
+
7629
+ /**
7630
+ * Flag to indicate to the type detection method if the automatic type
7631
+ * detection should be used, or if a column type (sType) has been specified
7632
+ * @type boolean
7633
+ * @default true
7634
+ * @private
7635
+ */
7636
+ "_bAutoType": true,
7637
+
7638
+ /**
7639
+ * Developer definable function that is called whenever a cell is created (Ajax source,
7640
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
7641
+ * allowing you to modify the DOM element (add background colour for example) when the
7642
+ * element is available.
7643
+ * @type function
7644
+ * @param {element} nTd The TD node that has been created
7645
+ * @param {*} sData The Data for the cell
7646
+ * @param {array|object} oData The data for the whole row
7647
+ * @param {int} iRow The row index for the aoData data store
7648
+ * @default null
7649
+ */
7650
+ "fnCreatedCell": null,
7651
+
7652
+ /**
7653
+ * Function to get data from a cell in a column. You should <b>never</b>
7654
+ * access data directly through _aData internally in DataTables - always use
7655
+ * the method attached to this property. It allows mData to function as
7656
+ * required. This function is automatically assigned by the column
7657
+ * initialisation method
7658
+ * @type function
7659
+ * @param {array|object} oData The data array/object for the array
7660
+ * (i.e. aoData[]._aData)
7661
+ * @param {string} sSpecific The specific data type you want to get -
7662
+ * 'display', 'type' 'filter' 'sort'
7663
+ * @returns {*} The data for the cell from the given row's data
7664
+ * @default null
7665
+ */
7666
+ "fnGetData": null,
7667
+
7668
+ /**
7669
+ * <code>Deprecated</code> Custom display function that will be called for the
7670
+ * display of each cell in this column.
7671
+ *
7672
+ * Please note that this option has now been deprecated and will be removed
7673
+ * in the next version of DataTables. Please use mRender / mData rather than
7674
+ * fnRender.
7675
+ * @type function
7676
+ * @param {object} o Object with the following parameters:
7677
+ * @param {int} o.iDataRow The row in aoData
7678
+ * @param {int} o.iDataColumn The column in question
7679
+ * @param {array} o.aData The data for the row in question
7680
+ * @param {object} o.oSettings The settings object for this DataTables instance
7681
+ * @returns {string} The string you which to use in the display
7682
+ * @default null
7683
+ * @deprecated
7684
+ */
7685
+ "fnRender": null,
7686
+
7687
+ /**
7688
+ * Function to set data for a cell in the column. You should <b>never</b>
7689
+ * set the data directly to _aData internally in DataTables - always use
7690
+ * this method. It allows mData to function as required. This function
7691
+ * is automatically assigned by the column initialisation method
7692
+ * @type function
7693
+ * @param {array|object} oData The data array/object for the array
7694
+ * (i.e. aoData[]._aData)
7695
+ * @param {*} sValue Value to set
7696
+ * @default null
7697
+ */
7698
+ "fnSetData": null,
7699
+
7700
+ /**
7701
+ * Property to read the value for the cells in the column from the data
7702
+ * source array / object. If null, then the default content is used, if a
7703
+ * function is given then the return from the function is used.
7704
+ * @type function|int|string|null
7705
+ * @default null
7706
+ */
7707
+ "mData": null,
7708
+
7709
+ /**
7710
+ * Partner property to mData which is used (only when defined) to get
7711
+ * the data - i.e. it is basically the same as mData, but without the
7712
+ * 'set' option, and also the data fed to it is the result from mData.
7713
+ * This is the rendering method to match the data method of mData.
7714
+ * @type function|int|string|null
7715
+ * @default null
7716
+ */
7717
+ "mRender": null,
7718
+
7719
+ /**
7720
+ * Unique header TH/TD element for this column - this is what the sorting
7721
+ * listener is attached to (if sorting is enabled.)
7722
+ * @type node
7723
+ * @default null
7724
+ */
7725
+ "nTh": null,
7726
+
7727
+ /**
7728
+ * Unique footer TH/TD element for this column (if there is one). Not used
7729
+ * in DataTables as such, but can be used for plug-ins to reference the
7730
+ * footer for each column.
7731
+ * @type node
7732
+ * @default null
7733
+ */
7734
+ "nTf": null,
7735
+
7736
+ /**
7737
+ * The class to apply to all TD elements in the table's TBODY for the column
7738
+ * @type string
7739
+ * @default null
7740
+ */
7741
+ "sClass": null,
7742
+
7743
+ /**
7744
+ * When DataTables calculates the column widths to assign to each column,
7745
+ * it finds the longest string in each column and then constructs a
7746
+ * temporary table and reads the widths from that. The problem with this
7747
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
7748
+ * string - thus the calculation can go wrong (doing it properly and putting
7749
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
7750
+ * a "work around" we provide this option. It will append its value to the
7751
+ * text that is found to be the longest string for the column - i.e. padding.
7752
+ * @type string
7753
+ */
7754
+ "sContentPadding": null,
7755
+
7756
+ /**
7757
+ * Allows a default value to be given for a column's data, and will be used
7758
+ * whenever a null data source is encountered (this can be because mData
7759
+ * is set to null, or because the data source itself is null).
7760
+ * @type string
7761
+ * @default null
7762
+ */
7763
+ "sDefaultContent": null,
7764
+
7765
+ /**
7766
+ * Name for the column, allowing reference to the column by name as well as
7767
+ * by index (needs a lookup to work by name).
7768
+ * @type string
7769
+ */
7770
+ "sName": null,
7771
+
7772
+ /**
7773
+ * Custom sorting data type - defines which of the available plug-ins in
7774
+ * afnSortData the custom sorting will use - if any is defined.
7775
+ * @type string
7776
+ * @default std
7777
+ */
7778
+ "sSortDataType": 'std',
7779
+
7780
+ /**
7781
+ * Class to be applied to the header element when sorting on this column
7782
+ * @type string
7783
+ * @default null
7784
+ */
7785
+ "sSortingClass": null,
7786
+
7787
+ /**
7788
+ * Class to be applied to the header element when sorting on this column -
7789
+ * when jQuery UI theming is used.
7790
+ * @type string
7791
+ * @default null
7792
+ */
7793
+ "sSortingClassJUI": null,
7794
+
7795
+ /**
7796
+ * Title of the column - what is seen in the TH element (nTh).
7797
+ * @type string
7798
+ */
7799
+ "sTitle": null,
7800
+
7801
+ /**
7802
+ * Column sorting and filtering type
7803
+ * @type string
7804
+ * @default null
7805
+ */
7806
+ "sType": null,
7807
+
7808
+ /**
7809
+ * Width of the column
7810
+ * @type string
7811
+ * @default null
7812
+ */
7813
+ "sWidth": null,
7814
+
7815
+ /**
7816
+ * Width of the column when it was first "encountered"
7817
+ * @type string
7818
+ * @default null
7819
+ */
7820
+ "sWidthOrig": null
7821
+ };
7822
+
7823
+
7824
+
7825
+ /**
7826
+ * Initialisation options that can be given to DataTables at initialisation
7827
+ * time.
7828
+ * @namespace
7829
+ */
7830
+ DataTable.defaults = {
7831
+ /**
7832
+ * An array of data to use for the table, passed in at initialisation which
7833
+ * will be used in preference to any data which is already in the DOM. This is
7834
+ * particularly useful for constructing tables purely in Javascript, for
7835
+ * example with a custom Ajax call.
7836
+ * @type array
7837
+ * @default null
7838
+ * @dtopt Option
7839
+ *
7840
+ * @example
7841
+ * // Using a 2D array data source
7842
+ * $(document).ready( function () {
7843
+ * $('#example').dataTable( {
7844
+ * "aaData": [
7845
+ * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
7846
+ * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
7847
+ * ],
7848
+ * "aoColumns": [
7849
+ * { "sTitle": "Engine" },
7850
+ * { "sTitle": "Browser" },
7851
+ * { "sTitle": "Platform" },
7852
+ * { "sTitle": "Version" },
7853
+ * { "sTitle": "Grade" }
7854
+ * ]
7855
+ * } );
7856
+ * } );
7857
+ *
7858
+ * @example
7859
+ * // Using an array of objects as a data source (mData)
7860
+ * $(document).ready( function () {
7861
+ * $('#example').dataTable( {
7862
+ * "aaData": [
7863
+ * {
7864
+ * "engine": "Trident",
7865
+ * "browser": "Internet Explorer 4.0",
7866
+ * "platform": "Win 95+",
7867
+ * "version": 4,
7868
+ * "grade": "X"
7869
+ * },
7870
+ * {
7871
+ * "engine": "Trident",
7872
+ * "browser": "Internet Explorer 5.0",
7873
+ * "platform": "Win 95+",
7874
+ * "version": 5,
7875
+ * "grade": "C"
7876
+ * }
7877
+ * ],
7878
+ * "aoColumns": [
7879
+ * { "sTitle": "Engine", "mData": "engine" },
7880
+ * { "sTitle": "Browser", "mData": "browser" },
7881
+ * { "sTitle": "Platform", "mData": "platform" },
7882
+ * { "sTitle": "Version", "mData": "version" },
7883
+ * { "sTitle": "Grade", "mData": "grade" }
7884
+ * ]
7885
+ * } );
7886
+ * } );
7887
+ */
7888
+ "aaData": null,
7889
+
7890
+
7891
+ /**
7892
+ * If sorting is enabled, then DataTables will perform a first pass sort on
7893
+ * initialisation. You can define which column(s) the sort is performed upon,
7894
+ * and the sorting direction, with this variable. The aaSorting array should
7895
+ * contain an array for each column to be sorted initially containing the
7896
+ * column's index and a direction string ('asc' or 'desc').
7897
+ * @type array
7898
+ * @default [[0,'asc']]
7899
+ * @dtopt Option
7900
+ *
7901
+ * @example
7902
+ * // Sort by 3rd column first, and then 4th column
7903
+ * $(document).ready( function() {
7904
+ * $('#example').dataTable( {
7905
+ * "aaSorting": [[2,'asc'], [3,'desc']]
7906
+ * } );
7907
+ * } );
7908
+ *
7909
+ * // No initial sorting
7910
+ * $(document).ready( function() {
7911
+ * $('#example').dataTable( {
7912
+ * "aaSorting": []
7913
+ * } );
7914
+ * } );
7915
+ */
7916
+ "aaSorting": [[0,'asc']],
7917
+
7918
+
7919
+ /**
7920
+ * This parameter is basically identical to the aaSorting parameter, but
7921
+ * cannot be overridden by user interaction with the table. What this means
7922
+ * is that you could have a column (visible or hidden) which the sorting will
7923
+ * always be forced on first - any sorting after that (from the user) will
7924
+ * then be performed as required. This can be useful for grouping rows
7925
+ * together.
7926
+ * @type array
7927
+ * @default null
7928
+ * @dtopt Option
7929
+ *
7930
+ * @example
7931
+ * $(document).ready( function() {
7932
+ * $('#example').dataTable( {
7933
+ * "aaSortingFixed": [[0,'asc']]
7934
+ * } );
7935
+ * } )
7936
+ */
7937
+ "aaSortingFixed": null,
7938
+
7939
+
7940
+ /**
7941
+ * This parameter allows you to readily specify the entries in the length drop
7942
+ * down menu that DataTables shows when pagination is enabled. It can be
7943
+ * either a 1D array of options which will be used for both the displayed
7944
+ * option and the value, or a 2D array which will use the array in the first
7945
+ * position as the value, and the array in the second position as the
7946
+ * displayed options (useful for language strings such as 'All').
7947
+ * @type array
7948
+ * @default [ 10, 25, 50, 100 ]
7949
+ * @dtopt Option
7950
+ *
7951
+ * @example
7952
+ * $(document).ready( function() {
7953
+ * $('#example').dataTable( {
7954
+ * "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
7955
+ * } );
7956
+ * } );
7957
+ *
7958
+ * @example
7959
+ * // Setting the default display length as well as length menu
7960
+ * // This is likely to be wanted if you remove the '10' option which
7961
+ * // is the iDisplayLength default.
7962
+ * $(document).ready( function() {
7963
+ * $('#example').dataTable( {
7964
+ * "iDisplayLength": 25,
7965
+ * "aLengthMenu": [[25, 50, 100, -1], [25, 50, 100, "All"]]
7966
+ * } );
7967
+ * } );
7968
+ */
7969
+ "aLengthMenu": [ 10, 25, 50, 100 ],
7970
+
7971
+
7972
+ /**
7973
+ * The aoColumns option in the initialisation parameter allows you to define
7974
+ * details about the way individual columns behave. For a full list of
7975
+ * column options that can be set, please see
7976
+ * {@link DataTable.defaults.columns}. Note that if you use aoColumns to
7977
+ * define your columns, you must have an entry in the array for every single
7978
+ * column that you have in your table (these can be null if you don't which
7979
+ * to specify any options).
7980
+ * @member
7981
+ */
7982
+ "aoColumns": null,
7983
+
7984
+ /**
7985
+ * Very similar to aoColumns, aoColumnDefs allows you to target a specific
7986
+ * column, multiple columns, or all columns, using the aTargets property of
7987
+ * each object in the array. This allows great flexibility when creating
7988
+ * tables, as the aoColumnDefs arrays can be of any length, targeting the
7989
+ * columns you specifically want. aoColumnDefs may use any of the column
7990
+ * options available: {@link DataTable.defaults.columns}, but it _must_
7991
+ * have aTargets defined in each object in the array. Values in the aTargets
7992
+ * array may be:
7993
+ * <ul>
7994
+ * <li>a string - class name will be matched on the TH for the column</li>
7995
+ * <li>0 or a positive integer - column index counting from the left</li>
7996
+ * <li>a negative integer - column index counting from the right</li>
7997
+ * <li>the string "_all" - all columns (i.e. assign a default)</li>
7998
+ * </ul>
7999
+ * @member
8000
+ */
8001
+ "aoColumnDefs": null,
8002
+
8003
+
8004
+ /**
8005
+ * Basically the same as oSearch, this parameter defines the individual column
8006
+ * filtering state at initialisation time. The array must be of the same size
8007
+ * as the number of columns, and each element be an object with the parameters
8008
+ * "sSearch" and "bEscapeRegex" (the latter is optional). 'null' is also
8009
+ * accepted and the default will be used.
8010
+ * @type array
8011
+ * @default []
8012
+ * @dtopt Option
8013
+ *
8014
+ * @example
8015
+ * $(document).ready( function() {
8016
+ * $('#example').dataTable( {
8017
+ * "aoSearchCols": [
8018
+ * null,
8019
+ * { "sSearch": "My filter" },
8020
+ * null,
8021
+ * { "sSearch": "^[0-9]", "bEscapeRegex": false }
8022
+ * ]
8023
+ * } );
8024
+ * } )
8025
+ */
8026
+ "aoSearchCols": [],
8027
+
8028
+
8029
+ /**
8030
+ * An array of CSS classes that should be applied to displayed rows. This
8031
+ * array may be of any length, and DataTables will apply each class
8032
+ * sequentially, looping when required.
8033
+ * @type array
8034
+ * @default null <i>Will take the values determined by the oClasses.sStripe*
8035
+ * options</i>
8036
+ * @dtopt Option
8037
+ *
8038
+ * @example
8039
+ * $(document).ready( function() {
8040
+ * $('#example').dataTable( {
8041
+ * "asStripeClasses": [ 'strip1', 'strip2', 'strip3' ]
8042
+ * } );
8043
+ * } )
8044
+ */
8045
+ "asStripeClasses": null,
8046
+
8047
+
8048
+ /**
8049
+ * Enable or disable automatic column width calculation. This can be disabled
8050
+ * as an optimisation (it takes some time to calculate the widths) if the
8051
+ * tables widths are passed in using aoColumns.
8052
+ * @type boolean
8053
+ * @default true
8054
+ * @dtopt Features
8055
+ *
8056
+ * @example
8057
+ * $(document).ready( function () {
8058
+ * $('#example').dataTable( {
8059
+ * "bAutoWidth": false
8060
+ * } );
8061
+ * } );
8062
+ */
8063
+ "bAutoWidth": true,
8064
+
8065
+
8066
+ /**
8067
+ * Deferred rendering can provide DataTables with a huge speed boost when you
8068
+ * are using an Ajax or JS data source for the table. This option, when set to
8069
+ * true, will cause DataTables to defer the creation of the table elements for
8070
+ * each row until they are needed for a draw - saving a significant amount of
8071
+ * time.
8072
+ * @type boolean
8073
+ * @default false
8074
+ * @dtopt Features
8075
+ *
8076
+ * @example
8077
+ * $(document).ready( function() {
8078
+ * var oTable = $('#example').dataTable( {
8079
+ * "sAjaxSource": "sources/arrays.txt",
8080
+ * "bDeferRender": true
8081
+ * } );
8082
+ * } );
8083
+ */
8084
+ "bDeferRender": false,
8085
+
8086
+
8087
+ /**
8088
+ * Replace a DataTable which matches the given selector and replace it with
8089
+ * one which has the properties of the new initialisation object passed. If no
8090
+ * table matches the selector, then the new DataTable will be constructed as
8091
+ * per normal.
8092
+ * @type boolean
8093
+ * @default false
8094
+ * @dtopt Options
8095
+ *
8096
+ * @example
8097
+ * $(document).ready( function() {
8098
+ * $('#example').dataTable( {
8099
+ * "sScrollY": "200px",
8100
+ * "bPaginate": false
8101
+ * } );
8102
+ *
8103
+ * // Some time later....
8104
+ * $('#example').dataTable( {
8105
+ * "bFilter": false,
8106
+ * "bDestroy": true
8107
+ * } );
8108
+ * } );
8109
+ */
8110
+ "bDestroy": false,
8111
+
8112
+
8113
+ /**
8114
+ * Enable or disable filtering of data. Filtering in DataTables is "smart" in
8115
+ * that it allows the end user to input multiple words (space separated) and
8116
+ * will match a row containing those words, even if not in the order that was
8117
+ * specified (this allow matching across multiple columns). Note that if you
8118
+ * wish to use filtering in DataTables this must remain 'true' - to remove the
8119
+ * default filtering input box and retain filtering abilities, please use
8120
+ * {@link DataTable.defaults.sDom}.
8121
+ * @type boolean
8122
+ * @default true
8123
+ * @dtopt Features
8124
+ *
8125
+ * @example
8126
+ * $(document).ready( function () {
8127
+ * $('#example').dataTable( {
8128
+ * "bFilter": false
8129
+ * } );
8130
+ * } );
8131
+ */
8132
+ "bFilter": true,
8133
+
8134
+
8135
+ /**
8136
+ * Enable or disable the table information display. This shows information
8137
+ * about the data that is currently visible on the page, including information
8138
+ * about filtered data if that action is being performed.
8139
+ * @type boolean
8140
+ * @default true
8141
+ * @dtopt Features
8142
+ *
8143
+ * @example
8144
+ * $(document).ready( function () {
8145
+ * $('#example').dataTable( {
8146
+ * "bInfo": false
8147
+ * } );
8148
+ * } );
8149
+ */
8150
+ "bInfo": true,
8151
+
8152
+
8153
+ /**
8154
+ * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
8155
+ * slightly different and additional mark-up from what DataTables has
8156
+ * traditionally used).
8157
+ * @type boolean
8158
+ * @default false
8159
+ * @dtopt Features
8160
+ *
8161
+ * @example
8162
+ * $(document).ready( function() {
8163
+ * $('#example').dataTable( {
8164
+ * "bJQueryUI": true
8165
+ * } );
8166
+ * } );
8167
+ */
8168
+ "bJQueryUI": false,
8169
+
8170
+
8171
+ /**
8172
+ * Allows the end user to select the size of a formatted page from a select
8173
+ * menu (sizes are 10, 25, 50 and 100). Requires pagination (bPaginate).
8174
+ * @type boolean
8175
+ * @default true
8176
+ * @dtopt Features
8177
+ *
8178
+ * @example
8179
+ * $(document).ready( function () {
8180
+ * $('#example').dataTable( {
8181
+ * "bLengthChange": false
8182
+ * } );
8183
+ * } );
8184
+ */
8185
+ "bLengthChange": true,
8186
+
8187
+
8188
+ /**
8189
+ * Enable or disable pagination.
8190
+ * @type boolean
8191
+ * @default true
8192
+ * @dtopt Features
8193
+ *
8194
+ * @example
8195
+ * $(document).ready( function () {
8196
+ * $('#example').dataTable( {
8197
+ * "bPaginate": false
8198
+ * } );
8199
+ * } );
8200
+ */
8201
+ "bPaginate": true,
8202
+
8203
+
8204
+ /**
8205
+ * Enable or disable the display of a 'processing' indicator when the table is
8206
+ * being processed (e.g. a sort). This is particularly useful for tables with
8207
+ * large amounts of data where it can take a noticeable amount of time to sort
8208
+ * the entries.
8209
+ * @type boolean
8210
+ * @default false
8211
+ * @dtopt Features
8212
+ *
8213
+ * @example
8214
+ * $(document).ready( function () {
8215
+ * $('#example').dataTable( {
8216
+ * "bProcessing": true
8217
+ * } );
8218
+ * } );
8219
+ */
8220
+ "bProcessing": false,
8221
+
8222
+
8223
+ /**
8224
+ * Retrieve the DataTables object for the given selector. Note that if the
8225
+ * table has already been initialised, this parameter will cause DataTables
8226
+ * to simply return the object that has already been set up - it will not take
8227
+ * account of any changes you might have made to the initialisation object
8228
+ * passed to DataTables (setting this parameter to true is an acknowledgement
8229
+ * that you understand this). bDestroy can be used to reinitialise a table if
8230
+ * you need.
8231
+ * @type boolean
8232
+ * @default false
8233
+ * @dtopt Options
8234
+ *
8235
+ * @example
8236
+ * $(document).ready( function() {
8237
+ * initTable();
8238
+ * tableActions();
8239
+ * } );
8240
+ *
8241
+ * function initTable ()
8242
+ * {
8243
+ * return $('#example').dataTable( {
8244
+ * "sScrollY": "200px",
8245
+ * "bPaginate": false,
8246
+ * "bRetrieve": true
8247
+ * } );
8248
+ * }
8249
+ *
8250
+ * function tableActions ()
8251
+ * {
8252
+ * var oTable = initTable();
8253
+ * // perform API operations with oTable
8254
+ * }
8255
+ */
8256
+ "bRetrieve": false,
8257
+
8258
+
8259
+ /**
8260
+ * Indicate if DataTables should be allowed to set the padding / margin
8261
+ * etc for the scrolling header elements or not. Typically you will want
8262
+ * this.
8263
+ * @type boolean
8264
+ * @default true
8265
+ * @dtopt Options
8266
+ *
8267
+ * @example
8268
+ * $(document).ready( function() {
8269
+ * $('#example').dataTable( {
8270
+ * "bScrollAutoCss": false,
8271
+ * "sScrollY": "200px"
8272
+ * } );
8273
+ * } );
8274
+ */
8275
+ "bScrollAutoCss": true,
8276
+
8277
+
8278
+ /**
8279
+ * When vertical (y) scrolling is enabled, DataTables will force the height of
8280
+ * the table's viewport to the given height at all times (useful for layout).
8281
+ * However, this can look odd when filtering data down to a small data set,
8282
+ * and the footer is left "floating" further down. This parameter (when
8283
+ * enabled) will cause DataTables to collapse the table's viewport down when
8284
+ * the result set will fit within the given Y height.
8285
+ * @type boolean
8286
+ * @default false
8287
+ * @dtopt Options
8288
+ *
8289
+ * @example
8290
+ * $(document).ready( function() {
8291
+ * $('#example').dataTable( {
8292
+ * "sScrollY": "200",
8293
+ * "bScrollCollapse": true
8294
+ * } );
8295
+ * } );
8296
+ */
8297
+ "bScrollCollapse": false,
8298
+
8299
+
8300
+ /**
8301
+ * Enable infinite scrolling for DataTables (to be used in combination with
8302
+ * sScrollY). Infinite scrolling means that DataTables will continually load
8303
+ * data as a user scrolls through a table, which is very useful for large
8304
+ * dataset. This cannot be used with pagination, which is automatically
8305
+ * disabled. Note - the Scroller extra for DataTables is recommended in
8306
+ * in preference to this option.
8307
+ * @type boolean
8308
+ * @default false
8309
+ * @dtopt Features
8310
+ *
8311
+ * @example
8312
+ * $(document).ready( function() {
8313
+ * $('#example').dataTable( {
8314
+ * "bScrollInfinite": true,
8315
+ * "bScrollCollapse": true,
8316
+ * "sScrollY": "200px"
8317
+ * } );
8318
+ * } );
8319
+ */
8320
+ "bScrollInfinite": false,
8321
+
8322
+
8323
+ /**
8324
+ * Configure DataTables to use server-side processing. Note that the
8325
+ * sAjaxSource parameter must also be given in order to give DataTables a
8326
+ * source to obtain the required data for each draw.
8327
+ * @type boolean
8328
+ * @default false
8329
+ * @dtopt Features
8330
+ * @dtopt Server-side
8331
+ *
8332
+ * @example
8333
+ * $(document).ready( function () {
8334
+ * $('#example').dataTable( {
8335
+ * "bServerSide": true,
8336
+ * "sAjaxSource": "xhr.php"
8337
+ * } );
8338
+ * } );
8339
+ */
8340
+ "bServerSide": false,
8341
+
8342
+
8343
+ /**
8344
+ * Enable or disable sorting of columns. Sorting of individual columns can be
8345
+ * disabled by the "bSortable" option for each column.
8346
+ * @type boolean
8347
+ * @default true
8348
+ * @dtopt Features
8349
+ *
8350
+ * @example
8351
+ * $(document).ready( function () {
8352
+ * $('#example').dataTable( {
8353
+ * "bSort": false
8354
+ * } );
8355
+ * } );
8356
+ */
8357
+ "bSort": true,
8358
+
8359
+
8360
+ /**
8361
+ * Allows control over whether DataTables should use the top (true) unique
8362
+ * cell that is found for a single column, or the bottom (false - default).
8363
+ * This is useful when using complex headers.
8364
+ * @type boolean
8365
+ * @default false
8366
+ * @dtopt Options
8367
+ *
8368
+ * @example
8369
+ * $(document).ready( function() {
8370
+ * $('#example').dataTable( {
8371
+ * "bSortCellsTop": true
8372
+ * } );
8373
+ * } );
8374
+ */
8375
+ "bSortCellsTop": false,
8376
+
8377
+
8378
+ /**
8379
+ * Enable or disable the addition of the classes 'sorting_1', 'sorting_2' and
8380
+ * 'sorting_3' to the columns which are currently being sorted on. This is
8381
+ * presented as a feature switch as it can increase processing time (while
8382
+ * classes are removed and added) so for large data sets you might want to
8383
+ * turn this off.
8384
+ * @type boolean
8385
+ * @default true
8386
+ * @dtopt Features
8387
+ *
8388
+ * @example
8389
+ * $(document).ready( function () {
8390
+ * $('#example').dataTable( {
8391
+ * "bSortClasses": false
8392
+ * } );
8393
+ * } );
8394
+ */
8395
+ "bSortClasses": true,
8396
+
8397
+
8398
+ /**
8399
+ * Enable or disable state saving. When enabled a cookie will be used to save
8400
+ * table display information such as pagination information, display length,
8401
+ * filtering and sorting. As such when the end user reloads the page the
8402
+ * display display will match what thy had previously set up.
8403
+ * @type boolean
8404
+ * @default false
8405
+ * @dtopt Features
8406
+ *
8407
+ * @example
8408
+ * $(document).ready( function () {
8409
+ * $('#example').dataTable( {
8410
+ * "bStateSave": true
8411
+ * } );
8412
+ * } );
8413
+ */
8414
+ "bStateSave": false,
8415
+
8416
+
8417
+ /**
8418
+ * Customise the cookie and / or the parameters being stored when using
8419
+ * DataTables with state saving enabled. This function is called whenever
8420
+ * the cookie is modified, and it expects a fully formed cookie string to be
8421
+ * returned. Note that the data object passed in is a Javascript object which
8422
+ * must be converted to a string (JSON.stringify for example).
8423
+ * @type function
8424
+ * @param {string} sName Name of the cookie defined by DataTables
8425
+ * @param {object} oData Data to be stored in the cookie
8426
+ * @param {string} sExpires Cookie expires string
8427
+ * @param {string} sPath Path of the cookie to set
8428
+ * @returns {string} Cookie formatted string (which should be encoded by
8429
+ * using encodeURIComponent())
8430
+ * @dtopt Callbacks
8431
+ *
8432
+ * @example
8433
+ * $(document).ready( function () {
8434
+ * $('#example').dataTable( {
8435
+ * "fnCookieCallback": function (sName, oData, sExpires, sPath) {
8436
+ * // Customise oData or sName or whatever else here
8437
+ * return sName + "="+JSON.stringify(oData)+"; expires=" + sExpires +"; path=" + sPath;
8438
+ * }
8439
+ * } );
8440
+ * } );
8441
+ */
8442
+ "fnCookieCallback": null,
8443
+
8444
+
8445
+ /**
8446
+ * This function is called when a TR element is created (and all TD child
8447
+ * elements have been inserted), or registered if using a DOM source, allowing
8448
+ * manipulation of the TR element (adding classes etc).
8449
+ * @type function
8450
+ * @param {node} nRow "TR" element for the current row
8451
+ * @param {array} aData Raw data array for this row
8452
+ * @param {int} iDataIndex The index of this row in aoData
8453
+ * @dtopt Callbacks
8454
+ *
8455
+ * @example
8456
+ * $(document).ready( function() {
8457
+ * $('#example').dataTable( {
8458
+ * "fnCreatedRow": function( nRow, aData, iDataIndex ) {
8459
+ * // Bold the grade for all 'A' grade browsers
8460
+ * if ( aData[4] == "A" )
8461
+ * {
8462
+ * $('td:eq(4)', nRow).html( '<b>A</b>' );
8463
+ * }
8464
+ * }
8465
+ * } );
8466
+ * } );
8467
+ */
8468
+ "fnCreatedRow": null,
8469
+
8470
+
8471
+ /**
8472
+ * This function is called on every 'draw' event, and allows you to
8473
+ * dynamically modify any aspect you want about the created DOM.
8474
+ * @type function
8475
+ * @param {object} oSettings DataTables settings object
8476
+ * @dtopt Callbacks
8477
+ *
8478
+ * @example
8479
+ * $(document).ready( function() {
8480
+ * $('#example').dataTable( {
8481
+ * "fnDrawCallback": function( oSettings ) {
8482
+ * alert( 'DataTables has redrawn the table' );
8483
+ * }
8484
+ * } );
8485
+ * } );
8486
+ */
8487
+ "fnDrawCallback": null,
8488
+
8489
+
8490
+ /**
8491
+ * Identical to fnHeaderCallback() but for the table footer this function
8492
+ * allows you to modify the table footer on every 'draw' even.
8493
+ * @type function
8494
+ * @param {node} nFoot "TR" element for the footer
8495
+ * @param {array} aData Full table data (as derived from the original HTML)
8496
+ * @param {int} iStart Index for the current display starting point in the
8497
+ * display array
8498
+ * @param {int} iEnd Index for the current display ending point in the
8499
+ * display array
8500
+ * @param {array int} aiDisplay Index array to translate the visual position
8501
+ * to the full data array
8502
+ * @dtopt Callbacks
8503
+ *
8504
+ * @example
8505
+ * $(document).ready( function() {
8506
+ * $('#example').dataTable( {
8507
+ * "fnFooterCallback": function( nFoot, aData, iStart, iEnd, aiDisplay ) {
8508
+ * nFoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+iStart;
8509
+ * }
8510
+ * } );
8511
+ * } )
8512
+ */
8513
+ "fnFooterCallback": null,
8514
+
8515
+
8516
+ /**
8517
+ * When rendering large numbers in the information element for the table
8518
+ * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
8519
+ * to have a comma separator for the 'thousands' units (e.g. 1 million is
8520
+ * rendered as "1,000,000") to help readability for the end user. This
8521
+ * function will override the default method DataTables uses.
8522
+ * @type function
8523
+ * @member
8524
+ * @param {int} iIn number to be formatted
8525
+ * @returns {string} formatted string for DataTables to show the number
8526
+ * @dtopt Callbacks
8527
+ *
8528
+ * @example
8529
+ * $(document).ready( function() {
8530
+ * $('#example').dataTable( {
8531
+ * "fnFormatNumber": function ( iIn ) {
8532
+ * if ( iIn &lt; 1000 ) {
8533
+ * return iIn;
8534
+ * } else {
8535
+ * var
8536
+ * s=(iIn+""),
8537
+ * a=s.split(""), out="",
8538
+ * iLen=s.length;
8539
+ *
8540
+ * for ( var i=0 ; i&lt;iLen ; i++ ) {
8541
+ * if ( i%3 === 0 &amp;&amp; i !== 0 ) {
8542
+ * out = "'"+out;
8543
+ * }
8544
+ * out = a[iLen-i-1]+out;
8545
+ * }
8546
+ * }
8547
+ * return out;
8548
+ * };
8549
+ * } );
8550
+ * } );
8551
+ */
8552
+ "fnFormatNumber": function ( iIn ) {
8553
+ if ( iIn < 1000 )
8554
+ {
8555
+ // A small optimisation for what is likely to be the majority of use cases
8556
+ return iIn;
8557
+ }
8558
+
8559
+ var s=(iIn+""), a=s.split(""), out="", iLen=s.length;
8560
+
8561
+ for ( var i=0 ; i<iLen ; i++ )
8562
+ {
8563
+ if ( i%3 === 0 && i !== 0 )
8564
+ {
8565
+ out = this.oLanguage.sInfoThousands+out;
8566
+ }
8567
+ out = a[iLen-i-1]+out;
8568
+ }
8569
+ return out;
8570
+ },
8571
+
8572
+
8573
+ /**
8574
+ * This function is called on every 'draw' event, and allows you to
8575
+ * dynamically modify the header row. This can be used to calculate and
8576
+ * display useful information about the table.
8577
+ * @type function
8578
+ * @param {node} nHead "TR" element for the header
8579
+ * @param {array} aData Full table data (as derived from the original HTML)
8580
+ * @param {int} iStart Index for the current display starting point in the
8581
+ * display array
8582
+ * @param {int} iEnd Index for the current display ending point in the
8583
+ * display array
8584
+ * @param {array int} aiDisplay Index array to translate the visual position
8585
+ * to the full data array
8586
+ * @dtopt Callbacks
8587
+ *
8588
+ * @example
8589
+ * $(document).ready( function() {
8590
+ * $('#example').dataTable( {
8591
+ * "fnHeaderCallback": function( nHead, aData, iStart, iEnd, aiDisplay ) {
8592
+ * nHead.getElementsByTagName('th')[0].innerHTML = "Displaying "+(iEnd-iStart)+" records";
8593
+ * }
8594
+ * } );
8595
+ * } )
8596
+ */
8597
+ "fnHeaderCallback": null,
8598
+
8599
+
8600
+ /**
8601
+ * The information element can be used to convey information about the current
8602
+ * state of the table. Although the internationalisation options presented by
8603
+ * DataTables are quite capable of dealing with most customisations, there may
8604
+ * be times where you wish to customise the string further. This callback
8605
+ * allows you to do exactly that.
8606
+ * @type function
8607
+ * @param {object} oSettings DataTables settings object
8608
+ * @param {int} iStart Starting position in data for the draw
8609
+ * @param {int} iEnd End position in data for the draw
8610
+ * @param {int} iMax Total number of rows in the table (regardless of
8611
+ * filtering)
8612
+ * @param {int} iTotal Total number of rows in the data set, after filtering
8613
+ * @param {string} sPre The string that DataTables has formatted using it's
8614
+ * own rules
8615
+ * @returns {string} The string to be displayed in the information element.
8616
+ * @dtopt Callbacks
8617
+ *
8618
+ * @example
8619
+ * $('#example').dataTable( {
8620
+ * "fnInfoCallback": function( oSettings, iStart, iEnd, iMax, iTotal, sPre ) {
8621
+ * return iStart +" to "+ iEnd;
8622
+ * }
8623
+ * } );
8624
+ */
8625
+ "fnInfoCallback": null,
8626
+
8627
+
8628
+ /**
8629
+ * Called when the table has been initialised. Normally DataTables will
8630
+ * initialise sequentially and there will be no need for this function,
8631
+ * however, this does not hold true when using external language information
8632
+ * since that is obtained using an async XHR call.
8633
+ * @type function
8634
+ * @param {object} oSettings DataTables settings object
8635
+ * @param {object} json The JSON object request from the server - only
8636
+ * present if client-side Ajax sourced data is used
8637
+ * @dtopt Callbacks
8638
+ *
8639
+ * @example
8640
+ * $(document).ready( function() {
8641
+ * $('#example').dataTable( {
8642
+ * "fnInitComplete": function(oSettings, json) {
8643
+ * alert( 'DataTables has finished its initialisation.' );
8644
+ * }
8645
+ * } );
8646
+ * } )
8647
+ */
8648
+ "fnInitComplete": null,
8649
+
8650
+
8651
+ /**
8652
+ * Called at the very start of each table draw and can be used to cancel the
8653
+ * draw by returning false, any other return (including undefined) results in
8654
+ * the full draw occurring).
8655
+ * @type function
8656
+ * @param {object} oSettings DataTables settings object
8657
+ * @returns {boolean} False will cancel the draw, anything else (including no
8658
+ * return) will allow it to complete.
8659
+ * @dtopt Callbacks
8660
+ *
8661
+ * @example
8662
+ * $(document).ready( function() {
8663
+ * $('#example').dataTable( {
8664
+ * "fnPreDrawCallback": function( oSettings ) {
8665
+ * if ( $('#test').val() == 1 ) {
8666
+ * return false;
8667
+ * }
8668
+ * }
8669
+ * } );
8670
+ * } );
8671
+ */
8672
+ "fnPreDrawCallback": null,
8673
+
8674
+
8675
+ /**
8676
+ * This function allows you to 'post process' each row after it have been
8677
+ * generated for each table draw, but before it is rendered on screen. This
8678
+ * function might be used for setting the row class name etc.
8679
+ * @type function
8680
+ * @param {node} nRow "TR" element for the current row
8681
+ * @param {array} aData Raw data array for this row
8682
+ * @param {int} iDisplayIndex The display index for the current table draw
8683
+ * @param {int} iDisplayIndexFull The index of the data in the full list of
8684
+ * rows (after filtering)
8685
+ * @dtopt Callbacks
8686
+ *
8687
+ * @example
8688
+ * $(document).ready( function() {
8689
+ * $('#example').dataTable( {
8690
+ * "fnRowCallback": function( nRow, aData, iDisplayIndex, iDisplayIndexFull ) {
8691
+ * // Bold the grade for all 'A' grade browsers
8692
+ * if ( aData[4] == "A" )
8693
+ * {
8694
+ * $('td:eq(4)', nRow).html( '<b>A</b>' );
8695
+ * }
8696
+ * }
8697
+ * } );
8698
+ * } );
8699
+ */
8700
+ "fnRowCallback": null,
8701
+
8702
+
8703
+ /**
8704
+ * This parameter allows you to override the default function which obtains
8705
+ * the data from the server ($.getJSON) so something more suitable for your
8706
+ * application. For example you could use POST data, or pull information from
8707
+ * a Gears or AIR database.
8708
+ * @type function
8709
+ * @member
8710
+ * @param {string} sSource HTTP source to obtain the data from (sAjaxSource)
8711
+ * @param {array} aoData A key/value pair object containing the data to send
8712
+ * to the server
8713
+ * @param {function} fnCallback to be called on completion of the data get
8714
+ * process that will draw the data on the page.
8715
+ * @param {object} oSettings DataTables settings object
8716
+ * @dtopt Callbacks
8717
+ * @dtopt Server-side
8718
+ *
8719
+ * @example
8720
+ * // POST data to server
8721
+ * $(document).ready( function() {
8722
+ * $('#example').dataTable( {
8723
+ * "bProcessing": true,
8724
+ * "bServerSide": true,
8725
+ * "sAjaxSource": "xhr.php",
8726
+ * "fnServerData": function ( sSource, aoData, fnCallback, oSettings ) {
8727
+ * oSettings.jqXHR = $.ajax( {
8728
+ * "dataType": 'json',
8729
+ * "type": "POST",
8730
+ * "url": sSource,
8731
+ * "data": aoData,
8732
+ * "success": fnCallback
8733
+ * } );
8734
+ * }
8735
+ * } );
8736
+ * } );
8737
+ */
8738
+ "fnServerData": function ( sUrl, aoData, fnCallback, oSettings ) {
8739
+ oSettings.jqXHR = $.ajax( {
8740
+ "url": sUrl,
8741
+ "data": aoData,
8742
+ "success": function (json) {
8743
+ if ( json.sError ) {
8744
+ oSettings.oApi._fnLog( oSettings, 0, json.sError );
8745
+ }
8746
+
8747
+ $(oSettings.oInstance).trigger('xhr', [oSettings, json]);
8748
+ fnCallback( json );
8749
+ },
8750
+ "dataType": "json",
8751
+ "cache": false,
8752
+ "type": oSettings.sServerMethod,
8753
+ "error": function (xhr, error, thrown) {
8754
+ if ( error == "parsererror" ) {
8755
+ oSettings.oApi._fnLog( oSettings, 0, "DataTables warning: JSON data from "+
8756
+ "server could not be parsed. This is caused by a JSON formatting error." );
8757
+ }
8758
+ }
8759
+ } );
8760
+ },
8761
+
8762
+
8763
+ /**
8764
+ * It is often useful to send extra data to the server when making an Ajax
8765
+ * request - for example custom filtering information, and this callback
8766
+ * function makes it trivial to send extra information to the server. The
8767
+ * passed in parameter is the data set that has been constructed by
8768
+ * DataTables, and you can add to this or modify it as you require.
8769
+ * @type function
8770
+ * @param {array} aoData Data array (array of objects which are name/value
8771
+ * pairs) that has been constructed by DataTables and will be sent to the
8772
+ * server. In the case of Ajax sourced data with server-side processing
8773
+ * this will be an empty array, for server-side processing there will be a
8774
+ * significant number of parameters!
8775
+ * @returns {undefined} Ensure that you modify the aoData array passed in,
8776
+ * as this is passed by reference.
8777
+ * @dtopt Callbacks
8778
+ * @dtopt Server-side
8779
+ *
8780
+ * @example
8781
+ * $(document).ready( function() {
8782
+ * $('#example').dataTable( {
8783
+ * "bProcessing": true,
8784
+ * "bServerSide": true,
8785
+ * "sAjaxSource": "scripts/server_processing.php",
8786
+ * "fnServerParams": function ( aoData ) {
8787
+ * aoData.push( { "name": "more_data", "value": "my_value" } );
8788
+ * }
8789
+ * } );
8790
+ * } );
8791
+ */
8792
+ "fnServerParams": null,
8793
+
8794
+
8795
+ /**
8796
+ * Load the table state. With this function you can define from where, and how, the
8797
+ * state of a table is loaded. By default DataTables will load from its state saving
8798
+ * cookie, but you might wish to use local storage (HTML5) or a server-side database.
8799
+ * @type function
8800
+ * @member
8801
+ * @param {object} oSettings DataTables settings object
8802
+ * @return {object} The DataTables state object to be loaded
8803
+ * @dtopt Callbacks
8804
+ *
8805
+ * @example
8806
+ * $(document).ready( function() {
8807
+ * $('#example').dataTable( {
8808
+ * "bStateSave": true,
8809
+ * "fnStateLoad": function (oSettings) {
8810
+ * var o;
8811
+ *
8812
+ * // Send an Ajax request to the server to get the data. Note that
8813
+ * // this is a synchronous request.
8814
+ * $.ajax( {
8815
+ * "url": "/state_load",
8816
+ * "async": false,
8817
+ * "dataType": "json",
8818
+ * "success": function (json) {
8819
+ * o = json;
8820
+ * }
8821
+ * } );
8822
+ *
8823
+ * return o;
8824
+ * }
8825
+ * } );
8826
+ * } );
8827
+ */
8828
+ "fnStateLoad": function ( oSettings ) {
8829
+ var sData = this.oApi._fnReadCookie( oSettings.sCookiePrefix+oSettings.sInstance );
8830
+ var oData;
8831
+
8832
+ try {
8833
+ oData = (typeof $.parseJSON === 'function') ?
8834
+ $.parseJSON(sData) : eval( '('+sData+')' );
8835
+ } catch (e) {
8836
+ oData = null;
8837
+ }
8838
+
8839
+ return oData;
8840
+ },
8841
+
8842
+
8843
+ /**
8844
+ * Callback which allows modification of the saved state prior to loading that state.
8845
+ * This callback is called when the table is loading state from the stored data, but
8846
+ * prior to the settings object being modified by the saved state. Note that for
8847
+ * plug-in authors, you should use the 'stateLoadParams' event to load parameters for
8848
+ * a plug-in.
8849
+ * @type function
8850
+ * @param {object} oSettings DataTables settings object
8851
+ * @param {object} oData The state object that is to be loaded
8852
+ * @dtopt Callbacks
8853
+ *
8854
+ * @example
8855
+ * // Remove a saved filter, so filtering is never loaded
8856
+ * $(document).ready( function() {
8857
+ * $('#example').dataTable( {
8858
+ * "bStateSave": true,
8859
+ * "fnStateLoadParams": function (oSettings, oData) {
8860
+ * oData.oSearch.sSearch = "";
8861
+ * }
8862
+ * } );
8863
+ * } );
8864
+ *
8865
+ * @example
8866
+ * // Disallow state loading by returning false
8867
+ * $(document).ready( function() {
8868
+ * $('#example').dataTable( {
8869
+ * "bStateSave": true,
8870
+ * "fnStateLoadParams": function (oSettings, oData) {
8871
+ * return false;
8872
+ * }
8873
+ * } );
8874
+ * } );
8875
+ */
8876
+ "fnStateLoadParams": null,
8877
+
8878
+
8879
+ /**
8880
+ * Callback that is called when the state has been loaded from the state saving method
8881
+ * and the DataTables settings object has been modified as a result of the loaded state.
8882
+ * @type function
8883
+ * @param {object} oSettings DataTables settings object
8884
+ * @param {object} oData The state object that was loaded
8885
+ * @dtopt Callbacks
8886
+ *
8887
+ * @example
8888
+ * // Show an alert with the filtering value that was saved
8889
+ * $(document).ready( function() {
8890
+ * $('#example').dataTable( {
8891
+ * "bStateSave": true,
8892
+ * "fnStateLoaded": function (oSettings, oData) {
8893
+ * alert( 'Saved filter was: '+oData.oSearch.sSearch );
8894
+ * }
8895
+ * } );
8896
+ * } );
8897
+ */
8898
+ "fnStateLoaded": null,
8899
+
8900
+
8901
+ /**
8902
+ * Save the table state. This function allows you to define where and how the state
8903
+ * information for the table is stored - by default it will use a cookie, but you
8904
+ * might want to use local storage (HTML5) or a server-side database.
8905
+ * @type function
8906
+ * @member
8907
+ * @param {object} oSettings DataTables settings object
8908
+ * @param {object} oData The state object to be saved
8909
+ * @dtopt Callbacks
8910
+ *
8911
+ * @example
8912
+ * $(document).ready( function() {
8913
+ * $('#example').dataTable( {
8914
+ * "bStateSave": true,
8915
+ * "fnStateSave": function (oSettings, oData) {
8916
+ * // Send an Ajax request to the server with the state object
8917
+ * $.ajax( {
8918
+ * "url": "/state_save",
8919
+ * "data": oData,
8920
+ * "dataType": "json",
8921
+ * "method": "POST"
8922
+ * "success": function () {}
8923
+ * } );
8924
+ * }
8925
+ * } );
8926
+ * } );
8927
+ */
8928
+ "fnStateSave": function ( oSettings, oData ) {
8929
+ this.oApi._fnCreateCookie(
8930
+ oSettings.sCookiePrefix+oSettings.sInstance,
8931
+ this.oApi._fnJsonString(oData),
8932
+ oSettings.iCookieDuration,
8933
+ oSettings.sCookiePrefix,
8934
+ oSettings.fnCookieCallback
8935
+ );
8936
+ },
8937
+
8938
+
8939
+ /**
8940
+ * Callback which allows modification of the state to be saved. Called when the table
8941
+ * has changed state a new state save is required. This method allows modification of
8942
+ * the state saving object prior to actually doing the save, including addition or
8943
+ * other state properties or modification. Note that for plug-in authors, you should
8944
+ * use the 'stateSaveParams' event to save parameters for a plug-in.
8945
+ * @type function
8946
+ * @param {object} oSettings DataTables settings object
8947
+ * @param {object} oData The state object to be saved
8948
+ * @dtopt Callbacks
8949
+ *
8950
+ * @example
8951
+ * // Remove a saved filter, so filtering is never saved
8952
+ * $(document).ready( function() {
8953
+ * $('#example').dataTable( {
8954
+ * "bStateSave": true,
8955
+ * "fnStateSaveParams": function (oSettings, oData) {
8956
+ * oData.oSearch.sSearch = "";
8957
+ * }
8958
+ * } );
8959
+ * } );
8960
+ */
8961
+ "fnStateSaveParams": null,
8962
+
8963
+
8964
+ /**
8965
+ * Duration of the cookie which is used for storing session information. This
8966
+ * value is given in seconds.
8967
+ * @type int
8968
+ * @default 7200 <i>(2 hours)</i>
8969
+ * @dtopt Options
8970
+ *
8971
+ * @example
8972
+ * $(document).ready( function() {
8973
+ * $('#example').dataTable( {
8974
+ * "iCookieDuration": 60*60*24; // 1 day
8975
+ * } );
8976
+ * } )
8977
+ */
8978
+ "iCookieDuration": 7200,
8979
+
8980
+
8981
+ /**
8982
+ * When enabled DataTables will not make a request to the server for the first
8983
+ * page draw - rather it will use the data already on the page (no sorting etc
8984
+ * will be applied to it), thus saving on an XHR at load time. iDeferLoading
8985
+ * is used to indicate that deferred loading is required, but it is also used
8986
+ * to tell DataTables how many records there are in the full table (allowing
8987
+ * the information element and pagination to be displayed correctly). In the case
8988
+ * where a filtering is applied to the table on initial load, this can be
8989
+ * indicated by giving the parameter as an array, where the first element is
8990
+ * the number of records available after filtering and the second element is the
8991
+ * number of records without filtering (allowing the table information element
8992
+ * to be shown correctly).
8993
+ * @type int | array
8994
+ * @default null
8995
+ * @dtopt Options
8996
+ *
8997
+ * @example
8998
+ * // 57 records available in the table, no filtering applied
8999
+ * $(document).ready( function() {
9000
+ * $('#example').dataTable( {
9001
+ * "bServerSide": true,
9002
+ * "sAjaxSource": "scripts/server_processing.php",
9003
+ * "iDeferLoading": 57
9004
+ * } );
9005
+ * } );
9006
+ *
9007
+ * @example
9008
+ * // 57 records after filtering, 100 without filtering (an initial filter applied)
9009
+ * $(document).ready( function() {
9010
+ * $('#example').dataTable( {
9011
+ * "bServerSide": true,
9012
+ * "sAjaxSource": "scripts/server_processing.php",
9013
+ * "iDeferLoading": [ 57, 100 ],
9014
+ * "oSearch": {
9015
+ * "sSearch": "my_filter"
9016
+ * }
9017
+ * } );
9018
+ * } );
9019
+ */
9020
+ "iDeferLoading": null,
9021
+
9022
+
9023
+ /**
9024
+ * Number of rows to display on a single page when using pagination. If
9025
+ * feature enabled (bLengthChange) then the end user will be able to override
9026
+ * this to a custom setting using a pop-up menu.
9027
+ * @type int
9028
+ * @default 10
9029
+ * @dtopt Options
9030
+ *
9031
+ * @example
9032
+ * $(document).ready( function() {
9033
+ * $('#example').dataTable( {
9034
+ * "iDisplayLength": 50
9035
+ * } );
9036
+ * } )
9037
+ */
9038
+ "iDisplayLength": 10,
9039
+
9040
+
9041
+ /**
9042
+ * Define the starting point for data display when using DataTables with
9043
+ * pagination. Note that this parameter is the number of records, rather than
9044
+ * the page number, so if you have 10 records per page and want to start on
9045
+ * the third page, it should be "20".
9046
+ * @type int
9047
+ * @default 0
9048
+ * @dtopt Options
9049
+ *
9050
+ * @example
9051
+ * $(document).ready( function() {
9052
+ * $('#example').dataTable( {
9053
+ * "iDisplayStart": 20
9054
+ * } );
9055
+ * } )
9056
+ */
9057
+ "iDisplayStart": 0,
9058
+
9059
+
9060
+ /**
9061
+ * The scroll gap is the amount of scrolling that is left to go before
9062
+ * DataTables will load the next 'page' of data automatically. You typically
9063
+ * want a gap which is big enough that the scrolling will be smooth for the
9064
+ * user, while not so large that it will load more data than need.
9065
+ * @type int
9066
+ * @default 100
9067
+ * @dtopt Options
9068
+ *
9069
+ * @example
9070
+ * $(document).ready( function() {
9071
+ * $('#example').dataTable( {
9072
+ * "bScrollInfinite": true,
9073
+ * "bScrollCollapse": true,
9074
+ * "sScrollY": "200px",
9075
+ * "iScrollLoadGap": 50
9076
+ * } );
9077
+ * } );
9078
+ */
9079
+ "iScrollLoadGap": 100,
9080
+
9081
+
9082
+ /**
9083
+ * By default DataTables allows keyboard navigation of the table (sorting, paging,
9084
+ * and filtering) by adding a tabindex attribute to the required elements. This
9085
+ * allows you to tab through the controls and press the enter key to activate them.
9086
+ * The tabindex is default 0, meaning that the tab follows the flow of the document.
9087
+ * You can overrule this using this parameter if you wish. Use a value of -1 to
9088
+ * disable built-in keyboard navigation.
9089
+ * @type int
9090
+ * @default 0
9091
+ * @dtopt Options
9092
+ *
9093
+ * @example
9094
+ * $(document).ready( function() {
9095
+ * $('#example').dataTable( {
9096
+ * "iTabIndex": 1
9097
+ * } );
9098
+ * } );
9099
+ */
9100
+ "iTabIndex": 0,
9101
+
9102
+
9103
+ /**
9104
+ * All strings that DataTables uses in the user interface that it creates
9105
+ * are defined in this object, allowing you to modified them individually or
9106
+ * completely replace them all as required.
9107
+ * @namespace
9108
+ */
9109
+ "oLanguage": {
9110
+ /**
9111
+ * Strings that are used for WAI-ARIA labels and controls only (these are not
9112
+ * actually visible on the page, but will be read by screenreaders, and thus
9113
+ * must be internationalised as well).
9114
+ * @namespace
9115
+ */
9116
+ "oAria": {
9117
+ /**
9118
+ * ARIA label that is added to the table headers when the column may be
9119
+ * sorted ascending by activing the column (click or return when focused).
9120
+ * Note that the column header is prefixed to this string.
9121
+ * @type string
9122
+ * @default : activate to sort column ascending
9123
+ * @dtopt Language
9124
+ *
9125
+ * @example
9126
+ * $(document).ready( function() {
9127
+ * $('#example').dataTable( {
9128
+ * "oLanguage": {
9129
+ * "oAria": {
9130
+ * "sSortAscending": " - click/return to sort ascending"
9131
+ * }
9132
+ * }
9133
+ * } );
9134
+ * } );
9135
+ */
9136
+ "sSortAscending": ": activate to sort column ascending",
9137
+
9138
+ /**
9139
+ * ARIA label that is added to the table headers when the column may be
9140
+ * sorted descending by activing the column (click or return when focused).
9141
+ * Note that the column header is prefixed to this string.
9142
+ * @type string
9143
+ * @default : activate to sort column ascending
9144
+ * @dtopt Language
9145
+ *
9146
+ * @example
9147
+ * $(document).ready( function() {
9148
+ * $('#example').dataTable( {
9149
+ * "oLanguage": {
9150
+ * "oAria": {
9151
+ * "sSortDescending": " - click/return to sort descending"
9152
+ * }
9153
+ * }
9154
+ * } );
9155
+ * } );
9156
+ */
9157
+ "sSortDescending": ": activate to sort column descending"
9158
+ },
9159
+
9160
+ /**
9161
+ * Pagination string used by DataTables for the two built-in pagination
9162
+ * control types ("two_button" and "full_numbers")
9163
+ * @namespace
9164
+ */
9165
+ "oPaginate": {
9166
+ /**
9167
+ * Text to use when using the 'full_numbers' type of pagination for the
9168
+ * button to take the user to the first page.
9169
+ * @type string
9170
+ * @default First
9171
+ * @dtopt Language
9172
+ *
9173
+ * @example
9174
+ * $(document).ready( function() {
9175
+ * $('#example').dataTable( {
9176
+ * "oLanguage": {
9177
+ * "oPaginate": {
9178
+ * "sFirst": "First page"
9179
+ * }
9180
+ * }
9181
+ * } );
9182
+ * } );
9183
+ */
9184
+ "sFirst": "First",
9185
+
9186
+
9187
+ /**
9188
+ * Text to use when using the 'full_numbers' type of pagination for the
9189
+ * button to take the user to the last page.
9190
+ * @type string
9191
+ * @default Last
9192
+ * @dtopt Language
9193
+ *
9194
+ * @example
9195
+ * $(document).ready( function() {
9196
+ * $('#example').dataTable( {
9197
+ * "oLanguage": {
9198
+ * "oPaginate": {
9199
+ * "sLast": "Last page"
9200
+ * }
9201
+ * }
9202
+ * } );
9203
+ * } );
9204
+ */
9205
+ "sLast": "Last",
9206
+
9207
+
9208
+ /**
9209
+ * Text to use for the 'next' pagination button (to take the user to the
9210
+ * next page).
9211
+ * @type string
9212
+ * @default Next
9213
+ * @dtopt Language
9214
+ *
9215
+ * @example
9216
+ * $(document).ready( function() {
9217
+ * $('#example').dataTable( {
9218
+ * "oLanguage": {
9219
+ * "oPaginate": {
9220
+ * "sNext": "Next page"
9221
+ * }
9222
+ * }
9223
+ * } );
9224
+ * } );
9225
+ */
9226
+ "sNext": "Next",
9227
+
9228
+
9229
+ /**
9230
+ * Text to use for the 'previous' pagination button (to take the user to
9231
+ * the previous page).
9232
+ * @type string
9233
+ * @default Previous
9234
+ * @dtopt Language
9235
+ *
9236
+ * @example
9237
+ * $(document).ready( function() {
9238
+ * $('#example').dataTable( {
9239
+ * "oLanguage": {
9240
+ * "oPaginate": {
9241
+ * "sPrevious": "Previous page"
9242
+ * }
9243
+ * }
9244
+ * } );
9245
+ * } );
9246
+ */
9247
+ "sPrevious": "Previous"
9248
+ },
9249
+
9250
+ /**
9251
+ * This string is shown in preference to sZeroRecords when the table is
9252
+ * empty of data (regardless of filtering). Note that this is an optional
9253
+ * parameter - if it is not given, the value of sZeroRecords will be used
9254
+ * instead (either the default or given value).
9255
+ * @type string
9256
+ * @default No data available in table
9257
+ * @dtopt Language
9258
+ *
9259
+ * @example
9260
+ * $(document).ready( function() {
9261
+ * $('#example').dataTable( {
9262
+ * "oLanguage": {
9263
+ * "sEmptyTable": "No data available in table"
9264
+ * }
9265
+ * } );
9266
+ * } );
9267
+ */
9268
+ "sEmptyTable": "No data available in table",
9269
+
9270
+
9271
+ /**
9272
+ * This string gives information to the end user about the information that
9273
+ * is current on display on the page. The _START_, _END_ and _TOTAL_
9274
+ * variables are all dynamically replaced as the table display updates, and
9275
+ * can be freely moved or removed as the language requirements change.
9276
+ * @type string
9277
+ * @default Showing _START_ to _END_ of _TOTAL_ entries
9278
+ * @dtopt Language
9279
+ *
9280
+ * @example
9281
+ * $(document).ready( function() {
9282
+ * $('#example').dataTable( {
9283
+ * "oLanguage": {
9284
+ * "sInfo": "Got a total of _TOTAL_ entries to show (_START_ to _END_)"
9285
+ * }
9286
+ * } );
9287
+ * } );
9288
+ */
9289
+ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
9290
+
9291
+
9292
+ /**
9293
+ * Display information string for when the table is empty. Typically the
9294
+ * format of this string should match sInfo.
9295
+ * @type string
9296
+ * @default Showing 0 to 0 of 0 entries
9297
+ * @dtopt Language
9298
+ *
9299
+ * @example
9300
+ * $(document).ready( function() {
9301
+ * $('#example').dataTable( {
9302
+ * "oLanguage": {
9303
+ * "sInfoEmpty": "No entries to show"
9304
+ * }
9305
+ * } );
9306
+ * } );
9307
+ */
9308
+ "sInfoEmpty": "Showing 0 to 0 of 0 subscribers",
9309
+
9310
+
9311
+ /**
9312
+ * When a user filters the information in a table, this string is appended
9313
+ * to the information (sInfo) to give an idea of how strong the filtering
9314
+ * is. The variable _MAX_ is dynamically updated.
9315
+ * @type string
9316
+ * @default (filtered from _MAX_ total entries)
9317
+ * @dtopt Language
9318
+ *
9319
+ * @example
9320
+ * $(document).ready( function() {
9321
+ * $('#example').dataTable( {
9322
+ * "oLanguage": {
9323
+ * "sInfoFiltered": " - filtering from _MAX_ records"
9324
+ * }
9325
+ * } );
9326
+ * } );
9327
+ */
9328
+ "sInfoFiltered": "(filtered from _MAX_ total subscribers)",
9329
+
9330
+
9331
+ /**
9332
+ * If can be useful to append extra information to the info string at times,
9333
+ * and this variable does exactly that. This information will be appended to
9334
+ * the sInfo (sInfoEmpty and sInfoFiltered in whatever combination they are
9335
+ * being used) at all times.
9336
+ * @type string
9337
+ * @default <i>Empty string</i>
9338
+ * @dtopt Language
9339
+ *
9340
+ * @example
9341
+ * $(document).ready( function() {
9342
+ * $('#example').dataTable( {
9343
+ * "oLanguage": {
9344
+ * "sInfoPostFix": "All records shown are derived from real information."
9345
+ * }
9346
+ * } );
9347
+ * } );
9348
+ */
9349
+ "sInfoPostFix": "",
9350
+
9351
+
9352
+ /**
9353
+ * DataTables has a build in number formatter (fnFormatNumber) which is used
9354
+ * to format large numbers that are used in the table information. By
9355
+ * default a comma is used, but this can be trivially changed to any
9356
+ * character you wish with this parameter.
9357
+ * @type string
9358
+ * @default ,
9359
+ * @dtopt Language
9360
+ *
9361
+ * @example
9362
+ * $(document).ready( function() {
9363
+ * $('#example').dataTable( {
9364
+ * "oLanguage": {
9365
+ * "sInfoThousands": "'"
9366
+ * }
9367
+ * } );
9368
+ * } );
9369
+ */
9370
+ "sInfoThousands": ",",
9371
+
9372
+
9373
+ /**
9374
+ * Detail the action that will be taken when the drop down menu for the
9375
+ * pagination length option is changed. The '_MENU_' variable is replaced
9376
+ * with a default select list of 10, 25, 50 and 100, and can be replaced
9377
+ * with a custom select box if required.
9378
+ * @type string
9379
+ * @default Show _MENU_ entries
9380
+ * @dtopt Language
9381
+ *
9382
+ * @example
9383
+ * // Language change only
9384
+ * $(document).ready( function() {
9385
+ * $('#example').dataTable( {
9386
+ * "oLanguage": {
9387
+ * "sLengthMenu": "Display _MENU_ records"
9388
+ * }
9389
+ * } );
9390
+ * } );
9391
+ *
9392
+ * @example
9393
+ * // Language and options change
9394
+ * $(document).ready( function() {
9395
+ * $('#example').dataTable( {
9396
+ * "oLanguage": {
9397
+ * "sLengthMenu": 'Display <select>'+
9398
+ * '<option value="10">10</option>'+
9399
+ * '<option value="20">20</option>'+
9400
+ * '<option value="30">30</option>'+
9401
+ * '<option value="40">40</option>'+
9402
+ * '<option value="50">50</option>'+
9403
+ * '<option value="-1">All</option>'+
9404
+ * '</select> records'
9405
+ * }
9406
+ * } );
9407
+ * } );
9408
+ */
9409
+ "sLengthMenu": "Show _MENU_ entries",
9410
+
9411
+
9412
+ /**
9413
+ * When using Ajax sourced data and during the first draw when DataTables is
9414
+ * gathering the data, this message is shown in an empty row in the table to
9415
+ * indicate to the end user the the data is being loaded. Note that this
9416
+ * parameter is not used when loading data by server-side processing, just
9417
+ * Ajax sourced data with client-side processing.
9418
+ * @type string
9419
+ * @default Loading...
9420
+ * @dtopt Language
9421
+ *
9422
+ * @example
9423
+ * $(document).ready( function() {
9424
+ * $('#example').dataTable( {
9425
+ * "oLanguage": {
9426
+ * "sLoadingRecords": "Please wait - loading..."
9427
+ * }
9428
+ * } );
9429
+ * } );
9430
+ */
9431
+ "sLoadingRecords": "Loading...",
9432
+
9433
+
9434
+ /**
9435
+ * Text which is displayed when the table is processing a user action
9436
+ * (usually a sort command or similar).
9437
+ * @type string
9438
+ * @default Processing...
9439
+ * @dtopt Language
9440
+ *
9441
+ * @example
9442
+ * $(document).ready( function() {
9443
+ * $('#example').dataTable( {
9444
+ * "oLanguage": {
9445
+ * "sProcessing": "DataTables is currently busy"
9446
+ * }
9447
+ * } );
9448
+ * } );
9449
+ */
9450
+ "sProcessing": "Processing...",
9451
+
9452
+
9453
+ /**
9454
+ * Details the actions that will be taken when the user types into the
9455
+ * filtering input text box. The variable "_INPUT_", if used in the string,
9456
+ * is replaced with the HTML text box for the filtering input allowing
9457
+ * control over where it appears in the string. If "_INPUT_" is not given
9458
+ * then the input box is appended to the string automatically.
9459
+ * @type string
9460
+ * @default Search:
9461
+ * @dtopt Language
9462
+ *
9463
+ * @example
9464
+ * // Input text box will be appended at the end automatically
9465
+ * $(document).ready( function() {
9466
+ * $('#example').dataTable( {
9467
+ * "oLanguage": {
9468
+ * "sSearch": "Filter records:"
9469
+ * }
9470
+ * } );
9471
+ * } );
9472
+ *
9473
+ * @example
9474
+ * // Specify where the filter should appear
9475
+ * $(document).ready( function() {
9476
+ * $('#example').dataTable( {
9477
+ * "oLanguage": {
9478
+ * "sSearch": "Apply filter _INPUT_ to table"
9479
+ * }
9480
+ * } );
9481
+ * } );
9482
+ */
9483
+ "sSearch": "Search:",
9484
+
9485
+
9486
+ /**
9487
+ * All of the language information can be stored in a file on the
9488
+ * server-side, which DataTables will look up if this parameter is passed.
9489
+ * It must store the URL of the language file, which is in a JSON format,
9490
+ * and the object has the same properties as the oLanguage object in the
9491
+ * initialiser object (i.e. the above parameters). Please refer to one of
9492
+ * the example language files to see how this works in action.
9493
+ * @type string
9494
+ * @default <i>Empty string - i.e. disabled</i>
9495
+ * @dtopt Language
9496
+ *
9497
+ * @example
9498
+ * $(document).ready( function() {
9499
+ * $('#example').dataTable( {
9500
+ * "oLanguage": {
9501
+ * "sUrl": "http://www.sprymedia.co.uk/dataTables/lang.txt"
9502
+ * }
9503
+ * } );
9504
+ * } );
9505
+ */
9506
+ "sUrl": "",
9507
+
9508
+
9509
+ /**
9510
+ * Text shown inside the table records when the is no information to be
9511
+ * displayed after filtering. sEmptyTable is shown when there is simply no
9512
+ * information in the table at all (regardless of filtering).
9513
+ * @type string
9514
+ * @default No matching records found
9515
+ * @dtopt Language
9516
+ *
9517
+ * @example
9518
+ * $(document).ready( function() {
9519
+ * $('#example').dataTable( {
9520
+ * "oLanguage": {
9521
+ * "sZeroRecords": "No records to display"
9522
+ * }
9523
+ * } );
9524
+ * } );
9525
+ */
9526
+ "sZeroRecords": "No matching subscribers found"
9527
+ },
9528
+
9529
+
9530
+ /**
9531
+ * This parameter allows you to have define the global filtering state at
9532
+ * initialisation time. As an object the "sSearch" parameter must be
9533
+ * defined, but all other parameters are optional. When "bRegex" is true,
9534
+ * the search string will be treated as a regular expression, when false
9535
+ * (default) it will be treated as a straight string. When "bSmart"
9536
+ * DataTables will use it's smart filtering methods (to word match at
9537
+ * any point in the data), when false this will not be done.
9538
+ * @namespace
9539
+ * @extends DataTable.models.oSearch
9540
+ * @dtopt Options
9541
+ *
9542
+ * @example
9543
+ * $(document).ready( function() {
9544
+ * $('#example').dataTable( {
9545
+ * "oSearch": {"sSearch": "Initial search"}
9546
+ * } );
9547
+ * } )
9548
+ */
9549
+ "oSearch": $.extend( {}, DataTable.models.oSearch ),
9550
+
9551
+
9552
+ /**
9553
+ * By default DataTables will look for the property 'aaData' when obtaining
9554
+ * data from an Ajax source or for server-side processing - this parameter
9555
+ * allows that property to be changed. You can use Javascript dotted object
9556
+ * notation to get a data source for multiple levels of nesting.
9557
+ * @type string
9558
+ * @default aaData
9559
+ * @dtopt Options
9560
+ * @dtopt Server-side
9561
+ *
9562
+ * @example
9563
+ * // Get data from { "data": [...] }
9564
+ * $(document).ready( function() {
9565
+ * var oTable = $('#example').dataTable( {
9566
+ * "sAjaxSource": "sources/data.txt",
9567
+ * "sAjaxDataProp": "data"
9568
+ * } );
9569
+ * } );
9570
+ *
9571
+ * @example
9572
+ * // Get data from { "data": { "inner": [...] } }
9573
+ * $(document).ready( function() {
9574
+ * var oTable = $('#example').dataTable( {
9575
+ * "sAjaxSource": "sources/data.txt",
9576
+ * "sAjaxDataProp": "data.inner"
9577
+ * } );
9578
+ * } );
9579
+ */
9580
+ "sAjaxDataProp": "aaData",
9581
+
9582
+
9583
+ /**
9584
+ * You can instruct DataTables to load data from an external source using this
9585
+ * parameter (use aData if you want to pass data in you already have). Simply
9586
+ * provide a url a JSON object can be obtained from. This object must include
9587
+ * the parameter 'aaData' which is the data source for the table.
9588
+ * @type string
9589
+ * @default null
9590
+ * @dtopt Options
9591
+ * @dtopt Server-side
9592
+ *
9593
+ * @example
9594
+ * $(document).ready( function() {
9595
+ * $('#example').dataTable( {
9596
+ * "sAjaxSource": "http://www.sprymedia.co.uk/dataTables/json.php"
9597
+ * } );
9598
+ * } )
9599
+ */
9600
+ "sAjaxSource": null,
9601
+
9602
+
9603
+ /**
9604
+ * This parameter can be used to override the default prefix that DataTables
9605
+ * assigns to a cookie when state saving is enabled.
9606
+ * @type string
9607
+ * @default SpryMedia_DataTables_
9608
+ * @dtopt Options
9609
+ *
9610
+ * @example
9611
+ * $(document).ready( function() {
9612
+ * $('#example').dataTable( {
9613
+ * "sCookiePrefix": "my_datatable_",
9614
+ * } );
9615
+ * } );
9616
+ */
9617
+ "sCookiePrefix": "SpryMedia_DataTables_",
9618
+
9619
+
9620
+ /**
9621
+ * This initialisation variable allows you to specify exactly where in the
9622
+ * DOM you want DataTables to inject the various controls it adds to the page
9623
+ * (for example you might want the pagination controls at the top of the
9624
+ * table). DIV elements (with or without a custom class) can also be added to
9625
+ * aid styling. The follow syntax is used:
9626
+ * <ul>
9627
+ * <li>The following options are allowed:
9628
+ * <ul>
9629
+ * <li>'l' - Length changing</li
9630
+ * <li>'f' - Filtering input</li>
9631
+ * <li>'t' - The table!</li>
9632
+ * <li>'i' - Information</li>
9633
+ * <li>'p' - Pagination</li>
9634
+ * <li>'r' - pRocessing</li>
9635
+ * </ul>
9636
+ * </li>
9637
+ * <li>The following constants are allowed:
9638
+ * <ul>
9639
+ * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
9640
+ * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
9641
+ * </ul>
9642
+ * </li>
9643
+ * <li>The following syntax is expected:
9644
+ * <ul>
9645
+ * <li>'&lt;' and '&gt;' - div elements</li>
9646
+ * <li>'&lt;"class" and '&gt;' - div with a class</li>
9647
+ * <li>'&lt;"#id" and '&gt;' - div with an ID</li>
9648
+ * </ul>
9649
+ * </li>
9650
+ * <li>Examples:
9651
+ * <ul>
9652
+ * <li>'&lt;"wrapper"flipt&gt;'</li>
9653
+ * <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
9654
+ * </ul>
9655
+ * </li>
9656
+ * </ul>
9657
+ * @type string
9658
+ * @default lfrtip <i>(when bJQueryUI is false)</i> <b>or</b>
9659
+ * <"H"lfr>t<"F"ip> <i>(when bJQueryUI is true)</i>
9660
+ * @dtopt Options
9661
+ *
9662
+ * @example
9663
+ * $(document).ready( function() {
9664
+ * $('#example').dataTable( {
9665
+ * "sDom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
9666
+ * } );
9667
+ * } );
9668
+ */
9669
+ "sDom": "lfrtip",
9670
+
9671
+
9672
+ /**
9673
+ * DataTables features two different built-in pagination interaction methods
9674
+ * ('two_button' or 'full_numbers') which present different page controls to
9675
+ * the end user. Further methods can be added using the API (see below).
9676
+ * @type string
9677
+ * @default two_button
9678
+ * @dtopt Options
9679
+ *
9680
+ * @example
9681
+ * $(document).ready( function() {
9682
+ * $('#example').dataTable( {
9683
+ * "sPaginationType": "full_numbers"
9684
+ * } );
9685
+ * } )
9686
+ */
9687
+ "sPaginationType": "two_button",
9688
+
9689
+
9690
+ /**
9691
+ * Enable horizontal scrolling. When a table is too wide to fit into a certain
9692
+ * layout, or you have a large number of columns in the table, you can enable
9693
+ * x-scrolling to show the table in a viewport, which can be scrolled. This
9694
+ * property can be any CSS unit, or a number (in which case it will be treated
9695
+ * as a pixel measurement).
9696
+ * @type string
9697
+ * @default <i>blank string - i.e. disabled</i>
9698
+ * @dtopt Features
9699
+ *
9700
+ * @example
9701
+ * $(document).ready( function() {
9702
+ * $('#example').dataTable( {
9703
+ * "sScrollX": "100%",
9704
+ * "bScrollCollapse": true
9705
+ * } );
9706
+ * } );
9707
+ */
9708
+ "sScrollX": "",
9709
+
9710
+
9711
+ /**
9712
+ * This property can be used to force a DataTable to use more width than it
9713
+ * might otherwise do when x-scrolling is enabled. For example if you have a
9714
+ * table which requires to be well spaced, this parameter is useful for
9715
+ * "over-sizing" the table, and thus forcing scrolling. This property can by
9716
+ * any CSS unit, or a number (in which case it will be treated as a pixel
9717
+ * measurement).
9718
+ * @type string
9719
+ * @default <i>blank string - i.e. disabled</i>
9720
+ * @dtopt Options
9721
+ *
9722
+ * @example
9723
+ * $(document).ready( function() {
9724
+ * $('#example').dataTable( {
9725
+ * "sScrollX": "100%",
9726
+ * "sScrollXInner": "110%"
9727
+ * } );
9728
+ * } );
9729
+ */
9730
+ "sScrollXInner": "",
9731
+
9732
+
9733
+ /**
9734
+ * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
9735
+ * to the given height, and enable scrolling for any data which overflows the
9736
+ * current viewport. This can be used as an alternative to paging to display
9737
+ * a lot of data in a small area (although paging and scrolling can both be
9738
+ * enabled at the same time). This property can be any CSS unit, or a number
9739
+ * (in which case it will be treated as a pixel measurement).
9740
+ * @type string
9741
+ * @default <i>blank string - i.e. disabled</i>
9742
+ * @dtopt Features
9743
+ *
9744
+ * @example
9745
+ * $(document).ready( function() {
9746
+ * $('#example').dataTable( {
9747
+ * "sScrollY": "200px",
9748
+ * "bPaginate": false
9749
+ * } );
9750
+ * } );
9751
+ */
9752
+ "sScrollY": "",
9753
+
9754
+
9755
+ /**
9756
+ * Set the HTTP method that is used to make the Ajax call for server-side
9757
+ * processing or Ajax sourced data.
9758
+ * @type string
9759
+ * @default GET
9760
+ * @dtopt Options
9761
+ * @dtopt Server-side
9762
+ *
9763
+ * @example
9764
+ * $(document).ready( function() {
9765
+ * $('#example').dataTable( {
9766
+ * "bServerSide": true,
9767
+ * "sAjaxSource": "scripts/post.php",
9768
+ * "sServerMethod": "POST"
9769
+ * } );
9770
+ * } );
9771
+ */
9772
+ "sServerMethod": "GET"
9773
+ };
9774
+
9775
+
9776
+
9777
+ /**
9778
+ * Column options that can be given to DataTables at initialisation time.
9779
+ * @namespace
9780
+ */
9781
+ DataTable.defaults.columns = {
9782
+ /**
9783
+ * Allows a column's sorting to take multiple columns into account when
9784
+ * doing a sort. For example first name / last name columns make sense to
9785
+ * do a multi-column sort over the two columns.
9786
+ * @type array
9787
+ * @default null <i>Takes the value of the column index automatically</i>
9788
+ * @dtopt Columns
9789
+ *
9790
+ * @example
9791
+ * // Using aoColumnDefs
9792
+ * $(document).ready( function() {
9793
+ * $('#example').dataTable( {
9794
+ * "aoColumnDefs": [
9795
+ * { "aDataSort": [ 0, 1 ], "aTargets": [ 0 ] },
9796
+ * { "aDataSort": [ 1, 0 ], "aTargets": [ 1 ] },
9797
+ * { "aDataSort": [ 2, 3, 4 ], "aTargets": [ 2 ] }
9798
+ * ]
9799
+ * } );
9800
+ * } );
9801
+ *
9802
+ * @example
9803
+ * // Using aoColumns
9804
+ * $(document).ready( function() {
9805
+ * $('#example').dataTable( {
9806
+ * "aoColumns": [
9807
+ * { "aDataSort": [ 0, 1 ] },
9808
+ * { "aDataSort": [ 1, 0 ] },
9809
+ * { "aDataSort": [ 2, 3, 4 ] },
9810
+ * null,
9811
+ * null
9812
+ * ]
9813
+ * } );
9814
+ * } );
9815
+ */
9816
+ "aDataSort": null,
9817
+
9818
+
9819
+ /**
9820
+ * You can control the default sorting direction, and even alter the behaviour
9821
+ * of the sort handler (i.e. only allow ascending sorting etc) using this
9822
+ * parameter.
9823
+ * @type array
9824
+ * @default [ 'asc', 'desc' ]
9825
+ * @dtopt Columns
9826
+ *
9827
+ * @example
9828
+ * // Using aoColumnDefs
9829
+ * $(document).ready( function() {
9830
+ * $('#example').dataTable( {
9831
+ * "aoColumnDefs": [
9832
+ * { "asSorting": [ "asc" ], "aTargets": [ 1 ] },
9833
+ * { "asSorting": [ "desc", "asc", "asc" ], "aTargets": [ 2 ] },
9834
+ * { "asSorting": [ "desc" ], "aTargets": [ 3 ] }
9835
+ * ]
9836
+ * } );
9837
+ * } );
9838
+ *
9839
+ * @example
9840
+ * // Using aoColumns
9841
+ * $(document).ready( function() {
9842
+ * $('#example').dataTable( {
9843
+ * "aoColumns": [
9844
+ * null,
9845
+ * { "asSorting": [ "asc" ] },
9846
+ * { "asSorting": [ "desc", "asc", "asc" ] },
9847
+ * { "asSorting": [ "desc" ] },
9848
+ * null
9849
+ * ]
9850
+ * } );
9851
+ * } );
9852
+ */
9853
+ "asSorting": [ 'asc', 'desc' ],
9854
+
9855
+
9856
+ /**
9857
+ * Enable or disable filtering on the data in this column.
9858
+ * @type boolean
9859
+ * @default true
9860
+ * @dtopt Columns
9861
+ *
9862
+ * @example
9863
+ * // Using aoColumnDefs
9864
+ * $(document).ready( function() {
9865
+ * $('#example').dataTable( {
9866
+ * "aoColumnDefs": [
9867
+ * { "bSearchable": false, "aTargets": [ 0 ] }
9868
+ * ] } );
9869
+ * } );
9870
+ *
9871
+ * @example
9872
+ * // Using aoColumns
9873
+ * $(document).ready( function() {
9874
+ * $('#example').dataTable( {
9875
+ * "aoColumns": [
9876
+ * { "bSearchable": false },
9877
+ * null,
9878
+ * null,
9879
+ * null,
9880
+ * null
9881
+ * ] } );
9882
+ * } );
9883
+ */
9884
+ "bSearchable": true,
9885
+
9886
+
9887
+ /**
9888
+ * Enable or disable sorting on this column.
9889
+ * @type boolean
9890
+ * @default true
9891
+ * @dtopt Columns
9892
+ *
9893
+ * @example
9894
+ * // Using aoColumnDefs
9895
+ * $(document).ready( function() {
9896
+ * $('#example').dataTable( {
9897
+ * "aoColumnDefs": [
9898
+ * { "bSortable": false, "aTargets": [ 0 ] }
9899
+ * ] } );
9900
+ * } );
9901
+ *
9902
+ * @example
9903
+ * // Using aoColumns
9904
+ * $(document).ready( function() {
9905
+ * $('#example').dataTable( {
9906
+ * "aoColumns": [
9907
+ * { "bSortable": false },
9908
+ * null,
9909
+ * null,
9910
+ * null,
9911
+ * null
9912
+ * ] } );
9913
+ * } );
9914
+ */
9915
+ "bSortable": true,
9916
+
9917
+
9918
+ /**
9919
+ * <code>Deprecated</code> When using fnRender() for a column, you may wish
9920
+ * to use the original data (before rendering) for sorting and filtering
9921
+ * (the default is to used the rendered data that the user can see). This
9922
+ * may be useful for dates etc.
9923
+ *
9924
+ * Please note that this option has now been deprecated and will be removed
9925
+ * in the next version of DataTables. Please use mRender / mData rather than
9926
+ * fnRender.
9927
+ * @type boolean
9928
+ * @default true
9929
+ * @dtopt Columns
9930
+ * @deprecated
9931
+ */
9932
+ "bUseRendered": true,
9933
+
9934
+
9935
+ /**
9936
+ * Enable or disable the display of this column.
9937
+ * @type boolean
9938
+ * @default true
9939
+ * @dtopt Columns
9940
+ *
9941
+ * @example
9942
+ * // Using aoColumnDefs
9943
+ * $(document).ready( function() {
9944
+ * $('#example').dataTable( {
9945
+ * "aoColumnDefs": [
9946
+ * { "bVisible": false, "aTargets": [ 0 ] }
9947
+ * ] } );
9948
+ * } );
9949
+ *
9950
+ * @example
9951
+ * // Using aoColumns
9952
+ * $(document).ready( function() {
9953
+ * $('#example').dataTable( {
9954
+ * "aoColumns": [
9955
+ * { "bVisible": false },
9956
+ * null,
9957
+ * null,
9958
+ * null,
9959
+ * null
9960
+ * ] } );
9961
+ * } );
9962
+ */
9963
+ "bVisible": true,
9964
+
9965
+
9966
+ /**
9967
+ * Developer definable function that is called whenever a cell is created (Ajax source,
9968
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
9969
+ * allowing you to modify the DOM element (add background colour for example) when the
9970
+ * element is available.
9971
+ * @type function
9972
+ * @param {element} nTd The TD node that has been created
9973
+ * @param {*} sData The Data for the cell
9974
+ * @param {array|object} oData The data for the whole row
9975
+ * @param {int} iRow The row index for the aoData data store
9976
+ * @param {int} iCol The column index for aoColumns
9977
+ * @dtopt Columns
9978
+ *
9979
+ * @example
9980
+ * $(document).ready( function() {
9981
+ * $('#example').dataTable( {
9982
+ * "aoColumnDefs": [ {
9983
+ * "aTargets": [3],
9984
+ * "fnCreatedCell": function (nTd, sData, oData, iRow, iCol) {
9985
+ * if ( sData == "1.7" ) {
9986
+ * $(nTd).css('color', 'blue')
9987
+ * }
9988
+ * }
9989
+ * } ]
9990
+ * });
9991
+ * } );
9992
+ */
9993
+ "fnCreatedCell": null,
9994
+
9995
+
9996
+ /**
9997
+ * <code>Deprecated</code> Custom display function that will be called for the
9998
+ * display of each cell in this column.
9999
+ *
10000
+ * Please note that this option has now been deprecated and will be removed
10001
+ * in the next version of DataTables. Please use mRender / mData rather than
10002
+ * fnRender.
10003
+ * @type function
10004
+ * @param {object} o Object with the following parameters:
10005
+ * @param {int} o.iDataRow The row in aoData
10006
+ * @param {int} o.iDataColumn The column in question
10007
+ * @param {array} o.aData The data for the row in question
10008
+ * @param {object} o.oSettings The settings object for this DataTables instance
10009
+ * @param {object} o.mDataProp The data property used for this column
10010
+ * @param {*} val The current cell value
10011
+ * @returns {string} The string you which to use in the display
10012
+ * @dtopt Columns
10013
+ * @deprecated
10014
+ */
10015
+ "fnRender": null,
10016
+
10017
+
10018
+ /**
10019
+ * The column index (starting from 0!) that you wish a sort to be performed
10020
+ * upon when this column is selected for sorting. This can be used for sorting
10021
+ * on hidden columns for example.
10022
+ * @type int
10023
+ * @default -1 <i>Use automatically calculated column index</i>
10024
+ * @dtopt Columns
10025
+ *
10026
+ * @example
10027
+ * // Using aoColumnDefs
10028
+ * $(document).ready( function() {
10029
+ * $('#example').dataTable( {
10030
+ * "aoColumnDefs": [
10031
+ * { "iDataSort": 1, "aTargets": [ 0 ] }
10032
+ * ]
10033
+ * } );
10034
+ * } );
10035
+ *
10036
+ * @example
10037
+ * // Using aoColumns
10038
+ * $(document).ready( function() {
10039
+ * $('#example').dataTable( {
10040
+ * "aoColumns": [
10041
+ * { "iDataSort": 1 },
10042
+ * null,
10043
+ * null,
10044
+ * null,
10045
+ * null
10046
+ * ]
10047
+ * } );
10048
+ * } );
10049
+ */
10050
+ "iDataSort": -1,
10051
+
10052
+
10053
+ /**
10054
+ * This parameter has been replaced by mData in DataTables to ensure naming
10055
+ * consistency. mDataProp can still be used, as there is backwards compatibility
10056
+ * in DataTables for this option, but it is strongly recommended that you use
10057
+ * mData in preference to mDataProp.
10058
+ * @name DataTable.defaults.columns.mDataProp
10059
+ */
10060
+
10061
+
10062
+ /**
10063
+ * This property can be used to read data from any JSON data source property,
10064
+ * including deeply nested objects / properties. mData can be given in a
10065
+ * number of different ways which effect its behaviour:
10066
+ * <ul>
10067
+ * <li>integer - treated as an array index for the data source. This is the
10068
+ * default that DataTables uses (incrementally increased for each column).</li>
10069
+ * <li>string - read an object property from the data source. Note that you can
10070
+ * use Javascript dotted notation to read deep properties / arrays from the
10071
+ * data source.</li>
10072
+ * <li>null - the sDefaultContent option will be used for the cell (null
10073
+ * by default, so you will need to specify the default content you want -
10074
+ * typically an empty string). This can be useful on generated columns such
10075
+ * as edit / delete action columns.</li>
10076
+ * <li>function - the function given will be executed whenever DataTables
10077
+ * needs to set or get the data for a cell in the column. The function
10078
+ * takes three parameters:
10079
+ * <ul>
10080
+ * <li>{array|object} The data source for the row</li>
10081
+ * <li>{string} The type call data requested - this will be 'set' when
10082
+ * setting data or 'filter', 'display', 'type', 'sort' or undefined when
10083
+ * gathering data. Note that when <i>undefined</i> is given for the type
10084
+ * DataTables expects to get the raw data for the object back</li>
10085
+ * <li>{*} Data to set when the second parameter is 'set'.</li>
10086
+ * </ul>
10087
+ * The return value from the function is not required when 'set' is the type
10088
+ * of call, but otherwise the return is what will be used for the data
10089
+ * requested.</li>
10090
+ * </ul>
10091
+ *
10092
+ * Note that prior to DataTables 1.9.2 mData was called mDataProp. The name change
10093
+ * reflects the flexibility of this property and is consistent with the naming of
10094
+ * mRender. If 'mDataProp' is given, then it will still be used by DataTables, as
10095
+ * it automatically maps the old name to the new if required.
10096
+ * @type string|int|function|null
10097
+ * @default null <i>Use automatically calculated column index</i>
10098
+ * @dtopt Columns
10099
+ *
10100
+ * @example
10101
+ * // Read table data from objects
10102
+ * $(document).ready( function() {
10103
+ * var oTable = $('#example').dataTable( {
10104
+ * "sAjaxSource": "sources/deep.txt",
10105
+ * "aoColumns": [
10106
+ * { "mData": "engine" },
10107
+ * { "mData": "browser" },
10108
+ * { "mData": "platform.inner" },
10109
+ * { "mData": "platform.details.0" },
10110
+ * { "mData": "platform.details.1" }
10111
+ * ]
10112
+ * } );
10113
+ * } );
10114
+ *
10115
+ * @example
10116
+ * // Using mData as a function to provide different information for
10117
+ * // sorting, filtering and display. In this case, currency (price)
10118
+ * $(document).ready( function() {
10119
+ * var oTable = $('#example').dataTable( {
10120
+ * "aoColumnDefs": [ {
10121
+ * "aTargets": [ 0 ],
10122
+ * "mData": function ( source, type, val ) {
10123
+ * if (type === 'set') {
10124
+ * source.price = val;
10125
+ * // Store the computed dislay and filter values for efficiency
10126
+ * source.price_display = val=="" ? "" : "$"+numberFormat(val);
10127
+ * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val;
10128
+ * return;
10129
+ * }
10130
+ * else if (type === 'display') {
10131
+ * return source.price_display;
10132
+ * }
10133
+ * else if (type === 'filter') {
10134
+ * return source.price_filter;
10135
+ * }
10136
+ * // 'sort', 'type' and undefined all just use the integer
10137
+ * return source.price;
10138
+ * }
10139
+ * } ]
10140
+ * } );
10141
+ * } );
10142
+ */
10143
+ "mData": null,
10144
+
10145
+
10146
+ /**
10147
+ * This property is the rendering partner to mData and it is suggested that
10148
+ * when you want to manipulate data for display (including filtering, sorting etc)
10149
+ * but not altering the underlying data for the table, use this property. mData
10150
+ * can actually do everything this property can and more, but this parameter is
10151
+ * easier to use since there is no 'set' option. Like mData is can be given
10152
+ * in a number of different ways to effect its behaviour, with the addition of
10153
+ * supporting array syntax for easy outputting of arrays (including arrays of
10154
+ * objects):
10155
+ * <ul>
10156
+ * <li>integer - treated as an array index for the data source. This is the
10157
+ * default that DataTables uses (incrementally increased for each column).</li>
10158
+ * <li>string - read an object property from the data source. Note that you can
10159
+ * use Javascript dotted notation to read deep properties / arrays from the
10160
+ * data source and also array brackets to indicate that the data reader should
10161
+ * loop over the data source array. When characters are given between the array
10162
+ * brackets, these characters are used to join the data source array together.
10163
+ * For example: "accounts[, ].name" would result in a comma separated list with
10164
+ * the 'name' value from the 'accounts' array of objects.</li>
10165
+ * <li>function - the function given will be executed whenever DataTables
10166
+ * needs to set or get the data for a cell in the column. The function
10167
+ * takes three parameters:
10168
+ * <ul>
10169
+ * <li>{array|object} The data source for the row (based on mData)</li>
10170
+ * <li>{string} The type call data requested - this will be 'filter', 'display',
10171
+ * 'type' or 'sort'.</li>
10172
+ * <li>{array|object} The full data source for the row (not based on mData)</li>
10173
+ * </ul>
10174
+ * The return value from the function is what will be used for the data
10175
+ * requested.</li>
10176
+ * </ul>
10177
+ * @type string|int|function|null
10178
+ * @default null <i>Use mData</i>
10179
+ * @dtopt Columns
10180
+ *
10181
+ * @example
10182
+ * // Create a comma separated list from an array of objects
10183
+ * $(document).ready( function() {
10184
+ * var oTable = $('#example').dataTable( {
10185
+ * "sAjaxSource": "sources/deep.txt",
10186
+ * "aoColumns": [
10187
+ * { "mData": "engine" },
10188
+ * { "mData": "browser" },
10189
+ * {
10190
+ * "mData": "platform",
10191
+ * "mRender": "[, ].name"
10192
+ * }
10193
+ * ]
10194
+ * } );
10195
+ * } );
10196
+ *
10197
+ * @example
10198
+ * // Use as a function to create a link from the data source
10199
+ * $(document).ready( function() {
10200
+ * var oTable = $('#example').dataTable( {
10201
+ * "aoColumnDefs": [
10202
+ * {
10203
+ * "aTargets": [ 0 ],
10204
+ * "mData": "download_link",
10205
+ * "mRender": function ( data, type, full ) {
10206
+ * return '<a href="'+data+'">Download</a>';
10207
+ * }
10208
+ * ]
10209
+ * } );
10210
+ * } );
10211
+ */
10212
+ "mRender": null,
10213
+
10214
+
10215
+ /**
10216
+ * Change the cell type created for the column - either TD cells or TH cells. This
10217
+ * can be useful as TH cells have semantic meaning in the table body, allowing them
10218
+ * to act as a header for a row (you may wish to add scope='row' to the TH elements).
10219
+ * @type string
10220
+ * @default td
10221
+ * @dtopt Columns
10222
+ *
10223
+ * @example
10224
+ * // Make the first column use TH cells
10225
+ * $(document).ready( function() {
10226
+ * var oTable = $('#example').dataTable( {
10227
+ * "aoColumnDefs": [ {
10228
+ * "aTargets": [ 0 ],
10229
+ * "sCellType": "th"
10230
+ * } ]
10231
+ * } );
10232
+ * } );
10233
+ */
10234
+ "sCellType": "td",
10235
+
10236
+
10237
+ /**
10238
+ * Class to give to each cell in this column.
10239
+ * @type string
10240
+ * @default <i>Empty string</i>
10241
+ * @dtopt Columns
10242
+ *
10243
+ * @example
10244
+ * // Using aoColumnDefs
10245
+ * $(document).ready( function() {
10246
+ * $('#example').dataTable( {
10247
+ * "aoColumnDefs": [
10248
+ * { "sClass": "my_class", "aTargets": [ 0 ] }
10249
+ * ]
10250
+ * } );
10251
+ * } );
10252
+ *
10253
+ * @example
10254
+ * // Using aoColumns
10255
+ * $(document).ready( function() {
10256
+ * $('#example').dataTable( {
10257
+ * "aoColumns": [
10258
+ * { "sClass": "my_class" },
10259
+ * null,
10260
+ * null,
10261
+ * null,
10262
+ * null
10263
+ * ]
10264
+ * } );
10265
+ * } );
10266
+ */
10267
+ "sClass": "",
10268
+
10269
+ /**
10270
+ * When DataTables calculates the column widths to assign to each column,
10271
+ * it finds the longest string in each column and then constructs a
10272
+ * temporary table and reads the widths from that. The problem with this
10273
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
10274
+ * string - thus the calculation can go wrong (doing it properly and putting
10275
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
10276
+ * a "work around" we provide this option. It will append its value to the
10277
+ * text that is found to be the longest string for the column - i.e. padding.
10278
+ * Generally you shouldn't need this, and it is not documented on the
10279
+ * general DataTables.net documentation
10280
+ * @type string
10281
+ * @default <i>Empty string<i>
10282
+ * @dtopt Columns
10283
+ *
10284
+ * @example
10285
+ * // Using aoColumns
10286
+ * $(document).ready( function() {
10287
+ * $('#example').dataTable( {
10288
+ * "aoColumns": [
10289
+ * null,
10290
+ * null,
10291
+ * null,
10292
+ * {
10293
+ * "sContentPadding": "mmm"
10294
+ * }
10295
+ * ]
10296
+ * } );
10297
+ * } );
10298
+ */
10299
+ "sContentPadding": "",
10300
+
10301
+
10302
+ /**
10303
+ * Allows a default value to be given for a column's data, and will be used
10304
+ * whenever a null data source is encountered (this can be because mData
10305
+ * is set to null, or because the data source itself is null).
10306
+ * @type string
10307
+ * @default null
10308
+ * @dtopt Columns
10309
+ *
10310
+ * @example
10311
+ * // Using aoColumnDefs
10312
+ * $(document).ready( function() {
10313
+ * $('#example').dataTable( {
10314
+ * "aoColumnDefs": [
10315
+ * {
10316
+ * "mData": null,
10317
+ * "sDefaultContent": "Edit",
10318
+ * "aTargets": [ -1 ]
10319
+ * }
10320
+ * ]
10321
+ * } );
10322
+ * } );
10323
+ *
10324
+ * @example
10325
+ * // Using aoColumns
10326
+ * $(document).ready( function() {
10327
+ * $('#example').dataTable( {
10328
+ * "aoColumns": [
10329
+ * null,
10330
+ * null,
10331
+ * null,
10332
+ * {
10333
+ * "mData": null,
10334
+ * "sDefaultContent": "Edit"
10335
+ * }
10336
+ * ]
10337
+ * } );
10338
+ * } );
10339
+ */
10340
+ "sDefaultContent": null,
10341
+
10342
+
10343
+ /**
10344
+ * This parameter is only used in DataTables' server-side processing. It can
10345
+ * be exceptionally useful to know what columns are being displayed on the
10346
+ * client side, and to map these to database fields. When defined, the names
10347
+ * also allow DataTables to reorder information from the server if it comes
10348
+ * back in an unexpected order (i.e. if you switch your columns around on the
10349
+ * client-side, your server-side code does not also need updating).
10350
+ * @type string
10351
+ * @default <i>Empty string</i>
10352
+ * @dtopt Columns
10353
+ *
10354
+ * @example
10355
+ * // Using aoColumnDefs
10356
+ * $(document).ready( function() {
10357
+ * $('#example').dataTable( {
10358
+ * "aoColumnDefs": [
10359
+ * { "sName": "engine", "aTargets": [ 0 ] },
10360
+ * { "sName": "browser", "aTargets": [ 1 ] },
10361
+ * { "sName": "platform", "aTargets": [ 2 ] },
10362
+ * { "sName": "version", "aTargets": [ 3 ] },
10363
+ * { "sName": "grade", "aTargets": [ 4 ] }
10364
+ * ]
10365
+ * } );
10366
+ * } );
10367
+ *
10368
+ * @example
10369
+ * // Using aoColumns
10370
+ * $(document).ready( function() {
10371
+ * $('#example').dataTable( {
10372
+ * "aoColumns": [
10373
+ * { "sName": "engine" },
10374
+ * { "sName": "browser" },
10375
+ * { "sName": "platform" },
10376
+ * { "sName": "version" },
10377
+ * { "sName": "grade" }
10378
+ * ]
10379
+ * } );
10380
+ * } );
10381
+ */
10382
+ "sName": "",
10383
+
10384
+
10385
+ /**
10386
+ * Defines a data source type for the sorting which can be used to read
10387
+ * real-time information from the table (updating the internally cached
10388
+ * version) prior to sorting. This allows sorting to occur on user editable
10389
+ * elements such as form inputs.
10390
+ * @type string
10391
+ * @default std
10392
+ * @dtopt Columns
10393
+ *
10394
+ * @example
10395
+ * // Using aoColumnDefs
10396
+ * $(document).ready( function() {
10397
+ * $('#example').dataTable( {
10398
+ * "aoColumnDefs": [
10399
+ * { "sSortDataType": "dom-text", "aTargets": [ 2, 3 ] },
10400
+ * { "sType": "numeric", "aTargets": [ 3 ] },
10401
+ * { "sSortDataType": "dom-select", "aTargets": [ 4 ] },
10402
+ * { "sSortDataType": "dom-checkbox", "aTargets": [ 5 ] }
10403
+ * ]
10404
+ * } );
10405
+ * } );
10406
+ *
10407
+ * @example
10408
+ * // Using aoColumns
10409
+ * $(document).ready( function() {
10410
+ * $('#example').dataTable( {
10411
+ * "aoColumns": [
10412
+ * null,
10413
+ * null,
10414
+ * { "sSortDataType": "dom-text" },
10415
+ * { "sSortDataType": "dom-text", "sType": "numeric" },
10416
+ * { "sSortDataType": "dom-select" },
10417
+ * { "sSortDataType": "dom-checkbox" }
10418
+ * ]
10419
+ * } );
10420
+ * } );
10421
+ */
10422
+ "sSortDataType": "std",
10423
+
10424
+
10425
+ /**
10426
+ * The title of this column.
10427
+ * @type string
10428
+ * @default null <i>Derived from the 'TH' value for this column in the
10429
+ * original HTML table.</i>
10430
+ * @dtopt Columns
10431
+ *
10432
+ * @example
10433
+ * // Using aoColumnDefs
10434
+ * $(document).ready( function() {
10435
+ * $('#example').dataTable( {
10436
+ * "aoColumnDefs": [
10437
+ * { "sTitle": "My column title", "aTargets": [ 0 ] }
10438
+ * ]
10439
+ * } );
10440
+ * } );
10441
+ *
10442
+ * @example
10443
+ * // Using aoColumns
10444
+ * $(document).ready( function() {
10445
+ * $('#example').dataTable( {
10446
+ * "aoColumns": [
10447
+ * { "sTitle": "My column title" },
10448
+ * null,
10449
+ * null,
10450
+ * null,
10451
+ * null
10452
+ * ]
10453
+ * } );
10454
+ * } );
10455
+ */
10456
+ "sTitle": null,
10457
+
10458
+
10459
+ /**
10460
+ * The type allows you to specify how the data for this column will be sorted.
10461
+ * Four types (string, numeric, date and html (which will strip HTML tags
10462
+ * before sorting)) are currently available. Note that only date formats
10463
+ * understood by Javascript's Date() object will be accepted as type date. For
10464
+ * example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 'numeric',
10465
+ * 'date' or 'html' (by default). Further types can be adding through
10466
+ * plug-ins.
10467
+ * @type string
10468
+ * @default null <i>Auto-detected from raw data</i>
10469
+ * @dtopt Columns
10470
+ *
10471
+ * @example
10472
+ * // Using aoColumnDefs
10473
+ * $(document).ready( function() {
10474
+ * $('#example').dataTable( {
10475
+ * "aoColumnDefs": [
10476
+ * { "sType": "html", "aTargets": [ 0 ] }
10477
+ * ]
10478
+ * } );
10479
+ * } );
10480
+ *
10481
+ * @example
10482
+ * // Using aoColumns
10483
+ * $(document).ready( function() {
10484
+ * $('#example').dataTable( {
10485
+ * "aoColumns": [
10486
+ * { "sType": "html" },
10487
+ * null,
10488
+ * null,
10489
+ * null,
10490
+ * null
10491
+ * ]
10492
+ * } );
10493
+ * } );
10494
+ */
10495
+ "sType": null,
10496
+
10497
+
10498
+ /**
10499
+ * Defining the width of the column, this parameter may take any CSS value
10500
+ * (3em, 20px etc). DataTables apples 'smart' widths to columns which have not
10501
+ * been given a specific width through this interface ensuring that the table
10502
+ * remains readable.
10503
+ * @type string
10504
+ * @default null <i>Automatic</i>
10505
+ * @dtopt Columns
10506
+ *
10507
+ * @example
10508
+ * // Using aoColumnDefs
10509
+ * $(document).ready( function() {
10510
+ * $('#example').dataTable( {
10511
+ * "aoColumnDefs": [
10512
+ * { "sWidth": "20%", "aTargets": [ 0 ] }
10513
+ * ]
10514
+ * } );
10515
+ * } );
10516
+ *
10517
+ * @example
10518
+ * // Using aoColumns
10519
+ * $(document).ready( function() {
10520
+ * $('#example').dataTable( {
10521
+ * "aoColumns": [
10522
+ * { "sWidth": "20%" },
10523
+ * null,
10524
+ * null,
10525
+ * null,
10526
+ * null
10527
+ * ]
10528
+ * } );
10529
+ * } );
10530
+ */
10531
+ "sWidth": null
10532
+ };
10533
+
10534
+
10535
+
10536
+ /**
10537
+ * DataTables settings object - this holds all the information needed for a
10538
+ * given table, including configuration, data and current application of the
10539
+ * table options. DataTables does not have a single instance for each DataTable
10540
+ * with the settings attached to that instance, but rather instances of the
10541
+ * DataTable "class" are created on-the-fly as needed (typically by a
10542
+ * $().dataTable() call) and the settings object is then applied to that
10543
+ * instance.
10544
+ *
10545
+ * Note that this object is related to {@link DataTable.defaults} but this
10546
+ * one is the internal data store for DataTables's cache of columns. It should
10547
+ * NOT be manipulated outside of DataTables. Any configuration should be done
10548
+ * through the initialisation options.
10549
+ * @namespace
10550
+ * @todo Really should attach the settings object to individual instances so we
10551
+ * don't need to create new instances on each $().dataTable() call (if the
10552
+ * table already exists). It would also save passing oSettings around and
10553
+ * into every single function. However, this is a very significant
10554
+ * architecture change for DataTables and will almost certainly break
10555
+ * backwards compatibility with older installations. This is something that
10556
+ * will be done in 2.0.
10557
+ */
10558
+ DataTable.models.oSettings = {
10559
+ /**
10560
+ * Primary features of DataTables and their enablement state.
10561
+ * @namespace
10562
+ */
10563
+ "oFeatures": {
10564
+
10565
+ /**
10566
+ * Flag to say if DataTables should automatically try to calculate the
10567
+ * optimum table and columns widths (true) or not (false).
10568
+ * Note that this parameter will be set by the initialisation routine. To
10569
+ * set a default use {@link DataTable.defaults}.
10570
+ * @type boolean
10571
+ */
10572
+ "bAutoWidth": null,
10573
+
10574
+ /**
10575
+ * Delay the creation of TR and TD elements until they are actually
10576
+ * needed by a driven page draw. This can give a significant speed
10577
+ * increase for Ajax source and Javascript source data, but makes no
10578
+ * difference at all fro DOM and server-side processing tables.
10579
+ * Note that this parameter will be set by the initialisation routine. To
10580
+ * set a default use {@link DataTable.defaults}.
10581
+ * @type boolean
10582
+ */
10583
+ "bDeferRender": null,
10584
+
10585
+ /**
10586
+ * Enable filtering on the table or not. Note that if this is disabled
10587
+ * then there is no filtering at all on the table, including fnFilter.
10588
+ * To just remove the filtering input use sDom and remove the 'f' option.
10589
+ * Note that this parameter will be set by the initialisation routine. To
10590
+ * set a default use {@link DataTable.defaults}.
10591
+ * @type boolean
10592
+ */
10593
+ "bFilter": null,
10594
+
10595
+ /**
10596
+ * Table information element (the 'Showing x of y records' div) enable
10597
+ * flag.
10598
+ * Note that this parameter will be set by the initialisation routine. To
10599
+ * set a default use {@link DataTable.defaults}.
10600
+ * @type boolean
10601
+ */
10602
+ "bInfo": null,
10603
+
10604
+ /**
10605
+ * Present a user control allowing the end user to change the page size
10606
+ * when pagination is enabled.
10607
+ * Note that this parameter will be set by the initialisation routine. To
10608
+ * set a default use {@link DataTable.defaults}.
10609
+ * @type boolean
10610
+ */
10611
+ "bLengthChange": null,
10612
+
10613
+ /**
10614
+ * Pagination enabled or not. Note that if this is disabled then length
10615
+ * changing must also be disabled.
10616
+ * Note that this parameter will be set by the initialisation routine. To
10617
+ * set a default use {@link DataTable.defaults}.
10618
+ * @type boolean
10619
+ */
10620
+ "bPaginate": null,
10621
+
10622
+ /**
10623
+ * Processing indicator enable flag whenever DataTables is enacting a
10624
+ * user request - typically an Ajax request for server-side processing.
10625
+ * Note that this parameter will be set by the initialisation routine. To
10626
+ * set a default use {@link DataTable.defaults}.
10627
+ * @type boolean
10628
+ */
10629
+ "bProcessing": null,
10630
+
10631
+ /**
10632
+ * Server-side processing enabled flag - when enabled DataTables will
10633
+ * get all data from the server for every draw - there is no filtering,
10634
+ * sorting or paging done on the client-side.
10635
+ * Note that this parameter will be set by the initialisation routine. To
10636
+ * set a default use {@link DataTable.defaults}.
10637
+ * @type boolean
10638
+ */
10639
+ "bServerSide": null,
10640
+
10641
+ /**
10642
+ * Sorting enablement flag.
10643
+ * Note that this parameter will be set by the initialisation routine. To
10644
+ * set a default use {@link DataTable.defaults}.
10645
+ * @type boolean
10646
+ */
10647
+ "bSort": null,
10648
+
10649
+ /**
10650
+ * Apply a class to the columns which are being sorted to provide a
10651
+ * visual highlight or not. This can slow things down when enabled since
10652
+ * there is a lot of DOM interaction.
10653
+ * Note that this parameter will be set by the initialisation routine. To
10654
+ * set a default use {@link DataTable.defaults}.
10655
+ * @type boolean
10656
+ */
10657
+ "bSortClasses": null,
10658
+
10659
+ /**
10660
+ * State saving enablement flag.
10661
+ * Note that this parameter will be set by the initialisation routine. To
10662
+ * set a default use {@link DataTable.defaults}.
10663
+ * @type boolean
10664
+ */
10665
+ "bStateSave": null
10666
+ },
10667
+
10668
+
10669
+ /**
10670
+ * Scrolling settings for a table.
10671
+ * @namespace
10672
+ */
10673
+ "oScroll": {
10674
+ /**
10675
+ * Indicate if DataTables should be allowed to set the padding / margin
10676
+ * etc for the scrolling header elements or not. Typically you will want
10677
+ * this.
10678
+ * Note that this parameter will be set by the initialisation routine. To
10679
+ * set a default use {@link DataTable.defaults}.
10680
+ * @type boolean
10681
+ */
10682
+ "bAutoCss": null,
10683
+
10684
+ /**
10685
+ * When the table is shorter in height than sScrollY, collapse the
10686
+ * table container down to the height of the table (when true).
10687
+ * Note that this parameter will be set by the initialisation routine. To
10688
+ * set a default use {@link DataTable.defaults}.
10689
+ * @type boolean
10690
+ */
10691
+ "bCollapse": null,
10692
+
10693
+ /**
10694
+ * Infinite scrolling enablement flag. Now deprecated in favour of
10695
+ * using the Scroller plug-in.
10696
+ * Note that this parameter will be set by the initialisation routine. To
10697
+ * set a default use {@link DataTable.defaults}.
10698
+ * @type boolean
10699
+ */
10700
+ "bInfinite": null,
10701
+
10702
+ /**
10703
+ * Width of the scrollbar for the web-browser's platform. Calculated
10704
+ * during table initialisation.
10705
+ * @type int
10706
+ * @default 0
10707
+ */
10708
+ "iBarWidth": 0,
10709
+
10710
+ /**
10711
+ * Space (in pixels) between the bottom of the scrolling container and
10712
+ * the bottom of the scrolling viewport before the next page is loaded
10713
+ * when using infinite scrolling.
10714
+ * Note that this parameter will be set by the initialisation routine. To
10715
+ * set a default use {@link DataTable.defaults}.
10716
+ * @type int
10717
+ */
10718
+ "iLoadGap": null,
10719
+
10720
+ /**
10721
+ * Viewport width for horizontal scrolling. Horizontal scrolling is
10722
+ * disabled if an empty string.
10723
+ * Note that this parameter will be set by the initialisation routine. To
10724
+ * set a default use {@link DataTable.defaults}.
10725
+ * @type string
10726
+ */
10727
+ "sX": null,
10728
+
10729
+ /**
10730
+ * Width to expand the table to when using x-scrolling. Typically you
10731
+ * should not need to use this.
10732
+ * Note that this parameter will be set by the initialisation routine. To
10733
+ * set a default use {@link DataTable.defaults}.
10734
+ * @type string
10735
+ * @deprecated
10736
+ */
10737
+ "sXInner": null,
10738
+
10739
+ /**
10740
+ * Viewport height for vertical scrolling. Vertical scrolling is disabled
10741
+ * if an empty string.
10742
+ * Note that this parameter will be set by the initialisation routine. To
10743
+ * set a default use {@link DataTable.defaults}.
10744
+ * @type string
10745
+ */
10746
+ "sY": null
10747
+ },
10748
+
10749
+ /**
10750
+ * Language information for the table.
10751
+ * @namespace
10752
+ * @extends DataTable.defaults.oLanguage
10753
+ */
10754
+ "oLanguage": {
10755
+ /**
10756
+ * Information callback function. See
10757
+ * {@link DataTable.defaults.fnInfoCallback}
10758
+ * @type function
10759
+ * @default null
10760
+ */
10761
+ "fnInfoCallback": null
10762
+ },
10763
+
10764
+ /**
10765
+ * Browser support parameters
10766
+ * @namespace
10767
+ */
10768
+ "oBrowser": {
10769
+ /**
10770
+ * Indicate if the browser incorrectly calculates width:100% inside a
10771
+ * scrolling element (IE6/7)
10772
+ * @type boolean
10773
+ * @default false
10774
+ */
10775
+ "bScrollOversize": false
10776
+ },
10777
+
10778
+ /**
10779
+ * Array referencing the nodes which are used for the features. The
10780
+ * parameters of this object match what is allowed by sDom - i.e.
10781
+ * <ul>
10782
+ * <li>'l' - Length changing</li>
10783
+ * <li>'f' - Filtering input</li>
10784
+ * <li>'t' - The table!</li>
10785
+ * <li>'i' - Information</li>
10786
+ * <li>'p' - Pagination</li>
10787
+ * <li>'r' - pRocessing</li>
10788
+ * </ul>
10789
+ * @type array
10790
+ * @default []
10791
+ */
10792
+ "aanFeatures": [],
10793
+
10794
+ /**
10795
+ * Store data information - see {@link DataTable.models.oRow} for detailed
10796
+ * information.
10797
+ * @type array
10798
+ * @default []
10799
+ */
10800
+ "aoData": [],
10801
+
10802
+ /**
10803
+ * Array of indexes which are in the current display (after filtering etc)
10804
+ * @type array
10805
+ * @default []
10806
+ */
10807
+ "aiDisplay": [],
10808
+
10809
+ /**
10810
+ * Array of indexes for display - no filtering
10811
+ * @type array
10812
+ * @default []
10813
+ */
10814
+ "aiDisplayMaster": [],
10815
+
10816
+ /**
10817
+ * Store information about each column that is in use
10818
+ * @type array
10819
+ * @default []
10820
+ */
10821
+ "aoColumns": [],
10822
+
10823
+ /**
10824
+ * Store information about the table's header
10825
+ * @type array
10826
+ * @default []
10827
+ */
10828
+ "aoHeader": [],
10829
+
10830
+ /**
10831
+ * Store information about the table's footer
10832
+ * @type array
10833
+ * @default []
10834
+ */
10835
+ "aoFooter": [],
10836
+
10837
+ /**
10838
+ * Search data array for regular expression searching
10839
+ * @type array
10840
+ * @default []
10841
+ */
10842
+ "asDataSearch": [],
10843
+
10844
+ /**
10845
+ * Store the applied global search information in case we want to force a
10846
+ * research or compare the old search to a new one.
10847
+ * Note that this parameter will be set by the initialisation routine. To
10848
+ * set a default use {@link DataTable.defaults}.
10849
+ * @namespace
10850
+ * @extends DataTable.models.oSearch
10851
+ */
10852
+ "oPreviousSearch": {},
10853
+
10854
+ /**
10855
+ * Store the applied search for each column - see
10856
+ * {@link DataTable.models.oSearch} for the format that is used for the
10857
+ * filtering information for each column.
10858
+ * @type array
10859
+ * @default []
10860
+ */
10861
+ "aoPreSearchCols": [],
10862
+
10863
+ /**
10864
+ * Sorting that is applied to the table. Note that the inner arrays are
10865
+ * used in the following manner:
10866
+ * <ul>
10867
+ * <li>Index 0 - column number</li>
10868
+ * <li>Index 1 - current sorting direction</li>
10869
+ * <li>Index 2 - index of asSorting for this column</li>
10870
+ * </ul>
10871
+ * Note that this parameter will be set by the initialisation routine. To
10872
+ * set a default use {@link DataTable.defaults}.
10873
+ * @type array
10874
+ * @todo These inner arrays should really be objects
10875
+ */
10876
+ "aaSorting": null,
10877
+
10878
+ /**
10879
+ * Sorting that is always applied to the table (i.e. prefixed in front of
10880
+ * aaSorting).
10881
+ * Note that this parameter will be set by the initialisation routine. To
10882
+ * set a default use {@link DataTable.defaults}.
10883
+ * @type array|null
10884
+ * @default null
10885
+ */
10886
+ "aaSortingFixed": null,
10887
+
10888
+ /**
10889
+ * Classes to use for the striping of a table.
10890
+ * Note that this parameter will be set by the initialisation routine. To
10891
+ * set a default use {@link DataTable.defaults}.
10892
+ * @type array
10893
+ * @default []
10894
+ */
10895
+ "asStripeClasses": null,
10896
+
10897
+ /**
10898
+ * If restoring a table - we should restore its striping classes as well
10899
+ * @type array
10900
+ * @default []
10901
+ */
10902
+ "asDestroyStripes": [],
10903
+
10904
+ /**
10905
+ * If restoring a table - we should restore its width
10906
+ * @type int
10907
+ * @default 0
10908
+ */
10909
+ "sDestroyWidth": 0,
10910
+
10911
+ /**
10912
+ * Callback functions array for every time a row is inserted (i.e. on a draw).
10913
+ * @type array
10914
+ * @default []
10915
+ */
10916
+ "aoRowCallback": [],
10917
+
10918
+ /**
10919
+ * Callback functions for the header on each draw.
10920
+ * @type array
10921
+ * @default []
10922
+ */
10923
+ "aoHeaderCallback": [],
10924
+
10925
+ /**
10926
+ * Callback function for the footer on each draw.
10927
+ * @type array
10928
+ * @default []
10929
+ */
10930
+ "aoFooterCallback": [],
10931
+
10932
+ /**
10933
+ * Array of callback functions for draw callback functions
10934
+ * @type array
10935
+ * @default []
10936
+ */
10937
+ "aoDrawCallback": [],
10938
+
10939
+ /**
10940
+ * Array of callback functions for row created function
10941
+ * @type array
10942
+ * @default []
10943
+ */
10944
+ "aoRowCreatedCallback": [],
10945
+
10946
+ /**
10947
+ * Callback functions for just before the table is redrawn. A return of
10948
+ * false will be used to cancel the draw.
10949
+ * @type array
10950
+ * @default []
10951
+ */
10952
+ "aoPreDrawCallback": [],
10953
+
10954
+ /**
10955
+ * Callback functions for when the table has been initialised.
10956
+ * @type array
10957
+ * @default []
10958
+ */
10959
+ "aoInitComplete": [],
10960
+
10961
+
10962
+ /**
10963
+ * Callbacks for modifying the settings to be stored for state saving, prior to
10964
+ * saving state.
10965
+ * @type array
10966
+ * @default []
10967
+ */
10968
+ "aoStateSaveParams": [],
10969
+
10970
+ /**
10971
+ * Callbacks for modifying the settings that have been stored for state saving
10972
+ * prior to using the stored values to restore the state.
10973
+ * @type array
10974
+ * @default []
10975
+ */
10976
+ "aoStateLoadParams": [],
10977
+
10978
+ /**
10979
+ * Callbacks for operating on the settings object once the saved state has been
10980
+ * loaded
10981
+ * @type array
10982
+ * @default []
10983
+ */
10984
+ "aoStateLoaded": [],
10985
+
10986
+ /**
10987
+ * Cache the table ID for quick access
10988
+ * @type string
10989
+ * @default <i>Empty string</i>
10990
+ */
10991
+ "sTableId": "",
10992
+
10993
+ /**
10994
+ * The TABLE node for the main table
10995
+ * @type node
10996
+ * @default null
10997
+ */
10998
+ "nTable": null,
10999
+
11000
+ /**
11001
+ * Permanent ref to the thead element
11002
+ * @type node
11003
+ * @default null
11004
+ */
11005
+ "nTHead": null,
11006
+
11007
+ /**
11008
+ * Permanent ref to the tfoot element - if it exists
11009
+ * @type node
11010
+ * @default null
11011
+ */
11012
+ "nTFoot": null,
11013
+
11014
+ /**
11015
+ * Permanent ref to the tbody element
11016
+ * @type node
11017
+ * @default null
11018
+ */
11019
+ "nTBody": null,
11020
+
11021
+ /**
11022
+ * Cache the wrapper node (contains all DataTables controlled elements)
11023
+ * @type node
11024
+ * @default null
11025
+ */
11026
+ "nTableWrapper": null,
11027
+
11028
+ /**
11029
+ * Indicate if when using server-side processing the loading of data
11030
+ * should be deferred until the second draw.
11031
+ * Note that this parameter will be set by the initialisation routine. To
11032
+ * set a default use {@link DataTable.defaults}.
11033
+ * @type boolean
11034
+ * @default false
11035
+ */
11036
+ "bDeferLoading": false,
11037
+
11038
+ /**
11039
+ * Indicate if all required information has been read in
11040
+ * @type boolean
11041
+ * @default false
11042
+ */
11043
+ "bInitialised": false,
11044
+
11045
+ /**
11046
+ * Information about open rows. Each object in the array has the parameters
11047
+ * 'nTr' and 'nParent'
11048
+ * @type array
11049
+ * @default []
11050
+ */
11051
+ "aoOpenRows": [],
11052
+
11053
+ /**
11054
+ * Dictate the positioning of DataTables' control elements - see
11055
+ * {@link DataTable.model.oInit.sDom}.
11056
+ * Note that this parameter will be set by the initialisation routine. To
11057
+ * set a default use {@link DataTable.defaults}.
11058
+ * @type string
11059
+ * @default null
11060
+ */
11061
+ "sDom": null,
11062
+
11063
+ /**
11064
+ * Which type of pagination should be used.
11065
+ * Note that this parameter will be set by the initialisation routine. To
11066
+ * set a default use {@link DataTable.defaults}.
11067
+ * @type string
11068
+ * @default two_button
11069
+ */
11070
+ "sPaginationType": "two_button",
11071
+
11072
+ /**
11073
+ * The cookie duration (for bStateSave) in seconds.
11074
+ * Note that this parameter will be set by the initialisation routine. To
11075
+ * set a default use {@link DataTable.defaults}.
11076
+ * @type int
11077
+ * @default 0
11078
+ */
11079
+ "iCookieDuration": 0,
11080
+
11081
+ /**
11082
+ * The cookie name prefix.
11083
+ * Note that this parameter will be set by the initialisation routine. To
11084
+ * set a default use {@link DataTable.defaults}.
11085
+ * @type string
11086
+ * @default <i>Empty string</i>
11087
+ */
11088
+ "sCookiePrefix": "",
11089
+
11090
+ /**
11091
+ * Callback function for cookie creation.
11092
+ * Note that this parameter will be set by the initialisation routine. To
11093
+ * set a default use {@link DataTable.defaults}.
11094
+ * @type function
11095
+ * @default null
11096
+ */
11097
+ "fnCookieCallback": null,
11098
+
11099
+ /**
11100
+ * Array of callback functions for state saving. Each array element is an
11101
+ * object with the following parameters:
11102
+ * <ul>
11103
+ * <li>function:fn - function to call. Takes two parameters, oSettings
11104
+ * and the JSON string to save that has been thus far created. Returns
11105
+ * a JSON string to be inserted into a json object
11106
+ * (i.e. '"param": [ 0, 1, 2]')</li>
11107
+ * <li>string:sName - name of callback</li>
11108
+ * </ul>
11109
+ * @type array
11110
+ * @default []
11111
+ */
11112
+ "aoStateSave": [],
11113
+
11114
+ /**
11115
+ * Array of callback functions for state loading. Each array element is an
11116
+ * object with the following parameters:
11117
+ * <ul>
11118
+ * <li>function:fn - function to call. Takes two parameters, oSettings
11119
+ * and the object stored. May return false to cancel state loading</li>
11120
+ * <li>string:sName - name of callback</li>
11121
+ * </ul>
11122
+ * @type array
11123
+ * @default []
11124
+ */
11125
+ "aoStateLoad": [],
11126
+
11127
+ /**
11128
+ * State that was loaded from the cookie. Useful for back reference
11129
+ * @type object
11130
+ * @default null
11131
+ */
11132
+ "oLoadedState": null,
11133
+
11134
+ /**
11135
+ * Source url for AJAX data for the table.
11136
+ * Note that this parameter will be set by the initialisation routine. To
11137
+ * set a default use {@link DataTable.defaults}.
11138
+ * @type string
11139
+ * @default null
11140
+ */
11141
+ "sAjaxSource": null,
11142
+
11143
+ /**
11144
+ * Property from a given object from which to read the table data from. This
11145
+ * can be an empty string (when not server-side processing), in which case
11146
+ * it is assumed an an array is given directly.
11147
+ * Note that this parameter will be set by the initialisation routine. To
11148
+ * set a default use {@link DataTable.defaults}.
11149
+ * @type string
11150
+ */
11151
+ "sAjaxDataProp": null,
11152
+
11153
+ /**
11154
+ * Note if draw should be blocked while getting data
11155
+ * @type boolean
11156
+ * @default true
11157
+ */
11158
+ "bAjaxDataGet": true,
11159
+
11160
+ /**
11161
+ * The last jQuery XHR object that was used for server-side data gathering.
11162
+ * This can be used for working with the XHR information in one of the
11163
+ * callbacks
11164
+ * @type object
11165
+ * @default null
11166
+ */
11167
+ "jqXHR": null,
11168
+
11169
+ /**
11170
+ * Function to get the server-side data.
11171
+ * Note that this parameter will be set by the initialisation routine. To
11172
+ * set a default use {@link DataTable.defaults}.
11173
+ * @type function
11174
+ */
11175
+ "fnServerData": null,
11176
+
11177
+ /**
11178
+ * Functions which are called prior to sending an Ajax request so extra
11179
+ * parameters can easily be sent to the server
11180
+ * @type array
11181
+ * @default []
11182
+ */
11183
+ "aoServerParams": [],
11184
+
11185
+ /**
11186
+ * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
11187
+ * required).
11188
+ * Note that this parameter will be set by the initialisation routine. To
11189
+ * set a default use {@link DataTable.defaults}.
11190
+ * @type string
11191
+ */
11192
+ "sServerMethod": null,
11193
+
11194
+ /**
11195
+ * Format numbers for display.
11196
+ * Note that this parameter will be set by the initialisation routine. To
11197
+ * set a default use {@link DataTable.defaults}.
11198
+ * @type function
11199
+ */
11200
+ "fnFormatNumber": null,
11201
+
11202
+ /**
11203
+ * List of options that can be used for the user selectable length menu.
11204
+ * Note that this parameter will be set by the initialisation routine. To
11205
+ * set a default use {@link DataTable.defaults}.
11206
+ * @type array
11207
+ * @default []
11208
+ */
11209
+ "aLengthMenu": null,
11210
+
11211
+ /**
11212
+ * Counter for the draws that the table does. Also used as a tracker for
11213
+ * server-side processing
11214
+ * @type int
11215
+ * @default 0
11216
+ */
11217
+ "iDraw": 0,
11218
+
11219
+ /**
11220
+ * Indicate if a redraw is being done - useful for Ajax
11221
+ * @type boolean
11222
+ * @default false
11223
+ */
11224
+ "bDrawing": false,
11225
+
11226
+ /**
11227
+ * Draw index (iDraw) of the last error when parsing the returned data
11228
+ * @type int
11229
+ * @default -1
11230
+ */
11231
+ "iDrawError": -1,
11232
+
11233
+ /**
11234
+ * Paging display length
11235
+ * @type int
11236
+ * @default 10
11237
+ */
11238
+ "_iDisplayLength": 10,
11239
+
11240
+ /**
11241
+ * Paging start point - aiDisplay index
11242
+ * @type int
11243
+ * @default 0
11244
+ */
11245
+ "_iDisplayStart": 0,
11246
+
11247
+ /**
11248
+ * Paging end point - aiDisplay index. Use fnDisplayEnd rather than
11249
+ * this property to get the end point
11250
+ * @type int
11251
+ * @default 10
11252
+ * @private
11253
+ */
11254
+ "_iDisplayEnd": 10,
11255
+
11256
+ /**
11257
+ * Server-side processing - number of records in the result set
11258
+ * (i.e. before filtering), Use fnRecordsTotal rather than
11259
+ * this property to get the value of the number of records, regardless of
11260
+ * the server-side processing setting.
11261
+ * @type int
11262
+ * @default 0
11263
+ * @private
11264
+ */
11265
+ "_iRecordsTotal": 0,
11266
+
11267
+ /**
11268
+ * Server-side processing - number of records in the current display set
11269
+ * (i.e. after filtering). Use fnRecordsDisplay rather than
11270
+ * this property to get the value of the number of records, regardless of
11271
+ * the server-side processing setting.
11272
+ * @type boolean
11273
+ * @default 0
11274
+ * @private
11275
+ */
11276
+ "_iRecordsDisplay": 0,
11277
+
11278
+ /**
11279
+ * Flag to indicate if jQuery UI marking and classes should be used.
11280
+ * Note that this parameter will be set by the initialisation routine. To
11281
+ * set a default use {@link DataTable.defaults}.
11282
+ * @type boolean
11283
+ */
11284
+ "bJUI": null,
11285
+
11286
+ /**
11287
+ * The classes to use for the table
11288
+ * @type object
11289
+ * @default {}
11290
+ */
11291
+ "oClasses": {},
11292
+
11293
+ /**
11294
+ * Flag attached to the settings object so you can check in the draw
11295
+ * callback if filtering has been done in the draw. Deprecated in favour of
11296
+ * events.
11297
+ * @type boolean
11298
+ * @default false
11299
+ * @deprecated
11300
+ */
11301
+ "bFiltered": false,
11302
+
11303
+ /**
11304
+ * Flag attached to the settings object so you can check in the draw
11305
+ * callback if sorting has been done in the draw. Deprecated in favour of
11306
+ * events.
11307
+ * @type boolean
11308
+ * @default false
11309
+ * @deprecated
11310
+ */
11311
+ "bSorted": false,
11312
+
11313
+ /**
11314
+ * Indicate that if multiple rows are in the header and there is more than
11315
+ * one unique cell per column, if the top one (true) or bottom one (false)
11316
+ * should be used for sorting / title by DataTables.
11317
+ * Note that this parameter will be set by the initialisation routine. To
11318
+ * set a default use {@link DataTable.defaults}.
11319
+ * @type boolean
11320
+ */
11321
+ "bSortCellsTop": null,
11322
+
11323
+ /**
11324
+ * Initialisation object that is used for the table
11325
+ * @type object
11326
+ * @default null
11327
+ */
11328
+ "oInit": null,
11329
+
11330
+ /**
11331
+ * Destroy callback functions - for plug-ins to attach themselves to the
11332
+ * destroy so they can clean up markup and events.
11333
+ * @type array
11334
+ * @default []
11335
+ */
11336
+ "aoDestroyCallback": [],
11337
+
11338
+
11339
+ /**
11340
+ * Get the number of records in the current record set, before filtering
11341
+ * @type function
11342
+ */
11343
+ "fnRecordsTotal": function ()
11344
+ {
11345
+ if ( this.oFeatures.bServerSide ) {
11346
+ return parseInt(this._iRecordsTotal, 10);
11347
+ } else {
11348
+ return this.aiDisplayMaster.length;
11349
+ }
11350
+ },
11351
+
11352
+ /**
11353
+ * Get the number of records in the current record set, after filtering
11354
+ * @type function
11355
+ */
11356
+ "fnRecordsDisplay": function ()
11357
+ {
11358
+ if ( this.oFeatures.bServerSide ) {
11359
+ return parseInt(this._iRecordsDisplay, 10);
11360
+ } else {
11361
+ return this.aiDisplay.length;
11362
+ }
11363
+ },
11364
+
11365
+ /**
11366
+ * Set the display end point - aiDisplay index
11367
+ * @type function
11368
+ * @todo Should do away with _iDisplayEnd and calculate it on-the-fly here
11369
+ */
11370
+ "fnDisplayEnd": function ()
11371
+ {
11372
+ if ( this.oFeatures.bServerSide ) {
11373
+ if ( this.oFeatures.bPaginate === false || this._iDisplayLength == -1 ) {
11374
+ return this._iDisplayStart+this.aiDisplay.length;
11375
+ } else {
11376
+ return Math.min( this._iDisplayStart+this._iDisplayLength,
11377
+ this._iRecordsDisplay );
11378
+ }
11379
+ } else {
11380
+ return this._iDisplayEnd;
11381
+ }
11382
+ },
11383
+
11384
+ /**
11385
+ * The DataTables object for this table
11386
+ * @type object
11387
+ * @default null
11388
+ */
11389
+ "oInstance": null,
11390
+
11391
+ /**
11392
+ * Unique identifier for each instance of the DataTables object. If there
11393
+ * is an ID on the table node, then it takes that value, otherwise an
11394
+ * incrementing internal counter is used.
11395
+ * @type string
11396
+ * @default null
11397
+ */
11398
+ "sInstance": null,
11399
+
11400
+ /**
11401
+ * tabindex attribute value that is added to DataTables control elements, allowing
11402
+ * keyboard navigation of the table and its controls.
11403
+ */
11404
+ "iTabIndex": 0,
11405
+
11406
+ /**
11407
+ * DIV container for the footer scrolling table if scrolling
11408
+ */
11409
+ "nScrollHead": null,
11410
+
11411
+ /**
11412
+ * DIV container for the footer scrolling table if scrolling
11413
+ */
11414
+ "nScrollFoot": null
11415
+ };
11416
+
11417
+ /**
11418
+ * Extension object for DataTables that is used to provide all extension options.
11419
+ *
11420
+ * Note that the <i>DataTable.ext</i> object is available through
11421
+ * <i>jQuery.fn.dataTable.ext</i> where it may be accessed and manipulated. It is
11422
+ * also aliased to <i>jQuery.fn.dataTableExt</i> for historic reasons.
11423
+ * @namespace
11424
+ * @extends DataTable.models.ext
11425
+ */
11426
+ DataTable.ext = $.extend( true, {}, DataTable.models.ext );
11427
+
11428
+ $.extend( DataTable.ext.oStdClasses, {
11429
+ "sTable": "dataTable",
11430
+
11431
+ /* Two buttons buttons */
11432
+ "sPagePrevEnabled": "paginate_enabled_previous",
11433
+ "sPagePrevDisabled": "paginate_disabled_previous",
11434
+ "sPageNextEnabled": "paginate_enabled_next",
11435
+ "sPageNextDisabled": "paginate_disabled_next",
11436
+ "sPageJUINext": "",
11437
+ "sPageJUIPrev": "",
11438
+
11439
+ /* Full numbers paging buttons */
11440
+ "sPageButton": "paginate_button",
11441
+ "sPageButtonActive": "paginate_active",
11442
+ "sPageButtonStaticDisabled": "paginate_button paginate_button_disabled",
11443
+ "sPageFirst": "first",
11444
+ "sPagePrevious": "previous",
11445
+ "sPageNext": "next",
11446
+ "sPageLast": "last",
11447
+
11448
+ /* Striping classes */
11449
+ "sStripeOdd": "odd",
11450
+ "sStripeEven": "even",
11451
+
11452
+ /* Empty row */
11453
+ "sRowEmpty": "dataTables_empty",
11454
+
11455
+ /* Features */
11456
+ "sWrapper": "dataTables_wrapper",
11457
+ "sFilter": "dataTables_filter",
11458
+ "sInfo": "dataTables_info",
11459
+ "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
11460
+ "sLength": "dataTables_length",
11461
+ "sProcessing": "dataTables_processing",
11462
+
11463
+ /* Sorting */
11464
+ "sSortAsc": "sorting_asc",
11465
+ "sSortDesc": "sorting_desc",
11466
+ "sSortable": "sorting", /* Sortable in both directions */
11467
+ "sSortableAsc": "sorting_asc_disabled",
11468
+ "sSortableDesc": "sorting_desc_disabled",
11469
+ "sSortableNone": "sorting_disabled",
11470
+ "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
11471
+ "sSortJUIAsc": "",
11472
+ "sSortJUIDesc": "",
11473
+ "sSortJUI": "",
11474
+ "sSortJUIAscAllowed": "",
11475
+ "sSortJUIDescAllowed": "",
11476
+ "sSortJUIWrapper": "",
11477
+ "sSortIcon": "",
11478
+
11479
+ /* Scrolling */
11480
+ "sScrollWrapper": "dataTables_scroll",
11481
+ "sScrollHead": "dataTables_scrollHead",
11482
+ "sScrollHeadInner": "dataTables_scrollHeadInner",
11483
+ "sScrollBody": "dataTables_scrollBody",
11484
+ "sScrollFoot": "dataTables_scrollFoot",
11485
+ "sScrollFootInner": "dataTables_scrollFootInner",
11486
+
11487
+ /* Misc */
11488
+ "sFooterTH": "",
11489
+ "sJUIHeader": "",
11490
+ "sJUIFooter": ""
11491
+ } );
11492
+
11493
+
11494
+ $.extend( DataTable.ext.oJUIClasses, DataTable.ext.oStdClasses, {
11495
+ /* Two buttons buttons */
11496
+ "sPagePrevEnabled": "fg-button ui-button ui-state-default ui-corner-left",
11497
+ "sPagePrevDisabled": "fg-button ui-button ui-state-default ui-corner-left ui-state-disabled",
11498
+ "sPageNextEnabled": "fg-button ui-button ui-state-default ui-corner-right",
11499
+ "sPageNextDisabled": "fg-button ui-button ui-state-default ui-corner-right ui-state-disabled",
11500
+ "sPageJUINext": "ui-icon ui-icon-circle-arrow-e",
11501
+ "sPageJUIPrev": "ui-icon ui-icon-circle-arrow-w",
11502
+
11503
+ /* Full numbers paging buttons */
11504
+ "sPageButton": "fg-button ui-button ui-state-default",
11505
+ "sPageButtonActive": "fg-button ui-button ui-state-default ui-state-disabled",
11506
+ "sPageButtonStaticDisabled": "fg-button ui-button ui-state-default ui-state-disabled",
11507
+ "sPageFirst": "first ui-corner-tl ui-corner-bl",
11508
+ "sPageLast": "last ui-corner-tr ui-corner-br",
11509
+
11510
+ /* Features */
11511
+ "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
11512
+ "ui-buttonset-multi paging_", /* Note that the type is postfixed */
11513
+
11514
+ /* Sorting */
11515
+ "sSortAsc": "ui-state-default",
11516
+ "sSortDesc": "ui-state-default",
11517
+ "sSortable": "ui-state-default",
11518
+ "sSortableAsc": "ui-state-default",
11519
+ "sSortableDesc": "ui-state-default",
11520
+ "sSortableNone": "ui-state-default",
11521
+ "sSortJUIAsc": "css_right ui-icon ui-icon-triangle-1-n",
11522
+ "sSortJUIDesc": "css_right ui-icon ui-icon-triangle-1-s",
11523
+ "sSortJUI": "css_right ui-icon ui-icon-carat-2-n-s",
11524
+ "sSortJUIAscAllowed": "css_right ui-icon ui-icon-carat-1-n",
11525
+ "sSortJUIDescAllowed": "css_right ui-icon ui-icon-carat-1-s",
11526
+ "sSortJUIWrapper": "DataTables_sort_wrapper",
11527
+ "sSortIcon": "DataTables_sort_icon",
11528
+
11529
+ /* Scrolling */
11530
+ "sScrollHead": "dataTables_scrollHead ui-state-default",
11531
+ "sScrollFoot": "dataTables_scrollFoot ui-state-default",
11532
+
11533
+ /* Misc */
11534
+ "sFooterTH": "ui-state-default",
11535
+ "sJUIHeader": "fg-toolbar ui-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix",
11536
+ "sJUIFooter": "fg-toolbar ui-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix"
11537
+ } );
11538
+
11539
+ /*
11540
+ * Variable: oPagination
11541
+ * Purpose:
11542
+ * Scope: jQuery.fn.dataTableExt
11543
+ */
11544
+ $.extend( DataTable.ext.oPagination, {
11545
+ /*
11546
+ * Variable: two_button
11547
+ * Purpose: Standard two button (forward/back) pagination
11548
+ * Scope: jQuery.fn.dataTableExt.oPagination
11549
+ */
11550
+ "two_button": {
11551
+ /*
11552
+ * Function: oPagination.two_button.fnInit
11553
+ * Purpose: Initialise dom elements required for pagination with forward/back buttons only
11554
+ * Returns: -
11555
+ * Inputs: object:oSettings - dataTables settings object
11556
+ * node:nPaging - the DIV which contains this pagination control
11557
+ * function:fnCallbackDraw - draw function which must be called on update
11558
+ */
11559
+ "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
11560
+ {
11561
+ var oLang = oSettings.oLanguage.oPaginate;
11562
+ var oClasses = oSettings.oClasses;
11563
+ var fnClickHandler = function ( e ) {
11564
+ if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
11565
+ {
11566
+ fnCallbackDraw( oSettings );
11567
+ }
11568
+ };
11569
+
11570
+ var sAppend = (!oSettings.bJUI) ?
11571
+ '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sPrevious+'</a>'+
11572
+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button">'+oLang.sNext+'</a>'
11573
+ :
11574
+ '<a class="'+oSettings.oClasses.sPagePrevDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUIPrev+'"></span></a>'+
11575
+ '<a class="'+oSettings.oClasses.sPageNextDisabled+'" tabindex="'+oSettings.iTabIndex+'" role="button"><span class="'+oSettings.oClasses.sPageJUINext+'"></span></a>';
11576
+ $(nPaging).append( sAppend );
11577
+
11578
+ var els = $('a', nPaging);
11579
+ var nPrevious = els[0],
11580
+ nNext = els[1];
11581
+
11582
+ oSettings.oApi._fnBindAction( nPrevious, {action: "previous"}, fnClickHandler );
11583
+ oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler );
11584
+
11585
+ /* ID the first elements only */
11586
+ if ( !oSettings.aanFeatures.p )
11587
+ {
11588
+ nPaging.id = oSettings.sTableId+'_paginate';
11589
+ nPrevious.id = oSettings.sTableId+'_previous';
11590
+ nNext.id = oSettings.sTableId+'_next';
11591
+
11592
+ nPrevious.setAttribute('aria-controls', oSettings.sTableId);
11593
+ nNext.setAttribute('aria-controls', oSettings.sTableId);
11594
+ }
11595
+ },
11596
+
11597
+ /*
11598
+ * Function: oPagination.two_button.fnUpdate
11599
+ * Purpose: Update the two button pagination at the end of the draw
11600
+ * Returns: -
11601
+ * Inputs: object:oSettings - dataTables settings object
11602
+ * function:fnCallbackDraw - draw function to call on page change
11603
+ */
11604
+ "fnUpdate": function ( oSettings, fnCallbackDraw )
11605
+ {
11606
+ if ( !oSettings.aanFeatures.p )
11607
+ {
11608
+ return;
11609
+ }
11610
+
11611
+ var oClasses = oSettings.oClasses;
11612
+ var an = oSettings.aanFeatures.p;
11613
+ var nNode;
11614
+
11615
+ /* Loop over each instance of the pager */
11616
+ for ( var i=0, iLen=an.length ; i<iLen ; i++ )
11617
+ {
11618
+ nNode = an[i].firstChild;
11619
+ if ( nNode )
11620
+ {
11621
+ /* Previous page */
11622
+ nNode.className = ( oSettings._iDisplayStart === 0 ) ?
11623
+ oClasses.sPagePrevDisabled : oClasses.sPagePrevEnabled;
11624
+
11625
+ /* Next page */
11626
+ nNode = nNode.nextSibling;
11627
+ nNode.className = ( oSettings.fnDisplayEnd() == oSettings.fnRecordsDisplay() ) ?
11628
+ oClasses.sPageNextDisabled : oClasses.sPageNextEnabled;
11629
+ }
11630
+ }
11631
+ }
11632
+ },
11633
+
11634
+
11635
+ /*
11636
+ * Variable: iFullNumbersShowPages
11637
+ * Purpose: Change the number of pages which can be seen
11638
+ * Scope: jQuery.fn.dataTableExt.oPagination
11639
+ */
11640
+ "iFullNumbersShowPages": 5,
11641
+
11642
+ /*
11643
+ * Variable: full_numbers
11644
+ * Purpose: Full numbers pagination
11645
+ * Scope: jQuery.fn.dataTableExt.oPagination
11646
+ */
11647
+ "full_numbers": {
11648
+ /*
11649
+ * Function: oPagination.full_numbers.fnInit
11650
+ * Purpose: Initialise dom elements required for pagination with a list of the pages
11651
+ * Returns: -
11652
+ * Inputs: object:oSettings - dataTables settings object
11653
+ * node:nPaging - the DIV which contains this pagination control
11654
+ * function:fnCallbackDraw - draw function which must be called on update
11655
+ */
11656
+ "fnInit": function ( oSettings, nPaging, fnCallbackDraw )
11657
+ {
11658
+ var oLang = oSettings.oLanguage.oPaginate;
11659
+ var oClasses = oSettings.oClasses;
11660
+ var fnClickHandler = function ( e ) {
11661
+ if ( oSettings.oApi._fnPageChange( oSettings, e.data.action ) )
11662
+ {
11663
+ fnCallbackDraw( oSettings );
11664
+ }
11665
+ };
11666
+
11667
+ $(nPaging).append(
11668
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageFirst+'">'+oLang.sFirst+'</a>'+
11669
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPagePrevious+'">'+oLang.sPrevious+'</a>'+
11670
+ '<span></span>'+
11671
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageNext+'">'+oLang.sNext+'</a>'+
11672
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+" "+oClasses.sPageLast+'">'+oLang.sLast+'</a>'
11673
+ );
11674
+ var els = $('a', nPaging);
11675
+ var nFirst = els[0],
11676
+ nPrev = els[1],
11677
+ nNext = els[2],
11678
+ nLast = els[3];
11679
+
11680
+ oSettings.oApi._fnBindAction( nFirst, {action: "first"}, fnClickHandler );
11681
+ oSettings.oApi._fnBindAction( nPrev, {action: "previous"}, fnClickHandler );
11682
+ oSettings.oApi._fnBindAction( nNext, {action: "next"}, fnClickHandler );
11683
+ oSettings.oApi._fnBindAction( nLast, {action: "last"}, fnClickHandler );
11684
+
11685
+ /* ID the first elements only */
11686
+ if ( !oSettings.aanFeatures.p )
11687
+ {
11688
+ nPaging.id = oSettings.sTableId+'_paginate';
11689
+ nFirst.id =oSettings.sTableId+'_first';
11690
+ nPrev.id =oSettings.sTableId+'_previous';
11691
+ nNext.id =oSettings.sTableId+'_next';
11692
+ nLast.id =oSettings.sTableId+'_last';
11693
+ }
11694
+ },
11695
+
11696
+ /*
11697
+ * Function: oPagination.full_numbers.fnUpdate
11698
+ * Purpose: Update the list of page buttons shows
11699
+ * Returns: -
11700
+ * Inputs: object:oSettings - dataTables settings object
11701
+ * function:fnCallbackDraw - draw function to call on page change
11702
+ */
11703
+ "fnUpdate": function ( oSettings, fnCallbackDraw )
11704
+ {
11705
+ if ( !oSettings.aanFeatures.p )
11706
+ {
11707
+ return;
11708
+ }
11709
+
11710
+ var iPageCount = DataTable.ext.oPagination.iFullNumbersShowPages;
11711
+ var iPageCountHalf = Math.floor(iPageCount / 2);
11712
+ var iPages = Math.ceil((oSettings.fnRecordsDisplay()) / oSettings._iDisplayLength);
11713
+ var iCurrentPage = Math.ceil(oSettings._iDisplayStart / oSettings._iDisplayLength) + 1;
11714
+ var sList = "";
11715
+ var iStartButton, iEndButton, i, iLen;
11716
+ var oClasses = oSettings.oClasses;
11717
+ var anButtons, anStatic, nPaginateList, nNode;
11718
+ var an = oSettings.aanFeatures.p;
11719
+ var fnBind = function (j) {
11720
+ oSettings.oApi._fnBindAction( this, {"page": j+iStartButton-1}, function(e) {
11721
+ /* Use the information in the element to jump to the required page */
11722
+ oSettings.oApi._fnPageChange( oSettings, e.data.page );
11723
+ fnCallbackDraw( oSettings );
11724
+ e.preventDefault();
11725
+ } );
11726
+ };
11727
+
11728
+ /* Pages calculation */
11729
+ if ( oSettings._iDisplayLength === -1 )
11730
+ {
11731
+ iStartButton = 1;
11732
+ iEndButton = 1;
11733
+ iCurrentPage = 1;
11734
+ }
11735
+ else if (iPages < iPageCount)
11736
+ {
11737
+ iStartButton = 1;
11738
+ iEndButton = iPages;
11739
+ }
11740
+ else if (iCurrentPage <= iPageCountHalf)
11741
+ {
11742
+ iStartButton = 1;
11743
+ iEndButton = iPageCount;
11744
+ }
11745
+ else if (iCurrentPage >= (iPages - iPageCountHalf))
11746
+ {
11747
+ iStartButton = iPages - iPageCount + 1;
11748
+ iEndButton = iPages;
11749
+ }
11750
+ else
11751
+ {
11752
+ iStartButton = iCurrentPage - Math.ceil(iPageCount / 2) + 1;
11753
+ iEndButton = iStartButton + iPageCount - 1;
11754
+ }
11755
+
11756
+
11757
+ /* Build the dynamic list */
11758
+ for ( i=iStartButton ; i<=iEndButton ; i++ )
11759
+ {
11760
+ sList += (iCurrentPage !== i) ?
11761
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButton+'">'+oSettings.fnFormatNumber(i)+'</a>' :
11762
+ '<a tabindex="'+oSettings.iTabIndex+'" class="'+oClasses.sPageButtonActive+'">'+oSettings.fnFormatNumber(i)+'</a>';
11763
+ }
11764
+
11765
+ /* Loop over each instance of the pager */
11766
+ for ( i=0, iLen=an.length ; i<iLen ; i++ )
11767
+ {
11768
+ nNode = an[i];
11769
+ if ( !nNode.hasChildNodes() )
11770
+ {
11771
+ continue;
11772
+ }
11773
+
11774
+ /* Build up the dynamic list first - html and listeners */
11775
+ $('span:eq(0)', nNode)
11776
+ .html( sList )
11777
+ .children('a').each( fnBind );
11778
+
11779
+ /* Update the permanent button's classes */
11780
+ anButtons = nNode.getElementsByTagName('a');
11781
+ anStatic = [
11782
+ anButtons[0], anButtons[1],
11783
+ anButtons[anButtons.length-2], anButtons[anButtons.length-1]
11784
+ ];
11785
+
11786
+ $(anStatic).removeClass( oClasses.sPageButton+" "+oClasses.sPageButtonActive+" "+oClasses.sPageButtonStaticDisabled );
11787
+ $([anStatic[0], anStatic[1]]).addClass(
11788
+ (iCurrentPage==1) ?
11789
+ oClasses.sPageButtonStaticDisabled :
11790
+ oClasses.sPageButton
11791
+ );
11792
+ $([anStatic[2], anStatic[3]]).addClass(
11793
+ (iPages===0 || iCurrentPage===iPages || oSettings._iDisplayLength===-1) ?
11794
+ oClasses.sPageButtonStaticDisabled :
11795
+ oClasses.sPageButton
11796
+ );
11797
+ }
11798
+ }
11799
+ }
11800
+ } );
11801
+
11802
+ $.extend( DataTable.ext.oSort, {
11803
+ /*
11804
+ * text sorting
11805
+ */
11806
+ "string-pre": function ( a )
11807
+ {
11808
+ if ( typeof a != 'string' ) {
11809
+ a = (a !== null && a.toString) ? a.toString() : '';
11810
+ }
11811
+ return a.toLowerCase();
11812
+ },
11813
+
11814
+ "string-asc": function ( x, y )
11815
+ {
11816
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
11817
+ },
11818
+
11819
+ "string-desc": function ( x, y )
11820
+ {
11821
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
11822
+ },
11823
+
11824
+
11825
+ /*
11826
+ * html sorting (ignore html tags)
11827
+ */
11828
+ "html-pre": function ( a )
11829
+ {
11830
+ return a.replace( /<.*?>/g, "" ).toLowerCase();
11831
+ },
11832
+
11833
+ "html-asc": function ( x, y )
11834
+ {
11835
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
11836
+ },
11837
+
11838
+ "html-desc": function ( x, y )
11839
+ {
11840
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
11841
+ },
11842
+
11843
+
11844
+ /*
11845
+ * date sorting
11846
+ */
11847
+ "date-pre": function ( a )
11848
+ {
11849
+ var x = Date.parse( a );
11850
+
11851
+ if ( isNaN(x) || x==="" )
11852
+ {
11853
+ x = Date.parse( "01/01/1970 00:00:00" );
11854
+ }
11855
+ return x;
11856
+ },
11857
+
11858
+ "date-asc": function ( x, y )
11859
+ {
11860
+ return x - y;
11861
+ },
11862
+
11863
+ "date-desc": function ( x, y )
11864
+ {
11865
+ return y - x;
11866
+ },
11867
+
11868
+
11869
+ /*
11870
+ * numerical sorting
11871
+ */
11872
+ "numeric-pre": function ( a )
11873
+ {
11874
+ return (a=="-" || a==="") ? 0 : a*1;
11875
+ },
11876
+
11877
+ "numeric-asc": function ( x, y )
11878
+ {
11879
+ return x - y;
11880
+ },
11881
+
11882
+ "numeric-desc": function ( x, y )
11883
+ {
11884
+ return y - x;
11885
+ }
11886
+ } );
11887
+
11888
+
11889
+ $.extend( DataTable.ext.aTypes, [
11890
+ /*
11891
+ * Function: -
11892
+ * Purpose: Check to see if a string is numeric
11893
+ * Returns: string:'numeric' or null
11894
+ * Inputs: mixed:sText - string to check
11895
+ */
11896
+ function ( sData )
11897
+ {
11898
+ /* Allow zero length strings as a number */
11899
+ if ( typeof sData === 'number' )
11900
+ {
11901
+ return 'numeric';
11902
+ }
11903
+ else if ( typeof sData !== 'string' )
11904
+ {
11905
+ return null;
11906
+ }
11907
+
11908
+ var sValidFirstChars = "0123456789-";
11909
+ var sValidChars = "0123456789.";
11910
+ var Char;
11911
+ var bDecimal = false;
11912
+
11913
+ /* Check for a valid first char (no period and allow negatives) */
11914
+ Char = sData.charAt(0);
11915
+ if (sValidFirstChars.indexOf(Char) == -1)
11916
+ {
11917
+ return null;
11918
+ }
11919
+
11920
+ /* Check all the other characters are valid */
11921
+ for ( var i=1 ; i<sData.length ; i++ )
11922
+ {
11923
+ Char = sData.charAt(i);
11924
+ if (sValidChars.indexOf(Char) == -1)
11925
+ {
11926
+ return null;
11927
+ }
11928
+
11929
+ /* Only allowed one decimal place... */
11930
+ if ( Char == "." )
11931
+ {
11932
+ if ( bDecimal )
11933
+ {
11934
+ return null;
11935
+ }
11936
+ bDecimal = true;
11937
+ }
11938
+ }
11939
+
11940
+ return 'numeric';
11941
+ },
11942
+
11943
+ /*
11944
+ * Function: -
11945
+ * Purpose: Check to see if a string is actually a formatted date
11946
+ * Returns: string:'date' or null
11947
+ * Inputs: string:sText - string to check
11948
+ */
11949
+ function ( sData )
11950
+ {
11951
+ var iParse = Date.parse(sData);
11952
+ if ( (iParse !== null && !isNaN(iParse)) || (typeof sData === 'string' && sData.length === 0) )
11953
+ {
11954
+ return 'date';
11955
+ }
11956
+ return null;
11957
+ },
11958
+
11959
+ /*
11960
+ * Function: -
11961
+ * Purpose: Check to see if a string should be treated as an HTML string
11962
+ * Returns: string:'html' or null
11963
+ * Inputs: string:sText - string to check
11964
+ */
11965
+ function ( sData )
11966
+ {
11967
+ if ( typeof sData === 'string' && sData.indexOf('<') != -1 && sData.indexOf('>') != -1 )
11968
+ {
11969
+ return 'html';
11970
+ }
11971
+ return null;
11972
+ }
11973
+ ] );
11974
+
11975
+
11976
+ // jQuery aliases
11977
+ $.fn.DataTable = DataTable;
11978
+ $.fn.dataTable = DataTable;
11979
+ $.fn.dataTableSettings = DataTable.settings;
11980
+ $.fn.dataTableExt = DataTable.ext;
11981
+
11982
+
11983
+ // Information about events fired by DataTables - for documentation.
11984
+ /**
11985
+ * Draw event, fired whenever the table is redrawn on the page, at the same point as
11986
+ * fnDrawCallback. This may be useful for binding events or performing calculations when
11987
+ * the table is altered at all.
11988
+ * @name DataTable#draw
11989
+ * @event
11990
+ * @param {event} e jQuery event object
11991
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
11992
+ */
11993
+
11994
+ /**
11995
+ * Filter event, fired when the filtering applied to the table (using the build in global
11996
+ * global filter, or column filters) is altered.
11997
+ * @name DataTable#filter
11998
+ * @event
11999
+ * @param {event} e jQuery event object
12000
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12001
+ */
12002
+
12003
+ /**
12004
+ * Page change event, fired when the paging of the table is altered.
12005
+ * @name DataTable#page
12006
+ * @event
12007
+ * @param {event} e jQuery event object
12008
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12009
+ */
12010
+
12011
+ /**
12012
+ * Sort event, fired when the sorting applied to the table is altered.
12013
+ * @name DataTable#sort
12014
+ * @event
12015
+ * @param {event} e jQuery event object
12016
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12017
+ */
12018
+
12019
+ /**
12020
+ * DataTables initialisation complete event, fired when the table is fully drawn,
12021
+ * including Ajax data loaded, if Ajax data is required.
12022
+ * @name DataTable#init
12023
+ * @event
12024
+ * @param {event} e jQuery event object
12025
+ * @param {object} oSettings DataTables settings object
12026
+ * @param {object} json The JSON object request from the server - only
12027
+ * present if client-side Ajax sourced data is used</li></ol>
12028
+ */
12029
+
12030
+ /**
12031
+ * State save event, fired when the table has changed state a new state save is required.
12032
+ * This method allows modification of the state saving object prior to actually doing the
12033
+ * save, including addition or other state properties (for plug-ins) or modification
12034
+ * of a DataTables core property.
12035
+ * @name DataTable#stateSaveParams
12036
+ * @event
12037
+ * @param {event} e jQuery event object
12038
+ * @param {object} oSettings DataTables settings object
12039
+ * @param {object} json The state information to be saved
12040
+ */
12041
+
12042
+ /**
12043
+ * State load event, fired when the table is loading state from the stored data, but
12044
+ * prior to the settings object being modified by the saved state - allowing modification
12045
+ * of the saved state is required or loading of state for a plug-in.
12046
+ * @name DataTable#stateLoadParams
12047
+ * @event
12048
+ * @param {event} e jQuery event object
12049
+ * @param {object} oSettings DataTables settings object
12050
+ * @param {object} json The saved state information
12051
+ */
12052
+
12053
+ /**
12054
+ * State loaded event, fired when state has been loaded from stored data and the settings
12055
+ * object has been modified by the loaded data.
12056
+ * @name DataTable#stateLoaded
12057
+ * @event
12058
+ * @param {event} e jQuery event object
12059
+ * @param {object} oSettings DataTables settings object
12060
+ * @param {object} json The saved state information
12061
+ */
12062
+
12063
+ /**
12064
+ * Processing event, fired when DataTables is doing some kind of processing (be it,
12065
+ * sort, filter or anything else). Can be used to indicate to the end user that
12066
+ * there is something happening, or that something has finished.
12067
+ * @name DataTable#processing
12068
+ * @event
12069
+ * @param {event} e jQuery event object
12070
+ * @param {object} oSettings DataTables settings object
12071
+ * @param {boolean} bShow Flag for if DataTables is doing processing or not
12072
+ */
12073
+
12074
+ /**
12075
+ * Ajax (XHR) event, fired whenever an Ajax request is completed from a request to
12076
+ * made to the server for new data (note that this trigger is called in fnServerData,
12077
+ * if you override fnServerData and which to use this event, you need to trigger it in
12078
+ * you success function).
12079
+ * @name DataTable#xhr
12080
+ * @event
12081
+ * @param {event} e jQuery event object
12082
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12083
+ * @param {object} json JSON returned from the server
12084
+ */
12085
+
12086
+ /**
12087
+ * Destroy event, fired when the DataTable is destroyed by calling fnDestroy or passing
12088
+ * the bDestroy:true parameter in the initialisation object. This can be used to remove
12089
+ * bound events, added DOM nodes, etc.
12090
+ * @name DataTable#destroy
12091
+ * @event
12092
+ * @param {event} e jQuery event object
12093
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
12094
+ */
12095
+ }));
12096
+
12097
+ }(window, document));
12098
+
js/yks_mc_tinymce_button.js ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ( function() {
2
+
3
+ // grabbing our data from class.yksemeBase.php
4
+ var values = [yks_mc_lists_data.lists][0];
5
+ var values_length = values.length;
6
+
7
+ if ( values_length == 0 ) {
8
+ values = [
9
+ {text: "Please Import Some MailChimp Lists", value: "-"}
10
+ ];
11
+ }
12
+
13
+ // test data
14
+ /*
15
+ console.log(values);
16
+ console.log('The array is '+values[0].length+' deep');
17
+
18
+ // working value
19
+ var values = [
20
+ {text: "evan herman personal site newsletter", value: "eff28bd985"},
21
+ {text: "test mc 2", value: "0b071c0bd1"},
22
+ {text: "testing list for mailchimp plugin", value: "057fb8cc2e"}
23
+ ];
24
+ */
25
+
26
+ tinymce.PluginManager.add( 'yks_mc_tinymce_button', function( editor, url ) {
27
+
28
+ // Add a button that opens a window
29
+ editor.addButton( 'yks_mc_tinymce_button_key', {
30
+
31
+ icon: 'yks-mc-icon-yikes-button-image',
32
+ title: 'Yikes Easy MailChimp Forms',
33
+ onclick: function() {
34
+ // Open window
35
+ if ( values_length != 0 ) {
36
+ editor.windowManager.open( {
37
+ title: 'Select Your MailChimp Form',
38
+ body: [
39
+ {
40
+ type: 'listbox',
41
+ name: 'list_id',
42
+ label: 'MailChimp List',
43
+ values: values
44
+ },
45
+ {
46
+ type: 'textbox',
47
+ name: 'submit_button_text',
48
+ label: 'Submit Button Text'
49
+ }
50
+ ],
51
+ id: 'yks_mc_tinyMCE_modal', // and an ID to the modal, to target it easier
52
+ onsubmit: function( e ) {
53
+ // Insert content when the window form is submitted
54
+ // store the mailchimp list ID
55
+ var mailChimp_form_id = e.data.list_id;
56
+ // store the submit button text
57
+ var submit_button_text = e.data.submit_button_text;
58
+ // check the submit button text
59
+ // if empty, default it to Submit
60
+ // if not empty, use the specified text
61
+ if ( submit_button_text == '' ) {
62
+ var submit_button_text = 'Submit';
63
+ }
64
+ if ( mailChimp_form_id == '-' ) {
65
+ alert("Don't forget to import lists first!");
66
+ return false;
67
+ } else {
68
+ editor.insertContent( '[yks-mailchimp-list id="'+mailChimp_form_id+'" submit_text="'+submit_button_text+'"]' );
69
+ }
70
+ }
71
+
72
+ } );
73
+ // if no lists have been imported
74
+ // lets alert the user
75
+ } else {
76
+ tinyMCE.activeEditor.windowManager.alert("Error: You need to import some MailChimp lists before you can add any! Head over to 'MailChimp Forms > Manage List Forms' to get started.");
77
+ }
78
+
79
+ }
80
+
81
+ } );
82
+
83
+ } );
84
+
85
+ } )();
languages/Lanages To Translate To.txt ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Lanaguages Complete
2
+ -------------------
3
+ Viatnemese - vi
4
+ Swedish - sv_SE
5
+ Hindi - hi_IN
6
+ Chinese - zh_CN
7
+ Hong Kong - zh_HK
8
+ Taiwanese - zh_TW
9
+ Greek - el_GR
10
+ Hebrew - he_IL
11
+ Korean - ko_KR
12
+ Persian - fa_IR
13
+ Romanian - ro_RO
14
+ Tamil , Sri Lanka - ta_LK
15
+ Urdu - ur
16
+ English - en_US
17
+ Arabic - ar_AR
18
+ French - fr_FR
19
+ Portugese (European) - pt_PT
20
+ Portugese (Brazilian)- pt_BR
21
+ Russian - ru_RU
22
+ Italian - it_IT
23
+ Japanese - ja
24
+ German - de_DE
25
+ Welsh - cy
26
+
27
+
28
+ To Do:
29
+ ---------------------------
30
+ If you'd like YIKES Inc. Easy MailChimp Extender translated into another language than the one above, please send a request to evan@yikesinc.com
languages/yikes-inc-easy-mailchimp-extender-ar_AR.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-ar_AR.po ADDED
@@ -0,0 +1,753 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:06-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:45-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: ar\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "نشكركم على الطلب"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr "أشكركم على الاشتراك! التحقق من بريدك الالكتروني لرسالة التأكيد."
28
+
29
+ #: .././classes/class.yksemeBase.php:116
30
+ msgid "Select Your Area of Interest"
31
+ msgstr "حدد اهتماماتك"
32
+
33
+ #: .././classes/class.yksemeBase.php:917
34
+ msgid "Click on a subscriber to see further information"
35
+ msgstr "انقر على مشترك لمعرفة مزيد من المعلومات"
36
+
37
+ #: .././classes/class.yksemeBase.php:920
38
+ msgid "E-Mail"
39
+ msgstr "البريد الإلكتروني"
40
+
41
+ #: .././classes/class.yksemeBase.php:921
42
+ msgid "Date Subscribed"
43
+ msgstr "تاريخ المشترك"
44
+
45
+ #: .././classes/class.yksemeBase.php:941
46
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
47
+ msgstr "آسف لم يكن لديك حاليا أي مشترك في هذه القائمة!"
48
+
49
+ #: .././classes/class.yksemeBase.php:998
50
+ msgid "Back to Subscriber List"
51
+ msgstr "العودة إلى قائمة المشترك"
52
+
53
+ #: .././classes/class.yksemeBase.php:999
54
+ msgid "Subscriber Details"
55
+ msgstr "تفاصيل المشترك"
56
+
57
+ #: .././classes/class.yksemeBase.php:1010
58
+ msgid "Overview"
59
+ msgstr "نظرة عامة"
60
+
61
+ #: .././classes/class.yksemeBase.php:1015
62
+ msgid "First Name"
63
+ msgstr "الاسم الأول"
64
+
65
+ #: .././classes/class.yksemeBase.php:1018
66
+ msgid "Last Updated"
67
+ msgstr "آخر تحديث"
68
+
69
+ #: .././classes/class.yksemeBase.php:1021
70
+ msgid "Preferred Email Type"
71
+ msgstr "يفضل نوع البريد الإلكتروني"
72
+
73
+ #: .././classes/class.yksemeBase.php:1028
74
+ msgid "Last Name"
75
+ msgstr "اسم العائلة"
76
+
77
+ #: .././classes/class.yksemeBase.php:1031
78
+ msgid "Language"
79
+ msgstr "لغة"
80
+
81
+ #: .././classes/class.yksemeBase.php:1054
82
+ msgid "Groups Subscribed To"
83
+ msgstr "المجموعات المشترك بها ل"
84
+
85
+ #: .././classes/class.yksemeBase.php:1104
86
+ msgid "Subscriber Notes"
87
+ msgstr "ملاحظات المشتركين"
88
+
89
+ #: .././classes/class.yksemeBase.php:1109
90
+ msgid "Written by"
91
+ msgstr "كتبه"
92
+
93
+ #: .././classes/class.yksemeBase.php:1109
94
+ msgid "Created on"
95
+ msgstr "تم إنشاؤها على"
96
+
97
+ #: .././classes/class.yksemeBase.php:1251
98
+ #: .././classes/class.yksemeBase.php:1253
99
+ msgid "MailChimp Forms"
100
+ msgstr "أشكال MailChimp"
101
+
102
+ #: .././classes/class.yksemeBase.php:1253
103
+ msgid "MailChimp Settings"
104
+ msgstr "إعدادات MailChimp"
105
+
106
+ #: .././classes/class.yksemeBase.php:1254
107
+ msgid "Manage List Forms"
108
+ msgstr "إدارة قائمة أشكال"
109
+
110
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
111
+ msgid "About YIKES, Inc."
112
+ msgstr "حول YIKES Inc."
113
+
114
+ #: .././classes/class.yksemeBase.php:1430
115
+ msgid "One or more fields are empty"
116
+ msgstr "حقل واحد أو أكثر فارغة"
117
+
118
+ #: .././classes/class.yksemeBase.php:1480
119
+ msgid "Your List Was Successfully Saved!"
120
+ msgstr "قائمة تم حفظ بنجاح!"
121
+
122
+ #: .././classes/class.yksemeBase.php:1482
123
+ msgid "I'm sorry there was an error with your request."
124
+ msgstr "أنا آسف كان هناك خطأ مع طلبك."
125
+
126
+ #: .././classes/class.yksemeBase.php:1488
127
+ msgid "MailChimp List name"
128
+ msgstr "اسم قائمة MailChimp"
129
+
130
+ #: .././classes/class.yksemeBase.php:1494
131
+ #: .././classes/class.yksemeBase.php:1504
132
+ #, php-format
133
+ msgid "%1$s"
134
+ msgstr ""
135
+
136
+ #: .././classes/class.yksemeBase.php:1512
137
+ msgid "MailChimp List ID"
138
+ msgstr "قائمة MailChimp ID"
139
+
140
+ #: .././classes/class.yksemeBase.php:1518
141
+ msgid "Shortcode"
142
+ msgstr "رمز قصير"
143
+
144
+ #: .././classes/class.yksemeBase.php:1521
145
+ msgid ""
146
+ "Paste this shortcode into whatever page or post you want to add this form to"
147
+ msgstr "لصق هذا الرمز القصير في كل ما الصفحة أو إضافة تريد إضافة هذا النموذج ل"
148
+
149
+ #: .././classes/class.yksemeBase.php:1526
150
+ msgid "PHP Snippet"
151
+ msgstr "مقتطف PHP"
152
+
153
+ #: .././classes/class.yksemeBase.php:1529
154
+ msgid "Use this code to add this form to a template file"
155
+ msgstr "استخدام هذا الرمز لإضافة هذا النموذج إلى ملف القالب"
156
+
157
+ #: .././classes/class.yksemeBase.php:1534
158
+ msgid "Number of Subscribers"
159
+ msgstr "عدد المشتركين"
160
+
161
+ #: .././classes/class.yksemeBase.php:1543
162
+ msgid "Form Fields"
163
+ msgstr "حقول النموذج"
164
+
165
+ #: .././classes/class.yksemeBase.php:1545
166
+ msgid ""
167
+ "Check the fields you want included in your form (Email Address is required)."
168
+ msgstr ""
169
+ "تحقق من الحقول التي تريد تضمينها في النموذج الخاص بك (مطلوب عنوان البريد "
170
+ "الإلكتروني)."
171
+
172
+ #: .././classes/class.yksemeBase.php:1548
173
+ msgid ""
174
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
175
+ msgstr "استخدم الأسهم الخضراء لسحب وإسقاط الحقول وإعادة ترتيب ترتيبها."
176
+
177
+ #: .././classes/class.yksemeBase.php:1554
178
+ msgid "Active Fields"
179
+ msgstr "الحقول نشطة"
180
+
181
+ #: .././classes/class.yksemeBase.php:1563
182
+ msgid "Drag"
183
+ msgstr "سحب المكابح"
184
+
185
+ #: .././classes/class.yksemeBase.php:1563
186
+ msgid "drop"
187
+ msgstr "قطرة"
188
+
189
+ #: .././classes/class.yksemeBase.php:1568
190
+ msgid "Merge field"
191
+ msgstr "حقل دمج"
192
+
193
+ #: .././classes/class.yksemeBase.php:1569
194
+ msgid "Placeholder"
195
+ msgstr "نائب"
196
+
197
+ #: .././classes/class.yksemeBase.php:1577
198
+ msgid "Redirect User On Submission"
199
+ msgstr "إعادة توجيه المستخدم في تقديم"
200
+
201
+ #: .././classes/class.yksemeBase.php:1581
202
+ msgid "choose a page to redirect the user to after they submit the form."
203
+ msgstr ""
204
+ "اختيار صفحة أو مجموعة URL مخصص لإعادة توجيه المستخدم إلى بعد أن تقدم النموذج."
205
+
206
+ #: .././classes/class.yksemeBase.php:1584
207
+ msgid "Select A Post/Page"
208
+ msgstr "حدد وظيفة / صفحة"
209
+
210
+ #: .././classes/class.yksemeBase.php:1638
211
+ msgid "Save Form Settings"
212
+ msgstr "حفظ إعدادات نموذج"
213
+
214
+ #: .././classes/class.yksemeBase.php:1639
215
+ msgid "Delete Form"
216
+ msgstr "حذف نموذج"
217
+
218
+ #: .././classes/class.yksemeBase.php:1640
219
+ msgid "Re-Import Form Fields from MailChimp"
220
+ msgstr "إعادة استيراد نموذج من الحقول MailChimp"
221
+
222
+ #: .././classes/class.yksemeBase.php:2168
223
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
224
+ msgstr "توقيع البيانات في النشرة الإخبارية MAILCHIMP الاستبدال-في هذا النص"
225
+
226
+ #: .././pages/about.php:27
227
+ msgid "YIKES, Inc. Web Design and Development"
228
+ msgstr "YIKES inc., تصميم وتطوير المواقع الإلكترونية"
229
+
230
+ #: .././pages/about.php:29
231
+ msgid "Smart, effective, beautifully designed web solutions"
232
+ msgstr "فعالة، حلول الويب الذكية، والمصممة بشكل جميل"
233
+
234
+ #: .././pages/about.php:32
235
+ msgid ""
236
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
237
+ "custom WordPress themes and plugins every day."
238
+ msgstr ""
239
+ "يقع في حي YIKES فيشتاون فيلادلفيا حيث نبني ورد المواضيع والإضافات مخصصة كل "
240
+ "يوم"
241
+
242
+ #: .././pages/about.php:36
243
+ msgid ""
244
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
245
+ "WordCamps"
246
+ msgstr "في YIKES نحب وورد! شارك في المالك، قدم تريسي يفيسك في WordCamps"
247
+
248
+ #: .././pages/about.php:36
249
+ msgid "and"
250
+ msgstr "و"
251
+
252
+ #: .././pages/about.php:36
253
+ msgid "She also teaches WordPress classes for"
254
+ msgstr "وقالت انها أيضا يعلم الطبقات وورد ل"
255
+
256
+ #: .././pages/about.php:40
257
+ msgid ""
258
+ "In addition to making great WordPress sites we are also committed to the "
259
+ "sustainable business movement. We observe the triple bottom line: people, "
260
+ "planet, profit and work to help build a more socially, environmentally and "
261
+ "financially sustainable local economy. We even have a"
262
+ msgstr ""
263
+ "بالإضافة إلى اتخاذ مواقع وورد كبيرة ملتزمون ونحن أيضا لحركة الأعمال التجارية "
264
+ "المستدامة. نلاحظ خط القاع الثلاثي: الناس، الكوكب، الربح والعمل على المساعدة "
265
+ "في بناء اقتصاد أكثر محلية مستدامة اجتماعيا وبيئيا وماليا. لدينا حتى"
266
+
267
+ #: .././pages/about.php:40
268
+ msgid "LEED Platinum office"
269
+ msgstr "مكتب LEED البلاتينية"
270
+
271
+ #: .././pages/about.php:44
272
+ msgid ""
273
+ "If you're interested in hiring us for WordPress development, or just want to "
274
+ "learn more about us, please visit"
275
+ msgstr ""
276
+ "إذا كنت ترغب في استئجار لنا لتطوير وورد، أو مجرد تريد معرفة المزيد عنا، يرجى "
277
+ "زيارة"
278
+
279
+ #: .././pages/lists.php:8
280
+ msgid "No forms have been added yet."
281
+ msgstr "لم يتم إضافة أي أشكال بعد."
282
+
283
+ #: .././pages/lists.php:39
284
+ msgid "Oops.. The list ID you entered appears to be incorrect."
285
+ msgstr "عفوا .. معرف القائمة التي دخلت على ما يبدو غير صحيحة."
286
+
287
+ #: .././pages/lists.php:44
288
+ msgid "There was an error!"
289
+ msgstr "آسف، هناك خطأ."
290
+
291
+ #: .././pages/lists.php:135
292
+ msgid "You need to select a Mailchimp list in order to create a form for it"
293
+ msgstr "تحتاج إلى تحديد قائمة Mailchimp من أجل إنشاء نموذج لذلك"
294
+
295
+ #: .././pages/lists.php:173
296
+ msgid "Are you sure you want to delete this form?"
297
+ msgstr "هل أنت متأكد أنك تريد حذف هذا الشكل؟"
298
+
299
+ #: .././pages/lists.php:206
300
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
301
+ msgstr "هل أنت متأكد من أنك تريد إعادة استيراد حقول الخاص بك من MailChimp؟"
302
+
303
+ #: .././pages/lists.php:228
304
+ msgid "Looks like this form is already up to date!"
305
+ msgstr "يبدو مثل هذا النموذج هو بالفعل حتى الآن!"
306
+
307
+ #: .././pages/lists.php:326
308
+ msgid "Are you sure you want to unsubscribe"
309
+ msgstr "فهل تريد بالتأكيد المواصلة؟"
310
+
311
+ #: .././pages/lists.php:326
312
+ msgid "from this list?"
313
+ msgstr "en esta lista?"
314
+
315
+ #: .././pages/lists.php:342
316
+ msgid "was successfully unsubscribed from this list."
317
+ msgstr "fue darme de baja con éxito de esta lista."
318
+
319
+ #: .././pages/lists.php:448 .././pages/options.php:196
320
+ #: .././pages/options.php:416
321
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
322
+ msgstr "أشكال سهلة Mailchimp بواسطة YIKES inc."
323
+
324
+ #: .././pages/lists.php:454
325
+ msgid "Before you can add MailChimp forms to your site, you need to"
326
+ msgstr ""
327
+ "قبل أن تتمكن من إضافة أشكال MailChimp إلى موقع الويب الخاص بك، تحتاج إلى"
328
+
329
+ #: .././pages/lists.php:454
330
+ msgid "go to the MailChimp Settings page"
331
+ msgstr "انتقل إلى صفحة إعدادات MailChimp"
332
+
333
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
334
+ msgid "and add your API Key."
335
+ msgstr "وإضافة مفتاح API الخاص بك."
336
+
337
+ #: .././pages/lists.php:462
338
+ msgid "You must enter a valid API key to import and manage your lists."
339
+ msgstr "يجب عليك إدخال مفتاح API صالحة لاستيراد وإدارة القوائم الخاصة بك."
340
+
341
+ #: .././pages/lists.php:473
342
+ msgid "Your Lists"
343
+ msgstr "قوائم الخاص"
344
+
345
+ #: .././pages/lists.php:483
346
+ msgid "Manage Forms"
347
+ msgstr "إدارة قائمة أشكال"
348
+
349
+ #: .././pages/options.php:41
350
+ msgid "The options were saved successfully!"
351
+ msgstr "تم حفظ الخيارات بنجاح!"
352
+
353
+ #: .././pages/options.php:44
354
+ msgid "The options could not be saved (or you did not change them)."
355
+ msgstr "تعذر حفظ الخيارات (أو أنك لم تغييرها)."
356
+
357
+ #: .././pages/options.php:96
358
+ msgid "Valid API Key"
359
+ msgstr "صالح مفتاح API"
360
+
361
+ #: .././pages/options.php:102
362
+ msgid "Sorry, that is an invalid MailChimp API key."
363
+ msgstr "آسف، وهذا هو مفتاح API MailChimp صالح."
364
+
365
+ #: .././pages/options.php:108
366
+ msgid ""
367
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
368
+ "further information."
369
+ msgstr ""
370
+ "آسف، وهذا هو مفتاح API MailChimp صالح. يرجى مراجعة وحدة التحكم للحصول على "
371
+ "مزيد من المعلومات."
372
+
373
+ #: .././pages/options.php:117
374
+ msgid "Error: Please enter a valid Mail Chimp API Key."
375
+ msgstr "خطأ: الرجاء إدخال صالحة البريد الشمبانزي API مفتاح."
376
+
377
+ #: .././pages/options.php:199
378
+ msgid "Manage Mailchimp Forms Settings"
379
+ msgstr "إدارة إعدادات أشكال Mailchimp"
380
+
381
+ #: .././pages/options.php:205
382
+ msgid "WordPress Version Number Error"
383
+ msgstr "النسخة ورد"
384
+
385
+ #: .././pages/options.php:206
386
+ msgid ""
387
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
388
+ "You won't be able to access the tinyMCE button to insert forms into pages "
389
+ "and posts unless you update to 3.9 or later."
390
+ msgstr ""
391
+ "نحن آسفون، ولكن يبدو أن لديك تستخدم نسخة قديمة من وورد. فلن تكون قادرا على "
392
+ "الوصول إلى زر tinyMCE لإدراج أشكال في صفحات والمشاركات إذا لم تقم بتحديث إلى "
393
+ "3.9 أو في وقت لاحق."
394
+
395
+ #: .././pages/options.php:215
396
+ msgid "LocalHost Detected :"
397
+ msgstr ":الكشف عن LocalHost"
398
+
399
+ #: .././pages/options.php:216
400
+ msgid ""
401
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
402
+ msgstr "أشكال سهلة Mailchimp بواسطة YIKES inc."
403
+
404
+ #: .././pages/options.php:217
405
+ msgid ""
406
+ "If you are unable to validate your API key, and receive the error message"
407
+ msgstr ""
408
+ "إذا كنت غير قادر على التحقق من صحة مفتاح API الخاص بك، وتتلقى رسالة الخطأ"
409
+
410
+ #: .././pages/options.php:217
411
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
412
+ msgstr "\"SSL المشكلة الشهادة: غير قادر على الحصول على شهادة المصدر المحلي \""
413
+
414
+ #: .././pages/options.php:217
415
+ msgid "follow the tutorial located "
416
+ msgstr "اتبع البرنامج التعليمي الموجود"
417
+
418
+ #: .././pages/options.php:230
419
+ msgid "Your Mailchimp API Key"
420
+ msgstr "لديك مفتاح API Mailchimp"
421
+
422
+ #: .././pages/options.php:238
423
+ msgid ""
424
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
425
+ "site to communicate with your MailChimp account."
426
+ msgstr ""
427
+ "يرجى إدخال MailChimp API الرئيسية أعلاه. ويسمح مفتاح API موقع وورد الخاص بك "
428
+ "للاتصال مع حساب MailChimp الخاص بك."
429
+
430
+ #: .././pages/options.php:239
431
+ msgid "For more help, visit the MailChimp Support article"
432
+ msgstr "لمزيد من المساعدة، يمكنك زيارة المقالة MailChimp الدعم"
433
+
434
+ #: .././pages/options.php:239
435
+ msgid "Where can I find my API Key?"
436
+ msgstr "أين يمكنني أن أجد بلدي API الرئيسية؟"
437
+
438
+ #: .././pages/options.php:244
439
+ msgid "Preferred Form Layout"
440
+ msgstr "نموذج تخطيط المفضل"
441
+
442
+ #: .././pages/options.php:247
443
+ msgid "table"
444
+ msgstr "جدول"
445
+
446
+ #: .././pages/options.php:248
447
+ msgid "div"
448
+ msgstr "شعبة"
449
+
450
+ #: .././pages/options.php:256
451
+ msgid "Choose whether you want your forms to use a table or div layout."
452
+ msgstr "اختيار ما إذا كنت تريد استخدام أشكال لجدول أو تخطيط شعبة."
453
+
454
+ #: .././pages/options.php:261
455
+ msgid "Advanced Error Messaging"
456
+ msgstr "خطأ المتقدمة التراسل"
457
+
458
+ #: .././pages/options.php:264
459
+ msgid "Disabled"
460
+ msgstr "تعطيل"
461
+
462
+ #: .././pages/options.php:265
463
+ msgid "Enabled"
464
+ msgstr "تم التمكين"
465
+
466
+ #: .././pages/options.php:273
467
+ msgid ""
468
+ "Enable if you're having problems with your forms sending data to MailChimp. "
469
+ "Enabling Advanced Error Messaging will show you the exact error codes "
470
+ "MailChimp is returning."
471
+ msgstr ""
472
+ "تمكين إذا كنت تواجه مشاكل مع النماذج إرسال البيانات إلى MailChimp. سوف تمكين "
473
+ "التراسل خطأ المتقدم تظهر لك رموز الخطأ بالضبط MailChimp تعود."
474
+
475
+ #: .././pages/options.php:281
476
+ msgid "Single Opt-In"
477
+ msgstr "واحد التقيد في"
478
+
479
+ #: .././pages/options.php:282
480
+ msgid "Double Opt-In"
481
+ msgstr "ضعف التقيد في"
482
+
483
+ #: .././pages/options.php:290
484
+ msgid ""
485
+ "A single opt-in will add the user to your list without any further "
486
+ "interaction."
487
+ msgstr "A التقيد في واحد سيضيف المستخدم إلى قائمة الخاص بك دون أي تفاعل آخر."
488
+
489
+ #: .././pages/options.php:291
490
+ msgid ""
491
+ "A double opt-in will send an email to the user asking them to confirm their "
492
+ "subscription."
493
+ msgstr ""
494
+ "A التقيد في مضاعفة سيتم إرسال البريد الإلكتروني للمستخدم ويطلب منهم لتأكيد "
495
+ "الاشتراك الخاصة بهم."
496
+
497
+ #: .././pages/options.php:292
498
+ msgid "This will also dictate the opt-in settings for people leaving comments."
499
+ msgstr "وهذا أيضا تملي الإعدادات التقيد في للناس ترك التعليقات."
500
+
501
+ #: .././pages/options.php:297
502
+ msgid "Custom Opt-In Message"
503
+ msgstr "رسالة مخصصة التقيد في"
504
+
505
+ #: .././pages/options.php:299
506
+ msgid "Double Opt-In Message"
507
+ msgstr " رسالةضعف التقيد في"
508
+
509
+ #: .././pages/options.php:301
510
+ msgid "Single Opt-In Message"
511
+ msgstr "رسالةواحد التقيد في"
512
+
513
+ #: .././pages/options.php:307
514
+ msgid "Interest Group Label"
515
+ msgstr "تسمية المجموعة الفائدة"
516
+
517
+ #: .././pages/options.php:316
518
+ msgid ""
519
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
520
+ "group names."
521
+ msgstr ""
522
+ "النص أعلاه لعرض مجموعات المصالح. يترك فارغا لاستخدام MailChimp أسماء "
523
+ "المجموعات الفائدة."
524
+
525
+ #: .././pages/options.php:321
526
+ msgid "Display opt-in checkbox on comment forms?"
527
+ msgstr "عرض التقيد في الاختيار في النماذج تعليق؟"
528
+
529
+ #: .././pages/options.php:324
530
+ msgid "Hide"
531
+ msgstr "كتم"
532
+
533
+ #: .././pages/options.php:325
534
+ msgid "Show"
535
+ msgstr "عرض"
536
+
537
+ #: .././pages/options.php:333
538
+ msgid ""
539
+ "This will display a checkbox just above the submit button on all comment "
540
+ "forms. If selected, any users leaving comments will also be added to the "
541
+ "mailing list."
542
+ msgstr ""
543
+ "وهذا عرض مربع فقط فوق زر الإرسال على جميع أشكال تعليق. إذا المحدد، سيتم أيضا "
544
+ "إضافة أي مستخدمين ترك التعليقات إلى القائمة البريدية."
545
+
546
+ #: .././pages/options.php:338
547
+ msgid "Custom Comment Checkbox Text"
548
+ msgstr "العرف نص التعليق خانة"
549
+
550
+ #: .././pages/options.php:345
551
+ msgid "Default List"
552
+ msgstr "قائمة الافتراضي"
553
+
554
+ #: .././pages/options.php:360
555
+ msgid ""
556
+ "This is the default list users will be subscribed to when submitting a "
557
+ "comment."
558
+ msgstr ""
559
+ "هذا وسوف يتم الاكتتاب في قائمة المستخدمين الافتراضية إلى عند تقديم تعليق."
560
+
561
+ #: .././pages/options.php:361
562
+ msgid ""
563
+ "It is best to select a form where only the email , first name and/or last "
564
+ "name are required or you may run into issues."
565
+ msgstr ""
566
+ "فمن الأفضل لاختيار النموذج حيث فقط البريد الإلكتروني، الاسم الأول و / أو اسم "
567
+ "العائلة مطلوبة أو كنت قد واجهت مشاكل."
568
+
569
+ #: .././pages/options.php:373
570
+ msgid "Plugin Information"
571
+ msgstr "معلومات البرنامج المساعد"
572
+
573
+ #: .././pages/options.php:376
574
+ msgid "If you experience any issues with our plugin, please"
575
+ msgstr "إذا كنت تواجه أي مشاكل مع لدينا البرنامج المساعد، يرجى"
576
+
577
+ #: .././pages/options.php:376
578
+ msgid "submit a New Issue on our Github Issue Tracker"
579
+ msgstr "يقدم العدد الجديد على موقعنا على المقتفي جيثب العدد"
580
+
581
+ #: .././pages/options.php:376
582
+ msgid ""
583
+ "Please include the information below to help us troubleshoot your problem."
584
+ msgstr "يرجى تضمين المعلومات أدناه لمساعدتنا استكشاف مشكلتك."
585
+
586
+ #: .././pages/options.php:384
587
+ msgid "Plugin Version"
588
+ msgstr "النسخة المساعد"
589
+
590
+ #: .././pages/options.php:388
591
+ msgid "Wordpress Version"
592
+ msgstr "النسخة ورد"
593
+
594
+ #: .././pages/options.php:392
595
+ msgid "Browser Information"
596
+ msgstr "معلومات المتصفح"
597
+
598
+ #: .././pages/options.php:420
599
+ msgid "Error"
600
+ msgstr "خطأ"
601
+
602
+ #: .././pages/options.php:421
603
+ msgid ""
604
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
605
+ "cURL to send and retreive data."
606
+ msgstr ""
607
+ "نحن آسفون، ولكن تم تعطيل الضفيرة على الخادم الخاص بك. ويستخدم API MailChimp "
608
+ "الضفيرة لإرسال وإستعادة البيانات."
609
+
610
+ #: .././pages/options.php:426
611
+ msgid "Help!"
612
+ msgstr "مساعدة!"
613
+
614
+ #: .././pages/options.php:426
615
+ msgid "What is cURL?"
616
+ msgstr "ما هو cURL؟"
617
+
618
+ #: .././pages/options.php:426
619
+ msgid "Check phpinfo()"
620
+ msgstr "تحقق phpinfo()"
621
+
622
+ #: .././pages/options.php:428
623
+ msgid "Steps To Resolve The Issue"
624
+ msgstr "الخطوات لحل المشكلة"
625
+
626
+ #: .././pages/options.php:430
627
+ msgid ""
628
+ "You can enable cURL by turning on the cURL module within your php.ini file"
629
+ msgstr "يمكنك تمكين الضفيرة عن طريق تشغيل وحدة الضفيرة داخل ملف php.ini الخاص"
630
+
631
+ #: .././pages/options.php:430
632
+ msgid "You should find the php.ini file located here : "
633
+ msgstr "يجب عليك العثور على ملف php.ini الموجود هنا:"
634
+
635
+ #: .././pages/options.php:431
636
+ msgid ""
637
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
638
+ msgstr "مرة واحدة وجدت، وفتح ملف php.ini \"؛ تمديد;extension=php_curl.dll\"."
639
+
640
+ #: .././pages/options.php:432
641
+ msgid ""
642
+ "Remove the semi colon before the line, to un-comment it and make the module "
643
+ "active."
644
+ msgstr ""
645
+ "إزالة القولون شبه قبل السطر، لمن الامم المتحدة والتعليق عليه، وجعل وحدة نشطة."
646
+
647
+ #: .././pages/options.php:433
648
+ msgid "Re-save and close the file."
649
+ msgstr "إعادة حفظ وإغلاق الملف."
650
+
651
+ #: .././pages/options.php:434
652
+ msgid "Re-load this page."
653
+ msgstr "إعادة تحميل هذه الصفحة."
654
+
655
+ #: .././templates/shortcode_error.php:1
656
+ msgid "There was an error calling the mailchimp list."
657
+ msgstr "كان هناك خطأ استدعاء قائمة mailchimp."
658
+
659
+ #: .././templates/shortcode_error_data.php:1
660
+ msgid ""
661
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
662
+ "List Forms\" page."
663
+ msgstr ""
664
+ "لا وجود لائحة! تأكد من أن قمت باستيراد قائمة على \"إدارة قائمة أشكال\" "
665
+ "الصفحة."
666
+
667
+ #: .././templates/shortcode_error_exists.php:1
668
+ msgid "This list was already placed on this page!"
669
+ msgstr "وقد وضعت هذه القائمة بالفعل على هذه الصفحة!"
670
+
671
+ #: .././templates/shortcode_error_no_API_key.php:1
672
+ msgid "Woops! No Valid API Key Found. Double check your settings."
673
+ msgstr "Woops! بدون مفتاح API صالحة وجدت. مزدوجة تحقق من إعداداتك."
674
+
675
+ #: .././templates/shortcode_form.php:11
676
+ msgid "Oops.. Don't forget to fill-in the following fields"
677
+ msgstr "عفوا .. لا ننسى لملء في المجالات التالية"
678
+
679
+ #: .././templates/shortcode_form.php:74
680
+ msgid "required field"
681
+ msgstr "حقل مطلوب"
682
+
683
+ #: .././templates/yikes-mailchimp-widget.php:15
684
+ #: .././templates/yikes-mailchimp-widget.php:18
685
+ msgid "MailChimp Signup Form"
686
+ msgstr "MailChimp نموذج الاشتراك"
687
+
688
+ #: .././templates/yikes-mailchimp-widget.php:27
689
+ msgid "Select Which Form You Would Like To Display:"
690
+ msgstr "اختر أي نموذج هل ترغب في العرض:"
691
+
692
+ #: .././templates/yikes-mailchimp-widget.php:30
693
+ msgid "Select a Form to Display"
694
+ msgstr "تحديد نموذج لعرض"
695
+
696
+ #: .././templates/yikes-mailchimp-widget.php:47
697
+ msgid "Please import MailChimp forms"
698
+ msgstr "يرجى استيراد أشكال MailChimp"
699
+
700
+ #: .././templates/yikes-mailchimp-widget.php:49
701
+ msgid "Please import some lists from MailChimp"
702
+ msgstr "يرجى استيراد بعض القوائم من MailChimp"
703
+
704
+ #: .././templates/yikes-mailchimp-widget.php:52
705
+ msgid "Import Lists Now"
706
+ msgstr "استيراد قوائم الآن"
707
+
708
+ #: .././templates/yikes-mailchimp-widget.php:73
709
+ msgid ""
710
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
711
+ "least one list to use the Easy MailChimp widget."
712
+ msgstr ""
713
+ "عفوا! يبدو أنك لم المستوردة أية قوائم حتى الآن. يجب استيراد قائمة واحدة على "
714
+ "الأقل لاستخدام القطعة سهلة MailChimp."
715
+
716
+ #: .././templates/yikes-mailchimp-widget.php:80
717
+ msgid ""
718
+ "Oops! It looks like you forgot to select a form to display here. Go to "
719
+ "'Appearance > Widgets' and select a form to display."
720
+ msgstr ""
721
+ "عفوا! يبدو أنك نسيت أن تحديد نموذج لعرض هنا. اذهب إلى 'المظهر> القطع' وحدد "
722
+ "نموذج لعرضه."
723
+
724
+ #: .././templates/yikes-mailchimp-widget.php:117
725
+ msgid "Sign Up For Our Newsletter"
726
+ msgstr "اشترك النشرة الإخبارية لدينا"
727
+
728
+ #: .././templates/yikes-mailchimp-widget.php:129
729
+ msgid "Sign Me Up"
730
+ msgstr "توقيع لي حتى"
731
+
732
+ #: .././templates/yikes-mailchimp-widget.php:133
733
+ msgid "Title:"
734
+ msgstr "العنوان"
735
+
736
+ #: .././templates/yikes-mailchimp-widget.php:138
737
+ msgid "Form Text:"
738
+ msgstr "نص النموذج:"
739
+
740
+ #: .././templates/yikes-mailchimp-widget.php:146
741
+ msgid "Submit Button Text:"
742
+ msgstr "يقدم زر النص:"
743
+
744
+ #: .././templates/yikes-mailchimp-widget.php:156
745
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
746
+ msgstr "عفوا! يبدو أنك لم تقم بإضافة مفتاح API الخاص بك! رئيس لأكثر من"
747
+
748
+ #: .././templates/yikes-mailchimp-widget.php:156
749
+ msgid "Settings page"
750
+ msgstr "صفحة إعدادات"
751
+
752
+ #~ msgid "No API Key or List Id Exist!"
753
+ #~ msgstr "بدون مفتاح API أو قائمة رقم موجود!"
languages/yikes-inc-easy-mailchimp-extender-cy.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-cy.po ADDED
@@ -0,0 +1,781 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:19-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:46-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: cy\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "Diolch yn fawr am danysgrifio!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "Diolch yn fawr am danysgrifio! Edrychwch ar eich e-bost ar gyfer y neges "
29
+ "cadarnhau."
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "Dewiswch Eich Ardal o Ddiddordeb"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "Cliciwch ar danysgrifiwr i weld rhagor o wybodaeth"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "E-bost"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "Dyddiad tanysgrifiedig"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr ""
50
+ "Mae'n ddrwg gennym Nid ydych hyn o bryd unrhyw Tanysgrifwyr Yn y Rhestr!"
51
+
52
+ #: .././classes/class.yksemeBase.php:998
53
+ msgid "Back to Subscriber List"
54
+ msgstr "Yn ôl i'r Rhestr Subscriber"
55
+
56
+ #: .././classes/class.yksemeBase.php:999
57
+ msgid "Subscriber Details"
58
+ msgstr "Manylion tanysgrifiwr"
59
+
60
+ #: .././classes/class.yksemeBase.php:1010
61
+ msgid "Overview"
62
+ msgstr "trosolwg"
63
+
64
+ #: .././classes/class.yksemeBase.php:1015
65
+ msgid "First Name"
66
+ msgstr "Enw Cyntaf"
67
+
68
+ #: .././classes/class.yksemeBase.php:1018
69
+ msgid "Last Updated"
70
+ msgstr "Diweddarwyd ddiwethaf"
71
+
72
+ #: .././classes/class.yksemeBase.php:1021
73
+ msgid "Preferred Email Type"
74
+ msgstr "Ffefrir Math E-bost"
75
+
76
+ #: .././classes/class.yksemeBase.php:1028
77
+ msgid "Last Name"
78
+ msgstr "Cyfenw"
79
+
80
+ #: .././classes/class.yksemeBase.php:1031
81
+ msgid "Language"
82
+ msgstr "iaith"
83
+
84
+ #: .././classes/class.yksemeBase.php:1054
85
+ msgid "Groups Subscribed To"
86
+ msgstr "Grwpiau tanysgrifio i"
87
+
88
+ #: .././classes/class.yksemeBase.php:1104
89
+ msgid "Subscriber Notes"
90
+ msgstr "Nodiadau tanysgrifiwr"
91
+
92
+ #: .././classes/class.yksemeBase.php:1109
93
+ msgid "Written by"
94
+ msgstr "ysgrifennwyd gan"
95
+
96
+ #: .././classes/class.yksemeBase.php:1109
97
+ msgid "Created on"
98
+ msgstr "Crëwyd ar"
99
+
100
+ #: .././classes/class.yksemeBase.php:1251
101
+ #: .././classes/class.yksemeBase.php:1253
102
+ msgid "MailChimp Forms"
103
+ msgstr "Ffurflenni MailChimp"
104
+
105
+ #: .././classes/class.yksemeBase.php:1253
106
+ msgid "MailChimp Settings"
107
+ msgstr "Gosodiadau MailChimp"
108
+
109
+ #: .././classes/class.yksemeBase.php:1254
110
+ msgid "Manage List Forms"
111
+ msgstr "Rheoli Ffurflenni Rhestr"
112
+
113
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
114
+ msgid "About YIKES, Inc."
115
+ msgstr "Amdanom YIKES, Inc"
116
+
117
+ #: .././classes/class.yksemeBase.php:1430
118
+ msgid "One or more fields are empty"
119
+ msgstr "Un neu fwy o feysydd yn wag"
120
+
121
+ #: .././classes/class.yksemeBase.php:1480
122
+ msgid "Your List Was Successfully Saved!"
123
+ msgstr "Eich Rhestr A oedd Cadwyd yn llwyddiannus!"
124
+
125
+ #: .././classes/class.yksemeBase.php:1482
126
+ msgid "I'm sorry there was an error with your request."
127
+ msgstr "Mae'n ddrwg gen i, roedd gwall gyda'ch cais."
128
+
129
+ #: .././classes/class.yksemeBase.php:1488
130
+ msgid "MailChimp List name"
131
+ msgstr "Enw'r Rhestr MailChimp"
132
+
133
+ #: .././classes/class.yksemeBase.php:1494
134
+ #: .././classes/class.yksemeBase.php:1504
135
+ #, php-format
136
+ msgid "%1$s"
137
+ msgstr ""
138
+
139
+ #: .././classes/class.yksemeBase.php:1512
140
+ msgid "MailChimp List ID"
141
+ msgstr "MailChimp Rhestr ID"
142
+
143
+ #: .././classes/class.yksemeBase.php:1518
144
+ msgid "Shortcode"
145
+ msgstr "Shortcode"
146
+
147
+ #: .././classes/class.yksemeBase.php:1521
148
+ msgid ""
149
+ "Paste this shortcode into whatever page or post you want to add this form to"
150
+ msgstr ""
151
+ "Pastiwch shortcode hwn i beth bynnag dudalen neu swydd yr ydych eisiau "
152
+ "ychwanegu y ffurflen hon i"
153
+
154
+ #: .././classes/class.yksemeBase.php:1526
155
+ msgid "PHP Snippet"
156
+ msgstr "PHP Snippet"
157
+
158
+ #: .././classes/class.yksemeBase.php:1529
159
+ msgid "Use this code to add this form to a template file"
160
+ msgstr "Defnyddiwch y cod hwn i ychwanegu y ffurflen hon at ffeil dempled"
161
+
162
+ #: .././classes/class.yksemeBase.php:1534
163
+ msgid "Number of Subscribers"
164
+ msgstr "Nifer o Tanysgrifwyr"
165
+
166
+ #: .././classes/class.yksemeBase.php:1543
167
+ msgid "Form Fields"
168
+ msgstr "Meysydd Ffurflen"
169
+
170
+ #: .././classes/class.yksemeBase.php:1545
171
+ msgid ""
172
+ "Check the fields you want included in your form (Email Address is required)."
173
+ msgstr ""
174
+ "Gwiriwch y caeau ydych am eu cynnwys yn eich ffurflen (Mae angen Cyfeiriad e-"
175
+ "bost)."
176
+
177
+ #: .././classes/class.yksemeBase.php:1548
178
+ msgid ""
179
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
180
+ msgstr ""
181
+ "Defnyddiwch y saethau gwyrdd i lusgo-a-gollwng y caeau a ad-drefnu eu trefn."
182
+
183
+ #: .././classes/class.yksemeBase.php:1554
184
+ msgid "Active Fields"
185
+ msgstr "Meysydd Actif"
186
+
187
+ #: .././classes/class.yksemeBase.php:1563
188
+ msgid "Drag"
189
+ msgstr "Llusgwch"
190
+
191
+ #: .././classes/class.yksemeBase.php:1563
192
+ msgid "drop"
193
+ msgstr "galw heibio"
194
+
195
+ #: .././classes/class.yksemeBase.php:1568
196
+ msgid "Merge field"
197
+ msgstr "Cyfuno maes"
198
+
199
+ #: .././classes/class.yksemeBase.php:1569
200
+ msgid "Placeholder"
201
+ msgstr "Dalfan"
202
+
203
+ #: .././classes/class.yksemeBase.php:1577
204
+ msgid "Redirect User On Submission"
205
+ msgstr "Ailgyfeirio Defnyddiwr Ar Cyflwyniad"
206
+
207
+ #: .././classes/class.yksemeBase.php:1581
208
+ msgid "choose a page to redirect the user to after they submit the form."
209
+ msgstr ""
210
+ "dewis dudalen neu osod URL arferiad i ailgyfeirio'r defnyddiwr i ar ôl "
211
+ "iddynt gyflwyno'r ffurflen."
212
+
213
+ #: .././classes/class.yksemeBase.php:1584
214
+ msgid "Select A Post/Page"
215
+ msgstr "Dewiswch A Bost / Page"
216
+
217
+ #: .././classes/class.yksemeBase.php:1638
218
+ msgid "Save Form Settings"
219
+ msgstr "Rheoli Mailchimp Ffurflenni Gosodiadau"
220
+
221
+ #: .././classes/class.yksemeBase.php:1639
222
+ msgid "Delete Form"
223
+ msgstr "Dileu Ffurflen"
224
+
225
+ #: .././classes/class.yksemeBase.php:1640
226
+ msgid "Re-Import Form Fields from MailChimp"
227
+ msgstr "Os gwelwch yn dda mewnforio rhai rhestrau o MailChimp"
228
+
229
+ #: .././classes/class.yksemeBase.php:2168
230
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
231
+ msgstr "Cofrestrwch Me Up For Cylchlythyr MAILCHIMP-LLE'R-HWN-TEXT yn"
232
+
233
+ #: .././pages/about.php:27
234
+ msgid "YIKES, Inc. Web Design and Development"
235
+ msgstr "YIKES, Inc Dylunio a Datblygu'r We"
236
+
237
+ #: .././pages/about.php:29
238
+ msgid "Smart, effective, beautifully designed web solutions"
239
+ msgstr ", Atebion Smart, effeithiol a gynlluniwyd hardd ar y we"
240
+
241
+ #: .././pages/about.php:32
242
+ msgid ""
243
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
244
+ "custom WordPress themes and plugins every day."
245
+ msgstr ""
246
+ "YIKES wedi ei leoli yn y gymdogaeth Fishtown Philadelphia lle rydym yn "
247
+ "adeiladu arfer themâu a plugins WordPress bob dydd."
248
+
249
+ #: .././pages/about.php:36
250
+ msgid ""
251
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
252
+ "WordCamps"
253
+ msgstr ""
254
+ "Yn YIKES ein bodd WordPress! Cyd-Perchennog, Tracy LEVESQUE wedi ei gyflwyno "
255
+ "mewn WordCamps"
256
+
257
+ #: .././pages/about.php:36
258
+ msgid "and"
259
+ msgstr "ac"
260
+
261
+ #: .././pages/about.php:36
262
+ msgid "She also teaches WordPress classes for"
263
+ msgstr "Mae hi hefyd yn dysgu dosbarthiadau WordPress ar gyfer"
264
+
265
+ #: .././pages/about.php:40
266
+ msgid ""
267
+ "In addition to making great WordPress sites we are also committed to the "
268
+ "sustainable business movement. We observe the triple bottom line: people, "
269
+ "planet, profit and work to help build a more socially, environmentally and "
270
+ "financially sustainable local economy. We even have a"
271
+ msgstr ""
272
+ "Yn ogystal â gwneud safleoedd WordPress mawr rydym hefyd wedi ymrwymo i "
273
+ "symud busnes cynaliadwy. Rydym yn arsylwi ar y llinell isaf driphlyg: pobl, "
274
+ "planed, elw a gweithio i helpu i adeiladu economi leol gynaliadwy yn "
275
+ "gymdeithasol, yn amgylcheddol ac yn ariannol. Rydym hyd yn oed yn cael"
276
+
277
+ #: .././pages/about.php:40
278
+ msgid "LEED Platinum office"
279
+ msgstr "Swyddfa LEED Platinwm"
280
+
281
+ #: .././pages/about.php:44
282
+ msgid ""
283
+ "If you're interested in hiring us for WordPress development, or just want to "
284
+ "learn more about us, please visit"
285
+ msgstr ""
286
+ "Os oes gennych ddiddordeb mewn llogi ni ar gyfer datblygu WordPress, neu dim "
287
+ "ond eisiau i ddysgu mwy amdanom ni, ewch i"
288
+
289
+ #: .././pages/lists.php:8
290
+ msgid "No forms have been added yet."
291
+ msgstr "Nid oes unrhyw ffurflenni wedi cael eu hychwanegu eto."
292
+
293
+ #: .././pages/lists.php:39
294
+ msgid "Oops.. The list ID you entered appears to be incorrect."
295
+ msgstr "Wps .. Mae'r ID y rhestr a roesoch yn ymddangos i fod yn anghywir."
296
+
297
+ #: .././pages/lists.php:44
298
+ msgid "There was an error!"
299
+ msgstr "Roedd gwall!"
300
+
301
+ #: .././pages/lists.php:135
302
+ msgid "You need to select a Mailchimp list in order to create a form for it"
303
+ msgstr "Rhaid i chi ddewis rhestr Mailchimp er mwyn creu ffurflen ar ei gyfer"
304
+
305
+ #: .././pages/lists.php:173
306
+ msgid "Are you sure you want to delete this form?"
307
+ msgstr "Ydych chi'n siŵr eich bod am ddileu'r ffurflen hon?"
308
+
309
+ #: .././pages/lists.php:206
310
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
311
+ msgstr "Ydych chi'n siŵr eich bod am ail-fewnforio eich caeau o MailChimp?"
312
+
313
+ #: .././pages/lists.php:228
314
+ msgid "Looks like this form is already up to date!"
315
+ msgstr "Edrych fel y ffurflen hon eisoes yn gyfoes!"
316
+
317
+ #: .././pages/lists.php:326
318
+ msgid "Are you sure you want to unsubscribe"
319
+ msgstr "Ydych chi'n siŵr eich bod am i ddad-danysgrifio"
320
+
321
+ #: .././pages/lists.php:326
322
+ msgid "from this list?"
323
+ msgstr "o'r rhestr hon?"
324
+
325
+ #: .././pages/lists.php:342
326
+ msgid "was successfully unsubscribed from this list."
327
+ msgstr "ei unsubscribed llwyddiannus o'r rhestr hon."
328
+
329
+ #: .././pages/lists.php:448 .././pages/options.php:196
330
+ #: .././pages/options.php:416
331
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
332
+ msgstr "Ffurflenni Hawdd Mailchimp gan YIKES, Inc"
333
+
334
+ #: .././pages/lists.php:454
335
+ msgid "Before you can add MailChimp forms to your site, you need to"
336
+ msgstr ""
337
+ "Cyn i chi ychwanegu ffurflenni MailChimp at eich safle, mae angen i chi"
338
+
339
+ #: .././pages/lists.php:454
340
+ msgid "go to the MailChimp Settings page"
341
+ msgstr "ewch i'r dudalen Gosodiadau MailChimp"
342
+
343
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
344
+ msgid "and add your API Key."
345
+ msgstr "ac ychwanegwch eich API Allweddol."
346
+
347
+ #: .././pages/lists.php:462
348
+ msgid "You must enter a valid API key to import and manage your lists."
349
+ msgstr "Rhaid i chi roi allwedd API dilys i fewnforio a rheoli eich rhestrau."
350
+
351
+ #: .././pages/lists.php:473
352
+ msgid "Your Lists"
353
+ msgstr "Eich Rhestrau"
354
+
355
+ #: .././pages/lists.php:483
356
+ msgid "Manage Forms"
357
+ msgstr "Rheoli Ffurflenni"
358
+
359
+ #: .././pages/options.php:41
360
+ msgid "The options were saved successfully!"
361
+ msgstr "Yr opsiynau harbed yn llwyddiannus!"
362
+
363
+ #: .././pages/options.php:44
364
+ msgid "The options could not be saved (or you did not change them)."
365
+ msgstr "Ni allai'r opsiynau yn cael eu cadw (neu nad oeddech yn eu newid)."
366
+
367
+ #: .././pages/options.php:96
368
+ msgid "Valid API Key"
369
+ msgstr "API Valid Allweddol"
370
+
371
+ #: .././pages/options.php:102
372
+ msgid "Sorry, that is an invalid MailChimp API key."
373
+ msgstr "Mae'n ddrwg gennyf, hynny yw allwedd API MailChimp annilys."
374
+
375
+ #: .././pages/options.php:108
376
+ msgid ""
377
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
378
+ "further information."
379
+ msgstr ""
380
+ "Mae'n ddrwg gennyf, hynny yw allwedd API MailChimp annilys. Os gwelwch yn "
381
+ "dda edrych ar y consol am wybodaeth bellach."
382
+
383
+ #: .././pages/options.php:117
384
+ msgid "Error: Please enter a valid Mail Chimp API Key."
385
+ msgstr "Gwall: Rhowch dilys Post Chimp API Allweddol."
386
+
387
+ #: .././pages/options.php:199
388
+ msgid "Manage Mailchimp Forms Settings"
389
+ msgstr "Rheoli Mailchimp Ffurflenni Gosodiadau"
390
+
391
+ #: .././pages/options.php:205
392
+ msgid "WordPress Version Number Error"
393
+ msgstr "Fersiwn wordpress"
394
+
395
+ #: .././pages/options.php:206
396
+ msgid ""
397
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
398
+ "You won't be able to access the tinyMCE button to insert forms into pages "
399
+ "and posts unless you update to 3.9 or later."
400
+ msgstr ""
401
+ "Mae'n ddrwg gennym, ond mae'n edrych fel eich ddefnyddio fersiwn hen ffasiwn "
402
+ "o WordPress. Ni fyddwch yn gallu cael mynediad i'r botwm TinyMCE i osod "
403
+ "ffurflenni i mewn i tudalennau a swyddi oni bai eich bod yn diweddaru i 3.9 "
404
+ "neu'n hwyrach."
405
+
406
+ #: .././pages/options.php:215
407
+ msgid "LocalHost Detected :"
408
+ msgstr "Localhost a ddatryswyd:"
409
+
410
+ #: .././pages/options.php:216
411
+ msgid ""
412
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
413
+ msgstr "Ffurflenni Hawdd Mailchimp gan YIKES, Inc"
414
+
415
+ #: .././pages/options.php:217
416
+ msgid ""
417
+ "If you are unable to validate your API key, and receive the error message"
418
+ msgstr ""
419
+ "Os nad ydych yn gallu i ddilysu eich allwedd API, ac yn derbyn y neges gwall"
420
+
421
+ #: .././pages/options.php:217
422
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
423
+ msgstr "\"Broblem tystysgrif SSL: methu â chael tystysgrif cyhoeddwr lleol\" "
424
+
425
+ #: .././pages/options.php:217
426
+ msgid "follow the tutorial located "
427
+ msgstr "dilynwch y tiwtorial leoli "
428
+
429
+ #: .././pages/options.php:230
430
+ msgid "Your Mailchimp API Key"
431
+ msgstr "Eich Mailchimp API Allweddol"
432
+
433
+ #: .././pages/options.php:238
434
+ msgid ""
435
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
436
+ "site to communicate with your MailChimp account."
437
+ msgstr ""
438
+ "Os gwelwch yn dda rhowch eich Allwedd API MailChimp uchod. Mae'r API "
439
+ "Allweddol yn caniatáu eich safle WordPress i gyfathrebu gyda'ch cyfrif "
440
+ "MailChimp."
441
+
442
+ #: .././pages/options.php:239
443
+ msgid "For more help, visit the MailChimp Support article"
444
+ msgstr "Am fwy o help, ewch i'r erthygl Cymorth MailChimp"
445
+
446
+ #: .././pages/options.php:239
447
+ msgid "Where can I find my API Key?"
448
+ msgstr "Ble y gallaf gael fy API Allweddol?"
449
+
450
+ #: .././pages/options.php:244
451
+ msgid "Preferred Form Layout"
452
+ msgstr "Ffurflen a Ffefrir Layout"
453
+
454
+ #: .././pages/options.php:247
455
+ msgid "table"
456
+ msgstr "tabl"
457
+
458
+ #: .././pages/options.php:248
459
+ msgid "div"
460
+ msgstr "div"
461
+
462
+ #: .././pages/options.php:256
463
+ msgid "Choose whether you want your forms to use a table or div layout."
464
+ msgstr ""
465
+ "Dewiswch a ydych am i'ch ffurflenni i'w defnyddio tabl neu gynllun div."
466
+
467
+ #: .././pages/options.php:261
468
+ msgid "Advanced Error Messaging"
469
+ msgstr "Gwall Uwch Messaging"
470
+
471
+ #: .././pages/options.php:264
472
+ msgid "Disabled"
473
+ msgstr "Anabl"
474
+
475
+ #: .././pages/options.php:265
476
+ msgid "Enabled"
477
+ msgstr "Galluogwyd"
478
+
479
+ #: .././pages/options.php:273
480
+ msgid ""
481
+ "Enable if you're having problems with your forms sending data to MailChimp. "
482
+ "Enabling Advanced Error Messaging will show you the exact error codes "
483
+ "MailChimp is returning."
484
+ msgstr ""
485
+ "Galluogi os ydych yn cael problemau gyda'ch ffurflenni anfon data i "
486
+ "MailChimp. Bydd Galluogi Negeseuon Gwall Uwch yn dangos i chi y codau gwall "
487
+ "union MailChimp yn dychwelyd."
488
+
489
+ #: .././pages/options.php:281
490
+ msgid "Single Opt-In"
491
+ msgstr "Sengl Opt-In"
492
+
493
+ #: .././pages/options.php:282
494
+ msgid "Double Opt-In"
495
+ msgstr "Dwbl Opt-In"
496
+
497
+ #: .././pages/options.php:290
498
+ msgid ""
499
+ "A single opt-in will add the user to your list without any further "
500
+ "interaction."
501
+ msgstr ""
502
+ "Bydd un opt-yn ychwanegu'r defnyddiwr at eich rhestr heb unrhyw ryngweithio "
503
+ "pellach."
504
+
505
+ #: .././pages/options.php:291
506
+ msgid ""
507
+ "A double opt-in will send an email to the user asking them to confirm their "
508
+ "subscription."
509
+ msgstr ""
510
+ "Bydd dwbl optio mewn anfon e-bost at y defnyddiwr yn gofyn iddynt gadarnhau "
511
+ "eu tanysgrifiad."
512
+
513
+ #: .././pages/options.php:292
514
+ msgid "This will also dictate the opt-in settings for people leaving comments."
515
+ msgstr ""
516
+ "Bydd hyn hefyd yn pennu'r lleoliadau optio i mewn ar gyfer pobl sy'n gadael "
517
+ "sylwadau."
518
+
519
+ #: .././pages/options.php:297
520
+ msgid "Custom Opt-In Message"
521
+ msgstr "Custom Opt-In Neges"
522
+
523
+ #: .././pages/options.php:299
524
+ msgid "Double Opt-In Message"
525
+ msgstr "Dwbl Opt-In Neges"
526
+
527
+ #: .././pages/options.php:301
528
+ msgid "Single Opt-In Message"
529
+ msgstr "Neges Opt-In Sengl"
530
+
531
+ #: .././pages/options.php:307
532
+ msgid "Interest Group Label"
533
+ msgstr "Label Grŵp Diddordeb"
534
+
535
+ #: .././pages/options.php:316
536
+ msgid ""
537
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
538
+ "group names."
539
+ msgstr ""
540
+ "Testun i arddangos uchod grwpiau diddordeb. Gadewch yn wag i ddefnyddio "
541
+ "enwau grŵp diddordeb MailChimp."
542
+
543
+ #: .././pages/options.php:321
544
+ msgid "Display opt-in checkbox on comment forms?"
545
+ msgstr "Arddangos optio i mewn blwch ar ffurflenni sylwadau?"
546
+
547
+ #: .././pages/options.php:324
548
+ msgid "Hide"
549
+ msgstr "Cuddio"
550
+
551
+ #: .././pages/options.php:325
552
+ msgid "Show"
553
+ msgstr "Dangos"
554
+
555
+ #: .././pages/options.php:333
556
+ msgid ""
557
+ "This will display a checkbox just above the submit button on all comment "
558
+ "forms. If selected, any users leaving comments will also be added to the "
559
+ "mailing list."
560
+ msgstr ""
561
+ "Bydd hyn yn dangos blwch ticio ychydig uwchben y botwm cyflwyno ar bob "
562
+ "ffurflen sylwadau. Os cewch eich dewis, bydd unrhyw ddefnyddwyr sy'n gadael "
563
+ "sylwadau hefyd yn cael eu hychwanegu at y rhestr bostio."
564
+
565
+ #: .././pages/options.php:338
566
+ msgid "Custom Comment Checkbox Text"
567
+ msgstr "Custom Sylw Blwch ticio Testun"
568
+
569
+ #: .././pages/options.php:345
570
+ msgid "Default List"
571
+ msgstr "Rhestr ddiofyn"
572
+
573
+ #: .././pages/options.php:360
574
+ msgid ""
575
+ "This is the default list users will be subscribed to when submitting a "
576
+ "comment."
577
+ msgstr ""
578
+ "Mae hyn yw y bydd y defnyddwyr rhestr ragosodedig yn cael ei tanysgrifio i "
579
+ "wrth gyflwyno sylw."
580
+
581
+ #: .././pages/options.php:361
582
+ msgid ""
583
+ "It is best to select a form where only the email , first name and/or last "
584
+ "name are required or you may run into issues."
585
+ msgstr ""
586
+ "Mae'n well i ddewis ffurflen lle mai dim ond yr e-bost, enw cyntaf a / neu "
587
+ "enw olaf yn ofynnol neu efallai y byddwch yn rhedeg i mewn i faterion."
588
+
589
+ #: .././pages/options.php:373
590
+ msgid "Plugin Information"
591
+ msgstr "Gwybodaeth Ategyn"
592
+
593
+ #: .././pages/options.php:376
594
+ msgid "If you experience any issues with our plugin, please"
595
+ msgstr "Os ydych yn cael unrhyw broblemau gyda'n ategyn, os gwelwch yn dda"
596
+
597
+ #: .././pages/options.php:376
598
+ msgid "submit a New Issue on our Github Issue Tracker"
599
+ msgstr "cyflwyno Mater newydd ar ein Tracker Github Rhifyn"
600
+
601
+ #: .././pages/options.php:376
602
+ msgid ""
603
+ "Please include the information below to help us troubleshoot your problem."
604
+ msgstr "Cofiwch gynnwys y wybodaeth isod i'n helpu i ddatrys eich problem."
605
+
606
+ #: .././pages/options.php:384
607
+ msgid "Plugin Version"
608
+ msgstr "Fersiwn Ategyn"
609
+
610
+ #: .././pages/options.php:388
611
+ msgid "Wordpress Version"
612
+ msgstr "Fersiwn wordpress"
613
+
614
+ #: .././pages/options.php:392
615
+ msgid "Browser Information"
616
+ msgstr "Gwybodaeth Porydd"
617
+
618
+ #: .././pages/options.php:420
619
+ msgid "Error"
620
+ msgstr "Gwall"
621
+
622
+ #: .././pages/options.php:421
623
+ msgid ""
624
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
625
+ "cURL to send and retreive data."
626
+ msgstr ""
627
+ "Mae'n ddrwg gennym, ond cURL wedi ei analluogi ar eich gweinydd. Mae'r API "
628
+ "MailChimp defnyddio cURL i anfon a retreive data."
629
+
630
+ #: .././pages/options.php:426
631
+ msgid "Help!"
632
+ msgstr "Help!"
633
+
634
+ #: .././pages/options.php:426
635
+ msgid "What is cURL?"
636
+ msgstr "Beth yw cURL?"
637
+
638
+ #: .././pages/options.php:426
639
+ msgid "Check phpinfo()"
640
+ msgstr "Gwiriwch phpinfo ()"
641
+
642
+ #: .././pages/options.php:428
643
+ msgid "Steps To Resolve The Issue"
644
+ msgstr "Camau i ddatrys y mater"
645
+
646
+ #: .././pages/options.php:430
647
+ msgid ""
648
+ "You can enable cURL by turning on the cURL module within your php.ini file"
649
+ msgstr ""
650
+ "Gallwch alluogi cURL trwy droi ar y modiwl cURL o fewn eich ffeil php.ini"
651
+
652
+ #: .././pages/options.php:430
653
+ msgid "You should find the php.ini file located here : "
654
+ msgstr "Dylech ddod o hyd i'r ffeil php.ini lleoli yma: "
655
+
656
+ #: .././pages/options.php:431
657
+ msgid ""
658
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
659
+ msgstr ""
660
+ "Ar ôl dod o hyd, yn agor i fyny php.ini a lleoli'r llinell \"; estyniad = "
661
+ "php_curl.dll\"."
662
+
663
+ #: .././pages/options.php:432
664
+ msgid ""
665
+ "Remove the semi colon before the line, to un-comment it and make the module "
666
+ "active."
667
+ msgstr ""
668
+ "Tynnwch y colon lled cyn i'r llinell, chi ddad-sylwadau ac yn gwneud y "
669
+ "modiwl gweithredol."
670
+
671
+ #: .././pages/options.php:433
672
+ msgid "Re-save and close the file."
673
+ msgstr "Ail-arbed a chau'r ffeil."
674
+
675
+ #: .././pages/options.php:434
676
+ msgid "Re-load this page."
677
+ msgstr "Ail-lwytho'r dudalen hon."
678
+
679
+ #: .././templates/shortcode_error.php:1
680
+ msgid "There was an error calling the mailchimp list."
681
+ msgstr "Roedd gwall yn galw y rhestr mailchimp."
682
+
683
+ #: .././templates/shortcode_error_data.php:1
684
+ msgid ""
685
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
686
+ "List Forms\" page."
687
+ msgstr ""
688
+ "Nid yw'r rhestr yn bodoli! Gwnewch yn siŵr eich bod wedi mewnforio y rhestr "
689
+ "ar y \"Rheoli Ffurflenni Rhestr\" dudalen."
690
+
691
+ #: .././templates/shortcode_error_exists.php:1
692
+ msgid "This list was already placed on this page!"
693
+ msgstr "Mae'r rhestr hon yn ei roi eisoes ar y dudalen hon!"
694
+
695
+ #: .././templates/shortcode_error_no_API_key.php:1
696
+ msgid "Woops! No Valid API Key Found. Double check your settings."
697
+ msgstr ""
698
+ "Woops! Dim Allwedd API Dilys wedi ei ddarganfod. Dwbl gwirio eich gosodiadau."
699
+
700
+ #: .././templates/shortcode_form.php:11
701
+ msgid "Oops.. Don't forget to fill-in the following fields"
702
+ msgstr "Wps .. Peidiwch ag anghofio llenwi-yn y meysydd canlynol"
703
+
704
+ #: .././templates/shortcode_form.php:74
705
+ msgid "required field"
706
+ msgstr "maes y mae'n"
707
+
708
+ #: .././templates/yikes-mailchimp-widget.php:15
709
+ #: .././templates/yikes-mailchimp-widget.php:18
710
+ msgid "MailChimp Signup Form"
711
+ msgstr "Ffurflen Cofrestru MailChimp"
712
+
713
+ #: .././templates/yikes-mailchimp-widget.php:27
714
+ msgid "Select Which Form You Would Like To Display:"
715
+ msgstr "Dewiswch Pa Ffurflen Hoffech i'w Dangos:"
716
+
717
+ #: .././templates/yikes-mailchimp-widget.php:30
718
+ msgid "Select a Form to Display"
719
+ msgstr "Dewiswch Ffurflen i Arddangos"
720
+
721
+ #: .././templates/yikes-mailchimp-widget.php:47
722
+ msgid "Please import MailChimp forms"
723
+ msgstr "Os gwelwch yn dda mewnforio ffurflenni MailChimp"
724
+
725
+ #: .././templates/yikes-mailchimp-widget.php:49
726
+ msgid "Please import some lists from MailChimp"
727
+ msgstr "Os gwelwch yn dda mewnforio rhai rhestrau o MailChimp"
728
+
729
+ #: .././templates/yikes-mailchimp-widget.php:52
730
+ msgid "Import Lists Now"
731
+ msgstr "Rhestrau Mewnforio Nawr"
732
+
733
+ #: .././templates/yikes-mailchimp-widget.php:73
734
+ msgid ""
735
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
736
+ "least one list to use the Easy MailChimp widget."
737
+ msgstr ""
738
+ "Wps! Mae'n edrych yn debyg nad ydych wedi mewnforio unrhyw restrau eto. "
739
+ "Mae'n rhaid i chi fewnforio o leiaf un rhestr i ddefnyddio'r teclyn Hawdd "
740
+ "MailChimp."
741
+
742
+ #: .././templates/yikes-mailchimp-widget.php:80
743
+ msgid ""
744
+ "Oops! It looks like you forgot to select a form to display here. Go to "
745
+ "'Appearance > Widgets' and select a form to display."
746
+ msgstr ""
747
+ "Wps! Mae'n edrych fel chi wedi anghofio i ddewis ffurflen i arddangos yma. "
748
+ "Ewch i 'Ymddangosiad> Widgets' a dewis ffurflen i arddangos."
749
+
750
+ #: .././templates/yikes-mailchimp-widget.php:117
751
+ msgid "Sign Up For Our Newsletter"
752
+ msgstr "Cofrestrwch Up For Ein Llythyr Newyddion"
753
+
754
+ #: .././templates/yikes-mailchimp-widget.php:129
755
+ msgid "Sign Me Up"
756
+ msgstr "Cofrestrwch Me Up"
757
+
758
+ #: .././templates/yikes-mailchimp-widget.php:133
759
+ msgid "Title:"
760
+ msgstr "Teitl:"
761
+
762
+ #: .././templates/yikes-mailchimp-widget.php:138
763
+ msgid "Form Text:"
764
+ msgstr "Ffurflen testun:"
765
+
766
+ #: .././templates/yikes-mailchimp-widget.php:146
767
+ msgid "Submit Button Text:"
768
+ msgstr "Submit Button testun:"
769
+
770
+ #: .././templates/yikes-mailchimp-widget.php:156
771
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
772
+ msgstr ""
773
+ "Wps! Mae'n edrych yn debyg nad ydych wedi ychwanegu eich allwedd API! Ewch "
774
+ "draw i'r"
775
+
776
+ #: .././templates/yikes-mailchimp-widget.php:156
777
+ msgid "Settings page"
778
+ msgstr "Dudalen Gosodiadau"
779
+
780
+ #~ msgid "No API Key or List Id Exist!"
781
+ #~ msgstr "Dim Allwedd API neu Restr Id Bodoli!"
languages/yikes-inc-easy-mailchimp-extender-de_DE.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-de_DE.po ADDED
@@ -0,0 +1,800 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:23-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:47-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: de\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "Vielen Dank für Ihre Anmeldung!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "Vielen Dank für Ihre Anmeldung! Überprüfen Sie Ihre E-Mail für die "
29
+ "Bestätigung."
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "Wählen Sie Ihr Interessengebiet"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "Klicken Sie auf einen Teilnehmer, um weitere Informationen zu sehen"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "E-Mail"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "Datum Gezeichnetes"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr ""
50
+ "Es tut uns leid Sie nicht Zeit haben noch keine Teilnehmer in dieser Liste!"
51
+
52
+ #: .././classes/class.yksemeBase.php:998
53
+ msgid "Back to Subscriber List"
54
+ msgstr "Zurück zum Abonnenten-Liste"
55
+
56
+ #: .././classes/class.yksemeBase.php:999
57
+ msgid "Subscriber Details"
58
+ msgstr "Subscriber-Details"
59
+
60
+ #: .././classes/class.yksemeBase.php:1010
61
+ msgid "Overview"
62
+ msgstr "Überblick"
63
+
64
+ #: .././classes/class.yksemeBase.php:1015
65
+ msgid "First Name"
66
+ msgstr "Vorname"
67
+
68
+ #: .././classes/class.yksemeBase.php:1018
69
+ msgid "Last Updated"
70
+ msgstr "zuletzt aktualisiert"
71
+
72
+ #: .././classes/class.yksemeBase.php:1021
73
+ msgid "Preferred Email Type"
74
+ msgstr "Bevorzugtes E-Mail-Typ"
75
+
76
+ #: .././classes/class.yksemeBase.php:1028
77
+ msgid "Last Name"
78
+ msgstr "Nachname"
79
+
80
+ #: .././classes/class.yksemeBase.php:1031
81
+ msgid "Language"
82
+ msgstr "Sprache"
83
+
84
+ #: .././classes/class.yksemeBase.php:1054
85
+ msgid "Groups Subscribed To"
86
+ msgstr "Gruppen abonniert"
87
+
88
+ #: .././classes/class.yksemeBase.php:1104
89
+ msgid "Subscriber Notes"
90
+ msgstr "Subscriber Hinweise"
91
+
92
+ #: .././classes/class.yksemeBase.php:1109
93
+ msgid "Written by"
94
+ msgstr "geschrieben von:"
95
+
96
+ #: .././classes/class.yksemeBase.php:1109
97
+ msgid "Created on"
98
+ msgstr "Erstellt am"
99
+
100
+ #: .././classes/class.yksemeBase.php:1251
101
+ #: .././classes/class.yksemeBase.php:1253
102
+ msgid "MailChimp Forms"
103
+ msgstr "MailChimp Formular"
104
+
105
+ #: .././classes/class.yksemeBase.php:1253
106
+ msgid "MailChimp Settings"
107
+ msgstr "MailChimp Einstellungen"
108
+
109
+ #: .././classes/class.yksemeBase.php:1254
110
+ msgid "Manage List Forms"
111
+ msgstr "Verwalten Listenformulare"
112
+
113
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
114
+ msgid "About YIKES, Inc."
115
+ msgstr "Über YIKES, Inc."
116
+
117
+ #: .././classes/class.yksemeBase.php:1430
118
+ msgid "One or more fields are empty"
119
+ msgstr "Ein oder mehrere Felder leer sind"
120
+
121
+ #: .././classes/class.yksemeBase.php:1480
122
+ msgid "Your List Was Successfully Saved!"
123
+ msgstr "Ihre Liste erfolgreich gespeichert!"
124
+
125
+ #: .././classes/class.yksemeBase.php:1482
126
+ msgid "I'm sorry there was an error with your request."
127
+ msgstr "Tut mir leid, es ist ein Fehler mit Ihrer Anfrage."
128
+
129
+ #: .././classes/class.yksemeBase.php:1488
130
+ msgid "MailChimp List name"
131
+ msgstr "MailChimp Listenname"
132
+
133
+ #: .././classes/class.yksemeBase.php:1494
134
+ #: .././classes/class.yksemeBase.php:1504
135
+ #, php-format
136
+ msgid "%1$s"
137
+ msgstr "%1$s"
138
+
139
+ #: .././classes/class.yksemeBase.php:1512
140
+ msgid "MailChimp List ID"
141
+ msgstr "MailChimp Liste ID"
142
+
143
+ #: .././classes/class.yksemeBase.php:1518
144
+ msgid "Shortcode"
145
+ msgstr "Shortcode"
146
+
147
+ #: .././classes/class.yksemeBase.php:1521
148
+ msgid ""
149
+ "Paste this shortcode into whatever page or post you want to add this form to"
150
+ msgstr ""
151
+ "Fügen Sie diesen Shortcode in das, was-Seite oder schreiben Sie, dieses "
152
+ "Formular hinzufügen möchten"
153
+
154
+ #: .././classes/class.yksemeBase.php:1526
155
+ msgid "PHP Snippet"
156
+ msgstr "PHP Snippet"
157
+
158
+ #: .././classes/class.yksemeBase.php:1529
159
+ msgid "Use this code to add this form to a template file"
160
+ msgstr ""
161
+ "Verwenden Sie diesen Code, um diese Form zu einer Vorlage-Datei hinzufügen"
162
+
163
+ #: .././classes/class.yksemeBase.php:1534
164
+ msgid "Number of Subscribers"
165
+ msgstr "Anzahl der Abonnenten"
166
+
167
+ #: .././classes/class.yksemeBase.php:1543
168
+ msgid "Form Fields"
169
+ msgstr "Formularfelder"
170
+
171
+ #: .././classes/class.yksemeBase.php:1545
172
+ msgid ""
173
+ "Check the fields you want included in your form (Email Address is required)."
174
+ msgstr ""
175
+ "Überprüfen Sie die gewünschten Felder im Formular enthalten (E-Mail Adresse "
176
+ "ist erforderlich)."
177
+
178
+ #: .././classes/class.yksemeBase.php:1548
179
+ msgid ""
180
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
181
+ msgstr ""
182
+ "Verwenden Sie die grünen Pfeile, um per Drag-and-Drop die Felder und deren "
183
+ "Reihenfolge zu ändern."
184
+
185
+ #: .././classes/class.yksemeBase.php:1554
186
+ msgid "Active Fields"
187
+ msgstr "Aktive Felder"
188
+
189
+ #: .././classes/class.yksemeBase.php:1563
190
+ msgid "Drag"
191
+ msgstr "Ziehe"
192
+
193
+ #: .././classes/class.yksemeBase.php:1563
194
+ msgid "drop"
195
+ msgstr "fallen"
196
+
197
+ #: .././classes/class.yksemeBase.php:1568
198
+ msgid "Merge field"
199
+ msgstr "Seriendruckfeld"
200
+
201
+ #: .././classes/class.yksemeBase.php:1569
202
+ msgid "Placeholder"
203
+ msgstr "Platzhalter"
204
+
205
+ #: .././classes/class.yksemeBase.php:1577
206
+ msgid "Redirect User On Submission"
207
+ msgstr "Redirect Benutzer Submission"
208
+
209
+ #: .././classes/class.yksemeBase.php:1581
210
+ msgid "choose a page to redirect the user to after they submit the form."
211
+ msgstr ""
212
+ "wählen Sie eine Seite oder einen benutzerdefinierten URL, den Benutzer auf, "
213
+ "nachdem sie das Formular umleiten."
214
+
215
+ #: .././classes/class.yksemeBase.php:1584
216
+ msgid "Select A Post/Page"
217
+ msgstr "Choose Eine Seite"
218
+
219
+ #: .././classes/class.yksemeBase.php:1638
220
+ msgid "Save Form Settings"
221
+ msgstr "Formulare verwalten Mailchimp Einstellungen"
222
+
223
+ #: .././classes/class.yksemeBase.php:1639
224
+ msgid "Delete Form"
225
+ msgstr "Formular löschen"
226
+
227
+ #: .././classes/class.yksemeBase.php:1640
228
+ msgid "Re-Import Form Fields from MailChimp"
229
+ msgstr "Importieren Sie einige Listen von MailChimp"
230
+
231
+ #: .././classes/class.yksemeBase.php:2168
232
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
233
+ msgstr "Schicken Sie mir die MailChimp-REPLACE-DIES-TEXT-Newsletter"
234
+
235
+ #: .././pages/about.php:27
236
+ msgid "YIKES, Inc. Web Design and Development"
237
+ msgstr "YIKES, Inc. Webdesign und-entwicklung"
238
+
239
+ #: .././pages/about.php:29
240
+ msgid "Smart, effective, beautifully designed web solutions"
241
+ msgstr "Intelligent, effektiv, schön gestalteten Web-Lösungen"
242
+
243
+ #: .././pages/about.php:32
244
+ msgid ""
245
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
246
+ "custom WordPress themes and plugins every day."
247
+ msgstr ""
248
+ "YIKES ist in der Nähe von Fishtown Philadelphia, wo wir bauen individuelle "
249
+ "Wordpress-Themes und Plugins jeden Tag entfernt."
250
+
251
+ #: .././pages/about.php:36
252
+ msgid ""
253
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
254
+ "WordCamps"
255
+ msgstr ""
256
+ "Bei YIKES wir lieben Wordpress! Co-Owner, Tracy Levesque hat bei WordCamps "
257
+ "vorgestellt"
258
+
259
+ #: .././pages/about.php:36
260
+ msgid "and"
261
+ msgstr "und"
262
+
263
+ #: .././pages/about.php:36
264
+ msgid "She also teaches WordPress classes for"
265
+ msgstr "Sie unterrichtet auch Klassen für Wordpress"
266
+
267
+ #: .././pages/about.php:40
268
+ msgid ""
269
+ "In addition to making great WordPress sites we are also committed to the "
270
+ "sustainable business movement. We observe the triple bottom line: people, "
271
+ "planet, profit and work to help build a more socially, environmentally and "
272
+ "financially sustainable local economy. We even have a"
273
+ msgstr ""
274
+ "Neben der Herstellung von großen Wordpress-Seiten sind wir auch auf den "
275
+ "nachhaltigen Geschäfts Bewegung verpflichtet. Wir beobachten die Triple "
276
+ "Bottom Line: People, Planet, Profit und Arbeit zum Aufbau einer sozial, "
277
+ "ökologisch und finanziell nachhaltigen lokalen Wirtschaft. Wir haben sogar "
278
+ "eine"
279
+
280
+ #: .././pages/about.php:40
281
+ msgid "LEED Platinum office"
282
+ msgstr "LEED-Platinum-Büro"
283
+
284
+ #: .././pages/about.php:44
285
+ msgid ""
286
+ "If you're interested in hiring us for WordPress development, or just want to "
287
+ "learn more about us, please visit"
288
+ msgstr ""
289
+ "Wenn Sie sich für die Einstellung uns für Wordpress-Entwicklung, oder wollen "
290
+ "einfach nur mehr über uns zu erfahren, besuchen Sie bitte"
291
+
292
+ #: .././pages/lists.php:8
293
+ msgid "No forms have been added yet."
294
+ msgstr "Keine Formulare wurden noch aufgenommen."
295
+
296
+ #: .././pages/lists.php:39
297
+ msgid "Oops.. The list ID you entered appears to be incorrect."
298
+ msgstr "Oops .. Die eingegebene ID-Liste erscheint nicht korrekt zu sein."
299
+
300
+ #: .././pages/lists.php:44
301
+ msgid "There was an error!"
302
+ msgstr "Es gab einen Fehler!"
303
+
304
+ #: .././pages/lists.php:135
305
+ msgid "You need to select a Mailchimp list in order to create a form for it"
306
+ msgstr ""
307
+ "Sie müssen eine Mailchimp Liste auswählen, um eine Form für sie zu schaffen"
308
+
309
+ #: .././pages/lists.php:173
310
+ msgid "Are you sure you want to delete this form?"
311
+ msgstr "Sind Sie sicher, dass Sie dieses Formular löschen?"
312
+
313
+ #: .././pages/lists.php:206
314
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
315
+ msgstr ""
316
+ "Sind Sie sicher, dass Sie re-importieren Sie Ihre Felder aus MailChimp "
317
+ "wollen?"
318
+
319
+ #: .././pages/lists.php:228
320
+ msgid "Looks like this form is already up to date!"
321
+ msgstr "Sieht aus wie diese Form bereits auf dem Laufenden!"
322
+
323
+ #: .././pages/lists.php:326
324
+ msgid "Are you sure you want to unsubscribe"
325
+ msgstr "Sind Sie sicher, dass Sie den Newsletter abbestellen möchten"
326
+
327
+ #: .././pages/lists.php:326
328
+ msgid "from this list?"
329
+ msgstr "von dieser Liste?"
330
+
331
+ #: .././pages/lists.php:342
332
+ msgid "was successfully unsubscribed from this list."
333
+ msgstr "wurde erfolgreich aus dieser Liste abgemeldet."
334
+
335
+ #: .././pages/lists.php:448 .././pages/options.php:196
336
+ #: .././pages/options.php:416
337
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
338
+ msgstr "Einfach Mailchimp Forms by YIKES, Inc."
339
+
340
+ #: .././pages/lists.php:454
341
+ msgid "Before you can add MailChimp forms to your site, you need to"
342
+ msgstr "Bevor Sie MailChimp Formen zu Ihrer Website hinzufügen, müssen Sie"
343
+
344
+ #: .././pages/lists.php:454
345
+ msgid "go to the MailChimp Settings page"
346
+ msgstr "gehen Sie zur Seite Einstellungen MailChimp"
347
+
348
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
349
+ msgid "and add your API Key."
350
+ msgstr "und fügen Sie Ihren API-Key."
351
+
352
+ #: .././pages/lists.php:462
353
+ msgid "You must enter a valid API key to import and manage your lists."
354
+ msgstr ""
355
+ "Sie müssen einen gültigen API-Schlüssel zu importieren und verwalten Sie "
356
+ "Ihre Listen eingeben."
357
+
358
+ #: .././pages/lists.php:473
359
+ msgid "Your Lists"
360
+ msgstr "Ihre Listen"
361
+
362
+ #: .././pages/lists.php:483
363
+ msgid "Manage Forms"
364
+ msgstr "Formulare verwalten"
365
+
366
+ #: .././pages/options.php:41
367
+ msgid "The options were saved successfully!"
368
+ msgstr "Die Optionen wurden erfolgreich gespeichert!"
369
+
370
+ #: .././pages/options.php:44
371
+ msgid "The options could not be saved (or you did not change them)."
372
+ msgstr ""
373
+ "Die Optionen konnten nicht gespeichert werden (oder Sie haben sie nicht)."
374
+
375
+ #: .././pages/options.php:96
376
+ msgid "Valid API Key"
377
+ msgstr "Gültig API Key"
378
+
379
+ #: .././pages/options.php:102
380
+ msgid "Sorry, that is an invalid MailChimp API key."
381
+ msgstr "Sorry, ist, dass ein ungültiger MailChimp API-Schlüssel."
382
+
383
+ #: .././pages/options.php:108
384
+ msgid ""
385
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
386
+ "further information."
387
+ msgstr ""
388
+ "Sorry, ist, dass ein ungültiger MailChimp API-Schlüssel. Bitte überprüfen "
389
+ "Sie die Konsole für weitere Informationen."
390
+
391
+ #: .././pages/options.php:117
392
+ msgid "Error: Please enter a valid Mail Chimp API Key."
393
+ msgstr "Fehler: Bitte geben Sie eine gültige E-Mail Chimp API Key."
394
+
395
+ #: .././pages/options.php:199
396
+ msgid "Manage Mailchimp Forms Settings"
397
+ msgstr "Formulare verwalten Mailchimp Einstellungen"
398
+
399
+ #: .././pages/options.php:205
400
+ msgid "WordPress Version Number Error"
401
+ msgstr "Wordpress-Version"
402
+
403
+ #: .././pages/options.php:206
404
+ msgid ""
405
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
406
+ "You won't be able to access the tinyMCE button to insert forms into pages "
407
+ "and posts unless you update to 3.9 or later."
408
+ msgstr ""
409
+ "Es tut uns leid, aber es sieht aus wie Ihre eine veraltete Version von "
410
+ "Wordpress. Sie werden nicht in der Lage, den TinyMCE-Taste Zugriff auf "
411
+ "Formulare in Seiten und Beiträge einfügen, wenn Sie auf 3.9 oder höher "
412
+ "aktualisieren."
413
+
414
+ #: .././pages/options.php:215
415
+ msgid "LocalHost Detected :"
416
+ msgstr "Localhost erkannt:"
417
+
418
+ #: .././pages/options.php:216
419
+ msgid ""
420
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
421
+ msgstr "Einfach Mailchimp Forms by YIKES, Inc."
422
+
423
+ #: .././pages/options.php:217
424
+ msgid ""
425
+ "If you are unable to validate your API key, and receive the error message"
426
+ msgstr ""
427
+ "Wenn Sie nicht auf Ihren API-Schlüssel zu validieren und die Fehlermeldung"
428
+
429
+ #: .././pages/options.php:217
430
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
431
+ msgstr ""
432
+ "\"SSL-Zertifikat Problem: nicht in der Lage, lokale Aussteller-Zertifikat "
433
+ "bekommen\" "
434
+
435
+ #: .././pages/options.php:217
436
+ msgid "follow the tutorial located "
437
+ msgstr "folgen Sie der Anleitung befindet "
438
+
439
+ #: .././pages/options.php:230
440
+ msgid "Your Mailchimp API Key"
441
+ msgstr "Ihre Mailchimp API Key"
442
+
443
+ #: .././pages/options.php:238
444
+ msgid ""
445
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
446
+ "site to communicate with your MailChimp account."
447
+ msgstr ""
448
+ "Bitte geben Sie Ihren MailChimp API Key oben. Die API-Key können Sie Ihre "
449
+ "Wordpress-Seite, um mit Ihrem MailChimp Account zu kommunizieren."
450
+
451
+ #: .././pages/options.php:239
452
+ msgid "For more help, visit the MailChimp Support article"
453
+ msgstr "Weitere Hilfe finden Sie auf der Support-Artikel MailChimp"
454
+
455
+ #: .././pages/options.php:239
456
+ msgid "Where can I find my API Key?"
457
+ msgstr "Wo kann ich meine API-Schlüssel finden?"
458
+
459
+ #: .././pages/options.php:244
460
+ msgid "Preferred Form Layout"
461
+ msgstr "Bevorzugte Formular-Layout"
462
+
463
+ #: .././pages/options.php:247
464
+ msgid "table"
465
+ msgstr "Tabelle"
466
+
467
+ #: .././pages/options.php:248
468
+ msgid "div"
469
+ msgstr "div"
470
+
471
+ #: .././pages/options.php:256
472
+ msgid "Choose whether you want your forms to use a table or div layout."
473
+ msgstr ""
474
+ "Wählen Sie, ob Sie Ihre Formulare, um eine Tabelle oder div-Layout verwenden "
475
+ "möchten."
476
+
477
+ #: .././pages/options.php:261
478
+ msgid "Advanced Error Messaging"
479
+ msgstr "Advanced Error Messaging"
480
+
481
+ #: .././pages/options.php:264
482
+ msgid "Disabled"
483
+ msgstr "Behindert"
484
+
485
+ #: .././pages/options.php:265
486
+ msgid "Enabled"
487
+ msgstr "Aktiviert"
488
+
489
+ #: .././pages/options.php:273
490
+ msgid ""
491
+ "Enable if you're having problems with your forms sending data to MailChimp. "
492
+ "Enabling Advanced Error Messaging will show you the exact error codes "
493
+ "MailChimp is returning."
494
+ msgstr ""
495
+ "Aktivieren, wenn Sie Probleme mit Ihrer Formulare Senden von Daten an "
496
+ "MailChimp. Aktivieren Advanced Error Messaging zeigen Ihnen die genaue "
497
+ "Fehlercodes MailChimp kehrt zurück."
498
+
499
+ #: .././pages/options.php:281
500
+ msgid "Single Opt-In"
501
+ msgstr "Einzel-Opt-In"
502
+
503
+ #: .././pages/options.php:282
504
+ msgid "Double Opt-In"
505
+ msgstr "Doppel Opt-In"
506
+
507
+ #: .././pages/options.php:290
508
+ msgid ""
509
+ "A single opt-in will add the user to your list without any further "
510
+ "interaction."
511
+ msgstr ""
512
+ "Eine einzige opt-in wird den Benutzer zu Ihrer Liste ohne weitere "
513
+ "Interaktion hinzuzufügen."
514
+
515
+ #: .././pages/options.php:291
516
+ msgid ""
517
+ "A double opt-in will send an email to the user asking them to confirm their "
518
+ "subscription."
519
+ msgstr ""
520
+ "Ein Double-Opt-in eine E-Mail an den Benutzer senden bat sie, ihr Abonnement "
521
+ "zu bestätigen."
522
+
523
+ #: .././pages/options.php:292
524
+ msgid "This will also dictate the opt-in settings for people leaving comments."
525
+ msgstr ""
526
+ "Dies wird auch diktieren die Opt-in-Einstellungen für Leute Kommentare "
527
+ "hinterlassen."
528
+
529
+ #: .././pages/options.php:297
530
+ msgid "Custom Opt-In Message"
531
+ msgstr "Benutzerdefinierte Opt-In Message"
532
+
533
+ #: .././pages/options.php:299
534
+ msgid "Double Opt-In Message"
535
+ msgstr "Doppel Opt-In-Adresse"
536
+
537
+ #: .././pages/options.php:301
538
+ msgid "Single Opt-In Message"
539
+ msgstr "Einzel-Opt-In-Nachricht"
540
+
541
+ #: .././pages/options.php:307
542
+ msgid "Interest Group Label"
543
+ msgstr "Interest Group Label"
544
+
545
+ #: .././pages/options.php:316
546
+ msgid ""
547
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
548
+ "group names."
549
+ msgstr ""
550
+ "Text, über Interessensgruppen an. Leer lassen um MailChimp Interesse "
551
+ "Gruppennamen zu verwenden."
552
+
553
+ #: .././pages/options.php:321
554
+ msgid "Display opt-in checkbox on comment forms?"
555
+ msgstr "Display-Opt-in-Checkbox auf Kommentar Formen?"
556
+
557
+ #: .././pages/options.php:324
558
+ msgid "Hide"
559
+ msgstr "Ausblenden"
560
+
561
+ #: .././pages/options.php:325
562
+ msgid "Show"
563
+ msgstr "Einblenden"
564
+
565
+ #: .././pages/options.php:333
566
+ msgid ""
567
+ "This will display a checkbox just above the submit button on all comment "
568
+ "forms. If selected, any users leaving comments will also be added to the "
569
+ "mailing list."
570
+ msgstr ""
571
+ "Das wird ein Kontrollkästchen knapp über dem Absenden-Button auf allen "
572
+ "Formen Kommentar anzuzeigen. Wenn diese Option ausgewählt, werden alle "
573
+ "Benutzer Kommentare hinterlassen auch an die Mailing-Liste hinzugefügt "
574
+ "werden."
575
+
576
+ #: .././pages/options.php:338
577
+ msgid "Custom Comment Checkbox Text"
578
+ msgstr "Benutzerdefinierte Kommentar Checkbox Text"
579
+
580
+ #: .././pages/options.php:345
581
+ msgid "Default List"
582
+ msgstr "Standardliste"
583
+
584
+ #: .././pages/options.php:360
585
+ msgid ""
586
+ "This is the default list users will be subscribed to when submitting a "
587
+ "comment."
588
+ msgstr ""
589
+ "Dies ist die Standard-Liste Benutzer werden zu bei der Einreichung einen "
590
+ "Kommentar abonniert werden."
591
+
592
+ #: .././pages/options.php:361
593
+ msgid ""
594
+ "It is best to select a form where only the email , first name and/or last "
595
+ "name are required or you may run into issues."
596
+ msgstr ""
597
+ "Es ist am besten, um ein Formular, in dem nur der E-Mail, Vornamen und / "
598
+ "oder Nachnamen erforderlich sind, oder Sie können in Probleme laufen zu "
599
+ "wählen."
600
+
601
+ #: .././pages/options.php:373
602
+ msgid "Plugin Information"
603
+ msgstr "Plugin Informationen"
604
+
605
+ #: .././pages/options.php:376
606
+ msgid "If you experience any issues with our plugin, please"
607
+ msgstr ""
608
+ "Wenn Sie irgendwelche Probleme mit unserem Plugin auftreten, wenden Sie sich "
609
+ "bitte"
610
+
611
+ #: .././pages/options.php:376
612
+ msgid "submit a New Issue on our Github Issue Tracker"
613
+ msgstr "einreichen einer neuen Ausgabe auf unserer Github Issue Tracker"
614
+
615
+ #: .././pages/options.php:376
616
+ msgid ""
617
+ "Please include the information below to help us troubleshoot your problem."
618
+ msgstr ""
619
+ "Bitte geben Sie die folgenden Informationen, die uns helfen zu beheben Ihr "
620
+ "Problem."
621
+
622
+ #: .././pages/options.php:384
623
+ msgid "Plugin Version"
624
+ msgstr "Plugin Version"
625
+
626
+ #: .././pages/options.php:388
627
+ msgid "Wordpress Version"
628
+ msgstr "Wordpress-Version"
629
+
630
+ #: .././pages/options.php:392
631
+ msgid "Browser Information"
632
+ msgstr "Browser-Informationen"
633
+
634
+ #: .././pages/options.php:420
635
+ msgid "Error"
636
+ msgstr "Fehler"
637
+
638
+ #: .././pages/options.php:421
639
+ msgid ""
640
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
641
+ "cURL to send and retreive data."
642
+ msgstr ""
643
+ "Es tut uns leid, aber cURL wird auf dem Server deaktiviert. Die MailChimp "
644
+ "API nutzt cURL um Daten zu senden und abzurufen."
645
+
646
+ #: .././pages/options.php:426
647
+ msgid "Help!"
648
+ msgstr "Hilfe!"
649
+
650
+ #: .././pages/options.php:426
651
+ msgid "What is cURL?"
652
+ msgstr "Was ist cURL?"
653
+
654
+ #: .././pages/options.php:426
655
+ msgid "Check phpinfo()"
656
+ msgstr "Überprüfen Sie phpinfo ()"
657
+
658
+ #: .././pages/options.php:428
659
+ msgid "Steps To Resolve The Issue"
660
+ msgstr "Schritte, um das Problem beheben"
661
+
662
+ #: .././pages/options.php:430
663
+ msgid ""
664
+ "You can enable cURL by turning on the cURL module within your php.ini file"
665
+ msgstr ""
666
+ "Sie können cURL durch Einschalten des cURL-Modul innerhalb der php.ini-Datei "
667
+ "aktivieren"
668
+
669
+ #: .././pages/options.php:430
670
+ msgid "You should find the php.ini file located here : "
671
+ msgstr "Sie sollten die php.ini-Datei finden sich hier: "
672
+
673
+ #: .././pages/options.php:431
674
+ msgid ""
675
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
676
+ msgstr ""
677
+ "Einmal gefunden, öffnen php.ini und suchen Sie die Zeile \"; extension = "
678
+ "php_curl.dll\"."
679
+
680
+ #: .././pages/options.php:432
681
+ msgid ""
682
+ "Remove the semi colon before the line, to un-comment it and make the module "
683
+ "active."
684
+ msgstr ""
685
+ "Entfernen Sie das Semikolon vor der Zeile, die der UN-Kommentar, und nehmen "
686
+ "Sie das Modul aktiv."
687
+
688
+ #: .././pages/options.php:433
689
+ msgid "Re-save and close the file."
690
+ msgstr "Re-Speichern und schließen Sie die Datei."
691
+
692
+ #: .././pages/options.php:434
693
+ msgid "Re-load this page."
694
+ msgstr "Wieder laden Sie diese Seite."
695
+
696
+ #: .././templates/shortcode_error.php:1
697
+ msgid "There was an error calling the mailchimp list."
698
+ msgstr "Es gab einen Fehler Aufruf der MailChimp Liste."
699
+
700
+ #: .././templates/shortcode_error_data.php:1
701
+ msgid ""
702
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
703
+ "List Forms\" page."
704
+ msgstr ""
705
+ "Die Liste gibt es nicht! Stellen Sie sicher, dass Sie die Liste auf der "
706
+ "importiert haben \"Liste verwalten Forms\"-Seite."
707
+
708
+ #: .././templates/shortcode_error_exists.php:1
709
+ msgid "This list was already placed on this page!"
710
+ msgstr "Diese Liste wurde bereits auf dieser Seite platziert!"
711
+
712
+ #: .././templates/shortcode_error_no_API_key.php:1
713
+ msgid "Woops! No Valid API Key Found. Double check your settings."
714
+ msgstr ""
715
+ "Woops! Keine gültige API-Schlüssel gefunden. Überprüfen Sie Ihre "
716
+ "Einstellungen."
717
+
718
+ #: .././templates/shortcode_form.php:11
719
+ msgid "Oops.. Don't forget to fill-in the following fields"
720
+ msgstr "Oops .. Vergessen Sie nicht, füllen Sie die folgenden Felder"
721
+
722
+ #: .././templates/shortcode_form.php:74
723
+ msgid "required field"
724
+ msgstr "Pflichtfeld"
725
+
726
+ #: .././templates/yikes-mailchimp-widget.php:15
727
+ #: .././templates/yikes-mailchimp-widget.php:18
728
+ msgid "MailChimp Signup Form"
729
+ msgstr "MailChimp Anmelden Formular"
730
+
731
+ #: .././templates/yikes-mailchimp-widget.php:27
732
+ msgid "Select Which Form You Would Like To Display:"
733
+ msgstr "Wählen welcher Form Sie anzeigen möchten:"
734
+
735
+ #: .././templates/yikes-mailchimp-widget.php:30
736
+ msgid "Select a Form to Display"
737
+ msgstr "Wählen Sie ein Formular zur Anzeige"
738
+
739
+ #: .././templates/yikes-mailchimp-widget.php:47
740
+ msgid "Please import MailChimp forms"
741
+ msgstr "Bitte importieren MailChimp Formen"
742
+
743
+ #: .././templates/yikes-mailchimp-widget.php:49
744
+ msgid "Please import some lists from MailChimp"
745
+ msgstr "Importieren Sie einige Listen von MailChimp"
746
+
747
+ #: .././templates/yikes-mailchimp-widget.php:52
748
+ msgid "Import Lists Now"
749
+ msgstr "Jetzt importieren Listen"
750
+
751
+ #: .././templates/yikes-mailchimp-widget.php:73
752
+ msgid ""
753
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
754
+ "least one list to use the Easy MailChimp widget."
755
+ msgstr ""
756
+ "Oops! Wie es aussieht, keine Listen importiert haben noch. Sie müssen "
757
+ "zumindest eine Liste zu importieren, um den Easy MailChimp Widget zu "
758
+ "verwenden."
759
+
760
+ #: .././templates/yikes-mailchimp-widget.php:80
761
+ msgid ""
762
+ "Oops! It looks like you forgot to select a form to display here. Go to "
763
+ "'Appearance > Widgets' and select a form to display."
764
+ msgstr ""
765
+ "Oops! Es sieht aus wie Sie vergessen haben, eine Form zu wählen, um hier "
766
+ "angezeigt. Gehen Sie auf \"Darstellung> Widgets\" und wählen Sie eine Form, "
767
+ "um anzuzeigen."
768
+
769
+ #: .././templates/yikes-mailchimp-widget.php:117
770
+ msgid "Sign Up For Our Newsletter"
771
+ msgstr "Anmeldung für unseren Newsletter"
772
+
773
+ #: .././templates/yikes-mailchimp-widget.php:129
774
+ msgid "Sign Me Up"
775
+ msgstr "Sign Me Up"
776
+
777
+ #: .././templates/yikes-mailchimp-widget.php:133
778
+ msgid "Title:"
779
+ msgstr "Titel:"
780
+
781
+ #: .././templates/yikes-mailchimp-widget.php:138
782
+ msgid "Form Text:"
783
+ msgstr "Form-Text:"
784
+
785
+ #: .././templates/yikes-mailchimp-widget.php:146
786
+ msgid "Submit Button Text:"
787
+ msgstr "Absenden Button Text:"
788
+
789
+ #: .././templates/yikes-mailchimp-widget.php:156
790
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
791
+ msgstr ""
792
+ "Oops! Es sieht aus wie Sie hinzugefügt haben Ihren API-Schlüssel! Gehen Sie "
793
+ "zu der"
794
+
795
+ #: .././templates/yikes-mailchimp-widget.php:156
796
+ msgid "Settings page"
797
+ msgstr "Einstellungen Seite"
798
+
799
+ #~ msgid "No API Key or List Id Exist!"
800
+ #~ msgstr "Nein API Key-oder Listen-Id gibt!"
languages/yikes-inc-easy-mailchimp-extender-el.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-el.po ADDED
@@ -0,0 +1,792 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:25-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:47-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: el\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "Σας ευχαριστούμε για την εγγραφή!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "Σας ευχαριστούμε για την εγγραφή! Ελέγξτε το email σας για μήνυμα "
29
+ "επιβεβαίωσης."
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "Επιλέξτε περιοχή που σας ενδιαφέρει"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "Κάντε κλικ σε ένα συνδρομητή για να δείτε περισσότερες πληροφορίες"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "E-Mail"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "Ημερομηνία Εγγεγραμμένα"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr ""
50
+ "Συγνώμη Δεν έχουν επί του παρόντος κανένα συνδρομητές σε αυτή τη λίστα!"
51
+
52
+ #: .././classes/class.yksemeBase.php:998
53
+ msgid "Back to Subscriber List"
54
+ msgstr "Επιστροφή στην λίστα συνδρομητών"
55
+
56
+ #: .././classes/class.yksemeBase.php:999
57
+ msgid "Subscriber Details"
58
+ msgstr "Στοιχεία συνδρομητή"
59
+
60
+ #: .././classes/class.yksemeBase.php:1010
61
+ msgid "Overview"
62
+ msgstr "Επισκόπηση"
63
+
64
+ #: .././classes/class.yksemeBase.php:1015
65
+ msgid "First Name"
66
+ msgstr "Όνομα"
67
+
68
+ #: .././classes/class.yksemeBase.php:1018
69
+ msgid "Last Updated"
70
+ msgstr "Τελευταία Ενημέρωση"
71
+
72
+ #: .././classes/class.yksemeBase.php:1021
73
+ msgid "Preferred Email Type"
74
+ msgstr "Προτιμώμενη Email Τύπος"
75
+
76
+ #: .././classes/class.yksemeBase.php:1028
77
+ msgid "Last Name"
78
+ msgstr "Επώνυμο"
79
+
80
+ #: .././classes/class.yksemeBase.php:1031
81
+ msgid "Language"
82
+ msgstr "γλώσσα"
83
+
84
+ #: .././classes/class.yksemeBase.php:1054
85
+ msgid "Groups Subscribed To"
86
+ msgstr "Ομάδες Εγγεγραμμένα να"
87
+
88
+ #: .././classes/class.yksemeBase.php:1104
89
+ msgid "Subscriber Notes"
90
+ msgstr "Σημειώσεις συνδρομητή"
91
+
92
+ #: .././classes/class.yksemeBase.php:1109
93
+ msgid "Written by"
94
+ msgstr "Συντάχθηκε απο τον"
95
+
96
+ #: .././classes/class.yksemeBase.php:1109
97
+ msgid "Created on"
98
+ msgstr "Δημιουργήθηκε στις"
99
+
100
+ #: .././classes/class.yksemeBase.php:1251
101
+ #: .././classes/class.yksemeBase.php:1253
102
+ msgid "MailChimp Forms"
103
+ msgstr "MailChimp Έντυπα"
104
+
105
+ #: .././classes/class.yksemeBase.php:1253
106
+ msgid "MailChimp Settings"
107
+ msgstr "Ρυθμίσεις MailChimp"
108
+
109
+ #: .././classes/class.yksemeBase.php:1254
110
+ msgid "Manage List Forms"
111
+ msgstr "Διαχειριστείτε Έντυπα Λίστα"
112
+
113
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
114
+ msgid "About YIKES, Inc."
115
+ msgstr "Σχετικά με YIKES, Inc"
116
+
117
+ #: .././classes/class.yksemeBase.php:1430
118
+ msgid "One or more fields are empty"
119
+ msgstr "Ένα ή περισσότερα πεδία είναι κενά"
120
+
121
+ #: .././classes/class.yksemeBase.php:1480
122
+ msgid "Your List Was Successfully Saved!"
123
+ msgstr "Η λίστα σας αποθηκεύτηκε με επιτυχία!"
124
+
125
+ #: .././classes/class.yksemeBase.php:1482
126
+ msgid "I'm sorry there was an error with your request."
127
+ msgstr "Λυπάμαι υπήρχε σφάλμα με το αίτημά σας."
128
+
129
+ #: .././classes/class.yksemeBase.php:1488
130
+ msgid "MailChimp List name"
131
+ msgstr "Όνομα MailChimp Λίστα"
132
+
133
+ #: .././classes/class.yksemeBase.php:1494
134
+ #: .././classes/class.yksemeBase.php:1504
135
+ #, php-format
136
+ msgid "%1$s"
137
+ msgstr "%1$s"
138
+
139
+ #: .././classes/class.yksemeBase.php:1512
140
+ msgid "MailChimp List ID"
141
+ msgstr "MailChimp Λίστα ID"
142
+
143
+ #: .././classes/class.yksemeBase.php:1518
144
+ msgid "Shortcode"
145
+ msgstr "Shortcode"
146
+
147
+ #: .././classes/class.yksemeBase.php:1521
148
+ msgid ""
149
+ "Paste this shortcode into whatever page or post you want to add this form to"
150
+ msgstr ""
151
+ "Επικολλήστε αυτόν τον shortcode σε ό, τι σελίδα ή να δημοσιεύσετε θέλετε να "
152
+ "προσθέσετε αυτή τη φόρμα για να"
153
+
154
+ #: .././classes/class.yksemeBase.php:1526
155
+ msgid "PHP Snippet"
156
+ msgstr "PHP αποσπασμάτων"
157
+
158
+ #: .././classes/class.yksemeBase.php:1529
159
+ msgid "Use this code to add this form to a template file"
160
+ msgstr ""
161
+ "Χρησιμοποιήστε αυτόν τον κωδικό για να προσθέσετε αυτή τη μορφή σε ένα "
162
+ "πρότυπο αρχείο"
163
+
164
+ #: .././classes/class.yksemeBase.php:1534
165
+ msgid "Number of Subscribers"
166
+ msgstr "Αριθμός Συνδρομητών"
167
+
168
+ #: .././classes/class.yksemeBase.php:1543
169
+ msgid "Form Fields"
170
+ msgstr "Τα πεδία φόρμας"
171
+
172
+ #: .././classes/class.yksemeBase.php:1545
173
+ msgid ""
174
+ "Check the fields you want included in your form (Email Address is required)."
175
+ msgstr ""
176
+ "Ελέγξτε τα πεδία που θέλετε να συμπεριληφθούν στη φόρμα σας (διεύθυνση "
177
+ "ηλεκτρονικού ταχυδρομείου απαιτείται)."
178
+
179
+ #: .././classes/class.yksemeBase.php:1548
180
+ msgid ""
181
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
182
+ msgstr ""
183
+ "Χρησιμοποιήστε τα πράσινα βέλη για να drag-and-drop τα πεδία και να "
184
+ "αναδιατάξετε τη σειρά τους."
185
+
186
+ #: .././classes/class.yksemeBase.php:1554
187
+ msgid "Active Fields"
188
+ msgstr "Ενεργά πεδία"
189
+
190
+ #: .././classes/class.yksemeBase.php:1563
191
+ msgid "Drag"
192
+ msgstr "Τραβήξτε"
193
+
194
+ #: .././classes/class.yksemeBase.php:1563
195
+ msgid "drop"
196
+ msgstr "πτώση"
197
+
198
+ #: .././classes/class.yksemeBase.php:1568
199
+ msgid "Merge field"
200
+ msgstr "Συγχώνευση τομέα"
201
+
202
+ #: .././classes/class.yksemeBase.php:1569
203
+ msgid "Placeholder"
204
+ msgstr "Κράτηση θέσης"
205
+
206
+ #: .././classes/class.yksemeBase.php:1577
207
+ msgid "Redirect User On Submission"
208
+ msgstr "Ανακατεύθυνση χρήστη για Υποβολή"
209
+
210
+ #: .././classes/class.yksemeBase.php:1581
211
+ msgid "choose a page to redirect the user to after they submit the form."
212
+ msgstr ""
213
+ "επιλέξετε μια σελίδα ή να ορίσετε μια προσαρμοσμένη διεύθυνση URL για να "
214
+ "ανακατευθύνει τον χρήστη σε μετά την υποβολή της φόρμας."
215
+
216
+ #: .././classes/class.yksemeBase.php:1584
217
+ msgid "Select A Post/Page"
218
+ msgstr "Επιλέξτε ένα Post / Σελίδα"
219
+
220
+ #: .././classes/class.yksemeBase.php:1638
221
+ msgid "Save Form Settings"
222
+ msgstr "Διαχειριστείτε Mailchimp Έντυπα Ρυθμίσεις"
223
+
224
+ #: .././classes/class.yksemeBase.php:1639
225
+ msgid "Delete Form"
226
+ msgstr "Διαγραφή Φόρμα"
227
+
228
+ #: .././classes/class.yksemeBase.php:1640
229
+ msgid "Re-Import Form Fields from MailChimp"
230
+ msgstr "Παρακαλώ εισάγετε κάποιες λίστες από MailChimp"
231
+
232
+ #: .././classes/class.yksemeBase.php:2168
233
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
234
+ msgstr ""
235
+ "Sign Me Up For Ενημερωτικό Δελτίο Mailchimp-ΑΝΤΙΚΑΤΑΣΤΑΣΗ-ΑΥΤΟ-TEXT της"
236
+
237
+ #: .././pages/about.php:27
238
+ msgid "YIKES, Inc. Web Design and Development"
239
+ msgstr "YIKES, Inc Web Σχεδιασμός και Ανάπτυξη"
240
+
241
+ #: .././pages/about.php:29
242
+ msgid "Smart, effective, beautifully designed web solutions"
243
+ msgstr "Έξυπνη, αποτελεσματική, όμορφα σχεδιασμένες λύσεις web"
244
+
245
+ #: .././pages/about.php:32
246
+ msgid ""
247
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
248
+ "custom WordPress themes and plugins every day."
249
+ msgstr ""
250
+ "YIKES βρίσκεται στη γειτονιά Fishtown της Φιλαδέλφειας, όπου χτίζουμε έθιμο "
251
+ "WordPress θέματα και plugins κάθε μέρα."
252
+
253
+ #: .././pages/about.php:36
254
+ msgid ""
255
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
256
+ "WordCamps"
257
+ msgstr ""
258
+ "Στο YIKES αγαπάμε WordPress! Co-Owner, Tracy Levesque έχει παρουσιάσει σε "
259
+ "WordCamps"
260
+
261
+ #: .././pages/about.php:36
262
+ msgid "and"
263
+ msgstr "και"
264
+
265
+ #: .././pages/about.php:36
266
+ msgid "She also teaches WordPress classes for"
267
+ msgstr "Διδάσκει επίσης μαθήματα για WordPress"
268
+
269
+ #: .././pages/about.php:40
270
+ msgid ""
271
+ "In addition to making great WordPress sites we are also committed to the "
272
+ "sustainable business movement. We observe the triple bottom line: people, "
273
+ "planet, profit and work to help build a more socially, environmentally and "
274
+ "financially sustainable local economy. We even have a"
275
+ msgstr ""
276
+ "Εκτός από τις μεγάλες περιοχές WordPress έχουμε επίσης δεσμευτεί για την "
277
+ "αειφόρο μετακίνηση των επιχειρήσεων. Παρατηρούμε την τριπλή κατώτατη γραμμή: "
278
+ "οι άνθρωποι, πλανήτης, κέρδος και την εργασία για να βοηθήσει στην "
279
+ "οικοδόμηση μια πιο κοινωνικά, περιβαλλοντικά και οικονομικά βιώσιμη τοπική "
280
+ "οικονομία. Έχουμε ακόμη ένα"
281
+
282
+ #: .././pages/about.php:40
283
+ msgid "LEED Platinum office"
284
+ msgstr "LEED Platinum γραφείο"
285
+
286
+ #: .././pages/about.php:44
287
+ msgid ""
288
+ "If you're interested in hiring us for WordPress development, or just want to "
289
+ "learn more about us, please visit"
290
+ msgstr ""
291
+ "Αν σας ενδιαφέρει να μας πρόσληψη για WordPress ανάπτυξη, ή απλά θέλετε να "
292
+ "μάθετε περισσότερα για εμάς, παρακαλώ επισκεφθείτε την ιστοσελίδα"
293
+
294
+ #: .././pages/lists.php:8
295
+ msgid "No forms have been added yet."
296
+ msgstr "Δεν υπάρχουν έντυπα έχει προστεθεί ακόμα."
297
+
298
+ #: .././pages/lists.php:39
299
+ msgid "Oops.. The list ID you entered appears to be incorrect."
300
+ msgstr ""
301
+ "Ωχ .. Το αναγνωριστικό λίστα που εισάγατε φαίνεται να είναι λανθασμένη."
302
+
303
+ #: .././pages/lists.php:44
304
+ msgid "There was an error!"
305
+ msgstr "Υπήρξε ένα σφάλμα!"
306
+
307
+ #: .././pages/lists.php:135
308
+ msgid "You need to select a Mailchimp list in order to create a form for it"
309
+ msgstr ""
310
+ "Θα πρέπει να επιλέξετε μια λίστα Mailchimp προκειμένου να δημιουργήσετε μια "
311
+ "φόρμα για την"
312
+
313
+ #: .././pages/lists.php:173
314
+ msgid "Are you sure you want to delete this form?"
315
+ msgstr "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το έντυπο;"
316
+
317
+ #: .././pages/lists.php:206
318
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
319
+ msgstr "Είστε βέβαιοι ότι θέλετε να επαν-εισάγετε τα πεδία σας από MailChimp;"
320
+
321
+ #: .././pages/lists.php:228
322
+ msgid "Looks like this form is already up to date!"
323
+ msgstr "Μοιάζει αυτή η μορφή είναι ήδη μέχρι σήμερα!"
324
+
325
+ #: .././pages/lists.php:326
326
+ msgid "Are you sure you want to unsubscribe"
327
+ msgstr "Είστε σίγουροι ότι θέλετε να διαγραφείτε"
328
+
329
+ #: .././pages/lists.php:326
330
+ msgid "from this list?"
331
+ msgstr "από αυτή τη λίστα;"
332
+
333
+ #: .././pages/lists.php:342
334
+ msgid "was successfully unsubscribed from this list."
335
+ msgstr "με επιτυχία την εγγραφή σας από αυτήν τη λίστα."
336
+
337
+ #: .././pages/lists.php:448 .././pages/options.php:196
338
+ #: .././pages/options.php:416
339
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
340
+ msgstr "Εύκολη Mailchimp Μορφές από YIKES, Inc"
341
+
342
+ #: .././pages/lists.php:454
343
+ msgid "Before you can add MailChimp forms to your site, you need to"
344
+ msgstr ""
345
+ "Για να μπορέσετε να προσθέσετε MailChimp φόρμες στο site σας, θα πρέπει να"
346
+
347
+ #: .././pages/lists.php:454
348
+ msgid "go to the MailChimp Settings page"
349
+ msgstr "μεταβείτε στη σελίδα Ρυθμίσεις MailChimp"
350
+
351
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
352
+ msgid "and add your API Key."
353
+ msgstr "και να προσθέσετε το κλειδί API σας."
354
+
355
+ #: .././pages/lists.php:462
356
+ msgid "You must enter a valid API key to import and manage your lists."
357
+ msgstr ""
358
+ "Πρέπει να εισάγετε ένα έγκυρο κλειδί API για την εισαγωγή και να "
359
+ "διαχειριστείτε λίστες σας."
360
+
361
+ #: .././pages/lists.php:473
362
+ msgid "Your Lists"
363
+ msgstr "Λίστες σας"
364
+
365
+ #: .././pages/lists.php:483
366
+ msgid "Manage Forms"
367
+ msgstr "Διαχειριστείτε Έντυπα"
368
+
369
+ #: .././pages/options.php:41
370
+ msgid "The options were saved successfully!"
371
+ msgstr "Οι επιλογές αποθηκεύτηκαν με επιτυχία!"
372
+
373
+ #: .././pages/options.php:44
374
+ msgid "The options could not be saved (or you did not change them)."
375
+ msgstr "Οι επιλογές αυτές δεν θα μπορούσαν να σωθούν (ή δεν τους αλλάζουν)."
376
+
377
+ #: .././pages/options.php:96
378
+ msgid "Valid API Key"
379
+ msgstr "Ισχύει το κλειδί API"
380
+
381
+ #: .././pages/options.php:102
382
+ msgid "Sorry, that is an invalid MailChimp API key."
383
+ msgstr "Συγγνώμη, αυτό είναι ένα έγκυρο κλειδί MailChimp API."
384
+
385
+ #: .././pages/options.php:108
386
+ msgid ""
387
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
388
+ "further information."
389
+ msgstr ""
390
+ "Συγγνώμη, αυτό είναι ένα έγκυρο κλειδί MailChimp API. Παρακαλείστε να "
391
+ "ελέγξετε την κονσόλα για περισσότερες πληροφορίες."
392
+
393
+ #: .././pages/options.php:117
394
+ msgid "Error: Please enter a valid Mail Chimp API Key."
395
+ msgstr "Σφάλμα: Παρακαλώ εισάγετε ένα έγκυρο Mail χιμπατζή API Key."
396
+
397
+ #: .././pages/options.php:199
398
+ msgid "Manage Mailchimp Forms Settings"
399
+ msgstr "Διαχειριστείτε Mailchimp Έντυπα Ρυθμίσεις"
400
+
401
+ #: .././pages/options.php:205
402
+ msgid "WordPress Version Number Error"
403
+ msgstr "Wordpress Έκδοση"
404
+
405
+ #: .././pages/options.php:206
406
+ msgid ""
407
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
408
+ "You won't be able to access the tinyMCE button to insert forms into pages "
409
+ "and posts unless you update to 3.9 or later."
410
+ msgstr ""
411
+ "Δυστυχώς, αλλά μοιάζει με σας, χρησιμοποιώντας μια παλιά έκδοση του "
412
+ "WordPress. Δεν θα είναι σε θέση να έχουν πρόσβαση στο κουμπί tinyMCE να "
413
+ "εισάγετε φόρμες σε σελίδες και δημοσιεύσεις εκτός και αν ενημερώσετε σε 3,9 "
414
+ "ή νεότερη έκδοση."
415
+
416
+ #: .././pages/options.php:215
417
+ msgid "LocalHost Detected :"
418
+ msgstr "Εντοπίστηκε localhost:"
419
+
420
+ #: .././pages/options.php:216
421
+ msgid ""
422
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
423
+ msgstr "Εύκολη Mailchimp Μορφές από YIKES, Inc"
424
+
425
+ #: .././pages/options.php:217
426
+ msgid ""
427
+ "If you are unable to validate your API key, and receive the error message"
428
+ msgstr ""
429
+ "Εάν δεν είστε σε θέση να επικυρώσει το κλειδί API, και να λάβετε το μήνυμα "
430
+ "λάθους"
431
+
432
+ #: .././pages/options.php:217
433
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
434
+ msgstr ""
435
+ "\"Πρόβλημα πιστοποιητικό SSL: μπορεί να περάσει τοπική πιστοποιητικό εκδότη"
436
+ "\" "
437
+
438
+ #: .././pages/options.php:217
439
+ msgid "follow the tutorial located "
440
+ msgstr "ακολουθούν το φροντιστήριο που βρίσκεται "
441
+
442
+ #: .././pages/options.php:230
443
+ msgid "Your Mailchimp API Key"
444
+ msgstr "Mailchimp σας το κλειδί API"
445
+
446
+ #: .././pages/options.php:238
447
+ msgid ""
448
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
449
+ "site to communicate with your MailChimp account."
450
+ msgstr ""
451
+ "Παρακαλώ εισάγετε το MailChimp API Key παραπάνω. Το Κλειδί API επιτρέπει "
452
+ "WordPress site σας για να επικοινωνούν με το λογαριασμό σας MailChimp."
453
+
454
+ #: .././pages/options.php:239
455
+ msgid "For more help, visit the MailChimp Support article"
456
+ msgstr "Για περισσότερη βοήθεια, επισκεφθείτε το άρθρο MailChimp Υποστήριξη"
457
+
458
+ #: .././pages/options.php:239
459
+ msgid "Where can I find my API Key?"
460
+ msgstr "Πού μπορώ να βρω μου API κλειδί;"
461
+
462
+ #: .././pages/options.php:244
463
+ msgid "Preferred Form Layout"
464
+ msgstr "Προτιμώμενη μορφή διάταξης"
465
+
466
+ #: .././pages/options.php:247
467
+ msgid "table"
468
+ msgstr "πίνακας"
469
+
470
+ #: .././pages/options.php:248
471
+ msgid "div"
472
+ msgstr "div"
473
+
474
+ #: .././pages/options.php:256
475
+ msgid "Choose whether you want your forms to use a table or div layout."
476
+ msgstr ""
477
+ "Επιλέξτε αν θέλετε φόρμες σας να χρησιμοποιήσετε έναν πίνακα ή διάταξη div."
478
+
479
+ #: .././pages/options.php:261
480
+ msgid "Advanced Error Messaging"
481
+ msgstr "Σύνθετη Σφάλμα Μηνύματα"
482
+
483
+ #: .././pages/options.php:264
484
+ msgid "Disabled"
485
+ msgstr "Απενεργοποιημένο"
486
+
487
+ #: .././pages/options.php:265
488
+ msgid "Enabled"
489
+ msgstr "Ενεργοποιημένο"
490
+
491
+ #: .././pages/options.php:273
492
+ msgid ""
493
+ "Enable if you're having problems with your forms sending data to MailChimp. "
494
+ "Enabling Advanced Error Messaging will show you the exact error codes "
495
+ "MailChimp is returning."
496
+ msgstr ""
497
+ "Ενεργοποιήστε, αν έχετε προβλήματα με τις μορφές σας την αποστολή δεδομένων "
498
+ "σε MailChimp. Ενεργοποίηση Σύνθετη Μηνύματα λάθους θα σας δείξει την ακριβή "
499
+ "κωδικούς σφαλμάτων MailChimp επιστρέφει."
500
+
501
+ #: .././pages/options.php:281
502
+ msgid "Single Opt-In"
503
+ msgstr "Ενιαία Opt-In"
504
+
505
+ #: .././pages/options.php:282
506
+ msgid "Double Opt-In"
507
+ msgstr "Double Opt-In"
508
+
509
+ #: .././pages/options.php:290
510
+ msgid ""
511
+ "A single opt-in will add the user to your list without any further "
512
+ "interaction."
513
+ msgstr ""
514
+ "Ένα ενιαίο opt-in θα προσθέσετε το χρήστη στη λίστα σας, χωρίς περαιτέρω "
515
+ "ενέργειες."
516
+
517
+ #: .././pages/options.php:291
518
+ msgid ""
519
+ "A double opt-in will send an email to the user asking them to confirm their "
520
+ "subscription."
521
+ msgstr ""
522
+ "Ένα διπλό opt-in θα στείλει ένα email στο χρήστη ζητώντας τους να "
523
+ "επιβεβαιώσουν την εγγραφή τους."
524
+
525
+ #: .././pages/options.php:292
526
+ msgid "This will also dictate the opt-in settings for people leaving comments."
527
+ msgstr ""
528
+ "Αυτό θα υπαγορεύσει επίσης τις ρυθμίσεις opt-in για άτομα που αφήνουν σχόλια."
529
+
530
+ #: .././pages/options.php:297
531
+ msgid "Custom Opt-In Message"
532
+ msgstr "Προσαρμοσμένη Opt-In μήνυμα"
533
+
534
+ #: .././pages/options.php:299
535
+ msgid "Double Opt-In Message"
536
+ msgstr "Double Opt-In μήνυμα"
537
+
538
+ #: .././pages/options.php:301
539
+ msgid "Single Opt-In Message"
540
+ msgstr "Ενιαία μήνυμα Opt-In"
541
+
542
+ #: .././pages/options.php:307
543
+ msgid "Interest Group Label"
544
+ msgstr "Ομάδα Ενδιαφέροντος Label"
545
+
546
+ #: .././pages/options.php:316
547
+ msgid ""
548
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
549
+ "group names."
550
+ msgstr ""
551
+ "Κείμενο που εμφανίζεται πάνω από ομάδες συμφερόντων. Αφήστε το κενό για να "
552
+ "χρησιμοποιήσετε τα ονόματα των ομάδων συμφερόντων MailChimp."
553
+
554
+ #: .././pages/options.php:321
555
+ msgid "Display opt-in checkbox on comment forms?"
556
+ msgstr "Εμφάνιση opt-in κουτάκι μορφές σχόλιο;"
557
+
558
+ #: .././pages/options.php:324
559
+ msgid "Hide"
560
+ msgstr "Απόκρυψη"
561
+
562
+ #: .././pages/options.php:325
563
+ msgid "Show"
564
+ msgstr "Εμφάνιση"
565
+
566
+ #: .././pages/options.php:333
567
+ msgid ""
568
+ "This will display a checkbox just above the submit button on all comment "
569
+ "forms. If selected, any users leaving comments will also be added to the "
570
+ "mailing list."
571
+ msgstr ""
572
+ "Αυτό θα εμφανίσει ένα κουτάκι ακριβώς πάνω από το κουμπί υποβολής για όλες "
573
+ "τις μορφές σχόλιο. Αν επιλεγεί, όλοι οι χρήστες, αφήνοντας τα σχόλια θα "
574
+ "πρέπει επίσης να προστεθούν στη λίστα."
575
+
576
+ #: .././pages/options.php:338
577
+ msgid "Custom Comment Checkbox Text"
578
+ msgstr "Προσαρμοσμένη Σχόλιο Checkbox Κείμενο"
579
+
580
+ #: .././pages/options.php:345
581
+ msgid "Default List"
582
+ msgstr "Προεπιλογή Λίστα"
583
+
584
+ #: .././pages/options.php:360
585
+ msgid ""
586
+ "This is the default list users will be subscribed to when submitting a "
587
+ "comment."
588
+ msgstr ""
589
+ "Αυτή είναι η προεπιλεγμένη λίστα χρήστες θα εγγραφεί κατά την υποβολή ένα "
590
+ "σχόλιο."
591
+
592
+ #: .././pages/options.php:361
593
+ msgid ""
594
+ "It is best to select a form where only the email , first name and/or last "
595
+ "name are required or you may run into issues."
596
+ msgstr ""
597
+ "Είναι καλύτερο να επιλέξετε μια φόρμα όπου μόνο το e-mail, όνομα ή / και "
598
+ "επώνυμο απαιτούνται ή μπορεί να τρέχει σε θέματα."
599
+
600
+ #: .././pages/options.php:373
601
+ msgid "Plugin Information"
602
+ msgstr "Plugin πληροφορίες"
603
+
604
+ #: .././pages/options.php:376
605
+ msgid "If you experience any issues with our plugin, please"
606
+ msgstr "Εάν αντιμετωπίσετε προβλήματα με το plugin μας, παρακαλούμε"
607
+
608
+ #: .././pages/options.php:376
609
+ msgid "submit a New Issue on our Github Issue Tracker"
610
+ msgstr "υποβάλει Νέα Έκδοση για μας Tracker Github Τεύχος"
611
+
612
+ #: .././pages/options.php:376
613
+ msgid ""
614
+ "Please include the information below to help us troubleshoot your problem."
615
+ msgstr ""
616
+ "Παρακαλούμε να συμπεριλάβετε τις παρακάτω πληροφορίες για να μας βοηθήσουν "
617
+ "να αντιμετωπίσετε το πρόβλημα."
618
+
619
+ #: .././pages/options.php:384
620
+ msgid "Plugin Version"
621
+ msgstr "Έκδοση Plugin"
622
+
623
+ #: .././pages/options.php:388
624
+ msgid "Wordpress Version"
625
+ msgstr "Wordpress Έκδοση"
626
+
627
+ #: .././pages/options.php:392
628
+ msgid "Browser Information"
629
+ msgstr "Πληροφορίες Browser"
630
+
631
+ #: .././pages/options.php:420
632
+ msgid "Error"
633
+ msgstr "Σφάλμ"
634
+
635
+ #: .././pages/options.php:421
636
+ msgid ""
637
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
638
+ "cURL to send and retreive data."
639
+ msgstr ""
640
+ "Δυστυχώς, όμως cURL είναι απενεργοποιημένη στο διακομιστή σας. Το MailChimp "
641
+ "API χρησιμοποιεί cURL για την αποστολή και retreive δεδομένων."
642
+
643
+ #: .././pages/options.php:426
644
+ msgid "Help!"
645
+ msgstr "Βοήθεια!"
646
+
647
+ #: .././pages/options.php:426
648
+ msgid "What is cURL?"
649
+ msgstr "Τι είναι cURL;"
650
+
651
+ #: .././pages/options.php:426
652
+ msgid "Check phpinfo()"
653
+ msgstr "Ελέγξτε phpinfo ()"
654
+
655
+ #: .././pages/options.php:428
656
+ msgid "Steps To Resolve The Issue"
657
+ msgstr "Βήματα για την επίλυση του ζητήματος"
658
+
659
+ #: .././pages/options.php:430
660
+ msgid ""
661
+ "You can enable cURL by turning on the cURL module within your php.ini file"
662
+ msgstr ""
663
+ "Μπορείτε να ενεργοποιήσετε cURL από την ενεργοποίηση του cURL ενότητα μέσα "
664
+ "στο αρχείο php.ini σας"
665
+
666
+ #: .././pages/options.php:430
667
+ msgid "You should find the php.ini file located here : "
668
+ msgstr "Θα πρέπει να βρείτε το αρχείο php.ini που βρίσκεται εδώ: "
669
+
670
+ #: .././pages/options.php:431
671
+ msgid ""
672
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
673
+ msgstr ""
674
+ "Μόλις βρεθεί, να ανοίξει το αρχείο php.ini και να εντοπίσετε τη γραμμή \"? "
675
+ "Επέκταση = php_curl.dll\"."
676
+
677
+ #: .././pages/options.php:432
678
+ msgid ""
679
+ "Remove the semi colon before the line, to un-comment it and make the module "
680
+ "active."
681
+ msgstr ""
682
+ "Αφαιρέστε την άνω τελεία πριν από τη γραμμή, για να un-σχόλιο και να κάνει η "
683
+ "μονάδα ενεργό."
684
+
685
+ #: .././pages/options.php:433
686
+ msgid "Re-save and close the file."
687
+ msgstr "Re-αποθηκεύστε και κλείστε το αρχείο."
688
+
689
+ #: .././pages/options.php:434
690
+ msgid "Re-load this page."
691
+ msgstr "Re-φορτώσει αυτήν τη σελίδα."
692
+
693
+ #: .././templates/shortcode_error.php:1
694
+ msgid "There was an error calling the mailchimp list."
695
+ msgstr "Υπήρξε ένα σφάλμα κατά την κλήση του καταλόγου MailChimp."
696
+
697
+ #: .././templates/shortcode_error_data.php:1
698
+ msgid ""
699
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
700
+ "List Forms\" page."
701
+ msgstr ""
702
+ "Ο κατάλογος δεν υπάρχει! Βεβαιωθείτε ότι έχετε εισαγάγει τη λίστα στο "
703
+ "\"Manage Forms Λίστα\" σελίδα."
704
+
705
+ #: .././templates/shortcode_error_exists.php:1
706
+ msgid "This list was already placed on this page!"
707
+ msgstr "Ο κατάλογος αυτός έχει ήδη τοποθετηθεί σε αυτή τη σελίδα!"
708
+
709
+ #: .././templates/shortcode_error_no_API_key.php:1
710
+ msgid "Woops! No Valid API Key Found. Double check your settings."
711
+ msgstr "Woops! Δεν Ισχύει API Key βρέθηκαν. Διπλό ελέγξτε τις ρυθμίσεις σας."
712
+
713
+ #: .././templates/shortcode_form.php:11
714
+ msgid "Oops.. Don't forget to fill-in the following fields"
715
+ msgstr "Ωχ .. Μην ξεχάσετε να συμπληρώσετε τα παρακάτω πεδία:"
716
+
717
+ #: .././templates/shortcode_form.php:74
718
+ msgid "required field"
719
+ msgstr "υποχρεωτικό πεδίο"
720
+
721
+ #: .././templates/yikes-mailchimp-widget.php:15
722
+ #: .././templates/yikes-mailchimp-widget.php:18
723
+ msgid "MailChimp Signup Form"
724
+ msgstr "MailChimp Αίτηση εισόδου"
725
+
726
+ #: .././templates/yikes-mailchimp-widget.php:27
727
+ msgid "Select Which Form You Would Like To Display:"
728
+ msgstr "Επιλέξτε το έντυπο που θα θέλατε να εμφανίζονται:"
729
+
730
+ #: .././templates/yikes-mailchimp-widget.php:30
731
+ msgid "Select a Form to Display"
732
+ msgstr "Επιλέξτε ένα έντυπο για την εμφάνιση"
733
+
734
+ #: .././templates/yikes-mailchimp-widget.php:47
735
+ msgid "Please import MailChimp forms"
736
+ msgstr "Παρακαλώ εισάγετε MailChimp μορφές"
737
+
738
+ #: .././templates/yikes-mailchimp-widget.php:49
739
+ msgid "Please import some lists from MailChimp"
740
+ msgstr "Παρακαλώ εισάγετε κάποιες λίστες από MailChimp"
741
+
742
+ #: .././templates/yikes-mailchimp-widget.php:52
743
+ msgid "Import Lists Now"
744
+ msgstr "Λίστες Εισαγωγή Τώρα"
745
+
746
+ #: .././templates/yikes-mailchimp-widget.php:73
747
+ msgid ""
748
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
749
+ "least one list to use the Easy MailChimp widget."
750
+ msgstr ""
751
+ "Ωχ! Φαίνεται ότι δεν εισήγαγε λίστες ακόμα. Θα πρέπει να εισάγετε "
752
+ "τουλάχιστον μια λίστα για να χρησιμοποιήσετε το widget Easy MailChimp."
753
+
754
+ #: .././templates/yikes-mailchimp-widget.php:80
755
+ msgid ""
756
+ "Oops! It looks like you forgot to select a form to display here. Go to "
757
+ "'Appearance > Widgets' and select a form to display."
758
+ msgstr ""
759
+ "Ωχ! Φαίνεται σαν να ξέχασε να επιλέξετε μια μορφή για να εμφανιστεί εδώ. "
760
+ "Πηγαίνετε στο «Εμφάνιση> Widgets» και επιλέξτε μια μορφή για να εμφανιστεί."
761
+
762
+ #: .././templates/yikes-mailchimp-widget.php:117
763
+ msgid "Sign Up For Our Newsletter"
764
+ msgstr "Εγγραφή Στο Newsletter"
765
+
766
+ #: .././templates/yikes-mailchimp-widget.php:129
767
+ msgid "Sign Me Up"
768
+ msgstr "Sign Me Up"
769
+
770
+ #: .././templates/yikes-mailchimp-widget.php:133
771
+ msgid "Title:"
772
+ msgstr "Τίτλος:"
773
+
774
+ #: .././templates/yikes-mailchimp-widget.php:138
775
+ msgid "Form Text:"
776
+ msgstr "Μορφή κειμένου:"
777
+
778
+ #: .././templates/yikes-mailchimp-widget.php:146
779
+ msgid "Submit Button Text:"
780
+ msgstr "Υποβολή Button Κείμενο:"
781
+
782
+ #: .././templates/yikes-mailchimp-widget.php:156
783
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
784
+ msgstr ""
785
+ "Ωχ! Φαίνεται ότι δεν έχετε προσθέσει το κλειδί API σας! Κεφάλι πάνω στο"
786
+
787
+ #: .././templates/yikes-mailchimp-widget.php:156
788
+ msgid "Settings page"
789
+ msgstr "Στη σελίδα Ρυθμίσεις"
790
+
791
+ #~ msgid "No API Key or List Id Exist!"
792
+ #~ msgstr "Δεν κλειδί API ή Αναγνωριστικό λίστας Exist!"
languages/yikes-inc-easy-mailchimp-extender-en_US.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-en_US.po ADDED
@@ -0,0 +1,711 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 14:44-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:44-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: en\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr ""
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+
29
+ #: .././classes/class.yksemeBase.php:116
30
+ msgid "Select Your Area of Interest"
31
+ msgstr ""
32
+
33
+ #: .././classes/class.yksemeBase.php:917
34
+ msgid "Click on a subscriber to see further information"
35
+ msgstr ""
36
+
37
+ #: .././classes/class.yksemeBase.php:920
38
+ msgid "E-Mail"
39
+ msgstr ""
40
+
41
+ #: .././classes/class.yksemeBase.php:921
42
+ msgid "Date Subscribed"
43
+ msgstr ""
44
+
45
+ #: .././classes/class.yksemeBase.php:941
46
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
47
+ msgstr ""
48
+
49
+ #: .././classes/class.yksemeBase.php:998
50
+ msgid "Back to Subscriber List"
51
+ msgstr ""
52
+
53
+ #: .././classes/class.yksemeBase.php:999
54
+ msgid "Subscriber Details"
55
+ msgstr ""
56
+
57
+ #: .././classes/class.yksemeBase.php:1010
58
+ msgid "Overview"
59
+ msgstr ""
60
+
61
+ #: .././classes/class.yksemeBase.php:1015
62
+ msgid "First Name"
63
+ msgstr ""
64
+
65
+ #: .././classes/class.yksemeBase.php:1018
66
+ msgid "Last Updated"
67
+ msgstr ""
68
+
69
+ #: .././classes/class.yksemeBase.php:1021
70
+ msgid "Preferred Email Type"
71
+ msgstr ""
72
+
73
+ #: .././classes/class.yksemeBase.php:1028
74
+ msgid "Last Name"
75
+ msgstr ""
76
+
77
+ #: .././classes/class.yksemeBase.php:1031
78
+ msgid "Language"
79
+ msgstr ""
80
+
81
+ #: .././classes/class.yksemeBase.php:1054
82
+ msgid "Groups Subscribed To"
83
+ msgstr ""
84
+
85
+ #: .././classes/class.yksemeBase.php:1104
86
+ msgid "Subscriber Notes"
87
+ msgstr ""
88
+
89
+ #: .././classes/class.yksemeBase.php:1109
90
+ msgid "Written by"
91
+ msgstr ""
92
+
93
+ #: .././classes/class.yksemeBase.php:1109
94
+ msgid "Created on"
95
+ msgstr ""
96
+
97
+ #: .././classes/class.yksemeBase.php:1251
98
+ #: .././classes/class.yksemeBase.php:1253
99
+ msgid "MailChimp Forms"
100
+ msgstr ""
101
+
102
+ #: .././classes/class.yksemeBase.php:1253
103
+ msgid "MailChimp Settings"
104
+ msgstr ""
105
+
106
+ #: .././classes/class.yksemeBase.php:1254
107
+ msgid "Manage List Forms"
108
+ msgstr ""
109
+
110
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
111
+ msgid "About YIKES, Inc."
112
+ msgstr ""
113
+
114
+ #: .././classes/class.yksemeBase.php:1430
115
+ msgid "One or more fields are empty"
116
+ msgstr ""
117
+
118
+ #: .././classes/class.yksemeBase.php:1480
119
+ msgid "Your List Was Successfully Saved!"
120
+ msgstr ""
121
+
122
+ #: .././classes/class.yksemeBase.php:1482
123
+ msgid "I'm sorry there was an error with your request."
124
+ msgstr ""
125
+
126
+ #: .././classes/class.yksemeBase.php:1488
127
+ msgid "MailChimp List name"
128
+ msgstr ""
129
+
130
+ #: .././classes/class.yksemeBase.php:1494
131
+ #: .././classes/class.yksemeBase.php:1504
132
+ #, php-format
133
+ msgid "%1$s"
134
+ msgstr ""
135
+
136
+ #: .././classes/class.yksemeBase.php:1512
137
+ msgid "MailChimp List ID"
138
+ msgstr ""
139
+
140
+ #: .././classes/class.yksemeBase.php:1518
141
+ msgid "Shortcode"
142
+ msgstr ""
143
+
144
+ #: .././classes/class.yksemeBase.php:1521
145
+ msgid ""
146
+ "Paste this shortcode into whatever page or post you want to add this form to"
147
+ msgstr ""
148
+
149
+ #: .././classes/class.yksemeBase.php:1526
150
+ msgid "PHP Snippet"
151
+ msgstr ""
152
+
153
+ #: .././classes/class.yksemeBase.php:1529
154
+ msgid "Use this code to add this form to a template file"
155
+ msgstr ""
156
+
157
+ #: .././classes/class.yksemeBase.php:1534
158
+ msgid "Number of Subscribers"
159
+ msgstr ""
160
+
161
+ #: .././classes/class.yksemeBase.php:1543
162
+ msgid "Form Fields"
163
+ msgstr ""
164
+
165
+ #: .././classes/class.yksemeBase.php:1545
166
+ msgid ""
167
+ "Check the fields you want included in your form (Email Address is required)."
168
+ msgstr ""
169
+
170
+ #: .././classes/class.yksemeBase.php:1548
171
+ msgid ""
172
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
173
+ msgstr ""
174
+
175
+ #: .././classes/class.yksemeBase.php:1554
176
+ msgid "Active Fields"
177
+ msgstr ""
178
+
179
+ #: .././classes/class.yksemeBase.php:1563
180
+ msgid "Drag"
181
+ msgstr ""
182
+
183
+ #: .././classes/class.yksemeBase.php:1563
184
+ msgid "drop"
185
+ msgstr ""
186
+
187
+ #: .././classes/class.yksemeBase.php:1568
188
+ msgid "Merge field"
189
+ msgstr ""
190
+
191
+ #: .././classes/class.yksemeBase.php:1569
192
+ msgid "Placeholder"
193
+ msgstr ""
194
+
195
+ #: .././classes/class.yksemeBase.php:1577
196
+ msgid "Redirect User On Submission"
197
+ msgstr ""
198
+
199
+ #: .././classes/class.yksemeBase.php:1581
200
+ msgid "choose a page to redirect the user to after they submit the form."
201
+ msgstr ""
202
+
203
+ #: .././classes/class.yksemeBase.php:1584
204
+ msgid "Select A Post/Page"
205
+ msgstr ""
206
+
207
+ #: .././classes/class.yksemeBase.php:1638
208
+ msgid "Save Form Settings"
209
+ msgstr ""
210
+
211
+ #: .././classes/class.yksemeBase.php:1639
212
+ msgid "Delete Form"
213
+ msgstr ""
214
+
215
+ #: .././classes/class.yksemeBase.php:1640
216
+ msgid "Re-Import Form Fields from MailChimp"
217
+ msgstr ""
218
+
219
+ #: .././classes/class.yksemeBase.php:2168
220
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
221
+ msgstr ""
222
+
223
+ #: .././pages/about.php:27
224
+ msgid "YIKES, Inc. Web Design and Development"
225
+ msgstr ""
226
+
227
+ #: .././pages/about.php:29
228
+ msgid "Smart, effective, beautifully designed web solutions"
229
+ msgstr ""
230
+
231
+ #: .././pages/about.php:32
232
+ msgid ""
233
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
234
+ "custom WordPress themes and plugins every day."
235
+ msgstr ""
236
+
237
+ #: .././pages/about.php:36
238
+ msgid ""
239
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
240
+ "WordCamps"
241
+ msgstr ""
242
+
243
+ #: .././pages/about.php:36
244
+ msgid "and"
245
+ msgstr ""
246
+
247
+ #: .././pages/about.php:36
248
+ msgid "She also teaches WordPress classes for"
249
+ msgstr ""
250
+
251
+ #: .././pages/about.php:40
252
+ msgid ""
253
+ "In addition to making great WordPress sites we are also committed to the "
254
+ "sustainable business movement. We observe the triple bottom line: people, "
255
+ "planet, profit and work to help build a more socially, environmentally and "
256
+ "financially sustainable local economy. We even have a"
257
+ msgstr ""
258
+
259
+ #: .././pages/about.php:40
260
+ msgid "LEED Platinum office"
261
+ msgstr ""
262
+
263
+ #: .././pages/about.php:44
264
+ msgid ""
265
+ "If you're interested in hiring us for WordPress development, or just want to "
266
+ "learn more about us, please visit"
267
+ msgstr ""
268
+
269
+ #: .././pages/lists.php:8
270
+ msgid "No forms have been added yet."
271
+ msgstr ""
272
+
273
+ #: .././pages/lists.php:39
274
+ msgid "Oops.. The list ID you entered appears to be incorrect."
275
+ msgstr ""
276
+
277
+ #: .././pages/lists.php:44
278
+ msgid "There was an error!"
279
+ msgstr ""
280
+
281
+ #: .././pages/lists.php:135
282
+ msgid "You need to select a Mailchimp list in order to create a form for it"
283
+ msgstr ""
284
+
285
+ #: .././pages/lists.php:173
286
+ msgid "Are you sure you want to delete this form?"
287
+ msgstr ""
288
+
289
+ #: .././pages/lists.php:206
290
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
291
+ msgstr ""
292
+
293
+ #: .././pages/lists.php:228
294
+ msgid "Looks like this form is already up to date!"
295
+ msgstr ""
296
+
297
+ #: .././pages/lists.php:326
298
+ msgid "Are you sure you want to unsubscribe"
299
+ msgstr ""
300
+
301
+ #: .././pages/lists.php:326
302
+ msgid "from this list?"
303
+ msgstr ""
304
+
305
+ #: .././pages/lists.php:342
306
+ msgid "was successfully unsubscribed from this list."
307
+ msgstr ""
308
+
309
+ #: .././pages/lists.php:448 .././pages/options.php:196
310
+ #: .././pages/options.php:416
311
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
312
+ msgstr ""
313
+
314
+ #: .././pages/lists.php:454
315
+ msgid "Before you can add MailChimp forms to your site, you need to"
316
+ msgstr ""
317
+
318
+ #: .././pages/lists.php:454
319
+ msgid "go to the MailChimp Settings page"
320
+ msgstr ""
321
+
322
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
323
+ msgid "and add your API Key."
324
+ msgstr ""
325
+
326
+ #: .././pages/lists.php:462
327
+ msgid "You must enter a valid API key to import and manage your lists."
328
+ msgstr ""
329
+
330
+ #: .././pages/lists.php:473
331
+ msgid "Your Lists"
332
+ msgstr ""
333
+
334
+ #: .././pages/lists.php:483
335
+ msgid "Manage Forms"
336
+ msgstr ""
337
+
338
+ #: .././pages/options.php:41
339
+ msgid "The options were saved successfully!"
340
+ msgstr ""
341
+
342
+ #: .././pages/options.php:44
343
+ msgid "The options could not be saved (or you did not change them)."
344
+ msgstr ""
345
+
346
+ #: .././pages/options.php:96
347
+ msgid "Valid API Key"
348
+ msgstr ""
349
+
350
+ #: .././pages/options.php:102
351
+ msgid "Sorry, that is an invalid MailChimp API key."
352
+ msgstr ""
353
+
354
+ #: .././pages/options.php:108
355
+ msgid ""
356
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
357
+ "further information."
358
+ msgstr ""
359
+
360
+ #: .././pages/options.php:117
361
+ msgid "Error: Please enter a valid Mail Chimp API Key."
362
+ msgstr ""
363
+
364
+ #: .././pages/options.php:199
365
+ msgid "Manage Mailchimp Forms Settings"
366
+ msgstr ""
367
+
368
+ #: .././pages/options.php:205
369
+ msgid "WordPress Version Number Error"
370
+ msgstr ""
371
+
372
+ #: .././pages/options.php:206
373
+ msgid ""
374
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
375
+ "You won't be able to access the tinyMCE button to insert forms into pages "
376
+ "and posts unless you update to 3.9 or later."
377
+ msgstr ""
378
+
379
+ #: .././pages/options.php:215
380
+ msgid "LocalHost Detected :"
381
+ msgstr ""
382
+
383
+ #: .././pages/options.php:216
384
+ msgid ""
385
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
386
+ msgstr ""
387
+
388
+ #: .././pages/options.php:217
389
+ msgid ""
390
+ "If you are unable to validate your API key, and receive the error message"
391
+ msgstr ""
392
+
393
+ #: .././pages/options.php:217
394
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
395
+ msgstr ""
396
+
397
+ #: .././pages/options.php:217
398
+ msgid "follow the tutorial located "
399
+ msgstr ""
400
+
401
+ #: .././pages/options.php:230
402
+ msgid "Your Mailchimp API Key"
403
+ msgstr ""
404
+
405
+ #: .././pages/options.php:238
406
+ msgid ""
407
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
408
+ "site to communicate with your MailChimp account."
409
+ msgstr ""
410
+
411
+ #: .././pages/options.php:239
412
+ msgid "For more help, visit the MailChimp Support article"
413
+ msgstr ""
414
+
415
+ #: .././pages/options.php:239
416
+ msgid "Where can I find my API Key?"
417
+ msgstr ""
418
+
419
+ #: .././pages/options.php:244
420
+ msgid "Preferred Form Layout"
421
+ msgstr ""
422
+
423
+ #: .././pages/options.php:247
424
+ msgid "table"
425
+ msgstr ""
426
+
427
+ #: .././pages/options.php:248
428
+ msgid "div"
429
+ msgstr ""
430
+
431
+ #: .././pages/options.php:256
432
+ msgid "Choose whether you want your forms to use a table or div layout."
433
+ msgstr ""
434
+
435
+ #: .././pages/options.php:261
436
+ msgid "Advanced Error Messaging"
437
+ msgstr ""
438
+
439
+ #: .././pages/options.php:264
440
+ msgid "Disabled"
441
+ msgstr ""
442
+
443
+ #: .././pages/options.php:265
444
+ msgid "Enabled"
445
+ msgstr ""
446
+
447
+ #: .././pages/options.php:273
448
+ msgid ""
449
+ "Enable if you're having problems with your forms sending data to MailChimp. "
450
+ "Enabling Advanced Error Messaging will show you the exact error codes "
451
+ "MailChimp is returning."
452
+ msgstr ""
453
+
454
+ #: .././pages/options.php:281
455
+ msgid "Single Opt-In"
456
+ msgstr ""
457
+
458
+ #: .././pages/options.php:282
459
+ msgid "Double Opt-In"
460
+ msgstr ""
461
+
462
+ #: .././pages/options.php:290
463
+ msgid ""
464
+ "A single opt-in will add the user to your list without any further "
465
+ "interaction."
466
+ msgstr ""
467
+
468
+ #: .././pages/options.php:291
469
+ msgid ""
470
+ "A double opt-in will send an email to the user asking them to confirm their "
471
+ "subscription."
472
+ msgstr ""
473
+
474
+ #: .././pages/options.php:292
475
+ msgid "This will also dictate the opt-in settings for people leaving comments."
476
+ msgstr ""
477
+
478
+ #: .././pages/options.php:297
479
+ msgid "Custom Opt-In Message"
480
+ msgstr ""
481
+
482
+ #: .././pages/options.php:299
483
+ msgid "Double Opt-In Message"
484
+ msgstr ""
485
+
486
+ #: .././pages/options.php:301
487
+ msgid "Single Opt-In Message"
488
+ msgstr ""
489
+
490
+ #: .././pages/options.php:307
491
+ msgid "Interest Group Label"
492
+ msgstr ""
493
+
494
+ #: .././pages/options.php:316
495
+ msgid ""
496
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
497
+ "group names."
498
+ msgstr ""
499
+
500
+ #: .././pages/options.php:321
501
+ msgid "Display opt-in checkbox on comment forms?"
502
+ msgstr ""
503
+
504
+ #: .././pages/options.php:324
505
+ msgid "Hide"
506
+ msgstr ""
507
+
508
+ #: .././pages/options.php:325
509
+ msgid "Show"
510
+ msgstr ""
511
+
512
+ #: .././pages/options.php:333
513
+ msgid ""
514
+ "This will display a checkbox just above the submit button on all comment "
515
+ "forms. If selected, any users leaving comments will also be added to the "
516
+ "mailing list."
517
+ msgstr ""
518
+
519
+ #: .././pages/options.php:338
520
+ msgid "Custom Comment Checkbox Text"
521
+ msgstr ""
522
+
523
+ #: .././pages/options.php:345
524
+ msgid "Default List"
525
+ msgstr ""
526
+
527
+ #: .././pages/options.php:360
528
+ msgid ""
529
+ "This is the default list users will be subscribed to when submitting a "
530
+ "comment."
531
+ msgstr ""
532
+
533
+ #: .././pages/options.php:361
534
+ msgid ""
535
+ "It is best to select a form where only the email , first name and/or last "
536
+ "name are required or you may run into issues."
537
+ msgstr ""
538
+
539
+ #: .././pages/options.php:373
540
+ msgid "Plugin Information"
541
+ msgstr ""
542
+
543
+ #: .././pages/options.php:376
544
+ msgid "If you experience any issues with our plugin, please"
545
+ msgstr ""
546
+
547
+ #: .././pages/options.php:376
548
+ msgid "submit a New Issue on our Github Issue Tracker"
549
+ msgstr ""
550
+
551
+ #: .././pages/options.php:376
552
+ msgid ""
553
+ "Please include the information below to help us troubleshoot your problem."
554
+ msgstr ""
555
+
556
+ #: .././pages/options.php:384
557
+ msgid "Plugin Version"
558
+ msgstr ""
559
+
560
+ #: .././pages/options.php:388
561
+ msgid "Wordpress Version"
562
+ msgstr ""
563
+
564
+ #: .././pages/options.php:392
565
+ msgid "Browser Information"
566
+ msgstr ""
567
+
568
+ #: .././pages/options.php:420
569
+ msgid "Error"
570
+ msgstr ""
571
+
572
+ #: .././pages/options.php:421
573
+ msgid ""
574
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
575
+ "cURL to send and retreive data."
576
+ msgstr ""
577
+
578
+ #: .././pages/options.php:426
579
+ msgid "Help!"
580
+ msgstr ""
581
+
582
+ #: .././pages/options.php:426
583
+ msgid "What is cURL?"
584
+ msgstr ""
585
+
586
+ #: .././pages/options.php:426
587
+ msgid "Check phpinfo()"
588
+ msgstr ""
589
+
590
+ #: .././pages/options.php:428
591
+ msgid "Steps To Resolve The Issue"
592
+ msgstr ""
593
+
594
+ #: .././pages/options.php:430
595
+ msgid ""
596
+ "You can enable cURL by turning on the cURL module within your php.ini file"
597
+ msgstr ""
598
+
599
+ #: .././pages/options.php:430
600
+ msgid "You should find the php.ini file located here : "
601
+ msgstr ""
602
+
603
+ #: .././pages/options.php:431
604
+ msgid ""
605
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
606
+ msgstr ""
607
+
608
+ #: .././pages/options.php:432
609
+ msgid ""
610
+ "Remove the semi colon before the line, to un-comment it and make the module "
611
+ "active."
612
+ msgstr ""
613
+
614
+ #: .././pages/options.php:433
615
+ msgid "Re-save and close the file."
616
+ msgstr ""
617
+
618
+ #: .././pages/options.php:434
619
+ msgid "Re-load this page."
620
+ msgstr ""
621
+
622
+ #: .././templates/shortcode_error.php:1
623
+ msgid "There was an error calling the mailchimp list."
624
+ msgstr ""
625
+
626
+ #: .././templates/shortcode_error_data.php:1
627
+ msgid ""
628
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
629
+ "List Forms\" page."
630
+ msgstr ""
631
+
632
+ #: .././templates/shortcode_error_exists.php:1
633
+ msgid "This list was already placed on this page!"
634
+ msgstr ""
635
+
636
+ #: .././templates/shortcode_error_no_API_key.php:1
637
+ msgid "Woops! No Valid API Key Found. Double check your settings."
638
+ msgstr ""
639
+
640
+ #: .././templates/shortcode_form.php:11
641
+ msgid "Oops.. Don't forget to fill-in the following fields"
642
+ msgstr ""
643
+
644
+ #: .././templates/shortcode_form.php:74
645
+ msgid "required field"
646
+ msgstr ""
647
+
648
+ #: .././templates/yikes-mailchimp-widget.php:15
649
+ #: .././templates/yikes-mailchimp-widget.php:18
650
+ msgid "MailChimp Signup Form"
651
+ msgstr ""
652
+
653
+ #: .././templates/yikes-mailchimp-widget.php:27
654
+ msgid "Select Which Form You Would Like To Display:"
655
+ msgstr ""
656
+
657
+ #: .././templates/yikes-mailchimp-widget.php:30
658
+ msgid "Select a Form to Display"
659
+ msgstr ""
660
+
661
+ #: .././templates/yikes-mailchimp-widget.php:47
662
+ msgid "Please import MailChimp forms"
663
+ msgstr ""
664
+
665
+ #: .././templates/yikes-mailchimp-widget.php:49
666
+ msgid "Please import some lists from MailChimp"
667
+ msgstr ""
668
+
669
+ #: .././templates/yikes-mailchimp-widget.php:52
670
+ msgid "Import Lists Now"
671
+ msgstr ""
672
+
673
+ #: .././templates/yikes-mailchimp-widget.php:73
674
+ msgid ""
675
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
676
+ "least one list to use the Easy MailChimp widget."
677
+ msgstr ""
678
+
679
+ #: .././templates/yikes-mailchimp-widget.php:80
680
+ msgid ""
681
+ "Oops! It looks like you forgot to select a form to display here. Go to "
682
+ "'Appearance > Widgets' and select a form to display."
683
+ msgstr ""
684
+
685
+ #: .././templates/yikes-mailchimp-widget.php:117
686
+ msgid "Sign Up For Our Newsletter"
687
+ msgstr ""
688
+
689
+ #: .././templates/yikes-mailchimp-widget.php:129
690
+ msgid "Sign Me Up"
691
+ msgstr ""
692
+
693
+ #: .././templates/yikes-mailchimp-widget.php:133
694
+ msgid "Title:"
695
+ msgstr ""
696
+
697
+ #: .././templates/yikes-mailchimp-widget.php:138
698
+ msgid "Form Text:"
699
+ msgstr ""
700
+
701
+ #: .././templates/yikes-mailchimp-widget.php:146
702
+ msgid "Submit Button Text:"
703
+ msgstr ""
704
+
705
+ #: .././templates/yikes-mailchimp-widget.php:156
706
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
707
+ msgstr ""
708
+
709
+ #: .././templates/yikes-mailchimp-widget.php:156
710
+ msgid "Settings page"
711
+ msgstr ""
languages/yikes-inc-easy-mailchimp-extender-es_ES.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-es_ES.po ADDED
@@ -0,0 +1,781 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:27-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:48-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: es\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "Gracias por suscribirse!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "Gracias por suscribirse! Revise su correo electrónico para el mensaje de "
29
+ "confirmación."
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "Seleccione su área de interés"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "Haga clic en un suscriptor para ver más información"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "correo electrónico"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "Fecha Suscrito"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr "Lo siento No actualidad no tienen ninguna suscriptores en esta lista!"
50
+
51
+ #: .././classes/class.yksemeBase.php:998
52
+ msgid "Back to Subscriber List"
53
+ msgstr "Volver a la lista de suscriptores"
54
+
55
+ #: .././classes/class.yksemeBase.php:999
56
+ msgid "Subscriber Details"
57
+ msgstr "Detalles del suscriptor"
58
+
59
+ #: .././classes/class.yksemeBase.php:1010
60
+ msgid "Overview"
61
+ msgstr "visión de conjunto"
62
+
63
+ #: .././classes/class.yksemeBase.php:1015
64
+ msgid "First Name"
65
+ msgstr "Nombre"
66
+
67
+ #: .././classes/class.yksemeBase.php:1018
68
+ msgid "Last Updated"
69
+ msgstr "Última actualización"
70
+
71
+ #: .././classes/class.yksemeBase.php:1021
72
+ msgid "Preferred Email Type"
73
+ msgstr "Preferido Tipo Email"
74
+
75
+ #: .././classes/class.yksemeBase.php:1028
76
+ msgid "Last Name"
77
+ msgstr "apellido"
78
+
79
+ #: .././classes/class.yksemeBase.php:1031
80
+ msgid "Language"
81
+ msgstr "idioma"
82
+
83
+ #: .././classes/class.yksemeBase.php:1054
84
+ msgid "Groups Subscribed To"
85
+ msgstr "Grupos Suscriptor a"
86
+
87
+ #: .././classes/class.yksemeBase.php:1104
88
+ msgid "Subscriber Notes"
89
+ msgstr "Notas del suscriptor"
90
+
91
+ #: .././classes/class.yksemeBase.php:1109
92
+ msgid "Written by"
93
+ msgstr "Escrito por"
94
+
95
+ #: .././classes/class.yksemeBase.php:1109
96
+ msgid "Created on"
97
+ msgstr "Fabricado en"
98
+
99
+ #: .././classes/class.yksemeBase.php:1251
100
+ #: .././classes/class.yksemeBase.php:1253
101
+ msgid "MailChimp Forms"
102
+ msgstr "Formas MailChimp"
103
+
104
+ #: .././classes/class.yksemeBase.php:1253
105
+ msgid "MailChimp Settings"
106
+ msgstr "Ajustes MailChimp"
107
+
108
+ #: .././classes/class.yksemeBase.php:1254
109
+ msgid "Manage List Forms"
110
+ msgstr "Administrar Lista de Formularios"
111
+
112
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
113
+ msgid "About YIKES, Inc."
114
+ msgstr "Acerca YIKES, Inc."
115
+
116
+ #: .././classes/class.yksemeBase.php:1430
117
+ msgid "One or more fields are empty"
118
+ msgstr "Uno o más campos están vacíos"
119
+
120
+ #: .././classes/class.yksemeBase.php:1480
121
+ msgid "Your List Was Successfully Saved!"
122
+ msgstr "Su lista de éxito se salvó!"
123
+
124
+ #: .././classes/class.yksemeBase.php:1482
125
+ msgid "I'm sorry there was an error with your request."
126
+ msgstr "Siento que había un error con su pedido."
127
+
128
+ #: .././classes/class.yksemeBase.php:1488
129
+ msgid "MailChimp List name"
130
+ msgstr "Nombre de la lista MailChimp"
131
+
132
+ #: .././classes/class.yksemeBase.php:1494
133
+ #: .././classes/class.yksemeBase.php:1504
134
+ #, php-format
135
+ msgid "%1$s"
136
+ msgstr ""
137
+
138
+ #: .././classes/class.yksemeBase.php:1512
139
+ msgid "MailChimp List ID"
140
+ msgstr "MailChimp Lista ID"
141
+
142
+ #: .././classes/class.yksemeBase.php:1518
143
+ msgid "Shortcode"
144
+ msgstr "Código corto"
145
+
146
+ #: .././classes/class.yksemeBase.php:1521
147
+ msgid ""
148
+ "Paste this shortcode into whatever page or post you want to add this form to"
149
+ msgstr ""
150
+ "Pega este código corto en cualquier página o post que quiere agregar este "
151
+ "formulario para"
152
+
153
+ #: .././classes/class.yksemeBase.php:1526
154
+ msgid "PHP Snippet"
155
+ msgstr "PHP fragmento"
156
+
157
+ #: .././classes/class.yksemeBase.php:1529
158
+ msgid "Use this code to add this form to a template file"
159
+ msgstr ""
160
+ "Utilice este código para agregar este formulario a un archivo de plantilla"
161
+
162
+ #: .././classes/class.yksemeBase.php:1534
163
+ msgid "Number of Subscribers"
164
+ msgstr "Número de suscriptores"
165
+
166
+ #: .././classes/class.yksemeBase.php:1543
167
+ msgid "Form Fields"
168
+ msgstr "Los campos de formulario"
169
+
170
+ #: .././classes/class.yksemeBase.php:1545
171
+ msgid ""
172
+ "Check the fields you want included in your form (Email Address is required)."
173
+ msgstr ""
174
+ "Revisa los campos que desea incluir en el formulario (es necesario E-mail)."
175
+
176
+ #: .././classes/class.yksemeBase.php:1548
177
+ msgid ""
178
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
179
+ msgstr ""
180
+ "Utilice las flechas verdes para arrastrar y soltar los campos y cambiar su "
181
+ "orden."
182
+
183
+ #: .././classes/class.yksemeBase.php:1554
184
+ msgid "Active Fields"
185
+ msgstr "Los campos activos"
186
+
187
+ #: .././classes/class.yksemeBase.php:1563
188
+ msgid "Drag"
189
+ msgstr "arrastrar"
190
+
191
+ #: .././classes/class.yksemeBase.php:1563
192
+ msgid "drop"
193
+ msgstr "soltar"
194
+
195
+ #: .././classes/class.yksemeBase.php:1568
196
+ msgid "Merge field"
197
+ msgstr "campo de combinación"
198
+
199
+ #: .././classes/class.yksemeBase.php:1569
200
+ msgid "Placeholder"
201
+ msgstr "Marcador de posición"
202
+
203
+ #: .././classes/class.yksemeBase.php:1577
204
+ msgid "Redirect User On Submission"
205
+ msgstr "Redireccionar usuario sobre la exposición"
206
+
207
+ #: .././classes/class.yksemeBase.php:1581
208
+ msgid "choose a page to redirect the user to after they submit the form."
209
+ msgstr ""
210
+ "elegir una página o establecer una URL personalizada para redirigir al "
211
+ "usuario después de enviar el formulario."
212
+
213
+ #: .././classes/class.yksemeBase.php:1584
214
+ msgid "Select A Post/Page"
215
+ msgstr "Seleccione un mensaje / Página"
216
+
217
+ #: .././classes/class.yksemeBase.php:1638
218
+ msgid "Save Form Settings"
219
+ msgstr "Gestione MailChimp Forms Configuración"
220
+
221
+ #: .././classes/class.yksemeBase.php:1639
222
+ msgid "Delete Form"
223
+ msgstr "Eliminar Form"
224
+
225
+ #: .././classes/class.yksemeBase.php:1640
226
+ msgid "Re-Import Form Fields from MailChimp"
227
+ msgstr "Favor de importar algunas listas de MailChimp"
228
+
229
+ #: .././classes/class.yksemeBase.php:2168
230
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
231
+ msgstr "Registrarme en el Boletín de MailChimp-REPLACE-ESTE-TEXT"
232
+
233
+ #: .././pages/about.php:27
234
+ msgid "YIKES, Inc. Web Design and Development"
235
+ msgstr "Yikes, Inc. Diseño y Desarrollo Web"
236
+
237
+ #: .././pages/about.php:29
238
+ msgid "Smart, effective, beautifully designed web solutions"
239
+ msgstr "Soluciones web inteligentes efectivos, de bonito diseño"
240
+
241
+ #: .././pages/about.php:32
242
+ msgid ""
243
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
244
+ "custom WordPress themes and plugins every day."
245
+ msgstr ""
246
+ "YIKES está situado en el barrio de Fishtown Philadelphia donde construimos a "
247
+ "medida temas de WordPress y plugins todos los días."
248
+
249
+ #: .././pages/about.php:36
250
+ msgid ""
251
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
252
+ "WordCamps"
253
+ msgstr ""
254
+ "En YIKES amamos WordPress! Co-propietario, Tracy Levesque ha presentado en "
255
+ "WordCamps"
256
+
257
+ #: .././pages/about.php:36
258
+ msgid "and"
259
+ msgstr "y"
260
+
261
+ #: .././pages/about.php:36
262
+ msgid "She also teaches WordPress classes for"
263
+ msgstr "También imparte clases de WordPress para"
264
+
265
+ #: .././pages/about.php:40
266
+ msgid ""
267
+ "In addition to making great WordPress sites we are also committed to the "
268
+ "sustainable business movement. We observe the triple bottom line: people, "
269
+ "planet, profit and work to help build a more socially, environmentally and "
270
+ "financially sustainable local economy. We even have a"
271
+ msgstr ""
272
+ "Además de hacer grandes sitios de WordPress también estamos comprometidos "
273
+ "con el movimiento empresarial sostenible. Observamos la triple cuenta de "
274
+ "resultados: las personas, el planeta, la ganancia y el trabajo para ayudar a "
275
+ "construir una economía local más sostenible social, ambiental y "
276
+ "económicamente. Incluso tenemos un"
277
+
278
+ #: .././pages/about.php:40
279
+ msgid "LEED Platinum office"
280
+ msgstr "Oficina LEED Platinum"
281
+
282
+ #: .././pages/about.php:44
283
+ msgid ""
284
+ "If you're interested in hiring us for WordPress development, or just want to "
285
+ "learn more about us, please visit"
286
+ msgstr ""
287
+ "Si usted está interesado en contratarnos para el desarrollo de WordPress, o "
288
+ "simplemente quieres saber más sobre nosotros, por favor visite"
289
+
290
+ #: .././pages/lists.php:8
291
+ msgid "No forms have been added yet."
292
+ msgstr "No hay formas, se han añadido todavía."
293
+
294
+ #: .././pages/lists.php:39
295
+ msgid "Oops.. The list ID you entered appears to be incorrect."
296
+ msgstr "Vaya .. El ID de lista introducido no es válida."
297
+
298
+ #: .././pages/lists.php:44
299
+ msgid "There was an error!"
300
+ msgstr "Se produjo un error!"
301
+
302
+ #: .././pages/lists.php:135
303
+ msgid "You need to select a Mailchimp list in order to create a form for it"
304
+ msgstr ""
305
+ "Es necesario seleccionar una lista Mailchimp con el fin de crear un "
306
+ "formulario para que"
307
+
308
+ #: .././pages/lists.php:173
309
+ msgid "Are you sure you want to delete this form?"
310
+ msgstr "¿Está seguro de que desea eliminar esta forma?"
311
+
312
+ #: .././pages/lists.php:206
313
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
314
+ msgstr "¿Está seguro que desea volver a importar los campos de MailChimp?"
315
+
316
+ #: .././pages/lists.php:228
317
+ msgid "Looks like this form is already up to date!"
318
+ msgstr "Parece que este formulario ya está al día!"
319
+
320
+ #: .././pages/lists.php:326
321
+ msgid "Are you sure you want to unsubscribe"
322
+ msgstr "¿Seguro que quieres dar de baja"
323
+
324
+ #: .././pages/lists.php:326
325
+ msgid "from this list?"
326
+ msgstr "en esta lista?"
327
+
328
+ #: .././pages/lists.php:342
329
+ msgid "was successfully unsubscribed from this list."
330
+ msgstr "fue darme de baja con éxito de esta lista."
331
+
332
+ #: .././pages/lists.php:448 .././pages/options.php:196
333
+ #: .././pages/options.php:416
334
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
335
+ msgstr "Fácil MailChimp Formas de YIKES, Inc."
336
+
337
+ #: .././pages/lists.php:454
338
+ msgid "Before you can add MailChimp forms to your site, you need to"
339
+ msgstr "Antes de agregar formas MailChimp a su sitio, es necesario"
340
+
341
+ #: .././pages/lists.php:454
342
+ msgid "go to the MailChimp Settings page"
343
+ msgstr "ir a la página de configuración de MailChimp"
344
+
345
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
346
+ msgid "and add your API Key."
347
+ msgstr "y añadir la clave de API."
348
+
349
+ #: .././pages/lists.php:462
350
+ msgid "You must enter a valid API key to import and manage your lists."
351
+ msgstr ""
352
+ "Debe introducir una clave de API válida para importar y administrar sus "
353
+ "listas."
354
+
355
+ #: .././pages/lists.php:473
356
+ msgid "Your Lists"
357
+ msgstr "Sus listas"
358
+
359
+ #: .././pages/lists.php:483
360
+ msgid "Manage Forms"
361
+ msgstr "administrar formularios"
362
+
363
+ #: .././pages/options.php:41
364
+ msgid "The options were saved successfully!"
365
+ msgstr "Las opciones se han guardado correctamente!"
366
+
367
+ #: .././pages/options.php:44
368
+ msgid "The options could not be saved (or you did not change them)."
369
+ msgstr "Las opciones no se podrían salvar (o no cambiaron ellos)."
370
+
371
+ #: .././pages/options.php:96
372
+ msgid "Valid API Key"
373
+ msgstr "API Key Válido"
374
+
375
+ #: .././pages/options.php:102
376
+ msgid "Sorry, that is an invalid MailChimp API key."
377
+ msgstr "Lo siento, eso es una clave no válida API MailChimp."
378
+
379
+ #: .././pages/options.php:108
380
+ msgid ""
381
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
382
+ "further information."
383
+ msgstr ""
384
+ "Lo siento, eso es una clave no válida API MailChimp. Por favor, consulte la "
385
+ "consola para obtener más información."
386
+
387
+ #: .././pages/options.php:117
388
+ msgid "Error: Please enter a valid Mail Chimp API Key."
389
+ msgstr "Error: Por favor ingrese una clave de API de MailChimp válida."
390
+
391
+ #: .././pages/options.php:199
392
+ msgid "Manage Mailchimp Forms Settings"
393
+ msgstr "Gestione MailChimp Forms Configuración"
394
+
395
+ #: .././pages/options.php:205
396
+ msgid "WordPress Version Number Error"
397
+ msgstr "Versión Wordpress"
398
+
399
+ #: .././pages/options.php:206
400
+ msgid ""
401
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
402
+ "You won't be able to access the tinyMCE button to insert forms into pages "
403
+ "and posts unless you update to 3.9 or later."
404
+ msgstr ""
405
+ "Lo sentimos, pero parece que el uso de una versión antigua de WordPress. "
406
+ "Usted no será capaz de acceder al botón de TinyMCE para insertar formularios "
407
+ "en las páginas y los mensajes a menos que actualice a 3.9 o posterior."
408
+
409
+ #: .././pages/options.php:215
410
+ msgid "LocalHost Detected :"
411
+ msgstr "LocalHost Detectado:"
412
+
413
+ #: .././pages/options.php:216
414
+ msgid ""
415
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
416
+ msgstr "Fácil MailChimp Formas de YIKES, Inc."
417
+
418
+ #: .././pages/options.php:217
419
+ msgid ""
420
+ "If you are unable to validate your API key, and receive the error message"
421
+ msgstr "Si usted no puede validar la clave de la API, y el mensaje de error"
422
+
423
+ #: .././pages/options.php:217
424
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
425
+ msgstr ""
426
+ "\"Problema de certificado SSL: no se puede obtener el certificado emisor "
427
+ "local\" "
428
+
429
+ #: .././pages/options.php:217
430
+ msgid "follow the tutorial located "
431
+ msgstr "seguir el tutorial localizado "
432
+
433
+ #: .././pages/options.php:230
434
+ msgid "Your Mailchimp API Key"
435
+ msgstr "Su MailChimp API Key"
436
+
437
+ #: .././pages/options.php:238
438
+ msgid ""
439
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
440
+ "site to communicate with your MailChimp account."
441
+ msgstr ""
442
+ "Introduzca su clave de API de MailChimp arriba. La clave de API permite a su "
443
+ "sitio de WordPress para comunicarse con su cuenta de MailChimp."
444
+
445
+ #: .././pages/options.php:239
446
+ msgid "For more help, visit the MailChimp Support article"
447
+ msgstr "Para obtener más ayuda, visite el artículo MailChimp Soporte"
448
+
449
+ #: .././pages/options.php:239
450
+ msgid "Where can I find my API Key?"
451
+ msgstr "¿Dónde puedo encontrar mi clave de API?"
452
+
453
+ #: .././pages/options.php:244
454
+ msgid "Preferred Form Layout"
455
+ msgstr "Forma preferente Disposición"
456
+
457
+ #: .././pages/options.php:247
458
+ msgid "table"
459
+ msgstr "tabla"
460
+
461
+ #: .././pages/options.php:248
462
+ msgid "div"
463
+ msgstr "div"
464
+
465
+ #: .././pages/options.php:256
466
+ msgid "Choose whether you want your forms to use a table or div layout."
467
+ msgstr ""
468
+ "Seleccione si desea que sus formas de utilizar una mesa o el diseño div."
469
+
470
+ #: .././pages/options.php:261
471
+ msgid "Advanced Error Messaging"
472
+ msgstr "Mensajería Error Avanzada"
473
+
474
+ #: .././pages/options.php:264
475
+ msgid "Disabled"
476
+ msgstr "discapacitado"
477
+
478
+ #: .././pages/options.php:265
479
+ msgid "Enabled"
480
+ msgstr "Activado"
481
+
482
+ #: .././pages/options.php:273
483
+ msgid ""
484
+ "Enable if you're having problems with your forms sending data to MailChimp. "
485
+ "Enabling Advanced Error Messaging will show you the exact error codes "
486
+ "MailChimp is returning."
487
+ msgstr ""
488
+ "Habilitar si usted está teniendo problemas con sus formas de enviar datos a "
489
+ "MailChimp. Habilitar Mensajería Error avanzada le mostrará los códigos de "
490
+ "error exactos MailChimp está volviendo."
491
+
492
+ #: .././pages/options.php:281
493
+ msgid "Single Opt-In"
494
+ msgstr "Soltero Opt-In"
495
+
496
+ #: .././pages/options.php:282
497
+ msgid "Double Opt-In"
498
+ msgstr "Doble Opt-In"
499
+
500
+ #: .././pages/options.php:290
501
+ msgid ""
502
+ "A single opt-in will add the user to your list without any further "
503
+ "interaction."
504
+ msgstr ""
505
+ "Un solo opt-in se agregue el usuario a la lista sin ninguna interacción "
506
+ "adicional."
507
+
508
+ #: .././pages/options.php:291
509
+ msgid ""
510
+ "A double opt-in will send an email to the user asking them to confirm their "
511
+ "subscription."
512
+ msgstr ""
513
+ "Un doble opt-in le enviará un correo electrónico al usuario pidiéndole que "
514
+ "confirme su suscripción."
515
+
516
+ #: .././pages/options.php:292
517
+ msgid "This will also dictate the opt-in settings for people leaving comments."
518
+ msgstr ""
519
+ "Esto también determinará la configuración de opt-in para la gente dejando "
520
+ "comentarios."
521
+
522
+ #: .././pages/options.php:297
523
+ msgid "Custom Opt-In Message"
524
+ msgstr "Custom Opt-In Mensaje"
525
+
526
+ #: .././pages/options.php:299
527
+ msgid "Double Opt-In Message"
528
+ msgstr "Doble Mensaje Opt-In"
529
+
530
+ #: .././pages/options.php:301
531
+ msgid "Single Opt-In Message"
532
+ msgstr "Soltero Opt-In Mensaje"
533
+
534
+ #: .././pages/options.php:307
535
+ msgid "Interest Group Label"
536
+ msgstr "Grupo de Interés Label"
537
+
538
+ #: .././pages/options.php:316
539
+ msgid ""
540
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
541
+ "group names."
542
+ msgstr ""
543
+ "Texto para mostrar por encima de los grupos de interés. Dejar en blanco para "
544
+ "usar los nombres de grupos de interés MailChimp."
545
+
546
+ #: .././pages/options.php:321
547
+ msgid "Display opt-in checkbox on comment forms?"
548
+ msgstr "Display opt-in casilla de verificación en formularios de comentarios?"
549
+
550
+ #: .././pages/options.php:324
551
+ msgid "Hide"
552
+ msgstr "Esconder"
553
+
554
+ #: .././pages/options.php:325
555
+ msgid "Show"
556
+ msgstr "Mostrar"
557
+
558
+ #: .././pages/options.php:333
559
+ msgid ""
560
+ "This will display a checkbox just above the submit button on all comment "
561
+ "forms. If selected, any users leaving comments will also be added to the "
562
+ "mailing list."
563
+ msgstr ""
564
+ "Esto mostrará una casilla justo encima del botón de envío en todos los "
565
+ "formularios de comentarios. Si se selecciona, se añadirán también a "
566
+ "cualquier usuario que dejan comentarios a la lista de correo."
567
+
568
+ #: .././pages/options.php:338
569
+ msgid "Custom Comment Checkbox Text"
570
+ msgstr "Custom comentario a Casilla de texto"
571
+
572
+ #: .././pages/options.php:345
573
+ msgid "Default List"
574
+ msgstr "Lista defecto"
575
+
576
+ #: .././pages/options.php:360
577
+ msgid ""
578
+ "This is the default list users will be subscribed to when submitting a "
579
+ "comment."
580
+ msgstr ""
581
+ "Se trata de los usuarios de la lista por defecto serán suscritas a la hora "
582
+ "de presentar un comentario."
583
+
584
+ #: .././pages/options.php:361
585
+ msgid ""
586
+ "It is best to select a form where only the email , first name and/or last "
587
+ "name are required or you may run into issues."
588
+ msgstr ""
589
+ "Lo mejor es seleccionar un formulario donde sólo el correo electrónico, "
590
+ "nombre y / o apellido se requiere o puede que tenga problemas."
591
+
592
+ #: .././pages/options.php:373
593
+ msgid "Plugin Information"
594
+ msgstr "Información Plugin"
595
+
596
+ #: .././pages/options.php:376
597
+ msgid "If you experience any issues with our plugin, please"
598
+ msgstr "Si experimenta cualquier problema con nuestro plugin, por favor"
599
+
600
+ #: .././pages/options.php:376
601
+ msgid "submit a New Issue on our Github Issue Tracker"
602
+ msgstr "Enviar un nuevo asunto en nuestro Rastreador Github Issue"
603
+
604
+ #: .././pages/options.php:376
605
+ msgid ""
606
+ "Please include the information below to help us troubleshoot your problem."
607
+ msgstr ""
608
+ "Por favor, incluya la siguiente información para ayudarnos a solucionar su "
609
+ "problema."
610
+
611
+ #: .././pages/options.php:384
612
+ msgid "Plugin Version"
613
+ msgstr "Version Plugin"
614
+
615
+ #: .././pages/options.php:388
616
+ msgid "Wordpress Version"
617
+ msgstr "Versión Wordpress"
618
+
619
+ #: .././pages/options.php:392
620
+ msgid "Browser Information"
621
+ msgstr "Navegador de Información"
622
+
623
+ #: .././pages/options.php:420
624
+ msgid "Error"
625
+ msgstr "&Error"
626
+
627
+ #: .././pages/options.php:421
628
+ msgid ""
629
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
630
+ "cURL to send and retreive data."
631
+ msgstr ""
632
+ "Lo sentimos, pero CURL está deshabilitado en tu servidor. La API de "
633
+ "MailChimp utiliza cURL para enviar y retreive datos."
634
+
635
+ #: .././pages/options.php:426
636
+ msgid "Help!"
637
+ msgstr "Ayuda!!"
638
+
639
+ #: .././pages/options.php:426
640
+ msgid "What is cURL?"
641
+ msgstr "¿Qué es cURL?"
642
+
643
+ #: .././pages/options.php:426
644
+ msgid "Check phpinfo()"
645
+ msgstr "Compruebe phpinfo ()"
646
+
647
+ #: .././pages/options.php:428
648
+ msgid "Steps To Resolve The Issue"
649
+ msgstr "Pasos para resolver el problema"
650
+
651
+ #: .././pages/options.php:430
652
+ msgid ""
653
+ "You can enable cURL by turning on the cURL module within your php.ini file"
654
+ msgstr "Puede activar cURL activando el módulo cURL en su archivo php.ini"
655
+
656
+ #: .././pages/options.php:430
657
+ msgid "You should find the php.ini file located here : "
658
+ msgstr "Usted debe encontrar el archivo php.ini se encuentra aquí: "
659
+
660
+ #: .././pages/options.php:431
661
+ msgid ""
662
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
663
+ msgstr ""
664
+ "Una vez encontrado, abrir php.ini y busque la línea \"la ampliación = "
665
+ "php_curl.dll\"."
666
+
667
+ #: .././pages/options.php:432
668
+ msgid ""
669
+ "Remove the semi colon before the line, to un-comment it and make the module "
670
+ "active."
671
+ msgstr ""
672
+ "Quite el punto y coma antes de la línea, a un-comentarlo y hacer que el "
673
+ "módulo activo."
674
+
675
+ #: .././pages/options.php:433
676
+ msgid "Re-save and close the file."
677
+ msgstr "Vuelva a guardar y cerrar el archivo."
678
+
679
+ #: .././pages/options.php:434
680
+ msgid "Re-load this page."
681
+ msgstr "Vuelva a cargar esta página."
682
+
683
+ #: .././templates/shortcode_error.php:1
684
+ msgid "There was an error calling the mailchimp list."
685
+ msgstr "Hubo un error al llamar a la lista de MailChimp."
686
+
687
+ #: .././templates/shortcode_error_data.php:1
688
+ msgid ""
689
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
690
+ "List Forms\" page."
691
+ msgstr ""
692
+ "La lista no existe! Asegúrese de que ha importado la lista de la "
693
+ "\"Administrar Lista Forms\" página."
694
+
695
+ #: .././templates/shortcode_error_exists.php:1
696
+ msgid "This list was already placed on this page!"
697
+ msgstr "Esta lista ya fue colocado en esta página!"
698
+
699
+ #: .././templates/shortcode_error_no_API_key.php:1
700
+ msgid "Woops! No Valid API Key Found. Double check your settings."
701
+ msgstr "Woops! No API Key Válido encontrado. Vuelva a comprobar los ajustes."
702
+
703
+ #: .././templates/shortcode_form.php:11
704
+ msgid "Oops.. Don't forget to fill-in the following fields"
705
+ msgstr "Uy .. No te olvides de rellenar los siguientes campos"
706
+
707
+ #: .././templates/shortcode_form.php:74
708
+ msgid "required field"
709
+ msgstr "campo obligatorio"
710
+
711
+ #: .././templates/yikes-mailchimp-widget.php:15
712
+ #: .././templates/yikes-mailchimp-widget.php:18
713
+ msgid "MailChimp Signup Form"
714
+ msgstr "MailChimp Solicitud de Admisión"
715
+
716
+ #: .././templates/yikes-mailchimp-widget.php:27
717
+ msgid "Select Which Form You Would Like To Display:"
718
+ msgstr "Seleccionar qué formulario que desea mostrar:"
719
+
720
+ #: .././templates/yikes-mailchimp-widget.php:30
721
+ msgid "Select a Form to Display"
722
+ msgstr "Seleccione un formulario para mostrar"
723
+
724
+ #: .././templates/yikes-mailchimp-widget.php:47
725
+ msgid "Please import MailChimp forms"
726
+ msgstr "Por favor, importar formularios MailChimp"
727
+
728
+ #: .././templates/yikes-mailchimp-widget.php:49
729
+ msgid "Please import some lists from MailChimp"
730
+ msgstr "Favor de importar algunas listas de MailChimp"
731
+
732
+ #: .././templates/yikes-mailchimp-widget.php:52
733
+ msgid "Import Lists Now"
734
+ msgstr "Importar listas ahora"
735
+
736
+ #: .././templates/yikes-mailchimp-widget.php:73
737
+ msgid ""
738
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
739
+ "least one list to use the Easy MailChimp widget."
740
+ msgstr ""
741
+ "¡Huy! Parece que no ha importado ninguna lista todavía. Debe importar al "
742
+ "menos una lista de usar el widget Fácil MailChimp."
743
+
744
+ #: .././templates/yikes-mailchimp-widget.php:80
745
+ msgid ""
746
+ "Oops! It looks like you forgot to select a form to display here. Go to "
747
+ "'Appearance > Widgets' and select a form to display."
748
+ msgstr ""
749
+ "¡Huy! Parece que ha olvidado de seleccionar un formulario para mostrar aquí. "
750
+ "Ir a \"Apariencia> Widgets\" y seleccione un formulario para mostrar."
751
+
752
+ #: .././templates/yikes-mailchimp-widget.php:117
753
+ msgid "Sign Up For Our Newsletter"
754
+ msgstr "Suscríbase a nuestro boletín"
755
+
756
+ #: .././templates/yikes-mailchimp-widget.php:129
757
+ msgid "Sign Me Up"
758
+ msgstr "Sign Me Up"
759
+
760
+ #: .././templates/yikes-mailchimp-widget.php:133
761
+ msgid "Title:"
762
+ msgstr "Título:"
763
+
764
+ #: .././templates/yikes-mailchimp-widget.php:138
765
+ msgid "Form Text:"
766
+ msgstr "Formulario de Texto:"
767
+
768
+ #: .././templates/yikes-mailchimp-widget.php:146
769
+ msgid "Submit Button Text:"
770
+ msgstr "Enviar Texto del botón:"
771
+
772
+ #: .././templates/yikes-mailchimp-widget.php:156
773
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
774
+ msgstr "¡Huy! Parece que no has añadido tu clave de API! Pásate por el"
775
+
776
+ #: .././templates/yikes-mailchimp-widget.php:156
777
+ msgid "Settings page"
778
+ msgstr "página Configuración"
779
+
780
+ #~ msgid "No API Key or List Id Exist!"
781
+ #~ msgstr "No API Key o Lista Id existen!"
languages/yikes-inc-easy-mailchimp-extender-fa_IR.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-fa_IR.po ADDED
@@ -0,0 +1,766 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:29-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:50-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: fa_IR\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "با تشکر از شما برای به اشتراک!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr "با تشکر از شما برای به اشتراک! برای پیام تایید ایمیل خود را."
28
+
29
+ #: .././classes/class.yksemeBase.php:116
30
+ msgid "Select Your Area of Interest"
31
+ msgstr "انتخاب منطقه مورد علاقه شما"
32
+
33
+ #: .././classes/class.yksemeBase.php:917
34
+ msgid "Click on a subscriber to see further information"
35
+ msgstr "در یک مشترک را کلیک کنید برای دیدن اطلاعات بیشتر"
36
+
37
+ #: .././classes/class.yksemeBase.php:920
38
+ msgid "E-Mail"
39
+ msgstr "ایمیل"
40
+
41
+ #: .././classes/class.yksemeBase.php:921
42
+ msgid "Date Subscribed"
43
+ msgstr "تاریخ مشترک"
44
+
45
+ #: .././classes/class.yksemeBase.php:941
46
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
47
+ msgstr "متاسفانه شما در حال حاضر نه هر مشترکین در این لیست!"
48
+
49
+ #: .././classes/class.yksemeBase.php:998
50
+ msgid "Back to Subscriber List"
51
+ msgstr "برگشت به فهرست مشترک"
52
+
53
+ #: .././classes/class.yksemeBase.php:999
54
+ msgid "Subscriber Details"
55
+ msgstr "اطلاعات مشترک"
56
+
57
+ #: .././classes/class.yksemeBase.php:1010
58
+ msgid "Overview"
59
+ msgstr "هفتگی"
60
+
61
+ #: .././classes/class.yksemeBase.php:1015
62
+ msgid "First Name"
63
+ msgstr "نام"
64
+
65
+ #: .././classes/class.yksemeBase.php:1018
66
+ msgid "Last Updated"
67
+ msgstr "آخرین به روز رسانی"
68
+
69
+ #: .././classes/class.yksemeBase.php:1021
70
+ msgid "Preferred Email Type"
71
+ msgstr "ترجیحی نوع ایمیل"
72
+
73
+ #: .././classes/class.yksemeBase.php:1028
74
+ msgid "Last Name"
75
+ msgstr "نام خانوادگی"
76
+
77
+ #: .././classes/class.yksemeBase.php:1031
78
+ msgid "Language"
79
+ msgstr "زبان"
80
+
81
+ #: .././classes/class.yksemeBase.php:1054
82
+ msgid "Groups Subscribed To"
83
+ msgstr "گروه: مشترک به"
84
+
85
+ #: .././classes/class.yksemeBase.php:1104
86
+ msgid "Subscriber Notes"
87
+ msgstr "یادداشت های مشترک"
88
+
89
+ #: .././classes/class.yksemeBase.php:1109
90
+ msgid "Written by"
91
+ msgstr "نوشته شده توسط"
92
+
93
+ #: .././classes/class.yksemeBase.php:1109
94
+ msgid "Created on"
95
+ msgstr "ایجاد شده در"
96
+
97
+ #: .././classes/class.yksemeBase.php:1251
98
+ #: .././classes/class.yksemeBase.php:1253
99
+ msgid "MailChimp Forms"
100
+ msgstr "فرم MailChimp"
101
+
102
+ #: .././classes/class.yksemeBase.php:1253
103
+ msgid "MailChimp Settings"
104
+ msgstr "تنظیمات MailChimp"
105
+
106
+ #: .././classes/class.yksemeBase.php:1254
107
+ msgid "Manage List Forms"
108
+ msgstr "مدیریت لیست فرم ها"
109
+
110
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
111
+ msgid "About YIKES, Inc."
112
+ msgstr "در حدود Yikes, Inc."
113
+
114
+ #: .././classes/class.yksemeBase.php:1430
115
+ msgid "One or more fields are empty"
116
+ msgstr "یک یا چند رشته خالی است"
117
+
118
+ #: .././classes/class.yksemeBase.php:1480
119
+ msgid "Your List Was Successfully Saved!"
120
+ msgstr "لیست شما با موفقیت ذخیره شد!"
121
+
122
+ #: .././classes/class.yksemeBase.php:1482
123
+ msgid "I'm sorry there was an error with your request."
124
+ msgstr "متاسفم خطایی در درخواست شما وجود دارد."
125
+
126
+ #: .././classes/class.yksemeBase.php:1488
127
+ msgid "MailChimp List name"
128
+ msgstr "فهرست MailChimp نام"
129
+
130
+ #: .././classes/class.yksemeBase.php:1494
131
+ #: .././classes/class.yksemeBase.php:1504
132
+ #, php-format
133
+ msgid "%1$s"
134
+ msgstr ""
135
+
136
+ #: .././classes/class.yksemeBase.php:1512
137
+ msgid "MailChimp List ID"
138
+ msgstr "MailChimp لیست ID"
139
+
140
+ #: .././classes/class.yksemeBase.php:1518
141
+ msgid "Shortcode"
142
+ msgstr "کوتاه"
143
+
144
+ #: .././classes/class.yksemeBase.php:1521
145
+ msgid ""
146
+ "Paste this shortcode into whatever page or post you want to add this form to"
147
+ msgstr ""
148
+ "چسباندن این کوتاه را در هر صفحه و یا پست شما می خواهید برای اضافه کردن این "
149
+ "فرم به"
150
+
151
+ #: .././classes/class.yksemeBase.php:1526
152
+ msgid "PHP Snippet"
153
+ msgstr "PHP کد آماده"
154
+
155
+ #: .././classes/class.yksemeBase.php:1529
156
+ msgid "Use this code to add this form to a template file"
157
+ msgstr "با استفاده از این کد برای اضافه کردن این فرم به یک فایل الگو"
158
+
159
+ #: .././classes/class.yksemeBase.php:1534
160
+ msgid "Number of Subscribers"
161
+ msgstr "تعداد مشترکین"
162
+
163
+ #: .././classes/class.yksemeBase.php:1543
164
+ msgid "Form Fields"
165
+ msgstr "زمینه های فرم"
166
+
167
+ #: .././classes/class.yksemeBase.php:1545
168
+ msgid ""
169
+ "Check the fields you want included in your form (Email Address is required)."
170
+ msgstr ""
171
+ "بررسی زمینه های که می خواهید در قالب خود را شامل (آدرس ایمیل مورد نیاز است)."
172
+
173
+ #: .././classes/class.yksemeBase.php:1548
174
+ msgid ""
175
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
176
+ msgstr ""
177
+ "استفاده از فلش سبز به کشیدن و رها کردن زمینه و تنظیم مجدد سفارش خود را."
178
+
179
+ #: .././classes/class.yksemeBase.php:1554
180
+ msgid "Active Fields"
181
+ msgstr "زمینه های فعالیت"
182
+
183
+ #: .././classes/class.yksemeBase.php:1563
184
+ msgid "Drag"
185
+ msgstr "پسا"
186
+
187
+ #: .././classes/class.yksemeBase.php:1563
188
+ msgid "drop"
189
+ msgstr "رها کردن"
190
+
191
+ #: .././classes/class.yksemeBase.php:1568
192
+ msgid "Merge field"
193
+ msgstr "ادغام حوزه"
194
+
195
+ #: .././classes/class.yksemeBase.php:1569
196
+ msgid "Placeholder"
197
+ msgstr "حفره یا سورا"
198
+
199
+ #: .././classes/class.yksemeBase.php:1577
200
+ msgid "Redirect User On Submission"
201
+ msgstr "تغییر مسیر کاربر فعال ارسال مقاله"
202
+
203
+ #: .././classes/class.yksemeBase.php:1581
204
+ msgid "choose a page to redirect the user to after they submit the form."
205
+ msgstr ""
206
+ "یک صفحه انتخاب کنید و یا مجموعه ای URL سفارشی برای هدایت کاربر به بعد از "
207
+ "آنها فرم را ارسال کنید."
208
+
209
+ #: .././classes/class.yksemeBase.php:1584
210
+ msgid "Select A Post/Page"
211
+ msgstr "انتخاب ارسال / صفحه"
212
+
213
+ #: .././classes/class.yksemeBase.php:1638
214
+ msgid "Save Form Settings"
215
+ msgstr "مدیریت Mailchimp فرم تنظیمات"
216
+
217
+ #: .././classes/class.yksemeBase.php:1639
218
+ msgid "Delete Form"
219
+ msgstr "حذف فرم"
220
+
221
+ #: .././classes/class.yksemeBase.php:1640
222
+ msgid "Re-Import Form Fields from MailChimp"
223
+ msgstr "لطفا لیست برخی از MailChimp واردات"
224
+
225
+ #: .././classes/class.yksemeBase.php:2168
226
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
227
+ msgstr "ثبت نام من برای خبرنامه MAILCHIMP، جایگزین، این متن را"
228
+
229
+ #: .././pages/about.php:27
230
+ msgid "YIKES, Inc. Web Design and Development"
231
+ msgstr " طراحی و توسعه وب Yikes, Inc."
232
+
233
+ #: .././pages/about.php:29
234
+ msgid "Smart, effective, beautifully designed web solutions"
235
+ msgstr "هوشمند، موثر، راه حل های وب به زیبایی طراحی شده"
236
+
237
+ #: .././pages/about.php:32
238
+ msgid ""
239
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
240
+ "custom WordPress themes and plugins every day."
241
+ msgstr ""
242
+ " Yikes, Inc. در محله Fishtown از فیلادلفیا که در آن ما سفارشی تم ها وردپرس و "
243
+ "پلاگین ها هر روز ساخت واقع شده است."
244
+
245
+ #: .././pages/about.php:36
246
+ msgid ""
247
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
248
+ "WordCamps"
249
+ msgstr ""
250
+ "در Yikes Inc ما عاشق وردپرس! مالک مشترک، تریسی Levesque است در WordCamps "
251
+ "ارائه"
252
+
253
+ #: .././pages/about.php:36
254
+ msgid "and"
255
+ msgstr "و"
256
+
257
+ #: .././pages/about.php:36
258
+ msgid "She also teaches WordPress classes for"
259
+ msgstr "او همچنین برای آموزد کلاس های وردپرس"
260
+
261
+ #: .././pages/about.php:40
262
+ msgid ""
263
+ "In addition to making great WordPress sites we are also committed to the "
264
+ "sustainable business movement. We observe the triple bottom line: people, "
265
+ "planet, profit and work to help build a more socially, environmentally and "
266
+ "financially sustainable local economy. We even have a"
267
+ msgstr ""
268
+ "علاوه بر این به ساخت سایت های وردپرس بزرگ ما نیز به جنبش کسب و کار پایدار "
269
+ "متعهد است. مردم، سیاره، سود و کار برای کمک به ساخت یک اقتصاد محلی پایدار "
270
+ "اجتماعی، محیط زیست و مالی: ما خط زیرین سه گانه را مشاهده کند. ما حتی یک"
271
+
272
+ #: .././pages/about.php:40
273
+ msgid "LEED Platinum office"
274
+ msgstr "دفتر LEED پلاتین"
275
+
276
+ #: .././pages/about.php:44
277
+ msgid ""
278
+ "If you're interested in hiring us for WordPress development, or just want to "
279
+ "learn more about us, please visit"
280
+ msgstr ""
281
+ "اگر شما علاقه مند در استخدام ما برای توسعه وردپرس، و یا فقط می خواهید به "
282
+ "یادگیری بیشتر در مورد ما، لطفا"
283
+
284
+ #: .././pages/lists.php:8
285
+ msgid "No forms have been added yet."
286
+ msgstr "بدون اشکال هنوز اضافه شده است."
287
+
288
+ #: .././pages/lists.php:39
289
+ msgid "Oops.. The list ID you entered appears to be incorrect."
290
+ msgstr "اوه .. لیست ID شما وارد کرده اید اشتباه است."
291
+
292
+ #: .././pages/lists.php:44
293
+ msgid "There was an error!"
294
+ msgstr "خطایی وجود دارد!"
295
+
296
+ #: .././pages/lists.php:135
297
+ msgid "You need to select a Mailchimp list in order to create a form for it"
298
+ msgstr "شما نیاز به انتخاب یک لیست Mailchimp به منظور ایجاد یک فرم برای آن"
299
+
300
+ #: .././pages/lists.php:173
301
+ msgid "Are you sure you want to delete this form?"
302
+ msgstr "آیا مطمئن هستید که می خواهید این فرم را حذف کنید؟"
303
+
304
+ #: .././pages/lists.php:206
305
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
306
+ msgstr ""
307
+ "آیا مطمئن هستید که می خواهید را دوباره وارد میدان های خود را از MailChimp؟"
308
+
309
+ #: .././pages/lists.php:228
310
+ msgid "Looks like this form is already up to date!"
311
+ msgstr "به نظر می رسد این فرم در حال حاضر به روز!"
312
+
313
+ #: .././pages/lists.php:326
314
+ msgid "Are you sure you want to unsubscribe"
315
+ msgstr "آیا مطمئن هستید که می خواهید برای لغو اشتراک"
316
+
317
+ #: .././pages/lists.php:326
318
+ msgid "from this list?"
319
+ msgstr "از این لیست؟"
320
+
321
+ #: .././pages/lists.php:342
322
+ msgid "was successfully unsubscribed from this list."
323
+ msgstr "با موفقیت از این لیست لغو شد."
324
+
325
+ #: .././pages/lists.php:448 .././pages/options.php:196
326
+ #: .././pages/options.php:416
327
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
328
+ msgstr "فرم آسان Mailchimp توسط Yikes, Inc. ، شرکت"
329
+
330
+ #: .././pages/lists.php:454
331
+ msgid "Before you can add MailChimp forms to your site, you need to"
332
+ msgstr ""
333
+ "قبل از اینکه شما می توانید اشکال MailChimp را به سایت خود اضافه کنید، شما به "
334
+ "نیاز"
335
+
336
+ #: .././pages/lists.php:454
337
+ msgid "go to the MailChimp Settings page"
338
+ msgstr "رفتن به صفحه تنظیمات MailChimp"
339
+
340
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
341
+ msgid "and add your API Key."
342
+ msgstr "و اضافه کردن کلید API خود را."
343
+
344
+ #: .././pages/lists.php:462
345
+ msgid "You must enter a valid API key to import and manage your lists."
346
+ msgstr "شما باید یک کلید API معتبر به واردات و مدیریت لیست خود را وارد کنید."
347
+
348
+ #: .././pages/lists.php:473
349
+ msgid "Your Lists"
350
+ msgstr "لیست شما"
351
+
352
+ #: .././pages/lists.php:483
353
+ msgid "Manage Forms"
354
+ msgstr "مدیریت فرم ها"
355
+
356
+ #: .././pages/options.php:41
357
+ msgid "The options were saved successfully!"
358
+ msgstr "گزینه های موفقیت ذخیره شد!"
359
+
360
+ #: .././pages/options.php:44
361
+ msgid "The options could not be saved (or you did not change them)."
362
+ msgstr "گزینه های ذخیره نمی شود (و یا شما آنها را تغییر دهید)."
363
+
364
+ #: .././pages/options.php:96
365
+ msgid "Valid API Key"
366
+ msgstr "کلید API معتبر"
367
+
368
+ #: .././pages/options.php:102
369
+ msgid "Sorry, that is an invalid MailChimp API key."
370
+ msgstr "با عرض پوزش، که یک کلید API MailChimp نامعتبر است."
371
+
372
+ #: .././pages/options.php:108
373
+ msgid ""
374
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
375
+ "further information."
376
+ msgstr ""
377
+ "با عرض پوزش، که یک کلید API MailChimp نامعتبر است. لطفا کنسول برای کسب "
378
+ "اطلاعات بیشتر تیک بزنید."
379
+
380
+ #: .././pages/options.php:117
381
+ msgid "Error: Please enter a valid Mail Chimp API Key."
382
+ msgstr "خطا: لطفا یک معتبر ایمیل شمپانزه API کلیدی را وارد کنید."
383
+
384
+ #: .././pages/options.php:199
385
+ msgid "Manage Mailchimp Forms Settings"
386
+ msgstr "مدیریت Mailchimp فرم تنظیمات"
387
+
388
+ #: .././pages/options.php:205
389
+ msgid "WordPress Version Number Error"
390
+ msgstr "نسخه وردپرس"
391
+
392
+ #: .././pages/options.php:206
393
+ msgid ""
394
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
395
+ "You won't be able to access the tinyMCE button to insert forms into pages "
396
+ "and posts unless you update to 3.9 or later."
397
+ msgstr ""
398
+ "با عرض پوزش، اما آن را مانند با استفاده از یک نسخه قدیمی از وردپرس به نظر می "
399
+ "رسد. شما نمی قادر خواهد بود برای دسترسی به دکمه ویرایشگر tinymce برای وارد "
400
+ "کردن فرم به صفحات و پست مگر اینکه شما به 3.9 و یا بعد از به روز رسانی."
401
+
402
+ #: .././pages/options.php:215
403
+ msgid "LocalHost Detected :"
404
+ msgstr "localhost را یافت:"
405
+
406
+ #: .././pages/options.php:216
407
+ msgid ""
408
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
409
+ msgstr "فرم آسان Mailchimp توسط Yikes, Inc. ، شرکت"
410
+
411
+ #: .././pages/options.php:217
412
+ msgid ""
413
+ "If you are unable to validate your API key, and receive the error message"
414
+ msgstr "اگر شما قادر به تایید اعتبار کلید API خود را، و دریافت پیغام خطا"
415
+
416
+ #: .././pages/options.php:217
417
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
418
+ msgstr "\"مشکل گواهی SSL: قادر به دریافت محلی گواهی صادر کننده\" "
419
+
420
+ #: .././pages/options.php:217
421
+ msgid "follow the tutorial located "
422
+ msgstr "آموزش واقع به دنبال "
423
+
424
+ #: .././pages/options.php:230
425
+ msgid "Your Mailchimp API Key"
426
+ msgstr "شما Mailchimp API های کلیدی"
427
+
428
+ #: .././pages/options.php:238
429
+ msgid ""
430
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
431
+ "site to communicate with your MailChimp account."
432
+ msgstr ""
433
+ "لطفا خود را MailChimp کلید API بالا را وارد کنید. API های کلیدی اجازه می دهد "
434
+ "تا از سایت وردپرس خود را برای برقراری ارتباط با حساب MailChimp شما."
435
+
436
+ #: .././pages/options.php:239
437
+ msgid "For more help, visit the MailChimp Support article"
438
+ msgstr "برای راهنمایی بیشتر، به مقاله MailChimp پشتیبانی"
439
+
440
+ #: .././pages/options.php:239
441
+ msgid "Where can I find my API Key?"
442
+ msgstr "از کجا می توانم کلید API پیدا کنم؟"
443
+
444
+ #: .././pages/options.php:244
445
+ msgid "Preferred Form Layout"
446
+ msgstr "ترجیحی طرح بندی فرم"
447
+
448
+ #: .././pages/options.php:247
449
+ msgid "table"
450
+ msgstr "جدول"
451
+
452
+ #: .././pages/options.php:248
453
+ msgid "div"
454
+ msgstr "DIV"
455
+
456
+ #: .././pages/options.php:256
457
+ msgid "Choose whether you want your forms to use a table or div layout."
458
+ msgstr ""
459
+ "را انتخاب کنید که آیا می خواهید اشکال خود را به استفاده از یک جدول و یا طرح "
460
+ "دیو."
461
+
462
+ #: .././pages/options.php:261
463
+ msgid "Advanced Error Messaging"
464
+ msgstr "خطا پیشرفته پیام رسانی"
465
+
466
+ #: .././pages/options.php:264
467
+ msgid "Disabled"
468
+ msgstr "غیر فعال"
469
+
470
+ #: .././pages/options.php:265
471
+ msgid "Enabled"
472
+ msgstr "فعال"
473
+
474
+ #: .././pages/options.php:273
475
+ msgid ""
476
+ "Enable if you're having problems with your forms sending data to MailChimp. "
477
+ "Enabling Advanced Error Messaging will show you the exact error codes "
478
+ "MailChimp is returning."
479
+ msgstr ""
480
+ "فعال کردن اگر شما با داشتن مشکلات با فرم های خود را ارسال داده ها به "
481
+ "MailChimp. فعال کردن جستجوی پیشرفته خطا در ارسال پیام به شما کد خطا "
482
+ "MailChimp باز می گردد نشان می دهد."
483
+
484
+ #: .././pages/options.php:281
485
+ msgid "Single Opt-In"
486
+ msgstr "تنها انتخاب کردن در"
487
+
488
+ #: .././pages/options.php:282
489
+ msgid "Double Opt-In"
490
+ msgstr "دو انتخاب کردن در"
491
+
492
+ #: .././pages/options.php:290
493
+ msgid ""
494
+ "A single opt-in will add the user to your list without any further "
495
+ "interaction."
496
+ msgstr ""
497
+ "تک انتخاب کردن در را از کاربر به لیست خود را بدون هیچ تعامل بیشتر اضافه کنید."
498
+
499
+ #: .././pages/options.php:291
500
+ msgid ""
501
+ "A double opt-in will send an email to the user asking them to confirm their "
502
+ "subscription."
503
+ msgstr ""
504
+ "دو برابر انتخاب کردن در یک ایمیل به این کاربر ارسال درخواست از آنها برای "
505
+ "تأیید اشتراک خود را."
506
+
507
+ #: .././pages/options.php:292
508
+ msgid "This will also dictate the opt-in settings for people leaving comments."
509
+ msgstr "این نیز خواهد انتخاب کردن در تنظیمات برای مردم ترک نظر دیکته کند."
510
+
511
+ #: .././pages/options.php:297
512
+ msgid "Custom Opt-In Message"
513
+ msgstr "سفارشی انتخاب کردن در پیام"
514
+
515
+ #: .././pages/options.php:299
516
+ msgid "Double Opt-In Message"
517
+ msgstr "دو انتخاب کردن در پیام"
518
+
519
+ #: .././pages/options.php:301
520
+ msgid "Single Opt-In Message"
521
+ msgstr "تنها پیام انتخاب کردن در"
522
+
523
+ #: .././pages/options.php:307
524
+ msgid "Interest Group Label"
525
+ msgstr "گروه علاقه مند برچسب"
526
+
527
+ #: .././pages/options.php:316
528
+ msgid ""
529
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
530
+ "group names."
531
+ msgstr ""
532
+ "متن بالا گروه علاقه نشان می دهد. خالی بگذارید به استفاده از نام گروه علاقه "
533
+ "MailChimp."
534
+
535
+ #: .././pages/options.php:321
536
+ msgid "Display opt-in checkbox on comment forms?"
537
+ msgstr "نمایش انتخاب کردن در چک باکس در فرم نظر؟"
538
+
539
+ #: .././pages/options.php:324
540
+ msgid "Hide"
541
+ msgstr "مخفی کردن "
542
+
543
+ #: .././pages/options.php:325
544
+ msgid "Show"
545
+ msgstr "نشان دادن "
546
+
547
+ #: .././pages/options.php:333
548
+ msgid ""
549
+ "This will display a checkbox just above the submit button on all comment "
550
+ "forms. If selected, any users leaving comments will also be added to the "
551
+ "mailing list."
552
+ msgstr ""
553
+ "این یک چک باکس درست بالای دکمه ارسال در تمام اشکال نظر نمایش داده شود. در "
554
+ "صورت انتخاب، هر کاربر می روم نظر نیز به لیست پستی اضافه شود."
555
+
556
+ #: .././pages/options.php:338
557
+ msgid "Custom Comment Checkbox Text"
558
+ msgstr "جعبه سفارشی نظر متن"
559
+
560
+ #: .././pages/options.php:345
561
+ msgid "Default List"
562
+ msgstr "فهرست پیش فرض"
563
+
564
+ #: .././pages/options.php:360
565
+ msgid ""
566
+ "This is the default list users will be subscribed to when submitting a "
567
+ "comment."
568
+ msgstr ""
569
+ "این است که کاربران فهرست به طور پیش فرض خواهد شد به هنگام ارسال نظر مشترک."
570
+
571
+ #: .././pages/options.php:361
572
+ msgid ""
573
+ "It is best to select a form where only the email , first name and/or last "
574
+ "name are required or you may run into issues."
575
+ msgstr ""
576
+ "بهتر است برای انتخاب یک فرم که در آن تنها ایمیل، نام و / یا نام خانوادگی "
577
+ "مورد نیاز است یا ممکن است شما به مسائل اجرا شود."
578
+
579
+ #: .././pages/options.php:373
580
+ msgid "Plugin Information"
581
+ msgstr "اطلاعات پلاگین"
582
+
583
+ #: .././pages/options.php:376
584
+ msgid "If you experience any issues with our plugin, please"
585
+ msgstr "اگر شما تجربه هر گونه مسائل با پلاگین ما، لطفا"
586
+
587
+ #: .././pages/options.php:376
588
+ msgid "submit a New Issue on our Github Issue Tracker"
589
+ msgstr "ارسال یک موضوع جدید در Github شماره ما آمار"
590
+
591
+ #: .././pages/options.php:376
592
+ msgid ""
593
+ "Please include the information below to help us troubleshoot your problem."
594
+ msgstr "لطفا اطلاعات زیر را برای کمک به ما مشکل شما رفع شود."
595
+
596
+ #: .././pages/options.php:384
597
+ msgid "Plugin Version"
598
+ msgstr "نسخه پلاگین"
599
+
600
+ #: .././pages/options.php:388
601
+ msgid "Wordpress Version"
602
+ msgstr "نسخه وردپرس"
603
+
604
+ #: .././pages/options.php:392
605
+ msgid "Browser Information"
606
+ msgstr "اطلاعات مرورگر"
607
+
608
+ #: .././pages/options.php:420
609
+ msgid "Error"
610
+ msgstr "خطا"
611
+
612
+ #: .././pages/options.php:421
613
+ msgid ""
614
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
615
+ "cURL to send and retreive data."
616
+ msgstr ""
617
+ "با عرض پوزش، اما حلقه بر روی سرور شما فعال نیست. API MailChimp با بهره گیری "
618
+ "از حلقه برای ارسال و retreive داده است."
619
+
620
+ #: .././pages/options.php:426
621
+ msgid "Help!"
622
+ msgstr "کمک!"
623
+
624
+ #: .././pages/options.php:426
625
+ msgid "What is cURL?"
626
+ msgstr "حلقه چیست؟"
627
+
628
+ #: .././pages/options.php:426
629
+ msgid "Check phpinfo()"
630
+ msgstr "بررسی کنید phpinfo ()"
631
+
632
+ #: .././pages/options.php:428
633
+ msgid "Steps To Resolve The Issue"
634
+ msgstr "گام برای رسیدن به حل و فصل موضوع"
635
+
636
+ #: .././pages/options.php:430
637
+ msgid ""
638
+ "You can enable cURL by turning on the cURL module within your php.ini file"
639
+ msgstr ""
640
+ "شما می توانید حلقه با روشن کردن ماژول حلقه در فایل php.ini خود را فعال کنید"
641
+
642
+ #: .././pages/options.php:430
643
+ msgid "You should find the php.ini file located here : "
644
+ msgstr "شما باید در فایل php.ini، قرار دارد در اینجا پیدا کنید: "
645
+
646
+ #: .././pages/options.php:431
647
+ msgid ""
648
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
649
+ msgstr ""
650
+ "هنگامی که در بر داشت، باز کردن فایل php.ini اجرا شده و قرار دادن خط \"؛ فرمت "
651
+ "= php_curl.dll\"."
652
+
653
+ #: .././pages/options.php:432
654
+ msgid ""
655
+ "Remove the semi colon before the line, to un-comment it and make the module "
656
+ "active."
657
+ msgstr ""
658
+ "حذف روده بزرگ نیمه قبل از خط، به سازمان ملل متحد اظهار نظر و ماژول فعال است."
659
+
660
+ #: .././pages/options.php:433
661
+ msgid "Re-save and close the file."
662
+ msgstr "دوباره ذخیره و بستن پرونده."
663
+
664
+ #: .././pages/options.php:434
665
+ msgid "Re-load this page."
666
+ msgstr "دوباره بارگذاری این صفحه."
667
+
668
+ #: .././templates/shortcode_error.php:1
669
+ msgid "There was an error calling the mailchimp list."
670
+ msgstr "یک خطا در فراخوانی لیست mailchimp وجود دارد."
671
+
672
+ #: .././templates/shortcode_error_data.php:1
673
+ msgid ""
674
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
675
+ "List Forms\" page."
676
+ msgstr ""
677
+ "لیست وجود ندارد! اطمینان حاصل کنید که شما را در لیست بر روی وارد شده اند "
678
+ "\"مدیریت فهرست فرم\" صفحه."
679
+
680
+ #: .././templates/shortcode_error_exists.php:1
681
+ msgid "This list was already placed on this page!"
682
+ msgstr "این لیست در حال حاضر در این صفحه قرار داده شد!"
683
+
684
+ #: .././templates/shortcode_error_no_API_key.php:1
685
+ msgid "Woops! No Valid API Key Found. Double check your settings."
686
+ msgstr "Woops! بدون کلید API معتبری یافت نشد. دو تنظیمات خود را چک کنید."
687
+
688
+ #: .././templates/shortcode_form.php:11
689
+ msgid "Oops.. Don't forget to fill-in the following fields"
690
+ msgstr "اوه .. فراموش نکنید که برای پر کردن در زمینه های زیر"
691
+
692
+ #: .././templates/shortcode_form.php:74
693
+ msgid "required field"
694
+ msgstr "زمینه مورد نیاز"
695
+
696
+ #: .././templates/yikes-mailchimp-widget.php:15
697
+ #: .././templates/yikes-mailchimp-widget.php:18
698
+ msgid "MailChimp Signup Form"
699
+ msgstr "MailChimp فرم ثبت نام"
700
+
701
+ #: .././templates/yikes-mailchimp-widget.php:27
702
+ msgid "Select Which Form You Would Like To Display:"
703
+ msgstr "را انتخاب کنید که فرم شما می خواهم نمایش:"
704
+
705
+ #: .././templates/yikes-mailchimp-widget.php:30
706
+ msgid "Select a Form to Display"
707
+ msgstr "انتخاب فرم به نمایش"
708
+
709
+ #: .././templates/yikes-mailchimp-widget.php:47
710
+ msgid "Please import MailChimp forms"
711
+ msgstr "لطفا فرم MailChimp واردات"
712
+
713
+ #: .././templates/yikes-mailchimp-widget.php:49
714
+ msgid "Please import some lists from MailChimp"
715
+ msgstr "لطفا لیست برخی از MailChimp واردات"
716
+
717
+ #: .././templates/yikes-mailchimp-widget.php:52
718
+ msgid "Import Lists Now"
719
+ msgstr "لیست واردات در حال حاضر"
720
+
721
+ #: .././templates/yikes-mailchimp-widget.php:73
722
+ msgid ""
723
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
724
+ "least one list to use the Easy MailChimp widget."
725
+ msgstr ""
726
+ "اوه! به نظر میرسد شما هر لیست وارد نشده است. شما باید حداقل یک لیست واردات "
727
+ "به استفاده از ویجت آسان MailChimp."
728
+
729
+ #: .././templates/yikes-mailchimp-widget.php:80
730
+ msgid ""
731
+ "Oops! It looks like you forgot to select a form to display here. Go to "
732
+ "'Appearance > Widgets' and select a form to display."
733
+ msgstr ""
734
+ "اوه! به نظر می رسد شما را فراموش کرده به انتخاب یک شکل به نمایش در اینجا. "
735
+ "برو به ظاهر> ابزارک و یک فرم برای نمایش انتخاب کنید."
736
+
737
+ #: .././templates/yikes-mailchimp-widget.php:117
738
+ msgid "Sign Up For Our Newsletter"
739
+ msgstr "ثبت نام برای خبرنامه ما"
740
+
741
+ #: .././templates/yikes-mailchimp-widget.php:129
742
+ msgid "Sign Me Up"
743
+ msgstr "ثبت نام من به"
744
+
745
+ #: .././templates/yikes-mailchimp-widget.php:133
746
+ msgid "Title:"
747
+ msgstr "عنوان:"
748
+
749
+ #: .././templates/yikes-mailchimp-widget.php:138
750
+ msgid "Form Text:"
751
+ msgstr "فرم اصلی:"
752
+
753
+ #: .././templates/yikes-mailchimp-widget.php:146
754
+ msgid "Submit Button Text:"
755
+ msgstr "ثبت کردن دکمه اصلی:"
756
+
757
+ #: .././templates/yikes-mailchimp-widget.php:156
758
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
759
+ msgstr "اوه! به نظر میرسد شما کلید API خود را به آن اضافه نشده است! سر را به"
760
+
761
+ #: .././templates/yikes-mailchimp-widget.php:156
762
+ msgid "Settings page"
763
+ msgstr "صفحه تنظیمات"
764
+
765
+ #~ msgid "No API Key or List Id Exist!"
766
+ #~ msgstr "بدون کلید API و یا فهرست کد وجود دارد!"
languages/yikes-inc-easy-mailchimp-extender-he_IL.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-he_IL.po ADDED
@@ -0,0 +1,750 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:31-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:50-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: he_IL\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "תודה שנרשם!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr "תודה שנרשם! בדוק את תיבת הדוא\"ל שלך להודעת האישור."
28
+
29
+ #: .././classes/class.yksemeBase.php:116
30
+ msgid "Select Your Area of Interest"
31
+ msgstr "בחר האזור שלך של ריבית"
32
+
33
+ #: .././classes/class.yksemeBase.php:917
34
+ msgid "Click on a subscriber to see further information"
35
+ msgstr "לחץ על מנוי כדי לראות מידע נוסף"
36
+
37
+ #: .././classes/class.yksemeBase.php:920
38
+ msgid "E-Mail"
39
+ msgstr "דואר אלקטרוני"
40
+
41
+ #: .././classes/class.yksemeBase.php:921
42
+ msgid "Date Subscribed"
43
+ msgstr "תאריך המבוקשים"
44
+
45
+ #: .././classes/class.yksemeBase.php:941
46
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
47
+ msgstr "מצטער שאתה לא נכון לעכשיו יש לך מנויים ברשימה זו!"
48
+
49
+ #: .././classes/class.yksemeBase.php:998
50
+ msgid "Back to Subscriber List"
51
+ msgstr "חזור לרשימת מנויים"
52
+
53
+ #: .././classes/class.yksemeBase.php:999
54
+ msgid "Subscriber Details"
55
+ msgstr "פרטי מנוי"
56
+
57
+ #: .././classes/class.yksemeBase.php:1010
58
+ msgid "Overview"
59
+ msgstr "סקירה"
60
+
61
+ #: .././classes/class.yksemeBase.php:1015
62
+ msgid "First Name"
63
+ msgstr "שם פרטים"
64
+
65
+ #: .././classes/class.yksemeBase.php:1018
66
+ msgid "Last Updated"
67
+ msgstr "עדכון האחרון"
68
+
69
+ #: .././classes/class.yksemeBase.php:1021
70
+ msgid "Preferred Email Type"
71
+ msgstr "סוג דוא\"ל מועדף"
72
+
73
+ #: .././classes/class.yksemeBase.php:1028
74
+ msgid "Last Name"
75
+ msgstr "שם משפחה"
76
+
77
+ #: .././classes/class.yksemeBase.php:1031
78
+ msgid "Language"
79
+ msgstr "שפה"
80
+
81
+ #: .././classes/class.yksemeBase.php:1054
82
+ msgid "Groups Subscribed To"
83
+ msgstr "קבוצות המנויים על"
84
+
85
+ #: .././classes/class.yksemeBase.php:1104
86
+ msgid "Subscriber Notes"
87
+ msgstr "הערות מנויים"
88
+
89
+ #: .././classes/class.yksemeBase.php:1109
90
+ msgid "Written by"
91
+ msgstr "נכתב על ידי"
92
+
93
+ #: .././classes/class.yksemeBase.php:1109
94
+ msgid "Created on"
95
+ msgstr "נוצר על"
96
+
97
+ #: .././classes/class.yksemeBase.php:1251
98
+ #: .././classes/class.yksemeBase.php:1253
99
+ msgid "MailChimp Forms"
100
+ msgstr "טפסי MailChimp"
101
+
102
+ #: .././classes/class.yksemeBase.php:1253
103
+ msgid "MailChimp Settings"
104
+ msgstr "הגדרות MailChimp"
105
+
106
+ #: .././classes/class.yksemeBase.php:1254
107
+ msgid "Manage List Forms"
108
+ msgstr "ניהול טפסי רשימה"
109
+
110
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
111
+ msgid "About YIKES, Inc."
112
+ msgstr "Yikes Inc. על"
113
+
114
+ #: .././classes/class.yksemeBase.php:1430
115
+ msgid "One or more fields are empty"
116
+ msgstr "אחד או יותר שדות ריקים"
117
+
118
+ #: .././classes/class.yksemeBase.php:1480
119
+ msgid "Your List Was Successfully Saved!"
120
+ msgstr "רשימה שלך נשמרה בהצלחה!"
121
+
122
+ #: .././classes/class.yksemeBase.php:1482
123
+ msgid "I'm sorry there was an error with your request."
124
+ msgstr "אני מצטער שיש שגיאה עם בקשתך."
125
+
126
+ #: .././classes/class.yksemeBase.php:1488
127
+ msgid "MailChimp List name"
128
+ msgstr "שם MailChimp רשימה"
129
+
130
+ #: .././classes/class.yksemeBase.php:1494
131
+ #: .././classes/class.yksemeBase.php:1504
132
+ #, php-format
133
+ msgid "%1$s"
134
+ msgstr ""
135
+
136
+ #: .././classes/class.yksemeBase.php:1512
137
+ msgid "MailChimp List ID"
138
+ msgstr "MailChimp רשימת זיהוי"
139
+
140
+ #: .././classes/class.yksemeBase.php:1518
141
+ msgid "Shortcode"
142
+ msgstr "קוד קצר"
143
+
144
+ #: .././classes/class.yksemeBase.php:1521
145
+ msgid ""
146
+ "Paste this shortcode into whatever page or post you want to add this form to"
147
+ msgstr "להדביק קוד קצר הזה לכל דף או לפרסם אתה רוצה להוסיף בטופס זה כדי"
148
+
149
+ #: .././classes/class.yksemeBase.php:1526
150
+ msgid "PHP Snippet"
151
+ msgstr "PHP קטע"
152
+
153
+ #: .././classes/class.yksemeBase.php:1529
154
+ msgid "Use this code to add this form to a template file"
155
+ msgstr "השתמש בקוד זה כדי להוסיף בטופס זה כדי קובץ תבנית"
156
+
157
+ #: .././classes/class.yksemeBase.php:1534
158
+ msgid "Number of Subscribers"
159
+ msgstr "מספר המנויים"
160
+
161
+ #: .././classes/class.yksemeBase.php:1543
162
+ msgid "Form Fields"
163
+ msgstr "שדות טופס"
164
+
165
+ #: .././classes/class.yksemeBase.php:1545
166
+ msgid ""
167
+ "Check the fields you want included in your form (Email Address is required)."
168
+ msgstr "בדוק את השדות שברצונך לכלול בטופס שלך (נדרשת כתובת דוא\"ל)."
169
+
170
+ #: .././classes/class.yksemeBase.php:1548
171
+ msgid ""
172
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
173
+ msgstr ""
174
+ "השתמש בחיצים הירוקים כדי לגרור ולשחרר את השדות ולארגן מחדש את הסדר שלהם."
175
+
176
+ #: .././classes/class.yksemeBase.php:1554
177
+ msgid "Active Fields"
178
+ msgstr "שדות פעילים"
179
+
180
+ #: .././classes/class.yksemeBase.php:1563
181
+ msgid "Drag"
182
+ msgstr "גרירה"
183
+
184
+ #: .././classes/class.yksemeBase.php:1563
185
+ msgid "drop"
186
+ msgstr "ירידה"
187
+
188
+ #: .././classes/class.yksemeBase.php:1568
189
+ msgid "Merge field"
190
+ msgstr "שדה מיזוג"
191
+
192
+ #: .././classes/class.yksemeBase.php:1569
193
+ msgid "Placeholder"
194
+ msgstr "מציין מיקום"
195
+
196
+ #: .././classes/class.yksemeBase.php:1577
197
+ msgid "Redirect User On Submission"
198
+ msgstr "להפנות את המשתמש בהגשה"
199
+
200
+ #: .././classes/class.yksemeBase.php:1581
201
+ msgid "choose a page to redirect the user to after they submit the form."
202
+ msgstr ""
203
+ "לבחור דף או להגדיר כתובת אתר מותאם אישית כדי לנתב מחדש את המשתמש לאחר ששלחו "
204
+ "את הטופס."
205
+
206
+ #: .././classes/class.yksemeBase.php:1584
207
+ msgid "Select A Post/Page"
208
+ msgstr "בחר פוסט / דף"
209
+
210
+ #: .././classes/class.yksemeBase.php:1638
211
+ msgid "Save Form Settings"
212
+ msgstr "ניהול הגדרות טפסי MailChimp"
213
+
214
+ #: .././classes/class.yksemeBase.php:1639
215
+ msgid "Delete Form"
216
+ msgstr "מחיקת טופס"
217
+
218
+ #: .././classes/class.yksemeBase.php:1640
219
+ msgid "Re-Import Form Fields from MailChimp"
220
+ msgstr "אנא לייבא כמה רשימות מMailChimp"
221
+
222
+ #: .././classes/class.yksemeBase.php:2168
223
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
224
+ msgstr "רשום אותי לדיוור של MailChimp-REPLACE זה-TEXT"
225
+
226
+ #: .././pages/about.php:27
227
+ msgid "YIKES, Inc. Web Design and Development"
228
+ msgstr "עיצוב ובניית אתרים Yikes, Inc."
229
+
230
+ #: .././pages/about.php:29
231
+ msgid "Smart, effective, beautifully designed web solutions"
232
+ msgstr "פתרונות חכמים, יעילים, מעוצבים להפליא אינטרנט"
233
+
234
+ #: .././pages/about.php:32
235
+ msgid ""
236
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
237
+ "custom WordPress themes and plugins every day."
238
+ msgstr ""
239
+ "Yikes, Inc. ממוקם בשכונת Fishtown של פילדלפיה שבו אנו בונים מותאמים אישית "
240
+ "ערכות נושא ותוספים וורדפרס בכל יום."
241
+
242
+ #: .././pages/about.php:36
243
+ msgid ""
244
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
245
+ "WordCamps"
246
+ msgstr ""
247
+ "ב Yikes Inc. שאנחנו אוהבים וורדפרס! בעלים משותפים, טרייסי ווסק הציג "
248
+ "בWordCamps"
249
+
250
+ #: .././pages/about.php:36
251
+ msgid "and"
252
+ msgstr "וגם"
253
+
254
+ #: .././pages/about.php:36
255
+ msgid "She also teaches WordPress classes for"
256
+ msgstr "היא גם מלמדת שיעורי WordPress עבור"
257
+
258
+ #: .././pages/about.php:40
259
+ msgid ""
260
+ "In addition to making great WordPress sites we are also committed to the "
261
+ "sustainable business movement. We observe the triple bottom line: people, "
262
+ "planet, profit and work to help build a more socially, environmentally and "
263
+ "financially sustainable local economy. We even have a"
264
+ msgstr ""
265
+ "בנוסף לביצוע אתרים וורדפרס גדולים אנחנו גם מחויבים לתנועה העסקית בר קיימא. "
266
+ "אנו רואים את השורה התחתונה המשולשת: אנשים, כדור הארץ, רווח ולעבוד כדי לסייע "
267
+ "בבניית כלכלה מקומית ברת קיימא יותר מבחינה חברתית, סביבתית וכלכלית. יש לנו "
268
+ "אפילו"
269
+
270
+ #: .././pages/about.php:40
271
+ msgid "LEED Platinum office"
272
+ msgstr "משרד LEED פלטינום"
273
+
274
+ #: .././pages/about.php:44
275
+ msgid ""
276
+ "If you're interested in hiring us for WordPress development, or just want to "
277
+ "learn more about us, please visit"
278
+ msgstr ""
279
+ "אם אתה מעוניין בהעסקתנו לפיתוח וורדפרס, או רק רוצה ללמוד יותר על קשר, אנא בקר"
280
+
281
+ #: .././pages/lists.php:8
282
+ msgid "No forms have been added yet."
283
+ msgstr "אין צורות נוספו עדיין."
284
+
285
+ #: .././pages/lists.php:39
286
+ msgid "Oops.. The list ID you entered appears to be incorrect."
287
+ msgstr "אופס .. מופיע מזהה הרשימה שהזנת שגוי."
288
+
289
+ #: .././pages/lists.php:44
290
+ msgid "There was an error!"
291
+ msgstr "הייתה שגיאה!"
292
+
293
+ #: .././pages/lists.php:135
294
+ msgid "You need to select a Mailchimp list in order to create a form for it"
295
+ msgstr "אתה צריך לבחור רשימת MailChimp כדי ליצור טופס עבורו"
296
+
297
+ #: .././pages/lists.php:173
298
+ msgid "Are you sure you want to delete this form?"
299
+ msgstr "האם אתה בטוח שברצונך למחוק את הטופס הזה"
300
+
301
+ #: .././pages/lists.php:206
302
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
303
+ msgstr "האם אתה בטוח שאתה רוצה לייבא מחדש את השדות מMailChimp?"
304
+
305
+ #: .././pages/lists.php:228
306
+ msgid "Looks like this form is already up to date!"
307
+ msgstr "נראה כמו טופס זה כבר מעודכן!"
308
+
309
+ #: .././pages/lists.php:326
310
+ msgid "Are you sure you want to unsubscribe"
311
+ msgstr "האם אתה בטוח שאתה רוצה לבטל את המנוי"
312
+
313
+ #: .././pages/lists.php:326
314
+ msgid "from this list?"
315
+ msgstr "מרשימה זו?"
316
+
317
+ #: .././pages/lists.php:342
318
+ msgid "was successfully unsubscribed from this list."
319
+ msgstr "היה הוסר בהצלחה מרשימה זו."
320
+
321
+ #: .././pages/lists.php:448 .././pages/options.php:196
322
+ #: .././pages/options.php:416
323
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
324
+ msgstr "טפסים קלים MailChimp ידי Yikes, Inc"
325
+
326
+ #: .././pages/lists.php:454
327
+ msgid "Before you can add MailChimp forms to your site, you need to"
328
+ msgstr "לפני שתוכל להוסיף צורות MailChimp לאתר שלך, אתה צריך"
329
+
330
+ #: .././pages/lists.php:454
331
+ msgid "go to the MailChimp Settings page"
332
+ msgstr "לעבור לדף הגדרות MailChimp"
333
+
334
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
335
+ msgid "and add your API Key."
336
+ msgstr "ולהוסיף מפתח API שלך."
337
+
338
+ #: .././pages/lists.php:462
339
+ msgid "You must enter a valid API key to import and manage your lists."
340
+ msgstr "עליך להזין מפתח API חוקי לייבא ולנהל את הרשימות שלך."
341
+
342
+ #: .././pages/lists.php:473
343
+ msgid "Your Lists"
344
+ msgstr "הרשימות שלך"
345
+
346
+ #: .././pages/lists.php:483
347
+ msgid "Manage Forms"
348
+ msgstr "ניהול טפסים"
349
+
350
+ #: .././pages/options.php:41
351
+ msgid "The options were saved successfully!"
352
+ msgstr "האפשרויות היו נשמרו בהצלחה!"
353
+
354
+ #: .././pages/options.php:44
355
+ msgid "The options could not be saved (or you did not change them)."
356
+ msgstr "האפשרויות לא היו אפשרות לשמור (או שלא לשנות אותם)."
357
+
358
+ #: .././pages/options.php:96
359
+ msgid "Valid API Key"
360
+ msgstr "מפתח API תקף"
361
+
362
+ #: .././pages/options.php:102
363
+ msgid "Sorry, that is an invalid MailChimp API key."
364
+ msgstr "סליחה, זה הוא מפתח API MailChimp לא חוקי."
365
+
366
+ #: .././pages/options.php:108
367
+ msgid ""
368
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
369
+ "further information."
370
+ msgstr ""
371
+ "סליחה, זה הוא מפתח API MailChimp לא חוקי. אנא בדוק את הקונסולה לקבלת מידע "
372
+ "נוספת."
373
+
374
+ #: .././pages/options.php:117
375
+ msgid "Error: Please enter a valid Mail Chimp API Key."
376
+ msgstr "שגיאה: אנא הכנס דואר השימפנזה API מפתח חוקי."
377
+
378
+ #: .././pages/options.php:199
379
+ msgid "Manage Mailchimp Forms Settings"
380
+ msgstr "ניהול הגדרות טפסי MailChimp"
381
+
382
+ #: .././pages/options.php:205
383
+ msgid "WordPress Version Number Error"
384
+ msgstr "גרסת Wordpress"
385
+
386
+ #: .././pages/options.php:206
387
+ msgid ""
388
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
389
+ "You won't be able to access the tinyMCE button to insert forms into pages "
390
+ "and posts unless you update to 3.9 or later."
391
+ msgstr ""
392
+ "אנו מצטערים, אבל זה נראה כמוך משתמש בגרסה מיושנת של וורדפרס. אתה לא יהיה "
393
+ "מסוגל לגשת לכפתור TinyMCE להכניס צורות לתוך דפים והודעות אלא אם תעדכן ל3.9 "
394
+ "או במאוחר."
395
+
396
+ #: .././pages/options.php:215
397
+ msgid "LocalHost Detected :"
398
+ msgstr "LocalHost זוהה:"
399
+
400
+ #: .././pages/options.php:216
401
+ msgid ""
402
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
403
+ msgstr "טפסים קלים MailChimp ידי Yikes, Inc"
404
+
405
+ #: .././pages/options.php:217
406
+ msgid ""
407
+ "If you are unable to validate your API key, and receive the error message"
408
+ msgstr "אם אתה לא מצליח לאמת את מפתח ה-API, ומתקבל הודעת השגיאה"
409
+
410
+ #: .././pages/options.php:217
411
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
412
+ msgstr "\"בעיה תעודת SSL: לא מצליח לקבל תעודת מנפיק מקומי\" "
413
+
414
+ #: .././pages/options.php:217
415
+ msgid "follow the tutorial located "
416
+ msgstr "בצע את ההדרכה ממוקמת "
417
+
418
+ #: .././pages/options.php:230
419
+ msgid "Your Mailchimp API Key"
420
+ msgstr "MailChimp API המפתח שלך"
421
+
422
+ #: .././pages/options.php:238
423
+ msgid ""
424
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
425
+ "site to communicate with your MailChimp account."
426
+ msgstr ""
427
+ "נא להזין מפתח API MailChimp שלך לעיל. API מפתח מאפשר האתר שלך WordPress כדי "
428
+ "לתקשר עם חשבון MailChimp שלך."
429
+
430
+ #: .././pages/options.php:239
431
+ msgid "For more help, visit the MailChimp Support article"
432
+ msgstr "לקבלת עזרה נוספת, בקר במאמר MailChimp התמיכה"
433
+
434
+ #: .././pages/options.php:239
435
+ msgid "Where can I find my API Key?"
436
+ msgstr "איפה אני יכול למצוא את מפתח ה-API שלי?"
437
+
438
+ #: .././pages/options.php:244
439
+ msgid "Preferred Form Layout"
440
+ msgstr "מועדפת טופס פריסה"
441
+
442
+ #: .././pages/options.php:247
443
+ msgid "table"
444
+ msgstr "שולחן"
445
+
446
+ #: .././pages/options.php:248
447
+ msgid "div"
448
+ msgstr "div"
449
+
450
+ #: .././pages/options.php:256
451
+ msgid "Choose whether you want your forms to use a table or div layout."
452
+ msgstr "לבחור אם אתה רוצה את הטפסים שלך כדי להשתמש בטבלה או פריסת div."
453
+
454
+ #: .././pages/options.php:261
455
+ msgid "Advanced Error Messaging"
456
+ msgstr "שגיאה מתקדמות מסרים"
457
+
458
+ #: .././pages/options.php:264
459
+ msgid "Disabled"
460
+ msgstr "מנוטרל"
461
+
462
+ #: .././pages/options.php:265
463
+ msgid "Enabled"
464
+ msgstr "מאופשר"
465
+
466
+ #: .././pages/options.php:273
467
+ msgid ""
468
+ "Enable if you're having problems with your forms sending data to MailChimp. "
469
+ "Enabling Advanced Error Messaging will show you the exact error codes "
470
+ "MailChimp is returning."
471
+ msgstr ""
472
+ "אפשר אם אתה נתקלת בבעיות עם הטפסים שלך שליחת נתונים לMailChimp. מה שמאפשר "
473
+ "העברת הודעות שגיאה מתקדמות יראה לכם את קודי שגיאה המדויקים MailChimp חוזר."
474
+
475
+ #: .././pages/options.php:281
476
+ msgid "Single Opt-In"
477
+ msgstr "אחת Opt-In"
478
+
479
+ #: .././pages/options.php:282
480
+ msgid "Double Opt-In"
481
+ msgstr "Double opt-in"
482
+
483
+ #: .././pages/options.php:290
484
+ msgid ""
485
+ "A single opt-in will add the user to your list without any further "
486
+ "interaction."
487
+ msgstr "Opt-in יחיד יהיה להוסיף את המשתמש לרשימה שלך, ללא כל אינטראקציה נוספת."
488
+
489
+ #: .././pages/options.php:291
490
+ msgid ""
491
+ "A double opt-in will send an email to the user asking them to confirm their "
492
+ "subscription."
493
+ msgstr ""
494
+ "Opt-in כפול יהיה לשלוח דואר אלקטרוני למשתמש ומבקש מהם לאשר את המנוי שלהם."
495
+
496
+ #: .././pages/options.php:292
497
+ msgid "This will also dictate the opt-in settings for people leaving comments."
498
+ msgstr "זה גם יכתיב את הגדרות opt-in לאנשי השארת תגובות."
499
+
500
+ #: .././pages/options.php:297
501
+ msgid "Custom Opt-In Message"
502
+ msgstr "הודעה מותאמת אישית Opt-in"
503
+
504
+ #: .././pages/options.php:299
505
+ msgid "Double Opt-In Message"
506
+ msgstr "מסר כפול opt-in"
507
+
508
+ #: .././pages/options.php:301
509
+ msgid "Single Opt-In Message"
510
+ msgstr "מסר opt-in יחיד"
511
+
512
+ #: .././pages/options.php:307
513
+ msgid "Interest Group Label"
514
+ msgstr "לייבל קבוצת העניין"
515
+
516
+ #: .././pages/options.php:316
517
+ msgid ""
518
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
519
+ "group names."
520
+ msgstr ""
521
+ "טקסט שיוצג מעל קבוצות אינטרס. שאר ריק כדי להשתמש בשמות קבוצת אינטרס "
522
+ "MailChimp."
523
+
524
+ #: .././pages/options.php:321
525
+ msgid "Display opt-in checkbox on comment forms?"
526
+ msgstr "opt-in תיבת תצוגה בצורות תגובה?"
527
+
528
+ #: .././pages/options.php:324
529
+ msgid "Hide"
530
+ msgstr "הסתר"
531
+
532
+ #: .././pages/options.php:325
533
+ msgid "Show"
534
+ msgstr "הצג"
535
+
536
+ #: .././pages/options.php:333
537
+ msgid ""
538
+ "This will display a checkbox just above the submit button on all comment "
539
+ "forms. If selected, any users leaving comments will also be added to the "
540
+ "mailing list."
541
+ msgstr ""
542
+ "פעולה זו תציג תיבה בדיוק מעל כפתור שליחה בכל צורות התגובה. אם נבחר, משתמשים "
543
+ "כל השארת תגובות יתווספו גם לרשימת התפוצה."
544
+
545
+ #: .././pages/options.php:338
546
+ msgid "Custom Comment Checkbox Text"
547
+ msgstr "טקסט תיבת סימון להערה מותאמת אישית"
548
+
549
+ #: .././pages/options.php:345
550
+ msgid "Default List"
551
+ msgstr "רשימת ברירת מחדל"
552
+
553
+ #: .././pages/options.php:360
554
+ msgid ""
555
+ "This is the default list users will be subscribed to when submitting a "
556
+ "comment."
557
+ msgstr "זוהי רשימת משתמשי ברירת המחדל יהיו מנויים בעת הגשת תגובה."
558
+
559
+ #: .././pages/options.php:361
560
+ msgid ""
561
+ "It is best to select a form where only the email , first name and/or last "
562
+ "name are required or you may run into issues."
563
+ msgstr ""
564
+ "עדיף לבחור צורה שבה רק בדוא\"ל, שם פרטיים ו או שם המשפחה נדרשים או שאתה יכול "
565
+ "להיתקל בבעיות."
566
+
567
+ #: .././pages/options.php:373
568
+ msgid "Plugin Information"
569
+ msgstr "מידע Plugin"
570
+
571
+ #: .././pages/options.php:376
572
+ msgid "If you experience any issues with our plugin, please"
573
+ msgstr "אם אתם נתקלים בבעיות עם התוסף שלנו, אנא"
574
+
575
+ #: .././pages/options.php:376
576
+ msgid "submit a New Issue on our Github Issue Tracker"
577
+ msgstr "להגיש גיליון חדש בTracker גיליון Github"
578
+
579
+ #: .././pages/options.php:376
580
+ msgid ""
581
+ "Please include the information below to help us troubleshoot your problem."
582
+ msgstr "אנא כלול את המידע שלהלן כדי לעזור לנו לפתור את הבעיה שלך."
583
+
584
+ #: .././pages/options.php:384
585
+ msgid "Plugin Version"
586
+ msgstr "גרסת תוסף"
587
+
588
+ #: .././pages/options.php:388
589
+ msgid "Wordpress Version"
590
+ msgstr "גרסת Wordpress"
591
+
592
+ #: .././pages/options.php:392
593
+ msgid "Browser Information"
594
+ msgstr "מידע דפדפן"
595
+
596
+ #: .././pages/options.php:420
597
+ msgid "Error"
598
+ msgstr "שגיאה"
599
+
600
+ #: .././pages/options.php:421
601
+ msgid ""
602
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
603
+ "cURL to send and retreive data."
604
+ msgstr ""
605
+ "אנו מצטערים, אבל הסלסול הוא זמין בשרת שלך. API MailChimp מנצל cURL לשלוח "
606
+ "ולאחזר את הנתונים."
607
+
608
+ #: .././pages/options.php:426
609
+ msgid "Help!"
610
+ msgstr "הצילו!"
611
+
612
+ #: .././pages/options.php:426
613
+ msgid "What is cURL?"
614
+ msgstr "מהו cURL?"
615
+
616
+ #: .././pages/options.php:426
617
+ msgid "Check phpinfo()"
618
+ msgstr "בדוק phpinfo ()"
619
+
620
+ #: .././pages/options.php:428
621
+ msgid "Steps To Resolve The Issue"
622
+ msgstr "צעדים כדי לפתור את הבעיה"
623
+
624
+ #: .././pages/options.php:430
625
+ msgid ""
626
+ "You can enable cURL by turning on the cURL module within your php.ini file"
627
+ msgstr "אתה יכול לאפשר cURL ידי הפעלת המודול cURL בתוך קובץ php.ini שלך"
628
+
629
+ #: .././pages/options.php:430
630
+ msgid "You should find the php.ini file located here : "
631
+ msgstr "אתה צריך למצוא את קובץ php.ini נמצא כאן: "
632
+
633
+ #: .././pages/options.php:431
634
+ msgid ""
635
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
636
+ msgstr ""
637
+ "מצא פעם אחת, לפתוח את php.ini ולאתר את השורה \"; סיומת = php_curl.dll\"."
638
+
639
+ #: .././pages/options.php:432
640
+ msgid ""
641
+ "Remove the semi colon before the line, to un-comment it and make the module "
642
+ "active."
643
+ msgstr ""
644
+ "הסר את המעי הגס למחצה לפני הקו, כדי לבטל את התגובה ולהפוך את המודול פעיל."
645
+
646
+ #: .././pages/options.php:433
647
+ msgid "Re-save and close the file."
648
+ msgstr "מחדש לשמור ולסגור את התיק."
649
+
650
+ #: .././pages/options.php:434
651
+ msgid "Re-load this page."
652
+ msgstr "טעה מחדש של עמוד זה."
653
+
654
+ #: .././templates/shortcode_error.php:1
655
+ msgid "There was an error calling the mailchimp list."
656
+ msgstr "הייתה שגיאה בקריאה לרשימת MailChimp."
657
+
658
+ #: .././templates/shortcode_error_data.php:1
659
+ msgid ""
660
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
661
+ "List Forms\" page."
662
+ msgstr "הרשימה לא קיימת! ודא שייבאת הרשימה ב \"ניהול טפסי רשימת\" דף."
663
+
664
+ #: .././templates/shortcode_error_exists.php:1
665
+ msgid "This list was already placed on this page!"
666
+ msgstr "רשימה זו כבר הונחה על דף זה!"
667
+
668
+ #: .././templates/shortcode_error_no_API_key.php:1
669
+ msgid "Woops! No Valid API Key Found. Double check your settings."
670
+ msgstr "Woops! אין מפתח API תקף נמצא. בדוק את ההגדרות שלך."
671
+
672
+ #: .././templates/shortcode_form.php:11
673
+ msgid "Oops.. Don't forget to fill-in the following fields"
674
+ msgstr "אופס .. אל תשכח למלא את השדות הבאים"
675
+
676
+ #: .././templates/shortcode_form.php:74
677
+ msgid "required field"
678
+ msgstr "שדה נדרש"
679
+
680
+ #: .././templates/yikes-mailchimp-widget.php:15
681
+ #: .././templates/yikes-mailchimp-widget.php:18
682
+ msgid "MailChimp Signup Form"
683
+ msgstr "טופס הרשמה MailChimp"
684
+
685
+ #: .././templates/yikes-mailchimp-widget.php:27
686
+ msgid "Select Which Form You Would Like To Display:"
687
+ msgstr "בחר באיזה צורה שאתה רוצה להציג:"
688
+
689
+ #: .././templates/yikes-mailchimp-widget.php:30
690
+ msgid "Select a Form to Display"
691
+ msgstr "בחר טופס להצגה"
692
+
693
+ #: .././templates/yikes-mailchimp-widget.php:47
694
+ msgid "Please import MailChimp forms"
695
+ msgstr "אנא לייבא צורות MailChimp"
696
+
697
+ #: .././templates/yikes-mailchimp-widget.php:49
698
+ msgid "Please import some lists from MailChimp"
699
+ msgstr "אנא לייבא כמה רשימות מMailChimp"
700
+
701
+ #: .././templates/yikes-mailchimp-widget.php:52
702
+ msgid "Import Lists Now"
703
+ msgstr "רשימות יבוא עכשיו"
704
+
705
+ #: .././templates/yikes-mailchimp-widget.php:73
706
+ msgid ""
707
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
708
+ "least one list to use the Easy MailChimp widget."
709
+ msgstr ""
710
+ "אופס! זה נראה כאילו אתה לא מיובא כל רשימות עדיין. עליך לייבא את הרשימה לפחות "
711
+ "אחד להשתמש ביישומון קל MailChimp."
712
+
713
+ #: .././templates/yikes-mailchimp-widget.php:80
714
+ msgid ""
715
+ "Oops! It looks like you forgot to select a form to display here. Go to "
716
+ "'Appearance > Widgets' and select a form to display."
717
+ msgstr ""
718
+ "אופס! זה נראה כאילו ששכחת לבחור צורה להציג כאן. עבור אל 'מראה> יישומונים' "
719
+ "ובחר צורה לתצוגה."
720
+
721
+ #: .././templates/yikes-mailchimp-widget.php:117
722
+ msgid "Sign Up For Our Newsletter"
723
+ msgstr "הירשם לניוזלטר שלנו"
724
+
725
+ #: .././templates/yikes-mailchimp-widget.php:129
726
+ msgid "Sign Me Up"
727
+ msgstr "רשום אותי"
728
+
729
+ #: .././templates/yikes-mailchimp-widget.php:133
730
+ msgid "Title:"
731
+ msgstr "נושא:"
732
+
733
+ #: .././templates/yikes-mailchimp-widget.php:138
734
+ msgid "Form Text:"
735
+ msgstr "טקסט טופס:"
736
+
737
+ #: .././templates/yikes-mailchimp-widget.php:146
738
+ msgid "Submit Button Text:"
739
+ msgstr "שלח טקסט לחצן:"
740
+
741
+ #: .././templates/yikes-mailchimp-widget.php:156
742
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
743
+ msgstr "אופס! זה נראה כאילו שיש לך לא הוסיף מפתח API שלך! מעל הראש"
744
+
745
+ #: .././templates/yikes-mailchimp-widget.php:156
746
+ msgid "Settings page"
747
+ msgstr "דף הגדרות"
748
+
749
+ #~ msgid "No API Key or List Id Exist!"
750
+ #~ msgstr "אין מפתח API או קוד זיהוי רשימה קיים!"
languages/yikes-inc-easy-mailchimp-extender-hi_IN.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-hi_IN.po ADDED
@@ -0,0 +1,757 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:34-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:50-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: hi_IN\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "सदस्यता लेने के लिए धन्यवाद!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr "सदस्यता लेने के लिए धन्यवाद! पुष्टिकरण संदेश के लिए अपने ईमेल की जाँच करें."
28
+
29
+ #: .././classes/class.yksemeBase.php:116
30
+ msgid "Select Your Area of Interest"
31
+ msgstr "ब्याज की अपने क्षेत्र का चयन करें"
32
+
33
+ #: .././classes/class.yksemeBase.php:917
34
+ msgid "Click on a subscriber to see further information"
35
+ msgstr "अधिक जानकारी के लिए देखने के लिए एक ग्राहक पर क्लिक करें"
36
+
37
+ #: .././classes/class.yksemeBase.php:920
38
+ msgid "E-Mail"
39
+ msgstr "ई-मेल "
40
+
41
+ #: .././classes/class.yksemeBase.php:921
42
+ msgid "Date Subscribed"
43
+ msgstr "तिथि सब्सक्राइब्ड"
44
+
45
+ #: .././classes/class.yksemeBase.php:941
46
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
47
+ msgstr "खेद है कि आपको इस समय इस सूची में किसी भी सदस्य नहीं है!"
48
+
49
+ #: .././classes/class.yksemeBase.php:998
50
+ msgid "Back to Subscriber List"
51
+ msgstr "वापस ग्राहकों की सूची परग्राहकों की संख्या"
52
+
53
+ #: .././classes/class.yksemeBase.php:999
54
+ msgid "Subscriber Details"
55
+ msgstr "सब्सक्राइबर विवरण"
56
+
57
+ #: .././classes/class.yksemeBase.php:1010
58
+ msgid "Overview"
59
+ msgstr "अवलोकन"
60
+
61
+ #: .././classes/class.yksemeBase.php:1015
62
+ msgid "First Name"
63
+ msgstr "प्रथम नाम"
64
+
65
+ #: .././classes/class.yksemeBase.php:1018
66
+ msgid "Last Updated"
67
+ msgstr "अंतिम अद्यतन"
68
+
69
+ #: .././classes/class.yksemeBase.php:1021
70
+ msgid "Preferred Email Type"
71
+ msgstr "पसंदीदा ईमेल के प्रकारपसंदीदा फार्म लेआउट"
72
+
73
+ #: .././classes/class.yksemeBase.php:1028
74
+ msgid "Last Name"
75
+ msgstr "अंतिम नाम"
76
+
77
+ #: .././classes/class.yksemeBase.php:1031
78
+ msgid "Language"
79
+ msgstr "भाषा"
80
+
81
+ #: .././classes/class.yksemeBase.php:1054
82
+ msgid "Groups Subscribed To"
83
+ msgstr "करने के लिए सदस्यता समूहतिथि सब्सक्राइब्ड"
84
+
85
+ #: .././classes/class.yksemeBase.php:1104
86
+ msgid "Subscriber Notes"
87
+ msgstr "सब्सक्राइबर नोट्स"
88
+
89
+ #: .././classes/class.yksemeBase.php:1109
90
+ msgid "Written by"
91
+ msgstr "द्वारा लिखित"
92
+
93
+ #: .././classes/class.yksemeBase.php:1109
94
+ msgid "Created on"
95
+ msgstr "बनाया गया"
96
+
97
+ #: .././classes/class.yksemeBase.php:1251
98
+ #: .././classes/class.yksemeBase.php:1253
99
+ msgid "MailChimp Forms"
100
+ msgstr "MailChimp फॉर्म्स"
101
+
102
+ #: .././classes/class.yksemeBase.php:1253
103
+ msgid "MailChimp Settings"
104
+ msgstr "MailChimp सेटिंग्स"
105
+
106
+ #: .././classes/class.yksemeBase.php:1254
107
+ msgid "Manage List Forms"
108
+ msgstr "सूची प्रपत्र प्रबंधन"
109
+
110
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
111
+ msgid "About YIKES, Inc."
112
+ msgstr "YIKES, Inc के बारे में"
113
+
114
+ #: .././classes/class.yksemeBase.php:1430
115
+ msgid "One or more fields are empty"
116
+ msgstr "एक या अधिक फ़ील्ड्स खाली हैं"
117
+
118
+ #: .././classes/class.yksemeBase.php:1480
119
+ msgid "Your List Was Successfully Saved!"
120
+ msgstr "आपकी सूची सफलतापूर्वक बचा लिया गया था!"
121
+
122
+ #: .././classes/class.yksemeBase.php:1482
123
+ msgid "I'm sorry there was an error with your request."
124
+ msgstr "मुझे खेद है आपके अनुरोध के साथ एक त्रुटि हुई हूँ."
125
+
126
+ #: .././classes/class.yksemeBase.php:1488
127
+ msgid "MailChimp List name"
128
+ msgstr "MailChimp सूची का नाम"
129
+
130
+ #: .././classes/class.yksemeBase.php:1494
131
+ #: .././classes/class.yksemeBase.php:1504
132
+ #, php-format
133
+ msgid "%1$s"
134
+ msgstr ""
135
+
136
+ #: .././classes/class.yksemeBase.php:1512
137
+ msgid "MailChimp List ID"
138
+ msgstr "MailChimp सूची आईडी"
139
+
140
+ #: .././classes/class.yksemeBase.php:1518
141
+ msgid "Shortcode"
142
+ msgstr "शॉर्टकोड"
143
+
144
+ #: .././classes/class.yksemeBase.php:1521
145
+ msgid ""
146
+ "Paste this shortcode into whatever page or post you want to add this form to"
147
+ msgstr "जो कुछ पन्ने में इस शोर्ट पेस्ट या आप इस फार्म को जोड़ना चाहते हैं पोस्ट"
148
+
149
+ #: .././classes/class.yksemeBase.php:1526
150
+ msgid "PHP Snippet"
151
+ msgstr "PHP स्निपेट"
152
+
153
+ #: .././classes/class.yksemeBase.php:1529
154
+ msgid "Use this code to add this form to a template file"
155
+ msgstr "एक टेम्पलेट फाइल करने के लिए इस प्रपत्र जोड़ने के लिए इस कोड का प्रयोग करें"
156
+
157
+ #: .././classes/class.yksemeBase.php:1534
158
+ msgid "Number of Subscribers"
159
+ msgstr "ग्राहकों की संख्या"
160
+
161
+ #: .././classes/class.yksemeBase.php:1543
162
+ msgid "Form Fields"
163
+ msgstr "प्रपत्र फ़ील्ड"
164
+
165
+ #: .././classes/class.yksemeBase.php:1545
166
+ msgid ""
167
+ "Check the fields you want included in your form (Email Address is required)."
168
+ msgstr ""
169
+ "आप अपने प्रपत्र में शामिल करना चाहते क्षेत्रों की जाँच करें (ईमेल का पता) की आवश्यकता है."
170
+
171
+ #: .././classes/class.yksemeBase.php:1548
172
+ msgid ""
173
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
174
+ msgstr ""
175
+ "खींचें और ड्रॉप क्षेत्रों और उनके क्रम को पुनर्व्यवस्थित करने के लिए हरी तीर का प्रयोग करें."
176
+
177
+ #: .././classes/class.yksemeBase.php:1554
178
+ msgid "Active Fields"
179
+ msgstr "सक्रिय क्षेत्र"
180
+
181
+ #: .././classes/class.yksemeBase.php:1563
182
+ msgid "Drag"
183
+ msgstr "लंगर "
184
+
185
+ #: .././classes/class.yksemeBase.php:1563
186
+ msgid "drop"
187
+ msgstr "बूंद"
188
+
189
+ #: .././classes/class.yksemeBase.php:1568
190
+ msgid "Merge field"
191
+ msgstr "क्षेत्र मर्ज"
192
+
193
+ #: .././classes/class.yksemeBase.php:1569
194
+ msgid "Placeholder"
195
+ msgstr "प्लेसहोल्डर"
196
+
197
+ #: .././classes/class.yksemeBase.php:1577
198
+ msgid "Redirect User On Submission"
199
+ msgstr "प्रस्तुत करने पर उपयोगकर्ता अनुप्रेषित"
200
+
201
+ #: .././classes/class.yksemeBase.php:1581
202
+ msgid "choose a page to redirect the user to after they submit the form."
203
+ msgstr ""
204
+ "एक पेज चुन सकते हैं या वे फार्म जमा करने के बाद उपयोगकर्ता को दिशानिर्देश देने में एक कस्टम "
205
+ "यूआरएल निर्धारित किया है."
206
+
207
+ #: .././classes/class.yksemeBase.php:1584
208
+ msgid "Select A Post/Page"
209
+ msgstr "एक पोस्ट / पृष्ठ का चयन"
210
+
211
+ #: .././classes/class.yksemeBase.php:1638
212
+ msgid "Save Form Settings"
213
+ msgstr "Mailchimp फार्म सेटिंग प्रबंधित करें"
214
+
215
+ #: .././classes/class.yksemeBase.php:1639
216
+ msgid "Delete Form"
217
+ msgstr "प्रपत्र हटाएं"
218
+
219
+ #: .././classes/class.yksemeBase.php:1640
220
+ msgid "Re-Import Form Fields from MailChimp"
221
+ msgstr "MailChimp से कुछ सूची आयात कृपया"
222
+
223
+ #: .././classes/class.yksemeBase.php:2168
224
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
225
+ msgstr "MAILCHIMP की जगह इस पाठ न्यूजलेटर के लिए मुझे साइन अप"
226
+
227
+ #: .././pages/about.php:27
228
+ msgid "YIKES, Inc. Web Design and Development"
229
+ msgstr "YIKES, inc. वेब डिजाइन और विकास"
230
+
231
+ #: .././pages/about.php:29
232
+ msgid "Smart, effective, beautifully designed web solutions"
233
+ msgstr "स्मार्ट, प्रभावी, खूबसूरती से डिजाइन वेब समाधान"
234
+
235
+ #: .././pages/about.php:32
236
+ msgid ""
237
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
238
+ "custom WordPress themes and plugins every day."
239
+ msgstr ""
240
+ "YIKES inc. हम हर दिन कस्टम WordPress विषयों और plugins का निर्माण जहां "
241
+ "फिलाडेल्फिया के Fishtown पड़ोस में स्थित है."
242
+
243
+ #: .././pages/about.php:36
244
+ msgid ""
245
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
246
+ "WordCamps"
247
+ msgstr ""
248
+ "Yikes, Inc. में हम वर्डप्रेस प्यार! सह मालिक, ट्रेसी लेवेस्क WordCamps में प्रस्तुत किया "
249
+ "गया है"
250
+
251
+ #: .././pages/about.php:36
252
+ msgid "and"
253
+ msgstr "और"
254
+
255
+ #: .././pages/about.php:36
256
+ msgid "She also teaches WordPress classes for"
257
+ msgstr "वह भी के लिए वर्डप्रेस वर्ग सिखाता है"
258
+
259
+ #: .././pages/about.php:40
260
+ msgid ""
261
+ "In addition to making great WordPress sites we are also committed to the "
262
+ "sustainable business movement. We observe the triple bottom line: people, "
263
+ "planet, profit and work to help build a more socially, environmentally and "
264
+ "financially sustainable local economy. We even have a"
265
+ msgstr ""
266
+ "महान WordPress साइटों बनाने के अलावा हम भी स्थायी व्यवसाय आंदोलन के लिए प्रतिबद्ध हैं. "
267
+ "लोगों, ग्रह, लाभ और एक अधिक सामाजिक, पर्यावरण और आर्थिक रूप से स्थायी स्थानीय "
268
+ "अर्थव्यवस्था के निर्माण में मदद करने के लिए काम: हम ट्रिपल नीचे लाइन का निरीक्षण. हम भी "
269
+ "है एक"
270
+
271
+ #: .././pages/about.php:40
272
+ msgid "LEED Platinum office"
273
+ msgstr "LEED प्लेटिनम कार्यालय"
274
+
275
+ #: .././pages/about.php:44
276
+ msgid ""
277
+ "If you're interested in hiring us for WordPress development, or just want to "
278
+ "learn more about us, please visit"
279
+ msgstr ""
280
+ "आप वर्डप्रेस विकास, के लिए हमें काम पर रखने में रुचि रखते हैं या सिर्फ हमारे बारे में अधिक "
281
+ "जानकारी चाहते हैं, कृपया देखें"
282
+
283
+ #: .././pages/lists.php:8
284
+ msgid "No forms have been added yet."
285
+ msgstr "कोई रूपों अभी तक जोड़ा गया है."
286
+
287
+ #: .././pages/lists.php:39
288
+ msgid "Oops.. The list ID you entered appears to be incorrect."
289
+ msgstr "ओह .. आपके द्वारा दर्ज की सूची आईडी गलत प्रतीत होता है."
290
+
291
+ #: .././pages/lists.php:44
292
+ msgid "There was an error!"
293
+ msgstr "कोई त्रुटि हुई थी!"
294
+
295
+ #: .././pages/lists.php:135
296
+ msgid "You need to select a Mailchimp list in order to create a form for it"
297
+ msgstr "आप इसके लिए एक फार्म बनाने के क्रम में एक Mailchimp सूची का चयन करने की जरूरत है"
298
+
299
+ #: .././pages/lists.php:173
300
+ msgid "Are you sure you want to delete this form?"
301
+ msgstr "क्या आप इस फार्म को नष्ट करना चाहते हैं?"
302
+
303
+ #: .././pages/lists.php:206
304
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
305
+ msgstr "क्या आप MailChimp से अपने खेतों को फिर से आयात करना चाहते हैं?"
306
+
307
+ #: .././pages/lists.php:228
308
+ msgid "Looks like this form is already up to date!"
309
+ msgstr "इस फार्म की तारीख तक पहले से ही है लगता है!"
310
+
311
+ #: .././pages/lists.php:326
312
+ msgid "Are you sure you want to unsubscribe"
313
+ msgstr "क्या आप सदस्यता समाप्त करने के लिए चाहते हैं"
314
+
315
+ #: .././pages/lists.php:326
316
+ msgid "from this list?"
317
+ msgstr "इस सूची से?"
318
+
319
+ #: .././pages/lists.php:342
320
+ msgid "was successfully unsubscribed from this list."
321
+ msgstr "सफलतापूर्वक इस सूची से हट गया था."
322
+
323
+ #: .././pages/lists.php:448 .././pages/options.php:196
324
+ #: .././pages/options.php:416
325
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
326
+ msgstr "Yikes, inc. द्वारा आसान Mailchimp फॉर्म्स"
327
+
328
+ #: .././pages/lists.php:454
329
+ msgid "Before you can add MailChimp forms to your site, you need to"
330
+ msgstr "आप अपनी साइट के लिए MailChimp रूपों जोड़ने से पहले, आप की जरूरत"
331
+
332
+ #: .././pages/lists.php:454
333
+ msgid "go to the MailChimp Settings page"
334
+ msgstr "MailChimp सेटिंग्स पेज पर जाने"
335
+
336
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
337
+ msgid "and add your API Key."
338
+ msgstr "और अपने एपीआई कुंजी जोड़ें."
339
+
340
+ #: .././pages/lists.php:462
341
+ msgid "You must enter a valid API key to import and manage your lists."
342
+ msgstr "आप अपनी सूची आयात और प्रबंधन के लिए एक वैध एपीआई कुंजी दर्ज करना होगा."
343
+
344
+ #: .././pages/lists.php:473
345
+ msgid "Your Lists"
346
+ msgstr "अपनी सूची"
347
+
348
+ #: .././pages/lists.php:483
349
+ msgid "Manage Forms"
350
+ msgstr "फार्म प्रबंधन"
351
+
352
+ #: .././pages/options.php:41
353
+ msgid "The options were saved successfully!"
354
+ msgstr "विकल्प सफलतापूर्वक बच गए!"
355
+
356
+ #: .././pages/options.php:44
357
+ msgid "The options could not be saved (or you did not change them)."
358
+ msgstr "विकल्पों को बचाया नहीं जा सका (या आप उन्हें बदल नहीं किया था)."
359
+
360
+ #: .././pages/options.php:96
361
+ msgid "Valid API Key"
362
+ msgstr "मान्य एपीआई कुंजी"
363
+
364
+ #: .././pages/options.php:102
365
+ msgid "Sorry, that is an invalid MailChimp API key."
366
+ msgstr "क्षमा करें, यह एक अवैध MailChimp एपीआई कुंजी है."
367
+
368
+ #: .././pages/options.php:108
369
+ msgid ""
370
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
371
+ "further information."
372
+ msgstr ""
373
+ "क्षमा करें, यह एक अवैध MailChimp एपीआई कुंजी है. अधिक जानकारी के लिए सांत्वना की जांच "
374
+ "करें."
375
+
376
+ #: .././pages/options.php:117
377
+ msgid "Error: Please enter a valid Mail Chimp API Key."
378
+ msgstr "त्रुटि: एक वैध मेल चिम्प एपीआई कुंजी दर्ज करें."
379
+
380
+ #: .././pages/options.php:199
381
+ msgid "Manage Mailchimp Forms Settings"
382
+ msgstr "Mailchimp फार्म सेटिंग प्रबंधित करें"
383
+
384
+ #: .././pages/options.php:205
385
+ msgid "WordPress Version Number Error"
386
+ msgstr "WordPress संस्करण"
387
+
388
+ #: .././pages/options.php:206
389
+ msgid ""
390
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
391
+ "You won't be able to access the tinyMCE button to insert forms into pages "
392
+ "and posts unless you update to 3.9 or later."
393
+ msgstr ""
394
+ "हमें खेद है, लेकिन यह अपने WordPress के पुराने संस्करण का उपयोग कर की तरह लग रहा है. आप "
395
+ "3.9 या बाद में करने के लिए नवीनीकृत नहीं पृष्ठों और पदों में रूपों डालने के लिए tinyMCE बटन "
396
+ "का उपयोग करने में सक्षम नहीं होगा."
397
+
398
+ #: .././pages/options.php:215
399
+ msgid "LocalHost Detected :"
400
+ msgstr "स्थानीय होस्ट पता लगाया गया:"
401
+
402
+ #: .././pages/options.php:216
403
+ msgid ""
404
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
405
+ msgstr "Yikes, inc. द्वारा आसान Mailchimp फॉर्म्स"
406
+
407
+ #: .././pages/options.php:217
408
+ msgid ""
409
+ "If you are unable to validate your API key, and receive the error message"
410
+ msgstr "आप अपने एपीआई कुंजी को मान्य करने में असमर्थ हैं, और त्रुटि संदेश प्राप्त होता है"
411
+
412
+ #: .././pages/options.php:217
413
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
414
+ msgstr ""
415
+ "\"एसएसएल प्रमाणपत्र समस्या: स्थानीय जारीकर्ता प्रमाणपत्र प्राप्त करने में असमर्थ\" "
416
+
417
+ #: .././pages/options.php:217
418
+ msgid "follow the tutorial located "
419
+ msgstr "स्थित ट्यूटोरियल का पालन करें "
420
+
421
+ #: .././pages/options.php:230
422
+ msgid "Your Mailchimp API Key"
423
+ msgstr "आपकी Mailchimp एपीआई कुंजी"
424
+
425
+ #: .././pages/options.php:238
426
+ msgid ""
427
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
428
+ "site to communicate with your MailChimp account."
429
+ msgstr ""
430
+ "ऊपर अपने MailChimp एपीआई कुंजी दर्ज करें. एपीआई कुंजी अपने WordPress साइट आपके "
431
+ "MailChimp खाते के साथ संवाद करने की अनुमति देता है."
432
+
433
+ #: .././pages/options.php:239
434
+ msgid "For more help, visit the MailChimp Support article"
435
+ msgstr "अधिक मदद के लिए, MailChimp समर्थन लेख पर जाएँ"
436
+
437
+ #: .././pages/options.php:239
438
+ msgid "Where can I find my API Key?"
439
+ msgstr "मैं कहां एपीआई कुंजी मिल सकती है?"
440
+
441
+ #: .././pages/options.php:244
442
+ msgid "Preferred Form Layout"
443
+ msgstr "पसंदीदा फार्म लेआउट"
444
+
445
+ #: .././pages/options.php:247
446
+ msgid "table"
447
+ msgstr "तालिका"
448
+
449
+ #: .././pages/options.php:248
450
+ msgid "div"
451
+ msgstr "div"
452
+
453
+ #: .././pages/options.php:256
454
+ msgid "Choose whether you want your forms to use a table or div layout."
455
+ msgstr "आप अपने रूपों एक मेज या div लेआउट का उपयोग करना चाहते हैं चुनें."
456
+
457
+ #: .././pages/options.php:261
458
+ msgid "Advanced Error Messaging"
459
+ msgstr "उन्नत त्रुटि संदेश"
460
+
461
+ #: .././pages/options.php:264
462
+ msgid "Disabled"
463
+ msgstr "अक्षम "
464
+
465
+ #: .././pages/options.php:265
466
+ msgid "Enabled"
467
+ msgstr "सक्रिय या सक्षम"
468
+
469
+ #: .././pages/options.php:273
470
+ msgid ""
471
+ "Enable if you're having problems with your forms sending data to MailChimp. "
472
+ "Enabling Advanced Error Messaging will show you the exact error codes "
473
+ "MailChimp is returning."
474
+ msgstr ""
475
+ "आप अपने रूपों MailChimp के लिए डेटा भेजने के साथ समस्या हो रही है सक्रिय करें. उन्नत त्रुटि "
476
+ "संदेश को सक्षम करने से आप MailChimp लौट रहा सटीक त्रुटि कोड दिखाई देगा."
477
+
478
+ #: .././pages/options.php:281
479
+ msgid "Single Opt-In"
480
+ msgstr "एकल ऑप्ट में"
481
+
482
+ #: .././pages/options.php:282
483
+ msgid "Double Opt-In"
484
+ msgstr "डबल ऑप्ट में"
485
+
486
+ #: .././pages/options.php:290
487
+ msgid ""
488
+ "A single opt-in will add the user to your list without any further "
489
+ "interaction."
490
+ msgstr ""
491
+ "एक एकल ऑप्ट में किसी भी आगे की बातचीत के बिना अपनी सूची में उपयोगकर्ता जोड़ना होगा."
492
+
493
+ #: .././pages/options.php:291
494
+ msgid ""
495
+ "A double opt-in will send an email to the user asking them to confirm their "
496
+ "subscription."
497
+ msgstr ""
498
+ "एक डबल ऑप्ट में अपनी सदस्यता की पुष्टि करने के लिए उन्हें पूछ उपयोगकर्ता के लिए एक ईमेल भेज "
499
+ "देंगे."
500
+
501
+ #: .././pages/options.php:292
502
+ msgid "This will also dictate the opt-in settings for people leaving comments."
503
+ msgstr "यह भी लोगों को टिप्पणी छोड़ने के लिए चुनते की सेटिंग हुक्म चलाना होगा."
504
+
505
+ #: .././pages/options.php:297
506
+ msgid "Custom Opt-In Message"
507
+ msgstr "कस्टम चुनते में संदेश"
508
+
509
+ #: .././pages/options.php:299
510
+ msgid "Double Opt-In Message"
511
+ msgstr "डबल ऑप्ट में संदेश"
512
+
513
+ #: .././pages/options.php:301
514
+ msgid "Single Opt-In Message"
515
+ msgstr "एकल ऑप्ट में संदेश"
516
+
517
+ #: .././pages/options.php:307
518
+ msgid "Interest Group Label"
519
+ msgstr "ब्याज समूह लेबल"
520
+
521
+ #: .././pages/options.php:316
522
+ msgid ""
523
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
524
+ "group names."
525
+ msgstr ""
526
+ "हित समूहों ऊपर प्रदर्शित करने के लिए पाठ. MailChimp रुचि समूह के नाम का उपयोग करने के "
527
+ "लिए खाली छोड़ दें."
528
+
529
+ #: .././pages/options.php:321
530
+ msgid "Display opt-in checkbox on comment forms?"
531
+ msgstr "प्रदर्शन टिप्पणी रूपों पर चेकबॉक्स में चुनते?"
532
+
533
+ #: .././pages/options.php:324
534
+ msgid "Hide"
535
+ msgstr "छिपाना"
536
+
537
+ #: .././pages/options.php:325
538
+ msgid "Show"
539
+ msgstr "दिखाना, दिखाएँ"
540
+
541
+ #: .././pages/options.php:333
542
+ msgid ""
543
+ "This will display a checkbox just above the submit button on all comment "
544
+ "forms. If selected, any users leaving comments will also be added to the "
545
+ "mailing list."
546
+ msgstr ""
547
+ "यह सिर्फ सभी टिप्पणी रूपों पर सबमिट बटन के ऊपर एक चेकबॉक्स प्रदर्शित करेगा. चयनित हैं, "
548
+ "टिप्पणी छोड़ने के लिए किसी भी उपयोगकर्ताओं को भी मेलिंग सूची में जोड़ दिया जाएगा."
549
+
550
+ #: .././pages/options.php:338
551
+ msgid "Custom Comment Checkbox Text"
552
+ msgstr "कस्टम टिप्पणी चेकबॉक्स पाठ"
553
+
554
+ #: .././pages/options.php:345
555
+ msgid "Default List"
556
+ msgstr "डिफ़ॉल्ट सूची"
557
+
558
+ #: .././pages/options.php:360
559
+ msgid ""
560
+ "This is the default list users will be subscribed to when submitting a "
561
+ "comment."
562
+ msgstr ""
563
+ "यह डिफ़ॉल्ट सूची उपयोगकर्ताओं को एक टिप्पणी जमा करने के लिए जब सदस्यता हो जाएगा है."
564
+
565
+ #: .././pages/options.php:361
566
+ msgid ""
567
+ "It is best to select a form where only the email , first name and/or last "
568
+ "name are required or you may run into issues."
569
+ msgstr ""
570
+ "यह ईमेल, पहला नाम और / या आखिरी नाम ही आवश्यक हैं या आप मुद्दों में चला सकते हैं, जहां एक "
571
+ "फार्म का चयन करने के लिए सबसे अच्छा है."
572
+
573
+ #: .././pages/options.php:373
574
+ msgid "Plugin Information"
575
+ msgstr "प्लगइन सूचना"
576
+
577
+ #: .././pages/options.php:376
578
+ msgid "If you experience any issues with our plugin, please"
579
+ msgstr "आप हमारे प्लगइन के साथ किसी भी मुद्दे का अनुभव करते हैं, तो कृपया"
580
+
581
+ #: .././pages/options.php:376
582
+ msgid "submit a New Issue on our Github Issue Tracker"
583
+ msgstr "हमारे Github अंक ट्रैकर पर एक नया मुद्दा प्रस्तुत"
584
+
585
+ #: .././pages/options.php:376
586
+ msgid ""
587
+ "Please include the information below to help us troubleshoot your problem."
588
+ msgstr "हमें अपनी समस्या के निवारण में मदद करने के लिए नीचे दी गई जानकारी शामिल करें."
589
+
590
+ #: .././pages/options.php:384
591
+ msgid "Plugin Version"
592
+ msgstr "प्लगइन संस्करण"
593
+
594
+ #: .././pages/options.php:388
595
+ msgid "Wordpress Version"
596
+ msgstr "WordPress संस्करण"
597
+
598
+ #: .././pages/options.php:392
599
+ msgid "Browser Information"
600
+ msgstr "ब्राउज़र जानकारी"
601
+
602
+ #: .././pages/options.php:420
603
+ msgid "Error"
604
+ msgstr "त्रुटि "
605
+
606
+ #: .././pages/options.php:421
607
+ msgid ""
608
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
609
+ "cURL to send and retreive data."
610
+ msgstr ""
611
+ "हमें खेद है, लेकिन कर्ल अपने सर्वर पर अक्षम है. MailChimp एपीआई डेटा भेजने और पुर्नप्राप्त "
612
+ "करने के लिए कर्ल का उपयोग."
613
+
614
+ #: .././pages/options.php:426
615
+ msgid "Help!"
616
+ msgstr "मदद!"
617
+
618
+ #: .././pages/options.php:426
619
+ msgid "What is cURL?"
620
+ msgstr "कर्ल क्या है?"
621
+
622
+ #: .././pages/options.php:426
623
+ msgid "Check phpinfo()"
624
+ msgstr "Phpinfo जाँच ()"
625
+
626
+ #: .././pages/options.php:428
627
+ msgid "Steps To Resolve The Issue"
628
+ msgstr "समस्या को हल करने के लिए कदम"
629
+
630
+ #: .././pages/options.php:430
631
+ msgid ""
632
+ "You can enable cURL by turning on the cURL module within your php.ini file"
633
+ msgstr "आप अपने php.ini फ़ाइल के भीतर कर्ल मॉड्यूल पर बदल कर कर्ल सक्षम कर सकते हैं"
634
+
635
+ #: .././pages/options.php:430
636
+ msgid "You should find the php.ini file located here : "
637
+ msgstr "आप यहाँ स्थित php.ini फ़ाइल का पता लगाना चाहिए: "
638
+
639
+ #: .././pages/options.php:431
640
+ msgid ""
641
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
642
+ msgstr ""
643
+ "एक बार मिला, php.ini खोलने के लिए और लाइन ढूँढ \"; विस्तार = php_curl.dll\"."
644
+
645
+ #: .././pages/options.php:432
646
+ msgid ""
647
+ "Remove the semi colon before the line, to un-comment it and make the module "
648
+ "active."
649
+ msgstr ""
650
+ ", लाइन से पहले अर्द्ध बृहदान्त्र हटाने के लिए संयुक्त राष्ट्र टिप्पणी और मॉड्यूल सक्रिय बनाना."
651
+
652
+ #: .././pages/options.php:433
653
+ msgid "Re-save and close the file."
654
+ msgstr "फिर से बचाने के लिए और फ़ाइल को बंद करें."
655
+
656
+ #: .././pages/options.php:434
657
+ msgid "Re-load this page."
658
+ msgstr "इस पृष्ठ पुनः लोड."
659
+
660
+ #: .././templates/shortcode_error.php:1
661
+ msgid "There was an error calling the mailchimp list."
662
+ msgstr "Mailchimp सूची बुला कोई त्रुटि हुई थी."
663
+
664
+ #: .././templates/shortcode_error_data.php:1
665
+ msgid ""
666
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
667
+ "List Forms\" page."
668
+ msgstr ""
669
+ "सूची मौजूद नहीं है! आप \"सूची प्रपत्र प्रबंधन \" पृष्ठ पर सूची का आयात किया है सुनिश्चित करें."
670
+
671
+ #: .././templates/shortcode_error_exists.php:1
672
+ msgid "This list was already placed on this page!"
673
+ msgstr "इस सूची में पहले से ही इस पेज पर रखा गया था!"
674
+
675
+ #: .././templates/shortcode_error_no_API_key.php:1
676
+ msgid "Woops! No Valid API Key Found. Double check your settings."
677
+ msgstr "Woops! नहीं मिला मान्य एपीआई कुंजी. डबल अपनी सेटिंग्स की जाँच करें."
678
+
679
+ #: .././templates/shortcode_form.php:11
680
+ msgid "Oops.. Don't forget to fill-in the following fields"
681
+ msgstr "ओह .. भरने में करने के लिए निम्नलिखित क्षेत्रों के लिए मत भूलना"
682
+
683
+ #: .././templates/shortcode_form.php:74
684
+ msgid "required field"
685
+ msgstr "आवश्यक फ़ील्ड"
686
+
687
+ #: .././templates/yikes-mailchimp-widget.php:15
688
+ #: .././templates/yikes-mailchimp-widget.php:18
689
+ msgid "MailChimp Signup Form"
690
+ msgstr "MailChimp पंजीकरण फार्म"
691
+
692
+ #: .././templates/yikes-mailchimp-widget.php:27
693
+ msgid "Select Which Form You Would Like To Display:"
694
+ msgstr "आप प्रदर्शित करना चाहते हैं जो फार्म का चयन करें:"
695
+
696
+ #: .././templates/yikes-mailchimp-widget.php:30
697
+ msgid "Select a Form to Display"
698
+ msgstr "प्रदर्शित करने के लिए प्रपत्र का चयन"
699
+
700
+ #: .././templates/yikes-mailchimp-widget.php:47
701
+ msgid "Please import MailChimp forms"
702
+ msgstr "MailChimp रूपों आयात कृपया"
703
+
704
+ #: .././templates/yikes-mailchimp-widget.php:49
705
+ msgid "Please import some lists from MailChimp"
706
+ msgstr "MailChimp से कुछ सूची आयात कृपया"
707
+
708
+ #: .././templates/yikes-mailchimp-widget.php:52
709
+ msgid "Import Lists Now"
710
+ msgstr "अब आयात सूचियां"
711
+
712
+ #: .././templates/yikes-mailchimp-widget.php:73
713
+ msgid ""
714
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
715
+ "least one list to use the Easy MailChimp widget."
716
+ msgstr ""
717
+ "उफ़! आप अभी तक किसी भी सूचियों का आयात नहीं किया है ऐसा लगता है. आप आसानी से "
718
+ "MailChimp विजेट का उपयोग करने के लिए कम से कम एक सूची आयात करना होगा."
719
+
720
+ #: .././templates/yikes-mailchimp-widget.php:80
721
+ msgid ""
722
+ "Oops! It looks like you forgot to select a form to display here. Go to "
723
+ "'Appearance > Widgets' and select a form to display."
724
+ msgstr ""
725
+ "उफ़! आप यहां प्रदर्शित करने के लिए एक फार्म का चयन करने के लिए भूल ऐसा लगता है. "
726
+ "'उपस्थिति> विजेट' जाओ और प्रदर्शित करने के लिए एक फार्म का चयन करें."
727
+
728
+ #: .././templates/yikes-mailchimp-widget.php:117
729
+ msgid "Sign Up For Our Newsletter"
730
+ msgstr "हमारे न्यूज़लेटर के लिए साइन"
731
+
732
+ #: .././templates/yikes-mailchimp-widget.php:129
733
+ msgid "Sign Me Up"
734
+ msgstr "मुझे साइन अप"
735
+
736
+ #: .././templates/yikes-mailchimp-widget.php:133
737
+ msgid "Title:"
738
+ msgstr "शीर्षक:"
739
+
740
+ #: .././templates/yikes-mailchimp-widget.php:138
741
+ msgid "Form Text:"
742
+ msgstr "फार्म पाठ:"
743
+
744
+ #: .././templates/yikes-mailchimp-widget.php:146
745
+ msgid "Submit Button Text:"
746
+ msgstr "बटन पाठ सबमिट करें:"
747
+
748
+ #: .././templates/yikes-mailchimp-widget.php:156
749
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
750
+ msgstr "उफ़! आप अपने एपीआई कुंजी नहीं जोड़ा है, ऐसा लगता है! सिर पर"
751
+
752
+ #: .././templates/yikes-mailchimp-widget.php:156
753
+ msgid "Settings page"
754
+ msgstr "सेटिंग पेज"
755
+
756
+ #~ msgid "No API Key or List Id Exist!"
757
+ #~ msgstr "कोई एपीआई कुंजी या सूची ईद मौजूद हैं!"
languages/yikes-inc-easy-mailchimp-extender-it_IT.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-it_IT.po ADDED
@@ -0,0 +1,788 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:36-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:50-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: it\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "Grazie per la sottoscrizione!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "Grazie per la sottoscrizione! Controlla la tua e-mail per il messaggio di "
29
+ "conferma."
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "Seleziona l'area di interesse"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "Fare clic su un abbonato per vedere ulteriori informazioni"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "E-Mail"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "Data sottoscritto"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr "Siamo spiacenti Non Sei attualmente di abbonati in questa lista!"
50
+
51
+ #: .././classes/class.yksemeBase.php:998
52
+ msgid "Back to Subscriber List"
53
+ msgstr "Torna a elenco di abbonati"
54
+
55
+ #: .././classes/class.yksemeBase.php:999
56
+ msgid "Subscriber Details"
57
+ msgstr "Subscriber Dettagli"
58
+
59
+ #: .././classes/class.yksemeBase.php:1010
60
+ msgid "Overview"
61
+ msgstr "Panoramica"
62
+
63
+ #: .././classes/class.yksemeBase.php:1015
64
+ msgid "First Name"
65
+ msgstr "Nome"
66
+
67
+ #: .././classes/class.yksemeBase.php:1018
68
+ msgid "Last Updated"
69
+ msgstr "Ultimo aggiornamento"
70
+
71
+ #: .././classes/class.yksemeBase.php:1021
72
+ msgid "Preferred Email Type"
73
+ msgstr "Preferred Type-mail"
74
+
75
+ #: .././classes/class.yksemeBase.php:1028
76
+ msgid "Last Name"
77
+ msgstr "Cognome"
78
+
79
+ #: .././classes/class.yksemeBase.php:1031
80
+ msgid "Language"
81
+ msgstr "Lingua"
82
+
83
+ #: .././classes/class.yksemeBase.php:1054
84
+ msgid "Groups Subscribed To"
85
+ msgstr "Gruppi sottoscritto"
86
+
87
+ #: .././classes/class.yksemeBase.php:1104
88
+ msgid "Subscriber Notes"
89
+ msgstr "Subscriber Note"
90
+
91
+ #: .././classes/class.yksemeBase.php:1109
92
+ msgid "Written by"
93
+ msgstr "scritto da"
94
+
95
+ #: .././classes/class.yksemeBase.php:1109
96
+ msgid "Created on"
97
+ msgstr "creato il"
98
+
99
+ #: .././classes/class.yksemeBase.php:1251
100
+ #: .././classes/class.yksemeBase.php:1253
101
+ msgid "MailChimp Forms"
102
+ msgstr "Moduli di MailChimp"
103
+
104
+ #: .././classes/class.yksemeBase.php:1253
105
+ msgid "MailChimp Settings"
106
+ msgstr "Impostazioni MailChimp"
107
+
108
+ #: .././classes/class.yksemeBase.php:1254
109
+ msgid "Manage List Forms"
110
+ msgstr "Gestire moduli elenco"
111
+
112
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
113
+ msgid "About YIKES, Inc."
114
+ msgstr "Chi YIKES, Inc."
115
+
116
+ #: .././classes/class.yksemeBase.php:1430
117
+ msgid "One or more fields are empty"
118
+ msgstr "Uno o più campi sono vuoti"
119
+
120
+ #: .././classes/class.yksemeBase.php:1480
121
+ msgid "Your List Was Successfully Saved!"
122
+ msgstr "Il tuo elenco è stato salvato con successo!"
123
+
124
+ #: .././classes/class.yksemeBase.php:1482
125
+ msgid "I'm sorry there was an error with your request."
126
+ msgstr "Mi dispiace che c'è stato un errore con la vostra richiesta."
127
+
128
+ #: .././classes/class.yksemeBase.php:1488
129
+ msgid "MailChimp List name"
130
+ msgstr "Nome elenco MailChimp"
131
+
132
+ #: .././classes/class.yksemeBase.php:1494
133
+ #: .././classes/class.yksemeBase.php:1504
134
+ #, php-format
135
+ msgid "%1$s"
136
+ msgstr "%1$s"
137
+
138
+ #: .././classes/class.yksemeBase.php:1512
139
+ msgid "MailChimp List ID"
140
+ msgstr "MailChimp List ID"
141
+
142
+ #: .././classes/class.yksemeBase.php:1518
143
+ msgid "Shortcode"
144
+ msgstr "Shortcode"
145
+
146
+ #: .././classes/class.yksemeBase.php:1521
147
+ msgid ""
148
+ "Paste this shortcode into whatever page or post you want to add this form to"
149
+ msgstr ""
150
+ "Incolla questo shortcode in qualunque pagina o post che si desidera "
151
+ "aggiungere questo modulo per"
152
+
153
+ #: .././classes/class.yksemeBase.php:1526
154
+ msgid "PHP Snippet"
155
+ msgstr "PHP Snippet"
156
+
157
+ #: .././classes/class.yksemeBase.php:1529
158
+ msgid "Use this code to add this form to a template file"
159
+ msgstr ""
160
+ "Utilizzare questo codice per aggiungere questo modulo in un file di modello"
161
+
162
+ #: .././classes/class.yksemeBase.php:1534
163
+ msgid "Number of Subscribers"
164
+ msgstr "Numero di abbonati"
165
+
166
+ #: .././classes/class.yksemeBase.php:1543
167
+ msgid "Form Fields"
168
+ msgstr "Campi Form"
169
+
170
+ #: .././classes/class.yksemeBase.php:1545
171
+ msgid ""
172
+ "Check the fields you want included in your form (Email Address is required)."
173
+ msgstr ""
174
+ "Controllare i campi che si desidera includere nel modulo (indirizzo e-mail è "
175
+ "obbligatorio)."
176
+
177
+ #: .././classes/class.yksemeBase.php:1548
178
+ msgid ""
179
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
180
+ msgstr ""
181
+ "Utilizzare le frecce verdi per trascinare e rilasciare i campi e "
182
+ "riorganizzare il loro ordine."
183
+
184
+ #: .././classes/class.yksemeBase.php:1554
185
+ msgid "Active Fields"
186
+ msgstr "Campi attivi"
187
+
188
+ #: .././classes/class.yksemeBase.php:1563
189
+ msgid "Drag"
190
+ msgstr "Trascinate"
191
+
192
+ #: .././classes/class.yksemeBase.php:1563
193
+ msgid "drop"
194
+ msgstr "cadere"
195
+
196
+ #: .././classes/class.yksemeBase.php:1568
197
+ msgid "Merge field"
198
+ msgstr "Campo unione"
199
+
200
+ #: .././classes/class.yksemeBase.php:1569
201
+ msgid "Placeholder"
202
+ msgstr "Segnaposto"
203
+
204
+ #: .././classes/class.yksemeBase.php:1577
205
+ msgid "Redirect User On Submission"
206
+ msgstr "Redirect utente su presentazione"
207
+
208
+ #: .././classes/class.yksemeBase.php:1581
209
+ msgid "choose a page to redirect the user to after they submit the form."
210
+ msgstr ""
211
+ "scegliere una pagina o impostare un URL personalizzato per reindirizzare "
212
+ "l'utente a dopo della presentazione del modulo."
213
+
214
+ #: .././classes/class.yksemeBase.php:1584
215
+ msgid "Select A Post/Page"
216
+ msgstr "Selezionare A Articolo / Pagina"
217
+
218
+ #: .././classes/class.yksemeBase.php:1638
219
+ msgid "Save Form Settings"
220
+ msgstr "Gestisci impostazioni Forms Mailchimp"
221
+
222
+ #: .././classes/class.yksemeBase.php:1639
223
+ msgid "Delete Form"
224
+ msgstr "Elimina Form"
225
+
226
+ #: .././classes/class.yksemeBase.php:1640
227
+ msgid "Re-Import Form Fields from MailChimp"
228
+ msgstr "Si prega di importare alcune liste da MailChimp"
229
+
230
+ #: .././classes/class.yksemeBase.php:2168
231
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
232
+ msgstr "Sign Me Up For Newsletter di Mailchimp-REPLACE-QUESTO-TEXT"
233
+
234
+ #: .././pages/about.php:27
235
+ msgid "YIKES, Inc. Web Design and Development"
236
+ msgstr "YIKES, Inc. Web Design e Sviluppo"
237
+
238
+ #: .././pages/about.php:29
239
+ msgid "Smart, effective, beautifully designed web solutions"
240
+ msgstr "Intelligenti, efficaci, soluzioni web dal design accattivante"
241
+
242
+ #: .././pages/about.php:32
243
+ msgid ""
244
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
245
+ "custom WordPress themes and plugins every day."
246
+ msgstr ""
247
+ "YIKES si trova nel quartiere Fishtown di Filadelfia, dove si costruisce su "
248
+ "misura temi WordPress e plugin ogni giorno."
249
+
250
+ #: .././pages/about.php:36
251
+ msgid ""
252
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
253
+ "WordCamps"
254
+ msgstr ""
255
+ "A YIKES amiamo WordPress! Co-Owner, Tracy Levesque ha presentato al WordCamps"
256
+
257
+ #: .././pages/about.php:36
258
+ msgid "and"
259
+ msgstr "e"
260
+
261
+ #: .././pages/about.php:36
262
+ msgid "She also teaches WordPress classes for"
263
+ msgstr "Insegna anche corsi per WordPress"
264
+
265
+ #: .././pages/about.php:40
266
+ msgid ""
267
+ "In addition to making great WordPress sites we are also committed to the "
268
+ "sustainable business movement. We observe the triple bottom line: people, "
269
+ "planet, profit and work to help build a more socially, environmentally and "
270
+ "financially sustainable local economy. We even have a"
271
+ msgstr ""
272
+ "Oltre a rendere grandi siti WordPress siamo anche impegnati al movimento "
273
+ "business sostenibile. Osserviamo la triple bottom line: persone, pianeta, "
274
+ "profitto e lavoro per contribuire a costruire un'economia locale più "
275
+ "socialmente, ambientalmente e finanziariamente sostenibile. Abbiamo anche un"
276
+
277
+ #: .././pages/about.php:40
278
+ msgid "LEED Platinum office"
279
+ msgstr "Ufficio LEED Platinum"
280
+
281
+ #: .././pages/about.php:44
282
+ msgid ""
283
+ "If you're interested in hiring us for WordPress development, or just want to "
284
+ "learn more about us, please visit"
285
+ msgstr ""
286
+ "Se siete interessati a noi assumere per lo sviluppo di WordPress, o "
287
+ "semplicemente volete saperne di più su di noi, si prega di visitare il sito"
288
+
289
+ #: .././pages/lists.php:8
290
+ msgid "No forms have been added yet."
291
+ msgstr "Sono ancora state aggiunte delle forme."
292
+
293
+ #: .././pages/lists.php:39
294
+ msgid "Oops.. The list ID you entered appears to be incorrect."
295
+ msgstr "Oops .. L'ID dell'elenco immesso sembra essere corretto."
296
+
297
+ #: .././pages/lists.php:44
298
+ msgid "There was an error!"
299
+ msgstr "Si è verificato un errore!"
300
+
301
+ #: .././pages/lists.php:135
302
+ msgid "You need to select a Mailchimp list in order to create a form for it"
303
+ msgstr ""
304
+ "È necessario selezionare un elenco Mailchimp al fine di creare un modulo per "
305
+ "esso"
306
+
307
+ #: .././pages/lists.php:173
308
+ msgid "Are you sure you want to delete this form?"
309
+ msgstr "Sei sicuro di voler eliminare questo modulo?"
310
+
311
+ #: .././pages/lists.php:206
312
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
313
+ msgstr "Sei sicuro di voler re-importare i campi da MailChimp?"
314
+
315
+ #: .././pages/lists.php:228
316
+ msgid "Looks like this form is already up to date!"
317
+ msgstr "Sembra che questa forma è già aggiornato!"
318
+
319
+ #: .././pages/lists.php:326
320
+ msgid "Are you sure you want to unsubscribe"
321
+ msgstr "Sei sicuro di voler annullare l'iscrizione"
322
+
323
+ #: .././pages/lists.php:326
324
+ msgid "from this list?"
325
+ msgstr "da questo elenco?"
326
+
327
+ #: .././pages/lists.php:342
328
+ msgid "was successfully unsubscribed from this list."
329
+ msgstr "è stato annullato l'iscrizione con successo da questo elenco."
330
+
331
+ #: .././pages/lists.php:448 .././pages/options.php:196
332
+ #: .././pages/options.php:416
333
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
334
+ msgstr "Facile Mailchimp Forme di YIKES, Inc."
335
+
336
+ #: .././pages/lists.php:454
337
+ msgid "Before you can add MailChimp forms to your site, you need to"
338
+ msgstr "Prima di aggiungere moduli MailChimp al tuo sito, è necessario"
339
+
340
+ #: .././pages/lists.php:454
341
+ msgid "go to the MailChimp Settings page"
342
+ msgstr "vai alla pagina Impostazioni MailChimp"
343
+
344
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
345
+ msgid "and add your API Key."
346
+ msgstr "e aggiungere la chiave API."
347
+
348
+ #: .././pages/lists.php:462
349
+ msgid "You must enter a valid API key to import and manage your lists."
350
+ msgstr ""
351
+ "È necessario inserire una chiave API valida per importare e gestire le "
352
+ "vostre liste."
353
+
354
+ #: .././pages/lists.php:473
355
+ msgid "Your Lists"
356
+ msgstr "I vostri elenchi"
357
+
358
+ #: .././pages/lists.php:483
359
+ msgid "Manage Forms"
360
+ msgstr "Gestione moduli"
361
+
362
+ #: .././pages/options.php:41
363
+ msgid "The options were saved successfully!"
364
+ msgstr "Le opzioni sono state salvate con successo!"
365
+
366
+ #: .././pages/options.php:44
367
+ msgid "The options could not be saved (or you did not change them)."
368
+ msgstr ""
369
+ "Le opzioni non potevano essere salvate (o non è stato modificato loro)."
370
+
371
+ #: .././pages/options.php:96
372
+ msgid "Valid API Key"
373
+ msgstr "Valido API Key"
374
+
375
+ #: .././pages/options.php:102
376
+ msgid "Sorry, that is an invalid MailChimp API key."
377
+ msgstr "Siamo spiacenti, questo è un valido chiave API MailChimp."
378
+
379
+ #: .././pages/options.php:108
380
+ msgid ""
381
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
382
+ "further information."
383
+ msgstr ""
384
+ "Siamo spiacenti, questo è un valido chiave API MailChimp. Si prega di "
385
+ "controllare la console per ulteriori informazioni."
386
+
387
+ #: .././pages/options.php:117
388
+ msgid "Error: Please enter a valid Mail Chimp API Key."
389
+ msgstr "Errore: Si prega di inserire un indirizzo di posta Chimp API Key."
390
+
391
+ #: .././pages/options.php:199
392
+ msgid "Manage Mailchimp Forms Settings"
393
+ msgstr "Gestisci impostazioni Forms Mailchimp"
394
+
395
+ #: .././pages/options.php:205
396
+ msgid "WordPress Version Number Error"
397
+ msgstr "Wordpress Version"
398
+
399
+ #: .././pages/options.php:206
400
+ msgid ""
401
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
402
+ "You won't be able to access the tinyMCE button to insert forms into pages "
403
+ "and posts unless you update to 3.9 or later."
404
+ msgstr ""
405
+ "Siamo spiacenti, ma sembra che la vostra utilizzando una versione non "
406
+ "aggiornata di WordPress. Non sarà in grado di accedere al pulsante TinyMCE "
407
+ "per inserire moduli in pagine e post a meno che non si aggiorna alla 3.9 o "
408
+ "successiva."
409
+
410
+ #: .././pages/options.php:215
411
+ msgid "LocalHost Detected :"
412
+ msgstr "LocalHost rilevato:"
413
+
414
+ #: .././pages/options.php:216
415
+ msgid ""
416
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
417
+ msgstr "Facile Mailchimp Forme di YIKES, Inc."
418
+
419
+ #: .././pages/options.php:217
420
+ msgid ""
421
+ "If you are unable to validate your API key, and receive the error message"
422
+ msgstr ""
423
+ "Se siete in grado di convalidare la chiave API, e si riceve il messaggio di "
424
+ "errore"
425
+
426
+ #: .././pages/options.php:217
427
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
428
+ msgstr ""
429
+ "\"Problema di certificato SSL: riesce a liberarsi locale certificato "
430
+ "emittente\" "
431
+
432
+ #: .././pages/options.php:217
433
+ msgid "follow the tutorial located "
434
+ msgstr "seguire il tutorial si trova "
435
+
436
+ #: .././pages/options.php:230
437
+ msgid "Your Mailchimp API Key"
438
+ msgstr "Il tuo Mailchimp API Key"
439
+
440
+ #: .././pages/options.php:238
441
+ msgid ""
442
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
443
+ "site to communicate with your MailChimp account."
444
+ msgstr ""
445
+ "Inserisci il tuo API Key MailChimp sopra. L'API Key permette al vostro sito "
446
+ "WordPress per comunicare con il tuo account MailChimp."
447
+
448
+ #: .././pages/options.php:239
449
+ msgid "For more help, visit the MailChimp Support article"
450
+ msgstr "Per ulteriori informazioni, visitare l'articolo MailChimp Support"
451
+
452
+ #: .././pages/options.php:239
453
+ msgid "Where can I find my API Key?"
454
+ msgstr "Dove posso trovare il mio API Key?"
455
+
456
+ #: .././pages/options.php:244
457
+ msgid "Preferred Form Layout"
458
+ msgstr "Preferred Disposizione form"
459
+
460
+ #: .././pages/options.php:247
461
+ msgid "table"
462
+ msgstr "tavolo"
463
+
464
+ #: .././pages/options.php:248
465
+ msgid "div"
466
+ msgstr "div"
467
+
468
+ #: .././pages/options.php:256
469
+ msgid "Choose whether you want your forms to use a table or div layout."
470
+ msgstr ""
471
+ "Scegliere se si desidera che i moduli di utilizzare una tabella o un layout "
472
+ "div."
473
+
474
+ #: .././pages/options.php:261
475
+ msgid "Advanced Error Messaging"
476
+ msgstr "Errore Advanced Messaging"
477
+
478
+ #: .././pages/options.php:264
479
+ msgid "Disabled"
480
+ msgstr "Disabilitato"
481
+
482
+ #: .././pages/options.php:265
483
+ msgid "Enabled"
484
+ msgstr "Abilitato"
485
+
486
+ #: .././pages/options.php:273
487
+ msgid ""
488
+ "Enable if you're having problems with your forms sending data to MailChimp. "
489
+ "Enabling Advanced Error Messaging will show you the exact error codes "
490
+ "MailChimp is returning."
491
+ msgstr ""
492
+ "Attiva se avete problemi con i vostri moduli invio di dati a MailChimp. "
493
+ "Abilitazione Messaging Advanced Error vi mostrerà i codici di errore esatto "
494
+ "MailChimp sta tornando."
495
+
496
+ #: .././pages/options.php:281
497
+ msgid "Single Opt-In"
498
+ msgstr "Singolo Opt-In"
499
+
500
+ #: .././pages/options.php:282
501
+ msgid "Double Opt-In"
502
+ msgstr "Double Opt-In"
503
+
504
+ #: .././pages/options.php:290
505
+ msgid ""
506
+ "A single opt-in will add the user to your list without any further "
507
+ "interaction."
508
+ msgstr ""
509
+ "Un unico opt-in aggiungerà l'utente alla tua lista, senza alcuna ulteriore "
510
+ "interazione."
511
+
512
+ #: .././pages/options.php:291
513
+ msgid ""
514
+ "A double opt-in will send an email to the user asking them to confirm their "
515
+ "subscription."
516
+ msgstr ""
517
+ "Un doppio opt-in invierà una e-mail all'utente chiedendo loro di confermare "
518
+ "il loro abbonamento."
519
+
520
+ #: .././pages/options.php:292
521
+ msgid "This will also dictate the opt-in settings for people leaving comments."
522
+ msgstr ""
523
+ "Questo sarà anche dettare le impostazioni di opt-in per la gente di lasciare "
524
+ "commenti."
525
+
526
+ #: .././pages/options.php:297
527
+ msgid "Custom Opt-In Message"
528
+ msgstr "Personalizzato Opt-In Message"
529
+
530
+ #: .././pages/options.php:299
531
+ msgid "Double Opt-In Message"
532
+ msgstr "Doppio messaggio Opt-In"
533
+
534
+ #: .././pages/options.php:301
535
+ msgid "Single Opt-In Message"
536
+ msgstr "Singolo messaggio Opt-In"
537
+
538
+ #: .././pages/options.php:307
539
+ msgid "Interest Group Label"
540
+ msgstr "Interest Group Label"
541
+
542
+ #: .././pages/options.php:316
543
+ msgid ""
544
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
545
+ "group names."
546
+ msgstr ""
547
+ "Testo da visualizzare sopra gruppi di interesse. Lasciare vuoto per usare "
548
+ "nomi di gruppi di interesse MailChimp."
549
+
550
+ #: .././pages/options.php:321
551
+ msgid "Display opt-in checkbox on comment forms?"
552
+ msgstr "Visualizzazione opt-in casella di controllo commento forme?"
553
+
554
+ #: .././pages/options.php:324
555
+ msgid "Hide"
556
+ msgstr "Nascondere"
557
+
558
+ #: .././pages/options.php:325
559
+ msgid "Show"
560
+ msgstr "Mostrare"
561
+
562
+ #: .././pages/options.php:333
563
+ msgid ""
564
+ "This will display a checkbox just above the submit button on all comment "
565
+ "forms. If selected, any users leaving comments will also be added to the "
566
+ "mailing list."
567
+ msgstr ""
568
+ "Verrà visualizzata una casella di spunta appena sopra il pulsante di invio "
569
+ "per tutte le forme di commento. Se selezionata, tutti gli utenti che "
570
+ "lasciano commenti saranno aggiunti alla mailing list."
571
+
572
+ #: .././pages/options.php:338
573
+ msgid "Custom Comment Checkbox Text"
574
+ msgstr "Commento personalizzata Casella di testo"
575
+
576
+ #: .././pages/options.php:345
577
+ msgid "Default List"
578
+ msgstr "Elenco predefinito"
579
+
580
+ #: .././pages/options.php:360
581
+ msgid ""
582
+ "This is the default list users will be subscribed to when submitting a "
583
+ "comment."
584
+ msgstr ""
585
+ "Questa è la lista degli utenti di default saranno sottoscritte al momento "
586
+ "della presentazione un commento."
587
+
588
+ #: .././pages/options.php:361
589
+ msgid ""
590
+ "It is best to select a form where only the email , first name and/or last "
591
+ "name are required or you may run into issues."
592
+ msgstr ""
593
+ "E 'meglio scegliere un modulo dove solo l'e-mail, nome e / o cognome sono "
594
+ "necessari o si può incorrere in problemi."
595
+
596
+ #: .././pages/options.php:373
597
+ msgid "Plugin Information"
598
+ msgstr "Informazioni Plugin"
599
+
600
+ #: .././pages/options.php:376
601
+ msgid "If you experience any issues with our plugin, please"
602
+ msgstr "Se si verificano problemi con il nostro plugin, per favore"
603
+
604
+ #: .././pages/options.php:376
605
+ msgid "submit a New Issue on our Github Issue Tracker"
606
+ msgstr "Segnala un nuovo problema sul nostro Tracker Github Issue"
607
+
608
+ #: .././pages/options.php:376
609
+ msgid ""
610
+ "Please include the information below to help us troubleshoot your problem."
611
+ msgstr ""
612
+ "Si prega di includere le informazioni qui sotto per aiutarci a risolvere i "
613
+ "problemi il vostro problema."
614
+
615
+ #: .././pages/options.php:384
616
+ msgid "Plugin Version"
617
+ msgstr "Plugin Version"
618
+
619
+ #: .././pages/options.php:388
620
+ msgid "Wordpress Version"
621
+ msgstr "Wordpress Version"
622
+
623
+ #: .././pages/options.php:392
624
+ msgid "Browser Information"
625
+ msgstr "Informazioni Browser"
626
+
627
+ #: .././pages/options.php:420
628
+ msgid "Error"
629
+ msgstr "Errore"
630
+
631
+ #: .././pages/options.php:421
632
+ msgid ""
633
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
634
+ "cURL to send and retreive data."
635
+ msgstr ""
636
+ "Siamo spiacenti, ma cURL è attivato per il tuo server. L'API MailChimp "
637
+ "utilizza cURL per inviare e prelevare dati."
638
+
639
+ #: .././pages/options.php:426
640
+ msgid "Help!"
641
+ msgstr "Aiutatemi!"
642
+
643
+ #: .././pages/options.php:426
644
+ msgid "What is cURL?"
645
+ msgstr "Che cosa è cURL?"
646
+
647
+ #: .././pages/options.php:426
648
+ msgid "Check phpinfo()"
649
+ msgstr "Controllare phpinfo ()"
650
+
651
+ #: .././pages/options.php:428
652
+ msgid "Steps To Resolve The Issue"
653
+ msgstr "Passi per risolvere il problema"
654
+
655
+ #: .././pages/options.php:430
656
+ msgid ""
657
+ "You can enable cURL by turning on the cURL module within your php.ini file"
658
+ msgstr ""
659
+ "È possibile abilitare cURL girando sul modulo cURL all'interno del file php."
660
+ "ini"
661
+
662
+ #: .././pages/options.php:430
663
+ msgid "You should find the php.ini file located here : "
664
+ msgstr "Si dovrebbe trovare il file php.ini si trova qui: "
665
+
666
+ #: .././pages/options.php:431
667
+ msgid ""
668
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
669
+ msgstr ""
670
+ "Una volta trovata, aprire php.ini e individuare la linea \"; extension = "
671
+ "php_curl.dll\"."
672
+
673
+ #: .././pages/options.php:432
674
+ msgid ""
675
+ "Remove the semi colon before the line, to un-comment it and make the module "
676
+ "active."
677
+ msgstr ""
678
+ "Rimuovere il punto e virgola prima della linea, di non-commento e rendere il "
679
+ "modulo attivo."
680
+
681
+ #: .././pages/options.php:433
682
+ msgid "Re-save and close the file."
683
+ msgstr "Re-salvare e chiudere il file."
684
+
685
+ #: .././pages/options.php:434
686
+ msgid "Re-load this page."
687
+ msgstr "Re-caricare questa pagina."
688
+
689
+ #: .././templates/shortcode_error.php:1
690
+ msgid "There was an error calling the mailchimp list."
691
+ msgstr "Si è verificato un errore chiamando la lista MailChimp."
692
+
693
+ #: .././templates/shortcode_error_data.php:1
694
+ msgid ""
695
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
696
+ "List Forms\" page."
697
+ msgstr ""
698
+ "L'elenco non esiste! Assicurarsi di aver importato la lista \"Gestione "
699
+ "moduli elenco\" pagina."
700
+
701
+ #: .././templates/shortcode_error_exists.php:1
702
+ msgid "This list was already placed on this page!"
703
+ msgstr "Questo elenco è stato già pubblicato su questa pagina!"
704
+
705
+ #: .././templates/shortcode_error_no_API_key.php:1
706
+ msgid "Woops! No Valid API Key Found. Double check your settings."
707
+ msgstr "Woops! No API Key valido Trovato. Doppia verificare le impostazioni."
708
+
709
+ #: .././templates/shortcode_form.php:11
710
+ msgid "Oops.. Don't forget to fill-in the following fields"
711
+ msgstr "Oops .. Non dimenticare di compilare i seguenti campi"
712
+
713
+ #: .././templates/shortcode_form.php:74
714
+ msgid "required field"
715
+ msgstr "campo obbligatorio"
716
+
717
+ #: .././templates/yikes-mailchimp-widget.php:15
718
+ #: .././templates/yikes-mailchimp-widget.php:18
719
+ msgid "MailChimp Signup Form"
720
+ msgstr "MailChimp Modulo di iscrizione"
721
+
722
+ #: .././templates/yikes-mailchimp-widget.php:27
723
+ msgid "Select Which Form You Would Like To Display:"
724
+ msgstr "Selezionare quale forma si desidera visualizzare:"
725
+
726
+ #: .././templates/yikes-mailchimp-widget.php:30
727
+ msgid "Select a Form to Display"
728
+ msgstr "Selezionare un modulo per la visualizzazione"
729
+
730
+ #: .././templates/yikes-mailchimp-widget.php:47
731
+ msgid "Please import MailChimp forms"
732
+ msgstr "Si prega di importare forme MailChimp"
733
+
734
+ #: .././templates/yikes-mailchimp-widget.php:49
735
+ msgid "Please import some lists from MailChimp"
736
+ msgstr "Si prega di importare alcune liste da MailChimp"
737
+
738
+ #: .././templates/yikes-mailchimp-widget.php:52
739
+ msgid "Import Lists Now"
740
+ msgstr "Elenchi Importa"
741
+
742
+ #: .././templates/yikes-mailchimp-widget.php:73
743
+ msgid ""
744
+ "Oops! It looks like you haven't imported any lists yet. You must import at "
745
+ "least one list to use the Easy MailChimp widget."
746
+ msgstr ""
747
+ "Oops! Sembra che tu non hai ancora importato elenchi. È necessario importare "
748
+ "almeno un elenco per utilizzare il widget Facile MailChimp."
749
+
750
+ #: .././templates/yikes-mailchimp-widget.php:80
751
+ msgid ""
752
+ "Oops! It looks like you forgot to select a form to display here. Go to "
753
+ "'Appearance > Widgets' and select a form to display."
754
+ msgstr ""
755
+ "Oops! Sembra che ti sei dimenticato di selezionare un modulo per "
756
+ "visualizzare qui. Vai a 'Aspetto> Widget' e scegliere un modulo da "
757
+ "visualizzare."
758
+
759
+ #: .././templates/yikes-mailchimp-widget.php:117
760
+ msgid "Sign Up For Our Newsletter"
761
+ msgstr "Iscriviti alla nostra Newsletter"
762
+
763
+ #: .././templates/yikes-mailchimp-widget.php:129
764
+ msgid "Sign Me Up"
765
+ msgstr "Sign Me Up"
766
+
767
+ #: .././templates/yikes-mailchimp-widget.php:133
768
+ msgid "Title:"
769
+ msgstr "Titolo:"
770
+
771
+ #: .././templates/yikes-mailchimp-widget.php:138
772
+ msgid "Form Text:"
773
+ msgstr "Forma del testo:"
774
+
775
+ #: .././templates/yikes-mailchimp-widget.php:146
776
+ msgid "Submit Button Text:"
777
+ msgstr "Submit Button Text:"
778
+
779
+ #: .././templates/yikes-mailchimp-widget.php:156
780
+ msgid "Oops! It looks like you haven't added your API key! Head over to the"
781
+ msgstr "Oops! Sembra che tu non hai aggiunto la chiave API! Andate a"
782
+
783
+ #: .././templates/yikes-mailchimp-widget.php:156
784
+ msgid "Settings page"
785
+ msgstr "Pagina Impostazioni"
786
+
787
+ #~ msgid "No API Key or List Id Exist!"
788
+ #~ msgstr "Nessuna chiave API o Elenco Id esistono!"
languages/yikes-inc-easy-mailchimp-extender-ja.mo ADDED
Binary file
languages/yikes-inc-easy-mailchimp-extender-ja.po ADDED
@@ -0,0 +1,781 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Yikes Inc. Easy MailChimp Plugin\n"
4
+ "POT-Creation-Date: 2014-04-23 13:37-0500\n"
5
+ "PO-Revision-Date: 2014-04-23 14:51-0500\n"
6
+ "Last-Translator: Evan <evan.m.herman@gmail.com>\n"
7
+ "Language-Team: Yikes Inc. <evan@yikesinc.com>\n"
8
+ "Language: ja_JP\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Generator: Poedit 1.6.4\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-SearchPath-0: ../.\n"
17
+
18
+ #: .././classes/class.yksemeBase.php:114
19
+ #: .././classes/class.yksemeBase.php:1287
20
+ msgid "Thank You for subscribing!"
21
+ msgstr "サブスクライブしていただきありがとうございます!"
22
+
23
+ #: .././classes/class.yksemeBase.php:115
24
+ #: .././classes/class.yksemeBase.php:1288
25
+ msgid ""
26
+ "Thank You for subscribing! Check your email for the confirmation message."
27
+ msgstr ""
28
+ "サブスクライブしていただきありがとうございます!確認メッセージのためにあなた"
29
+ "の電子メールをチェックしてください。"
30
+
31
+ #: .././classes/class.yksemeBase.php:116
32
+ msgid "Select Your Area of Interest"
33
+ msgstr "対象エリアを選択"
34
+
35
+ #: .././classes/class.yksemeBase.php:917
36
+ msgid "Click on a subscriber to see further information"
37
+ msgstr "それらに電子メールを送信し、加入者をクリックして"
38
+
39
+ #: .././classes/class.yksemeBase.php:920
40
+ msgid "E-Mail"
41
+ msgstr "メール"
42
+
43
+ #: .././classes/class.yksemeBase.php:921
44
+ msgid "Date Subscribed"
45
+ msgstr "日付サブスクライブ"
46
+
47
+ #: .././classes/class.yksemeBase.php:941
48
+ msgid "Sorry You Don't Currently Have Any Subscribers In This List!"
49
+ msgstr "申し訳ありませんが、現在、このリスト内の任意の加​​入者を持っていない!"
50
+
51
+ #: .././classes/class.yksemeBase.php:998
52
+ msgid "Back to Subscriber List"
53
+ msgstr "加入者数"
54
+
55
+ #: .././classes/class.yksemeBase.php:999
56
+ msgid "Subscriber Details"
57
+ msgstr "加入者の詳細"
58
+
59
+ #: .././classes/class.yksemeBase.php:1010
60
+ msgid "Overview"
61
+ msgstr "はじめに"
62
+
63
+ #: .././classes/class.yksemeBase.php:1015
64
+ msgid "First Name"
65
+ msgstr "お名前(名)"
66
+
67
+ #: .././classes/class.yksemeBase.php:1018
68
+ msgid "Last Updated"
69
+ msgstr "最終更新日"
70
+
71
+ #: .././classes/class.yksemeBase.php:1021
72
+ msgid "Preferred Email Type"
73
+ msgstr "好ましい形レイアウト"
74
+
75
+ #: .././classes/class.yksemeBase.php:1028
76
+ msgid "Last Name"
77
+ msgstr "お名前(姓)"
78
+
79
+ #: .././classes/class.yksemeBase.php:1031
80
+ msgid "Language"
81
+ msgstr "言語"
82
+
83
+ #: .././classes/class.yksemeBase.php:1054
84
+ msgid "Groups Subscribed To"
85
+ msgstr "日付サブスクライブ"
86
+
87
+ #: .././classes/class.yksemeBase.php:1104
88
+ msgid "Subscriber Notes"
89
+ msgstr "加入者の注意"
90
+
91
+ #: .././classes/class.yksemeBase.php:1109
92
+ msgid "Written by"
93
+ msgstr "によって書かれた"
94
+
95
+ #: .././classes/class.yksemeBase.php:1109
96
+ msgid "Created on"
97
+ msgstr "上で作成"
98
+
99
+ #: .././classes/class.yksemeBase.php:1251
100
+ #: .././classes/class.yksemeBase.php:1253
101
+ msgid "MailChimp Forms"
102
+ msgstr "MailChimpフォーム"
103
+
104
+ #: .././classes/class.yksemeBase.php:1253
105
+ msgid "MailChimp Settings"
106
+ msgstr "MailChimp設定"
107
+
108
+ #: .././classes/class.yksemeBase.php:1254
109
+ msgid "Manage List Forms"
110
+ msgstr "リストフォームを管理"
111
+
112
+ #: .././classes/class.yksemeBase.php:1255 .././pages/about.php:5
113
+ msgid "About YIKES, Inc."
114
+ msgstr "約 YIKES, In."
115
+
116
+ #: .././classes/class.yksemeBase.php:1430
117
+ msgid "One or more fields are empty"
118
+ msgstr "つまたは複数のフィールドは空です"
119
+
120
+ #: .././classes/class.yksemeBase.php:1480
121
+ msgid "Your List Was Successfully Saved!"
122
+ msgstr "あなたのリストが正常に保存されました!"
123
+
124
+ #: .././classes/class.yksemeBase.php:1482
125
+ msgid "I'm sorry there was an error with your request."
126
+ msgstr "私はあなたの要求でエラーが発生したごめんなさい。"
127
+
128
+ #: .././classes/class.yksemeBase.php:1488
129
+ msgid "MailChimp List name"
130
+ msgstr "MailChimpリスト名"
131
+
132
+ #: .././classes/class.yksemeBase.php:1494
133
+ #: .././classes/class.yksemeBase.php:1504
134
+ #, php-format
135
+ msgid "%1$s"
136
+ msgstr ""
137
+
138
+ #: .././classes/class.yksemeBase.php:1512
139
+ msgid "MailChimp List ID"
140
+ msgstr "MailChimpリストのID"
141
+
142
+ #: .././classes/class.yksemeBase.php:1518
143
+ msgid "Shortcode"
144
+ msgstr "ショートコード"
145
+
146
+ #: .././classes/class.yksemeBase.php:1521
147
+ msgid ""
148
+ "Paste this shortcode into whatever page or post you want to add this form to"
149
+ msgstr ""
150
+ "あなたはこのフォームを追加したい任意のページや投稿にこのショートコードを貼り"
151
+ "付け"
152
+
153
+ #: .././classes/class.yksemeBase.php:1526
154
+ msgid "PHP Snippet"
155
+ msgstr "PHPのスニペット"
156
+
157
+ #: .././classes/class.yksemeBase.php:1529
158
+ msgid "Use this code to add this form to a template file"
159
+ msgstr ""
160
+ "テンプレートファイルにこのフォームを追加するには、このコードを使用します。"
161
+
162
+ #: .././classes/class.yksemeBase.php:1534
163
+ msgid "Number of Subscribers"
164
+ msgstr "加入者数"
165
+
166
+ #: .././classes/class.yksemeBase.php:1543
167
+ msgid "Form Fields"
168
+ msgstr "フォームフィールド"
169
+
170
+ #: .././classes/class.yksemeBase.php:1545
171
+ msgid ""
172
+ "Check the fields you want included in your form (Email Address is required)."
173
+ msgstr ""
174
+ "あなたは、フォームに含めるフィールドをチェックします(電子メールアドレスが必"
175
+ "要です)。"
176
+
177
+ #: .././classes/class.yksemeBase.php:1548
178
+ msgid ""
179
+ "Use the green arrows to drag-and-drop the fields and rearrange their order."
180
+ msgstr ""
181
+ "ドラッグ&ドロップのフィールドをし、その順序を変更するには、緑色の矢印を使用"
182
+ "してください。"
183
+
184
+ #: .././classes/class.yksemeBase.php:1554
185
+ msgid "Active Fields"
186
+ msgstr "アクティブフィールド"
187
+
188
+ #: .././classes/class.yksemeBase.php:1563
189
+ msgid "Drag"
190
+ msgstr "スライダーを"
191
+
192
+ #: .././classes/class.yksemeBase.php:1563
193
+ msgid "drop"
194
+ msgstr "ドロップ"
195
+
196
+ #: .././classes/class.yksemeBase.php:1568
197
+ msgid "Merge field"
198
+ msgstr "差し込みフィールドの"
199
+
200
+ #: .././classes/class.yksemeBase.php:1569
201
+ msgid "Placeholder"
202
+ msgstr "プレースホルダ"
203
+
204
+ #: .././classes/class.yksemeBase.php:1577
205
+ msgid "Redirect User On Submission"
206
+ msgstr "送信時にユーザーをリダイレクト"
207
+
208
+ #: .././classes/class.yksemeBase.php:1581
209
+ msgid "choose a page to redirect the user to after they submit the form."
210
+ msgstr ""
211
+ "ページを選択したり、フォームを送信した後にユーザーをリダイレクトするためのカ"
212
+ "スタムURLを設定します"
213
+
214
+ #: .././classes/class.yksemeBase.php:1584
215
+ msgid "Select A Post/Page"
216
+ msgstr "ページを選択します"
217
+
218
+ #: .././classes/class.yksemeBase.php:1638
219
+ msgid "Save Form Settings"
220
+ msgstr "Mailchimpフォームの設定を管理"
221
+
222
+ #: .././classes/class.yksemeBase.php:1639
223
+ msgid "Delete Form"
224
+ msgstr "フォームを削除"
225
+
226
+ #: .././classes/class.yksemeBase.php:1640
227
+ msgid "Re-Import Form Fields from MailChimp"
228
+ msgstr "MailChimpからいくつかのリストをインポートしてください"
229
+
230
+ #: .././classes/class.yksemeBase.php:2168
231
+ msgid "Sign Me Up For MAILCHIMP-REPLACE-THIS-TEXT's Newsletter"
232
+ msgstr "MAILCHIMP-REPLACE-THIS-TEXTのニュースレターのために私をサインアップ"
233
+
234
+ #: .././pages/about.php:27
235
+ msgid "YIKES, Inc. Web Design and Development"
236
+ msgstr "YIKES, Inc. のWebデザインと開発"
237
+
238
+ #: .././pages/about.php:29
239
+ msgid "Smart, effective, beautifully designed web solutions"
240
+ msgstr "スマートな、効果的な、美しいデザインのWebソリューション"
241
+
242
+ #: .././pages/about.php:32
243
+ msgid ""
244
+ "YIKES is located in the Fishtown neighborhood of Philadelphia where we build "
245
+ "custom WordPress themes and plugins every day."
246
+ msgstr ""
247
+ "YIKES は私たちが毎日のカスタムWordPressのテーマやプラグインをビルドし、フィラ"
248
+ "デルフィアのFishtown周辺に位置します。"
249
+
250
+ #: .././pages/about.php:36
251
+ msgid ""
252
+ "At YIKES we love WordPress! Co-Owner, Tracy Levesque has presented at "
253
+ "WordCamps"
254
+ msgstr ""
255
+ "YIKESで私たちはWordPressのが大好き!共同所有者、トレイシーレベスクはWordCamps"
256
+ "で発表しました"
257
+
258
+ #: .././pages/about.php:36
259
+ msgid "and"
260
+ msgstr "そして友人たち!"
261
+
262
+ #: .././pages/about.php:36
263
+ msgid "She also teaches WordPress classes for"
264
+ msgstr "彼女はまたのためのワードプレスのクラスを教えている"
265
+
266
+ #: .././pages/about.php:40
267
+ msgid ""
268
+ "In addition to making great WordPress sites we are also committed to the "
269
+ "sustainable business movement. We observe the triple bottom line: people, "
270
+ "planet, profit and work to help build a more socially, environmentally and "
271
+ "financially sustainable local economy. We even have a"
272
+ msgstr ""
273
+ "偉大なWordPressのサイトを作ることに加えて、我々はまた、持続可能なビジネスの動"
274
+ "きにコミットしている。より多くの社会的、環境的および経済的に持続可能な地域経"
275
+ "済の構築を支援する人々、地球、利益、仕事:私たちは、トリプルボトムラインを観"
276
+ "察します。私たちも持っている"
277
+
278
+ #: .././pages/about.php:40
279
+ msgid "LEED Platinum office"
280
+ msgstr "LEEDプラチナオフィス"
281
+
282
+ #: .././pages/about.php:44
283
+ msgid ""
284
+ "If you're interested in hiring us for WordPress development, or just want to "
285
+ "learn more about us, please visit"
286
+ msgstr ""
287
+ "あなたがワードプレスの開発のための私たちの雇用に興味を持っているか、単に私た"
288
+ "ちの詳細を知りたい場合は、以下をご覧ください"
289
+
290
+ #: .././pages/lists.php:8
291
+ msgid "No forms have been added yet."
292
+ msgstr "no形式はまだ追加されていません。"
293
+
294
+ #: .././pages/lists.php:39
295
+ msgid "Oops.. The list ID you entered appears to be incorrect."
296
+ msgstr "おっと..あなたが入力したリストIDが誤っているように見えます。"
297
+
298
+ #: .././pages/lists.php:44
299
+ msgid "There was an error!"
300
+ msgstr "エラーが発生しました!"
301
+
302
+ #: .././pages/lists.php:135
303
+ msgid "You need to select a Mailchimp list in order to create a form for it"
304
+ msgstr ""
305
+ "あなたはそれのためのフォームを作成するために、Mailchimpリストを選択する必要が"
306
+ "あります"
307
+
308
+ #: .././pages/lists.php:173
309
+ msgid "Are you sure you want to delete this form?"
310
+ msgstr "あなたが退会してもよろしいですか"
311
+
312
+ #: .././pages/lists.php:206
313
+ msgid "Are you sure you want to re-import your fields from MailChimp?"
314
+ msgstr "あなたはMailChimpからフィールドを再インポートしてもよろしいですか?"
315
+
316
+ #: .././pages/lists.php:228
317
+ msgid "Looks like this form is already up to date!"
318
+ msgstr "このフォームはすでに最新であるように見えます!"
319
+
320
+ #: .././pages/lists.php:326
321
+ msgid "Are you sure you want to unsubscribe"
322
+ msgstr "あなたが退会してもよろしいですか"
323
+
324
+ #: .././pages/lists.php:326
325
+ msgid "from this list?"
326
+ msgstr "このリストの中に?"
327
+
328
+ #: .././pages/lists.php:342
329
+ msgid "was successfully unsubscribed from this list."
330
+ msgstr "このリストから正常に退会した。"
331
+
332
+ #: .././pages/lists.php:448 .././pages/options.php:196
333
+ #: .././pages/options.php:416
334
+ msgid "Easy Mailchimp Forms by YIKES, Inc."
335
+ msgstr "YIKES, Inc.で簡単Mailchimpフォーム"
336
+
337
+ #: .././pages/lists.php:454
338
+ msgid "Before you can add MailChimp forms to your site, you need to"
339
+ msgstr ""
340
+ "あなたのサイトにMailChimpフォームを追加する前に、以下を行う必要があります"
341
+
342
+ #: .././pages/lists.php:454
343
+ msgid "go to the MailChimp Settings page"
344
+ msgstr "MailChimp設定ページに移動"
345
+
346
+ #: .././pages/lists.php:454 .././templates/yikes-mailchimp-widget.php:156
347
+ msgid "and add your API Key."
348
+ msgstr "そして、あなたのAPIキーを追加します。"
349
+
350
+ #: .././pages/lists.php:462
351
+ msgid "You must enter a valid API key to import and manage your lists."
352
+ msgstr ""
353
+ "あなたのリストをインポートし、管理するための有効なAPIキーを入力する必要があり"
354
+ "ます。"
355
+
356
+ #: .././pages/lists.php:473
357
+ msgid "Your Lists"
358
+ msgstr "あなたのリスト"
359
+
360
+ #: .././pages/lists.php:483
361
+ msgid "Manage Forms"
362
+ msgstr "フォームの管理"
363
+
364
+ #: .././pages/options.php:41
365
+ msgid "The options were saved successfully!"
366
+ msgstr "オプションが正常に保存されました!"
367
+
368
+ #: .././pages/options.php:44
369
+ msgid "The options could not be saved (or you did not change them)."
370
+ msgstr ""
371
+ "オプションを保存できませんでした(またはあなたがそれらを変更していない)。"
372
+
373
+ #: .././pages/options.php:96
374
+ msgid "Valid API Key"
375
+ msgstr "有効なAPIキー"
376
+
377
+ #: .././pages/options.php:102
378
+ msgid "Sorry, that is an invalid MailChimp API key."
379
+ msgstr "申し訳ありませんが、それは無効MailChimp APIキーです。"
380
+
381
+ #: .././pages/options.php:108
382
+ msgid ""
383
+ "Sorry, that is an invalid MailChimp API key. Please check the console for "
384
+ "further information."
385
+ msgstr "申し訳ありませんが、それは無効MailChimp APIキーです。"
386
+
387
+ #: .././pages/options.php:117
388
+ msgid "Error: Please enter a valid Mail Chimp API Key."
389
+ msgstr "エラー:有効なメールチンパンジーAPIキーを入力してください。"
390
+
391
+ #: .././pages/options.php:199
392
+ msgid "Manage Mailchimp Forms Settings"
393
+ msgstr "Mailchimpフォームの設定を管理"
394
+
395
+ #: .././pages/options.php:205
396
+ msgid "WordPress Version Number Error"
397
+ msgstr "Wordpressのバージョン"
398
+
399
+ #: .././pages/options.php:206
400
+ msgid ""
401
+ "We're sorry, but it looks like your using an outdated version of WordPress. "
402
+ "You won't be able to access the tinyMCE button to insert forms into pages "
403
+ "and posts unless you update to 3.9 or later."
404
+ msgstr ""
405
+ "大変申し訳ございませんが、あなたがワードプレスの古いバージョンを使用してのよ"
406
+ "うに見えます。あなたが3.9以降にアップデートしていない限り、ページや投稿に"
407
+ "フォームを挿入するにはTinyMCEのボタンにアクセスできなくなります。"
408
+
409
+ #: .././pages/options.php:215
410
+ msgid "LocalHost Detected :"
411
+ msgstr "ローカルホストに検出されました:"
412
+
413
+ #: .././pages/options.php:216
414
+ msgid ""
415
+ "It looks like your using Easy MailChimp Forms by YIKES Inc. on localhost."
416
+ msgstr "YIKES, Inc.で簡単Mailchimpフォーム"
417
+
418
+ #: .././pages/options.php:217
419
+ msgid ""
420
+ "If you are unable to validate your API key, and receive the error message"
421
+ msgstr ""
422
+ "あなたのAPIキーを検証することができない、とエラーメッセージが表示された場合"
423
+
424
+ #: .././pages/options.php:217
425
+ msgid "\"SSL certificate problem: unable to get local issuer certificate\" "
426
+ msgstr "\"SSL証明書の問題:ローカル発行者証明書のを取得できません」"
427
+
428
+ #: .././pages/options.php:217
429
+ msgid "follow the tutorial located "
430
+ msgstr "位置チュートリアルに従う"
431
+
432
+ #: .././pages/options.php:230
433
+ msgid "Your Mailchimp API Key"
434
+ msgstr "あなたMailchimp APIキー"
435
+
436
+ #: .././pages/options.php:238
437
+ msgid ""
438
+ "Please enter your MailChimp API Key above. The API Key allows your WordPress "
439
+ "site to communicate with your MailChimp account."
440
+ msgstr ""
441
+ "上記のあなたのMailChimp APIキーを入力してください。 APIキーは、WordPressのサ"
442
+ "イトがMailChimpアカウントと通信することができます。"
443
+
444
+ #: .././pages/options.php:239
445
+ msgid "For more help, visit the MailChimp Support article"
446
+ msgstr "詳細なヘルプについては、MailChimpサポート記事にアクセスしてください"
447
+
448
+ #: .././pages/options.php:239
449
+ msgid "Where can I find my API Key?"
450
+ msgstr "どこでAPIキーを見つけることができますか?"
451
+
452
+ #: .././pages/options.php:244
453
+ msgid "Preferred Form Layout"
454
+ msgstr "好ましい形レイアウト"
455
+
456
+ #: .././pages/options.php:247
457
+ msgid "table"
458
+ msgstr "テーブル"
459
+
460
+ #: .././pages/options.php:248
461
+ msgid "div"
462
+ msgstr "DIV"
463
+
464
+ #: .././pages/options.php:256
465
+ msgid "Choose whether you want your forms to use a table or div layout."
466
+ msgstr ""
467
+ "あなたのフォームがテーブルまたはDIVレイアウトを使用するかどうかを選択します。"
468
+
469
+ #: .././pages/options.php:261
470
+ msgid "Advanced Error Messaging"
471
+ msgstr "高度なエラー·メッセージ"
472
+
473
+ #: .././pages/options.php:264
474
+ msgid "Disabled"
475
+ msgstr "無効"
476
+
477
+ #: .././pages/options.php:265
478
+ msgid "Enabled"
479
+ msgstr "有効"
480
+
481
+ #: .././pages/options.php:273
482
+ msgid ""
483
+ "Enable if you're having problems with your forms sending data to MailChimp. "
484
+ "Enabling Advanced Error Messaging will show you the exact error codes "
485
+ "MailChimp is returning."
486
+ msgstr ""
487
+ "あなたのフォームがMailChimpへのデータ送信に問題がある場合有効にします。高度な"
488
+ "エラーメッセージを有効にすると、あなたにMailChimpが戻っている正確なエラーコー"
489
+ "ドが表示されます。"
490
+
491
+ #: .././pages/options.php:281
492
+ msgid "Single Opt-In"
493
+ msgstr "シングルオプトイン"
494
+
495
+ #: .././pages/options.php:282
496
+ msgid "Double Opt-In"
497
+ msgstr "ダブルオプトイン"
498
+
499
+ #: .././pages/options.php:290
500
+ msgid ""
501
+ "A single opt-in will add the user to your list without any further "
502
+ "interaction."
503
+ msgstr ""
504
+ "シングルオプトインはそれ以上の操作なしにあなたのリストにユーザーを追加しま"
505
+ "す。"
506
+
507
+ #: .././pages/options.php:291
508
+ msgid ""
509
+ "A double opt-in will send an email to the user asking them to confirm their "
510
+ "subscription."
511
+ msgstr ""
512
+ "ダブルオプトインでは、サブスクリプションを確認するためにそれらを求めるユー"
513
+ "ザーに電子メールを送信いたします。"
514
+
515
+ #: .././pages/options.php:292
516
+ msgid "This will also dictate the opt-in settings for people leaving comments."
517
+ msgstr "また、これは、コメントを残す人々のためのオプトインの設定を決定します。"
518
+
519
+ #: .././pages/options.php:297
520
+ msgid "Custom Opt-In Message"
521
+ msgstr "カスタムオプトインのメッセージ"
522
+
523
+ #: .././pages/options.php:299
524
+ msgid "Double Opt-In Message"
525
+ msgstr "ダブルオプトインのメッセージ"
526
+
527
+ #: .././pages/options.php:301
528
+ msgid "Single Opt-In Message"
529
+ msgstr "シングルオプトインメッセージ"
530
+
531
+ #: .././pages/options.php:307
532
+ msgid "Interest Group Label"
533
+ msgstr "インタレストグループラベル"
534
+
535
+ #: .././pages/options.php:316
536
+ msgid ""
537
+ "Text to display above interest groups. Leave blank to use MailChimp interest "
538
+ "group names."
539
+ msgstr ""
540
+ "利益団体の上に表示されるテキスト。 MailChimp金利グループ名を使用する場合は空"
541
+ "白のまま。"
542
+
543
+ #: .././pages/options.php:321
544
+ msgid "Display opt-in checkbox on comment forms?"
545
+ msgstr "表示コメントフォームのチェックボックスにオプトイン?"
546
+
547
+ #: .././pages/options.php:324
548
+ msgid "Hide"
549
+ msgstr "閉じる"
550
+
551
+ #: .././pages/options.php:325
552
+ msgid "Show"
553
+ msgstr "凡例の表示"
554
+
555
+ #: .././pages/options.php:333
556
+ msgid ""
557
+ "This will display a checkbox just above the submit button on all comment "
558
+ "forms. If selected, any users leaving comments will also be added to the "
559
+ "mailing list."
560
+ msgstr ""
561
+ "これは単に、すべてのコメントフォームの送信ボタンの上にあるチェックボックスが"
562
+ "表示されます。選択した場合は、コメントを残してすべてのユーザーには、メーリン"
563
+ "グ·リストに追加されます。"
564
+
565
+ #: .././pages/options.php:338
566
+ msgid "Custom Comment Checkbox Text"
567
+ msgstr "カスタムコメントチェックボックスのテキスト"
568
+
569
+ #: .././pages/options.php:345
570
+ msgid "Default List"
571
+ msgstr "デフォルトのリスト"
572
+
573
+ #: .././pages/options.php:360
574
+ msgid ""
575
+ "This is the default list users will be subscribed to when submitting a "
576
+ "comment."
577
+ msgstr ""
578
+ "これはデフォルトのリストのユーザーがコメントを提出する際にサブスクライブされ"
579
+ "ている。"
580
+
581
+ #: .././pages/options.php:361
582
+ msgid ""
583
+ "It is best to select a form where only the email , first name and/or last "
584
+ "name are required or you may run into issues."
585
+ msgstr ""
586
+ "これは、電子メール、名、および/またはラストネームのみが必要とされるか、問題が"
587
+ "発生する可能性があり、フォームを選択することをお勧めします。"
588
+
589
+ #: .././pages/options.php:373
590
+ msgid "Plugin Information"
591
+ msgstr "プラグイン情報"
592
+
593
+ #: .././pages/options.php:376
594
+ msgid "If you experience any issues with our plugin, please"
595
+ msgstr "あなたは私たちのプラグインで問題が発生した場合は、してください"
596
+
597
+ #: .././pages/options.php:376
598
+ msgid "submit a New Issue on our Github Issue Tracker"
599
+ msgstr "私たちのGitHubの課題トラッカー上で新たな課題を提出"
600
+
601
+ #: .././pages/options.php:376
602
+ msgid ""
603
+ "Please include the information below to help us troubleshoot your problem."
604
+ msgstr ""
605
+ "私たちはあなたの問題のトラブルシューティングに役立つ以下の情報を含めてくださ"
606
+ "い。"
607
+
608
+ #: .././pages/options.php:384
609
+ msgid "Plugin Version"
610
+ msgstr "プラグインバージョン"
611
+
612
+ #: .././pages/options.php:388
613
+ msgid "Wordpress Version"
614
+ msgstr "Wordpressのバージョン"
615
+
616
+ #: .././pages/options.php:392
617
+ msgid "Browser Information"
618
+ msgstr "ブラウザ情報"
619
+
620
+ #: .././pages/options.php:420
621
+ msgid "Error"
622
+ msgstr "エラー"
623
+
624
+ #: .././pages/options.php:421
625
+ msgid ""
626
+ "We're sorry, but cURL is disabled on your server. The MailChimp API utilizes "
627
+ "cURL to send and retreive data."
628
+ msgstr ""
629
+ "申し訳ございませんが、カール、サーバーで無効になっている。 MailChimp APIは、"
630
+ "データを送信し、地震するカールを利用しています。"
631
+
632
+ #: .././pages/options.php:426
633
+ msgid "Help!"
634
+ msgstr "助けて"
635
+
636
+ #: .././pages/options.php:426
637
+ msgid "What is cURL?"
638
+ msgstr "カールは何ですか?"
639
+
640
+ #: .././pages/options.php:426
641
+ msgid "Check phpinfo()"
642
+ msgstr "は、phpinfoを確認してください()"
643
+
644
+ #: .././pages/options.php:428
645
+ msgid "Steps To Resolve The Issue"
646
+ msgstr "問題を解決するには、手順"
647
+
648
+ #: .././pages/options.php:430
649
+ msgid ""
650
+ "You can enable cURL by turning on the cURL module within your php.ini file"
651
+ msgstr ""
652
+ "あなたは、php.iniファイル内のcURLモジュールをオンにすることでカールを有効にす"
653
+ "ることができます"
654
+
655
+ #: .././pages/options.php:430
656
+ msgid "You should find the php.ini file located here : "
657
+ msgstr "あなたがここにあるphp.iniファイルを見つける必要があります。"
658
+
659
+ #: .././pages/options.php:431
660
+ msgid ""
661
+ "Once found, open up php.ini and locate the line \";extension=php_curl.dll\"."
662
+ msgstr "一度発見、php.iniのを開くとラインを見つけ \";拡張子= php_curl.dll \"。"
663
+
664
+ #: .././pages/options.php:432
665
+ msgid ""
666
+ "Remove the semi colon before the line, to un-comment it and make the module "
667
+ "active."
668
+ msgstr ""
669
+ "アンコメントして、モジュールをアクティブにするには、行の前にセミコロンを削除"
670
+ "してください。"
671
+
672
+ #: .././pages/options.php:433
673
+ msgid "Re-save and close the file."
674
+ msgstr "再ファイルを保存して閉じます。"
675
+
676
+ #: .././pages/options.php:434
677
+ msgid "Re-load this page."
678
+ msgstr "このページを再ロードします。"
679
+
680
+ #: .././templates/shortcode_error.php:1
681
+ msgid "There was an error calling the mailchimp list."
682
+ msgstr "mailchimpリストを呼び出してエラーが発生しました。"
683
+
684
+ #: .././templates/shortcode_error_data.php:1
685
+ msgid ""
686
+ "The list doesn't exist! Make sure you have imported the list on the \"Manage "
687
+ "List Forms\" page."
688
+ msgstr ""
689
+ "リストは存在しません!あなたは「リストフォームの管理\"ページをのリストをイン"
690
+ "ポートしたことを確認します。"
691
+
692
+ #: .././templates/shortcode_error_exists.php:1
693
+ msgid "This list was already placed on this page!"
694
+ msgstr "このリストはすでにこのページに掲載されました!"
695
+
696
+ #: .././templates/shortcode_error_no_API_key.php:1
697
+ msgid "Woops! No Valid API Key Found. Double check your settings."
698
+ msgstr ""
699
+ "オエーッと吐く!見つかった有効なAPIキーはありません。二重の設定を確認してくだ"
700
+ "さい。"
701
+
702
+ #: .././templates/shortcode_form.php:11
703
+ msgid "Oops.. Don't forget to fill-in the following fields"
704
+ msgstr "おっと..フィルイン次のフィールドを忘れてはいけない。"
705
+
706
+ #: .././templates/shortcode_form.php:74
707
+ msgid "required field"
708
+ msgstr "必要なフィールド"