Content Egg - Version 1.6.0

Version Description

  • Initial release.
Download this release

Release Info

Developer keywordrush
Plugin Icon 128x128 Content Egg
Version 1.6.0
Comparing to
See all releases

Version 1.6.0

Files changed (116) hide show
  1. .htaccess +7 -0
  2. application/Installer.php +126 -0
  3. application/ModuleUpdater.php +142 -0
  4. application/ModuleViewer.php +106 -0
  5. application/Plugin.php +114 -0
  6. application/Shortcode.php +139 -0
  7. application/admin/EggMetabox.php +244 -0
  8. application/admin/FeaturedImage.php +123 -0
  9. application/admin/GeneralConfig.php +111 -0
  10. application/admin/PluginAdmin.php +92 -0
  11. application/admin/index.php +1 -0
  12. application/admin/views/_metabox_results.php +20 -0
  13. application/admin/views/_metabox_search_results.php +12 -0
  14. application/admin/views/_metabox_search_results_images.php +7 -0
  15. application/admin/views/metabox_general.php +21 -0
  16. application/admin/views/metabox_module.php +86 -0
  17. application/admin/views/settings.php +120 -0
  18. application/components/AffiliateParserModule.php +44 -0
  19. application/components/AffiliateParserModuleConfig.php +51 -0
  20. application/components/Config.php +297 -0
  21. application/components/Content.php +21 -0
  22. application/components/ContentManager.php +143 -0
  23. application/components/ContentProduct.php +26 -0
  24. application/components/ExtraData.php +41 -0
  25. application/components/Module.php +176 -0
  26. application/components/ModuleApi.php +84 -0
  27. application/components/ModuleConfig.php +69 -0
  28. application/components/ModuleManager.php +225 -0
  29. application/components/ModuleTemplateManager.php +191 -0
  30. application/components/ParserModule.php +78 -0
  31. application/components/ParserModuleConfig.php +77 -0
  32. application/components/index.php +1 -0
  33. application/helpers/ArrayHelper.php +42 -0
  34. application/helpers/FormValidator.php +560 -0
  35. application/helpers/ImageHelper.php +93 -0
  36. application/helpers/InputHelper.php +31 -0
  37. application/helpers/TemplateHelper.php +106 -0
  38. application/helpers/TextHelper.php +341 -0
  39. application/helpers/index.php +1 -0
  40. application/index.php +1 -0
  41. application/libs/ParserClient.php +198 -0
  42. application/libs/RestClient.php +262 -0
  43. application/libs/WpHttpClient.php +460 -0
  44. application/libs/amazon/AmazonProduct.php +430 -0
  45. application/libs/google/FreebaseRest.php +133 -0
  46. application/libs/google/ImagesSearch.php +75 -0
  47. application/libs/google/YouTubeSearch.php +82 -0
  48. application/libs/index.php +1 -0
  49. application/modules/Amazon/AmazonConfig.php +289 -0
  50. application/modules/Amazon/AmazonModule.php +458 -0
  51. application/modules/Amazon/ExtraAmazonCustomerReviews.php +21 -0
  52. application/modules/Amazon/ExtraDataAmazon.php +141 -0
  53. application/modules/Amazon/index.php +1 -0
  54. application/modules/Amazon/templates/data_grid.php +64 -0
  55. application/modules/Amazon/templates/data_item.php +122 -0
  56. application/modules/Amazon/templates/data_list.php +53 -0
  57. application/modules/Amazon/views/search_panel.php +16 -0
  58. application/modules/Freebase/ExtraDataFreebase.php +27 -0
  59. application/modules/Freebase/FreebaseConfig.php +72 -0
  60. application/modules/Freebase/FreebaseModule.php +168 -0
  61. application/modules/Freebase/index.php +1 -0
  62. application/modules/Freebase/templates/data_simple.php +37 -0
  63. application/modules/GoogleImages/ExtraDataGoogleImages.php +16 -0
  64. application/modules/GoogleImages/GoogleImagesConfig.php +155 -0
  65. application/modules/GoogleImages/GoogleImagesModule.php +119 -0
  66. application/modules/GoogleImages/index.php +1 -0
  67. application/modules/GoogleImages/js/module.js +6 -0
  68. application/modules/GoogleImages/templates/data_image.php +20 -0
  69. application/modules/GoogleImages/templates/data_justified_gallery.php +47 -0
  70. application/modules/GoogleImages/templates/data_simple.php +27 -0
  71. application/modules/GoogleImages/views/search_panel.php +16 -0
  72. application/modules/Youtube/ExtraDataYoutube.php +19 -0
  73. application/modules/Youtube/YoutubeConfig.php +88 -0
  74. application/modules/Youtube/YoutubeModule.php +122 -0
  75. application/modules/Youtube/index.php +1 -0
  76. application/modules/Youtube/js/module.js +60 -0
  77. application/modules/Youtube/templates/data_responsive_embed.php +24 -0
  78. application/modules/Youtube/templates/data_simple.php +26 -0
  79. application/modules/Youtube/templates/data_tile.php +24 -0
  80. application/modules/Youtube/views/search_panel.php +13 -0
  81. application/modules/Youtube/views/search_results.php +14 -0
  82. application/modules/index.php +1 -0
  83. application/vendor/CVarDumper.php +142 -0
  84. application/vendor/index.php +1 -0
  85. content-egg.php +35 -0
  86. index.php +1 -0
  87. languages/content-egg-en_US.mo +0 -0
  88. languages/content-egg-en_US.po +1856 -0
  89. languages/content-egg.pot +1572 -0
  90. languages/index.php +2 -0
  91. languages/tpl/content-egg-tpl-RU.mo +0 -0
  92. languages/tpl/content-egg-tpl-RU.po +218 -0
  93. languages/tpl/content-egg-tpl.pot +229 -0
  94. loader.php +87 -0
  95. readme.txt +108 -0
  96. res/app/ModuleService.js +46 -0
  97. res/app/app.js +253 -0
  98. res/app/vendor/angular-ui-bootstrap/ui-bootstrap-tpls-0.13.3.min.js +10 -0
  99. res/bootstrap/css/egg-bootstrap.css +5319 -0
  100. res/bootstrap/js/bootstrap.js +2317 -0
  101. res/bootstrap/js/bootstrap.min.js +7 -0
  102. res/colorbox/colorbox.css +70 -0
  103. res/colorbox/images/border.png +0 -0
  104. res/colorbox/images/controls.png +0 -0
  105. res/colorbox/images/loading.gif +0 -0
  106. res/colorbox/images/loading_background.png +0 -0
  107. res/colorbox/images/overlay.png +0 -0
  108. res/colorbox/jquery.colorbox-min.js +6 -0
  109. res/css/admin.css +116 -0
  110. res/css/products.css +125 -0
  111. res/img/loader.gif +0 -0
  112. res/img/loader2.gif +0 -0
  113. res/img/status-active.png +0 -0
  114. res/img/status-inactive.png +0 -0
  115. res/justified_gallery/jquery.justifiedGallery.min.js +7 -0
  116. res/justified_gallery/justifiedGallery.min.css +7 -0
.htaccess ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ Order Deny,Allow
2
+ Deny from All
3
+
4
+ <FilesMatch ".(js|css|gif|jpe?g|png)$">
5
+ order allow,deny
6
+ allow from all
7
+ </FilesMatch>
application/Installer.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\Plugin;
6
+ use ContentEgg\application\Autoupdate;
7
+
8
+ /**
9
+ * Installer class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ class Installer {
16
+
17
+ const db_version = 1;
18
+
19
+ private static $instance = null;
20
+
21
+ public static function getInstance()
22
+ {
23
+
24
+ if (self::$instance == null)
25
+ self::$instance = new self;
26
+
27
+ return self::$instance;
28
+ }
29
+
30
+ private function __construct()
31
+ {
32
+
33
+ if (!empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == 'plugins.php')
34
+ {
35
+ \add_action('admin_init', array($this, 'requirements'), 0);
36
+ }
37
+
38
+ \add_action('admin_init', array($this, 'upgrade'));
39
+ \add_action('admin_init', array($this, 'redirect_after_activation'));
40
+ }
41
+
42
+ static public function dbVesrion()
43
+ {
44
+ return self::db_version;
45
+ }
46
+
47
+ public static function activate()
48
+ {
49
+ if (!\current_user_can('activate_plugins'))
50
+ return;
51
+
52
+ self::requirements();
53
+
54
+ \add_option(Plugin::slug . '_do_activation_redirect', true);
55
+ self::upgrade_tables();
56
+ }
57
+
58
+ public static function deactivate()
59
+ {
60
+
61
+ }
62
+
63
+ public static function requirements()
64
+ {
65
+ $php_min_version = '5.3';
66
+ $extensions = array(
67
+ 'simplexml',
68
+ 'mbstring',
69
+ );
70
+
71
+ $errors = array();
72
+ $name = get_file_data(\ContentEgg\PLUGIN_FILE, array('Plugin Name'), 'plugin');
73
+
74
+ global $wp_version;
75
+ if (version_compare(Plugin::wp_requires, $wp_version, '>'))
76
+ $errors[] = sprintf(__("Вы используете Wordpress %s. <em>%s</em> требует минимум <strong>Wordpress %s</strong>.", 'content-egg'), $wp_version, $name[0], Plugin::wp_requires);
77
+
78
+ $php_current_version = phpversion();
79
+ if (version_compare($php_min_version, $php_current_version, '>'))
80
+ $errors[] = sprintf(__("На вашем сервере установлен PHP %s. <em>%s</em> требует минимум <strong>PHP %s</strong>.", 'content-egg'), $php_current_version, $name[0], $php_min_version);
81
+
82
+ foreach ($extensions as $extension)
83
+ {
84
+ if (!extension_loaded($extension))
85
+ $errors[] = sprintf(__("Требуется расширение <strong>%s</strong>.", 'content-egg'), $extension);
86
+ }
87
+ if (!$errors)
88
+ return;
89
+ unset($_GET['activate']);
90
+ deactivate_plugins(plugin_basename(\ContentEgg\PLUGIN_FILE));
91
+ $e = sprintf('<div class="error"><p>%1$s</p><p><em>%2$s</em> ' . __('не может быть установлен!', 'content-egg') . '</p></div>', join('</p><p>', $errors), $name[0]);
92
+ wp_die($e);
93
+ }
94
+
95
+ private static function upgrade_tables()
96
+ {
97
+ update_option(Plugin::slug . '_db_version', self::dbVesrion());
98
+ }
99
+
100
+ public static function uninstall()
101
+ {
102
+ global $wpdb;
103
+ if (!current_user_can('activate_plugins'))
104
+ return;
105
+
106
+ delete_option(Plugin::slug . '_db_version');
107
+ delete_option(LicConfig::getInstance()->option_name());
108
+ }
109
+
110
+ public static function upgrade()
111
+ {
112
+ $db_version = get_option(Plugin::slug . '_db_version');
113
+ if ($db_version >= self::dbVesrion())
114
+ return;
115
+ self::upgrade_tables();
116
+ }
117
+
118
+ public function redirect_after_activation()
119
+ {
120
+ if (\get_option(Plugin::slug . '_do_activation_redirect', false))
121
+ {
122
+ \delete_option(Plugin::slug . '_do_activation_redirect');
123
+ \wp_redirect(\get_admin_url(\get_current_blog_id(), 'admin.php?page=' . Plugin::slug));
124
+ }
125
+ }
126
+ }
application/ModuleUpdater.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\components\ContentManager;
7
+ use ContentEgg\application\admin\EggMetabox;
8
+
9
+ /**
10
+ * ModuleUpdater class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class ModuleUpdater {
17
+
18
+ private static $instance = null;
19
+
20
+ public static function getInstance()
21
+ {
22
+ if (self::$instance == null)
23
+ self::$instance = new self;
24
+
25
+ return self::$instance;
26
+ }
27
+
28
+ private function __construct()
29
+ {
30
+
31
+ }
32
+
33
+ public function init()
34
+ {
35
+ // priority = 10 because ModuleViewer added with a priority of 12
36
+ // & do_shortcode() is registered as a default filter on 'the_content' with a priority of 11.
37
+ \add_filter('the_content', array($this, 'update'), 10);
38
+ }
39
+
40
+ public function update($content)
41
+ {
42
+ if (!is_single())
43
+ return $content;
44
+
45
+ $this->updateByKeyword();
46
+ $this->updateItems();
47
+ return $content;
48
+ }
49
+
50
+ private function updateByKeyword()
51
+ {
52
+ global $post;
53
+
54
+ foreach (ModuleManager::getInstance()->getModules(true) as $module)
55
+ {
56
+ if (!$module->isAffiliateParser())
57
+ continue;
58
+
59
+ $ttl = $module->config('ttl');
60
+ if (!$ttl)
61
+ continue;
62
+
63
+ $keyword = \get_post_meta($post->ID, ContentManager::META_PREFIX_KEYWORD . $module->getId(), true);
64
+ if (!$keyword)
65
+ continue;
66
+
67
+ $last_update = (int) \get_post_meta($post->ID, ContentManager::META_PREFIX_LAST_BYKEYWORD_UPDATE . $module->getId(), true);
68
+ if ($last_update && time() - $last_update < $ttl)
69
+ continue;
70
+
71
+ try
72
+ {
73
+ $data = $module->doRequest($keyword, array(), true);
74
+
75
+ // nodata!
76
+ if (!$data)
77
+ {
78
+ ContentManager::touchUpdateTime($post->ID, $module->getId());
79
+ continue;
80
+ }
81
+ } catch (\Exception $e)
82
+ {
83
+ // error
84
+ ContentManager::touchUpdateTime($post->ID, $module->getId());
85
+ continue;
86
+ }
87
+
88
+ $data = array_map(array('self', 'object2Array'), $data);
89
+ ContentManager::saveData($data, $module->getId(), $post->ID);
90
+ }
91
+ }
92
+
93
+ private function updateItems()
94
+ {
95
+ global $post;
96
+
97
+ foreach (ModuleManager::getInstance()->getModules(true) as $module)
98
+ {
99
+ if (!$module->isAffiliateParser() || !$module->isItemsUpdateAvailable())
100
+ continue;
101
+
102
+ $ttl_items = $module->config('ttl_items');
103
+ if (!$ttl_items)
104
+ continue;
105
+
106
+ $last_items_update = (int) \get_post_meta($post->ID, ContentManager::META_PREFIX_LAST_ITEMS_UPDATE . $module->getId(), true);
107
+
108
+ if (!$last_items_update || time() - $last_items_update < $ttl_items)
109
+ continue;
110
+
111
+ $items = \get_post_meta($post->ID, ContentManager::META_PREFIX_DATA . $module->getId(), true);
112
+ if (!$items)
113
+ continue;
114
+
115
+ try
116
+ {
117
+ $updated_data = $module->doRequestItems($items);
118
+ } catch (\Exception $e)
119
+ {
120
+ // error
121
+ ContentManager::touchUpdateItemsTime($post->ID, $module->getId());
122
+ continue;
123
+ }
124
+
125
+ // save & update time
126
+ ContentManager::saveData($updated_data, $module->getId(), $post->ID);
127
+ ContentManager::touchUpdateItemsTime($post->ID, $module->getId());
128
+ }
129
+ }
130
+
131
+
132
+ /**
133
+ * Full depth recursive conversion to array
134
+ * @param type $object
135
+ * @return array
136
+ */
137
+ public static function object2Array($object)
138
+ {
139
+ return json_decode(json_encode($object), true);
140
+ }
141
+
142
+ }
application/ModuleViewer.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\components\ContentManager;
7
+ use ContentEgg\application\components\ModuleTemplateManager;
8
+
9
+ /**
10
+ * ModuleViewer class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class ModuleViewer {
17
+
18
+ private static $instance = null;
19
+ private $module_data_pointer = array();
20
+
21
+ public static function getInstance()
22
+ {
23
+
24
+ if (self::$instance == null)
25
+ self::$instance = new self;
26
+
27
+ return self::$instance;
28
+ }
29
+
30
+ private function __construct()
31
+ {
32
+
33
+ }
34
+
35
+ public function init()
36
+ {
37
+ // priority = 12 because do_shortcode() is registered as a default filter on 'the_content' with a priority of 11.
38
+ \add_filter('the_content', array($this, 'viewData'), 12);
39
+ }
40
+
41
+ public function viewData($content)
42
+ {
43
+ /*
44
+ if (!is_single())
45
+ return $content;
46
+ *
47
+ */
48
+ foreach (ModuleManager::getInstance()->getModules(true) as $module)
49
+ {
50
+ $embed_at = $module->config('embed_at');
51
+ if ($embed_at != 'post_bottom' && $embed_at != 'post_top')
52
+ continue;
53
+
54
+ if (Shortcode::isShortcoded($module->getId()))
55
+ continue;
56
+
57
+ $render = $this->viewModuleData($module->getId());
58
+ if ($embed_at == 'post_bottom')
59
+ $content = $content . $render;
60
+ elseif ($embed_at == 'post_top')
61
+ $content = $render . $content;
62
+ }
63
+ return $content;
64
+ }
65
+
66
+ public function viewModuleData($module_id, $post_id = null, $params = array())
67
+ {
68
+ if (!$post_id)
69
+ {
70
+ global $post;
71
+ $post_id = $post->ID;
72
+ }
73
+ $module = ModuleManager::factory($module_id);
74
+ $data = \get_post_meta($post_id, ContentManager::META_PREFIX_DATA . $module->getId(), true);
75
+ if (!$data)
76
+ return '';
77
+
78
+ // next param
79
+ if (!empty($params['next']))
80
+ {
81
+ if (!isset($this->module_data_pointer[$module_id]))
82
+ $this->module_data_pointer[$module_id] = 0;
83
+ $data = array_splice($data, $this->module_data_pointer[$module_id], $params['next']);
84
+ if (count($data) < $params['next'])
85
+ $params['next'] = count($data);
86
+ $this->module_data_pointer[$module_id] += $params['next'];
87
+ } elseif (!empty($params['limit']))
88
+ {
89
+ if (!isset($params['offset']))
90
+ $params['offset'] = 0;
91
+
92
+ $data = array_splice($data, $params['offset'], $params['limit']);
93
+ $this->module_data_pointer[$module_id] = $params['offset'] + $params['limit'];
94
+ }
95
+
96
+ // template
97
+ $tpl_manager = new ModuleTemplateManager($module->getId());
98
+ if (!empty($params['template']) && $tpl_manager->isDataTemplateExists($params['template']))
99
+ $template = $params['template'];
100
+ else
101
+ $template = $module->config('template');
102
+
103
+ return $tpl_manager->render($template, array('items' => $data, 'title' => $module->config('tpl_title')));
104
+ }
105
+
106
+ }
application/Plugin.php ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\admin\GeneralConfig;
6
+
7
+ /**
8
+ * Plugin class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class Plugin {
15
+
16
+ const version = '1.6.0';
17
+ const wp_requires = '4.2.2';
18
+ const slug = 'content-egg';
19
+ const api_base = 'http://www.keywordrush.com/api/v1';
20
+ const product_id = 302;
21
+
22
+ private static $instance = null;
23
+ private static $is_pro = null;
24
+
25
+ public static function getInstance()
26
+ {
27
+ if (self::$instance == null)
28
+ self::$instance = new self;
29
+
30
+ return self::$instance;
31
+ }
32
+
33
+ private function __construct()
34
+ {
35
+ $this->loadTextdomain();
36
+ if (self::isFree() || (self::isPro() && self::isActivated()))
37
+ {
38
+ \add_action('wp_enqueue_scripts', array($this, 'registerScripts'));
39
+ Shortcode::getInstance();
40
+ ModuleViewer::getInstance()->init();
41
+ ModuleUpdater::getInstance()->init();
42
+ }
43
+ if (Plugin::isPro() && Plugin::isActivated())
44
+ {
45
+ new Autoupdate(Plugin::version(), plugin_basename(\ContentEgg\PLUGIN_FILE), Plugin::getApiBase(), Plugin::slug);
46
+ }
47
+ }
48
+
49
+ public function registerScripts()
50
+ {
51
+ \wp_register_style('egg-bootstrap', \ContentEgg\PLUGIN_RES . '/bootstrap/css/egg-bootstrap.css');
52
+ \wp_register_script('bootstrap', \ContentEgg\PLUGIN_RES . '/bootstrap/js/bootstrap.min.js', array('jquery'), null, false);
53
+ \wp_register_style('content-egg-products', \ContentEgg\PLUGIN_RES . '/css/products.css');
54
+ }
55
+
56
+ static public function version()
57
+ {
58
+ return self::version;
59
+ }
60
+
61
+ static public function slug()
62
+ {
63
+ return self::slug;
64
+ }
65
+
66
+ public static function getApiBase()
67
+ {
68
+ return self::api_base;
69
+ }
70
+
71
+ public static function isFree()
72
+ {
73
+ return !self::isPro();
74
+ }
75
+
76
+ public static function isPro()
77
+ {
78
+ if (self::$is_pro === null)
79
+ {
80
+ if (class_exists("\\ContentEgg\\application\\Autoupdate", true))
81
+ self::$is_pro = true;
82
+ else
83
+ self::$is_pro = false;
84
+ }
85
+ return self::$is_pro;
86
+ }
87
+
88
+ public static function isActivated()
89
+ {
90
+ if (self::isPro() && \ContentEgg\application\admin\LicConfig::getInstance()->option('license_key'))
91
+ return true;
92
+ else
93
+ return false;
94
+ }
95
+
96
+ private function loadTextdomain()
97
+ {
98
+ // plugin backend
99
+ $locale = \get_locale();
100
+ $mo_file = \ContentEgg\PLUGIN_PATH . 'languages/content-egg-' . $locale . '.mo';
101
+ if (file_exists($mo_file) && is_readable($mo_file))
102
+ \load_textdomain('content-egg', $mo_file);
103
+ elseif (!in_array($locale, array('ru_RU', 'uk')))
104
+ \load_textdomain('content-egg', \ContentEgg\PLUGIN_PATH . 'languages/content-egg-en_US.mo');
105
+
106
+ // frontend templates
107
+ $lang = GeneralConfig::getInstance()->option('lang');
108
+ $lang = strtoupper($lang);
109
+ $mo_file = \ContentEgg\PLUGIN_PATH . 'languages/tpl/content-egg-tpl-' . $lang . '.mo';
110
+ if (file_exists($mo_file) && is_readable($mo_file))
111
+ $v = \load_textdomain('content-egg-tpl', $mo_file);
112
+ }
113
+
114
+ }
application/Shortcode.php ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\components\ModuleTemplateManager;
7
+ use ContentEgg\application\helpers\TextHelper;
8
+
9
+ /**
10
+ * Shortcode class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class Shortcode {
17
+
18
+ const shortcode = 'content-egg';
19
+
20
+ private static $instance = null;
21
+
22
+ //private $items = array();
23
+ //private $item_pointer = array();
24
+
25
+ private static $shortcoded_module_ids = array();
26
+
27
+ public static function getInstance()
28
+ {
29
+ if (self::$instance == null)
30
+ self::$instance = new self;
31
+ return self::$instance;
32
+ }
33
+
34
+ private function __construct()
35
+ {
36
+ \add_shortcode(self::shortcode, array($this, 'viewData'));
37
+ \add_filter( 'term_description', 'shortcode_unautop');
38
+ \add_filter( 'term_description', 'do_shortcode' );
39
+ }
40
+
41
+ private function prepareAttr($atts)
42
+ {
43
+ $a = shortcode_atts(array(
44
+ 'module' => null,
45
+ 'limit' => 0,
46
+ 'offset' => 0,
47
+ 'next' => 0,
48
+ 'template' => '',
49
+ //'order' => 'asc',
50
+ ), $atts);
51
+ //$order_allowed = array('rand', 'title', 'price', 'manufacturer', 'in_stock', 'create_date', 'last_update', 'last_in_stock', 'shop_id');
52
+
53
+ $a['next'] = (int) $a['next'];
54
+ $a['limit'] = (int) $a['limit'];
55
+ $a['offset'] = (int) $a['offset'];
56
+
57
+ if (ModuleTemplateManager::isCunstomTemplate($a['template']))
58
+ {
59
+ $is_custom = true;
60
+ // del 'custom/' prefix
61
+ $a['template'] = substr($a['template'], 7);
62
+ } else
63
+ $is_custom = false;
64
+
65
+ $a['template'] = TextHelper::clear($a['template']);
66
+ if ($is_custom)
67
+ $a['template'] = 'custom/' . $a['template'];
68
+
69
+ if ($a['template'])
70
+ {
71
+ $a['template'] = ModuleTemplateManager::getFullTemplateId($a['template']);
72
+ }
73
+
74
+ /*
75
+ if ($a['order'])
76
+ {
77
+ $a['order'] = strtolower($a['order']);
78
+ $o_split = explode(' ', $a['order']);
79
+ $a['order'] = trim($o_split[0]);
80
+ if (isset($o_split[1]))
81
+ {
82
+ $o_split[1] = trim($o_split[1]);
83
+ if ($o_split[1] == 'desc')
84
+ $a['order_asc_desc'] = $o_split[1];
85
+ }
86
+ if (!in_array($a['order'], $order_allowed))
87
+ $a['order'] = '';
88
+ }
89
+ *
90
+ */
91
+
92
+ return $a;
93
+ }
94
+
95
+ public function viewData($atts, $content = "")
96
+ {
97
+ $a = $this->prepareAttr($atts);
98
+
99
+ if (empty($a['module']))
100
+ return;
101
+ $module_id = $a['module'];
102
+ if (!ModuleManager::getInstance()->isModuleActive($module_id))
103
+ return;
104
+
105
+ self::setShortcodedModule($module_id);
106
+ return ModuleViewer::getInstance()->viewModuleData($module_id, null, $a);
107
+ }
108
+
109
+ public static function arraySortByColumn(&$arr, $col, $dir = SORT_ASC)
110
+ {
111
+ $sort_col = array();
112
+ foreach ($arr as $key => $row)
113
+ {
114
+ $sort_col[$key] = $row[$col];
115
+ }
116
+
117
+ array_multisort($sort_col, $dir, $arr);
118
+ }
119
+
120
+ public static function getShortcodedModuleIds()
121
+ {
122
+ return self::$shortcoded_module_ids;
123
+ }
124
+
125
+ public static function setShortcodedModule($module_id)
126
+ {
127
+ self::$shortcoded_module_ids[$module_id] = $module_id;
128
+ }
129
+
130
+
131
+ public static function isShortcoded($module_id)
132
+ {
133
+ if (isset(self::$shortcoded_module_ids[$module_id]))
134
+ return true;
135
+ else
136
+ return false;
137
+ }
138
+
139
+ }
application/admin/EggMetabox.php ADDED
@@ -0,0 +1,244 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\admin;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\helpers\InputHelper;
7
+ use ContentEgg\application\helpers\TextHelper;
8
+ use ContentEgg\application\components\ContentManager;
9
+
10
+ /**
11
+ * EggMetabox class file
12
+ *
13
+ * @author keywordrush.com <support@keywordrush.com>
14
+ * @link http://www.keywordrush.com/
15
+ * @copyright Copyright &copy; 2015 keywordrush.com
16
+ */
17
+ class EggMetabox {
18
+
19
+ private $app_params = array();
20
+
21
+ public function __construct()
22
+ {
23
+ \add_action('add_meta_boxes', array($this, 'addMetabox'));
24
+ \add_action('save_post', array($this, 'saveMeta'));
25
+ }
26
+
27
+ private function addAppParam($param, $value)
28
+ {
29
+ $this->app_params[$param] = $value;
30
+ }
31
+
32
+ private function getAppParams()
33
+ {
34
+ return $this->app_params;
35
+ }
36
+
37
+ public function addMetabox($post_type)
38
+ {
39
+ if (!in_array($post_type, array('post', 'page')))
40
+ return;
41
+
42
+ if (!ModuleManager::getInstance()->getModules(true))
43
+ {
44
+ \add_meta_box('content_meta_box', 'Content Egg', array($this, 'renderBlankMetabox'), $post_type, 'normal', 'high');
45
+ return;
46
+ }
47
+ $this->modulesOptionsInit();
48
+ $this->metadataInit();
49
+ \add_meta_box('content_meta_box', 'Content Egg', array($this, 'renderMetabox'), $post_type, 'normal', 'high');
50
+ $this->angularInit();
51
+ }
52
+
53
+ /**
54
+ * Render Meta Box content.
55
+ *
56
+ * @param WP_Post $post The post object.
57
+ */
58
+ public function renderMetabox($post)
59
+ {
60
+ echo '<div ng-app="contentEgg" class="egg-container" id="content-egg" ng-cloak>';
61
+ echo '<div ng-controller="ContentEggController" class="container-fluid">';
62
+
63
+ PluginAdmin::render('metabox_general');
64
+
65
+ foreach (ModuleManager::getInstance()->getModules(true) as $module)
66
+ {
67
+ $module->enqueueScripts();
68
+ PluginAdmin::render('metabox_module', array('module_id' => $module->getId(), 'module' => $module));
69
+ }
70
+ echo '</div>';
71
+ echo '</div>';
72
+ }
73
+
74
+ public function renderBlankMetabox($post)
75
+ {
76
+ _e('Настройте и активируйте модули Content Egg плагин.', 'content-egg');
77
+ }
78
+
79
+ private function metadataInit()
80
+ {
81
+ global $post;
82
+
83
+ $modules = ModuleManager::getInstance()->getModules(true);
84
+
85
+ // modules data
86
+ $init_data = array();
87
+ foreach ($modules as $module)
88
+ {
89
+ $post_meta = \get_post_meta($post->ID, ContentManager::META_PREFIX_DATA . $module->getId(), true);
90
+ if (!$post_meta)
91
+ continue;
92
+ foreach ($post_meta as $key => $meta)
93
+ {
94
+ if ($meta['description'])
95
+ $post_meta[$key]['description'] = TextHelper::br2nl($meta['description']);
96
+ }
97
+ $init_data[$module->getId()] = array_values($post_meta);
98
+ }
99
+ $this->addAppParam('initData', $init_data);
100
+
101
+ // keywords
102
+ $init_keywords = array();
103
+ foreach ($modules as $module)
104
+ {
105
+ if (!$module->isAffiliateParser())
106
+ continue;
107
+ $keywords_meta = \get_post_meta($post->ID, ContentManager::META_PREFIX_KEYWORD . $module->getId(), true);
108
+ if (!$keywords_meta)
109
+ continue;
110
+ $init_keywords[$module->getId()] = $keywords_meta;
111
+ }
112
+ $this->addAppParam('initKeywords', $init_keywords);
113
+ }
114
+
115
+ private function modulesOptionsInit()
116
+ {
117
+ $options = array();
118
+ foreach (ModuleManager::getInstance()->getModules(true) as $module)
119
+ {
120
+ $options[$module->getId()] = $module->getConfigInstance()->getOptionValues();
121
+ }
122
+ $this->addAppParam('modulesOptions', $options);
123
+ }
124
+
125
+ private function angularInit()
126
+ {
127
+ // Justified gallery jquery plugin
128
+ \wp_enqueue_script('justified-gallery', \ContentEgg\PLUGIN_RES . '/justified_gallery/jquery.justifiedGallery.min.js', array('jquery'), null, false);
129
+ \wp_enqueue_style('justified-gallery', \ContentEgg\PLUGIN_RES . '/justified_gallery/justifiedGallery.min.css');
130
+
131
+ // Angular core
132
+ \wp_enqueue_script('angularjs', '//ajax.googleapis.com/ajax/libs/angularjs/1.4.0-rc.1/angular.min.js', array('jquery'), null, false);
133
+
134
+ // ContentEgg angular application
135
+ \wp_enqueue_style('contentegg-admin', \ContentEgg\PLUGIN_RES . '/css/admin.css');
136
+ \wp_enqueue_script('angular-ui-bootstrap', \ContentEgg\PLUGIN_RES . '/app/vendor/angular-ui-bootstrap/ui-bootstrap-tpls-0.13.3.min.js', array('angularjs'), null, false);
137
+ \wp_register_script('contentegg-metabox-app', \ContentEgg\PLUGIN_RES . '/app/app.js', array('angularjs'), null, false);
138
+ \wp_enqueue_script('contentegg-metabox-service', \ContentEgg\PLUGIN_RES . '/app/ModuleService.js', array('contentegg-metabox-app'), null, false);
139
+
140
+ // Bootstrap
141
+ \wp_enqueue_style('egg-bootstrap', \ContentEgg\PLUGIN_RES . '/bootstrap/css/egg-bootstrap.css');
142
+ \wp_enqueue_script('bootstrap', \ContentEgg\PLUGIN_RES . '/bootstrap/js/bootstrap.min.js', array('jquery'), null, false);
143
+
144
+ // ContentEgg appliction params
145
+ $this->addAppParam('active_modules', ModuleManager::getInstance()->getModulesIdList(true));
146
+ $this->addAppParam('nonce', \wp_create_nonce('contentegg-metabox'));
147
+
148
+ \wp_localize_script('contentegg-metabox-app', 'contentegg_params', $this->getAppParams());
149
+ }
150
+
151
+ /**
152
+ * Save the meta when the post is saved.
153
+ *
154
+ * @param int $post_id The ID of the post being saved.
155
+ */
156
+ public function saveMeta($post_id)
157
+ {
158
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
159
+ return;
160
+
161
+ if (!isset($_POST['contentegg_nonce']))
162
+ return;
163
+
164
+ /*
165
+ * why shouldn't i save metadata when its a revision?
166
+ *
167
+ * Apparently *_post_meta functions will automatically change
168
+ * to parent post id if passed revision post id. So you might modify original post,
169
+ * thinking you are modifying revision.
170
+ *
171
+ if (\wp_is_post_revision($post_id))
172
+ return;
173
+ *
174
+ */
175
+
176
+ \check_admin_referer('contentegg_metabox', 'contentegg_nonce');
177
+
178
+ // Check the user's permissions.
179
+ if ($_POST['post_type'] == 'page')
180
+ {
181
+ if (!current_user_can('edit_page', $post_id))
182
+ return;
183
+ } else
184
+ {
185
+ if (!current_user_can('edit_post', $post_id))
186
+ return;
187
+ }
188
+
189
+ // need stripslashes? wp bug with revision post type?
190
+ if (\wp_is_post_revision($post_id))
191
+ $stripslashes = false;
192
+ else
193
+ $stripslashes = true;
194
+
195
+ // keywords for automatic updates
196
+ $keywords = InputHelper::post('cegg_updateKeywords', array(), $stripslashes);
197
+ foreach ($keywords as $module_id => $keyword)
198
+ {
199
+ if (!ModuleManager::getInstance()->moduleExists($module_id) || !ModuleManager::getInstance()->isModuleActive($module_id))
200
+ continue;
201
+
202
+ $module = ModuleManager::getInstance()->factory($module_id);
203
+ if (!$module->isAffiliateParser())
204
+ continue;
205
+
206
+ $keyword = \sanitize_text_field($keyword);
207
+ if ($keyword)
208
+ {
209
+ \update_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id, $keyword);
210
+ } else
211
+ {
212
+ \delete_post_meta($post_id, ContentManager::META_PREFIX_KEYWORD . $module_id);
213
+ }
214
+ }
215
+
216
+ // save content data
217
+ $content = InputHelper::post('cegg_data', array(), $stripslashes);
218
+ if (!is_array($content))
219
+ return;
220
+
221
+ foreach ($content as $module_id => $data)
222
+ {
223
+ if (!ModuleManager::getInstance()->moduleExists($module_id) || !ModuleManager::getInstance()->isModuleActive($module_id))
224
+ continue;
225
+
226
+ $data = json_decode($data, true);
227
+ $data = $this->dataPrepare($data);
228
+ ContentManager::saveData($data, $module_id, $post_id);
229
+ }
230
+ }
231
+
232
+ private function dataPrepare($data)
233
+ {
234
+ if (!is_array($data))
235
+ return array();
236
+ foreach ($data as $key => $d)
237
+ {
238
+ if ($key == 'description')
239
+ $data[$key] = TextHelper::nl2br($d);
240
+ }
241
+ return $data;
242
+ }
243
+
244
+ }
application/admin/FeaturedImage.php ADDED
@@ -0,0 +1,123 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\admin;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\components\ContentManager;
7
+ use ContentEgg\application\helpers\ImageHelper;
8
+
9
+ /**
10
+ * FeaturedImage class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class FeaturedImage {
17
+
18
+ private $app_params = array();
19
+
20
+ public function __construct()
21
+ {
22
+ // priority 11 - after meta save
23
+ \add_action('save_post', array($this, 'setImage'), 11, 2);
24
+ }
25
+
26
+ public function setImage($post_id, $post)
27
+ {
28
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
29
+ return;
30
+
31
+ if (\get_post_status($post_id) == 'auto-draft' || \wp_is_post_revision($post_id))
32
+ return;
33
+
34
+ if (\has_post_thumbnail($post_id))
35
+ return;
36
+
37
+ $modules_ids = ModuleManager::getInstance()->getParserModulesIdList();
38
+ foreach ($modules_ids as $module_id)
39
+ {
40
+ if (self::setFuturedImageByModule($post_id, $module_id))
41
+ return;
42
+ }
43
+ }
44
+
45
+ public static function setFuturedImageByModule($post_id, $module_id)
46
+ {
47
+ $module = ModuleManager::factory($module_id);
48
+ $featured_image = $module->config('featured_image', false);
49
+ if (!$featured_image)
50
+ return false;
51
+
52
+ $data = \get_post_meta($post_id, ContentManager::META_PREFIX_DATA . $module->getId(), true);
53
+ if (!$data)
54
+ return false;
55
+
56
+ if ($featured_image == 'second' && isset($data[1]))
57
+ unset($data[0]);
58
+ elseif ($featured_image == 'last')
59
+ $data = array_reverse($data);
60
+ elseif ($featured_image == 'rand')
61
+ shuffle($data);
62
+
63
+ require_once( \ABSPATH . 'wp-admin/includes/image.php' );
64
+
65
+ foreach ($data as $d)
66
+ {
67
+ $img_file = self::getImgFile($d);
68
+ if (!$img_file)
69
+ continue;
70
+ $filetype = \wp_check_filetype(basename($img_file), null);
71
+ $attachment = array(
72
+ 'guid' => $img_file,
73
+ 'post_mime_type' => $filetype['type'],
74
+ 'post_title' => $d['title'],
75
+ 'post_content' => '',
76
+ 'post_status' => 'inherit'
77
+ );
78
+ $attach_id = \wp_insert_attachment($attachment, $img_file, $post_id);
79
+ $attach_data = \wp_generate_attachment_metadata($attach_id, $img_file);
80
+ \wp_update_attachment_metadata($attach_id, $attach_data);
81
+ \set_post_thumbnail($post_id, $attach_id);
82
+
83
+ return true;
84
+ } //data foreach
85
+
86
+ return false;
87
+ }
88
+
89
+ private static function getImgFile($item)
90
+ {
91
+ if (empty($item['img']))
92
+ return false;
93
+
94
+ // already saved? dublicate image file
95
+ if (isset($item['img_file']) && $item['img_file'])
96
+ {
97
+ $img_file = ImageHelper::getFullImgPath($item['img_file']);
98
+ if (!is_file($img_file))
99
+ return false;
100
+
101
+ $uploads = \wp_upload_dir();
102
+ $dublicate_name = \wp_unique_filename($uploads['path'], basename($item['img_file']));
103
+ $dublicate_file = $uploads['path'] . '/' . $dublicate_name;
104
+
105
+ if (!copy($img_file, $dublicate_file))
106
+ return false;
107
+
108
+ return $dublicate_file;
109
+ } else
110
+ {
111
+ // save image localy
112
+ $file_name = ImageHelper::saveImgLocaly($item['img'], $item['title']);
113
+ if (!$file_name)
114
+ return false;
115
+ $uploads = \wp_upload_dir();
116
+ $image = ltrim(trailingslashit($uploads['subdir']), '\/') . $file_name;
117
+ return ImageHelper::getFullImgPath($image);
118
+ }
119
+
120
+ return $img_file;
121
+ }
122
+
123
+ }
application/admin/GeneralConfig.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\admin;
4
+
5
+ use ContentEgg\application\components\Config;
6
+ use ContentEgg\application\Plugin;
7
+ use ContentEgg\application\admin\PluginAdmin;
8
+
9
+ /**
10
+ * GeneralSettings class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class GeneralConfig extends Config {
17
+
18
+ public function page_slug()
19
+ {
20
+ return Plugin::slug() . '';
21
+ }
22
+
23
+ public function option_name()
24
+ {
25
+ return 'contentegg_options';
26
+ }
27
+
28
+ public function add_admin_menu()
29
+ {
30
+ \add_submenu_page(Plugin::slug, __('Настройки', 'content-egg') . ' &lsaquo; Content Egg', __('Настройки', 'content-egg'), 'manage_options', $this->page_slug, array($this, 'settings_page'));
31
+ }
32
+
33
+ public static function langs()
34
+ {
35
+ return array(
36
+ 'ar' => 'Arabic',
37
+ 'bg' => 'Bulgarian',
38
+ 'ca' => 'Catalan',
39
+ //'zh_CN' => 'Chinese (simplified)',
40
+ //'zh_TW' => 'Chinese (traditional)',
41
+ 'hr' => 'Croatian',
42
+ 'cs' => 'Czech',
43
+ 'da' => 'Danish',
44
+ 'nl' => 'Dutch',
45
+ 'en' => 'English',
46
+ 'et' => 'Estonian',
47
+ 'tl' => 'Filipino',
48
+ 'fi' => 'Finnish',
49
+ 'fr' => 'French',
50
+ 'de' => 'German',
51
+ 'el' => 'Greek',
52
+ 'iw' => 'Hebrew',
53
+ 'hi' => 'Hindi',
54
+ 'hu' => 'Hungarian',
55
+ 'is' => 'Icelandic',
56
+ 'id' => 'Indonesian',
57
+ 'it' => 'Italian',
58
+ 'ja' => 'Japanese',
59
+ 'ko' => 'Korean',
60
+ 'lv' => 'Latvian',
61
+ 'lt' => 'Lithuanian',
62
+ 'ms' => 'Malay',
63
+ 'no' => 'Norwegian',
64
+ 'fa' => 'Persian',
65
+ 'pl' => 'Polish',
66
+ 'pt' => 'Portuguese',
67
+ 'ro' => 'Romanian',
68
+ 'ru' => 'Russian',
69
+ 'sr' => 'Serbian',
70
+ 'sk' => 'Slovak',
71
+ 'sl' => 'Slovenian',
72
+ 'es' => 'Spanish',
73
+ 'sv' => 'Swedish',
74
+ 'th' => 'Thai',
75
+ 'tr' => 'Turkish',
76
+ 'uk' => 'Ukrainian',
77
+ 'ur' => 'Urdu',
78
+ 'vi' => 'Vietnamese',
79
+ );
80
+ }
81
+
82
+ protected function options()
83
+ {
84
+ return array(
85
+ 'lang' => array(
86
+ 'title' => __('Язык сайта', 'content-egg'),
87
+ 'description' => __('Модули, которые имеют поддержку мультиязычности, будут отдавать предпочтение контенту на этом языке. Также эта настройка указывает на язык для локализации шаблонов.', 'content-egg'),
88
+ 'dropdown_options' => self::langs(),
89
+ 'callback' => array($this, 'render_dropdown'),
90
+ 'default' => self::getDefaultLang(),
91
+ 'section' => 'default',
92
+ ),
93
+ );
94
+ }
95
+
96
+ public static function getDefaultLang()
97
+ {
98
+ $locale = \get_locale();
99
+ $lang = explode('_', $locale);
100
+ if (array_key_exists($lang[0], self::langs()))
101
+ return $lang[0];
102
+ else
103
+ return 'en';
104
+ }
105
+
106
+ public function settings_page()
107
+ {
108
+ PluginAdmin::render('settings', array('page_slug' => $this->page_slug()));
109
+ }
110
+
111
+ }
application/admin/PluginAdmin.php ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\admin;
4
+
5
+ use ContentEgg\application\Plugin;
6
+ use ContentEgg\application\helpers\TextHelper;
7
+ use ContentEgg\application\admin\GeneralConfig;
8
+ use ContentEgg\application\components\ModuleManager;
9
+ use ContentEgg\application\components\ModuleApi;
10
+
11
+ /**
12
+ * PluginAdmin class file
13
+ *
14
+ * @author keywordrush.com <support@keywordrush.com>
15
+ * @link http://www.keywordrush.com/
16
+ * @copyright Copyright &copy; 2015 keywordrush.com
17
+ */
18
+ class PluginAdmin {
19
+
20
+ protected static $instance = null;
21
+
22
+ public static function getInstance()
23
+ {
24
+ if (self::$instance == null)
25
+ self::$instance = new self;
26
+
27
+ return self::$instance;
28
+ }
29
+
30
+ private function __construct()
31
+ {
32
+ if (!\is_admin())
33
+ die('You are not authorized to perform the requested action.');
34
+
35
+ \add_action('admin_menu', array($this, 'add_admin_menu'));
36
+ \add_action('admin_enqueue_scripts', array($this, 'admin_load_scripts'));
37
+
38
+ if (isset($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == 'plugins.php')
39
+ {
40
+ \add_filter('plugin_row_meta', array($this, 'add_plugin_row_meta'), 10, 2);
41
+ }
42
+
43
+ if (Plugin::isFree() || (Plugin::isPro() && Plugin::isActivated()))
44
+ {
45
+ GeneralConfig::getInstance()->adminInit();
46
+ ModuleManager::getInstance()->adminInit();
47
+ new EggMetabox;
48
+ new ModuleApi;
49
+ new FeaturedImage;
50
+ }
51
+ if (Plugin::isPro())
52
+ LicConfig::getInstance()->adminInit();
53
+ }
54
+
55
+ function admin_load_scripts()
56
+ {
57
+ //\wp_enqueue_style('egg-bootstrap', \ContentEgg\PLUGIN_RES . '/bootstrap/css/egg-bootstrap.css');
58
+ \wp_enqueue_style('contentegg-admin', \ContentEgg\PLUGIN_RES . '/css/admin.css');
59
+
60
+ }
61
+
62
+ public function add_plugin_row_meta(array $links, $file)
63
+ {
64
+ if ($file == plugin_basename(\ContentEgg\PLUGIN_FILE) && LicConfig::getInstance()->option('license_key'))
65
+ {
66
+ return array_merge(
67
+ $links, array(
68
+ '<a href="' . get_bloginfo('wpurl') . '/wp-admin/admin.php?page=content-egg">' . __('Настройки', 'content-egg') . '</a>',
69
+ )
70
+ );
71
+ }
72
+ return $links;
73
+ }
74
+
75
+ public function add_admin_menu()
76
+ {
77
+ \add_menu_page('Content Egg', 'Content Egg', 'publish_posts', Plugin::slug, null, 'dashicons-screenoptions');
78
+ }
79
+
80
+ public static function render($view_name, $_data = null)
81
+ {
82
+ if (is_array($_data))
83
+ extract($_data, EXTR_PREFIX_SAME, 'data');
84
+ else
85
+ $data = $_data;
86
+
87
+ include \ContentEgg\PLUGIN_PATH . 'application/admin/views/' . TextHelper::clear($view_name) . '.php';
88
+ }
89
+
90
+
91
+
92
+ }
application/admin/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/admin/views/_metabox_results.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="data_results" ng-if="models.<?php echo $module_id; ?>.added.length">
2
+ <div class="row">
3
+ <div class="col-md-12 added_data" ng-repeat="data in models.<?php echo $module_id; ?>.added">
4
+ <div class="row" style="padding: 5px;">
5
+ <div class="col-md-2">
6
+ <img ng-src="{{data.img}}" class="img-responsive" style="max-height: 160px;" />
7
+ </div>
8
+ <div class="col-md-9">
9
+ <input type="text" placeholder="<?php _e('Заголовок', 'content-egg'); ?>" ng-model="data.title" class="form-control"><br>
10
+ <textarea type="text" placeholder="<?php _e('Описание', 'content-egg'); ?>" rows="2" ng-model="data.description" class="col-sm-12 "></textarea>
11
+ </div>
12
+ <div class="col-md-1">
13
+ <a href="{{data.url}}" target="_blank"><?php _e('Перейти', 'content-egg'); ?></a><br><br>
14
+ <a ng-click="delete(data, '<?php echo $module_id; ?>')"><?php _e('Удалить', 'content-egg'); ?></a>
15
+ </div>
16
+
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </div>
application/admin/views/_metabox_search_results.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="search_results" ng-show="models.<?php echo $module_id; ?>.results.length > 0 && !models.<?php echo $module_id; ?>.processing">
2
+ <div class="row search_results_row" ng-class="{'result_added' : result.added}" ng-click="add(result, '<?php echo $module_id; ?>')" repeat-done ng-repeat="result in models.<?php echo $module_id; ?>.results">
3
+ <div class="col-md-1">
4
+ <img ng-src="{{result.img}}" ng-if="result.img" class="img-thumbnail" />
5
+ </div>
6
+ <div class="col-md-11">
7
+ <strong ng-show="result.title">{{result.title}}</strong>
8
+ <p ng-show="result.description">{{result.description | limitTo: 200}}{{result.description.length > 200 ? '&hellip;' : ''}}</p>
9
+ <p ng-show="result.price">{{result.currencyCode}} <strike ng-show="result.priceOld">{{result.priceOld}}</strike> {{result.price}}</p>
10
+ </div>
11
+ </div>
12
+ </div>
application/admin/views/_metabox_search_results_images.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <div class="search_results" ng-show="models.<?php echo $module_id; ?>.results.length > 0 && !models.<?php echo $module_id; ?>.processing">
2
+ <div justified-gallery="{rowHeight: 160}">
3
+ <a ng-class="{'result_added' : result.added}" ng-click="add(result, '<?php echo $module_id; ?>')" repeat-done ng-repeat="result in models.<?php echo $module_id; ?>.results">
4
+ <img alt="{{result.title}}" ng-src="{{result.img}}"/>
5
+ </a>
6
+ </div>
7
+ </div>
application/admin/views/metabox_general.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php \wp_nonce_field('contentegg_metabox', 'contentegg_nonce'); ?>
2
+
3
+ <div clas="row">
4
+ <div class="col-sm-5">
5
+ <div class="input-group">
6
+
7
+
8
+ <input ng-disabled="processCounter" type="text" ng-model="global_keywords" select-on-click on-enter="global_findAll()" class="form-control col-md-6" placeholder="<?php _e('Введите ключевое слово', 'content-egg'); ?>" aria-label="<?php _e('Введите ключевое слово', 'content-egg'); ?>">
9
+ <div class="input-group-btn">
10
+ <button ng-disabled='processCounter || !global_keywords' ng-click="global_findAll()" type="button" class="btn btn-info"><?php _e('Найти все', 'content-egg'); ?></button>
11
+ </div>
12
+ </div>
13
+ </div>
14
+ <div class="col-sm-7 text-right">
15
+ <button ng-show='!processCounter && global_isSearchResults()' ng-click="global_addAll()" type="button" class="btn btn-default btn-sm"><?php _e('Добавить все', 'content-egg'); ?></button>
16
+ <button ng-show='global_isAddedResults()' ng-click="global_deleteAll()" ng-confirm-click="<?php _e('Вы действительно хотите удалить результаты всех модулей?', 'content-egg'); ?>" type="button" class="btn btn-default btn-sm"><?php _e('Удалить все', 'content-egg'); ?></button>
17
+ </div>
18
+ </div>
19
+ <div class="row">
20
+ <div class="col-sm-12"><hr></div>
21
+ </div>
application/admin/views/metabox_module.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div ng-controllerTMP="<?php echo $module_id; ?>Controller">
2
+
3
+ <input type="hidden" name="cegg_data[<?php echo $module_id; ?>]" ng-value="models.<?php echo $module_id; ?>.added | json" />
4
+ <input type="hidden" name="cegg_updateKeywords[<?php echo $module_id; ?>]" ng-value="updateKeywords.<?php echo $module_id; ?>" />
5
+ <tabset>
6
+ <tab active="activeResultTabs.<?php echo $module_id; ?>">
7
+ <tab-heading>
8
+ <strong><?php echo $module_id; ?></strong>
9
+ <span ng-show="models.<?php echo $module_id; ?>.added.length" class="label" ng-class="{'label-danger':models.<?php echo $module_id; ?>.added_changed, 'label-default':!models.<?php echo $module_id; ?>.added_changed}">{{models.<?php echo $module_id; ?>.added.length}}</span>
10
+ </tab-heading>
11
+
12
+ <div class="data_panel">
13
+
14
+ <div clas="row">
15
+ <div class="col-sm-3">
16
+ <input ng-model="shortcodes.<?php echo $module_id; ?>" select-on-click readonly type="text" class="form-control input-sm" />
17
+ </div>
18
+
19
+ <div class="col-sm-3">
20
+ <?php
21
+ $tpl_manager = new ContentEgg\application\components\ModuleTemplateManager($module_id);
22
+ $templates = $tpl_manager->getDataTemplatesList(true);
23
+ ?>
24
+ <?php if($templates): ?>
25
+ <select ng-model="selectedTemplate_<?php echo $module_id; ?>" ng-change="buildShortcode('<?php echo $module_id; ?>', selectedTemplate_<?php echo $module_id; ?>);">
26
+ <option value="">- <?php _e('Шаблон для шорткода', 'content-egg');?> -</option>
27
+ <?php foreach ($templates as $id => $name):?>
28
+ <option value="<?php echo esc_attr($id);?>"><?php echo esc_html($name);?></option>
29
+ <?php endforeach; ?>
30
+ </select>
31
+ <?php endif;?>
32
+ </div>
33
+
34
+ <?php if ($module->isAffiliateParser()): ?>
35
+ <div class="col-md-3">
36
+ <input id="updateKeyword_<?php echo $module_id; ?>" type="text" ng-model="updateKeywords.<?php echo $module_id; ?>" class="form-control" placeholder="<?php _e('Ключевое слово для автоматического обновления данных', 'content-egg'); ?>" />
37
+ </div>
38
+ <?php endif; ?>
39
+ <div class="col-sm-<?php if ($module->isAffiliateParser()) echo 3; else echo 6; ?> text-right">
40
+ <a class='btn btn-default btn-sm' ng-click="deleteAll('<?php echo $module_id; ?>')" ng-confirm-click="<?php _e('Вы действительно хотите удалить все результаты?', 'content-egg'); ?>" ng-show='models.<?php echo $module_id; ?>.added.length'><?php _e('Удалить все', 'content-egg'); ?></a>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ <div class="clearfix"></div>
45
+ <p ng-show="!models.<?php echo $module_id; ?>.added.length && !models.<?php echo $module_id; ?>.processing" class="bg-warning text-center"><br><?php _e('Данные не найдены...', 'content-egg'); ?><br><br></p>
46
+ <?php $module->renderResults(); ?>
47
+ </tab>
48
+
49
+ <tab active="activeSearchTabs.<?php echo $module_id; ?>" heading="<?php _e('Поиск', 'content-egg'); ?>">
50
+ <div class="search_panel">
51
+ <div clas="row">
52
+ <div class="col-md-5">
53
+
54
+ <div class="input-group" ng-show="!models.<?php echo $module_id; ?>.processing">
55
+ <input type="text" select-on-click ng-model="keywords.<?php echo $module_id; ?>" on-enter="find('<?php echo $module_id; ?>')" class="form-control col-md-6" placeholder="<?php _e('Ключевое слово для поиска', 'content-egg'); ?>" />
56
+ <div class="input-group-btn">
57
+ <button ng-disabled="!keywords.<?php echo $module_id; ?>" ng-click="find('<?php echo $module_id; ?>')" type="button" class="btn btn-info"><?php _e('Найти', 'content-egg'); ?></button>
58
+ <?php if ($module->isAffiliateParser()): ?>
59
+ <button ng-disabled="!keywords.<?php echo $module_id; ?>" ng-click="setUpdateKeyword('<?php echo $module_id; ?>')" type="button" class="btn btn-info">&rarr;</button>
60
+ <?php endif; ?>
61
+ </div>
62
+ </div>
63
+ <img ng-show="models.<?php echo $module_id; ?>.processing" src="<?php echo \ContentEgg\PLUGIN_RES . '/img/loader.gif' ?>" />
64
+ </div>
65
+ <div class="col-md-6">
66
+ <div ng-show="!models.<?php echo $module_id; ?>.processing">
67
+ <?php $module->renderSearchPanel(); ?>
68
+ </div>
69
+ </div>
70
+ <div class="col-sm-1 text-right">
71
+ <a class='btn btn-default btn-sm' ng-click="addAll('<?php echo $module_id; ?>')" ng-show='models.<?php echo $module_id; ?>.results.length > 0 && !models.<?php echo $module_id; ?>.processing'><?php _e('Добавить все', 'content-egg'); ?></a>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ <div class="clearfix"></div>
76
+
77
+ <?php $module->renderSearchResults(); ?>
78
+
79
+ <p ng-show="!models.<?php echo $module_id; ?>.processing && models.<?php echo $module_id; ?>.loaded && models.<?php echo $module_id; ?>.results.length == 0" class="bg-warning text-center"><br><?php _e('Не найдено...', 'content-egg'); ?><br><br></p>
80
+ <p ng-show="models.<?php echo $module_id; ?>.error" class="bg-danger text-center"><br><?php _e('Ошибка: ', 'content-egg'); ?> {{models.<?php echo $module_id; ?>.error}}<br><br></p>
81
+ </tab>
82
+ </tabset>
83
+ <div class="row">
84
+ <div class="col-sm-12"><br></div>
85
+ </div>
86
+ </div>
application/admin/views/settings.php ADDED
@@ -0,0 +1,120 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Некоторые иконы Yusuke Kamiyamane. Доступно по лицензии Creative Commons Attribution 3.0.
4
+ * @link: http://p.yusukekamiyamane.com
5
+ */
6
+ ?>
7
+
8
+ <?php if (\ContentEgg\application\Plugin::isFree()): ?>
9
+ <div class="cegg-maincol">
10
+ <?php endif; ?>
11
+ <div class="wrap">
12
+ <h2>
13
+ <?php _e('Content Egg Настройки', 'content-egg'); ?>
14
+ <?php if (\ContentEgg\application\Plugin::isPro()): ?>
15
+ <span class="cegg-pro-label">pro</span>
16
+ <?php endif; ?>
17
+ </h2>
18
+
19
+ <?php $modules = \ContentEgg\application\components\ModuleManager::getInstance()->getConfigurableModules(); ?>
20
+
21
+ <h2 class="nav-tab-wrapper">
22
+ <a href="?page=content-egg"
23
+ class="nav-tab<?php if (!empty($_GET['page']) && $_GET['page'] == 'content-egg') echo ' nav-tab-active'; ?>">
24
+ <?php _e('Общие настройки', 'content-egg'); ?>
25
+ </a>
26
+ <?php foreach ($modules as $module): ?>
27
+ <?php $config = $module->getConfigInstance(); ?>
28
+ <a href="?page=<?php echo esc_attr($config->page_slug()); ?>"
29
+ class="nav-tab<?php if (!empty($_GET['page']) && $_GET['page'] == $config->page_slug()) echo ' nav-tab-active'; ?>">
30
+ <img src="<?php echo ContentEgg\PLUGIN_RES; ?>/img/status-<?php echo $module->isActive() ? 'active' : 'inactive' ?>.png" />
31
+ <?php echo esc_html($module->getName()); ?>
32
+ </a>
33
+ <?php endforeach; ?>
34
+ </h2>
35
+
36
+ <div class="ui-sortable meta-box-sortables">
37
+ <div class="postbox1">
38
+ <div class="inside">
39
+
40
+ <div class="cegg-wrap">
41
+
42
+ <div class="cegg-maincol">
43
+
44
+ <h3>
45
+ <?php
46
+ if (!empty($_GET['page']) && $_GET['page'] == 'content-egg')
47
+ _e('Общие настройки', 'content-egg');
48
+ else
49
+ echo esc_html($header);
50
+ ?>
51
+ </h3>
52
+
53
+ <?php settings_errors(); ?>
54
+ <form action="options.php" method="POST">
55
+ <?php settings_fields($page_slug); ?>
56
+ <table class="form-table">
57
+ <?php do_settings_fields($page_slug, 'default'); ?>
58
+ </table>
59
+ <?php submit_button(); ?>
60
+ </form>
61
+
62
+ </div>
63
+
64
+ <div class="cegg-rightcol">
65
+ <div>
66
+ <?php
67
+ if (!empty($description))
68
+ echo '<p>' . $description . '</p>';
69
+
70
+ if (!empty($api_agreement))
71
+ echo '<div style="text-align: right;"><small><a href="' . $api_agreement . '" target="_blank">' . __('Условия', 'content-egg') . '</a></small></div>';
72
+ ?>
73
+
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+
85
+ <?php if (\ContentEgg\application\Plugin::isFree()): ?>
86
+ </div>
87
+ <div class="cegg-rightcol">
88
+ <div class="cegg-box" style="margin-top: 95px;">
89
+ <h2>
90
+ Content Egg Pro
91
+ <span class="cegg-pro-label">pro</span>
92
+ </h2>
93
+
94
+ <p>
95
+ <?php _e('Множество дополнительных модулей и расширенный функционал.', 'content-egg'); ?>
96
+ </p>
97
+ <h3><?php _e('Контент модули:', 'content-egg'); ?></h3>
98
+ <ul>
99
+ <li><?php _e('Bing картинки', 'content-egg'); ?></li>
100
+ <li><?php _e('Flickr фотографии', 'content-egg'); ?></li>
101
+ <li><?php _e('Google книги', 'content-egg'); ?></li>
102
+ <li><?php _e('Google новости', 'content-egg'); ?></li>
103
+ <li><?php _e('Яндекс.Маркет', 'content-egg'); ?></li>
104
+ <li>Twitter</li>
105
+ <li><?php _e('ВКонтакте новости', 'content-egg'); ?></li>
106
+ <li>...</li>
107
+ </ul>
108
+ <h3><?php _e('Монетизация:', 'content-egg'); ?></h3>
109
+ <ul>
110
+ <li>Aliexpress</li>
111
+ <li>eBay</li>
112
+ <li>Zanox</li>
113
+ <li>...</li>
114
+ </ul>
115
+ <p>
116
+ <a class="button button-primary" href="http://www.keywordrush.com/<?php if(!in_array(\get_locale(), array('ru_RU', 'uk'))) echo 'en/' ?>contentegg"><?php _e('Узнать больше...', 'content-egg'); ?></a>
117
+ </p>
118
+ </div>
119
+ </div>
120
+ <?php endif; ?>
application/components/AffiliateParserModule.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\helpers\ImageHelper;
6
+
7
+ /**
8
+ * AffiliateParserModule abstract class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ abstract class AffiliateParserModule extends ParserModule {
15
+
16
+ final public function isAffiliateParser()
17
+ {
18
+ return true;
19
+ }
20
+
21
+ public function isItemsUpdateAvailable()
22
+ {
23
+ return false;
24
+ }
25
+
26
+ public function doRequestItems(array $items)
27
+ {
28
+ throw new \Exception('doRequestItems method not implemented yet');
29
+ }
30
+
31
+ public function presavePrepare($data, $post_id)
32
+ {
33
+ $data = parent::presavePrepare($data, $post_id);
34
+ foreach ($data as $key => $item)
35
+ {
36
+ if (!$item['percentageSaved'] && $item['priceOld'] && $item['price'] != $item['priceOld'])
37
+ {
38
+ $data[$key]['percentageSaved'] = floor(((float) $item['priceOld'] - (float) $item['price']) / (float) $item['priceOld'] * 100);
39
+ }
40
+ }
41
+ return $data;
42
+ }
43
+
44
+ }
application/components/AffiliateParserModuleConfig.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * ParserModuleConfig abstract class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ abstract class AffiliateParserModuleConfig extends ParserModuleConfig {
13
+
14
+ public function options()
15
+ {
16
+ $options = array(
17
+ 'ttl' => array(
18
+ 'title' => __('Автоматическое обновление', 'content-egg'),
19
+ 'description' => __('Время жини кэша в секундах, через которое необходимо обновить товары, если задано ключевое слово для обновления. 0 - никогда не обновлять.', 'content-egg'),
20
+ 'callback' => array($this, 'render_input'),
21
+ 'default' => 2592000,
22
+ 'validator' => array(
23
+ 'trim',
24
+ 'absint',
25
+ ),
26
+ 'section' => 'default',
27
+ ),
28
+ );
29
+
30
+ if ($this->getModuleInstance()->isItemsUpdateAvailable())
31
+ {
32
+ $options['ttl_items'] = array(
33
+ 'title' => __('Обновить товары', 'content-egg'),
34
+ 'description' => __('Время в секундах, через которое необходимо обновить цену, наличие и некоторую другую информацию по товарам. 0 - никогда не обновлять.', 'content-egg'),
35
+ 'callback' => array($this, 'render_input'),
36
+ 'default' => 604800,
37
+ 'validator' => array(
38
+ 'trim',
39
+ 'absint',
40
+ ),
41
+ 'section' => 'default',
42
+ );
43
+ }
44
+
45
+ return
46
+ array_merge(
47
+ parent::options(), $options
48
+ );
49
+ }
50
+
51
+ }
application/components/Config.php ADDED
@@ -0,0 +1,297 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * Config class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ abstract class Config {
13
+
14
+ protected $page_slug;
15
+ protected $option_name;
16
+ protected $option_values = array();
17
+ protected $options = array();
18
+ private static $_instances = array();
19
+
20
+ public static function getInstance()
21
+ {
22
+ $class = get_called_class();
23
+ if (!isset(self::$_instances[$class]))
24
+ {
25
+ self::$_instances[$class] = new $class();
26
+ }
27
+ return self::$_instances[$class];
28
+ }
29
+
30
+ protected function __construct()
31
+ {
32
+ $this->option_name = $this->option_name();
33
+ $this->options = $this->options();
34
+ $this->option_values = get_option($this->option_name);
35
+ $this->page_slug = $this->page_slug();
36
+ }
37
+
38
+ public function option($opt_name)
39
+ {
40
+ return $this->get_current($opt_name);
41
+ }
42
+
43
+ public function adminInit()
44
+ {
45
+ global $pagenow;
46
+ add_action('admin_menu', array($this, 'add_admin_menu'));
47
+
48
+ if ($pagenow == 'options.php' || (!empty($_GET['page']) && $_GET['page'] == $this->page_slug))
49
+ {
50
+ add_action('admin_init', array($this, 'register_settings'));
51
+ }
52
+ }
53
+
54
+ abstract public function page_slug();
55
+
56
+ abstract public function option_name();
57
+
58
+ abstract protected function options();
59
+
60
+ abstract public function add_admin_menu();
61
+
62
+ public function get_page_slug()
63
+ {
64
+ return $this->page_slug;
65
+ }
66
+
67
+ protected function get_default($option)
68
+ {
69
+ if (isset($this->options[$option]) && isset($this->options[$option]['default']))
70
+ return $this->options[$option]['default'];
71
+ else
72
+ return '';
73
+ }
74
+
75
+ protected function get_validator($option)
76
+ {
77
+ if (isset($this->options[$option]) && isset($this->options[$option]['validator']))
78
+ return $this->options[$option]['validator'];
79
+ else
80
+ return null;
81
+ }
82
+
83
+ protected function get_current($option)
84
+ {
85
+ if (isset($this->option_values[$option]))
86
+ return $this->option_values[$option];
87
+ elseif ($this->option_values && $this->is_checkbox($option))
88
+ {
89
+ return false;
90
+ } else
91
+ return $this->get_default($option);
92
+ }
93
+
94
+ public function register_settings()
95
+ {
96
+ register_setting(
97
+ $this->page_slug, // group, used for settings_fields()
98
+ $this->option_name, // option name, used as key in database
99
+ array($this, 'validate') // validation callback
100
+ );
101
+
102
+ foreach ($this->options as $id => $field)
103
+ {
104
+ $params = array(
105
+ 'name' => $id, // value for 'name' attribute
106
+ 'title' => $field['title'],
107
+ 'description' => $field['description'],
108
+ 'value' => $this->get_current($id),
109
+ 'option_name' => $this->option_name,
110
+ 'label_for' => 'label-' . $id,
111
+ );
112
+ if (!empty($field['dropdown_options']))
113
+ $params['dropdown_options'] = $field['dropdown_options'];
114
+
115
+ if (!empty($field['render_after']))
116
+ $params['render_after'] = $field['render_after'];
117
+ if (empty($field['section']))
118
+ $field['section'] = 'default';
119
+ add_settings_field(
120
+ $id, $field['title'], $field['callback'], $this->page_slug, // menu slug
121
+ $field['section'], $params
122
+ );
123
+ }
124
+ }
125
+
126
+ public function render_input($args)
127
+ {
128
+ echo '<input name="' . esc_attr($args['option_name']) . '['
129
+ . esc_attr($args['name']) . ']" id="'
130
+ . esc_attr($args['label_for']) . '" value="'
131
+ . esc_attr($args['value']) . '" class="regular-text" />';
132
+ if (!empty($args['render_after']))
133
+ echo $args['render_after'];
134
+ if ($args['description'])
135
+ {
136
+ echo '<p class="description">' . $args['description'] . '</p>';
137
+ }
138
+ }
139
+
140
+ public function render_checkbox($args)
141
+ {
142
+ if ((bool) $args['value'])
143
+ $checked = ' checked="checked" ';
144
+ else
145
+ $checked = '';
146
+ echo '<label for="' . esc_attr($args['label_for']) . '">';
147
+ echo '<input type="checkbox" name="' . esc_attr($args['option_name']) . '['
148
+ . esc_attr($args['name']) . ']" id="'
149
+ . esc_attr($args['label_for']), '"'
150
+ . $checked . ' value="1" />';
151
+ if ($args['description'])
152
+ {
153
+ echo ' ' . $args['description'];
154
+ }
155
+ echo '</label>';
156
+ }
157
+
158
+ public function render_dropdown($args)
159
+ {
160
+ echo '<select name="' . esc_attr($args['option_name']) . '['
161
+ . esc_attr($args['name']) . ']" id="'
162
+ . esc_attr($args['label_for']) . '" value="'
163
+ . esc_attr($args['value']) . '" >';
164
+ foreach ($args['dropdown_options'] as $option_value => $option_name)
165
+ {
166
+ if ($option_value === $args['value'])
167
+ $selected = ' selected="selected" ';
168
+ else
169
+ $selected = '';
170
+ echo '<option value="' . esc_attr($option_value) . '"' . $selected . '>' . esc_html($option_name) . '</option>';
171
+ }
172
+ echo '</select>';
173
+
174
+ if (!empty($args['render_after']))
175
+ echo $args['render_after'];
176
+ if ($args['description'])
177
+ {
178
+ echo '<p class="description">' . $args['description'] . '</p>';
179
+ }
180
+ }
181
+
182
+ public function option_exists($option)
183
+ {
184
+ if (array_key_exists($option, $this->options))
185
+ return true;
186
+ else
187
+ return false;
188
+ }
189
+
190
+ public function validate($input)
191
+ {
192
+ if (!is_array($input))
193
+ return;
194
+ $out = array();
195
+ foreach ($input as $option => $value)
196
+ {
197
+ if (!$this->option_exists($option))
198
+ continue;
199
+
200
+ $value = trim($value);
201
+
202
+ if ($validator = $this->get_validator($option))
203
+ {
204
+ if (!is_array($validator))
205
+ continue;
206
+ foreach ($validator as $v)
207
+ {
208
+ if (!is_array($v))
209
+ {
210
+ if ($v == 'allow_empty')
211
+ {
212
+ if ($value === '')
213
+ break;
214
+ else
215
+ continue;
216
+ }
217
+
218
+ // filter
219
+ $value = call_user_func($v, $value);
220
+ } else
221
+ {
222
+ // check 'when' condition
223
+ if (!empty($v['when']))
224
+ {
225
+ $when_value = $this->get_submitted_value($v['when'], $input, $out);
226
+ if (!$when_value)
227
+ continue;
228
+ }
229
+ // validator
230
+ if (empty($v['arg']))
231
+ $res = call_user_func($v['call'], $value);
232
+ else
233
+ $res = call_user_func($v['call'], $value, $v['arg']);
234
+ if (!$res)
235
+ {
236
+ add_settings_error($option, $option, $v['message']);
237
+ $value = $this->get_current($option);
238
+
239
+ if (!empty($v['when']))
240
+ {
241
+ $out[$v['when']] = $this->get_current($v['when']);
242
+ }
243
+
244
+ break;
245
+ }
246
+ }
247
+ }
248
+ }
249
+ $out[$option] = $value;
250
+ }
251
+ return $out;
252
+ }
253
+
254
+ public function is_checkbox($option)
255
+ {
256
+ if ($this->options[$option]['callback'][1] == 'render_checkbox')
257
+ return true;
258
+ else
259
+ return false;
260
+ }
261
+
262
+ /**
263
+ * Current submitted value
264
+ */
265
+ private function get_submitted_value($option, $input, $out)
266
+ {
267
+ if (!$this->option_exists($option))
268
+ throw new \Exception('Options "' . $option . '" does not exists.');
269
+
270
+ if (!isset($input[$option]) && $this->is_checkbox($option))
271
+ return false;
272
+
273
+ if (!isset($input[$option]))
274
+ throw new \Exception('Options "' . $option . '" does not exists.');
275
+
276
+ if (isset($out[$option]))
277
+ return $out[$option];
278
+ else
279
+ return $input[$option];
280
+ }
281
+
282
+ public function getOptionsList()
283
+ {
284
+ return array_keys($this->options());
285
+ }
286
+
287
+ public function getOptionValues()
288
+ {
289
+ $result = array();
290
+ foreach ($this->getOptionsList() as $option_name)
291
+ {
292
+ $result[$option_name] = $this->get_current($option_name);
293
+ }
294
+ return $result;
295
+ }
296
+
297
+ }
application/components/Content.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * Content class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ class Content {
13
+
14
+ public $unique_id;
15
+ public $title;
16
+ public $description;
17
+ public $img;
18
+ public $last_update;
19
+ public $extra;
20
+
21
+ }
application/components/ContentManager.php ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\helpers\ImageHelper;
6
+ use ContentEgg\application\helpers\TextHelper;
7
+
8
+ /**
9
+ * ContentManager class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ class ContentManager {
16
+
17
+ const META_PREFIX_DATA = '_cegg_data_';
18
+ const META_PREFIX_LAST_ITEMS_UPDATE = '_cegg_last_update_';
19
+ const META_PREFIX_KEYWORD = '_cegg_keyword';
20
+ const META_PREFIX_LAST_BYKEYWORD_UPDATE = '_cegg_last_bykeyword_update';
21
+
22
+ public static function saveData(array $data, $module_id, $post_id)
23
+ {
24
+ if (!$data)
25
+ {
26
+ self::deleteData($module_id, $post_id);
27
+ return;
28
+ }
29
+ $data = self::setIds($data);
30
+
31
+ $old_data = \get_post_meta($post_id, self::META_PREFIX_DATA . $module_id, true);
32
+ if (!$old_data)
33
+ $old_data = array();
34
+ $outdated = array();
35
+ $data_changed = true;
36
+
37
+ if ($old_data)
38
+ {
39
+ $outdated = array_diff_key($old_data, $data);
40
+ $new = array_diff_key($data, $old_data);
41
+
42
+ if (!$outdated && !$new)
43
+ $data_changed = false;
44
+
45
+ /*
46
+ * we need force data update because title or description can be edited manually or items price update
47
+ if (!$data_changed)
48
+ return;
49
+ *
50
+ */
51
+ }
52
+ // Sanitize content for allowed HTML tags and more.
53
+ array_walk_recursive($data, array('self', 'sanitizeData'));
54
+ $module = ModuleManager::getInstance()->factory($module_id);
55
+ $data = $module->presavePrepare($data, $post_id);
56
+
57
+ // save data
58
+ \update_post_meta($post_id, self::META_PREFIX_DATA . $module_id, $data);
59
+
60
+ self::clearData($outdated);
61
+
62
+ // touch last update time only if data changed?
63
+ if ($data_changed)
64
+ {
65
+ self::touchUpdateTime($post_id, $module_id);
66
+ }
67
+
68
+ \do_action('content_egg_save_data', $data, $module_id);
69
+ }
70
+
71
+ public static function deleteData($module_id, $post_id)
72
+ {
73
+ $data = \get_post_meta($post_id, self::META_PREFIX_DATA . $module_id, true);
74
+ if (!$data)
75
+ return;
76
+
77
+ \delete_post_meta($post_id, self::META_PREFIX_DATA . $module_id);
78
+ \delete_post_meta($post_id, self::META_PREFIX_LAST_BYKEYWORD_UPDATE . $module_id);
79
+ \delete_post_meta($post_id, self::META_PREFIX_LAST_ITEMS_UPDATE . $module_id);
80
+
81
+ self::clearData($data);
82
+
83
+ \do_action('content_egg_save_data', array(), $module_id);
84
+ }
85
+
86
+ private static function clearData($data)
87
+ {
88
+ // delete old img files if needed
89
+ foreach ($data as $d)
90
+ {
91
+ if (empty($d['img_file']))
92
+ continue;
93
+ $img_file = ImageHelper::getFullImgPath($d['img_file']);
94
+ if (is_file($img_file))
95
+ @unlink($img_file);
96
+ }
97
+ }
98
+
99
+ private static function setIds($data)
100
+ {
101
+ $results = array();
102
+ foreach ($data as $d)
103
+ {
104
+ $results[$d['unique_id']] = $d;
105
+ }
106
+ return $results;
107
+ }
108
+
109
+ public static function touchUpdateTime($post_id, $module_id)
110
+ {
111
+ $time = time();
112
+ \update_post_meta($post_id, self::META_PREFIX_LAST_BYKEYWORD_UPDATE . $module_id, $time);
113
+ self::touchUpdateItemsTime($post_id, $module_id, $time);
114
+ }
115
+
116
+ public static function touchUpdateItemsTime($post_id, $module_id, $time = null)
117
+ {
118
+ if (!$time)
119
+ $time = time();
120
+ \update_post_meta($post_id, self::META_PREFIX_LAST_ITEMS_UPDATE . $module_id, $time);
121
+ }
122
+
123
+ private static function sanitizeData(&$data, $key)
124
+ {
125
+ if (in_array((string) $key, array('img', 'url', 'IFrameURL', 'orig_url')))
126
+ {
127
+ //$data = \esc_url_raw($data);
128
+ //@todo... This filter allows all letters, digits and $-_.+!*'(),{}|\\^~[]`"><#%;/?:@&=
129
+ $data = filter_var($data, FILTER_SANITIZE_URL);
130
+ } elseif ($key === 'description')
131
+ {
132
+ $data = \wp_kses_post($data);
133
+ } elseif ($key === 'title')
134
+ {
135
+ $data = \sanitize_text_field($data);
136
+ } elseif ($key === 'last_update' && !$data)
137
+ {
138
+ $data = time();
139
+ } else
140
+ $data = \strip_tags($data);
141
+ }
142
+
143
+ }
application/components/ContentProduct.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * ContentProduct class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ class ContentProduct extends Content {
13
+
14
+ public $price;
15
+ public $priceOld;
16
+ public $percentageSaved;
17
+ public $currency;
18
+ public $currencyCode;
19
+ public $manufacturer;
20
+ public $category;
21
+ public $merchant;
22
+ public $rating;
23
+ public $reviewsCount;
24
+ public $availability;
25
+ public $orig_url;
26
+ }
application/components/ExtraData.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * ExtraData class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ class ExtraData {
13
+
14
+ public $date;
15
+ public $author;
16
+ public $source;
17
+
18
+ //public $price;
19
+ //public $currency;
20
+ //public $currencyCode;
21
+
22
+
23
+ public static function fillAttributes($object_or_array, array $data)
24
+ {
25
+ foreach ($data as $key => $d)
26
+ {
27
+ if (is_object($object_or_array) && property_exists($object_or_array, $key))
28
+ {
29
+ if (is_array($d) && !is_array($object_or_array->$key))
30
+ continue; //?
31
+ $object_or_array->$key = $d;
32
+ } elseif (is_array($object_or_array))
33
+ {
34
+ $object_or_array[$key] = $d;
35
+ }
36
+ }
37
+
38
+ return $object_or_array;
39
+ }
40
+
41
+ }
application/components/Module.php ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\components\ModuleManager;
6
+ use ContentEgg\application\helpers\TextHelper;
7
+
8
+ /**
9
+ * Module abstract class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ abstract class Module {
16
+
17
+ private $id;
18
+ private $dir;
19
+ protected $is_active;
20
+ protected $name;
21
+ protected $api_agreement;
22
+ protected $description;
23
+ private $is_custom;
24
+ private $is_configurable;
25
+
26
+ public function __construct()
27
+ {
28
+ $parts = explode('\\', get_class($this));
29
+ $this->id = $parts[count($parts) - 2];
30
+
31
+ $info = $this->info();
32
+ if (!empty($info['name']))
33
+ $this->name = $info['name'];
34
+ else
35
+ $this->name = $this->id;
36
+ if (!empty($info['api_agreement']))
37
+ $this->api_agreement = $info['api_agreement'];
38
+ if (!empty($info['description']))
39
+ $this->description = $info['description'];
40
+ }
41
+
42
+ public function info()
43
+ {
44
+ return array();
45
+ }
46
+
47
+ final public function getId()
48
+ {
49
+ return $this->id;
50
+ }
51
+
52
+ public function getName()
53
+ {
54
+ return $this->name;
55
+ }
56
+
57
+ public function getDir()
58
+ {
59
+ if ($this->dir === null)
60
+ {
61
+ $rc = new \ReflectionClass(get_class($this));
62
+ $this->dir = dirname($rc->getFileName()) . DIRECTORY_SEPARATOR;
63
+ }
64
+ return $this->dir;
65
+ }
66
+
67
+ public function isActive()
68
+ {
69
+ if ($this->is_active === null)
70
+ {
71
+ // @todo
72
+ $this->is_active = true;
73
+ }
74
+ return $this->is_active;
75
+ }
76
+
77
+ final public function isCustom()
78
+ {
79
+ if ($this->is_custom === null)
80
+ {
81
+ // @todo
82
+ $this->is_custom = false;
83
+ }
84
+ return $this->is_custom;
85
+ }
86
+
87
+ public function isConfigurable()
88
+ {
89
+ if ($this->is_configurable === null)
90
+ {
91
+ if (is_file($this->getDir() . $this->getId() . 'Config.php'))
92
+ $this->is_configurable = true;
93
+ else
94
+ $this->is_configurable = false;
95
+ }
96
+ return $this->is_configurable;
97
+ }
98
+
99
+ public function isFree()
100
+ {
101
+ return false;
102
+ }
103
+
104
+ public function renderResults()
105
+ {
106
+
107
+ }
108
+
109
+ public function renderSearchResults()
110
+ {
111
+
112
+ }
113
+
114
+ public function renderSearchPanel()
115
+ {
116
+
117
+ }
118
+
119
+ public function enqueueScripts()
120
+ {
121
+
122
+ }
123
+
124
+ public function presavePrepare($data, $post_id)
125
+ {
126
+ return $data;
127
+ }
128
+
129
+ public function getConfigInstance()
130
+ {
131
+ return ModuleManager::configFactory($this->getId());
132
+ }
133
+
134
+ public function config($opt_name, $default = null)
135
+ {
136
+ if (!$this->getConfigInstance()->option_exists($opt_name))
137
+ return $default;
138
+ else
139
+ return $this->getConfigInstance()->option($opt_name);
140
+ }
141
+
142
+ public function render($view_name, $_data = null)
143
+ {
144
+ if (is_array($_data))
145
+ extract($_data, EXTR_PREFIX_SAME, 'data');
146
+ else
147
+ $data = $_data;
148
+
149
+ include \ContentEgg\PLUGIN_PATH . 'application/modules/' . $this->getId() . '/views/' . TextHelper::clear($view_name) . '.php';
150
+ }
151
+
152
+ public function getJsUri()
153
+ {
154
+ return \plugins_url('\application\modules\\' . $this->getId() . '\js', \ContentEgg\PLUGIN_FILE);
155
+ }
156
+
157
+ public function getApiAgreement()
158
+ {
159
+ return $this->api_agreement;
160
+ }
161
+
162
+ public function getDescription()
163
+ {
164
+ return $this->description;
165
+ }
166
+
167
+ public function isAffiliateParser()
168
+ {
169
+ return false;
170
+ }
171
+
172
+ public function isParser()
173
+ {
174
+ return false;
175
+ }
176
+ }
application/components/ModuleApi.php ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\Plugin;
6
+ use ContentEgg\application\components\ModuleManager;
7
+ use ContentEgg\application\helpers\TextHelper;
8
+ use ContentEgg\application\helpers\InputHelper;
9
+
10
+ /**
11
+ * ModuleApi class file
12
+ *
13
+ * @author keywordrush.com <support@keywordrush.com>
14
+ * @link http://www.keywordrush.com/
15
+ * @copyright Copyright &copy; 2015 keywordrush.com
16
+ */
17
+ class ModuleApi {
18
+
19
+ const API_BASE = '-module-api';
20
+
21
+ public function __construct()
22
+ {
23
+ \add_action('wp_ajax_content-egg-module-api', array($this, 'addApiEntry'));
24
+ }
25
+
26
+ public static function apiBase()
27
+ {
28
+ return Plugin::slug . self::API_BASE;
29
+ }
30
+
31
+ public function addApiEntry()
32
+ {
33
+ if (!\current_user_can('edit_posts'))
34
+ throw new \Exception("Access denied.");
35
+
36
+ if (empty($_GET['module']))
37
+ throw new \Exception("Module is undefined.");
38
+
39
+ $module_id = TextHelper::clear($_GET['module']);
40
+
41
+ \check_ajax_referer('contentegg-metabox', '_contentegg_nonce');
42
+
43
+ $parser = ModuleManager::getInstance()->parserFactory($module_id);
44
+
45
+ if (!$parser->isActive())
46
+ throw new \Exception("Parser module " . $parser->getId() . " is inactive.");
47
+
48
+ $query = stripslashes (InputHelper::get('query', ''));
49
+ $query = json_decode($query, true);
50
+
51
+ if (!$query)
52
+ throw new \Exception("Error: 'query' parameter cannot be empty.");
53
+ if (empty($query['keyword']) || !($keyword = TextHelper::clear_utf8($query['keyword'])))
54
+ throw new \Exception("Error: 'keyword' parameter cannot be empty.");
55
+
56
+ try
57
+ {
58
+ $data = $parser->doRequest($keyword, $query);
59
+ foreach ($data as $key => $item)
60
+ {
61
+ if (!$item->unique_id)
62
+ throw new \Exception('Item data "unique_id" must be specified.');
63
+
64
+ if ($item->description)
65
+ {
66
+ $item->description = TextHelper::br2nl($item->description);
67
+ $item->description = TextHelper::removeExtraBreaks($item->description);
68
+ }
69
+ }
70
+ $this->formatJson(array('results' => $data, 'error' => ''));
71
+ } catch (\Exception $e)
72
+ {
73
+ $this->formatJson(array('error' => $e->getMessage()));
74
+ }
75
+ }
76
+
77
+ public function formatJson($data)
78
+ {
79
+ header('Content-Type: application/json; charset=UTF-8');
80
+ echo json_encode($data);
81
+ \wp_die();
82
+ }
83
+
84
+ }
application/components/ModuleConfig.php ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\Plugin;
6
+ use ContentEgg\application\admin\PluginAdmin;
7
+
8
+ /**
9
+ * ModuleConfig abstract class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ abstract class ModuleConfig extends Config {
16
+
17
+ protected $module_id;
18
+
19
+ protected function __construct()
20
+ {
21
+ $parts = explode('\\', get_class($this));
22
+ $this->module_id = $parts[count($parts) - 2];
23
+ parent::__construct();
24
+ }
25
+
26
+ public function getModuleId()
27
+ {
28
+ return $this->module_id;
29
+ }
30
+
31
+ public function getModuleName()
32
+ {
33
+ return $this->getModuleInstance()->getName();
34
+ }
35
+
36
+ public function getModuleInstance()
37
+ {
38
+ return ModuleManager::factory($this->getModuleId());
39
+ }
40
+
41
+ public function page_slug()
42
+ {
43
+ return Plugin::slug() . '-' . $this->getModuleId();
44
+ }
45
+
46
+ public function option_name()
47
+ {
48
+ return Plugin::slug() . '_' . $this->getModuleId();
49
+ }
50
+
51
+ public function add_admin_menu()
52
+ {
53
+ \add_submenu_page(null, $this->getModuleId() . ' ' . __('настройки', 'content-egg') . ' &lsaquo; Content Egg', '', 'manage_options', $this->page_slug, array($this, 'settings_page'));
54
+ }
55
+
56
+ public function settings_page()
57
+ {
58
+ PluginAdmin::render('settings', array('page_slug' => $this->page_slug(),
59
+ 'header' => $this->getModuleName() . ' ' . __('настройки', 'content-egg'),
60
+ 'api_agreement' => $this->getModuleInstance()->getApiAgreement(),
61
+ 'description' => $this->getModuleInstance()->getDescription(),
62
+ ));
63
+ }
64
+
65
+ public function options(){
66
+ return array();
67
+ }
68
+
69
+ }
application/components/ModuleManager.php ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use \ContentEgg\application\Plugin;
6
+ use \ContentEgg\application\helpers\TextHelper;
7
+
8
+ /**
9
+ * ModuleManager class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ class ModuleManager {
16
+
17
+ const MODULES_DIR = 'application/modules';
18
+
19
+ private static $modules = array();
20
+ private static $active_modules = array();
21
+ private static $configs = array();
22
+ private static $instance = null;
23
+
24
+ public static function getInstance()
25
+ {
26
+ if (self::$instance == null)
27
+ self::$instance = new self;
28
+
29
+ return self::$instance;
30
+ }
31
+
32
+ private function __construct()
33
+ {
34
+ $this->scanForModules();
35
+ $this->fillActiveModules();
36
+ }
37
+
38
+ public function adminInit()
39
+ {
40
+ \add_action('parent_file', array($this, 'highlightAdminMenu'));
41
+ foreach ($this->getConfigurableModules() as $module)
42
+ {
43
+ $config = self::configFactory($module->getId());
44
+ $config->adminInit();
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Highlight the proper submenu item
50
+ */
51
+ public function highlightAdminMenu($parent_file)
52
+ {
53
+ global $plugin_page;
54
+ if (!$parent_file)
55
+ $plugin_page = Plugin::slug;
56
+ return $parent_file;
57
+ }
58
+
59
+ private function scanForModules($path = null)
60
+ {
61
+ if (!$path)
62
+ $path = \ContentEgg\PLUGIN_PATH . self::MODULES_DIR . DIRECTORY_SEPARATOR;
63
+
64
+ $folder_handle = @opendir($path);
65
+ if ($folder_handle === false)
66
+ return;
67
+
68
+ $founded_modules = array();
69
+ while (($m_dir = readdir($folder_handle)) !== false)
70
+ {
71
+ if ($m_dir == '.' || $m_dir == '..')
72
+ continue;
73
+ $module_path = $path . $m_dir;
74
+ if (!is_dir($module_path))
75
+ continue;
76
+
77
+ $module_id = $m_dir;
78
+ $founded_modules[] = TextHelper::clear($module_id);
79
+ }
80
+ closedir($folder_handle);
81
+ $founded_modules = \apply_filters('content_egg_modules', $founded_modules);
82
+
83
+ foreach ($founded_modules as $module_id)
84
+ {
85
+ // create module
86
+ self::factory($module_id);
87
+ }
88
+ ksort(self::$modules);
89
+ }
90
+
91
+ private function fillActiveModules()
92
+ {
93
+ foreach (self::$modules as $module)
94
+ {
95
+ if ($module->isActive())
96
+ self::$active_modules[$module->getId()] = $module;
97
+ }
98
+ }
99
+
100
+ public static function factory($module_id)
101
+ {
102
+ if (!isset(self::$modules[$module_id]))
103
+ {
104
+ $module_class = "\\ContentEgg\\application\\modules\\" . $module_id . "\\" . $module_id . 'Module';
105
+ if (class_exists($module_class, true) === false)
106
+ {
107
+ throw new \Exception("Unable to load module class: '{$module_class}'.");
108
+ }
109
+
110
+ $module = new $module_class;
111
+
112
+ if (!($module instanceof \ContentEgg\application\components\Module))
113
+ {
114
+ throw new \Exception("The module '{$module_id}' must inherit from Module.");
115
+ }
116
+
117
+ if (Plugin::isFree() && !$module->isFree())
118
+ return false;
119
+
120
+ self::$modules[$module_id] = $module;
121
+ }
122
+ return self::$modules[$module_id];
123
+ }
124
+
125
+ public static function parserFactory($module_id)
126
+ {
127
+ $module = self::factory($module_id);
128
+ if (!($module instanceof \ContentEgg\application\components\ParserModule))
129
+ {
130
+ throw new \Exception("The parser module '{$module_id}' must inherit from ParserModule.");
131
+ }
132
+ return $module;
133
+ }
134
+
135
+ public static function configFactory($module_id)
136
+ {
137
+ if (!isset(self::$configs[$module_id]))
138
+ {
139
+
140
+ $config_class = "\\ContentEgg\\application\\modules\\" . $module_id . "\\" . $module_id . 'Config';
141
+ if (class_exists($config_class, true) === false)
142
+ {
143
+ throw new \Exception("Unable to load module config class: '{$config_class}'.");
144
+ }
145
+
146
+ $config = $config_class::getInstance();
147
+
148
+ if (self::factory($module_id)->isParser())
149
+ {
150
+ if (!($config instanceof \ContentEgg\application\components\ParserModuleConfig))
151
+ {
152
+ throw new \Exception("The parser module config '{$config_class}' must inherit from ParserModuleConfig.");
153
+ }
154
+ } else
155
+ {
156
+ if (!($config instanceof \ContentEgg\application\components\ModuleConfig))
157
+ {
158
+ throw new \Exception("The module config '{$config_class}' must inherit from ModuleConfig.");
159
+ }
160
+ }
161
+
162
+ self::$configs[$module_id] = $config;
163
+ }
164
+
165
+ return self::$configs[$module_id];
166
+ }
167
+
168
+ public function getModules($only_active = false)
169
+ {
170
+ if ($only_active)
171
+ return self::$active_modules;
172
+ else
173
+ return self::$modules;
174
+ }
175
+
176
+ public function getModulesIdList($only_active = false)
177
+ {
178
+ return array_keys($this->getModules($only_active));
179
+ }
180
+
181
+ public function getParserModules($only_active = false)
182
+ {
183
+ $modules = $this->getModules($only_active);
184
+ $parsers = array();
185
+ foreach ($modules as $module)
186
+ {
187
+ if ($module->isParser())
188
+ $parsers[$module->getId()] = $module;
189
+ }
190
+ return $parsers;
191
+ }
192
+
193
+ public function getParserModulesIdList($only_active = false)
194
+ {
195
+ return array_keys($this->getParserModules($only_active));
196
+ }
197
+
198
+ public function getConfigurableModules()
199
+ {
200
+ $result = array();
201
+ foreach ($this->getModules() as $module)
202
+ {
203
+ if ($module->isConfigurable())
204
+ $result[] = $module;
205
+ }
206
+ return $result;
207
+ }
208
+
209
+ public function moduleExists($module_id)
210
+ {
211
+ if (isset(self::$modules[$module_id]))
212
+ return true;
213
+ else
214
+ return false;
215
+ }
216
+
217
+ public function isModuleActive($module_id)
218
+ {
219
+ if (isset(self::$active_modules[$module_id]))
220
+ return true;
221
+ else
222
+ return false;
223
+ }
224
+
225
+ }
application/components/ModuleTemplateManager.php ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\helpers\TextHelper;
6
+
7
+ /**
8
+ * ModuleTemplateManager class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class ModuleTemplateManager {
15
+
16
+ const TEMPLATE_DIR = 'templates';
17
+ const CUSTOM_TEMPLATE_DIR = 'content-egg-templates';
18
+ const TEMPLATE_PREFIX_DATA = 'data_';
19
+
20
+ private $module_id;
21
+ private $templates_data = null;
22
+
23
+ public function __construct($module_id)
24
+ {
25
+ $this->module_id = $module_id;
26
+ }
27
+
28
+ public function getTempateDir()
29
+ {
30
+ return \ContentEgg\PLUGIN_PATH . 'application/modules/' . $this->module_id . '/' . self::TEMPLATE_DIR;
31
+ }
32
+
33
+ public function getModuleId()
34
+ {
35
+ return $this->module_id;
36
+ }
37
+
38
+ public function getCustomTempateDirs()
39
+ {
40
+ return array(
41
+ \get_stylesheet_directory() . '/' . self::CUSTOM_TEMPLATE_DIR . '/' . $this->module_id, //child theme
42
+ \get_template_directory() . '/' . self::CUSTOM_TEMPLATE_DIR . '/' . $this->module_id, // theme
43
+ \ABSPATH . 'wp-content/' . self::CUSTOM_TEMPLATE_DIR . '/' . $this->module_id,
44
+ );
45
+ }
46
+
47
+ public function getTemplatesList($prefix)
48
+ {
49
+ $templates = array();
50
+ foreach ($this->getCustomTempateDirs() as $dir)
51
+ {
52
+ $templates = array_merge($templates, $this->scanTemplates($dir, $prefix, true));
53
+ }
54
+ $templates = array_merge($templates, $this->scanTemplates($this->getTempateDir(), $prefix, false));
55
+ $templates = \apply_filters('content_egg_module_templates', $templates, $this->getModuleId());
56
+ return $templates;
57
+ }
58
+
59
+ private function scanTemplates($path, $prefix, $custom = false)
60
+ {
61
+ if ($custom && !is_dir($path))
62
+ return array();
63
+
64
+ $tpl_files = glob($path . '/' . $prefix . '*.php');
65
+ if (!$tpl_files)
66
+ return array();
67
+
68
+ $templates = array();
69
+ foreach ($tpl_files as $file)
70
+ {
71
+ $template_id = basename($file, '.php');
72
+ if ($custom)
73
+ $template_id = 'custom/' . $template_id;
74
+
75
+ $data = get_file_data($file, array('name' => 'Name'));
76
+ if ($data && !empty($data['name']))
77
+ $templates[$template_id] = strip_tags($data['name']);
78
+ else
79
+ $templates[$template_id] = $template_id;
80
+ if ($custom)
81
+ $templates[$template_id] .= ' ' . __('[пользовательский]', 'content-egg');
82
+ }
83
+ return $templates;
84
+ }
85
+
86
+ public function render($view_name, $_data = null)
87
+ {
88
+ if (is_array($_data))
89
+ extract($_data, EXTR_PREFIX_SAME, 'data');
90
+ else
91
+ $data = $_data;
92
+
93
+ $file = $this->getViewPath($view_name);
94
+ if (!$file)
95
+ return '';
96
+
97
+ ob_start();
98
+ ob_implicit_flush(false);
99
+ include $file;
100
+ $res = ob_get_clean();
101
+ return $res;
102
+ }
103
+
104
+ private function getViewPath($view_name)
105
+ {
106
+ $view_name = str_replace('.', '', $view_name);
107
+ if (substr($view_name, 0, 7) == 'custom/')
108
+ {
109
+ $view_name = substr($view_name, 7);
110
+ foreach ($this->getCustomTempateDirs() as $custom_dir)
111
+ {
112
+ $tpl_path = $custom_dir;
113
+ $file = $tpl_path . DIRECTORY_SEPARATOR . TextHelper::clear($view_name) . '.php';
114
+ if (is_file($file) && is_readable($file))
115
+ return $file;
116
+ }
117
+
118
+ return false;
119
+ } else
120
+ {
121
+ $tpl_path = $this->getTempateDir();
122
+ $file = $tpl_path . DIRECTORY_SEPARATOR . TextHelper::clear($view_name) . '.php';
123
+ if (is_file($file) && is_readable($file))
124
+ return $file;
125
+ else
126
+ return false;
127
+ }
128
+ }
129
+
130
+ public function getDataTemplatesList($short_mode = false)
131
+ {
132
+ if ($this->templates_data === null)
133
+ {
134
+ $this->templates_data = self::getTemplatesList(self::TEMPLATE_PREFIX_DATA);
135
+ }
136
+
137
+ if ($short_mode)
138
+ {
139
+ $list = array();
140
+ foreach ($this->templates_data as $id => $name)
141
+ {
142
+ $custom = '';
143
+ if (self::isCunstomTemplate($id))
144
+ {
145
+ $parts = explode('/', $id);
146
+ $custom = 'custom/';
147
+ $id = $parts[1];
148
+ }
149
+
150
+ // del 'data_' prefix
151
+ $list[$custom . substr($id, 5)] = $name;
152
+ }
153
+ return $list;
154
+ }
155
+
156
+ return $this->templates_data;
157
+ }
158
+
159
+ public static function getFullTemplateId($short_id)
160
+ {
161
+ $custom = '';
162
+ if (self::isCunstomTemplate($short_id))
163
+ {
164
+ $parts = explode('/', $short_id);
165
+ $custom = 'custom/';
166
+ $id = $parts[1];
167
+ } else
168
+ $id = $short_id;
169
+
170
+ // check _data prefix
171
+ if (substr($id, 0, 5) !== self::TEMPLATE_PREFIX_DATA)
172
+ {
173
+ $id = self::TEMPLATE_PREFIX_DATA . $id;
174
+ }
175
+ return $custom . $id;
176
+ }
177
+
178
+ public static function isCunstomTemplate($template_id)
179
+ {
180
+ if (substr($template_id, 0, 7) == 'custom/')
181
+ return true;
182
+ else
183
+ return false;
184
+ }
185
+
186
+ public function isDataTemplateExists($tpl)
187
+ {
188
+ return array_key_exists($tpl, $this->getDataTemplatesList());
189
+ }
190
+
191
+ }
application/components/ParserModule.php ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ use ContentEgg\application\helpers\ImageHelper;
6
+
7
+ /**
8
+ * ParserModule abstract class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ abstract class ParserModule extends Module {
15
+
16
+ abstract public function doRequest($keyword, $query_params = array(), $is_autoupdate = false);
17
+
18
+ public function isActive()
19
+ {
20
+ if ($this->is_active === null)
21
+ {
22
+ if ($this->getConfigInstance()->option('is_active'))
23
+ $this->is_active = true;
24
+ else
25
+ $this->is_active = false;
26
+ }
27
+ return $this->is_active;
28
+ }
29
+
30
+ final public function isParser()
31
+ {
32
+ return true;
33
+ }
34
+
35
+ public function presavePrepare($data, $post_id)
36
+ {
37
+ global $post;
38
+
39
+ $data = parent::presavePrepare($data, $post_id);
40
+
41
+ // do not save images for revisions
42
+ if ($post && wp_is_post_revision($post_id))
43
+ return $data;
44
+
45
+ foreach ($data as $key => $item)
46
+ {
47
+ // save img
48
+ if ($this->config('save_img') && !wp_is_post_revision($post_id))
49
+ {
50
+ // check old_data also. need for fix behavior with "preview changes" button
51
+ if ($item['img'] && empty($item['img_file']) && empty($old_data[$key]['img_file']))
52
+ {
53
+ $local_img_name = ImageHelper::saveImgLocaly($item['img'], $item['title']);
54
+ if ($local_img_name)
55
+ {
56
+ $uploads = \wp_upload_dir();
57
+ $item['img'] = $uploads['url'] . '/' . $local_img_name;
58
+ $item['img_file'] = ltrim(trailingslashit($uploads['subdir']), '\/') . $local_img_name;
59
+ }
60
+ $data[$key] = $item;
61
+ }
62
+ }
63
+ }
64
+ return $data;
65
+ }
66
+
67
+ public static function getFullImgPath($img_path)
68
+ {
69
+ $uploads = \wp_upload_dir();
70
+ return trailingslashit($uploads['basedir']) . $img_path;
71
+ }
72
+
73
+ public function defaultTemplateName()
74
+ {
75
+ return 'data_simple';
76
+ }
77
+
78
+ }
application/components/ParserModuleConfig.php ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\components;
4
+
5
+ /**
6
+ * ParserModuleConfig abstract class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ abstract class ParserModuleConfig extends ModuleConfig {
13
+
14
+ public function options()
15
+ {
16
+ $tpl_manager = new ModuleTemplateManager($this->module_id);
17
+ $options = array(
18
+ 'is_active' => array(
19
+ 'title' => __('Включить модуль', 'content-egg'),
20
+ 'description' => '',
21
+ 'callback' => array($this, 'render_checkbox'),
22
+ 'default' => 0,
23
+ 'section' => 'default',
24
+ ),
25
+ 'embed_at' => array(
26
+ 'title' => __('Добавить', 'content-egg'),
27
+ 'description' => __('Куда добавить контент этого модуля? Шорткоды работают всегда в независимости от настройки.', 'content-egg'),
28
+ 'callback' => array($this, 'render_dropdown'),
29
+ 'dropdown_options' => array(
30
+ 'post_bottom' => __('В конец поста', 'content-egg'),
31
+ 'post_top' => __('В начало поста', 'content-egg'),
32
+ 'shortcode' => __('Только шорткоды', 'content-egg'),
33
+ ),
34
+ 'default' => 'post_bottom',
35
+ 'section' => 'default',
36
+ ),
37
+ 'template' => array(
38
+ 'title' => __('Шаблон', 'content-egg'),
39
+ 'description' => __('Шаблон по-умолчанию.', 'content-egg'),
40
+ 'callback' => array($this, 'render_dropdown'),
41
+ 'dropdown_options' => $tpl_manager->getDataTemplatesList(),
42
+ 'default' => $this->getModuleInstance()->defaultTemplateName(),
43
+ 'section' => 'default',
44
+ ),
45
+ 'tpl_title' => array(
46
+ 'title' => __('Заголовок', 'content-egg'),
47
+ 'description' => __('Шаблоны могут использовать заголовок при выводе данных.', 'content-egg'),
48
+ 'callback' => array($this, 'render_input'),
49
+ 'default' => '',
50
+ 'validator' => array(
51
+ 'trim',
52
+ ),
53
+ 'section' => 'default',
54
+ ),
55
+ 'featured_image' => array(
56
+ 'title' => 'Featured image',
57
+ 'description' => __('Автоматически установить Featured image для поста.', 'content-egg'),
58
+ 'callback' => array($this, 'render_dropdown'),
59
+ 'dropdown_options' => array(
60
+ '' => __('Не устанавливать', 'content-egg'),
61
+ 'first' => __('Первый элемент', 'content-egg'),
62
+ 'second' => __('Второй элемент', 'content-egg'),
63
+ 'rand' => __('Случайный элемент', 'content-egg'),
64
+ 'last' => __('Последний элемент', 'content-egg'),
65
+ ),
66
+ 'default' => '',
67
+ 'section' => 'default',
68
+ ),
69
+ );
70
+
71
+ return
72
+ array_merge(
73
+ parent::options(), $options
74
+ );
75
+ }
76
+
77
+ }
application/components/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/helpers/ArrayHelper.php ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * ArrayHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ *
12
+ */
13
+ class ArrayHelper {
14
+
15
+ /**
16
+ * @link: http://php.net/manual/ru/function.array-diff-assoc.php#111675
17
+ */
18
+ public static function array_diff_assoc_recursive($array1, $array2)
19
+ {
20
+ $difference = array();
21
+ foreach ($array1 as $key => $value)
22
+ {
23
+ if (is_array($value))
24
+ {
25
+ if (!isset($array2[$key]) || !is_array($array2[$key]))
26
+ {
27
+ $difference[$key] = $value;
28
+ } else
29
+ {
30
+ $new_diff = array_diff_assoc_recursive($value, $array2[$key]);
31
+ if (!empty($new_diff))
32
+ $difference[$key] = $new_diff;
33
+ }
34
+ } else if (!array_key_exists($key, $array2) || $array2[$key] !== $value)
35
+ {
36
+ $difference[$key] = $value;
37
+ }
38
+ }
39
+ return $difference;
40
+ }
41
+
42
+ }
application/helpers/FormValidator.php ADDED
@@ -0,0 +1,560 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ContentEgg\application\helpers;
3
+
4
+ /**
5
+ * FormValidator class file
6
+ *
7
+ * Modified version of: CodeIgniter CI_Form_validation
8
+ *
9
+ * @author keywordrush.com <support@keywordrush.com>
10
+ * @link http://www.keywordrush.com/
11
+ * @copyright Copyright &copy; 2014 keywordrush.com
12
+ *
13
+ *
14
+ */
15
+
16
+ /**
17
+ * CodeIgniter
18
+ *
19
+ * An open source application development framework for PHP 5.2.4 or newer
20
+ *
21
+ * NOTICE OF LICENSE
22
+ *
23
+ * Licensed under the Open Software License version 3.0
24
+ *
25
+ * This source file is subject to the Open Software License (OSL 3.0) that is
26
+ * bundled with this package in the files license.txt / license.rst. It is
27
+ * also available through the world wide web at this URL:
28
+ * http://opensource.org/licenses/OSL-3.0
29
+ * If you did not receive a copy of the license and are unable to obtain it
30
+ * through the world wide web, please send an email to
31
+ * licensing@ellislab.com so we can send you a copy immediately.
32
+ *
33
+ * @package CodeIgniter
34
+ * @author EllisLab Dev Team
35
+ * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
36
+ * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
37
+ * @link http://codeigniter.com
38
+ * @since Version 1.0
39
+ * @filesource
40
+ */
41
+ class FormValidator {
42
+
43
+ /**
44
+ * Required
45
+ *
46
+ * @param string
47
+ * @return bool
48
+ */
49
+ public static function required($str)
50
+ {
51
+ return is_array($str) ? (bool) count($str) : (trim($str) !== '');
52
+ }
53
+
54
+ // --------------------------------------------------------------------
55
+
56
+ /**
57
+ * Performs a Regular Expression match test.
58
+ *
59
+ * @param string
60
+ * @param string regex
61
+ * @return bool
62
+ */
63
+ public static function regex_match($str, $regex)
64
+ {
65
+ return (bool) preg_match($regex, $str);
66
+ }
67
+
68
+ // --------------------------------------------------------------------
69
+
70
+ /**
71
+ * Match one field to another
72
+ *
73
+ * @param string $str string to compare against
74
+ * @param string $field
75
+ * @return bool
76
+ */
77
+ public static function matches($str, $field)
78
+ {
79
+ return isset($this->_field_data[$field], $this->_field_data[$field]['postdata']) ? ($str === $this->_field_data[$field]['postdata']) : FALSE;
80
+ }
81
+
82
+ // --------------------------------------------------------------------
83
+
84
+ /**
85
+ * Differs from another field
86
+ *
87
+ * @param string
88
+ * @param string field
89
+ * @return bool
90
+ */
91
+ public static function differs($str, $field)
92
+ {
93
+ return !(isset($this->_field_data[$field]) && $this->_field_data[$field]['postdata'] === $str);
94
+ }
95
+
96
+ // --------------------------------------------------------------------
97
+
98
+ /**
99
+ * Minimum Length
100
+ *
101
+ * @param string
102
+ * @param string
103
+ * @return bool
104
+ */
105
+ public static function min_length($str, $val)
106
+ {
107
+ if (!is_numeric($val))
108
+ {
109
+ return FALSE;
110
+ } else
111
+ {
112
+ $val = (int) $val;
113
+ }
114
+
115
+ return (MB_ENABLED === TRUE) ? ($val <= mb_strlen($str)) : ($val <= strlen($str));
116
+ }
117
+
118
+ // --------------------------------------------------------------------
119
+
120
+ /**
121
+ * Max Length
122
+ *
123
+ * @param string
124
+ * @param string
125
+ * @return bool
126
+ */
127
+ public static function max_length($str, $val)
128
+ {
129
+ if (!is_numeric($val))
130
+ {
131
+ return FALSE;
132
+ } else
133
+ {
134
+ $val = (int) $val;
135
+ }
136
+
137
+ return (MB_ENABLED === TRUE) ? ($val >= mb_strlen($str)) : ($val >= strlen($str));
138
+ }
139
+
140
+ // --------------------------------------------------------------------
141
+
142
+ /**
143
+ * Exact Length
144
+ *
145
+ * @param string
146
+ * @param string
147
+ * @return bool
148
+ */
149
+ public static function exact_length($str, $val)
150
+ {
151
+ if (!is_numeric($val))
152
+ {
153
+ return FALSE;
154
+ } else
155
+ {
156
+ $val = (int) $val;
157
+ }
158
+
159
+ return (MB_ENABLED === TRUE) ? (mb_strlen($str) === $val) : (strlen($str) === $val);
160
+ }
161
+
162
+ // --------------------------------------------------------------------
163
+
164
+ /**
165
+ * Valid URL
166
+ *
167
+ * @param string $str
168
+ * @return bool
169
+ */
170
+ public static function valid_url($str)
171
+ {
172
+ if (empty($str))
173
+ return FALSE;
174
+
175
+ $pattern='/^(http|https):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)/i';
176
+
177
+ if (is_string($str) && strlen($str) < 2000)
178
+ {
179
+ if (preg_match($pattern, $str))
180
+ return true;
181
+ }
182
+ return false;
183
+
184
+ /*
185
+ if (empty($str))
186
+ {
187
+ return FALSE;
188
+ } elseif (preg_match('/^(?:([^:]*)\:)?\/\/(.+)$/', $str, $matches))
189
+ {
190
+ if (empty($matches[2]))
191
+ {
192
+ return FALSE;
193
+ } elseif (!in_array($matches[1], array('http', 'https'), TRUE))
194
+ {
195
+ return FALSE;
196
+ }
197
+
198
+ $str = $matches[2];
199
+ }
200
+
201
+ $str = 'http://' . $str;
202
+
203
+ // There's a bug affecting PHP 5.2.13, 5.3.2 that considers the
204
+ // underscore to be a valid hostname character instead of a dash.
205
+ // Reference: https://bugs.php.net/bug.php?id=51192
206
+ if (version_compare(PHP_VERSION, '5.2.13', '==') === 0 OR version_compare(PHP_VERSION, '5.3.2', '==') === 0)
207
+ {
208
+ sscanf($str, 'http://%[^/]', $host);
209
+ $str = substr_replace($str, strtr($host, array('_' => '-', '-' => '_')), 7, strlen($host));
210
+ }
211
+
212
+ return (filter_var($str, FILTER_VALIDATE_URL) !== FALSE);
213
+ *
214
+ */
215
+ }
216
+
217
+ // --------------------------------------------------------------------
218
+
219
+ /**
220
+ * Valid Email
221
+ *
222
+ * @param string
223
+ * @return bool
224
+ */
225
+ public static function valid_email($str)
226
+ {
227
+ return (bool) filter_var($str, FILTER_VALIDATE_EMAIL);
228
+ }
229
+
230
+ // --------------------------------------------------------------------
231
+
232
+ /**
233
+ * Valid Emails
234
+ *
235
+ * @param string
236
+ * @return bool
237
+ */
238
+ public static function valid_emails($str)
239
+ {
240
+ if (strpos($str, ',') === FALSE)
241
+ {
242
+ return $this->valid_email(trim($str));
243
+ }
244
+
245
+ foreach (explode(',', $str) as $email)
246
+ {
247
+ if (trim($email) !== '' && $this->valid_email(trim($email)) === FALSE)
248
+ {
249
+ return FALSE;
250
+ }
251
+ }
252
+
253
+ return TRUE;
254
+ }
255
+
256
+ // --------------------------------------------------------------------
257
+
258
+ /**
259
+ * Validate IP Address
260
+ *
261
+ * @param string
262
+ * @param string 'ipv4' or 'ipv6' to validate a specific IP format
263
+ * @return bool
264
+ */
265
+ public static function valid_ip($ip, $which = '')
266
+ {
267
+ return $this->CI->input->valid_ip($ip, $which);
268
+ }
269
+
270
+ // --------------------------------------------------------------------
271
+
272
+ /**
273
+ * Alpha
274
+ *
275
+ * @param string
276
+ * @return bool
277
+ */
278
+ public static function alpha($str)
279
+ {
280
+ return ctype_alpha($str);
281
+ }
282
+
283
+ // --------------------------------------------------------------------
284
+
285
+ /**
286
+ * Alpha-numeric
287
+ *
288
+ * @param string
289
+ * @return bool
290
+ */
291
+ public static function alpha_numeric($str)
292
+ {
293
+ return ctype_alnum((string) $str);
294
+ }
295
+
296
+ // --------------------------------------------------------------------
297
+
298
+ /**
299
+ * Alpha-numeric w/ spaces
300
+ *
301
+ * @param string
302
+ * @return bool
303
+ */
304
+ public static function alpha_numeric_spaces($str)
305
+ {
306
+ return (bool) preg_match('/^[A-Z0-9 ]+$/i', $str);
307
+ }
308
+
309
+ // --------------------------------------------------------------------
310
+
311
+ /**
312
+ * Alpha-numeric with underscores and dashes
313
+ *
314
+ * @param string
315
+ * @return bool
316
+ */
317
+ public static function alpha_dash($str)
318
+ {
319
+ return (bool) preg_match('/^[a-z0-9_-]+$/i', $str);
320
+ }
321
+
322
+ // --------------------------------------------------------------------
323
+
324
+ /**
325
+ * Numeric
326
+ *
327
+ * @param string
328
+ * @return bool
329
+ */
330
+ public static function numeric($str)
331
+ {
332
+ return (bool) preg_match('/^[\-+]?[0-9]*\.?[0-9]+$/', $str);
333
+ }
334
+
335
+ // --------------------------------------------------------------------
336
+
337
+ /**
338
+ * Integer
339
+ *
340
+ * @param string
341
+ * @return bool
342
+ */
343
+ public static function integer($str)
344
+ {
345
+ return (bool) preg_match('/^[\-+]?[0-9]+$/', $str);
346
+ }
347
+
348
+ // --------------------------------------------------------------------
349
+
350
+ /**
351
+ * Decimal number
352
+ *
353
+ * @param string
354
+ * @return bool
355
+ */
356
+ public static function decimal($str)
357
+ {
358
+ return (bool) preg_match('/^[\-+]?[0-9]+\.[0-9]+$/', $str);
359
+ }
360
+
361
+ // --------------------------------------------------------------------
362
+
363
+ /**
364
+ * Greater than
365
+ *
366
+ * @param string
367
+ * @param int
368
+ * @return bool
369
+ */
370
+ public static function greater_than($str, $min)
371
+ {
372
+ return is_numeric($str) ? ($str > $min) : FALSE;
373
+ }
374
+
375
+ // --------------------------------------------------------------------
376
+
377
+ /**
378
+ * Equal to or Greater than
379
+ *
380
+ * @param string
381
+ * @param int
382
+ * @return bool
383
+ */
384
+ public static function greater_than_equal_to($str, $min)
385
+ {
386
+ return is_numeric($str) ? ($str >= $min) : FALSE;
387
+ }
388
+
389
+ // --------------------------------------------------------------------
390
+
391
+ /**
392
+ * Less than
393
+ *
394
+ * @param string
395
+ * @param int
396
+ * @return bool
397
+ */
398
+ public static function less_than($str, $max)
399
+ {
400
+ return is_numeric($str) ? ($str < $max) : FALSE;
401
+ }
402
+
403
+ // --------------------------------------------------------------------
404
+
405
+ /**
406
+ * Equal to or Less than
407
+ *
408
+ * @param string
409
+ * @param int
410
+ * @return bool
411
+ */
412
+ public static function less_than_equal_to($str, $max)
413
+ {
414
+ return is_numeric($str) ? ($str <= $max) : FALSE;
415
+ }
416
+
417
+ // --------------------------------------------------------------------
418
+
419
+ /**
420
+ * Is a Natural number (0,1,2,3, etc.)
421
+ *
422
+ * @param string
423
+ * @return bool
424
+ */
425
+ public static function is_natural($str)
426
+ {
427
+ return ctype_digit((string) $str);
428
+ }
429
+
430
+ // --------------------------------------------------------------------
431
+
432
+ /**
433
+ * Is a Natural number, but not a zero (1,2,3, etc.)
434
+ *
435
+ * @param string
436
+ * @return bool
437
+ */
438
+ public static function is_natural_no_zero($str)
439
+ {
440
+ return ($str != 0 && ctype_digit((string) $str));
441
+ }
442
+
443
+ // --------------------------------------------------------------------
444
+
445
+ /**
446
+ * Valid Base64
447
+ *
448
+ * Tests a string for characters outside of the Base64 alphabet
449
+ * as defined by RFC 2045 http://www.faqs.org/rfcs/rfc2045
450
+ *
451
+ * @param string
452
+ * @return bool
453
+ */
454
+ public static function valid_base64($str)
455
+ {
456
+ return (base64_encode(base64_decode($str)) === $str);
457
+ }
458
+
459
+ // --------------------------------------------------------------------
460
+
461
+ /**
462
+ * Prep data for form
463
+ *
464
+ * This function allows HTML to be safely shown in a form.
465
+ * Special characters are converted.
466
+ *
467
+ * @param string
468
+ * @return string
469
+ */
470
+ public static function prep_for_form($data = '')
471
+ {
472
+ if ($this->_safe_form_data === FALSE OR empty($data))
473
+ {
474
+ return $data;
475
+ }
476
+
477
+ if (is_array($data))
478
+ {
479
+ foreach ($data as $key => $val)
480
+ {
481
+ $data[$key] = $this->prep_for_form($val);
482
+ }
483
+
484
+ return $data;
485
+ }
486
+
487
+ return str_replace(array("'", '"', '<', '>'), array('&#39;', '&quot;', '&lt;', '&gt;'), stripslashes($data));
488
+ }
489
+
490
+ // --------------------------------------------------------------------
491
+
492
+ /**
493
+ * Prep URL
494
+ *
495
+ * @param string
496
+ * @return string
497
+ */
498
+ public static function prep_url($str = '')
499
+ {
500
+ if ($str === 'http://' OR $str === '')
501
+ {
502
+ return '';
503
+ }
504
+
505
+ if (strpos($str, 'http://') !== 0 && strpos($str, 'https://') !== 0)
506
+ {
507
+ return 'http://' . $str;
508
+ }
509
+
510
+ return $str;
511
+ }
512
+
513
+ // --------------------------------------------------------------------
514
+
515
+ /**
516
+ * Strip Image Tags
517
+ *
518
+ * @param string
519
+ * @return string
520
+ */
521
+ public static function strip_image_tags($str)
522
+ {
523
+ return $this->CI->security->strip_image_tags($str);
524
+ }
525
+
526
+ // --------------------------------------------------------------------
527
+
528
+ /**
529
+ * XSS Clean
530
+ *
531
+ * @param string
532
+ * @return string
533
+ */
534
+ public static function xss_clean($str)
535
+ {
536
+ return $this->CI->security->xss_clean($str);
537
+ }
538
+
539
+ // --------------------------------------------------------------------
540
+
541
+ /**
542
+ * Convert PHP tags to entities
543
+ *
544
+ * @param string
545
+ * @return string
546
+ */
547
+ public static function encode_php_tags($str)
548
+ {
549
+ return str_replace(array('<?', '?>'), array('&lt;?', '?&gt;'), $str);
550
+ }
551
+
552
+ }
553
+
554
+ if (!function_exists('affegg_intval_bool'))
555
+ {
556
+ function affegg_intval_bool($str)
557
+ {
558
+ return intval((bool) $str);
559
+ }
560
+ }
application/helpers/ImageHelper.php ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * ImageHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ *
12
+ */
13
+ class ImageHelper {
14
+
15
+ public static function saveImgLocaly($img_uri, $title = '', $check_image_type = true)
16
+ {
17
+ if (!defined('FS_CHMOD_FILE'))
18
+ define('FS_CHMOD_FILE', ( fileperms(ABSPATH . 'index.php') & 0777 | 0644));
19
+
20
+ $uploads = \wp_upload_dir();
21
+
22
+ $ext = pathinfo(basename($img_uri), PATHINFO_EXTENSION);
23
+ $newfilename = TextHelper::truncate($title);
24
+ $newfilename = TextHelper::rus2latin($newfilename);
25
+ $newfilename = preg_replace('/[^a-zA-Z0-9\-]/', '', $newfilename);
26
+ $newfilename = strtolower($newfilename);
27
+ if (!$newfilename)
28
+ $newfilename = time();
29
+
30
+ $response = \wp_remote_get($img_uri, array('timeout' => 3, 'redirection' => 1));
31
+ if (\is_wp_error($response) || (int) \wp_remote_retrieve_response_code($response) !== 200)
32
+ return false;
33
+
34
+ if (!$ext)
35
+ {
36
+ $headers = \wp_remote_retrieve_headers($response);
37
+ if (empty($headers['content-type']))
38
+ return false;
39
+ $types = array_search($headers['content-type'], \wp_get_mime_types());
40
+ if (!$types)
41
+ return false;
42
+
43
+ $exts = explode('|', $types);
44
+ $ext = $exts[0];
45
+ }
46
+
47
+ $newfilename .= '.' . $ext;
48
+ $newfilename = \wp_unique_filename($uploads['path'], $newfilename);
49
+
50
+ if ($check_image_type)
51
+ {
52
+ $filetype = \wp_check_filetype($newfilename, null);
53
+ if (substr($filetype['type'], 0, 5) != 'image')
54
+ return false;
55
+ }
56
+
57
+ $image_string = \wp_remote_retrieve_body($response);
58
+ $file_path = $uploads['path'] . DIRECTORY_SEPARATOR . $newfilename;
59
+ if (!file_put_contents($file_path, $image_string))
60
+ return false;
61
+
62
+ if ($check_image_type)
63
+ {
64
+ if (!self::isImage($file_path))
65
+ {
66
+ @unlink($file_path);
67
+ return false;
68
+ }
69
+ }
70
+
71
+ @chmod($file_path, FS_CHMOD_FILE);
72
+ return $newfilename;
73
+ }
74
+
75
+ public static function isImage($path)
76
+ {
77
+ $a = getimagesize($path);
78
+ $image_type = $a[2];
79
+
80
+ if (in_array($image_type, array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP)))
81
+ {
82
+ return true;
83
+ }
84
+ return false;
85
+ }
86
+
87
+ public static function getFullImgPath($img_path)
88
+ {
89
+ $uploads = \wp_upload_dir();
90
+ return trailingslashit($uploads['basedir']) . $img_path;
91
+ }
92
+
93
+ }
application/helpers/InputHelper.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * InputHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ *
12
+ */
13
+ class InputHelper {
14
+
15
+ public static function get($var, $default = null, $stripslashes = false)
16
+ {
17
+ if (!isset($_GET[$var]))
18
+ return $default;
19
+ else
20
+ return $stripslashes ? \stripslashes_deep($_GET[$var]) : $_GET[$var];
21
+ }
22
+
23
+ public static function post($var, $default = null, $stripslashes = false)
24
+ {
25
+ if (!isset($_POST[$var]))
26
+ return $default;
27
+ else
28
+ return $stripslashes ? \stripslashes_deep($_POST[$var]) : $_POST[$var];
29
+ }
30
+
31
+ }
application/helpers/TemplateHelper.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * TemplateHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ *
12
+ */
13
+ class TemplateHelper {
14
+
15
+ static public function currencyTyping($c)
16
+ {
17
+ $types = array("RUB" => "руб.", "UAH" => "грн.", "USD" => "$", "CAD" => "C$", "GBP" => "&pound;", "EUR" => "&euro;", "JPY" => "&yen;", "CNY" => "&yen;", "INR" => "Rs.", "AUD" => "AU $");
18
+ if (key_exists($c, $types))
19
+ return $types[$c];
20
+ else
21
+ return $c;
22
+ }
23
+
24
+ public static function number_format_i18n($number, $decimals = 0)
25
+ {
26
+ $decimal_point = __('number_format_decimal_point', 'content-egg-tpl');
27
+ $thousands_sep = __('number_format_thousands_sep', 'content-egg-tpl');
28
+
29
+ if ($decimal_point == 'number_format_decimal_point')
30
+ $decimal_point = '.';
31
+
32
+ if ($thousands_sep == 'number_format_thousands_sep')
33
+ $thousands_sep = ',';
34
+
35
+ return number_format($number, absint($decimals), $decimal_point, $thousands_sep);
36
+ }
37
+
38
+ public static function price_format_i18n($number)
39
+ {
40
+ return self::number_format_i18n($number, 2);
41
+ }
42
+
43
+ public static function truncate($string, $length = 80, $etc = '...', $charset = 'UTF-8', $break_words = false, $middle = false)
44
+ {
45
+ if ($length == 0)
46
+ return '';
47
+
48
+ if (mb_strlen($string, 'UTF-8') > $length)
49
+ {
50
+ $length -= min($length, mb_strlen($etc, 'UTF-8'));
51
+ if (!$break_words && !$middle)
52
+ {
53
+ $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length + 1, $charset));
54
+ }
55
+ if (!$middle)
56
+ {
57
+ return mb_substr($string, 0, $length, $charset) . $etc;
58
+ } else
59
+ {
60
+ return mb_substr($string, 0, $length / 2, $charset) . $etc . mb_substr($string, -$length / 2, $charset);
61
+ }
62
+ } else
63
+ {
64
+ return $string;
65
+ }
66
+ }
67
+
68
+ /**
69
+ * Возвращает количтсво дней, секунд и минут с текущего момента
70
+ * до окончания события
71
+ * @param string $end_time_gmt GNU формат даты
72
+ * @param bool $return_array вернуть в виде массива или форматированной строки?
73
+ * @return mixed false - если $timeleft < 0, массив или строку
74
+ */
75
+ static public function getTimeLeft($end_time_gmt, $return_array = false)
76
+ {
77
+
78
+ $current_time = strtotime(gmdate("M d Y H:i:s"));
79
+ $timeleft = strtotime($end_time_gmt) - $current_time;
80
+ if ($timeleft < 0)
81
+ return '';
82
+
83
+ $days_left = floor($timeleft / 86400);
84
+ $hours_left = floor(($timeleft - $days_left * 86400) / 3600);
85
+ $min_left = floor(($timeleft - $days_left * 86400 - $hours_left * 3600) / 60);
86
+ // Если нужно вернуть в виде массива
87
+ if ($return_array)
88
+ {
89
+ return array(
90
+ 'days' => $days_left,
91
+ 'hours' => $hours_left,
92
+ 'min' => $min_left,
93
+ );
94
+ }
95
+
96
+ if ($days_left)
97
+ return $days_left . __('d', 'content-egg-tpl') . ' ';
98
+ elseif ($hours_left)
99
+ return $hours_left . __('h', 'content-egg-tpl') . ' ';
100
+ elseif ($min_left)
101
+ return $min_left . __('m', 'content-egg-tpl');
102
+ else
103
+ return '<1' . __('m', 'content-egg-tpl');
104
+ }
105
+
106
+ }
application/helpers/TextHelper.php ADDED
@@ -0,0 +1,341 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\helpers;
4
+
5
+ /**
6
+ * TextHelper class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2014 keywordrush.com
11
+ */
12
+ class TextHelper {
13
+
14
+ public static function truncate($string, $length = 80, $etc = '...', $charset = 'UTF-8', $break_words = false, $middle = false)
15
+ {
16
+ if ($length == 0)
17
+ return '';
18
+
19
+ if (mb_strlen($string, 'UTF-8') > $length)
20
+ {
21
+ $length -= min($length, mb_strlen($etc, 'UTF-8'));
22
+ if (!$break_words && !$middle)
23
+ {
24
+ $string = preg_replace('/\s+?(\S+)?$/', '', mb_substr($string, 0, $length + 1, $charset));
25
+ }
26
+ if (!$middle)
27
+ {
28
+ return mb_substr($string, 0, $length, $charset) . $etc;
29
+ } else
30
+ {
31
+ return mb_substr($string, 0, $length / 2, $charset) . $etc . mb_substr($string, -$length / 2, $charset);
32
+ }
33
+ } else
34
+ {
35
+ return $string;
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Truncates text.
41
+ * Modified version of cakephp truncate.
42
+ *
43
+ * Cuts a string to the length of $length and replaces the last characters
44
+ * with the ellipsis if the text is longer than length.
45
+ *
46
+ * ### Options:
47
+ *
48
+ * - `ellipsis` Will be used as Ending and appended to the trimmed string (`ending` is deprecated)
49
+ * - `exact` If false, $text will not be cut mid-word
50
+ * - `html` If true, HTML tags would be handled correctly
51
+ *
52
+ * @param string $text String to truncate.
53
+ * @param int $length Length of returned string, including ellipsis.
54
+ * @param array $options An array of html attributes and options.
55
+ * @return string Trimmed string.
56
+ * @link http://book.cakephp.org/2.0/en/core-libraries/helpers/text.html#TextHelper::truncate
57
+ */
58
+ public static function truncateHtml($text, $length = 100, $options = array())
59
+ {
60
+ $defaults = array(
61
+ 'ellipsis' => '...', 'exact' => false, 'html' => true
62
+ );
63
+ if (isset($options['ending']))
64
+ {
65
+ $defaults['ellipsis'] = $options['ending'];
66
+ } elseif (!empty($options['html']))
67
+ {
68
+ $defaults['ellipsis'] = "\xe2\x80\xa6";
69
+ }
70
+ $options += $defaults;
71
+ extract($options);
72
+
73
+ if (!function_exists('mb_strlen'))
74
+ {
75
+ class_exists('Multibyte');
76
+ }
77
+
78
+ if ($html)
79
+ {
80
+ if (mb_strlen(preg_replace('/<.*?>/', '', $text), 'UTF-8') <= $length)
81
+ {
82
+ return $text;
83
+ }
84
+ $totalLength = mb_strlen(strip_tags($ellipsis), 'UTF-8');
85
+ $openTags = array();
86
+ $truncate = '';
87
+
88
+ preg_match_all('/(<\/?([\w+]+)[^>]*>)?([^<>]*)/', $text, $tags, PREG_SET_ORDER);
89
+ foreach ($tags as $tag)
90
+ {
91
+ if (!preg_match('/img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param/s', $tag[2]))
92
+ {
93
+ if (preg_match('/<[\w]+[^>]*>/s', $tag[0]))
94
+ {
95
+ array_unshift($openTags, $tag[2]);
96
+ } elseif (preg_match('/<\/([\w]+)[^>]*>/s', $tag[0], $closeTag))
97
+ {
98
+ $pos = array_search($closeTag[1], $openTags);
99
+ if ($pos !== false)
100
+ {
101
+ array_splice($openTags, $pos, 1);
102
+ }
103
+ }
104
+ }
105
+ $truncate .= $tag[1];
106
+
107
+ $contentLength = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', ' ', $tag[3]), 'UTF-8');
108
+ if ($contentLength + $totalLength > $length)
109
+ {
110
+ $left = $length - $totalLength;
111
+ $entitiesLength = 0;
112
+ if (preg_match_all('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};/i', $tag[3], $entities, PREG_OFFSET_CAPTURE))
113
+ {
114
+ foreach ($entities[0] as $entity)
115
+ {
116
+ if ($entity[1] + 1 - $entitiesLength <= $left)
117
+ {
118
+ $left--;
119
+ $entitiesLength += mb_strlen($entity[0], 'UTF-8');
120
+ } else
121
+ {
122
+ break;
123
+ }
124
+ }
125
+ }
126
+
127
+ $truncate .= mb_substr($tag[3], 0, $left + $entitiesLength, 'UTF-8');
128
+ break;
129
+ } else
130
+ {
131
+ $truncate .= $tag[3];
132
+ $totalLength += $contentLength;
133
+ }
134
+ if ($totalLength >= $length)
135
+ {
136
+ break;
137
+ }
138
+ }
139
+ } else
140
+ {
141
+ if (mb_strlen($text, 'UTF-8') <= $length)
142
+ {
143
+ return $text;
144
+ }
145
+ $truncate = mb_substr($text, 0, $length - mb_strlen($ellipsis, 'UTF-8'), 'UTF-8');
146
+ }
147
+ if (!$exact)
148
+ {
149
+ $spacepos = mb_strrpos($truncate, ' ', 'UTF-8');
150
+ if ($html)
151
+ {
152
+ $truncateCheck = mb_substr($truncate, 0, $spacepos, 'UTF-8');
153
+ $lastOpenTag = mb_strrpos($truncateCheck, '<', 'UTF-8');
154
+ $lastCloseTag = mb_strrpos($truncateCheck, '>', 'UTF-8');
155
+ if ($lastOpenTag > $lastCloseTag)
156
+ {
157
+ preg_match_all('/<[\w]+[^>]*>/s', $truncate, $lastTagMatches);
158
+ $lastTag = array_pop($lastTagMatches[0]);
159
+ $spacepos = mb_strrpos($truncate, $lastTag, 'UTF-8') + mb_strlen($lastTag, 'UTF-8');
160
+ }
161
+ $bits = mb_substr($truncate, $spacepos, 'UTF-8');
162
+ preg_match_all('/<\/([a-z]+)>/', $bits, $droppedTags, PREG_SET_ORDER);
163
+ if (!empty($droppedTags))
164
+ {
165
+ if (!empty($openTags))
166
+ {
167
+ foreach ($droppedTags as $closingTag)
168
+ {
169
+ if (!in_array($closingTag[1], $openTags))
170
+ {
171
+ array_unshift($openTags, $closingTag[1]);
172
+ }
173
+ }
174
+ } else
175
+ {
176
+ foreach ($droppedTags as $closingTag)
177
+ {
178
+ $openTags[] = $closingTag[1];
179
+ }
180
+ }
181
+ }
182
+ }
183
+ $truncate = mb_substr($truncate, 0, $spacepos, 'UTF-8');
184
+ }
185
+ $truncate .= $ellipsis;
186
+
187
+ if ($html)
188
+ {
189
+ foreach ($openTags as $tag)
190
+ {
191
+ $truncate .= '</' . $tag . '>';
192
+ }
193
+ }
194
+
195
+ return $truncate;
196
+ }
197
+
198
+ static function rus2latin($str)
199
+ {
200
+ $iso = array(
201
+ "Є" => "YE", "І" => "I", "Ѓ" => "G", "і" => "i", "№" => "#", "є" => "ye", "ѓ" => "g",
202
+ "А" => "A", "Б" => "B", "В" => "V", "Г" => "G", "Д" => "D",
203
+ "Е" => "E", "Ё" => "YO", "Ж" => "ZH",
204
+ "З" => "Z", "И" => "I", "Й" => "J", "К" => "K", "Л" => "L",
205
+ "М" => "M", "Н" => "N", "О" => "O", "П" => "P", "Р" => "R",
206
+ "С" => "S", "Т" => "T", "У" => "U", "Ф" => "F", "Х" => "X",
207
+ "Ц" => "C", "Ч" => "CH", "Ш" => "SH", "Щ" => "SHH", "Ъ" => "'",
208
+ "Ы" => "Y", "Ь" => "", "Э" => "E", "Ю" => "YU", "Я" => "YA",
209
+ "а" => "a", "б" => "b", "в" => "v", "г" => "g", "д" => "d",
210
+ "е" => "e", "ё" => "yo", "ж" => "zh",
211
+ "з" => "z", "и" => "i", "й" => "j", "к" => "k", "л" => "l",
212
+ "м" => "m", "н" => "n", "о" => "o", "п" => "p", "р" => "r",
213
+ "с" => "s", "т" => "t", "у" => "u", "ф" => "f", "х" => "x",
214
+ "ц" => "c", "ч" => "ch", "ш" => "sh", "щ" => "shh", "ъ" => "",
215
+ "ы" => "y", "ь" => "", "э" => "e", "ю" => "yu", "я" => "ya",
216
+ "'" => "", "\"" => "", " " => "-"
217
+ );
218
+
219
+ return strtr($str, $iso);
220
+ }
221
+
222
+ static public function clear($str)
223
+ {
224
+ return preg_replace('/[^a-zA-Z0-9_]/', '', $str);
225
+ }
226
+
227
+ public static function clear_utf8($str)
228
+ {
229
+ $str = preg_replace("/[^\pL\s\d\-\.\+_]+/ui", '', $str);
230
+ $str = preg_replace("/\s+/ui", ' ', $str);
231
+ return $str;
232
+ }
233
+
234
+ private static function get_random($matches)
235
+ {
236
+ $rand = array_rand($split = explode("|", $matches[1]));
237
+ return $split[$rand];
238
+ }
239
+
240
+ public static function spin($str)
241
+ {
242
+ //$new_str = preg_replace_callback('/\{([^{}]*)\}/uim', array('TextHelper', 'get_random'), $str);
243
+ $new_str = preg_replace_callback(
244
+ '/\{([^{}]*)\}/uim', function ($matches) {
245
+ $rand = array_rand($split = explode("|", $matches[1]));
246
+ return $split[$rand];
247
+ }
248
+ , $str);
249
+ if ($new_str !== $str)
250
+ $str = TextHelper::spin($new_str);
251
+ return $str;
252
+ }
253
+
254
+ /* bool/array unserialize_xml ( string $input [ , callback $callback ] )
255
+ * Unserializes an XML string, returning a multi-dimensional associative array, optionally runs a callback on all non-array data
256
+ * Returns false on all failure
257
+ * Notes:
258
+ * Root XML tags are stripped
259
+ * Due to its recursive nature, unserialize_xml() will also support SimpleXMLElement objects and arrays as input
260
+ * Uses simplexml_load_string() for XML parsing, see SimpleXML documentation for more info
261
+ */
262
+
263
+ static public function unserialize_xml($input, $callback = null, $recurse = false)
264
+ {
265
+ //Отключение ошибок libxml
266
+ libxml_use_internal_errors(false);
267
+
268
+ // Get input, loading an xml string with simplexml if its the top level of recursion
269
+ $data = ((!$recurse) && is_string($input)) ? @simplexml_load_string($input, '\SimpleXMLElement', LIBXML_NOCDATA) : $input;
270
+ // Convert SimpleXMLElements to array
271
+ if ($data instanceof \SimpleXMLElement)
272
+ $data = (array) $data;
273
+
274
+ // Recurse into arrays
275
+ if (is_array($data))
276
+ foreach ($data as &$item)
277
+ $item = self::unserialize_xml($item, $callback, true);
278
+ // Run callback and return
279
+ return (!is_array($data) && is_callable($callback)) ? call_user_func($callback, $data) : $data;
280
+ }
281
+
282
+ static public function br2nl($str)
283
+ {
284
+ return str_ireplace(array("<br />", "<br>", "<br/>"), "\r\n", $str);
285
+ }
286
+
287
+ static public function nl2br($str)
288
+ {
289
+ return str_replace(array("\r\n", "\r", "\n"), "<br />", $str);
290
+ }
291
+
292
+ static public function removeExtraBreaks($str)
293
+ {
294
+ return trim(preg_replace("/(\r\n)+/i", "\r\n", $str));
295
+ }
296
+
297
+ /**
298
+ * 10.55 -> 1055 & 1055 -> 10.55
299
+ */
300
+ static public function pricePenniesDenomination($p, $to_int = true)
301
+ {
302
+ if ($to_int)
303
+ $p = number_format($p, 2, '', '');
304
+ else
305
+ $p = number_format(preg_replace("/(\d+)(\d{2}$)/msi", '${1}.${2}', $p), 2, '.', '');
306
+
307
+ return $p;
308
+ }
309
+
310
+ static public function currencyTyping($c)
311
+ {
312
+ return TemplateHelper::currencyTyping($c);
313
+ }
314
+
315
+ public static function safeHtml($html, $type)
316
+ {
317
+ switch ($type)
318
+ {
319
+ case 'allow_all':
320
+ return $html;
321
+ // Безопасный HTML
322
+ case 'safe_html':
323
+ return \wp_kses_post($html);
324
+ // Разрешенные HTML теги
325
+ case 'allowed_tags':
326
+ return \wp_kses($html, array('p', 'h1', 'h2', 'h3', 'h4', 'h5', 'b', 'i', 'strong', 'em', 'ul', 'ol', 'li', 'br', 'hr'));
327
+ default:
328
+ // @todo: add safe strip_tags
329
+ return strip_tags($html);
330
+ }
331
+ }
332
+
333
+ /*
334
+ public static function sanitizeUrl($url) {
335
+
336
+ return preg_replace('/[^\-A-Za-z0-9+&@#/\%\?=~_|!:,\.;\(\)\[\]]/', '', $url);
337
+
338
+ }
339
+ *
340
+ */
341
+ }
application/helpers/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/libs/ParserClient.php ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs;
4
+
5
+ use ContentEgg\application\helpers\TextHelper;
6
+
7
+ /**
8
+ * ParserClient class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ *
14
+ */
15
+ class ParserClient {
16
+
17
+ protected $charset = 'utf-8';
18
+ protected $xpath;
19
+ protected $url;
20
+ protected static $_httpClient = null;
21
+
22
+ public function __construct($url = null)
23
+ {
24
+ if ($url)
25
+ $this->setUrl($url);
26
+ }
27
+
28
+ public function setUrl($url)
29
+ {
30
+ $this->url = $url;
31
+ //$this->xpath = null;
32
+ //$this->loadXPath($url);
33
+ }
34
+
35
+ public function getUrl()
36
+ {
37
+ return $this->url;
38
+ }
39
+
40
+ public function getCharset()
41
+ {
42
+ return $this->charset;
43
+ }
44
+
45
+ /**
46
+ * Gets the HTTP client object.
47
+ */
48
+ public static function getHttpClient($opts = array())
49
+ {
50
+ $_opts = array(
51
+ 'sslverify' => false,
52
+ 'redirection' => 3,
53
+ 'timeout' => 5,
54
+ 'user-agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
55
+ );
56
+ if ($opts)
57
+ $_opts = $opts + $_opts;
58
+
59
+ if (self::$_httpClient == null)
60
+ {
61
+ //Get WP http client
62
+ self::$_httpClient = new WpHttpClient();
63
+ self::$_httpClient->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8');
64
+
65
+ self::$_httpClient->setUserAgent($_opts['user-agent']);
66
+ self::$_httpClient->setRedirection($_opts['redirection']);
67
+ self::$_httpClient->setTimeout($_opts['timeout']);
68
+ self::$_httpClient->setSslVerify($_opts['sslverify']);
69
+ }
70
+
71
+ return self::$_httpClient;
72
+ }
73
+
74
+ /**
75
+ * Sets the HTTP client object to use for retrieving the feeds. If none
76
+ * is set, the default Http_Client will be used.
77
+ */
78
+ public static function setHttpClient($httpClient)
79
+ {
80
+ self::$_httpClient = $httpClient;
81
+ }
82
+
83
+ public function loadXPath($url, $query = null)
84
+ {
85
+ $this->xpath = $this->getXPath($url, $query);
86
+ }
87
+
88
+ public function getXPath($url, $query = null)
89
+ {
90
+ return $xpath = new \DomXPath($this->getDom($url, $query));
91
+ }
92
+
93
+ public function getDom($url, $query = null)
94
+ {
95
+ $dom = new \DomDocument();
96
+ $dom->preserveWhiteSpace = false;
97
+ libxml_use_internal_errors(true);
98
+ if (!$dom->loadHTML($this->restGet($url, $query)))
99
+ throw new \Exception('Can\'t load DOM Document.');
100
+ return $dom;
101
+ }
102
+
103
+ public function restGet($uri, $query = null)
104
+ {
105
+ $client = self::getHttpClient();
106
+ $client->resetParameters();
107
+ $client->setUri($uri);
108
+ if ($query)
109
+ $client->setParameterGet($query);
110
+ $body = $this->getResult($client->request('GET'));
111
+ echo $body;
112
+ exit;
113
+ return $this->decodeCharset($body);
114
+
115
+
116
+ /*
117
+ $this->xpath = null;
118
+ $args = array(
119
+ 'timeout' => 5,
120
+ 'sslverify' => false,
121
+ 'user-agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9'
122
+ );
123
+
124
+ $response = \wp_remote_get($url, $args);
125
+
126
+ if (\is_wp_error($response))
127
+ {
128
+ $error_message = $response->get_error_message();
129
+ throw new \Exception($error_message);
130
+ }
131
+ $response_code = (int) \wp_remote_retrieve_response_code($response);
132
+ if ($response_code != 200)
133
+ throw new \Exception('Error in url request. HTTP response code: ' . $response_code);
134
+
135
+ $body = \wp_remote_retrieve_body($response);
136
+
137
+ return $this->decodeCharset($body);
138
+ *
139
+ */
140
+ }
141
+
142
+ protected function getResult($response)
143
+ {
144
+ if (\is_wp_error($response))
145
+ {
146
+ $error_mess = "HTTP request fails: " . $response->get_error_code() . " - " . $response->get_error_message() . '.';
147
+ throw new \Exception($error_mess);
148
+ }
149
+
150
+ $response_code = (int) \wp_remote_retrieve_response_code($response);
151
+
152
+ if ($response_code != 200)
153
+ {
154
+ $response_message = \wp_remote_retrieve_response_message($response);
155
+ $error_mess = "HTTP request status fails: " . $response_code . " - " . $response_message . '.';
156
+ $error_mess .= ' Server replay: ' . \wp_remote_retrieve_body($response);
157
+ throw new \Exception($error_mess);
158
+ }
159
+
160
+ return \wp_remote_retrieve_body($response);
161
+ }
162
+
163
+ public function decodeCharset($str)
164
+ {
165
+ $encoding_hint = '<?xml encoding="UTF-8">';
166
+
167
+ if (strtolower($this->charset) != 'utf-8')
168
+ {
169
+ $str = $encoding_hint . '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />' . $str;
170
+ return iconv($this->charset, 'utf-8', $str);
171
+ } else
172
+ return $encoding_hint . $str;
173
+ }
174
+
175
+ protected function xpathScalar($path)
176
+ {
177
+ $res = $this->xpath->query($path);
178
+ if ($res && $res->length > 0)
179
+ return trim(strip_tags($res->item(0)->nodeValue));
180
+ else
181
+ return null;
182
+ }
183
+
184
+ protected function xpathArray($path)
185
+ {
186
+ $res = $this->xpath->query($path);
187
+ $return = array();
188
+ if ($res && $res->length > 0)
189
+ {
190
+ foreach ($res as $r)
191
+ {
192
+ $return[] = trim(strip_tags($r->nodeValue));
193
+ }
194
+ }
195
+ return $return;
196
+ }
197
+
198
+ }
application/libs/RestClient.php ADDED
@@ -0,0 +1,262 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs;
4
+
5
+ use ContentEgg\application\helpers\TextHelper;
6
+
7
+ /**
8
+ * RestClient class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ *
14
+ * Simple Rest Client
15
+ * @todo: PUT/DELETE Request
16
+ */
17
+ class RestClient {
18
+
19
+ /**
20
+ * Endpoint uri of this web service
21
+ * @var string
22
+ */
23
+ protected $_uri = null;
24
+
25
+ /**
26
+ * @var String Return Type
27
+ */
28
+ protected $_responseType = null;
29
+
30
+ /**
31
+ * @var array Response Format Types
32
+ */
33
+ protected $_responseTypes = array();
34
+ protected $_custom_header = array();
35
+ protected static $_httpClient = null;
36
+
37
+ public function __construct($uri = null)
38
+ {
39
+ if (!empty($uri))
40
+ {
41
+ $this->setUri($uri);
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Set responseType
47
+ */
48
+ public function setResponseType($responseType = 'json')
49
+ {
50
+ if (!in_array($responseType, $this->_responseTypes, TRUE))
51
+ {
52
+ throw new \Exception('Invalid Response Type');
53
+ }
54
+ $this->_responseType = $responseType;
55
+ }
56
+
57
+ /**
58
+ * Retrieve responseType
59
+ */
60
+ public function getResponseType()
61
+ {
62
+ return $this->_responseType;
63
+ }
64
+
65
+ /**
66
+ * Sets the HTTP client object to use for retrieving the feeds. If none
67
+ * is set, the default Http_Client will be used.
68
+ */
69
+ public static function setHttpClient($httpClient)
70
+ {
71
+ self::$_httpClient = $httpClient;
72
+ }
73
+
74
+ /**
75
+ * Gets the HTTP client object.
76
+ */
77
+ public static function getHttpClient($opts = array())
78
+ {
79
+ $_opts = array(
80
+ 'sslverify' => false,
81
+ 'redirection' => 3,
82
+ 'timeout' => 8,
83
+ 'user-agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9',
84
+ );
85
+ if ($opts)
86
+ $_opts = $opts + $_opts;
87
+
88
+ if (self::$_httpClient == null)
89
+ {
90
+ //Get WP http client
91
+ self::$_httpClient = new WpHttpClient();
92
+ self::$_httpClient->setHeaders('Accept-Charset', 'ISO-8859-1,utf-8');
93
+
94
+
95
+
96
+
97
+
98
+ self::$_httpClient->setRedirection($_opts['redirection']);
99
+ self::$_httpClient->setTimeout($_opts['timeout']);
100
+ self::$_httpClient->setSslVerify($_opts['sslverify']);
101
+ self::$_httpClient->setUserAgent($_opts['user-agent']);
102
+ }
103
+
104
+ return self::$_httpClient;
105
+ }
106
+
107
+ /**
108
+ * Set the URI to use in the request
109
+ */
110
+ public function setUri($uri)
111
+ {
112
+ $this->_uri = $uri;
113
+ }
114
+
115
+ public function getUri()
116
+ {
117
+ return $this->_uri;
118
+ }
119
+
120
+ public function setCustomHeaders($headers = array())
121
+ {
122
+ $this->_custom_header = $headers;
123
+ }
124
+
125
+ /**
126
+ * Performs an HTTP GET request
127
+ * @param string $path
128
+ * @param array $query Array of GET parameters
129
+ */
130
+ public function restGet($path, array $query = null)
131
+ {
132
+ $this->_prepareRest($path);
133
+ $client = self::getHttpClient();
134
+ $client->setParameterGet($query);
135
+ return $this->_getResult($client->request('GET'));
136
+ }
137
+
138
+ private function _prepareRest($path)
139
+ {
140
+
141
+ if (strstr($path, 'http://') || strstr($path, 'https://'))
142
+ {
143
+ $uri = $path;
144
+ } else
145
+ {
146
+ $uri = $this->getUri();
147
+ if ($path && $path[0] != '/' && $uri[strlen($uri) - 1] != '/')
148
+ {
149
+ $path = '/' . $path;
150
+ }
151
+ $uri = $uri . $path;
152
+ }
153
+
154
+ $client = self::getHttpClient();
155
+
156
+ // Обнуляем параметры
157
+ $client->resetParameters();
158
+ $client->setUri($uri);
159
+
160
+ // Установка custom headers
161
+ foreach ($this->_custom_header as $header => $value)
162
+ {
163
+ $client->setHeaders($header, $value);
164
+ }
165
+ }
166
+
167
+ /**
168
+ * Performs an HTTP POST request
169
+ * @param string $path
170
+ * @param mixed $data Raw data to send
171
+ * @param string $enctype
172
+ */
173
+ public function restPost($path, $data = null, $enctype = null, $opts = array())
174
+ {
175
+ $this->_prepareRest($path);
176
+ $client = self::getHttpClient($opts);
177
+ if (is_string($data))
178
+ {
179
+ $client->setRawData($data, $enctype);
180
+ } elseif (is_array($data) || is_object($data))
181
+ {
182
+ $client->setParameterPost((array) $data);
183
+ }
184
+ return $this->_getResult($client->request('POST'));
185
+ }
186
+
187
+ final public function get($path, array $query = null)
188
+ {
189
+ return $this->restGet($path, $query);
190
+ }
191
+
192
+ protected function _getResult($response)
193
+ {
194
+ if (\is_wp_error($response))
195
+ {
196
+ $error_mess = "HTTP request fails: " . $response->get_error_code() . " - " . $response->get_error_message() . '.';
197
+ throw new \Exception($error_mess);
198
+ }
199
+
200
+ $response_code = (int) \wp_remote_retrieve_response_code($response);
201
+
202
+ if ($response_code != 200)
203
+ {
204
+ $response_message = \wp_remote_retrieve_response_message($response);
205
+ $error_mess = "HTTP request status fails: " . $response_code . " - " . $response_message . '.';
206
+ $error_mess .= ' Server replay: ' . \wp_remote_retrieve_body($response);
207
+ throw new \Exception($error_mess);
208
+ }
209
+
210
+ return \wp_remote_retrieve_body($response);
211
+ }
212
+
213
+ protected function _decodeResponse($response, $responseType = null)
214
+ {
215
+ if ($responseType == null)
216
+ $responseType = $this->_responseType;
217
+
218
+ switch ($responseType)
219
+ {
220
+ case 'php':
221
+ case 'php_serial':
222
+ $res = @unserialize($response);
223
+ if ($res === false)
224
+ throw new \Exception('Response serialization error.');
225
+ break;
226
+ case 'json':
227
+ $res = json_decode($response, true);
228
+ break;
229
+ case 'xml':
230
+ case 'rss':
231
+ case 'atom':
232
+ $res = TextHelper::unserialize_xml($response);
233
+ break;
234
+ default :
235
+ $res = $response;
236
+ }
237
+ if (is_array($res))
238
+ array_walk_recursive($res, array($this, '_fixUtf8'));
239
+ elseif (is_scalar($res))
240
+ $this->_fixUtf8($res);
241
+
242
+ return $res;
243
+ }
244
+
245
+ protected function _fixUtf8(&$text)
246
+ {
247
+ $regex = '/
248
+ (
249
+ (?: [\x00-\x7F] # single-byte sequences 0xxxxxxx
250
+ | [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
251
+ | \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2
252
+ | [\xE1-\xEC][\x80-\xBF]{2}
253
+ | \xED[\x80-\x9F][\x80-\xBF]
254
+ | [\xEE-\xEF][\x80-\xBF]{2}';
255
+ $regex .= '){1,40} # ...one or more times
256
+ )
257
+ | . # anything else
258
+ /x';
259
+ $text = preg_replace($regex, '$1', $text);
260
+ }
261
+
262
+ }
application/libs/WpHttpClient.php ADDED
@@ -0,0 +1,460 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs;
4
+
5
+ /**
6
+ * WpHttpClient class file
7
+ *
8
+ * Same code from Zend_Http_Client
9
+ * @link: http://framework.zend.com/manual/1.12/ru/zend.http.client.html
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ *
15
+ */
16
+ class WpHttpClient {
17
+
18
+ /**
19
+ * HTTP request methods
20
+ */
21
+ const GET = 'GET';
22
+ const POST = 'POST';
23
+ const PUT = 'PUT';
24
+ const HEAD = 'HEAD';
25
+ const DELETE = 'DELETE';
26
+ const TRACE = 'TRACE';
27
+ const OPTIONS = 'OPTIONS';
28
+ const CONNECT = 'CONNECT';
29
+
30
+ /**
31
+ * POST data encoding methods
32
+ */
33
+ const ENC_URLENCODED = 'application/x-www-form-urlencoded';
34
+ const ENC_FORMDATA = 'multipart/form-data';
35
+
36
+ private $timeout;
37
+ private $sslverify;
38
+ private $useragent;
39
+ private $redirection;
40
+
41
+ /**
42
+ * Request URI
43
+ */
44
+ protected $uri;
45
+
46
+ /**
47
+ * Associative array of request headers
48
+ *
49
+ * @var array
50
+ */
51
+ protected $headers = array();
52
+
53
+ /**
54
+ * HTTP request method
55
+ *
56
+ * @var string
57
+ */
58
+ protected $method = self::GET;
59
+
60
+ /**
61
+ * Associative array of GET parameters
62
+ *
63
+ * @var array
64
+ */
65
+ protected $paramsGet = array();
66
+
67
+ /**
68
+ * Assiciative array of POST parameters
69
+ *
70
+ * @var array
71
+ */
72
+ protected $paramsPost = array();
73
+
74
+ /**
75
+ * Request body content type (for POST requests)
76
+ *
77
+ * @var string
78
+ */
79
+ protected $enctype = null;
80
+
81
+ /**
82
+ * The raw post data to send. Could be set by setRawData($data, $enctype).
83
+ *
84
+ * @var string
85
+ */
86
+ protected $raw_post_data = null;
87
+
88
+ /**
89
+ * The last HTTP response received by the client
90
+ *
91
+ * @var EHttpResponse
92
+ */
93
+ protected $last_response = null;
94
+
95
+ /**
96
+ * Set the URI for the next request
97
+ */
98
+ public function setUri($uri)
99
+ {
100
+ $this->uri = $uri;
101
+ }
102
+
103
+ /**
104
+ * Get the URI for the next request
105
+ */
106
+ public function getUri($as_string = false)
107
+ {
108
+ return $this->uri;
109
+ }
110
+
111
+ public function setHeaders($name, $value = null)
112
+ {
113
+ // If we got an array, go recusive!
114
+ if (is_array($name))
115
+ {
116
+ foreach ($name as $k => $v)
117
+ {
118
+ if (is_string($k))
119
+ {
120
+ $this->setHeaders($k, $v);
121
+ } else
122
+ {
123
+ $this->setHeaders($v, null);
124
+ }
125
+ }
126
+ } else
127
+ {
128
+ // Check if $name needs to be split
129
+ if ($value === null && (strpos($name, ':') > 0))
130
+ list($name, $value) = explode(':', $name, 2);
131
+
132
+ // Make sure the name is valid if we are in strict mode
133
+ if (!preg_match('/^[a-zA-Z0-9-]+$/', $name))
134
+ {
135
+ throw new \Exception("{$name} is not a valid HTTP header name");
136
+ }
137
+
138
+ $normalized_name = strtolower($name);
139
+
140
+ // If $value is null or false, unset the header
141
+ if ($value === null || $value === false)
142
+ {
143
+ unset($this->headers[$normalized_name]);
144
+ } else
145
+ {
146
+ // Header names are storred lowercase internally.
147
+ if (is_string($value))
148
+ $value = trim($value);
149
+ $this->headers[$normalized_name] = array($name, $value);
150
+ }
151
+ }
152
+ }
153
+
154
+ /**
155
+ * Get the value of a specific header
156
+ *
157
+ * Note that if the header has more than one value, an array
158
+ * will be returned.
159
+ *
160
+ * @param string $key
161
+ * @return string|array|null The header value or null if it is not set
162
+ */
163
+ public function getHeader($key)
164
+ {
165
+ $key = strtolower($key);
166
+ if (isset($this->headers[$key]))
167
+ {
168
+ return $this->headers[$key][1];
169
+ } else
170
+ {
171
+ return null;
172
+ }
173
+ }
174
+
175
+ /**
176
+ * Set the next request's method
177
+ */
178
+ public function setMethod($method = self::GET)
179
+ {
180
+
181
+ if ($method !== self::GET && $method !== self::POST)
182
+ throw new \Exception('Only GET and POST methods avalible.');
183
+
184
+ $this->method = $method;
185
+ }
186
+
187
+ /**
188
+ * Set a GET parameter for the request. Wrapper around _setParameter
189
+ *
190
+ * @param string|array $name
191
+ * @param string $value
192
+ * @return EHttpClient
193
+ */
194
+ public function setParameterGet($name, $value = null)
195
+ {
196
+ if (is_array($name))
197
+ {
198
+ foreach ($name as $k => $v)
199
+ $this->_setParameter('GET', $k, $v);
200
+ } else
201
+ {
202
+ $this->_setParameter('GET', $name, $value);
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Set a POST parameter for the request. Wrapper around _setParameter
208
+ *
209
+ * @param string|array $name
210
+ * @param string $value
211
+ */
212
+ public function setParameterPost($name, $value = null)
213
+ {
214
+ if (is_array($name))
215
+ {
216
+ foreach ($name as $k => $v)
217
+ $this->_setParameter('POST', $k, $v);
218
+ } else
219
+ {
220
+ $this->_setParameter('POST', $name, $value);
221
+ }
222
+ }
223
+
224
+ /**
225
+ * Set a GET or POST parameter - used by SetParameterGet and SetParameterPost
226
+ *
227
+ * @param string $type GET or POST
228
+ * @param string $name
229
+ * @param string $value
230
+ * @return null
231
+ */
232
+ protected function _setParameter($type, $name, $value)
233
+ {
234
+ $parray = array();
235
+ $type = strtolower($type);
236
+ switch ($type)
237
+ {
238
+ case 'get':
239
+ $parray = &$this->paramsGet;
240
+ break;
241
+ case 'post':
242
+ $parray = &$this->paramsPost;
243
+ break;
244
+ }
245
+
246
+ if ($value === null)
247
+ {
248
+ if (isset($parray[$name]))
249
+ unset($parray[$name]);
250
+ } else
251
+ {
252
+ $parray[$name] = $value;
253
+ }
254
+ }
255
+
256
+ public function setTimeout($value)
257
+ {
258
+ $this->timeout = $value;
259
+ }
260
+
261
+ public function setSslVerify($value)
262
+ {
263
+ $this->sslverify = $value;
264
+ }
265
+
266
+ public function setUserAgent($value)
267
+ {
268
+ $this->useragent = $value;
269
+ }
270
+
271
+ public function setRedirection($value)
272
+ {
273
+ $this->redirection = $value;
274
+ }
275
+
276
+ /**
277
+ * Prepare the request body (for POST and PUT requests)
278
+ *
279
+ * @return string
280
+ */
281
+ protected function _prepareBody()
282
+ {
283
+ // According to RFC2616, a TRACE request should not have a body.
284
+ if ($this->method == self::TRACE)
285
+ {
286
+ return '';
287
+ }
288
+
289
+ // If we have raw_post_data set, just use it as the body.
290
+ if (isset($this->raw_post_data))
291
+ {
292
+ $this->setHeaders('Content-length', strlen($this->raw_post_data));
293
+ return $this->raw_post_data;
294
+ }
295
+
296
+ $body = '';
297
+
298
+ // If we have POST parameters, encode and add them to the body
299
+ if (count($this->paramsPost) > 0)
300
+ {
301
+
302
+ // Encode body as application/x-www-form-urlencoded
303
+ $this->setHeaders('Content-type', self::ENC_URLENCODED);
304
+ $body = http_build_query($this->paramsPost, '', '&');
305
+ }
306
+
307
+ // Set the content-length if we have a body or if request is POST/PUT
308
+ if ($body || $this->method == self::POST || $this->method == self::PUT)
309
+ {
310
+ $this->setHeaders('Content-length', strlen($body));
311
+ }
312
+
313
+ return $body;
314
+ }
315
+
316
+ /**
317
+ * Prepare the request headers
318
+ *
319
+ * @return array
320
+ */
321
+ protected function _prepareHeaders()
322
+ {
323
+ $headers = array();
324
+ // Set the host header
325
+ if (!isset($this->headers['host']))
326
+ {
327
+ $host = parse_url($this->uri, PHP_URL_HOST);
328
+ $headers['Host'] = "{$host}";
329
+ }
330
+
331
+ // Set the connection header
332
+ if (!isset($this->headers['connection']))
333
+ {
334
+ $headers['Connection'] = "close";
335
+ }
336
+
337
+ // Set the Accept-encoding header if not set - depending on whether
338
+ // zlib is available or not.
339
+ if (!isset($this->headers['accept-encoding']))
340
+ {
341
+ if (function_exists('gzinflate'))
342
+ {
343
+ $headers['Accept-encoding'] = 'gzip, deflate';
344
+ } else
345
+ {
346
+ $headers['Accept-encoding'] = 'identity';
347
+ }
348
+ }
349
+
350
+ // Set the content-type header
351
+ if ($this->method == self::POST &&
352
+ (!isset($this->headers['content-type']) && isset($this->enctype)))
353
+ {
354
+
355
+ $headers['Content-type'] = "{$this->enctype}";
356
+ }
357
+
358
+ // Add all other user defined headers
359
+ foreach ($this->headers as $header)
360
+ {
361
+ list($name, $value) = $header;
362
+ if (is_array($value))
363
+ $value = implode(', ', $value);
364
+
365
+ $headers[$name] = $value;
366
+ }
367
+ return $headers;
368
+ }
369
+
370
+ protected function _prepareParams()
371
+ {
372
+ $options = array();
373
+ $options['method'] = $this->method;
374
+
375
+ if ($this->timeout !== null)
376
+ $options['timeout'] = $this->timeout;
377
+ if ($this->sslverify !== null)
378
+ $options['sslverify'] = $this->sslverify;
379
+ if ($this->useragent !== null)
380
+ $options['user-agent'] = $this->useragent;
381
+ if ($this->redirection !== null)
382
+ $options['redirection'] = $this->redirection;
383
+
384
+ $options['headers'] = $this->_prepareHeaders();
385
+ $options['body'] = $this->_prepareBody();
386
+ return $options;
387
+ }
388
+
389
+ public function request($method = null)
390
+ {
391
+ if (!$this->uri)
392
+ throw new \Exception('No valid URI has been passed to the client');
393
+
394
+ if ($method)
395
+ $this->setMethod($method);
396
+
397
+ // Add the additional GET parameters to uri
398
+ if (!empty($this->paramsGet))
399
+ {
400
+ $query = parse_url($this->uri, PHP_URL_QUERY);
401
+ if (!empty($query))
402
+ $this->uri .= '&';
403
+ else
404
+ $this->uri .= '?';
405
+ $this->uri .= http_build_query($this->paramsGet, null, '&');
406
+ }
407
+
408
+ $this->last_response = \wp_remote_request($this->uri, $this->_prepareParams());
409
+ return $this->last_response;
410
+ }
411
+
412
+ public function setRawData($data, $enctype = null)
413
+ {
414
+ $this->raw_post_data = $data;
415
+ //$this->setEncType($enctype);
416
+ }
417
+
418
+ /**
419
+ * Clear all GET and POST parameters
420
+ *
421
+ * Should be used to reset the request parameters if the client is
422
+ * used for several concurrent requests.
423
+ *
424
+ */
425
+ public function resetParameters()
426
+ {
427
+ // Reset parameter data
428
+ $this->paramsGet = array();
429
+ $this->paramsPost = array();
430
+ $this->raw_post_data = null;
431
+
432
+ // Reset headers
433
+ $allowed_headers = array('accept-charset');
434
+ foreach ($this->headers as $header => $val)
435
+ {
436
+ if (!in_array($header, $allowed_headers))
437
+ unset($this->headers[$header]);
438
+ }
439
+ }
440
+
441
+ /**
442
+ * Get the last HTTP request as string
443
+ */
444
+ /*
445
+ public function getLastRequest()
446
+ {
447
+ return $this->last_request;
448
+ }
449
+ *
450
+ */
451
+
452
+ /**
453
+ * Get the last HTTP response received by this client
454
+ */
455
+ public function getLastResponse()
456
+ {
457
+ return $this->last_response;
458
+ }
459
+
460
+ }
application/libs/amazon/AmazonProduct.php ADDED
@@ -0,0 +1,430 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs\amazon;
4
+
5
+ use ContentEgg\application\libs\RestClient;
6
+
7
+ /**
8
+ * PHP interface to Amazon Product Advertising API
9
+ * Modified version of Services_Amazon pear class
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ *
15
+ * @link http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/ Amazon Product Advertising API
16
+ */
17
+
18
+ /**
19
+ * Original PEAR License:
20
+ *
21
+ * LICENSE: Copyright 2004-2009 John Downey. All rights reserved.
22
+ *
23
+ * Redistribution and use in source and binary forms, with or without
24
+ * modification, are permitted provided that the following conditions are met:
25
+ *
26
+ * o Redistributions of source code must retain the above copyright notice, this
27
+ * list of conditions and the following disclaimer.
28
+ * o Redistributions in binary form must reproduce the above copyright notice,
29
+ * this list of conditions and the following disclaimer in the documentation
30
+ * and/or other materials provided with the distribution.
31
+ *
32
+ * THIS SOFTWARE IS PROVIDED BY THE FREEBSD PROJECT "AS IS" AND ANY EXPRESS OR
33
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
34
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
35
+ * EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
37
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
39
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
40
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
41
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42
+ *
43
+ * The views and conclusions contained in the software and documentation are
44
+ * those of the authors and should not be interpreted as representing official
45
+ * policies, either expressed or implied, of The PEAR Group.
46
+ *
47
+ * @category Web Services
48
+ * @package Services_Amazon
49
+ * @author John Downey <jdowney@gmail.com>
50
+ * @author Tatsuya Tsuruoka <tatsuya.tsuruoka@gmail.com>
51
+ * @copyright 2004-2009 John Downey
52
+ * @license http://www.freebsd.org/copyright/freebsd-license.html 2 Clause BSD License
53
+ * @version CVS: $Id: Amazon.php,v 1.4 2007/12/16 17:27:44 ttsuruoka Exp $
54
+ * @link http://pear.php.net/package/Services_Amazon/
55
+ * @filesource
56
+ */
57
+ class AmazonProduct extends RestClient {
58
+
59
+ const API_VERSION = '2011-08-01';
60
+
61
+ private $_access_key_id;
62
+ private $_secret_access_key;
63
+ private $_associate_tag;
64
+ private $_timestamp = null;
65
+ private $_locale;
66
+
67
+ /**
68
+ * @var array Response Format Types
69
+ */
70
+ protected $_responseTypes = array(
71
+ 'xml',
72
+ );
73
+
74
+ //private static $_httpClient;
75
+
76
+ public function __construct($access_key_id, $secret_access_key, $associate_tag)
77
+ {
78
+ $this->_access_key_id = $access_key_id;
79
+ $this->_secret_access_key = $secret_access_key;
80
+ $this->_associate_tag = $associate_tag;
81
+ $this->setLocale('us');
82
+ $this->setResponseType('xml');
83
+ }
84
+
85
+ /**
86
+ * Sets the locale passed when making a query to Amazon
87
+ * Currently us, uk, de, jp, fr, ca, cn, it, es are supported
88
+ * @param string $locale The new locale to use
89
+ * @link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/Locales.html
90
+ */
91
+ public function setLocale($locale)
92
+ {
93
+ //не все urls соответствуют документации
94
+ $urls = array(
95
+ 'us' => 'http://ecs.amazonaws.com/onca/xml',
96
+ 'uk' => 'http://ecs.amazonaws.co.uk/onca/xml',
97
+ 'de' => 'http://ecs.amazonaws.de/onca/xml',
98
+ 'jp' => 'http://webservices.amazon.co.jp/onca/xml',
99
+ 'cn' => 'http://webservices.amazon.cn/onca/xml',
100
+ 'fr' => 'http://ecs.amazonaws.fr/onca/xml',
101
+ 'it' => 'http://webservices.amazon.it/onca/xml',
102
+ 'es' => 'http://webservices.amazon.es/onca/xml',
103
+ 'ca' => 'http://ecs.amazonaws.ca/onca/xml',
104
+ 'br' => 'http://ecs.amazonaws.br/onca/xml',
105
+ 'in' => 'http://ecs.amazonaws.in/onca/xml',
106
+ );
107
+ if (!isset($urls[$locale]))
108
+ {
109
+ throw new \Exception('Invalid amazon locale');
110
+ }
111
+ $this->_locale = $locale;
112
+ $this->setUri($urls[$locale]);
113
+ return true;
114
+ }
115
+
116
+ /**
117
+ * Sets a timestamp (for debugging)
118
+ *
119
+ * @param integer $time A timestamp
120
+ */
121
+ public function setTimestamp($time)
122
+ {
123
+ $this->_timestamp = $time;
124
+ }
125
+
126
+ /**
127
+ * Searches for products
128
+ *
129
+ * Example:
130
+ * <code>
131
+ * <?php
132
+ * $amazon = new Services_Amazon('[your Access Key ID here]', '[your Secret Access key here]');
133
+ * $options = array();
134
+ * $options['Keywords'] = 'sushi';
135
+ * $options['Sort'] = 'salesrank';
136
+ * $options['ResponseGroup'] = 'ItemIds,ItemAttributes,Images';
137
+ * $result = $amazon->ItemSearch('Books', $options);
138
+ * ?>
139
+ * </code>
140
+ *
141
+ * @access public
142
+ * @param string $search_index A search index
143
+ * @param array $options The optional parameters
144
+ * @return array The array of information returned by the query
145
+ */
146
+ public function ItemSearch($search_index, $options = array())
147
+ {
148
+ $params = $options;
149
+ $params['Operation'] = 'ItemSearch';
150
+ $params['SearchIndex'] = $search_index;
151
+
152
+ $response = $this->signedGet('', $params);
153
+ $decoded = $this->_decodeResponse($response);
154
+ return $this->_parseResult($decoded);
155
+ }
156
+
157
+ /**
158
+ * Retrieves information for products
159
+ *
160
+ * Example:
161
+ * <code>
162
+ * <?php
163
+ * $amazon = new Services_Amazon('[your Access Key ID here]', '[your Secret Access key here]');
164
+ * $options = array();
165
+ * $options['ResponseGroup'] = 'Large';
166
+ * $result = $amazon->ItemLookup('[ASIN(s)]', $options);
167
+ * ?>
168
+ * </code>
169
+ *
170
+ * @access public
171
+ * @param string $item_id Product IDs
172
+ * @param array $options The optional parameters
173
+ * @return array The array of information returned by the query
174
+ * @see ItemSearch()
175
+ */
176
+ function ItemLookup($item_id, $options = array())
177
+ {
178
+ $params = $options;
179
+ $params['Operation'] = 'ItemLookup';
180
+ if (is_array($item_id))
181
+ {
182
+ $item_id = implode(',', $item_id);
183
+ }
184
+ $params['ItemId'] = $item_id;
185
+
186
+ $response = $this->signedGet('', $params);
187
+ $decoded = $this->_decodeResponse($response);
188
+ return $this->_parseResult($decoded);
189
+ }
190
+
191
+ /**
192
+ * Encode URL according to RFC 3986
193
+ * @param string $str UTF-8 string
194
+ * @return string Encoded string
195
+ */
196
+ private function _urlencode($str)
197
+ {
198
+ return str_replace('%7E', '~', rawurlencode($str));
199
+ }
200
+
201
+ /**
202
+ * Create an HMAC-SHA256
203
+ * @param string $string_to_sign
204
+ * @param string $secret_access_key
205
+ * @return string hash
206
+ */
207
+ private function _hash($string_to_sign, $secret_access_key)
208
+ {
209
+ if (function_exists('hash_hmac'))
210
+ {
211
+ return hash_hmac('sha256', $string_to_sign, $secret_access_key, true);
212
+ } elseif (function_exists('mhash'))
213
+ {
214
+ return mhash(MHASH_SHA256, $string_to_sign, $secret_access_key);
215
+ } else
216
+ {
217
+ throw new \Exception('hash_hmac or mhash function is required.');
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Builds a URL
223
+ *
224
+ * @access private
225
+ * @param array $params
226
+ * @return string URL
227
+ */
228
+ function _buildUrl($params)
229
+ {
230
+ $params['Service'] = 'AWSECommerceService';
231
+ $params['AWSAccessKeyId'] = $this->_access_key_id;
232
+ if (!empty($this->_associate_tag))
233
+ {
234
+ $params['AssociateTag'] = $this->_associate_tag;
235
+ }
236
+ $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z', is_null($this->_timestamp) ? time() : $this->_timestamp);
237
+ $params['Version'] = self::API_VERSION;
238
+
239
+ // sort parameters
240
+ ksort($params);
241
+
242
+ // create a canonical string
243
+ $canonical_string = '';
244
+ foreach ($params as $k => $v)
245
+ {
246
+ $canonical_string .= '&' . $this->_urlencode($k) . '=' . $this->_urlencode($v);
247
+ }
248
+ $canonical_string = substr($canonical_string, 1);
249
+
250
+ // create a signature for request
251
+ $parsed_url = parse_url($this->getUri());
252
+ $string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
253
+ $signature = $this->_hash($string_to_sign, $this->_secret_access_key);
254
+ $signature = base64_encode($signature);
255
+
256
+ // create a signed url
257
+ $url = $this->getUri() . '?' . $canonical_string . '&Signature=' . $this->_urlencode($signature);
258
+
259
+ return $url;
260
+ }
261
+
262
+ public function signedGet($path, array $query = null)
263
+ {
264
+ $url = $this->_buildUrl($query);
265
+ return $this->restGet($url, $query);
266
+ }
267
+
268
+ /**
269
+ * Parses raw XML result
270
+ *
271
+ * @param string $raw_result
272
+ * @return array amazon items.
273
+ */
274
+ private function _parseResult($data)
275
+ {
276
+ // Обработка ошибки
277
+ if (isset($data['Items']['Request']['Errors']['Error']))
278
+ {
279
+ $err_message = 'Unknown error';
280
+ $errors = $data['Items']['Request']['Errors']['Error'];
281
+ if (isset($errors['Message']))
282
+ $err_message = $errors['Message'];
283
+
284
+ throw new \Exception($err_message);
285
+ }
286
+
287
+ if (!isset($data['Items']['Item']))
288
+ return array();
289
+ if (!isset($data['Items']['Item'][0]) && isset($data['Items']['Item']['ASIN']))
290
+ $data['Items']['Item'] = array($data['Items']['Item']);
291
+
292
+ return $data;
293
+ }
294
+
295
+ /**
296
+ * Parses error from XML result
297
+ *
298
+ * @param string $raw_result
299
+ * @return string Error message.
300
+ */
301
+ /*
302
+ private function _parseRawError($raw_result)
303
+ {
304
+
305
+ $data = Helper::unserialize_xml($raw_result);
306
+ $error = '';
307
+ if (isset($data['Error']['Code']))
308
+ $error = $data['Error']['Code'];
309
+
310
+ if (isset($data['Error']['Message']))
311
+ $error .= ' : ' . $data['Error']['Message'];
312
+ return $error;
313
+ }
314
+ *
315
+ */
316
+
317
+ /**
318
+ * Amazon customer reviews parser
319
+ * @param string $url iframe reviews url
320
+ */
321
+ public function parseCustomerReviews($url, $locale = 'us')
322
+ {
323
+ try
324
+ {
325
+ $html = $this->restGet($url);
326
+ } catch (\Exception $e)
327
+ {
328
+ return array();
329
+ }
330
+ if (!$html)
331
+ return array();
332
+
333
+ // Исправим кодировку
334
+ // US, UK - ISO-8859-1
335
+ // DE, FR, CA - ISO-8859-15
336
+ // JP - Shift_JIS
337
+ if ($locale == "jp" && function_exists('iconv'))
338
+ $html = iconv("Shift_JIS", "utf-8", $html);
339
+ else
340
+ $html = utf8_encode($html);
341
+
342
+ if (strstr($html, 'There are no customer reviews for this item'))
343
+ return array();
344
+ $result = array();
345
+
346
+ // Сначала парсим общую информацию по обзорам
347
+ $totalreviews = $avarage_rating = 0;
348
+ preg_match("/=\"crIFrameHeaderLeftColumn.+?=\"crIFrameHeaderHistogram/msi", $html, $header_html);
349
+ if ($header_html)
350
+ {
351
+ $header_html = $header_html[0];
352
+
353
+ //prnx($header_html);
354
+ // Total Reviews
355
+ preg_match('/>([\d,]+)\s.+?\)<\/span>/', $header_html, $matches);
356
+ $totalreviews = $matches ? $matches[1] : 0;
357
+
358
+ // Avarage Rating
359
+ preg_match('/<img.+?alt="(\d\.\d).+?"/', $header_html, $matches);
360
+ $avarage_rating = $matches ? $matches[1] : 0;
361
+ unset($header_html);
362
+ }
363
+ $result['AverageRating'] = $avarage_rating;
364
+ $result['TotalReviews'] = $totalreviews;
365
+
366
+ // Парсим блоки с Review
367
+ preg_match_all("/<\!\-\-\sBOUNDARY\s\-\->(.+?)<div\sstyle=\"padding-top:\s10px;\sclear:\sboth;\swidth:\s100%;\">/msi", $html, $matches);
368
+ unset($html);
369
+ if (!$matches)
370
+ return array();
371
+
372
+ $reviews = array();
373
+ $i = 0;
374
+ foreach ($matches[1] as $review_blok)
375
+ {
376
+ $reviews[$i] = array();
377
+
378
+ // Reviews Content
379
+ preg_match("/class=\"reviewText\">(.+?)<\/div>/msi", $review_blok, $matches);
380
+ if (!$matches)
381
+ preg_match("/^.+<\/div>?(.+?)\z/msi", $review_blok, $matches);
382
+ if (!$matches)
383
+ continue;
384
+ $content = '';
385
+ $content = $matches[1];
386
+ $content = preg_replace("/<a.+?<\/a>/", "", $content);
387
+ $content = trim(strip_tags($content));
388
+ $content = preg_replace("/\r/", " ", $content);
389
+ $content = preg_replace("/\n/", " ", $content);
390
+ if (!$content)
391
+ continue;
392
+ $reviews[$i]['Content'] = $content;
393
+
394
+ // Reviews Summary & Date
395
+ preg_match("/<b>(.+)<\/b>,\s<nobr>(.+)<\/nobr>/", $review_blok, $matches);
396
+ if ($matches)
397
+ {
398
+ $reviews[$i]['Summary'] = trim(strip_tags($matches[1])); //Summary
399
+ $reviews[$i]['Date'] = strtotime(trim(strip_tags($matches[2]))); //Date
400
+ if (!$reviews[$i]['Date'])
401
+ $reviews[$i]['Date'] = time();
402
+ } else
403
+ {
404
+ $reviews[$i]['Summary'] = '';
405
+ $reviews[$i]['Date'] = time();
406
+ }
407
+
408
+ // Customer Name
409
+ preg_match("/<span.+?>(.+?)<\/span><\/a>/", $review_blok, $matches);
410
+ if ($matches)
411
+ $reviews[$i]['Name'] = trim(strip_tags($matches[1]));
412
+ else
413
+ $reviews[$i]['Name'] = '';
414
+
415
+ // Rating
416
+ preg_match('/<img.+?alt="(\d\.\d).+?"/', $review_blok, $matches);
417
+ if ($matches)
418
+ $reviews[$i]['Rating'] = trim(strip_tags($matches[1]));
419
+ else
420
+ $reviews[$i]['Rating'] = 4.0;
421
+
422
+ $i++;
423
+ }
424
+ unset($matches);
425
+ $result['Reviews'] = $reviews;
426
+ //prnx($result);
427
+ return $result;
428
+ }
429
+
430
+ }
application/libs/google/FreebaseRest.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs\google;
4
+
5
+ use ContentEgg\application\libs\RestClient;
6
+
7
+ /**
8
+ * FreebaseRest class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2014 keywordrush.com
13
+ */
14
+ /**
15
+ * FreebaseRest класс для работы с Freebase API.
16
+ * @link: https://developers.google.com/freebase/index
17
+ */
18
+ require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'RestClient.php';
19
+
20
+ class FreebaseRest extends RestClient {
21
+
22
+ const API_URI_BASE = 'https://www.googleapis.com/freebase/v1';
23
+
24
+ private $apiKey;
25
+
26
+ /**
27
+ * @var array Response Format Types
28
+ */
29
+ protected $_responseTypes = array(
30
+ 'json',
31
+ );
32
+
33
+ /**
34
+ * Constructor
35
+ * @param string API Key
36
+ * @param string $responseType
37
+ */
38
+ public function __construct($key)
39
+ {
40
+ $this->setUri(self::API_URI_BASE);
41
+ $this->setApiKey($key);
42
+ $this->setResponseType('json');
43
+ }
44
+
45
+ public function setApiKey($key)
46
+ {
47
+ $this->apiKey = $key;
48
+ }
49
+
50
+ /**
51
+ * Freebase Search API
52
+ * @link: https://developers.google.com/freebase/v1/search
53
+ * @param string $query
54
+ * @param array $params
55
+ */
56
+ public function search($query, $params)
57
+ {
58
+ $_query = array();
59
+ $_query['query'] = $query;
60
+ $_query['key'] = $this->apiKey;
61
+ foreach ($params as $key => $param)
62
+ {
63
+ switch ($key)
64
+ {
65
+ case 'lang':
66
+ case 'filter':
67
+ $_query[$key] = $param;
68
+ break;
69
+ case 'limit':
70
+ case 'start':
71
+ $_query[$key] = ((int) $param > 100) ? 100 : (int) $param;
72
+ break;
73
+ }
74
+ }
75
+ $response = $this->restGet('/search', $_query);
76
+ return $this->_decodeResponse($response);
77
+ }
78
+
79
+ /**
80
+ * Freebase Topic API
81
+ * @link: https://developers.google.com/freebase/v1/topic-overview
82
+ * @param string $topic_id Topic ID
83
+ * @param string $filter
84
+ */
85
+ public function topic($topic_id, $lang = null, $filter = null)
86
+ {
87
+ $_query = array();
88
+ $_query['key'] = $this->apiKey;
89
+ if ($lang)
90
+ $_query['lang'] = $lang;
91
+ if ($filter)
92
+ $_query['filter'] = $filter;
93
+ $response = $this->restGet('/topic' . $topic_id, $_query);
94
+ return $this->_decodeResponse($response);
95
+ }
96
+
97
+ /**
98
+ * Сначала находит ID топиков, а потом запрашивает подробную
99
+ * инфу по каждому топику.
100
+ * @param string $query
101
+ * @param array $params
102
+ * @param string $filter
103
+ */
104
+ public function fullSearch($query, $params, $filter = null)
105
+ {
106
+
107
+ $results = $this->search($query, $params);
108
+ if (empty($results['result']))
109
+ return array();
110
+
111
+ $data = array();
112
+ foreach ($results['result'] as $res)
113
+ {
114
+ if (empty($res['mid']))
115
+ continue;
116
+ try
117
+ {
118
+ if (!empty($params['lang']))
119
+ $lang = $params['lang'];
120
+ else
121
+ $lang = null;
122
+ $topic = $this->topic($res['mid'], $lang, $filter);
123
+ } catch (Exception $e)
124
+ {
125
+ // Не получили инфу по топику. Пропускаем?
126
+ continue;
127
+ }
128
+ $data[] = $topic;
129
+ }
130
+ return $data;
131
+ }
132
+
133
+ }
application/libs/google/ImagesSearch.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs\google;
4
+
5
+ use ContentEgg\application\libs\RestClient;
6
+
7
+ /**
8
+ * ImagesSearch class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ *
14
+ * @link: https://developers.google.com/youtube/v3/docs/search/list
15
+ *
16
+ */
17
+ require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'RestClient.php';
18
+
19
+ class ImagesSearch extends RestClient {
20
+
21
+ const API_URI_BASE = 'https://ajax.googleapis.com/ajax/services/search';
22
+ const API_VERSION = '1.0';
23
+
24
+ /**
25
+ * @var array Response Format Types
26
+ */
27
+ protected $_responseTypes = array(
28
+ 'atom',
29
+ 'json',
30
+ );
31
+
32
+ /**
33
+ * Constructor
34
+ * @param string $responseType
35
+ */
36
+ public function __construct($responseType = 'json')
37
+ {
38
+ $this->setResponseType($responseType);
39
+ $this->setUri(self::API_URI_BASE);
40
+ }
41
+
42
+ public function search($query, array $params = array())
43
+ {
44
+ $_query = array();
45
+ $_query['v'] = self::API_VERSION;
46
+ $_query['q'] = $query;
47
+
48
+ foreach ($params as $key => $param)
49
+ {
50
+ switch ($key)
51
+ {
52
+ case 'as_filetype':
53
+ case 'as_rights':
54
+ case 'as_sitesearch':
55
+ case 'hl':
56
+ case 'imgc':
57
+ case 'imgcolor':
58
+ case 'imgsz':
59
+ case 'imgtype':
60
+ case 'restrict':
61
+ case 'safe':
62
+ case 'start':
63
+ case 'userip':
64
+ $_query[$key] = $param;
65
+ break;
66
+ case 'rsz':
67
+ $_query[$key] = ((int) $param > 8) ? 8 : (int) $param;
68
+ break;
69
+ }
70
+ }
71
+ $response = $this->restGet('/images', $_query);
72
+ return $this->_decodeResponse($response);
73
+ }
74
+
75
+ }
application/libs/google/YouTubeSearch.php ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\libs\google;
4
+
5
+ use ContentEgg\application\libs\RestClient;
6
+
7
+ /**
8
+ * YouTubeSearch class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ *
14
+ * @link: https://developers.google.com/youtube/v3/docs/search/list
15
+ *
16
+ */
17
+ require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'RestClient.php';
18
+
19
+ class YouTubeSearch extends RestClient {
20
+
21
+ const API_URI_BASE = 'https://www.googleapis.com/youtube/v3';
22
+
23
+ /**
24
+ * @var array Response Format Types
25
+ */
26
+ protected $_responseTypes = array(
27
+ 'atom',
28
+ 'json',
29
+ );
30
+
31
+ /**
32
+ * Constructor
33
+ * @param string $responseType
34
+ */
35
+ public function __construct($responseType = 'json')
36
+ {
37
+ $this->setResponseType($responseType);
38
+ $this->setUri(self::API_URI_BASE);
39
+ }
40
+
41
+ public function search($query, array $params = array())
42
+ {
43
+ $_query = array();
44
+ $_query['q'] = $query;
45
+ $_query['part'] = 'snippet';
46
+ $_query['videoEmbeddable'] = 'true';
47
+ $_query['type'] = 'video';
48
+
49
+ // Разработчики обычно добавляют &format=5 в свои запросы, чтобы ограничить
50
+ // результаты теми видео, которые могут быть встроены в их сайты.
51
+ //$params['format'] = 5;
52
+
53
+ foreach ($params as $key => $param)
54
+ {
55
+ switch ($key)
56
+ {
57
+ case 'relevanceLanguage':
58
+ case 'order':
59
+ //case 'format':
60
+ case 'key':
61
+ case 'part':
62
+ case 'safeSearch':
63
+ case 'channelId':
64
+ case 'videoEmbeddable':
65
+ case 'type':
66
+ case 'videoLicense':
67
+ $_query[$key] = $param;
68
+ break;
69
+ case 'maxResults':
70
+ case 'pageToken':
71
+ $_query[$key] = ((int) $param > 50) ? 50 : (int) $param;
72
+ break;
73
+ case 'strict':
74
+ $_query[$key] = ((bool) $param) ? true : false;
75
+ break;
76
+ }
77
+ }
78
+ $response = $this->restGet('/search', $_query);
79
+ return $this->_decodeResponse($response);
80
+ }
81
+
82
+ }
application/libs/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/modules/Amazon/AmazonConfig.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Amazon;
4
+
5
+ use ContentEgg\application\components\AffiliateParserModuleConfig;
6
+ use ContentEgg\application\admin\GeneralConfig;
7
+
8
+ /**
9
+ * AmazonConfig class file
10
+ *
11
+ * @author keywordrush.com <support@keywordrush.com>
12
+ * @link http://www.keywordrush.com/
13
+ * @copyright Copyright &copy; 2015 keywordrush.com
14
+ */
15
+ class AmazonConfig extends AffiliateParserModuleConfig {
16
+
17
+ public function options()
18
+ {
19
+ $optiosn = array(
20
+ 'access_key_id' => array(
21
+ 'title' => 'Access Key ID <span class="cegg_required">*</span>',
22
+ 'description' => __('Специальный ключ для доступа к Amazon API.', 'content-egg'),
23
+ 'callback' => array($this, 'render_input'),
24
+ 'default' => '',
25
+ 'validator' => array(
26
+ 'trim',
27
+ array(
28
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'required'),
29
+ 'when' => 'is_active',
30
+ 'message' => __('Поле "Access Key ID" не может быть пустым.', 'content-egg'),
31
+ ),
32
+ ),
33
+ 'section' => 'default',
34
+ ),
35
+ 'secret_access_key' => array(
36
+ 'title' => 'Secret Access Key <span class="cegg_required">*</span>',
37
+ 'description' => __('Еще один специальный ключ для доступа к Amazon API.', 'content-egg'),
38
+ 'callback' => array($this, 'render_input'),
39
+ 'default' => '',
40
+ 'validator' => array(
41
+ 'trim',
42
+ array(
43
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'required'),
44
+ 'when' => 'is_active',
45
+ 'message' => __('Поле "Secret Access Key" не может быть пустым.', 'content-egg'),
46
+ ),
47
+ ),
48
+ 'section' => 'default',
49
+ ),
50
+ 'associate_tag' => array(
51
+ 'title' => 'Tracking ID <span class="cegg_required">*</span>',
52
+ 'description' => __('Связь с Вашим аккаунтом в партнерке. Чтобы получать комиссию от продаж, правильно укажите этот параметр.', 'content-egg'),
53
+ 'callback' => array($this, 'render_input'),
54
+ 'default' => '',
55
+ 'validator' => array(
56
+ 'trim',
57
+ array(
58
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'required'),
59
+ 'when' => 'is_active',
60
+ 'message' => __('Поле "Tracking ID" не может быть пустым.', 'content-egg'),
61
+ ),
62
+ ),
63
+ 'section' => 'default',
64
+ ),
65
+ 'entries_per_page' => array(
66
+ 'title' => __('Результатов', 'content-egg'),
67
+ 'description' => __('Количество результатов для одного поискового запроса.', 'content-egg'),
68
+ 'callback' => array($this, 'render_input'),
69
+ 'default' => 10,
70
+ 'validator' => array(
71
+ 'trim',
72
+ 'absint',
73
+ array(
74
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'less_than_equal_to'),
75
+ 'arg' => 10,
76
+ 'message' => __('Поле "Результатов" не может быть больше 10.', 'content-egg'),
77
+ ),
78
+ ),
79
+ 'section' => 'default',
80
+ ),
81
+ 'entries_per_page_update' => array(
82
+ 'title' => __('Результатов для обновления', 'content-egg'),
83
+ 'description' => __('Количество результатов для автоматического обновления.', 'content-egg'),
84
+ 'callback' => array($this, 'render_input'),
85
+ 'default' => 3,
86
+ 'validator' => array(
87
+ 'trim',
88
+ 'absint',
89
+ array(
90
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'less_than_equal_to'),
91
+ 'arg' => 10,
92
+ 'message' => __('Поле "Результатов" не может быть больше 10.', 'content-egg'),
93
+ ),
94
+ ),
95
+ 'section' => 'default',
96
+ ),
97
+ 'locale' => array(
98
+ 'title' => __('Locale', 'content-egg'),
99
+ 'description' => __('Филиал amazon. Для каждого филиала необходима отдельная регистрация в соответствующей партнерской программе.', 'content-egg'),
100
+ 'callback' => array($this, 'render_dropdown'),
101
+ 'dropdown_options' => self::getLocalesList(),
102
+ 'default' => self::getDefaultLocale(),
103
+ 'section' => 'default',
104
+ ),
105
+ 'link_type' => array(
106
+ 'title' => __('Вид ссылок', 'content-egg'),
107
+ 'description' => __('Вид партнерских ссылок. Узнайте больше про amazon <a target="_blank" href="https://affiliate-program.amazon.com/gp/associates/help/t2/a11">90 day cookie</a>.', 'content-egg'),
108
+ 'callback' => array($this, 'render_dropdown'),
109
+ 'dropdown_options' => array(
110
+ 'product' => 'Product page',
111
+ 'add_to_cart' => 'Add to cart',
112
+ ),
113
+ 'default' => 'product',
114
+ 'section' => 'default',
115
+ ),
116
+
117
+ 'search_index' => array(
118
+ 'title' => __('Категория для поиска', 'content-egg'),
119
+ 'description' => __('Список категорий для US Amazon. Для локальных филиалов некоторые категории могут быть недоступны. Если Вы не зададите категорию для поиска, то никакие другие опции фильтрации кроме поиска по ключевому слову (например, минимальная цена или сортировка) работать не будут.', 'content-egg'),
120
+ 'callback' => array($this, 'render_dropdown'),
121
+ 'dropdown_options' => array('All' => '[ All ]', 'Blended' => '[ Blended ]', 'Music' => '[ Music ]', 'Video' => '[ Video ]', 'Apparel' => 'Apparel', 'Automotive' => 'Automotive', 'Baby' => 'Baby', 'Beauty' => 'Beauty', 'Books' => 'Books', 'Classical' => 'Classical', 'DigitalMusic' => 'DigitalMusic', 'DVD' => 'DVD', 'Electronics' => 'Electronics', 'GourmetFood' => 'GourmetFood', 'Grocery' => 'Grocery', 'HealthPersonalCare' => 'HealthPersonalCare', 'HomeGarden' => 'HomeGarden', 'Industrial' => 'Industrial', 'Jewelry' => 'Jewelry', 'KindleStore' => 'KindleStore', 'Kitchen' => 'Kitchen', 'Magazines' => 'Magazines', 'Merchants' => 'Merchants', 'Miscellaneous' => 'Miscellaneous', 'MP3Downloads' => 'MP3Downloads', 'MusicalInstruments' => 'MusicalInstruments', 'MusicTracks' => 'MusicTracks', 'OfficeProducts' => 'OfficeProducts', 'OutdoorLiving' => 'OutdoorLiving', 'PCHardware' => 'PCHardware', 'PetSupplies' => 'PetSupplies', 'Photo' => 'Photo', 'Shoes' => 'Shoes', 'Software' => 'Software', 'SportingGoods' => 'SportingGoods', 'Tools' => 'Tools', 'Toys' => 'Toys', 'UnboxVideo' => 'UnboxVideo', 'VHS' => 'VHS', 'VideoGames' => 'VideoGames', 'Watches' => 'Watches', 'Wireless' => 'Wireless', 'WirelessAccessories' => 'WirelessAccessories'),
122
+ 'default' => 'All',
123
+ 'section' => 'default',
124
+ ),
125
+ 'sort' => array(
126
+ 'title' => __('Порядок сортировки', 'content-egg'),
127
+ 'description' => __('Варианты сортировки зависят от locale и выбранной категории. Список доступных значений можно найти <a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?APPNDX_SortValuesArticle.html">здесь</a>.', 'content-egg'),
128
+ 'callback' => array($this, 'render_input'),
129
+ 'default' => '',
130
+ 'validator' => array(
131
+ 'trim',
132
+ ),
133
+ 'section' => 'default',
134
+ ),
135
+ 'brouse_node' => array(
136
+ 'title' => __('Brouse node', 'content-egg'),
137
+ 'description' => __('Целочисленное ID "узла" на amazon. Поиск будет произведен только в этом "узле".', 'content-egg'),
138
+ 'callback' => array($this, 'render_input'),
139
+ 'default' => '',
140
+ 'validator' => array(
141
+ 'trim',
142
+ ),
143
+ 'section' => 'default',
144
+ ),
145
+ 'title' => array(
146
+ 'title' => __('Поиск в названии', 'content-egg'),
147
+ 'description' => __('Поиск будет произведет только по названиям товаров.', 'content-egg'),
148
+ 'callback' => array($this, 'render_checkbox'),
149
+ 'default' => false,
150
+ 'section' => 'default',
151
+ ),
152
+ 'merchant_id' => array(
153
+ 'title' => __('Только Amazon', 'content-egg'),
154
+ 'description' => __('Выбрать товары, которые продает Amazon. Другие продавцы исключаются из поиска.', 'content-egg'),
155
+ 'callback' => array($this, 'render_checkbox'),
156
+ 'default' => false,
157
+ 'section' => 'default',
158
+ ),
159
+ 'minimum_price' => array(
160
+ 'title' => __('Минимальная цена', 'content-egg'),
161
+ 'description' => __('Например, 8.99', 'content-egg'),
162
+ 'callback' => array($this, 'render_input'),
163
+ 'default' => '',
164
+ 'validator' => array(
165
+ 'trim',
166
+ ),
167
+ 'section' => 'default',
168
+ ),
169
+ 'maximum_price' => array(
170
+ 'title' => __('Максимальная цена', 'content-egg'),
171
+ 'description' => __('Например, 98.50', 'content-egg'),
172
+ 'callback' => array($this, 'render_input'),
173
+ 'default' => '',
174
+ 'validator' => array(
175
+ 'trim',
176
+ ),
177
+ 'section' => 'default',
178
+ ),
179
+ 'min_percentage_off' => array(
180
+ 'title' => __('Минимальная скидка', 'content-egg'),
181
+ 'description' => __('Выбрать товары со скидкой. Обязательно должна быть задана категория. Обратите внимание, эта опция работает не для всех категорий.', 'content-egg'),
182
+ 'callback' => array($this, 'render_dropdown'),
183
+ 'dropdown_options' => array(
184
+ '' => __('Неважно', 'content-egg'),
185
+ '5%' => '5%',
186
+ '10%' => '10%',
187
+ '15%' => '15%',
188
+ '20%' => '20%',
189
+ '25%' => '25%',
190
+ '30%' => '30%',
191
+ '35%' => '35%',
192
+ '40%' => '40%',
193
+ '45%' => '45%',
194
+ '50%' => '50%',
195
+ '60%' => '60%',
196
+ '70%' => '70%',
197
+ '80%' => '80%',
198
+ '90%' => '90%',
199
+ '95%' => '95%',
200
+ ),
201
+ 'default' => '',
202
+ 'section' => 'default',
203
+ ),
204
+ 'customer_reviews' => array(
205
+ 'title' => __('Парсить отзывы', 'content-egg'),
206
+ 'description' => __('Парсить отзывы покупателей по товарам. Это замедляет получение данных.', 'content-egg'),
207
+ 'callback' => array($this, 'render_checkbox'),
208
+ 'default' => false,
209
+ 'section' => 'default',
210
+ ),
211
+ 'customer_reviews_iframe' => array(
212
+ 'title' => __('Отзывы в iframe.', 'content-egg'),
213
+ 'description' => __('Показывать отзывы покупателей в iframe с amazon (отключение этой опции, возможно, нарушает правила партнерской программы amazon).', 'content-egg'),
214
+ 'callback' => array($this, 'render_checkbox'),
215
+ 'default' => true,
216
+ 'section' => 'default',
217
+ ),
218
+ 'truncate_reviews_at' => array(
219
+ 'title' => __('Обрезать отзывы', 'content-egg'),
220
+ 'description' => __('Количество символов для одного отзыва. 0 - максимально возможная длина текста.', 'content-egg'),
221
+ 'callback' => array($this, 'render_input'),
222
+ 'default' => 250,
223
+ 'validator' => array(
224
+ 'trim',
225
+ 'absint',
226
+ ),
227
+ 'section' => 'default',
228
+ ),
229
+ 'review_products_number' => array(
230
+ 'title' => __('Товар с отзывами', 'content-egg'),
231
+ 'description' => __('Парсить отзывы только для заданного количества товаров.', 'content-egg'),
232
+ 'callback' => array($this, 'render_input'),
233
+ 'default' => 1,
234
+ 'validator' => array(
235
+ 'trim',
236
+ 'absint',
237
+ ),
238
+ 'section' => 'default',
239
+ ),
240
+ 'editorial_reviews' => array(
241
+ 'title' => __('Парсить отписание', 'content-egg'),
242
+ 'description' => __('Парсить описание товаров от продавца.', 'content-egg'),
243
+ 'callback' => array($this, 'render_checkbox'),
244
+ 'default' => false,
245
+ 'section' => 'default',
246
+ ),
247
+ 'editorial_reviews_type' => array(
248
+ 'title' => __('Вид описания', 'content-egg'),
249
+ 'description' => '',
250
+ 'callback' => array($this, 'render_dropdown'),
251
+ 'dropdown_options' => array(
252
+ 'allow_all' => __('Как на Amazon', 'content-egg'),
253
+ 'safe_html' => __('Безопасный HTML', 'content-egg'),
254
+ 'allowed_tags' => __('Только разрешенные теги HTML', 'content-egg'),
255
+ 'text' => __('Только текст', 'content-egg'),
256
+ ),
257
+ 'default' => 'All',
258
+ 'section' => 'default',
259
+ ),
260
+ 'editorial_reviews_size' => array(
261
+ 'title' => __('Размер описания', 'content-egg'),
262
+ 'description' => __('Максимальный размер описания товара. 0 - не обрезать.', 'content-egg'),
263
+ 'callback' => array($this, 'render_input'),
264
+ 'default' => 1000,
265
+ 'validator' => array(
266
+ 'trim',
267
+ 'absint',
268
+ ),
269
+ 'section' => 'default',
270
+ ),
271
+ );
272
+ return array_merge(parent::options(), $optiosn);
273
+ }
274
+
275
+ public static function getLocalesList()
276
+ {
277
+ return array('us' => 'US', 'uk' => 'UK', 'de' => 'DE', 'jp' => 'JP', 'cn' => 'CN', 'fr' => 'FR', 'it' => 'IT', 'es' => 'ES', 'ca' => 'CA', 'br' => 'BR', 'in' => 'IN');
278
+ }
279
+
280
+ public static function getDefaultLocale()
281
+ {
282
+ $lang = GeneralConfig::getInstance()->option('lang');
283
+ if (array_key_exists($lang, self::getLocalesList()))
284
+ return $lang;
285
+ else
286
+ return 'us';
287
+ }
288
+
289
+ }
application/modules/Amazon/AmazonModule.php ADDED
@@ -0,0 +1,458 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Amazon;
4
+
5
+ use ContentEgg\application\components\AffiliateParserModule;
6
+ use ContentEgg\application\libs\amazon\AmazonProduct;
7
+ use ContentEgg\application\components\ContentProduct;
8
+ use ContentEgg\application\admin\PluginAdmin;
9
+ use ContentEgg\application\components\ExtraData;
10
+ use ContentEgg\application\helpers\TextHelper;
11
+
12
+ /**
13
+ * AmazonModule class file
14
+ *
15
+ * @author keywordrush.com <support@keywordrush.com>
16
+ * @link http://www.keywordrush.com/
17
+ * @copyright Copyright &copy; 2015 keywordrush.com
18
+ */
19
+ class AmazonModule extends AffiliateParserModule {
20
+
21
+ private $api_client = null;
22
+
23
+ public function info()
24
+ {
25
+ return array(
26
+ 'name' => 'Amazon',
27
+ 'api_agreement' => 'https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html',
28
+ 'description' => __('Добавляет товары amazon.', 'content-egg'),
29
+ );
30
+ }
31
+
32
+ public function defaultTemplateName()
33
+ {
34
+ return 'data_item';
35
+ }
36
+
37
+ public function isItemsUpdateAvailable()
38
+ {
39
+ return true;
40
+ }
41
+
42
+ public function isFree()
43
+ {
44
+ return true;
45
+ }
46
+
47
+ public function doRequest($keyword, $query_params = array(), $is_autoupdate = false)
48
+ {
49
+ $options = array();
50
+
51
+
52
+ $search_index = $this->config('search_index');
53
+ // Если не задана категория для поиска, то все остальные опции фильтрации работать не будут!
54
+ if ($search_index != 'All' && $search_index != 'Blended')
55
+ {
56
+ if ($this->config('title'))
57
+ $options['Title'] = $keyword;
58
+ else
59
+ $options['Keywords'] = $keyword;
60
+
61
+ $options['Sort'] = $this->config('sort');
62
+ if ((int) $this->config('brouse_node'))
63
+ $options['BrowseNode'] = (int) $this->config('brouse_node');
64
+
65
+ // Specifies the minimum price of the items to return. Prices are in
66
+ // terms of the lowest currency denomination, for example, pennies,
67
+ // for example, 3241 represents $32.41.
68
+ if ($this->config('minimum_price'))
69
+ $options['MinimumPrice'] = TextHelper::pricePenniesDenomination($this->config('minimum_price'));
70
+ if ($this->config('maximum_price'))
71
+ $options['MaximumPrice'] = TextHelper::pricePenniesDenomination($this->config('maximum_price'));
72
+
73
+ // Specifies the minimum percentage off for the items to return.
74
+ // @link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/LocaleUS.html
75
+ if ($query_params['min_percentage_off'])
76
+ $options['MinPercentageOff'] = (int) $query_params['min_percentage_off'];
77
+ elseif ($this->config('min_percentage_off'))
78
+ $options['MinPercentageOff'] = (int) $this->config('min_percentage_off');
79
+ } else
80
+ $options['Keywords'] = $keyword; // Для категории "All" работает только поиск по ключевому слову
81
+
82
+ if ($this->config('merchant_id'))
83
+ $options['MerchantId'] = "Amazon";
84
+
85
+ $options['ResponseGroup'] = 'ItemIds,Offers,ItemAttributes,Images';
86
+
87
+ // Customer Reviews
88
+ if ($this->config('customer_reviews'))
89
+ {
90
+ $options['ResponseGroup'] .= ',Reviews';
91
+ $options['TruncateReviewsAt'] = $this->config('truncate_reviews_at');
92
+ //$options['ReviewSort'] = $this->config('review_sort');
93
+ $options['IncludeReviewsSummary'] = true;
94
+ }
95
+ // Editorial Reviews
96
+ if ($this->config('editorial_reviews'))
97
+ {
98
+ $options['ResponseGroup'] .= ',EditorialReview';
99
+ }
100
+
101
+ $results = $this->getAmazonClient()->ItemSearch($this->config('search_index'), $options);
102
+
103
+ if (!is_array($results))
104
+ return array();
105
+
106
+ return $this->prepareResults($results['Items']['Item'], $is_autoupdate);
107
+ }
108
+
109
+ public function doRequestItems(array $items)
110
+ {
111
+ $options = array();
112
+
113
+ $item_ids = array();
114
+ foreach ($items as $item)
115
+ {
116
+ $item_ids[] = $item['unique_id'];
117
+ }
118
+
119
+ $options['ResponseGroup'] = 'Offers';
120
+
121
+ // update iframe url for customer reviews
122
+ if ($this->config('customer_reviews') && $this->config('customer_reviews_iframe'))
123
+ {
124
+ $options['ResponseGroup'] .= ',Reviews';
125
+ $options['TruncateReviewsAt'] = $this->config('truncate_reviews_at');
126
+ $options['IncludeReviewsSummary'] = true;
127
+ }
128
+
129
+
130
+ $results = $this->getAmazonClient()->ItemLookup($item_ids, $options);
131
+
132
+ if (!isset($results['Items']))
133
+ throw new \Exception('ItemLookup request error.');
134
+
135
+ $results = $results['Items']['Item'];
136
+
137
+ $i = 0;
138
+ foreach ($items as $key => $item)
139
+ {
140
+ if ($item['unique_id'] != $results[$i]['ASIN'])
141
+ continue;
142
+
143
+ // offer
144
+ $items[$key] = self::fillOfferVars($results[$i], $item, $item['extra']);
145
+ if (!empty($results[$i]['CustomerReviews']))
146
+ {
147
+ $items[$key]['extra']['customerReviews'] = (array) new ExtraAmazonCustomerReviews;
148
+ $items[$key]['extra']['customerReviews'] = ExtraData::fillAttributes($items[$key]['extra']['customerReviews'], $results[$i]['CustomerReviews']);
149
+ }
150
+
151
+ $i++;
152
+ }
153
+ return $items;
154
+ }
155
+
156
+ private function prepareResults($results, $is_autoupdate)
157
+ {
158
+ // Обрезаем количество результатов (амазон не имеет такого параметра для API).
159
+ if ($is_autoupdate)
160
+ $results = array_slice($results, 0, $this->config('entries_per_page_update'));
161
+ else
162
+ $results = array_slice($results, 0, $this->config('entries_per_page'));
163
+
164
+ $data = array();
165
+ foreach ($results as $key => $r)
166
+ {
167
+ $content = new ContentProduct;
168
+ $extra = new ExtraDataAmazon;
169
+ ExtraData::fillAttributes($extra, $r);
170
+
171
+ if (isset($r['ItemLinks']) && isset($r['ItemLinks']['ItemLink']))
172
+ {
173
+ foreach ($r['ItemLinks']['ItemLink'] as $link_r)
174
+ {
175
+ $link = new ExtraAmazonItemLinks;
176
+ ExtraData::fillAttributes($link, $link_r);
177
+ $extra->itemLinks[] = $link;
178
+ }
179
+ }
180
+
181
+ if (!empty($r['ImageSets']) && !empty($r['ImageSets']['ImageSet']))
182
+ {
183
+ if (!isset($r['ImageSets']['ImageSet'][0]))
184
+ $r['ImageSets'] = array($r['ImageSets']['ImageSet']);
185
+ else
186
+ $r['ImageSets'] = $r['ImageSets']['ImageSet'];
187
+
188
+
189
+ foreach ($r['ImageSets'] as $image_r)
190
+ {
191
+ $image = new ExtraAmazonImageSet;
192
+ $image->attributes = $image_r['@attributes'];
193
+ $image->SwatchImage = $image_r['SwatchImage']['URL'];
194
+ $image->SmallImage = $image_r['SmallImage']['URL'];
195
+ $image->ThumbnailImage = $image_r['ThumbnailImage']['URL'];
196
+ $image->TinyImage = $image_r['TinyImage']['URL'];
197
+ $image->MediumImage = $image_r['MediumImage']['URL'];
198
+ $image->LargeImage = $image_r['LargeImage']['URL'];
199
+ $extra->imageSet[] = $image;
200
+ }
201
+ }
202
+
203
+ if (isset($r['ItemAttributes']['Feature']) && !is_array($r['ItemAttributes']['Feature']))
204
+ $r['ItemAttributes']['Feature'] = array($r['ItemAttributes']['Feature']);
205
+
206
+ $extra->itemAttributes = new ExtraAmazonItemAttributes;
207
+ ExtraData::fillAttributes($extra->itemAttributes, $r['ItemAttributes']);
208
+
209
+ if (isset($r['ItemAttributes']['Category']))
210
+ $content->category = $r['ItemAttributes']['Category'];
211
+ if (isset($r['ItemAttributes']['Manufacturer']))
212
+ $content->manufacturer = $r['ItemAttributes']['Manufacturer'];
213
+ if (isset($r['ItemAttributes']['Author']))
214
+ $extra->author = $r['ItemAttributes']['Author'];
215
+
216
+ // Offers
217
+ self::fillOfferVars($r, $content, $extra);
218
+
219
+ // Customer Reviews
220
+ if (isset($r['CustomerReviews']) && $key < $this->config('review_products_number'))
221
+ {
222
+ $extra->customerReviews = new ExtraAmazonCustomerReviews;
223
+ ExtraData::fillAttributes($extra->customerReviews, $r['CustomerReviews']);
224
+ if ($this->config('customer_reviews') &&
225
+ !$this->config('customer_reviews_iframe') &&
226
+ $key < $this->config('review_products_number'))
227
+ {
228
+ $customer_reviews = $this->getAmazonClient()->parseCustomerReviews($r['CustomerReviews']['IFrameURL'], $this->config('locale'));
229
+ ExtraData::fillAttributes($extra->customerReviews, $customer_reviews);
230
+
231
+ if (isset($customer_reviews['Reviews']) && $customer_reviews['Reviews'])
232
+ {
233
+ foreach ($customer_reviews['Reviews'] as $review)
234
+ {
235
+ $customer_review = new ExtraAmazonCustomerReview;
236
+ ExtraData::fillAttributes($customer_review, $review);
237
+ $extra->customerReviews->reviews[] = $customer_review;
238
+ }
239
+ }
240
+ }
241
+
242
+ if ($extra->customerReviews->AverageRating)
243
+ $content->rating = round($extra->customerReviews->AverageRating);
244
+ }
245
+
246
+
247
+ // Editorial Reviews
248
+ if (isset($r['EditorialReviews']['EditorialReview']))
249
+ {
250
+ if (!isset($r['EditorialReviews']['EditorialReview'][0]))
251
+ $r['EditorialReviews']['EditorialReview'] = array($r['EditorialReviews']['EditorialReview']);
252
+
253
+ foreach ($r['EditorialReviews']['EditorialReview'] as $editorialReview_r)
254
+ {
255
+ $editorialReview = new ExtraAmazonEditorialReviews;
256
+ ExtraData::fillAttributes($editorialReview, $editorialReview_r);
257
+
258
+ // safe html
259
+ $editorialReview->Content = TextHelper::safeHtml($editorialReview->Content, $this->config('editorial_reviews_type'));
260
+
261
+ //размер
262
+ if ($this->config('editorial_reviews_size'))
263
+ {
264
+ $editorialReview->Content = TextHelper::truncateHtml($editorialReview->Content, $this->config('editorial_reviews_size'));
265
+ }
266
+ $extra->editorialReviews[] = $editorialReview;
267
+ }
268
+ }
269
+
270
+ // Заполняем стандартные поля: title, description, url, price
271
+ // все остальные данные в extra
272
+
273
+ $content->url = $r['DetailPageURL'];
274
+
275
+ if (isset($r['ItemAttributes']['Title']))
276
+ $content->title = $r['ItemAttributes']['Title'];
277
+
278
+ //MediumImage может и не быть, а только ImageSets, тогда берем картинки с ImageSets
279
+ if (isset($r['MediumImage']))
280
+ {
281
+ $extra->smallImage = $r['SmallImage']['URL'];
282
+ $extra->mediumImage = $r['MediumImage']['URL'];
283
+ $extra->largeImage = $r['LargeImage']['URL'];
284
+ } elseif (!empty($r['ImageSets']))
285
+ {
286
+ $extra->smallImage = $r['ImageSets'][0]['SmallImage']['URL'];
287
+ $extra->mediumImage = $r['ImageSets'][0]['MediumImage']['URL'];
288
+ $extra->largeImage = $r['ImageSets'][0]['LargeImage']['URL'];
289
+ }
290
+
291
+ if (isset($r['LargeImage']))
292
+ $content->img = $r['LargeImage']['URL'];
293
+ elseif ($extra->largeImage)
294
+ $content->img = $extra->largeImage;
295
+
296
+ $extra->addToCartUrl = $this->getAmazonAddToCartUrl() .
297
+ '?ASIN.1=' . $extra->ASIN . '&Quantity.1=1' .
298
+ '&AssociateTag=' . $this->config('associate_tag');
299
+
300
+ if ($this->config('link_type') == 'add_to_cart')
301
+ {
302
+ $content->orig_url = $content->url;
303
+ $content->url = $extra->addToCartUrl;
304
+ }
305
+
306
+ $content->extra = $extra;
307
+ $content->unique_id = $extra->ASIN;
308
+
309
+ $data[] = $content;
310
+ }
311
+ return $data;
312
+ }
313
+
314
+ private function getAmazonClient()
315
+ {
316
+ if ($this->api_client === null)
317
+ {
318
+ $access_key_id = $this->config('access_key_id');
319
+ $secret_access_key = $this->config('secret_access_key');
320
+ $associate_tag = $this->config('associate_tag');
321
+ $this->api_client = new AmazonProduct($access_key_id, $secret_access_key, $associate_tag);
322
+ $this->api_client->setLocale($this->config('locale'));
323
+ }
324
+ return $this->api_client;
325
+ }
326
+
327
+ static private function fillOfferVars($r, $content, $extra)
328
+ {
329
+ // dirty tricks with object2array conversation for doRequestItems
330
+ $return_array = false;
331
+ if (!is_object($content))
332
+ {
333
+ $return_array = true;
334
+ unset($content['extra']);
335
+ $content = json_decode(json_encode($content), FALSE);
336
+ $extra = json_decode(json_encode($extra), FALSE);
337
+ }
338
+
339
+ // Offers
340
+ if (isset($r['Offers']) &&
341
+ isset($r['Offers']['Offer']) &&
342
+ isset($r['Offers']['Offer']['OfferListing']))
343
+ {
344
+ $r['Price'] = $r['Offers']['Offer']['OfferListing']['Price'];
345
+
346
+ if (isset($r['Offers']['Offer']['OfferListing']['AmountSaved']))
347
+ {
348
+ $extra->AmountSaved = $r['Offers']['Offer']['OfferListing']['AmountSaved']['FormattedPrice'];
349
+ if (isset($r['Offers']['Offer']['OfferListing']['PercentageSaved']))
350
+ $content->percentageSaved = $r['Offers']['Offer']['OfferListing']['PercentageSaved'];
351
+ }
352
+
353
+ //@link: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/AvailabilityValues.html
354
+ if (isset($r['Offers']['Offer']['OfferListing']['Availability']))
355
+ {
356
+ $extra->availability = $r['Offers']['Offer']['OfferListing']['Availability'];
357
+ }
358
+
359
+ if (isset($r['Offers']['Offer']['OfferListing']['IsEligibleForSuperSaverShipping']))
360
+ $extra->IsEligibleForSuperSaverShipping = $r['Offers']['Offer']['OfferListing']['IsEligibleForSuperSaverShipping'];
361
+ }elseif (isset($r['OfferSummary']['LowestNewPrice']))
362
+ $r['Price'] = $r['OfferSummary']['LowestNewPrice'];
363
+
364
+
365
+ if ((!isset($r['Price']) || !$r['Price']) && isset($r['ItemAttributes']['ListPrice']))
366
+ $r['Price'] = $r['ItemAttributes']['ListPrice'];
367
+
368
+ if (isset($r['ItemAttributes']['ListPrice']) &&
369
+ $r['ItemAttributes']['ListPrice']['Amount'] &&
370
+ ( (isset($r['Price']['Amount']) && $r['ItemAttributes']['ListPrice']['Amount'] > $r['Price']['Amount']) || $r['Price']['FormattedPrice'] == 'Too low to display'))
371
+ {
372
+ $content->priceOld = TextHelper::pricePenniesDenomination($r['ItemAttributes']['ListPrice']['Amount'], false);
373
+ $content->currencyCode = $r['ItemAttributes']['ListPrice']['CurrencyCode'];
374
+ $content->currency = TextHelper::currencyTyping($content->currencyCode);
375
+ }
376
+
377
+ if (isset($r['Price']['FormattedPrice']) && $r['Price']['FormattedPrice'] == 'Too low to display')
378
+ $extra->toLowToDisplay = true;
379
+
380
+ if (!empty($r['Price']['Amount']))
381
+ {
382
+ $content->price = TextHelper::pricePenniesDenomination($r['Price']['Amount'], false);
383
+ $content->currencyCode = $r['Price']['CurrencyCode'];
384
+ $content->currency = TextHelper::currencyTyping($content->currencyCode);
385
+ }
386
+
387
+ if ($return_array)
388
+ {
389
+ $content = json_decode(json_encode($content), true);
390
+ $extra = json_decode(json_encode($extra), true);
391
+ $content['extra'] = $extra;
392
+ return $content;
393
+ }
394
+ }
395
+
396
+ /**
397
+ * Add to shopping cart url
398
+ * @link: http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/AddToCartForm.html
399
+ * @link: https://affiliate-program.amazon.com/gp/associates/help/t1/a10?ie=UTF8&pf_rd_i=assoc_help_t6_a1&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=&pf_rd_r=&pf_rd_s=assoc-center-1&pf_rd_t=501&ref_=amb_link_177735_1
400
+ * @link: https://affiliate-program.amazon.com/gp/associates/help/operating
401
+ * @link: https://affiliate-program.amazon.com/gp/associates/help/t2/a11
402
+ */
403
+ private function getAmazonAddToCartUrl()
404
+ {
405
+ switch ($this->config('locale'))
406
+ {
407
+ case 'uk':
408
+ return 'http://www.amazon.co.uk/gp/aws/cart/add.html';
409
+ break;
410
+ case 'de':
411
+ return 'http://www.amazon.de/gp/aws/cart/add.html';
412
+ break;
413
+ case 'fr':
414
+ return 'http://www.amazon.fr/gp/aws/cart/add.html';
415
+ break;
416
+ case 'jp':
417
+ return 'http://www.amazon.co.jp/gp/aws/cart/add.html';
418
+ break;
419
+ case 'cn':
420
+ return 'http://www.amazon.cn/gp/aws/cart/add.html';
421
+ break;
422
+ case 'it':
423
+ return 'http://www.amazon.it/gp/aws/cart/add.html';
424
+ break;
425
+ case 'es':
426
+ return 'http://www.amazon.es/gp/aws/cart/add.html';
427
+ break;
428
+ case 'ca':
429
+ return 'http://www.amazon.ca/gp/aws/cart/add.html';
430
+ break;
431
+ case 'br':
432
+ return 'http://www.amazon.br/gp/aws/cart/add.html';
433
+ break;
434
+ case 'in':
435
+ return 'http://www.amazon.in/gp/aws/cart/add.html';
436
+ break;
437
+ default: //'us'
438
+ return 'http://www.amazon.com/gp/aws/cart/add.html';
439
+ break;
440
+ }
441
+ }
442
+
443
+ public function renderResults()
444
+ {
445
+ PluginAdmin::render('_metabox_results', array('module_id' => $this->getId()));
446
+ }
447
+
448
+ public function renderSearchResults()
449
+ {
450
+ PluginAdmin::render('_metabox_search_results', array('module_id' => $this->getId()));
451
+ }
452
+
453
+ public function renderSearchPanel()
454
+ {
455
+ $this->render('search_panel', array('module_id' => $this->getId()));
456
+ }
457
+
458
+ }
application/modules/Amazon/ExtraAmazonCustomerReviews.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Amazon;
4
+
5
+ /**
6
+ * ExtraAmazonCustomerReviews class file
7
+ *
8
+ * @author keywordrush.com <support@keywordrush.com>
9
+ * @link http://www.keywordrush.com/
10
+ * @copyright Copyright &copy; 2015 keywordrush.com
11
+ */
12
+ //параметры из AmazonProduct->parseCustomerReviews
13
+ class ExtraAmazonCustomerReviews {
14
+
15
+ public $IFrameURL;
16
+ public $HasReviews;
17
+ public $AverageRating;
18
+ public $TotalReviews;
19
+ public $reviews = array();
20
+
21
+ }
application/modules/Amazon/ExtraDataAmazon.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Amazon;
4
+
5
+ use ContentEgg\application\components\ExtraData;
6
+
7
+ /**
8
+ * ExtraDataAmazon class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class ExtraDataAmazon extends ExtraData {
15
+
16
+ public $itemLinks = array();
17
+ public $imageSet = array();
18
+ public $AmountSaved;
19
+ public $PercentageSaved;
20
+ public $IsEligibleForSuperSaverShipping;
21
+ public $customerReviews;
22
+ public $editorialReviews = array();
23
+ public $smallImage;
24
+ public $mediumImage;
25
+ public $largeImage;
26
+ public $addToCartUrl;
27
+ public $ASIN;
28
+ public $itemAttributes;
29
+ public $toLowToDisplay;
30
+ public $availability;
31
+ }
32
+
33
+ class ExtraAmazonItemLinks {
34
+
35
+ public $Description;
36
+ public $URL;
37
+
38
+ }
39
+
40
+ class ExtraAmazonImageSet {
41
+
42
+ public $attributes = array();
43
+ public $SwatchImage;
44
+ public $SmallImage;
45
+ public $ThumbnailImage;
46
+ public $TinyImage;
47
+ public $MediumImage;
48
+ public $LargeImage;
49
+
50
+ }
51
+
52
+ //параметры из AmazonProduct->parseCustomerReviews
53
+ class ExtraAmazonCustomerReview {
54
+
55
+ public $Content;
56
+ public $Summary;
57
+ public $Date;
58
+ public $Name;
59
+ public $Rating;
60
+
61
+ }
62
+
63
+ class ExtraAmazonEditorialReviews {
64
+
65
+ public $Source;
66
+ public $Content;
67
+
68
+ }
69
+
70
+ class ExtraAmazonItemAttributes {
71
+
72
+ public $Actor;
73
+ public $Artist;
74
+ public $AspectRatio;
75
+ public $AudienceRating;
76
+ public $AudioFormat;
77
+ public $Binding;
78
+ public $Brand;
79
+ public $CEROAgeRating;
80
+ public $ClothingSize;
81
+ public $Color;
82
+ public $Creator;
83
+ public $Department;
84
+ public $Director;
85
+ public $EAN;
86
+ public $EANList;
87
+ public $Edition;
88
+ public $EISBN;
89
+ public $EpisodeSequence;
90
+ public $ESRBAgeRating;
91
+ public $Feature = array();
92
+ public $Format;
93
+ public $Genre;
94
+ public $HardwarePlatform;
95
+ public $HazardousMaterialType;
96
+ public $IsAdultProduct;
97
+ public $IsAutographed;
98
+ public $ISBN;
99
+ public $IsEligibleForTradeIn;
100
+ public $IsMemorabilia;
101
+ public $IssuesPerYear;
102
+ public $ItemDimensions;
103
+ public $ItemPartNumber;
104
+ public $Label;
105
+ public $Languages;
106
+ public $LegalDisclaimer;
107
+ public $ManufacturerMaximumAge;
108
+ public $ManufacturerMinimumAge;
109
+ public $ManufacturerPartsWarrantyDescription;
110
+ public $MediaType;
111
+ public $Model;
112
+ public $MPN;
113
+ public $NumberOfDiscs;
114
+ public $NumberOfIssues;
115
+ public $NumberOfItems;
116
+ public $NumberOfPages;
117
+ public $NumberOfTracks;
118
+ public $OperatingSystem;
119
+ public $PackageQuantity;
120
+ public $PartNumber;
121
+ public $Platform;
122
+ public $ProductGroup;
123
+ public $ProductTypeSubcategory;
124
+ public $PublicationDate;
125
+ public $Publisher;
126
+ public $RegionCode;
127
+ public $ReleaseDate;
128
+ public $RunningTime;
129
+ public $SeikodoProductCode;
130
+ public $Size;
131
+ public $SKU;
132
+ public $Studio;
133
+ public $SubscriptionLength;
134
+ public $TradeInValue;
135
+ public $UPC;
136
+ public $UPCList;
137
+ public $Warranty;
138
+ public $WEEETaxValue;
139
+ public $PackageDimensions;
140
+
141
+ }
application/modules/Amazon/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/modules/Amazon/templates/data_grid.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Grid
4
+ */
5
+
6
+ __('Grid', 'content-egg-tpl');
7
+
8
+ use ContentEgg\application\helpers\TemplateHelper;
9
+ ?>
10
+
11
+ <?php
12
+ \wp_enqueue_style('egg-bootstrap');
13
+ \wp_enqueue_style('content-egg-products');
14
+ ?>
15
+
16
+ <div class="egg-container">
17
+ <?php if ($title): ?>
18
+ <h3><?php echo esc_html($title); ?></h3>
19
+ <?php endif; ?>
20
+
21
+ <div class="container-fluid">
22
+ <?php $i = 0; ?>
23
+ <?php foreach ($items as $item): ?>
24
+
25
+ <a rel="nofollow" target="_blank" href="<?php echo esc_url($item['url']) ?>">
26
+ <div class="col-md-4 productbox">
27
+ <?php if ($item['percentageSaved']): ?>
28
+ <div class="cegg-promotion">
29
+ <span class="cegg-discount">- <?php echo round($item['percentageSaved']); ?>%</span>
30
+ </div>
31
+ <?php endif; ?>
32
+
33
+ <?php if ($item['img']): ?>
34
+ <?php $img = str_replace('.jpg', '._AC_UL250_SR250,250_.jpg', $item['img']) ?>
35
+ <img class="img-responsive" src="<?php echo esc_attr($img) ?>" alt="<?php echo esc_attr($item['title']); ?>" />
36
+ <?php endif; ?>
37
+
38
+ <div class="producttitle">
39
+ <?php if ($item['manufacturer']): ?><?php echo esc_html($item['manufacturer']); ?><?php endif; ?>
40
+ <span><?php echo esc_html(TemplateHelper::truncate($item['title'], 80)); ?></span>
41
+ </div>
42
+
43
+ <?php if ((int) $item['rating'] > 0): ?>
44
+ <div>
45
+ <span class="rating_small"><?php echo str_repeat("<span>&#x2605</span>", (int) $item['rating']);echo str_repeat("<span>☆</span>", 5 - (int) $item['rating']);?></span>
46
+ </div>
47
+ <?php endif; ?>
48
+
49
+ <div class="productprice">
50
+ <?php if ($item['price']): ?>
51
+ <?php if ($item['priceOld']): ?><strike><?php echo $item['currency']; ?><?php echo TemplateHelper::price_format_i18n($item['priceOld']); ?></strike>&nbsp;<?php endif; ?>
52
+ <?php echo $item['currency']; ?><?php echo TemplateHelper::price_format_i18n($item['price']); ?>
53
+ <?php endif; ?>
54
+ </div>
55
+ </div>
56
+ </a>
57
+
58
+ <?php $i++;
59
+ if ($i % 3 == 0): ?>
60
+ <div class="clearfix"></div>
61
+ <?php endif; ?>
62
+ <?php endforeach; ?>
63
+ </div>
64
+ </div>
application/modules/Amazon/templates/data_item.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Product card
4
+ */
5
+
6
+ __('Product card', 'content-egg-tpl');
7
+
8
+ use ContentEgg\application\helpers\TemplateHelper;
9
+ ?>
10
+
11
+ <?php
12
+ \wp_enqueue_style('egg-bootstrap');
13
+ \wp_enqueue_style('content-egg-products');
14
+ ?>
15
+
16
+
17
+ <div class="egg-container">
18
+
19
+ <?php if ($title): ?>
20
+ <h3><?php echo esc_html($title);?></h3>
21
+ <?php endif; ?>
22
+
23
+ <div class="products">
24
+
25
+ <?php foreach ($items as $item): ?>
26
+ <div class="row">
27
+ <div class="col-md-5">
28
+ <?php if ($item['img']): ?>
29
+ <a rel="nofollow" target="_blank" href="<?php echo $item['url']; ?>">
30
+ <img src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['title']); ?>" class="img-responsive" />
31
+ </a>
32
+ <?php endif; ?>
33
+ </div>
34
+ <div class="col-md-7">
35
+ <h2 class="media-heading"><?php echo $item['title']; ?></h2>
36
+ <?php if ((int) $item['rating'] > 0): ?>
37
+ <span class="rating"><?php echo str_repeat("<span>&#x2605</span>", (int) $item['rating']);
38
+ echo str_repeat("<span>☆</span>", 5 - (int) $item['rating']); ?></span>
39
+ <?php endif; ?>
40
+
41
+ <div class="well-lg">
42
+
43
+ <div class="row">
44
+ <div class="col-md-6">
45
+ <?php if ($item['priceOld']): ?>
46
+ <span class="text-muted"><strike><small><?php echo $item['currency']; ?></small><?php echo TemplateHelper::price_format_i18n($item['priceOld']); ?></strike></span><br>
47
+ <?php endif; ?>
48
+
49
+ <?php if ($item['price']): ?>
50
+ <span class="cegg-price"><small><?php echo $item['currency']; ?></small><?php echo TemplateHelper::price_format_i18n($item['price']); ?></span>
51
+ <?php elseif ($item['extra']['toLowToDisplay']): ?>
52
+ <span class="text-muted"><?php _e('Too low to display', 'content-egg-tpl'); ?></span>
53
+ <?php endif; ?>
54
+
55
+
56
+ <?php if ((bool) $item['extra']['IsEligibleForSuperSaverShipping']): ?>
57
+ <p class="text-muted"><small><?php _e('Free shipping', 'content-egg-tpl'); ?></small></p>
58
+ <?php endif; ?>
59
+ </div>
60
+ <div class="col-md-6 text-center text-muted">
61
+ <a rel="nofollow" target="_blank" href="<?php echo $item['url']; ?>" class="btn btn-success"><?php _e('BUY THIS ITEM', 'content-egg-tpl'); ?></a>
62
+ <br>
63
+ <small>Amazon</small>
64
+ </div>
65
+ </div>
66
+
67
+
68
+
69
+ </div>
70
+
71
+ </div>
72
+ </div>
73
+ <div class="row">
74
+ <div class="col-md-12">
75
+ <?php if ($item['description']): ?>
76
+ <p><?php echo $item['description']; ?></p>
77
+ <?php endif; ?>
78
+
79
+ <?php if ($item['extra']['itemAttributes']['Feature']): ?>
80
+ <p>
81
+ <h3><?php _e('Features', 'content-egg-tpl'); ?></h3>
82
+ <ul>
83
+ <?php foreach ($item['extra']['itemAttributes']['Feature'] as $k => $feature): ?>
84
+ <li><?php echo $feature; ?></li>
85
+ <?php if($k >= 4) break; ?>
86
+ <?php endforeach; ?>
87
+ </ul>
88
+ </p>
89
+ <?php endif; ?>
90
+
91
+ <?php if ($item['extra']['customerReviews']): ?>
92
+
93
+ <?php if (!empty($item['extra']['customerReviews']['reviews'])): ?>
94
+ <h3><?php _e('Customer reviews', 'content-egg-tpl'); ?></h3>
95
+ <?php foreach ($item['extra']['customerReviews']['reviews'] as $review): ?>
96
+ <div>
97
+ <em><?php echo esc_html($review['Summary']); ?>, <small><?php echo date(get_option('date_format'), $review['Date']); ?></small></em>
98
+ <span class="rating_small">
99
+ <?php echo str_repeat("<span>&#x2605</span>", (int) $review['Rating']); ?><?php echo str_repeat("<span>☆</span>", 5 - (int) $review['Rating']); ?>
100
+ </span>
101
+ </div>
102
+ <blockquote><?php echo esc_html($review['Content']); ?></blockquote>
103
+ <?php endforeach; ?>
104
+ <?php elseif ($item['extra']['customerReviews']['HasReviews'] == 'true'): ?>
105
+ <iframe src='<?php echo $item['extra']['customerReviews']['IFrameURL']; ?>' width='100%' height='500'></iframe>
106
+ <?php endif; ?>
107
+ <?php endif; ?>
108
+
109
+ <?php if ($item['extra']['editorialReviews']): ?>
110
+ <?php foreach ($item['extra']['editorialReviews'] as $review): ?>
111
+ <h3><?php echo esc_html($review['Source']); ?></h3>
112
+ <p><?php echo $review['Content']; ?></p>
113
+ <?php endforeach; ?>
114
+ <?php endif; ?>
115
+
116
+ </div>
117
+ </div>
118
+ <br>
119
+ <br>
120
+ <?php endforeach; ?>
121
+ </div>
122
+ </div>
application/modules/Amazon/templates/data_list.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: List
4
+ */
5
+
6
+ __('List', 'content-egg-tpl');
7
+
8
+ use ContentEgg\application\helpers\TemplateHelper;
9
+ ?>
10
+
11
+ <?php
12
+ \wp_enqueue_style('egg-bootstrap');
13
+ \wp_enqueue_style('content-egg-products');
14
+ ?>
15
+
16
+ <div class="egg-container">
17
+ <?php if ($title): ?>
18
+ <h3><?php echo esc_html($title); ?></h3>
19
+ <?php endif; ?>
20
+
21
+ <?php foreach ($items as $item): ?>
22
+ <div class="row products">
23
+ <div class="col-md-2">
24
+ <?php if ($item['img']): ?>
25
+ <a rel="nofollow" target="_blank" href="<?php echo $item['url']; ?>">
26
+ <img src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['title']); ?>" />
27
+ </a>
28
+ <?php endif; ?>
29
+ </div>
30
+ <div class="col-md-8">
31
+ <a rel="nofollow" target="_blank" href="<?php echo $item['url']; ?>">
32
+ <h4><?php echo $item['title']; ?></h4>
33
+ </a>
34
+ </div>
35
+ <div class="col-md-2 offer_price">
36
+ <?php if ($item['priceOld']): ?>
37
+ <span class="text-muted"><strike><small><?php echo $item['currency']; ?></small><?php echo TemplateHelper::price_format_i18n($item['priceOld']); ?></strike></span><br>
38
+ <?php endif; ?>
39
+
40
+ <?php if ($item['price']): ?>
41
+ <?php echo $item['currency']; ?><?php echo TemplateHelper::price_format_i18n($item['price']); ?>
42
+ <?php elseif ($item['extra']['toLowToDisplay']): ?>
43
+ <span class="text-muted"><?php _e('Too low to display', 'content-egg-tpl'); ?></span>
44
+ <?php endif; ?>
45
+
46
+
47
+ <?php if ((bool) $item['extra']['IsEligibleForSuperSaverShipping']): ?>
48
+ <br><span class="text-muted"><?php _e('Free shipping', 'content-egg-tpl'); ?></span>
49
+ <?php endif; ?>
50
+ </div>
51
+ </div>
52
+ <?php endforeach; ?>
53
+ </div>
application/modules/Amazon/views/search_panel.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <select ng-model="query_params.<?php echo $module_id; ?>.min_percentage_off">
2
+ <option value=""><?php _e('Мин. скидка', 'content-egg'); ?></option>
3
+ <option value="5%"><?php _e('5%', 'content-egg'); ?></option>
4
+ <option value="10%"><?php _e('10%', 'content-egg'); ?></option>
5
+ <option value="15%"><?php _e('15%', 'content-egg'); ?></option>
6
+ <option value="20%"><?php _e('20%', 'content-egg'); ?></option>
7
+ <option value="25%"><?php _e('25%', 'content-egg'); ?></option>
8
+ <option value="30%"><?php _e('30%', 'content-egg'); ?></option>
9
+ <option value="35%"><?php _e('35%', 'content-egg'); ?></option>
10
+ <option value="40%"><?php _e('40%', 'content-egg'); ?></option>
11
+ <option value="50%"><?php _e('50%', 'content-egg'); ?></option>
12
+ <option value="60%"><?php _e('60%', 'content-egg'); ?></option>
13
+ <option value="70%"><?php _e('70%', 'content-egg'); ?></option>
14
+ <option value="80%"><?php _e('80%', 'content-egg'); ?></option>
15
+ <option value="90%"><?php _e('90%', 'content-egg'); ?></option>
16
+ </select>
application/modules/Freebase/ExtraDataFreebase.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Freebase;
4
+
5
+ use ContentEgg\application\components\ExtraData;
6
+
7
+ /**
8
+ * ExtraDataFreebase class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class ExtraDataFreebase extends ExtraData {
15
+
16
+ public $article;
17
+ public $officialWebsite = array();
18
+ public $topicEquivalentWebpage = array();
19
+ public $topicalWebpage = array();
20
+ public $quotations = array();
21
+ public $notableFor = array();
22
+ public $notableTypes = array();
23
+ public $awardNominations = array();
24
+ public $artistTrack = array();
25
+ public $dateOfBirth;
26
+ public $freebaseId;
27
+ }
application/modules/Freebase/FreebaseConfig.php ADDED
@@ -0,0 +1,72 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Freebase;
4
+
5
+ use ContentEgg\application\components\ParserModuleConfig;
6
+
7
+ /**
8
+ * FreebaseConfig class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class FreebaseConfig extends ParserModuleConfig {
15
+
16
+ public function options()
17
+ {
18
+ $optiosn = array(
19
+ 'api_key' => array(
20
+ 'title' => 'API Key <span class="cegg_required">*</span>',
21
+ 'description' => __('Ключ для доступа к API. Получить можно в Google <a href="http://code.google.com/apis/console">API консоли</a>.', 'content-egg'),
22
+ 'callback' => array($this, 'render_input'),
23
+ 'default' => '',
24
+ 'validator' => array(
25
+ 'trim',
26
+ array(
27
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'required'),
28
+ 'when' => 'is_active',
29
+ 'message' => __('Поле "API Key" не может быть пустым.', 'content-egg'),
30
+ ),
31
+ ),
32
+ 'section' => 'default',
33
+ ),
34
+ 'entries_per_page' => array(
35
+ 'title' => __('Результатов', 'content-egg'),
36
+ 'description' => __('Количество результатов для одного запроса', 'content-egg'),
37
+ 'callback' => array($this, 'render_input'),
38
+ 'default' => 3,
39
+ 'validator' => array(
40
+ 'trim',
41
+ 'absint',
42
+ array(
43
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'less_than_equal_to'),
44
+ 'arg' => 10,
45
+ 'message' => __('Поле "Результатов" не может быть больше 10.', 'content-egg'),
46
+ ),
47
+ ),
48
+ 'section' => 'default',
49
+ ),
50
+ 'save_img' => array(
51
+ 'title' => __('Сохранять картинки', 'content-egg'),
52
+ 'description' => __('Сохранять картинки на сервер', 'content-egg'),
53
+ 'callback' => array($this, 'render_checkbox'),
54
+ 'default' => false,
55
+ 'section' => 'default',
56
+ ),
57
+ 'description_size' => array(
58
+ 'title' => __('Обрезать описание', 'content-egg'),
59
+ 'description' => __('Размер описания в символах (0 - не обрезать)', 'content-egg'),
60
+ 'callback' => array($this, 'render_input'),
61
+ 'default' => '800',
62
+ 'validator' => array(
63
+ 'trim',
64
+ 'absint',
65
+ ),
66
+ 'section' => 'default',
67
+ ),
68
+ );
69
+ return array_merge(parent::options(), $optiosn);
70
+ }
71
+
72
+ }
application/modules/Freebase/FreebaseModule.php ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Freebase;
4
+
5
+ use ContentEgg\application\components\ParserModule;
6
+ use ContentEgg\application\libs\google\FreebaseRest;
7
+ use ContentEgg\application\components\Content;
8
+ use ContentEgg\application\helpers\TextHelper;
9
+ use ContentEgg\application\admin\PluginAdmin;
10
+ use ContentEgg\application\admin\GeneralConfig;
11
+
12
+ /**
13
+ * FreebaseModule class file
14
+ *
15
+ * @author keywordrush.com <support@keywordrush.com>
16
+ * @link http://www.keywordrush.com/
17
+ * @copyright Copyright &copy; 2015 keywordrush.com
18
+ */
19
+ class FreebaseModule extends ParserModule {
20
+
21
+ const MAX_IMG_WIDTH = 300;
22
+ const MAX_IMG_HEIGHT = 300;
23
+
24
+ public function info()
25
+ {
26
+ return array(
27
+ 'name' => 'Freebase',
28
+ 'api_agreement' => 'https://developers.google.com/freebase/terms',
29
+ );
30
+ }
31
+
32
+ public function isFree()
33
+ {
34
+ return true;
35
+ }
36
+
37
+ public function doRequest($keyword, $query_params = array(), $is_autoupdate = false)
38
+ {
39
+ $params = array();
40
+ /**
41
+ * For a list of all currently supported language codes, visit the following:
42
+ * @link: https://www.googleapis.com/freebase/v1/search?help=langs&indent=true
43
+ */
44
+ $params['lang'] = GeneralConfig::getInstance()->option('lang');
45
+ $params['limit'] = $this->config('entries_per_page');
46
+
47
+ try
48
+ {
49
+ $client = new FreebaseRest($this->config('api_key'));
50
+ $results = $client->fullSearch($keyword, $params, 'commons');
51
+ } catch (Exception $e)
52
+ {
53
+ throw new \Exception(strip_tags($e->getMessage()));
54
+ }
55
+
56
+ if (!$results || !is_array($results))
57
+ return array();
58
+
59
+ $data = array();
60
+ foreach ($results as $key => $result)
61
+ {
62
+ $result = $result['property'];
63
+ $content = new Content;
64
+
65
+ $content->unique_id = $result['/type/object/mid']['values'][0]['value'];
66
+ $content->title = self::getLeaf($result, '/type/object/name');
67
+ if ($description = self::getLeaf($result, '/common/topic/description'))
68
+ $content->description = nl2br($description);
69
+ elseif ($description = self::getLeaf($result, '/common/document/text'))
70
+ $content->description = nl2br($description);
71
+ else
72
+ continue;
73
+
74
+ if ($max_size = $this->config('description_size'))
75
+ $content->description = TextHelper::truncate($content->description, $max_size);
76
+
77
+ if (!empty($result['/common/topic/description']['values'][0]['citation']['uri']))
78
+ $content->url = strip_tags($result['/common/topic/description']['values'][0]['citation']['uri']);
79
+ if (!empty($result['/common/topic/image']))
80
+ {
81
+ $content->img = 'https://usercontent.googleapis.com/freebase/v1/image';
82
+ $content->img .= strip_tags($result['/common/topic/image']['values'][0]['id']) .
83
+ '?maxwidth=' . self::MAX_IMG_WIDTH . '&maxheight=' . self::MAX_IMG_HEIGHT;
84
+ }
85
+ $content->extra = self::fillExtra($result);
86
+ $data[] = $content;
87
+ }
88
+
89
+
90
+ return $data;
91
+ }
92
+
93
+ static private function fillExtra($result)
94
+ {
95
+ $extra = new ExtraDataFreebase;
96
+
97
+ $extra->freebaseId = self::getLeaf($result, '/type/object/mid');
98
+ $extra->dateOfBirth = self::getLeaf($result, '/people/person/date_of_birth');
99
+ $extra->officialWebsite = self::getLeaf($result, '/common/topic/official_website', 'array');
100
+ $extra->equivalentWebpage = self::getLeaf($result, '/common/topic/topic_equivalent_webpage', 'array');
101
+ $extra->topicalWebpage = self::getLeaf($result, '/common/topic/topical_webpage', 'array');
102
+ $extra->notableFor = self::getLeaf($result, '/common/topic/notable_for', 'array');
103
+ $extra->notableTypes = self::getLeaf($result, '/common/topic/notable_types', 'array');
104
+ $extra->awardNominations = self::getLeaf($result, '/award/award_nominee/award_nominations', 'array');
105
+ $extra->artistTrack = self::getLeaf($result, '/music/artist/track', 'array');
106
+
107
+ if (isset($result['/common/topic/article']) && isset($result['/common/topic/article']['values'][0]['property']['/common/document/text']))
108
+ {
109
+ $extra->article = $result['/common/topic/article']['values'][0]['property']['/common/document/text']['values'][0]['value'];
110
+ $extra->article = strip_tags($extra->article);
111
+ $extra->article = nl2br(trim($extra->article));
112
+ }
113
+ if (isset($result['/common/topic/image']))
114
+ {
115
+ foreach ($result['/common/topic/image']['values'] as $img)
116
+ {
117
+ $extra->gallery[] = 'https://usercontent.googleapis.com/freebase/v1/image' . $img['id'] .
118
+ '?maxwidth=' . self::MAX_IMG_WIDTH . '&maxheight=' . self::MAX_IMG_HEIGHT;
119
+ }
120
+ }
121
+
122
+ return $extra;
123
+ }
124
+
125
+ static private function getLeaf($data, $index, $type = 'scalar')
126
+ {
127
+ if (empty($data[$index]) || empty($data[$index]['values']))
128
+ {
129
+ if ($type == 'array')
130
+ return array();
131
+ else
132
+ return '';
133
+ }
134
+
135
+ if ($type == 'scalar')
136
+ {
137
+ if (isset($data[$index]['values'][0]['value']))
138
+ return strip_tags($data[$index]['values'][0]['value']);
139
+ elseif (isset($data[$index]['values'][0]['text']))
140
+ return strip_tags($data[$index]['values'][0]['text']);
141
+ else
142
+ return '';
143
+ } elseif ($type == 'array')
144
+ {
145
+ $result = array();
146
+ foreach ($data[$index]['values'] as $d)
147
+ {
148
+ if (isset($d['text']))
149
+ $result[] = strip_tags($d['text']);
150
+ elseif (isset($d['value']))
151
+ $result[] = strip_tags($d['value']);
152
+ }
153
+ return $result;
154
+ }
155
+ return '';
156
+ }
157
+
158
+ public function renderResults()
159
+ {
160
+ PluginAdmin::render('_metabox_results', array('module_id' => $this->getId()));
161
+ }
162
+
163
+ public function renderSearchResults()
164
+ {
165
+ PluginAdmin::render('_metabox_search_results', array('module_id' => $this->getId()));
166
+ }
167
+
168
+ }
application/modules/Freebase/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/modules/Freebase/templates/data_simple.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Simple
4
+ */
5
+ __('Simple', 'content-egg-tpl');
6
+ ?>
7
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
8
+
9
+ <div class="egg-container">
10
+ <?php if ($title): ?>
11
+ <h3><?php echo esc_html($title); ?></h3>
12
+ <?php endif; ?>
13
+
14
+ <?php foreach ($items as $item): ?>
15
+ <div class="media">
16
+ <?php if ($item['img']): ?>
17
+ <div class="media-left">
18
+ <img style="max-width: 225px;" class="media-object img-thumbnail" src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['title']); ?>" />
19
+ </div>
20
+ <?php endif; ?>
21
+ <div class="media-body">
22
+ <h4 class="media-heading"><?php echo esc_html($item['title']); ?></h4>
23
+ <p>
24
+ <?php echo $item['description']; ?>
25
+ </p>
26
+ <div class="small text-muted">
27
+ <?php _e('Source:', 'content-egg-tpl'); ?>
28
+ <a href="http://www.freebase.com/" target="_blank" rel="nofollow">Freebase</a>
29
+ <?php if (!empty($item['url'])): ?>
30
+ ,<a href="http://wikipedia.org/" target="_blank" rel="nofollow">Wikipedia</a>
31
+ <?php endif; ?>.
32
+ </div>
33
+ </div>
34
+ </div>
35
+
36
+ <?php endforeach; ?>
37
+ </div>
application/modules/GoogleImages/ExtraDataGoogleImages.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\GoogleImages;
4
+
5
+ use ContentEgg\application\components\ExtraData;
6
+
7
+ /**
8
+ * ExtraDataGoogleImages class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class ExtraDataGoogleImages extends ExtraData {
15
+
16
+ }
application/modules/GoogleImages/GoogleImagesConfig.php ADDED
@@ -0,0 +1,155 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\GoogleImages;
4
+
5
+ use ContentEgg\application\components\ParserModuleConfig;
6
+
7
+ /**
8
+ * GoogleImagesConfig class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class GoogleImagesConfig extends ParserModuleConfig {
15
+
16
+ public function options()
17
+ {
18
+ $optiosn = array(
19
+ 'license' => array(
20
+ 'title' => __('Тип лицензии', 'content-egg'),
21
+ 'description' => __('Поиск изображений, которые можно использовать. Подробнее <a href="https://support.google.com/websearch/answer/29508">здесь</a>.', 'content-egg'),
22
+ 'callback' => array($this, 'render_dropdown'),
23
+ 'dropdown_options' => array(
24
+ '' => __('Любая лицензия', 'content-egg'),
25
+ '(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial|cc_nonderived)' => __('Любая Сreative Сommons', 'content-egg'),
26
+ '(cc_publicdomain|cc_attribute|cc_sharealike|cc_nonderived).-(cc_noncommercial)' => __('Разрешено коммерческое использование', 'content-egg'),
27
+ '(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial).-(cc_nonderived)' => __('Разрешено изменение', 'content-egg'),
28
+ '(cc_publicdomain|cc_attribute|cc_sharealike).-(cc_noncommercial|cc_nonderived)' => __('Коммерческое использование и изменение', 'content-egg'),
29
+ ),
30
+ 'default' => '',
31
+ 'section' => 'default',
32
+ ),
33
+ 'entries_per_page' => array(
34
+ 'title' => __('Результатов', 'content-egg'),
35
+ 'description' => __('Количество результатов для одного запроса. Не может быть больше 8.', 'content-egg'),
36
+ 'callback' => array($this, 'render_input'),
37
+ 'default' => '8',
38
+ 'validator' => array(
39
+ 'trim',
40
+ 'absint',
41
+ array(
42
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'less_than_equal_to'),
43
+ 'arg' => 8,
44
+ 'message' => __('Поле "Результатов" не может быть больше 8.', 'content-egg'),
45
+ ),
46
+ ),
47
+ 'section' => 'default',
48
+ ),
49
+ 'imgc' => array(
50
+ 'title' => __('Цвет', 'content-egg'),
51
+ 'description' => '',
52
+ 'callback' => array($this, 'render_dropdown'),
53
+ 'dropdown_options' => array(
54
+ '' => __('Любого цвета', 'content-egg'),
55
+ 'gray' => __('Черно-белые', 'content-egg'),
56
+ 'color' => __('Цветные', 'content-egg'),
57
+ ),
58
+ 'default' => '',
59
+ 'section' => 'default',
60
+ ),
61
+ 'imgcolor' => array(
62
+ 'title' => __('Преобладание цвета', 'content-egg'),
63
+ 'description' => '',
64
+ 'callback' => array($this, 'render_dropdown'),
65
+ 'dropdown_options' => array(
66
+ '' => __('Любой цвет', 'content-egg'),
67
+ 'black' => __('Черный', 'content-egg'),
68
+ 'blue' => __('Синий', 'content-egg'),
69
+ 'brown' => __('Коричневый', 'content-egg'),
70
+ 'gray' => __('Серый', 'content-egg'),
71
+ 'green' => __('Зеленый', 'content-egg'),
72
+ 'orange' => __('Оранжевый', 'content-egg'),
73
+ 'pink' => __('Розовый', 'content-egg'),
74
+ 'purple' => __('Фиолетовый', 'content-egg'),
75
+ 'red' => __('Красный', 'content-egg'),
76
+ 'teal' => __('Бирюзовый', 'content-egg'),
77
+ 'white' => __('Белый', 'content-egg'),
78
+ 'yellow' => __('Желтый', 'content-egg'),
79
+ ),
80
+ 'default' => '',
81
+ 'section' => 'default',
82
+ ),
83
+ 'imgsz' => array(
84
+ 'title' => __('Размер', 'content-egg'),
85
+ 'description' => '',
86
+ 'callback' => array($this, 'render_dropdown'),
87
+ 'dropdown_options' => array(
88
+ '' => __('Любого размера', 'content-egg'),
89
+ 'icon' => __('Маленькие', 'content-egg'),
90
+ 'small|medium|large|xlarge' => __('Средние', 'content-egg'),
91
+ 'xxlarge' => __('Большие', 'content-egg'),
92
+ 'huge' => __('Огромные', 'content-egg'),
93
+ ),
94
+ 'default' => '',
95
+ 'section' => 'default',
96
+ ),
97
+ 'imgtype' => array(
98
+ 'title' => __('Тип', 'content-egg'),
99
+ 'description' => '',
100
+ 'callback' => array($this, 'render_dropdown'),
101
+ 'dropdown_options' => array(
102
+ '' => __('Любого размера', 'content-egg'),
103
+ 'face' => __('Лица', 'content-egg'),
104
+ 'photo' => __('Фотографии', 'content-egg'),
105
+ 'clipart' => __('Клип-арт', 'content-egg'),
106
+ 'lineart' => __('Ч/б рисунки', 'content-egg'),
107
+ ),
108
+ 'default' => '',
109
+ 'section' => 'default',
110
+ ),
111
+ 'safe' => array(
112
+ 'title' => __('Безопасный поиск', 'content-egg'),
113
+ 'description' => '',
114
+ 'callback' => array($this, 'render_dropdown'),
115
+ 'dropdown_options' => array(
116
+ 'active' => __('Включен', 'content-egg'),
117
+ 'moderate' => __('Модерация', 'content-egg'),
118
+ 'off' => __('Отключен', 'content-egg'),
119
+ ),
120
+ 'default' => 'moderate',
121
+ 'section' => 'default',
122
+ ),
123
+ 'save_img' => array(
124
+ 'title' => __('Сохранять картинки', 'content-egg'),
125
+ 'description' => __('Сохранять картинки на сервер', 'content-egg'),
126
+ 'callback' => array($this, 'render_checkbox'),
127
+ 'default' => false,
128
+ 'section' => 'default',
129
+ ),
130
+ 'description_size' => array(
131
+ 'title' => __('Обрезать описание', 'content-egg'),
132
+ 'description' => __('Размер описания в символах (0 - не обрезать)', 'content-egg'),
133
+ 'callback' => array($this, 'render_input'),
134
+ 'default' => '220',
135
+ 'validator' => array(
136
+ 'trim',
137
+ 'absint',
138
+ ),
139
+ 'section' => 'default',
140
+ ),
141
+ 'as_sitesearch' => array(
142
+ 'title' => 'Поиск по сайту',
143
+ 'description' => __('Ограничить поиск только этим доменом. Например, задайте: photobucket.com', 'content-egg'),
144
+ 'callback' => array($this, 'render_input'),
145
+ 'default' => '',
146
+ 'validator' => array(
147
+ 'trim',
148
+ ),
149
+ 'section' => 'default',
150
+ ),
151
+ );
152
+ return array_merge(parent::options(), $optiosn);
153
+ }
154
+
155
+ }
application/modules/GoogleImages/GoogleImagesModule.php ADDED
@@ -0,0 +1,119 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\GoogleImages;
4
+
5
+ use ContentEgg\application\components\ParserModule;
6
+ use ContentEgg\application\libs\google\ImagesSearch;
7
+ use ContentEgg\application\components\Content;
8
+ use ContentEgg\application\helpers\TextHelper;
9
+ use ContentEgg\application\admin\PluginAdmin;
10
+ use ContentEgg\application\admin\GeneralConfig;
11
+
12
+ /**
13
+ * GoogleImagesModule class file
14
+ *
15
+ * @author keywordrush.com <support@keywordrush.com>
16
+ * @link http://www.keywordrush.com/
17
+ * @copyright Copyright &copy; 2015 keywordrush.com
18
+ */
19
+ class GoogleImagesModule extends ParserModule {
20
+
21
+ public function info()
22
+ {
23
+ return array(
24
+ 'name' => 'Google Images',
25
+ 'api_agreement' => 'https://developers.google.com/image-search/terms',
26
+ );
27
+ }
28
+
29
+ public function defaultTemplateName()
30
+ {
31
+ return 'data_image';
32
+ }
33
+
34
+ public function isFree()
35
+ {
36
+ return true;
37
+ }
38
+
39
+ public function doRequest($keyword, $query_params = array(), $is_autoupdate = false)
40
+ {
41
+ $options = array();
42
+
43
+ if (isset($query_params['license']))
44
+ $options['as_rights'] = $query_params['license'];
45
+ elseif ($this->config('license'))
46
+ $options['as_rights'] = $this->config('license');
47
+
48
+ if (isset($query_params['imgsz']))
49
+ $options['imgsz'] = $query_params['imgsz'];
50
+ elseif ($this->config('imgsz'))
51
+ $options['imgsz'] = $this->config('imgsz');
52
+
53
+ $options['rsz'] = $this->config('entries_per_page');
54
+
55
+ $options['hl'] = GeneralConfig::getInstance()->option('lang');
56
+ if (!empty($_SERVER['REMOTE_ADDR']))
57
+ $options['userip'] = $_SERVER['REMOTE_ADDR'];
58
+
59
+ $options_list = array('as_sitesearch', 'imgc', 'imgcolor', 'imgtype', 'safe', 'as_sitesearch');
60
+ foreach ($options_list as $o)
61
+ {
62
+ if ($this->config($o))
63
+ $options[$o] = $this->config($o);
64
+ }
65
+ try
66
+ {
67
+ $api_client = new ImagesSearch();
68
+ $results = $api_client->search($keyword, $options);
69
+ } catch (Exception $e)
70
+ {
71
+ throw new \Exception(strip_tags($e->getMessage()));
72
+ }
73
+
74
+ if (empty($results['responseData']) || empty($results['responseData']['results']))
75
+ return array();
76
+
77
+ return $this->prepareResults($results['responseData']['results']);
78
+ }
79
+
80
+ private function prepareResults($results)
81
+ {
82
+ $data = array();
83
+ foreach ($results as $key => $r)
84
+ {
85
+ $content = new Content;
86
+
87
+ $content->unique_id = $r['imageId'];
88
+ $content->title = $r['titleNoFormatting'];
89
+ $content->description = trim($r['contentNoFormatting']);
90
+ if ($max_size = $this->config('description_size'))
91
+ $content->description = TextHelper::truncate($content->description, $max_size);
92
+
93
+ $content->img = $r['url'];
94
+ $content->url = $r['originalContextUrl'];
95
+
96
+ $extra = new ExtraDataGoogleImages;
97
+ $extra->source = $r['visibleUrl'];
98
+ $content->extra = $extra;
99
+ $data[] = $content;
100
+ }
101
+ return $data;
102
+ }
103
+
104
+ public function renderResults()
105
+ {
106
+ PluginAdmin::render('_metabox_results', array('module_id' => $this->getId()));
107
+ }
108
+
109
+ public function renderSearchResults()
110
+ {
111
+ PluginAdmin::render('_metabox_search_results_images', array('module_id' => $this->getId()));
112
+ }
113
+
114
+ public function renderSearchPanel()
115
+ {
116
+ $this->render('search_panel', array('module_id' => $this->getId()));
117
+ }
118
+
119
+ }
application/modules/GoogleImages/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/modules/GoogleImages/js/module.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ contentEgg.filter('normalizeFlickr', function() {
2
+ return function(input) {
3
+ var pattern = RegExp(/_\w{1}\.jpg$/);
4
+ return input.replace(pattern, '_m.jpg');
5
+ }
6
+ });
application/modules/GoogleImages/templates/data_image.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Image
4
+ */
5
+ __('Image', 'content-egg-tpl');
6
+ ?>
7
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
8
+
9
+ <div class="egg-container">
10
+ <?php if ($title): ?>
11
+ <h3><?php echo esc_html($title); ?></h3>
12
+ <?php endif; ?>
13
+ <div class="row">
14
+ <?php foreach ($items as $item): ?>
15
+ <div class="col-md-12" style="padding-bottom: 20px;">
16
+ <img src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['keyword']); ?>" class="img-thumbnail" />
17
+ </div>
18
+ <?php endforeach; ?>
19
+ </div>
20
+ </div>
application/modules/GoogleImages/templates/data_justified_gallery.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Name: Gallery
4
+ *
5
+ * @link: http://miromannino.github.io/Justified-Gallery/
6
+ */
7
+ __('Gallery', 'content-egg-tpl');
8
+ ?>
9
+
10
+ <?php wp_enqueue_style('egg-justified-gallery', ContentEgg\PLUGIN_RES . '/justified_gallery/justifiedGallery.min.css'); ?>
11
+ <?php wp_enqueue_script('egg-justified-gallery', ContentEgg\PLUGIN_RES . '/justified_gallery/jquery.justifiedGallery.min.js'); ?>
12
+ <?php wp_enqueue_style('egg-color-box', ContentEgg\PLUGIN_RES . '/colorbox/colorbox.css'); ?>
13
+ <?php wp_enqueue_script('egg-color-box', ContentEgg\PLUGIN_RES . '/colorbox/jquery.colorbox-min.js'); ?>
14
+
15
+ <?php
16
+ $rand = rand(0, 100000);
17
+ ?>
18
+
19
+ <?php if ($title): ?>
20
+ <h3><?php echo esc_html($title); ?></h3>
21
+ <?php endif; ?>
22
+
23
+ <div class="cegg-flickr-gallery">
24
+ <?php foreach ($items as $item): ?>
25
+ <a href="<?php echo $item['img']; ?>" rel="gallery<?php echo $rand; ?>">
26
+ <img src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['title']); ?>" class="img-thumbnail" />
27
+ </a>
28
+ <?php endforeach; ?>
29
+ </div>
30
+ <script>
31
+ jQuery(document).ready(function() {
32
+
33
+ jQuery('.cegg-flickr-gallery').justifiedGallery({
34
+ rowHeight: 160,
35
+ lastRow: 'nojustify',
36
+ margins: 1,
37
+ }).on('jg.complete', function() {
38
+ jQuery(this).find('a').colorbox({
39
+ maxWidth: '80%',
40
+ maxHeight: '80%',
41
+ opacity: 0.8,
42
+ transition: 'elastic',
43
+ current: ''
44
+ });
45
+ });
46
+ });
47
+ </script>
application/modules/GoogleImages/templates/data_simple.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Simple
4
+ */
5
+ __('Simple', 'content-egg-tpl');
6
+ ?>
7
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
8
+
9
+
10
+ <div class="egg-container">
11
+ <?php if ($title): ?>
12
+ <h3><?php echo esc_html($title); ?></h3>
13
+ <?php endif; ?>
14
+
15
+ <div class="row">
16
+ <?php foreach ($items as $item): ?>
17
+ <div class="col-md-12" style="padding-bottom: 20px;">
18
+ <img src="<?php echo $item['img']; ?>" alt="<?php echo esc_attr($item['keyword']); ?>" class="img-thumbnail" />
19
+ <div class="text-center">
20
+ <p class="small"><?php printf(__('Source: %s', 'content-egg'), esc_attr($item['extra']['source'])); ?></p>
21
+ <h4><?php echo esc_html($item['title']); ?></h4>
22
+ <p><?php echo $item['description']; ?></p>
23
+ </div>
24
+ </div>
25
+ <?php endforeach; ?>
26
+ </div>
27
+ </div>
application/modules/GoogleImages/views/search_panel.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <select ng-model="query_params.<?php echo $module_id; ?>.license">
2
+ <option value=""><?php _e('Любая лицензия', 'content-egg'); ?></option>
3
+ <option value="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial|cc_nonderived)"><?php _e('Любая Сreative Сommons', 'content-egg'); ?></option>
4
+ <option value="(cc_publicdomain|cc_attribute|cc_sharealike|cc_nonderived).-(cc_noncommercial)"><?php _e('Разрешено коммерческое использование', 'content-egg'); ?></option>
5
+ <option value="(cc_publicdomain|cc_attribute|cc_sharealike|cc_noncommercial).-(cc_nonderived)"><?php _e('Разрешено изменение', 'content-egg'); ?></option>
6
+ <option value="(cc_publicdomain|cc_attribute|cc_sharealike).-(cc_noncommercial|cc_nonderived)"><?php _e('Коммерческое использование и изменение', 'content-egg'); ?></option>
7
+ </select>
8
+
9
+
10
+ <select ng-model="query_params.<?php echo $module_id; ?>.imgsz">
11
+ <option value=""><?php _e('Любого размера', 'content-egg'); ?></option>
12
+ <option value="icon"><?php _e('Маленькие', 'content-egg'); ?></option>
13
+ <option value="small|medium|large|xlarge"><?php _e('Средние', 'content-egg'); ?></option>
14
+ <option value="xxlarge"><?php _e('Большие', 'content-egg'); ?></option>
15
+ <option value="huge"><?php _e('Огромные', 'content-egg'); ?></option>
16
+ </select>
application/modules/Youtube/ExtraDataYoutube.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Youtube;
4
+
5
+ use ContentEgg\application\components\ExtraData;
6
+
7
+ /**
8
+ * ExtraDataYoutube class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class ExtraDataYouTube extends ExtraData {
15
+
16
+ public $guid;
17
+ public $category;
18
+ public $channel_title;
19
+ }
application/modules/Youtube/YoutubeConfig.php ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Youtube;
4
+
5
+ use ContentEgg\application\components\ParserModuleConfig;
6
+
7
+ /**
8
+ * YoutubeConfig class file
9
+ *
10
+ * @author keywordrush.com <support@keywordrush.com>
11
+ * @link http://www.keywordrush.com/
12
+ * @copyright Copyright &copy; 2015 keywordrush.com
13
+ */
14
+ class YoutubeConfig extends ParserModuleConfig {
15
+
16
+ public function options()
17
+ {
18
+ $optiosn = array(
19
+ 'api_key' => array(
20
+ 'title' => 'API Key <span class="cegg_required">*</span>',
21
+ 'description' => __('Ключ для доступа к API. Получить можно в Google <a href="http://code.google.com/apis/console">API консоли</a>', 'content-egg'),
22
+ 'callback' => array($this, 'render_input'),
23
+ 'default' => '',
24
+ 'validator' => array(
25
+ 'trim',
26
+ array(
27
+ 'call' => array('\ContentEgg\application\helpers\FormValidator', 'required'),
28
+ 'when' => 'is_active',
29
+ 'message' => __('Поле "API Key" не может быть пустым.', 'content-egg'),
30
+ ),
31
+ ),
32
+ 'section' => 'default',
33
+ ),
34
+ 'entries_per_page' => array(
35
+ 'title' => __('Результатов', 'content-egg'),
36
+ 'description' => __('Количество результатов для одного запроса', 'content-egg'),
37
+ 'callback' => array($this, 'render_input'),
38
+ 'default' => '5',
39
+ 'validator' => array(
40
+ 'trim',
41
+ 'absint',
42
+ ),
43
+ 'section' => 'default',
44
+ ),
45
+ 'order' => array(
46
+ 'title' => __('Сортировка', 'content-egg'),
47
+ 'description' => '',
48
+ 'callback' => array($this, 'render_dropdown'),
49
+ 'dropdown_options' => array(
50
+ 'date' => __('Дата', 'content-egg'),
51
+ 'rating' => __('Рейтинг', 'content-egg'),
52
+ 'relevance' => __('Релевантность', 'content-egg'),
53
+ 'title' => __('Заголовок', 'content-egg'),
54
+ 'viewCount' => __('Просмотры', 'content-egg'),
55
+ ),
56
+ 'default' => 'relevance',
57
+ 'section' => 'default',
58
+ ),
59
+ 'license' => array(
60
+ 'title' => __('Тип лицензии', 'content-egg'),
61
+ 'description' => __('Многие видео на Youtube загружены с лицензией Creative Commons. <a href="http://www.google.com/support/youtube/bin/answer.py?answer=1284989">Узнать больше</a>.', 'content-egg'),
62
+ 'callback' => array($this, 'render_dropdown'),
63
+ 'dropdown_options' => array(
64
+ 'any' => __('Любая лицензия', 'content-egg'),
65
+ 'creativeCommon' => __('Сreative Сommons лицензия', 'content-egg'),
66
+ 'youtube' => __('Стандартная лицензия', 'content-egg'),
67
+ ),
68
+ 'default' => 'any',
69
+ 'section' => 'default',
70
+ ),
71
+ 'description_size' => array(
72
+ 'title' => __('Обрезать описание', 'content-egg'),
73
+ 'description' => __('Размер описания в символах (0 - не обрезать)', 'content-egg'),
74
+ 'callback' => array($this, 'render_input'),
75
+ 'default' => '280',
76
+ 'validator' => array(
77
+ 'trim',
78
+ 'absint',
79
+ ),
80
+ 'section' => 'default',
81
+ ),
82
+ );
83
+ $parent = parent::options();
84
+ unset($parent['featured_image']);
85
+ return array_merge($parent, $optiosn);
86
+ }
87
+
88
+ }
application/modules/Youtube/YoutubeModule.php ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg\application\modules\Youtube;
4
+
5
+ use ContentEgg\application\components\ParserModule;
6
+ use ContentEgg\application\libs\google\YouTubeSearch;
7
+ use ContentEgg\application\components\Content;
8
+ use ContentEgg\application\helpers\TextHelper;
9
+ use ContentEgg\application\admin\PluginAdmin;
10
+ use ContentEgg\application\admin\GeneralConfig;
11
+
12
+ /**
13
+ * YoutubeModule class file
14
+ *
15
+ * @author keywordrush.com <support@keywordrush.com>
16
+ * @link http://www.keywordrush.com/
17
+ * @copyright Copyright &copy; 2015 keywordrush.com
18
+ */
19
+ class YoutubeModule extends ParserModule {
20
+
21
+ public function info()
22
+ {
23
+ return array(
24
+ 'name' => 'Youtube',
25
+ 'api_agreement' => 'http://code.google.com/apis/youtube/terms.html',
26
+ );
27
+ }
28
+
29
+ public function isFree()
30
+ {
31
+ return true;
32
+ }
33
+
34
+ public function doRequest($keyword, $query_params = array(), $is_autoupdate = false)
35
+ {
36
+
37
+ $params = array();
38
+ $params['relevanceLanguage'] = GeneralConfig::getInstance()->option('lang');
39
+ $params['maxResults'] = $this->config('entries_per_page');
40
+ $params['key'] = $this->config('api_key');
41
+
42
+ if (!empty($query_params['order']))
43
+ $params['order'] = $query_params['order'];
44
+ else
45
+ $params['order'] = $this->config('order');
46
+
47
+ if (!empty($query_params['license']))
48
+ $params['videoLicense'] = $query_params['license'];
49
+ else
50
+ $params['videoLicense'] = $this->config('license');
51
+
52
+ try
53
+ {
54
+ //$keyword = str_replace('-', ' ', $keyword);
55
+ $client = new YouTubeSearch('json');
56
+ $data = $client->search($keyword, $params);
57
+ unset($client);
58
+ } catch (Exception $e)
59
+ {
60
+ throw new \Exception(strip_tags($e->getMessage()));
61
+ }
62
+
63
+ if (!isset($data['items']) || !isset($data['items'][0]))
64
+ $data['items'] = array();
65
+
66
+ $results = array();
67
+ foreach ($data['items'] as $r)
68
+ {
69
+ if (!isset($r['id']['videoId']))
70
+ continue;
71
+
72
+ $guid = $r['id']['videoId'];
73
+
74
+ $content = new Content;
75
+ $content->unique_id = $guid;
76
+ $content->title = strip_tags($r['snippet']['title']);
77
+ $content->img = isset($r['snippet']['thumbnails']) ? $r['snippet']['thumbnails']['medium']['url'] : '';
78
+
79
+ if (isset($r['snippet']['description']) && !is_array($r['snippet']['description']))
80
+ {
81
+ $content->description = strip_tags($r['snippet']['description']);
82
+ if ($max_size = $this->config('description_size'))
83
+ $content->description = TextHelper::truncate($content->description, $max_size);
84
+ } else
85
+ $content->description = '';
86
+ $content->url = 'https://www.youtube.com/watch?v=' . $r['id']['videoId'];
87
+
88
+ $extra = new ExtraDataYoutube;
89
+ $extra->author = strip_tags($r['snippet']['channelTitle']);
90
+ $extra->date = strtotime($r['snippet']['publishedAt']);
91
+ $extra->guid = $guid;
92
+ $extra->category = isset($r['snippet']['category'][1]) ? $r['snippet']['category'][1] : '';
93
+ $extra->channel_title = isset($r['snippet']['channelTitle']) ? $r['snippet']['channelTitle'] : '';
94
+
95
+ $content->extra = $extra;
96
+ $results[] = $content;
97
+ }
98
+ return $results;
99
+ }
100
+
101
+ public function enqueueScripts()
102
+ {
103
+ \wp_enqueue_script('cegg-youtube', \plugins_url('application/modules/Youtube/js/module.js', \ContentEgg\PLUGIN_FILE), array('contentegg-metabox-app'), null, false);
104
+ }
105
+
106
+ public function renderResults()
107
+ {
108
+ PluginAdmin::render('_metabox_results', array('module_id' => $this->getId()));
109
+ }
110
+
111
+ public function renderSearchResults()
112
+ {
113
+ //PluginAdmin::render('_metabox_search_results_images', array('module_id' => $this->getId()));
114
+ $this->render('search_results', array('module_id' => $this->getId()));
115
+ }
116
+
117
+ public function renderSearchPanel()
118
+ {
119
+ $this->render('search_panel', array('module_id' => $this->getId()));
120
+ }
121
+
122
+ }
application/modules/Youtube/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/modules/Youtube/js/module.js ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * @link: http://blog.oxrud.com/posts/creating-youtube-directive/
3
+ */
4
+
5
+ contentEgg.directive('youtube', function($window) {
6
+ return {
7
+ restrict: "E",
8
+ scope: {
9
+ height: "@",
10
+ width: "@",
11
+ videoid: "@"
12
+ },
13
+ template: '<div></div>',
14
+ link: function(scope, element) {
15
+ var tag = document.createElement('script');
16
+ tag.src = "https://www.youtube.com/iframe_api";
17
+ var firstScriptTag = document.getElementsByTagName('script')[0];
18
+ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);
19
+
20
+ var player;
21
+
22
+ $window.onYouTubeIframeAPIReady = function() {
23
+
24
+ player = new YT.Player(element.children()[0], {
25
+ playerVars: {
26
+ autoplay: 0,
27
+ html5: 1,
28
+ theme: "light",
29
+ modesbranding: 0,
30
+ color: "white",
31
+ iv_load_policy: 3,
32
+ showinfo: 1,
33
+ controls: 1
34
+ },
35
+ height: scope.height,
36
+ width: scope.width,
37
+ videoId: scope.videoid,
38
+ });
39
+ }
40
+
41
+ scope.$watch('videoid', function(newValue, oldValue) {
42
+ if (newValue == oldValue) {
43
+ return;
44
+ }
45
+
46
+ player.cueVideoById(scope.videoid);
47
+
48
+ });
49
+
50
+ scope.$watch('height + width', function(newValue, oldValue) {
51
+ if (newValue == oldValue) {
52
+ return;
53
+ }
54
+
55
+ player.setSize(scope.width, scope.height);
56
+
57
+ });
58
+ }
59
+ };
60
+ });
application/modules/Youtube/templates/data_responsive_embed.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Large
4
+ */
5
+ __('Large', 'content-egg-tpl');
6
+ ?>
7
+
8
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
9
+
10
+ <div class="egg-container">
11
+ <?php if ($title): ?>
12
+ <h3><?php echo esc_html($title); ?></h3>
13
+ <?php endif; ?>
14
+
15
+ <?php foreach ($items as $item): ?>
16
+ <div class="embed-responsive embed-responsive-16by9">
17
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/<?php echo $item['extra']['guid']; ?>" frameborder="0" allowfullscreen></iframe>
18
+ </div>
19
+ <h4><?php echo esc_html($item['title']); ?></h4>
20
+ <?php if ($item['description']): ?>
21
+ <p><?php echo $item['description']; ?></p>
22
+ <?php endif; ?>
23
+ <?php endforeach; ?>
24
+ </div>
application/modules/Youtube/templates/data_simple.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Simple
4
+ */
5
+ __('Simple', 'content-egg-tpl');
6
+ ?>
7
+
8
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
9
+
10
+ <div class="egg-container">
11
+ <?php if ($title): ?>
12
+ <h3><?php echo esc_html($title); ?></h3>
13
+ <?php endif; ?>
14
+
15
+ <?php foreach ($items as $item): ?>
16
+ <div class="row">
17
+ <div class="col-md-12">
18
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/<?php echo $item['extra']['guid']; ?>" frameborder="0" allowfullscreen></iframe>
19
+ <h4><?php echo esc_html($item['title']); ?></h4>
20
+ <?php if ($item['description']):?>
21
+ <p><?php echo $item['description']; ?></p>
22
+ <?php endif; ?>
23
+ </div>
24
+ </div>
25
+ <?php endforeach; ?>
26
+ </div>
application/modules/Youtube/templates/data_tile.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Name: Tile
4
+ */
5
+ __('Tile', 'content-egg-tpl');
6
+ ?>
7
+
8
+ <?php \wp_enqueue_style('egg-bootstrap'); ?>
9
+
10
+ <div class="egg-container">
11
+ <?php if ($title): ?>
12
+ <h3><?php echo esc_html($title); ?></h3>
13
+ <?php endif; ?>
14
+
15
+ <div class="row">
16
+ <?php foreach ($items as $item): ?>
17
+ <div class="col-md-6">
18
+ <div class="embed-responsive embed-responsive-16by9">
19
+ <iframe width="560" height="315" src="https://www.youtube.com/embed/<?php echo $item['extra']['guid']; ?>" frameborder="0" allowfullscreen></iframe>
20
+ </div>
21
+ </div>
22
+ <?php endforeach; ?>
23
+ </div>
24
+ </div>
application/modules/Youtube/views/search_panel.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <select ng-model="query_params.<?php echo $module_id; ?>.license">
2
+ <option value="any"><?php _e('Любая лицензия', 'content-egg'); ?></option>
3
+ <option value="creativeCommon"><?php _e('Сreative Сommons', 'content-egg'); ?></option>
4
+ <option value="youtube"><?php _e('Стандартная лицензия', 'content-egg'); ?></option>
5
+ </select>
6
+
7
+ <select ng-model="query_params.<?php echo $module_id; ?>.order">
8
+ <option value="date"><?php _e('Дата', 'content-egg'); ?></option>
9
+ <option value="rating"><?php _e('Рейтинг', 'content-egg'); ?></option>
10
+ <option value="relevance"><?php _e('Релевантность', 'content-egg'); ?></option>
11
+ <option value="title"><?php _e('Заголовок', 'content-egg'); ?></option>
12
+ <option value="viewCount"><?php _e('Просмотры', 'content-egg'); ?></option>
13
+ </select>
application/modules/Youtube/views/search_results.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <div class="search_results" ng-show="models.<?php echo $module_id; ?>.results.length > 0 && !models.<?php echo $module_id; ?>.processing">
2
+ <div class="row search_results_row" ng-class="{'result_added' : result.added}" ng-click="add(result, '<?php echo $module_id; ?>')" repeat-done ng-repeat="result in models.<?php echo $module_id; ?>.results">
3
+ <div class="col-md-4">
4
+
5
+ <iframe ng-if="!result.added" width="320" height="180" ng-src="{{getYoutubeUri(result.extra.guid)}}" frameborder="0" allowfullscreen></iframe>
6
+ <img width="320" height="180" ng-if="result.added" ng-src="{{result.img}}" />
7
+
8
+ </div>
9
+ <div class="col-md-8">
10
+ <strong>{{result.title}}</strong>
11
+ <p>{{result.description}}</p>
12
+ </div>
13
+ </div>
14
+ </div>
application/modules/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
application/vendor/CVarDumper.php ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ContentEgg\application\vendor;
3
+
4
+ /**
5
+ * CVarDumper class file.
6
+ *
7
+ * @author Qiang Xue <qiang.xue@gmail.com>
8
+ * @link http://www.yiiframework.com/
9
+ * @copyright 2008-2013 Yii Software LLC
10
+ * @license http://www.yiiframework.com/license/
11
+ */
12
+
13
+ /**
14
+ * CVarDumper is intended to replace the buggy PHP function var_dump and print_r.
15
+ * It can correctly identify the recursively referenced objects in a complex
16
+ * object structure. It also has a recursive depth control to avoid indefinite
17
+ * recursive display of some peculiar variables.
18
+ *
19
+ * CVarDumper can be used as follows,
20
+ * <pre>
21
+ * CVarDumper::dump($var);
22
+ * </pre>
23
+ *
24
+ * @author Qiang Xue <qiang.xue@gmail.com>
25
+ * @package system.utils
26
+ * @since 1.0
27
+ */
28
+ class CVarDumper
29
+ {
30
+ private static $_objects;
31
+ private static $_output;
32
+ private static $_depth;
33
+
34
+ /**
35
+ * Displays a variable.
36
+ * This method achieves the similar functionality as var_dump and print_r
37
+ * but is more robust when handling complex objects such as Yii controllers.
38
+ * @param mixed $var variable to be dumped
39
+ * @param integer $depth maximum depth that the dumper should go into the variable. Defaults to 10.
40
+ * @param boolean $highlight whether the result should be syntax-highlighted
41
+ */
42
+ public static function dump($var,$depth=10,$highlight=false)
43
+ {
44
+ echo self::dumpAsString($var,$depth,$highlight);
45
+ }
46
+
47
+ /**
48
+ * Dumps a variable in terms of a string.
49
+ * This method achieves the similar functionality as var_dump and print_r
50
+ * but is more robust when handling complex objects such as Yii controllers.
51
+ * @param mixed $var variable to be dumped
52
+ * @param integer $depth maximum depth that the dumper should go into the variable. Defaults to 10.
53
+ * @param boolean $highlight whether the result should be syntax-highlighted
54
+ * @return string the string representation of the variable
55
+ */
56
+ public static function dumpAsString($var,$depth=10,$highlight=false)
57
+ {
58
+ self::$_output='';
59
+ self::$_objects=array();
60
+ self::$_depth=$depth;
61
+ self::dumpInternal($var,0);
62
+ if($highlight)
63
+ {
64
+ $result=highlight_string("<?php\n".self::$_output,true);
65
+ self::$_output=preg_replace('/&lt;\\?php<br \\/>/','',$result,1);
66
+ }
67
+ return self::$_output;
68
+ }
69
+
70
+ /*
71
+ * @param mixed $var variable to be dumped
72
+ * @param integer $level depth level
73
+ */
74
+ private static function dumpInternal($var,$level)
75
+ {
76
+ switch(gettype($var))
77
+ {
78
+ case 'boolean':
79
+ self::$_output.=$var?'true':'false';
80
+ break;
81
+ case 'integer':
82
+ self::$_output.="$var";
83
+ break;
84
+ case 'double':
85
+ self::$_output.="$var";
86
+ break;
87
+ case 'string':
88
+ self::$_output.="'".addslashes($var)."'";
89
+ break;
90
+ case 'resource':
91
+ self::$_output.='{resource}';
92
+ break;
93
+ case 'NULL':
94
+ self::$_output.="null";
95
+ break;
96
+ case 'unknown type':
97
+ self::$_output.='{unknown}';
98
+ break;
99
+ case 'array':
100
+ if(self::$_depth<=$level)
101
+ self::$_output.='array(...)';
102
+ elseif(empty($var))
103
+ self::$_output.='array()';
104
+ else
105
+ {
106
+ $keys=array_keys($var);
107
+ $spaces=str_repeat(' ',$level*4);
108
+ self::$_output.="array\n".$spaces.'(';
109
+ foreach($keys as $key)
110
+ {
111
+ self::$_output.="\n".$spaces.' ';
112
+ self::dumpInternal($key,0);
113
+ self::$_output.=' => ';
114
+ self::dumpInternal($var[$key],$level+1);
115
+ }
116
+ self::$_output.="\n".$spaces.')';
117
+ }
118
+ break;
119
+ case 'object':
120
+ if(($id=array_search($var,self::$_objects,true))!==false)
121
+ self::$_output.=get_class($var).'#'.($id+1).'(...)';
122
+ elseif(self::$_depth<=$level)
123
+ self::$_output.=get_class($var).'(...)';
124
+ else
125
+ {
126
+ $id=array_push(self::$_objects,$var);
127
+ $className=get_class($var);
128
+ $members=(array)$var;
129
+ $spaces=str_repeat(' ',$level*4);
130
+ self::$_output.="$className#$id\n".$spaces.'(';
131
+ foreach($members as $key=>$value)
132
+ {
133
+ $keyDisplay=strtr(trim($key),array("\0"=>':'));
134
+ self::$_output.="\n".$spaces." [$keyDisplay] => ";
135
+ self::$_output.=self::dumpInternal($value,$level+1);
136
+ }
137
+ self::$_output.="\n".$spaces.')';
138
+ }
139
+ break;
140
+ }
141
+ }
142
+ }
application/vendor/index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
content-egg.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg;
4
+
5
+ /*
6
+ Plugin Name: Content Egg
7
+ Plugin URI: http://www.keywordrush.com/contentegg
8
+ Description: Plugin for adding additional content for your posts. Let you to earn money from affiliate programs.
9
+ Version: 1.6.0
10
+ Author: keywordrush.com
11
+ Author URI: http://www.keywordrush.com
12
+ Text Domain: content-egg
13
+ */
14
+
15
+ /*
16
+ * Copyright (c) www.keywordrush.com (email: support@keywordrush.com)
17
+ */
18
+
19
+ defined('ABSPATH') || die('No direct script access allowed!');
20
+
21
+ define(__NAMESPACE__ . '\NS', __NAMESPACE__ . '\\');
22
+ define(NS . 'PLUGIN_PATH', \plugin_dir_path(__FILE__));
23
+ define(NS . 'PLUGIN_FILE', __FILE__);
24
+ define(NS . 'PLUGIN_RES', \plugins_url('res', __FILE__));
25
+
26
+ require_once PLUGIN_PATH . 'loader.php';
27
+
28
+ \add_action('plugins_loaded', array('\ContentEgg\application\Plugin', 'getInstance'));
29
+ if (\is_admin())
30
+ {
31
+ \register_activation_hook(__FILE__, array(\ContentEgg\application\Installer::getInstance(), 'activate'));
32
+ \register_deactivation_hook(__FILE__, array(\ContentEgg\application\Installer::getInstance(), 'deactivate'));
33
+ \register_uninstall_hook(__FILE__, array('\ContentEgg\application\Installer', 'uninstall'));
34
+ \add_action('init', array('\ContentEgg\application\admin\PluginAdmin', 'getInstance'));
35
+ }
index.php ADDED
@@ -0,0 +1 @@
 
1
+ <?php // Silence is golden.
languages/content-egg-en_US.mo ADDED
Binary file
languages/content-egg-en_US.po ADDED
@@ -0,0 +1,1856 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 Content Egg
2
+ # This file is distributed under the same license as the Content Egg package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Content Egg 1.1.1\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg\n"
7
+ "POT-Creation-Date: 2015-08-27 15:23:21+00:00\n"
8
+ "PO-Revision-Date: 2015-08-27 18:25+0200\n"
9
+ "Last-Translator: Sizam themes <sizamtheme@gmail.com>\n"
10
+ "Language-Team: \n"
11
+ "Language: en_EN\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "X-Generator: Poedit 1.6.5\n"
16
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
17
+
18
+ #: application/Autoupdate.php:79
19
+ msgid "Новая версия"
20
+ msgstr "New version"
21
+
22
+ #: application/Installer.php:76
23
+ msgid ""
24
+ "Вы используете Wordpress %s. <em>%s</em> требует минимум <strong>Wordpress "
25
+ "%s</strong>."
26
+ msgstr ""
27
+ "You are using Wordpress %s. <em>%s</em> requires at least <strong>Wordpress "
28
+ "%s</strong>."
29
+
30
+ #: application/Installer.php:80
31
+ msgid ""
32
+ "На вашем сервере установлен PHP %s. <em>%s</em> требует минимум <strong>PHP "
33
+ "%s</strong>."
34
+ msgstr ""
35
+ "PHP is installed on your server %s. <em>%s</em> requires at least "
36
+ "<strong>PHP %s</strong>."
37
+
38
+ #: application/Installer.php:85
39
+ msgid "Требуется расширение <strong>%s</strong>."
40
+ msgstr "Requires extension <strong>%s</strong>."
41
+
42
+ #: application/Installer.php:91
43
+ msgid "не может быть установлен!"
44
+ msgstr "cannot be installed!"
45
+
46
+ #: application/admin/EggMetabox.php:76
47
+ msgid "Настройте и активируйте модули Content Egg плагин."
48
+ msgstr "Configure and activate modules of Content Egg plugin"
49
+
50
+ #: application/admin/GeneralConfig.php:30 application/admin/PluginAdmin.php:68
51
+ msgid "Настройки"
52
+ msgstr "Settings"
53
+
54
+ #: application/admin/GeneralConfig.php:86
55
+ msgid "Язык сайта"
56
+ msgstr "Website language"
57
+
58
+ #: application/admin/GeneralConfig.php:87
59
+ msgid ""
60
+ "Модули, которые имеют поддержку мультиязычности, будут отдавать предпочтение "
61
+ "контенту на этом языке. Также эта настройка указывает на язык для "
62
+ "локализации шаблонов."
63
+ msgstr ""
64
+ "Modules, which have Multilanguage support, will have priority for this "
65
+ "language. Also, this setting will point on language of output templates"
66
+
67
+ #: application/admin/LicConfig.php:32
68
+ msgid "Лицензия"
69
+ msgstr "License"
70
+
71
+ #: application/admin/LicConfig.php:40
72
+ msgid "Ключ лицензии"
73
+ msgstr "License key"
74
+
75
+ #: application/admin/LicConfig.php:41
76
+ msgid ""
77
+ "Сюда необходимо ввести действующий ключ лицензии. Найти ключ вы можете в "
78
+ "своей <a href=\"http://www.keywordrush.com/panel\">панели пользователя</a>. "
79
+ "Если у вас еще нет ключа, вы можете приобрести его на <a href=\"http://www."
80
+ "keywordrush.com/contentegg\">официальном сайте</a> плагина."
81
+ msgstr ""
82
+ "Here you must enter a valid license key. You can find key in your <a href="
83
+ "\"http://www.keywordrush.com/en/panel\">user panel</a>. If you don't have a "
84
+ "key you can buy it on <a href=\"http://www.keywordrush.com/en/contentegg"
85
+ "\">the official website</a> of the plugin."
86
+
87
+ #: application/admin/LicConfig.php:48
88
+ msgid "Поле \"Ключ лицензии\" не может быть пустым."
89
+ msgstr "The \"License key\" can not be empty"
90
+
91
+ #: application/admin/LicConfig.php:52
92
+ msgid "Неверный ключ лицензии."
93
+ msgstr "Invalid license key"
94
+
95
+ #: application/admin/LicConfig.php:56
96
+ msgid ""
97
+ "Ключ лицензии не принят. Убедитесь, что вы используйте действительный ключ. "
98
+ "Если вы верите, что произошла ошибка, пожалуйста, обратитесь в <a href="
99
+ "\"http://www.keywordrush.com/contact\">поддержку</a> плагина."
100
+ msgstr ""
101
+ "The license key is not accepted. Make sure you use a valid key. If you "
102
+ "believe this is an error, please contact the <a href=\"http://www."
103
+ "keywordrush.com/contact\">support</a> of plugin."
104
+
105
+ #: application/admin/views/_metabox_results.php:9
106
+ #: application/components/ParserModuleConfig.php:46
107
+ #: application/modules/Youtube/YoutubeConfig.php:53
108
+ #: application/modules/Youtube/views/search_panel.php:11
109
+ msgid "Заголовок"
110
+ msgstr "Title"
111
+
112
+ #: application/admin/views/_metabox_results.php:10
113
+ msgid "Описание"
114
+ msgstr "Description"
115
+
116
+ #: application/admin/views/_metabox_results.php:13
117
+ msgid "Перейти"
118
+ msgstr "Go to "
119
+
120
+ #: application/admin/views/_metabox_results.php:14
121
+ msgid "Удалить"
122
+ msgstr "Delete"
123
+
124
+ #: application/admin/views/lic_settings.php:2
125
+ msgid "лицензия"
126
+ msgstr "License"
127
+
128
+ #: application/admin/views/metabox_general.php:8
129
+ msgid "Введите ключевое слово"
130
+ msgstr "Enter a keyword"
131
+
132
+ #: application/admin/views/metabox_general.php:10
133
+ msgid "Найти все"
134
+ msgstr "Find all"
135
+
136
+ #: application/admin/views/metabox_general.php:15
137
+ #: application/admin/views/metabox_module.php:71
138
+ msgid "Добавить все"
139
+ msgstr "Add all"
140
+
141
+ #: application/admin/views/metabox_general.php:16
142
+ msgid "Вы действительно хотите удалить результаты всех модулей?"
143
+ msgstr "Are you sure you want to delete the results of all modules?"
144
+
145
+ #: application/admin/views/metabox_general.php:16
146
+ #: application/admin/views/metabox_module.php:40
147
+ msgid "Удалить все"
148
+ msgstr "Delete all"
149
+
150
+ #: application/admin/views/metabox_module.php:26
151
+ msgid "Шаблон для шорткода"
152
+ msgstr "Output Template for shortcode"
153
+
154
+ #: application/admin/views/metabox_module.php:36
155
+ msgid "Ключевое слово для автоматического обновления данных"
156
+ msgstr "Keyword for the automatic update"
157
+
158
+ #: application/admin/views/metabox_module.php:40
159
+ msgid "Вы действительно хотите удалить все результаты?"
160
+ msgstr "Are you sure you want to delete all results?"
161
+
162
+ #: application/admin/views/metabox_module.php:45
163
+ msgid "Данные не найдены..."
164
+ msgstr "No data found..."
165
+
166
+ #: application/admin/views/metabox_module.php:49
167
+ msgid "Поиск"
168
+ msgstr "Search"
169
+
170
+ #: application/admin/views/metabox_module.php:55
171
+ msgid "Ключевое слово для поиска"
172
+ msgstr "Keyword for search"
173
+
174
+ #: application/admin/views/metabox_module.php:57
175
+ msgid "Найти"
176
+ msgstr "Find"
177
+
178
+ #: application/admin/views/metabox_module.php:79
179
+ msgid "Не найдено..."
180
+ msgstr "Not found..."
181
+
182
+ #: application/admin/views/metabox_module.php:80
183
+ msgid "Ошибка: "
184
+ msgstr "Error:"
185
+
186
+ #: application/admin/views/settings.php:13
187
+ msgid "Content Egg Настройки"
188
+ msgstr "Content Egg Settings"
189
+
190
+ #: application/admin/views/settings.php:24
191
+ #: application/admin/views/settings.php:47
192
+ msgid "Общие настройки"
193
+ msgstr "General settings"
194
+
195
+ #: application/admin/views/settings.php:71
196
+ msgid "Условия"
197
+ msgstr "Conditions"
198
+
199
+ #: application/admin/views/settings.php:95
200
+ msgid "Множество дополнительных модулей и расширенный функционал."
201
+ msgstr "Many additional modules and extended functions."
202
+
203
+ #: application/admin/views/settings.php:97
204
+ msgid "Контент модули:"
205
+ msgstr "Content modules"
206
+
207
+ #: application/admin/views/settings.php:99
208
+ msgid "Bing картинки"
209
+ msgstr "Bing images"
210
+
211
+ #: application/admin/views/settings.php:100
212
+ msgid "Flickr фотографии"
213
+ msgstr "Flickr Photo"
214
+
215
+ #: application/admin/views/settings.php:101
216
+ msgid "Google книги"
217
+ msgstr "Google Books"
218
+
219
+ #: application/admin/views/settings.php:102
220
+ msgid "Google новости"
221
+ msgstr "Google news"
222
+
223
+ #: application/admin/views/settings.php:103
224
+ msgid "Яндекс.Маркет"
225
+ msgstr "Yandex.Market"
226
+
227
+ #: application/admin/views/settings.php:105
228
+ msgid "ВКонтакте новости"
229
+ msgstr "Vkontakte news"
230
+
231
+ #: application/admin/views/settings.php:108
232
+ msgid "Монетизация:"
233
+ msgstr "Monetization:"
234
+
235
+ #: application/admin/views/settings.php:116
236
+ msgid "Узнать больше..."
237
+ msgstr "Read more..."
238
+
239
+ #: application/components/AffiliateParserModuleConfig.php:18
240
+ msgid "Автоматическое обновление"
241
+ msgstr "Automatic update"
242
+
243
+ #: application/components/AffiliateParserModuleConfig.php:19
244
+ msgid ""
245
+ "Время жини кэша в секундах, через которое необходимо обновить товары, если "
246
+ "задано ключевое слово для обновления. 0 - никогда не обновлять."
247
+ msgstr ""
248
+ "Lifetime of cache in seconds, after this period products will be updated if "
249
+ "you set keyword for updating. 0 - never update"
250
+
251
+ #: application/components/AffiliateParserModuleConfig.php:33
252
+ msgid "Обновить товары"
253
+ msgstr "Update products"
254
+
255
+ #: application/components/AffiliateParserModuleConfig.php:34
256
+ msgid ""
257
+ "Время в секундах, через которое необходимо обновить цену, наличие и "
258
+ "некоторую другую информацию по товарам. 0 - никогда не обновлять."
259
+ msgstr ""
260
+ "Time in seconds for updating prices, availability, etc. 0 - never update"
261
+
262
+ #: application/components/ModuleConfig.php:53
263
+ #: application/components/ModuleConfig.php:59
264
+ msgid "настройки"
265
+ msgstr "settings"
266
+
267
+ #: application/components/ModuleTemplateManager.php:81
268
+ msgid "[пользовательский]"
269
+ msgstr "[user]"
270
+
271
+ #: application/components/ParserModuleConfig.php:19
272
+ msgid "Включить модуль"
273
+ msgstr "Switch module"
274
+
275
+ #: application/components/ParserModuleConfig.php:26
276
+ msgid "Добавить"
277
+ msgstr "Add"
278
+
279
+ #: application/components/ParserModuleConfig.php:27
280
+ msgid ""
281
+ "Куда добавить контент этого модуля? Шорткоды работают всегда в независимости "
282
+ "от настройки."
283
+ msgstr ""
284
+ "The place for content of module. Shortcodes will work in any place "
285
+ "regardless of the setting."
286
+
287
+ #: application/components/ParserModuleConfig.php:30
288
+ msgid "В конец поста"
289
+ msgstr "At the end of the post"
290
+
291
+ #: application/components/ParserModuleConfig.php:31
292
+ msgid "В начало поста"
293
+ msgstr "At the beginning of the post"
294
+
295
+ #: application/components/ParserModuleConfig.php:32
296
+ msgid "Только шорткоды"
297
+ msgstr "Shortcodes only"
298
+
299
+ #: application/components/ParserModuleConfig.php:38
300
+ msgid "Шаблон"
301
+ msgstr "Template"
302
+
303
+ #: application/components/ParserModuleConfig.php:39
304
+ msgid "Шаблон по-умолчанию."
305
+ msgstr "Default template"
306
+
307
+ #: application/components/ParserModuleConfig.php:47
308
+ msgid "Шаблоны могут использовать заголовок при выводе данных."
309
+ msgstr "Templates may use title on data output."
310
+
311
+ #: application/components/ParserModuleConfig.php:57
312
+ msgid "Автоматически установить Featured image для поста."
313
+ msgstr "Automatically set Featured image for post"
314
+
315
+ #: application/components/ParserModuleConfig.php:60
316
+ msgid "Не устанавливать"
317
+ msgstr "Don't set"
318
+
319
+ #: application/components/ParserModuleConfig.php:61
320
+ msgid "Первый элемент"
321
+ msgstr "First image"
322
+
323
+ #: application/components/ParserModuleConfig.php:62
324
+ msgid "Второй элемент"
325
+ msgstr "Second image"
326
+
327
+ #: application/components/ParserModuleConfig.php:63
328
+ msgid "Случайный элемент"
329
+ msgstr "Random image"
330
+
331
+ #: application/components/ParserModuleConfig.php:64
332
+ msgid "Последний элемент"
333
+ msgstr "Last image"
334
+
335
+ #: application/modules/Aliexpress/AliexpressConfig.php:22
336
+ msgid ""
337
+ "Специальный ключ для доступа к Aliexpress API. Получить можно <a target="
338
+ "\"_blank\" href=\"http://portals.aliexpress.com/adcenter/api_setting.htm"
339
+ "\">здесь</a>."
340
+ msgstr ""
341
+ "Special key to access Aliexpress API. You can get it <a target=\"_blank\" "
342
+ "href=\"http://portals.aliexpress.com/adcenter/api_setting.htm\">here</a>."
343
+
344
+ #: application/modules/Aliexpress/AliexpressConfig.php:30
345
+ #: application/modules/Flickr/FlickrConfig.php:29
346
+ #: application/modules/Freebase/FreebaseConfig.php:29
347
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:29
348
+ #: application/modules/Market/MarketConfig.php:29
349
+ #: application/modules/Youtube/YoutubeConfig.php:29
350
+ msgid "Поле \"API Key\" не может быть пустым."
351
+ msgstr "The \"API Key\" can not be empty"
352
+
353
+ #: application/modules/Aliexpress/AliexpressConfig.php:37
354
+ msgid ""
355
+ "Укажите, если хотите посылать трафик через оригинальную партнерку "
356
+ "Aliexpress. Найти можно <a target=\"_blank\" href=\"http://portals."
357
+ "aliexpress.com/track_id_manage.htm\">здесь</a>. Опция должна быть задана до "
358
+ "сохранения товаров в базу данных."
359
+ msgstr ""
360
+ "Specify if you want to send traffic through the original affiliate program "
361
+ "Aliexpress. You can find it <a target=\"_blank\" href=\"http://portals."
362
+ "aliexpress.com/track_id_manage.htm\">here</a>. This option must be set "
363
+ "before saving products in database."
364
+
365
+ #: application/modules/Aliexpress/AliexpressConfig.php:47
366
+ msgid ""
367
+ "Укажите этот параметр, если хотите посылать трафик через одну из CPA-сетей с "
368
+ "поддержкой aliexpress и deeplink. Опция должна быть задана до сохранения "
369
+ "товаров в базу данных."
370
+ msgstr ""
371
+ "Set this option, if you want to send traffic to one of CPA-network with "
372
+ "support of aliexpress and deeplink. Option must be set before saving "
373
+ "products to database"
374
+
375
+ #: application/modules/Aliexpress/AliexpressConfig.php:57
376
+ #: application/modules/Amazon/AmazonConfig.php:66
377
+ #: application/modules/BingImages/BingImagesConfig.php:35
378
+ #: application/modules/Ebay/EbayConfig.php:87
379
+ #: application/modules/Flickr/FlickrConfig.php:35
380
+ #: application/modules/Freebase/FreebaseConfig.php:35
381
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:35
382
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:34
383
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:20
384
+ #: application/modules/Market/MarketConfig.php:48
385
+ #: application/modules/Twitter/TwitterConfig.php:80
386
+ #: application/modules/VkNews/VkNewsConfig.php:20
387
+ #: application/modules/Youtube/YoutubeConfig.php:35
388
+ #: application/modules/Zanox/ZanoxConfig.php:46
389
+ msgid "Результатов"
390
+ msgstr "Results"
391
+
392
+ #: application/modules/Aliexpress/AliexpressConfig.php:58
393
+ #: application/modules/Amazon/AmazonConfig.php:67
394
+ #: application/modules/Ebay/EbayConfig.php:88
395
+ #: application/modules/Zanox/ZanoxConfig.php:47
396
+ msgid "Количество результатов для одного поискового запроса."
397
+ msgstr "Number of results for one search query."
398
+
399
+ #: application/modules/Aliexpress/AliexpressConfig.php:67
400
+ #: application/modules/Aliexpress/AliexpressConfig.php:83
401
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:45
402
+ msgid "Поле \"Результатов\" не может быть больше 40."
403
+ msgstr "The \"Results\" can not be more than 40."
404
+
405
+ #: application/modules/Aliexpress/AliexpressConfig.php:73
406
+ #: application/modules/Amazon/AmazonConfig.php:82
407
+ #: application/modules/Zanox/ZanoxConfig.php:62
408
+ msgid "Результатов для обновления"
409
+ msgstr "Results for updates "
410
+
411
+ #: application/modules/Aliexpress/AliexpressConfig.php:74
412
+ #: application/modules/Amazon/AmazonConfig.php:83
413
+ #: application/modules/Zanox/ZanoxConfig.php:63
414
+ msgid "Количество результатов для автоматического обновления."
415
+ msgstr "Number of results for automatic updates."
416
+
417
+ #: application/modules/Aliexpress/AliexpressConfig.php:89
418
+ msgid "Категория"
419
+ msgstr "Category "
420
+
421
+ #: application/modules/Aliexpress/AliexpressConfig.php:90
422
+ msgid "Ограничить поиск товаров этой категорией."
423
+ msgstr "Limit the search of goods by this category."
424
+
425
+ #: application/modules/Aliexpress/AliexpressConfig.php:93
426
+ msgid "Все категории"
427
+ msgstr "All categories"
428
+
429
+ #: application/modules/Aliexpress/AliexpressConfig.php:128
430
+ msgid "Минимальная комиссия"
431
+ msgstr "Minimal commission"
432
+
433
+ #: application/modules/Aliexpress/AliexpressConfig.php:129
434
+ msgid "Минимальная комиссия в процентах. Например, 3"
435
+ msgstr "Minimal commission (without %). Example, 3"
436
+
437
+ #: application/modules/Aliexpress/AliexpressConfig.php:138
438
+ #: application/modules/Amazon/AmazonConfig.php:160
439
+ #: application/modules/Ebay/EbayConfig.php:284
440
+ #: application/modules/Zanox/ZanoxConfig.php:101
441
+ msgid "Минимальная цена"
442
+ msgstr "Minimal price"
443
+
444
+ #: application/modules/Aliexpress/AliexpressConfig.php:139
445
+ msgid "Должна быть указана в USD. Например, 12.34"
446
+ msgstr "Must be set in USD. Example, 12.34"
447
+
448
+ #: application/modules/Aliexpress/AliexpressConfig.php:148
449
+ #: application/modules/Amazon/AmazonConfig.php:170
450
+ #: application/modules/Ebay/EbayConfig.php:274
451
+ #: application/modules/Zanox/ZanoxConfig.php:111
452
+ msgid "Максимальная цена"
453
+ msgstr "Maximal price"
454
+
455
+ #: application/modules/Aliexpress/AliexpressConfig.php:149
456
+ msgid "Должна быть указана в USD. Например, 56.78"
457
+ msgstr "Must be set in USD. Example, 56.78"
458
+
459
+ #: application/modules/Aliexpress/AliexpressConfig.php:158
460
+ msgid "Минимальные продажи"
461
+ msgstr "Minimal sales"
462
+
463
+ #: application/modules/Aliexpress/AliexpressConfig.php:159
464
+ msgid "Минимальное число партнерских продаж за последний месяц. Например, 123"
465
+ msgstr "Minimal number of partner sales for last month. Example, 123"
466
+
467
+ #: application/modules/Aliexpress/AliexpressConfig.php:168
468
+ msgid "Максимальные продажи"
469
+ msgstr "Maximal sales"
470
+
471
+ #: application/modules/Aliexpress/AliexpressConfig.php:169
472
+ msgid "Максимальное число партнерских продаж за последний месяц. Например, 456"
473
+ msgstr "Max number of partner sales for last month. Example, 456"
474
+
475
+ #: application/modules/Aliexpress/AliexpressConfig.php:178
476
+ #: application/modules/Ebay/EbayConfig.php:122
477
+ #: application/modules/Flickr/FlickrConfig.php:46
478
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:69
479
+ #: application/modules/Twitter/TwitterConfig.php:96
480
+ #: application/modules/Youtube/YoutubeConfig.php:46
481
+ msgid "Сортировка"
482
+ msgstr "Sorting"
483
+
484
+ #: application/modules/Aliexpress/AliexpressConfig.php:182
485
+ msgid "По умолчанию"
486
+ msgstr "Default"
487
+
488
+ #: application/modules/Aliexpress/AliexpressConfig.php:183
489
+ msgid "Цена от низкой к выскокой"
490
+ msgstr "Price low to high"
491
+
492
+ #: application/modules/Aliexpress/AliexpressConfig.php:184
493
+ msgid "Цена от высокой к низкой"
494
+ msgstr "Price high to low"
495
+
496
+ #: application/modules/Aliexpress/AliexpressConfig.php:185
497
+ #: application/modules/Aliexpress/AliexpressConfig.php:195
498
+ msgid "Рейтинг продавца"
499
+ msgstr "Seller rating"
500
+
501
+ #: application/modules/Aliexpress/AliexpressConfig.php:186
502
+ msgid "Комиссия от низкой к высокой"
503
+ msgstr "Commission from low to high"
504
+
505
+ #: application/modules/Aliexpress/AliexpressConfig.php:187
506
+ msgid "Комиссия от высокой к низкой"
507
+ msgstr "Commission from high to low"
508
+
509
+ #: application/modules/Aliexpress/AliexpressConfig.php:188
510
+ msgid "Продажи"
511
+ msgstr "Sales"
512
+
513
+ #: application/modules/Aliexpress/AliexpressConfig.php:189
514
+ msgid "Время жизни от низкого к высокому"
515
+ msgstr "Lifetime from low to high"
516
+
517
+ #: application/modules/Aliexpress/AliexpressConfig.php:190
518
+ msgid "Время жизни от высокого к низкому"
519
+ msgstr "Lifetime from high to low"
520
+
521
+ #: application/modules/Aliexpress/AliexpressConfig.php:196
522
+ msgid "Минимальный рейтинг продавца, например, 12"
523
+ msgstr "Minimal seller rating, for example 12"
524
+
525
+ #: application/modules/Aliexpress/AliexpressConfig.php:206
526
+ #: application/modules/BingImages/BingImagesConfig.php:71
527
+ #: application/modules/Ebay/EbayConfig.php:337
528
+ #: application/modules/Flickr/FlickrConfig.php:91
529
+ #: application/modules/Freebase/FreebaseConfig.php:51
530
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:51
531
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:124
532
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:36
533
+ #: application/modules/Market/MarketConfig.php:154
534
+ #: application/modules/Twitter/TwitterConfig.php:108
535
+ #: application/modules/VkNews/VkNewsConfig.php:31
536
+ #: application/modules/Zanox/ZanoxConfig.php:153
537
+ msgid "Сохранять картинки"
538
+ msgstr "Save images"
539
+
540
+ #: application/modules/Aliexpress/AliexpressConfig.php:207
541
+ #: application/modules/BingImages/BingImagesConfig.php:72
542
+ #: application/modules/Ebay/EbayConfig.php:338
543
+ #: application/modules/Flickr/FlickrConfig.php:92
544
+ #: application/modules/Freebase/FreebaseConfig.php:52
545
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:52
546
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:125
547
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:37
548
+ #: application/modules/Market/MarketConfig.php:155
549
+ #: application/modules/Twitter/TwitterConfig.php:109
550
+ #: application/modules/VkNews/VkNewsConfig.php:32
551
+ #: application/modules/Zanox/ZanoxConfig.php:154
552
+ msgid "Сохранять картинки на сервер"
553
+ msgstr "Save images on server"
554
+
555
+ #: application/modules/Aliexpress/AliexpressModule.php:28
556
+ msgid "Добавляет товары aliexpress.com"
557
+ msgstr "Adds items from aliexpress.com"
558
+
559
+ #: application/modules/Amazon/AmazonConfig.php:22
560
+ msgid "Специальный ключ для доступа к Amazon API."
561
+ msgstr "Special key to access the Amazon API."
562
+
563
+ #: application/modules/Amazon/AmazonConfig.php:30
564
+ msgid "Поле \"Access Key ID\" не может быть пустым."
565
+ msgstr "The \"Access Key ID\" can not be empty"
566
+
567
+ #: application/modules/Amazon/AmazonConfig.php:37
568
+ msgid "Еще один специальный ключ для доступа к Amazon API."
569
+ msgstr "Another special key to access the Amazon API."
570
+
571
+ #: application/modules/Amazon/AmazonConfig.php:45
572
+ msgid "Поле \"Secret Access Key\" не может быть пустым."
573
+ msgstr "The \"Secret Access Key\" can not be empty."
574
+
575
+ #: application/modules/Amazon/AmazonConfig.php:52
576
+ msgid ""
577
+ "Связь с Вашим аккаунтом в партнерке. Чтобы получать комиссию от продаж, "
578
+ "правильно укажите этот параметр."
579
+ msgstr ""
580
+ "Connection with your account in the affiliate program. In order to receive a "
581
+ "commission from sales, specify this option correctly."
582
+
583
+ #: application/modules/Amazon/AmazonConfig.php:60
584
+ msgid "Поле \"Tracking ID\" не может быть пустым."
585
+ msgstr "The \"Tracking ID\" can not be empty."
586
+
587
+ #: application/modules/Amazon/AmazonConfig.php:76
588
+ #: application/modules/Amazon/AmazonConfig.php:92
589
+ #: application/modules/Freebase/FreebaseConfig.php:45
590
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:30
591
+ #: application/modules/Market/MarketConfig.php:58
592
+ #: application/modules/Twitter/TwitterConfig.php:90
593
+ msgid "Поле \"Результатов\" не может быть больше 10."
594
+ msgstr "The \"Results\" can not be more than 10."
595
+
596
+ #: application/modules/Amazon/AmazonConfig.php:98
597
+ #: application/modules/Ebay/EbayConfig.php:79
598
+ msgid "Locale"
599
+ msgstr "Locale"
600
+
601
+ #: application/modules/Amazon/AmazonConfig.php:99
602
+ msgid ""
603
+ "Филиал amazon. Для каждого филиала необходима отдельная регистрация в "
604
+ "соответствующей партнерской программе."
605
+ msgstr ""
606
+ "The branch of Amazon. Each branch requires a separate registration in "
607
+ "certain affiliate program."
608
+
609
+ #: application/modules/Amazon/AmazonConfig.php:106
610
+ msgid "Вид ссылок"
611
+ msgstr "Link type"
612
+
613
+ #: application/modules/Amazon/AmazonConfig.php:107
614
+ msgid ""
615
+ "Вид партнерских ссылок. Узнайте больше про amazon <a target=\"_blank\" href="
616
+ "\"https://affiliate-program.amazon.com/gp/associates/help/t2/a11\">90 day "
617
+ "cookie</a>."
618
+ msgstr ""
619
+ "Type of partner links. Know more about amazon <a target=\"_blank\" href="
620
+ "\"https://affiliate-program.amazon.com/gp/associates/help/t2/a11\">90 day "
621
+ "cookie</a>."
622
+
623
+ #: application/modules/Amazon/AmazonConfig.php:118
624
+ msgid "Категория для поиска"
625
+ msgstr "Categories for search"
626
+
627
+ #: application/modules/Amazon/AmazonConfig.php:119
628
+ msgid ""
629
+ "Список категорий для US Amazon. Для локальных филиалов некоторые категории "
630
+ "могут быть недоступны. Если Вы не зададите категорию для поиска, то никакие "
631
+ "другие опции фильтрации кроме поиска по ключевому слову (например, "
632
+ "минимальная цена или сортировка) работать не будут."
633
+ msgstr ""
634
+ "The list of categories for US Amazon. For local branches some of categories "
635
+ "may be not available. If you do not set category for searching, no other "
636
+ "filtering options in addition to searching for the keyword (for example, the "
637
+ "minimal price or sorting) will not working. "
638
+
639
+ #: application/modules/Amazon/AmazonConfig.php:126
640
+ msgid "Порядок сортировки"
641
+ msgstr "Sorting order"
642
+
643
+ #: application/modules/Amazon/AmazonConfig.php:127
644
+ msgid ""
645
+ "Варианты сортировки зависят от locale и выбранной категории. Список "
646
+ "доступных значений можно найти <a href=\"http://docs.amazonwebservices.com/"
647
+ "AWSECommerceService/latest/DG/index.html?APPNDX_SortValuesArticle.html"
648
+ "\">здесь</a>."
649
+ msgstr ""
650
+ "Sorting variants depend on locale and chosed category. List of all available "
651
+ "values you can find <a href=\"http://docs.amazonwebservices.com/"
652
+ "AWSECommerceService/latest/DG/index.html?APPNDX_SortValuesArticle.html"
653
+ "\">here</a>."
654
+
655
+ #: application/modules/Amazon/AmazonConfig.php:136
656
+ msgid "Brouse node"
657
+ msgstr "Brouse node"
658
+
659
+ #: application/modules/Amazon/AmazonConfig.php:137
660
+ msgid ""
661
+ "Целочисленное ID \"узла\" на amazon. Поиск будет произведен только в этом "
662
+ "\"узле\"."
663
+ msgstr ""
664
+ "Integer ID \"node\" on Amazon. The search will be made only in this \"node\"."
665
+
666
+ #: application/modules/Amazon/AmazonConfig.php:146
667
+ msgid "Поиск в названии"
668
+ msgstr "Search in title"
669
+
670
+ #: application/modules/Amazon/AmazonConfig.php:147
671
+ msgid "Поиск будет произведет только по названиям товаров."
672
+ msgstr "The search will produce only by product name."
673
+
674
+ #: application/modules/Amazon/AmazonConfig.php:153
675
+ msgid "Только Amazon"
676
+ msgstr "Only Amazon"
677
+
678
+ #: application/modules/Amazon/AmazonConfig.php:154
679
+ msgid ""
680
+ "Выбрать товары, которые продает Amazon. Другие продавцы исключаются из "
681
+ "поиска."
682
+ msgstr ""
683
+ "Select products that are selling by Amazon. Other sellers are excluded from "
684
+ "the search."
685
+
686
+ #: application/modules/Amazon/AmazonConfig.php:161
687
+ msgid "Например, 8.99"
688
+ msgstr "Example, 8.99"
689
+
690
+ #: application/modules/Amazon/AmazonConfig.php:171
691
+ msgid "Например, 98.50"
692
+ msgstr "Example, 98.50"
693
+
694
+ #: application/modules/Amazon/AmazonConfig.php:180
695
+ msgid "Минимальная скидка"
696
+ msgstr "Minimal discount"
697
+
698
+ #: application/modules/Amazon/AmazonConfig.php:181
699
+ msgid ""
700
+ "Выбрать товары со скидкой. Обязательно должна быть задана категория. "
701
+ "Обратите внимание, эта опция работает не для всех категорий."
702
+ msgstr ""
703
+ "Choose products with discount. You must set category of product. Note, that "
704
+ "this option works not for all categories."
705
+
706
+ #: application/modules/Amazon/AmazonConfig.php:184
707
+ msgid "Неважно"
708
+ msgstr "Any"
709
+
710
+ #: application/modules/Amazon/AmazonConfig.php:205
711
+ msgid "Парсить отзывы"
712
+ msgstr "Parse reviews"
713
+
714
+ #: application/modules/Amazon/AmazonConfig.php:206
715
+ msgid "Парсить отзывы покупателей по товарам. Это замедляет получение данных."
716
+ msgstr "Parse customers reviews of products. This slows the receiving of data."
717
+
718
+ #: application/modules/Amazon/AmazonConfig.php:212
719
+ msgid "Отзывы в iframe."
720
+ msgstr "Reviews in iframe."
721
+
722
+ #: application/modules/Amazon/AmazonConfig.php:213
723
+ msgid ""
724
+ "Показывать отзывы покупателей в iframe с amazon (отключение этой опции, "
725
+ "возможно, нарушает правила партнерской программы amazon)."
726
+ msgstr ""
727
+ "Show customer reviews in iframe with amazon (disabling this option possibly "
728
+ "violates the rules of the affiliate program of amazon)."
729
+
730
+ #: application/modules/Amazon/AmazonConfig.php:219
731
+ #: application/modules/Market/MarketConfig.php:122
732
+ msgid "Обрезать отзывы"
733
+ msgstr "Cut reviews"
734
+
735
+ #: application/modules/Amazon/AmazonConfig.php:220
736
+ msgid ""
737
+ "Количество символов для одного отзыва. 0 - максимально возможная длина "
738
+ "текста."
739
+ msgstr ""
740
+ "Number of characters for one review. 0 - the maximal length of the text."
741
+
742
+ #: application/modules/Amazon/AmazonConfig.php:230
743
+ msgid "Товар с отзывами"
744
+ msgstr "Products with reviews"
745
+
746
+ #: application/modules/Amazon/AmazonConfig.php:231
747
+ msgid "Парсить отзывы только для заданного количества товаров."
748
+ msgstr "Parse reviews only for a certain amount of products."
749
+
750
+ #: application/modules/Amazon/AmazonConfig.php:241
751
+ msgid "Парсить отписание"
752
+ msgstr "Parse description"
753
+
754
+ #: application/modules/Amazon/AmazonConfig.php:242
755
+ msgid "Парсить описание товаров от продавца."
756
+ msgstr "Parse description of products from seller"
757
+
758
+ #: application/modules/Amazon/AmazonConfig.php:248
759
+ msgid "Вид описания"
760
+ msgstr "Type of description"
761
+
762
+ #: application/modules/Amazon/AmazonConfig.php:252
763
+ msgid "Как на Amazon"
764
+ msgstr "Like on Amazon"
765
+
766
+ #: application/modules/Amazon/AmazonConfig.php:253
767
+ msgid "Безопасный HTML"
768
+ msgstr "Safe HTML"
769
+
770
+ #: application/modules/Amazon/AmazonConfig.php:254
771
+ msgid "Только разрешенные теги HTML"
772
+ msgstr "Only allowed HTML tags"
773
+
774
+ #: application/modules/Amazon/AmazonConfig.php:255
775
+ msgid "Только текст"
776
+ msgstr "Text only"
777
+
778
+ #: application/modules/Amazon/AmazonConfig.php:261
779
+ #: application/modules/Ebay/EbayConfig.php:326
780
+ msgid "Размер описания"
781
+ msgstr "Size of description"
782
+
783
+ #: application/modules/Amazon/AmazonConfig.php:262
784
+ #: application/modules/Ebay/EbayConfig.php:327
785
+ msgid "Максимальный размер описания товара. 0 - не обрезать."
786
+ msgstr "The maximum size of the item description. 0 - do not cut."
787
+
788
+ #: application/modules/Amazon/AmazonModule.php:28
789
+ msgid "Добавляет товары amazon."
790
+ msgstr "Adds goods from Amazon."
791
+
792
+ #: application/modules/Amazon/views/search_panel.php:2
793
+ msgid "Мин. скидка"
794
+ msgstr "Min. discount"
795
+
796
+ #: application/modules/Amazon/views/search_panel.php:3
797
+ msgid "5%"
798
+ msgstr "5%"
799
+
800
+ #: application/modules/Amazon/views/search_panel.php:4
801
+ msgid "10%"
802
+ msgstr "10%"
803
+
804
+ #: application/modules/Amazon/views/search_panel.php:5
805
+ msgid "15%"
806
+ msgstr "15%"
807
+
808
+ #: application/modules/Amazon/views/search_panel.php:6
809
+ msgid "20%"
810
+ msgstr "20%"
811
+
812
+ #: application/modules/Amazon/views/search_panel.php:7
813
+ msgid "25%"
814
+ msgstr "25%"
815
+
816
+ #: application/modules/Amazon/views/search_panel.php:8
817
+ msgid "30%"
818
+ msgstr "30%"
819
+
820
+ #: application/modules/Amazon/views/search_panel.php:9
821
+ msgid "35%"
822
+ msgstr "35%"
823
+
824
+ #: application/modules/Amazon/views/search_panel.php:10
825
+ msgid "40%"
826
+ msgstr "40%"
827
+
828
+ #: application/modules/Amazon/views/search_panel.php:11
829
+ msgid "50%"
830
+ msgstr "50%"
831
+
832
+ #: application/modules/Amazon/views/search_panel.php:12
833
+ msgid "60%"
834
+ msgstr "60%"
835
+
836
+ #: application/modules/Amazon/views/search_panel.php:13
837
+ msgid "70%"
838
+ msgstr "70%"
839
+
840
+ #: application/modules/Amazon/views/search_panel.php:14
841
+ msgid "80%"
842
+ msgstr "80%"
843
+
844
+ #: application/modules/Amazon/views/search_panel.php:15
845
+ msgid "90%"
846
+ msgstr "90%"
847
+
848
+ #: application/modules/BingImages/BingImagesConfig.php:21
849
+ msgid ""
850
+ "Ключ доступа к Bing API. Получить можно <a href=\"https://datamarket.azure."
851
+ "com/account/keys\">здесь</a> (потребуется аккаунт в bing)."
852
+ msgstr ""
853
+ "Key access to Bing API. You can get <a href=\"https://datamarket.azure.com/"
854
+ "account/keys\">here</a> (need bing account)."
855
+
856
+ #: application/modules/BingImages/BingImagesConfig.php:29
857
+ #: application/modules/Twitter/TwitterConfig.php:29
858
+ #: application/modules/Twitter/TwitterConfig.php:44
859
+ #: application/modules/Twitter/TwitterConfig.php:59
860
+ #: application/modules/Twitter/TwitterConfig.php:74
861
+ msgid "Поле \"Account Key\" не может быть пустым."
862
+ msgstr "The \"Account Key\" can not be empty."
863
+
864
+ #: application/modules/BingImages/BingImagesConfig.php:36
865
+ msgid "Количество результатов для одного запроса."
866
+ msgstr "Number of results for a single query."
867
+
868
+ #: application/modules/BingImages/BingImagesConfig.php:45
869
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:44
870
+ msgid "Поле \"Результатов\" не может быть больше 8."
871
+ msgstr "The \"Results\" can not be more than 8."
872
+
873
+ #: application/modules/BingImages/BingImagesConfig.php:51
874
+ msgid "Фильтр"
875
+ msgstr "Filter"
876
+
877
+ #: application/modules/BingImages/BingImagesConfig.php:55
878
+ #: application/modules/BingImages/views/search_panel.php:2
879
+ msgid "Без фильтра"
880
+ msgstr "Without filter"
881
+
882
+ #: application/modules/BingImages/BingImagesConfig.php:56
883
+ #: application/modules/BingImages/views/search_panel.php:3
884
+ msgid "Маленькие изображения"
885
+ msgstr "Small images"
886
+
887
+ #: application/modules/BingImages/BingImagesConfig.php:57
888
+ #: application/modules/BingImages/views/search_panel.php:4
889
+ msgid "Средние изображения"
890
+ msgstr "Medium images"
891
+
892
+ #: application/modules/BingImages/BingImagesConfig.php:58
893
+ #: application/modules/BingImages/views/search_panel.php:5
894
+ msgid "Большие изображения"
895
+ msgstr "Large images"
896
+
897
+ #: application/modules/BingImages/BingImagesConfig.php:59
898
+ #: application/modules/BingImages/views/search_panel.php:6
899
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:56
900
+ msgid "Цветные"
901
+ msgstr "Colored"
902
+
903
+ #: application/modules/BingImages/BingImagesConfig.php:60
904
+ #: application/modules/BingImages/views/search_panel.php:7
905
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:55
906
+ msgid "Черно-белые"
907
+ msgstr "Black and white"
908
+
909
+ #: application/modules/BingImages/BingImagesConfig.php:61
910
+ #: application/modules/BingImages/views/search_panel.php:8
911
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:104
912
+ msgid "Фотографии"
913
+ msgstr "Photo"
914
+
915
+ #: application/modules/BingImages/BingImagesConfig.php:62
916
+ #: application/modules/BingImages/views/search_panel.php:9
917
+ msgid "Графика и иллюстрации"
918
+ msgstr "Graphics and illustrations"
919
+
920
+ #: application/modules/BingImages/BingImagesConfig.php:63
921
+ #: application/modules/BingImages/views/search_panel.php:10
922
+ msgid "Содержит лица"
923
+ msgstr "Contains faces"
924
+
925
+ #: application/modules/BingImages/BingImagesConfig.php:64
926
+ #: application/modules/BingImages/views/search_panel.php:11
927
+ msgid "Портреты"
928
+ msgstr "Portraits"
929
+
930
+ #: application/modules/BingImages/BingImagesConfig.php:65
931
+ #: application/modules/BingImages/views/search_panel.php:12
932
+ msgid "Не содержит лиц"
933
+ msgstr "Does not contain faces"
934
+
935
+ #: application/modules/BingImages/BingImagesConfig.php:79
936
+ msgid "Ограничить поиск только этим доменом. Например, задайте: wikimedia.org"
937
+ msgstr "Limit the search to only that domain. For example ask: wikimedia.org"
938
+
939
+ #: application/modules/BingImages/templates/data_simple.php:5
940
+ msgid "Simple"
941
+ msgstr "Simple"
942
+
943
+ #: application/modules/BingImages/templates/data_simple.php:18
944
+ #: application/modules/GoogleImages/templates/data_simple.php:20
945
+ msgid "Source: %s"
946
+ msgstr "Source: %s"
947
+
948
+ #: application/modules/Ebay/EbayConfig.php:22
949
+ msgid ""
950
+ "Ваш ID для доступа к eBay API. Поучить ключ вы можете в <a href=\"http://"
951
+ "developer.ebay.com/join\">eBay Developers Program</a>."
952
+ msgstr ""
953
+ "API access key to Ebay. You can get it in <a href=\"http://developer.ebay."
954
+ "com/join\">eBay Developers Program</a>."
955
+
956
+ #: application/modules/Ebay/EbayConfig.php:30
957
+ msgid "Поле \"Application ID (AppID)\" не может быть пустым."
958
+ msgstr "Field \"Application ID (AppID)\" can't be empty"
959
+
960
+ #: application/modules/Ebay/EbayConfig.php:37
961
+ msgid ""
962
+ "Это связь с партнерской программой EPN. Campaign ID валидный для всех "
963
+ "программ, в которые вы были приняты на EPN. Если не задано - комиссия за "
964
+ "продажи начисляться не будет."
965
+ msgstr ""
966
+ "This is connection with partner program EPN. Campaign ID is valid for all "
967
+ "programs which were approved for you on EPN. If you leave this field blank - "
968
+ "you will not get commissions from sales."
969
+
970
+ #: application/modules/Ebay/EbayConfig.php:46
971
+ msgid "EPN Custom ID (канал)"
972
+ msgstr "EPN Custom ID (chanel)"
973
+
974
+ #: application/modules/Ebay/EbayConfig.php:47
975
+ msgid ""
976
+ "Любое слово, например, имя домена. Custom ID будет включен в отчеты по "
977
+ "продажам на EPN, таким образом, вы сможете дополнительно отслеживать трафик."
978
+ msgstr ""
979
+ "Any word, for example, name of domain. Custom ID will be included in sale "
980
+ "report on EPN, so, you can additionally check your traffic. "
981
+
982
+ #: application/modules/Ebay/EbayConfig.php:58
983
+ msgid "Skimlinks Site ID"
984
+ msgstr "Skimlinks Site ID"
985
+
986
+ #: application/modules/Ebay/EbayConfig.php:59
987
+ msgid ""
988
+ "Указывайте, если хотите слать трафик через <a href=\"http://www.keywordrush."
989
+ "com/go/skimlinks\">Skimlinks</a>. ID для соотвествущего домена можно найти "
990
+ "<a href=\"https://hub.skimlinks.com/account\">здесь</a>."
991
+ msgstr ""
992
+ "Set this if you want to direct traffic over <a href=\"http://www.keywordrush."
993
+ "com/go/skimlinks\">Skimlinks</a>. Id for domain you can find <a href="
994
+ "\"https://hub.skimlinks.com/account\">here</a>."
995
+
996
+ #: application/modules/Ebay/EbayConfig.php:69
997
+ msgid "Viglink ID"
998
+ msgstr "Viglink ID"
999
+
1000
+ #: application/modules/Ebay/EbayConfig.php:70
1001
+ msgid ""
1002
+ "Указывайте, если хотите слать трафик через <a href=\"http://www.keywordrush."
1003
+ "com/go/viglink\">Viglink</a>. Ваш ID можно найти <a href=\"http://www."
1004
+ "viglink.com/install\">здесь</a>, он одинаковый для всех доменов."
1005
+ msgstr ""
1006
+ "Set this if you want to direct traffic over <a href=\"http://www.keywordrush."
1007
+ "com/go/viglink\">Viglink</a>. Id for domain you can find <a href=\"http://"
1008
+ "www.viglink.com/install\">here</a>. Id is the same for all domains"
1009
+
1010
+ #: application/modules/Ebay/EbayConfig.php:80
1011
+ msgid ""
1012
+ "Локальный сайт eBay. Для каждого локального филиала необходима отдельная "
1013
+ "регистрация в соответствующей партнерской программе."
1014
+ msgstr ""
1015
+ "Local site of Ebay. For each local site you must have separate registration "
1016
+ "in affiliate program."
1017
+
1018
+ #: application/modules/Ebay/EbayConfig.php:97
1019
+ msgid "Поле \"Результатов\" не может быть больше 100."
1020
+ msgstr "Field \"Results\" can not be more than 100."
1021
+
1022
+ #: application/modules/Ebay/EbayConfig.php:130
1023
+ msgid "Время завершения"
1024
+ msgstr "Ending time"
1025
+
1026
+ #: application/modules/Ebay/EbayConfig.php:131
1027
+ msgid ""
1028
+ "Срок жизни лотов в секундах. Будут выбраны только лоты, которые закроются не "
1029
+ "позже указанного времени."
1030
+ msgstr ""
1031
+ "Lifetime of lots in seconds. Only lots which will be closed not later than "
1032
+ "the specified time will be chosen."
1033
+
1034
+ #: application/modules/Ebay/EbayConfig.php:140
1035
+ msgid "Категориия"
1036
+ msgstr "Category "
1037
+
1038
+ #: application/modules/Ebay/EbayConfig.php:141
1039
+ msgid ""
1040
+ "ID категории для поиска. ID категорий можно найти в URL категорий на <a href="
1041
+ "\"http://www.ebay.com/sch/allcategories/all-categories\">этой странице</a>. "
1042
+ "Можно задать до трех категорий через запятую, например, \"2195,2218,20094\"."
1043
+ msgstr ""
1044
+ "Id of category for searching. Id of categories you can find in URL of "
1045
+ "category on <a href=\"http://www.ebay.com/sch/allcategories/all-categories"
1046
+ "\">this page</a>. You can set maximum 3 categories separated with comma. "
1047
+ "Example, \"2195,2218,20094\"."
1048
+
1049
+ #: application/modules/Ebay/EbayConfig.php:150
1050
+ msgid "Искать в описании"
1051
+ msgstr "Search in description"
1052
+
1053
+ #: application/modules/Ebay/EbayConfig.php:151
1054
+ msgid ""
1055
+ "Включить поиск по описание товара в дополнение к названию товара. Это займет "
1056
+ "больше времени, чем поиск только по названию."
1057
+ msgstr ""
1058
+ "Include description of product in searching. This will take more time, than "
1059
+ "searching only by title."
1060
+
1061
+ #: application/modules/Ebay/EbayConfig.php:157
1062
+ msgid "Логика поиска"
1063
+ msgstr "Searching logic"
1064
+
1065
+ #: application/modules/Ebay/EbayConfig.php:165
1066
+ msgid "Состояние товара"
1067
+ msgstr "Product condition"
1068
+
1069
+ #: application/modules/Ebay/EbayConfig.php:173
1070
+ msgid "Исключить категорию"
1071
+ msgstr "Exclude category"
1072
+
1073
+ #: application/modules/Ebay/EbayConfig.php:174
1074
+ msgid ""
1075
+ "ID категории, которую необходимо исключить при поиске. ID категорий можно "
1076
+ "найти в URL категорий на <a href=\"http://www.ebay.com/sch/allcategories/all-"
1077
+ "categories\">этой странице</a>. Можно задать до 25 категорий через запятую, "
1078
+ "например, \"2195,2218,20094\"."
1079
+ msgstr ""
1080
+ "Id of category, which must be excluded while searching. Id of categories you "
1081
+ "can find in URL of category on <a href=\"http://www.ebay.com/sch/"
1082
+ "allcategories/all-categories\">this page</a>. You can set maximum 25 "
1083
+ "categories separated with comma. Example, \"2195,2218,20094\"."
1084
+
1085
+ #: application/modules/Ebay/EbayConfig.php:183
1086
+ msgid "Минимальный ретинг продавца"
1087
+ msgstr "Minimal seller rating"
1088
+
1089
+ #: application/modules/Ebay/EbayConfig.php:191
1090
+ msgid "Best Offer"
1091
+ msgstr "Best Offer"
1092
+
1093
+ #: application/modules/Ebay/EbayConfig.php:192
1094
+ msgid "Только \"Best Offer\" лоты."
1095
+ msgstr "Only \"Best Offer\" lots."
1096
+
1097
+ #: application/modules/Ebay/EbayConfig.php:198
1098
+ msgid "Featured"
1099
+ msgstr "Featured"
1100
+
1101
+ #: application/modules/Ebay/EbayConfig.php:199
1102
+ msgid "Только \"Featured\" лоты."
1103
+ msgstr "Only \"Featured\" lots."
1104
+
1105
+ #: application/modules/Ebay/EbayConfig.php:205
1106
+ msgid "Free Shipping"
1107
+ msgstr "Free Shipping"
1108
+
1109
+ #: application/modules/Ebay/EbayConfig.php:206
1110
+ msgid "Только лоты с бесплатной доставкой."
1111
+ msgstr "Only lots with free delivery"
1112
+
1113
+ #: application/modules/Ebay/EbayConfig.php:212
1114
+ msgid "Local Pickup"
1115
+ msgstr "Local Pickup"
1116
+
1117
+ #: application/modules/Ebay/EbayConfig.php:213
1118
+ msgid "Только лоты с опцией \"local pickup\"."
1119
+ msgstr "Only lots with \"local pickup\" option."
1120
+
1121
+ #: application/modules/Ebay/EbayConfig.php:219
1122
+ msgid "Get It Fast"
1123
+ msgstr "Get It Fast"
1124
+
1125
+ #: application/modules/Ebay/EbayConfig.php:220
1126
+ msgid "Только \"Get It Fast\" лоты."
1127
+ msgstr "Only \"Get It Fast\" lots."
1128
+
1129
+ #: application/modules/Ebay/EbayConfig.php:226
1130
+ msgid "Top-rated seller"
1131
+ msgstr "Top-rated seller"
1132
+
1133
+ #: application/modules/Ebay/EbayConfig.php:227
1134
+ msgid "Только товары от \"Top-rated\" продавцов."
1135
+ msgstr "Only products from Top-rated \"Top-rated\" vendors."
1136
+
1137
+ #: application/modules/Ebay/EbayConfig.php:233
1138
+ msgid "Спрятать дубли"
1139
+ msgstr "Hide dublicates"
1140
+
1141
+ #: application/modules/Ebay/EbayConfig.php:234
1142
+ msgid "Отфильтровать похожие лоты."
1143
+ msgstr "Filter similar lots"
1144
+
1145
+ #: application/modules/Ebay/EbayConfig.php:240
1146
+ msgid "Тип аукциона"
1147
+ msgstr "Type of auction"
1148
+
1149
+ #: application/modules/Ebay/EbayConfig.php:254
1150
+ msgid "Максимум ставок"
1151
+ msgstr "Maximum bids"
1152
+
1153
+ #: application/modules/Ebay/EbayConfig.php:255
1154
+ msgid "Например, 10"
1155
+ msgstr "Example, 10"
1156
+
1157
+ #: application/modules/Ebay/EbayConfig.php:264
1158
+ msgid "Минимум ставок"
1159
+ msgstr "Minimum bids"
1160
+
1161
+ #: application/modules/Ebay/EbayConfig.php:265
1162
+ msgid "Например, 3"
1163
+ msgstr "Example, 3"
1164
+
1165
+ #: application/modules/Ebay/EbayConfig.php:275
1166
+ msgid "Например, 300.50"
1167
+ msgstr "Example, 300.50"
1168
+
1169
+ #: application/modules/Ebay/EbayConfig.php:285
1170
+ msgid "Например, 10.98"
1171
+ msgstr "Example, 10.98"
1172
+
1173
+ #: application/modules/Ebay/EbayConfig.php:294
1174
+ msgid "Варианты оплаты"
1175
+ msgstr "Payment options"
1176
+
1177
+ #: application/modules/Ebay/EbayConfig.php:319
1178
+ msgid "Получить описание"
1179
+ msgstr "Get description"
1180
+
1181
+ #: application/modules/Ebay/EbayConfig.php:320
1182
+ msgid ""
1183
+ "Получить описание товара. Требует дополнительных запросов к eBay API, это "
1184
+ "замедляет работу поиска. Описание будет запрошено не более чем для 20 первых "
1185
+ "товаров за один поиск."
1186
+ msgstr ""
1187
+ "Get description of product. This takes more requests for Ebay API and slow "
1188
+ "down searching. Description will be requested only for 20 first products for "
1189
+ "one searching"
1190
+
1191
+ #: application/modules/Ebay/EbayModule.php:30
1192
+ msgid ""
1193
+ "Добавляет товары eBay. Поддерживает различные локальные сайты. Несколько "
1194
+ "вариантов монетизации трафика."
1195
+ msgstr ""
1196
+ "Adds Ebay products. Supports different local sites. Several ways of "
1197
+ "moneymaking."
1198
+
1199
+ #: application/modules/Flickr/FlickrConfig.php:21
1200
+ msgid ""
1201
+ "Ключ для использования Flickr API. Получить можно <a href=\"http://www."
1202
+ "flickr.com/services/api/misc.api_keys.html\">здесь</a>."
1203
+ msgstr ""
1204
+ "The key for use Flickr API. You can get <a href=\"http://www.flickr.com/"
1205
+ "services/api/misc.api_keys.html\">here</a>."
1206
+
1207
+ #: application/modules/Flickr/FlickrConfig.php:36
1208
+ #: application/modules/Freebase/FreebaseConfig.php:36
1209
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:36
1210
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:21
1211
+ #: application/modules/Market/MarketConfig.php:49
1212
+ #: application/modules/Twitter/TwitterConfig.php:81
1213
+ #: application/modules/VkNews/VkNewsConfig.php:21
1214
+ #: application/modules/Youtube/YoutubeConfig.php:36
1215
+ msgid "Количество результатов для одного запроса"
1216
+ msgstr "Number of results for a single query"
1217
+
1218
+ #: application/modules/Flickr/FlickrConfig.php:50
1219
+ #: application/modules/Flickr/views/search_panel.php:10
1220
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:73
1221
+ #: application/modules/Youtube/YoutubeConfig.php:52
1222
+ #: application/modules/Youtube/views/search_panel.php:10
1223
+ msgid "Релевантность"
1224
+ msgstr "Relevance"
1225
+
1226
+ #: application/modules/Flickr/FlickrConfig.php:51
1227
+ #: application/modules/Flickr/views/search_panel.php:11
1228
+ msgid "Дата поста"
1229
+ msgstr "Date of post"
1230
+
1231
+ #: application/modules/Flickr/FlickrConfig.php:52
1232
+ #: application/modules/Flickr/views/search_panel.php:12
1233
+ msgid "Дата съемки"
1234
+ msgstr "Date of shooting"
1235
+
1236
+ #: application/modules/Flickr/FlickrConfig.php:53
1237
+ #: application/modules/Flickr/views/search_panel.php:13
1238
+ msgid "Сначала интересные"
1239
+ msgstr "First interesting"
1240
+
1241
+ #: application/modules/Flickr/FlickrConfig.php:59
1242
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:20
1243
+ #: application/modules/Youtube/YoutubeConfig.php:60
1244
+ msgid "Тип лицензии"
1245
+ msgstr "Type of license"
1246
+
1247
+ #: application/modules/Flickr/FlickrConfig.php:63
1248
+ #: application/modules/Flickr/views/search_panel.php:2
1249
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:24
1250
+ #: application/modules/GoogleImages/views/search_panel.php:2
1251
+ #: application/modules/Youtube/YoutubeConfig.php:64
1252
+ #: application/modules/Youtube/views/search_panel.php:2
1253
+ msgid "Любая лицензия"
1254
+ msgstr "Any license"
1255
+
1256
+ #: application/modules/Flickr/FlickrConfig.php:64
1257
+ #: application/modules/Flickr/views/search_panel.php:3
1258
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:25
1259
+ #: application/modules/GoogleImages/views/search_panel.php:3
1260
+ msgid "Любая Сreative Сommons"
1261
+ msgstr "Any Creative Commons"
1262
+
1263
+ #: application/modules/Flickr/FlickrConfig.php:65
1264
+ #: application/modules/Flickr/views/search_panel.php:4
1265
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:26
1266
+ #: application/modules/GoogleImages/views/search_panel.php:4
1267
+ msgid "Разрешено коммерческое использование"
1268
+ msgstr "With Allow of commercial use"
1269
+
1270
+ #: application/modules/Flickr/FlickrConfig.php:66
1271
+ #: application/modules/Flickr/views/search_panel.php:5
1272
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:27
1273
+ #: application/modules/GoogleImages/views/search_panel.php:5
1274
+ msgid "Разрешено изменение"
1275
+ msgstr "Allowed change"
1276
+
1277
+ #: application/modules/Flickr/FlickrConfig.php:67
1278
+ #: application/modules/Flickr/views/search_panel.php:6
1279
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:28
1280
+ #: application/modules/GoogleImages/views/search_panel.php:6
1281
+ msgid "Коммерческое использование и изменение"
1282
+ msgstr "Commercial use and change"
1283
+
1284
+ #: application/modules/Flickr/FlickrConfig.php:73
1285
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:84
1286
+ msgid "Размер"
1287
+ msgstr "Size"
1288
+
1289
+ #: application/modules/Flickr/FlickrConfig.php:77
1290
+ msgid "75x75 пикселов"
1291
+ msgstr "75x75 pixels"
1292
+
1293
+ #: application/modules/Flickr/FlickrConfig.php:78
1294
+ msgid "150x150 пикселов"
1295
+ msgstr "150x150 pixels"
1296
+
1297
+ #: application/modules/Flickr/FlickrConfig.php:79
1298
+ msgid "100 пикселов по длинной стороне"
1299
+ msgstr "100 pixels on the long side"
1300
+
1301
+ #: application/modules/Flickr/FlickrConfig.php:80
1302
+ msgid "240 пикселов по длинной стороне"
1303
+ msgstr "240 pixels on the long side"
1304
+
1305
+ #: application/modules/Flickr/FlickrConfig.php:81
1306
+ msgid "320 пикселов по длинной стороне"
1307
+ msgstr "320 pixels on the long side"
1308
+
1309
+ #: application/modules/Flickr/FlickrConfig.php:82
1310
+ msgid "500 пикселов по длинной стороне"
1311
+ msgstr "500 pixels on the long side"
1312
+
1313
+ #: application/modules/Flickr/FlickrConfig.php:83
1314
+ msgid "640 пикселов по длинной стороне"
1315
+ msgstr "640 pixels on the long side"
1316
+
1317
+ #: application/modules/Flickr/FlickrConfig.php:84
1318
+ msgid "800 пикселов по длинной стороне"
1319
+ msgstr "800 pixels on the long side"
1320
+
1321
+ #: application/modules/Flickr/FlickrConfig.php:85
1322
+ msgid "1024 пикселов по длинной стороне"
1323
+ msgstr "1024 pixels on the long side"
1324
+
1325
+ #: application/modules/Flickr/FlickrConfig.php:98
1326
+ #: application/modules/Freebase/FreebaseConfig.php:58
1327
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:58
1328
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:131
1329
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:43
1330
+ #: application/modules/VkNews/VkNewsConfig.php:38
1331
+ #: application/modules/Youtube/YoutubeConfig.php:72
1332
+ #: application/modules/Zanox/ZanoxConfig.php:160
1333
+ msgid "Обрезать описание"
1334
+ msgstr "Trim description"
1335
+
1336
+ #: application/modules/Flickr/FlickrConfig.php:99
1337
+ #: application/modules/Freebase/FreebaseConfig.php:59
1338
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:59
1339
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:132
1340
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:44
1341
+ #: application/modules/VkNews/VkNewsConfig.php:39
1342
+ #: application/modules/Youtube/YoutubeConfig.php:73
1343
+ #: application/modules/Zanox/ZanoxConfig.php:161
1344
+ msgid "Размер описания в символах (0 - не обрезать)"
1345
+ msgstr "Description size in characters (0 - do not cut)"
1346
+
1347
+ #: application/modules/Flickr/FlickrConfig.php:110
1348
+ msgid "Ограничить поиск только этим пользователем Flickr"
1349
+ msgstr "Limit search to only those user Flickr"
1350
+
1351
+ #: application/modules/Flickr/templates/data_justified_gallery.php:62
1352
+ msgid "Фото: %s на Flickr"
1353
+ msgstr "Photo: %s on Flickr"
1354
+
1355
+ #: application/modules/Freebase/FreebaseConfig.php:21
1356
+ msgid ""
1357
+ "Ключ для доступа к API. Получить можно в Google <a href=\"http://code.google."
1358
+ "com/apis/console\">API консоли</a>."
1359
+ msgstr ""
1360
+ "API access key. You can get it in Google <a href=\"http://code.google.com/"
1361
+ "apis/console\">API console</a>."
1362
+
1363
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:21
1364
+ #: application/modules/Youtube/YoutubeConfig.php:21
1365
+ msgid ""
1366
+ "Ключ для доступа к API. Получить можно в Google <a href=\"http://code.google."
1367
+ "com/apis/console\">API консоли</a>"
1368
+ msgstr ""
1369
+ "API access key. You can get it in Google <a href=\"http://code.google.com/"
1370
+ "apis/console\">API console</a>."
1371
+
1372
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:74
1373
+ msgid "Новизна"
1374
+ msgstr "Newness"
1375
+
1376
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:80
1377
+ msgid "Тип издания"
1378
+ msgstr "Publication type"
1379
+
1380
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:84
1381
+ msgid "Любые"
1382
+ msgstr "Any"
1383
+
1384
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:85
1385
+ msgid "Книги"
1386
+ msgstr "Books"
1387
+
1388
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:86
1389
+ msgid "Журналы"
1390
+ msgstr "Magazines"
1391
+
1392
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:21
1393
+ msgid ""
1394
+ "Поиск изображений, которые можно использовать. Подробнее <a href=\"https://"
1395
+ "support.google.com/websearch/answer/29508\">здесь</a>."
1396
+ msgstr ""
1397
+ "Searching of images, which you can use. More about, <a href=\"https://"
1398
+ "support.google.com/websearch/answer/29508\">here</a>."
1399
+
1400
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:35
1401
+ msgid "Количество результатов для одного запроса. Не может быть больше 8."
1402
+ msgstr "Number of results for one query. Can not be more than 8."
1403
+
1404
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:50
1405
+ msgid "Цвет"
1406
+ msgstr "Color"
1407
+
1408
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:54
1409
+ msgid "Любого цвета"
1410
+ msgstr "Any color"
1411
+
1412
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:62
1413
+ msgid "Преобладание цвета"
1414
+ msgstr "Predominance of the color"
1415
+
1416
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:66
1417
+ msgid "Любой цвет"
1418
+ msgstr "Any color"
1419
+
1420
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:67
1421
+ msgid "Черный"
1422
+ msgstr "Black"
1423
+
1424
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:68
1425
+ msgid "Синий"
1426
+ msgstr "Blue"
1427
+
1428
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:69
1429
+ msgid "Коричневый"
1430
+ msgstr "Brown"
1431
+
1432
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:70
1433
+ msgid "Серый"
1434
+ msgstr "Gray"
1435
+
1436
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:71
1437
+ msgid "Зеленый"
1438
+ msgstr "Green"
1439
+
1440
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:72
1441
+ msgid "Оранжевый"
1442
+ msgstr "Orange"
1443
+
1444
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:73
1445
+ msgid "Розовый"
1446
+ msgstr "Pink"
1447
+
1448
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:74
1449
+ msgid "Фиолетовый"
1450
+ msgstr "Purple"
1451
+
1452
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:75
1453
+ msgid "Красный"
1454
+ msgstr "Red"
1455
+
1456
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:76
1457
+ msgid "Бирюзовый"
1458
+ msgstr "Turquoise"
1459
+
1460
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:77
1461
+ msgid "Белый"
1462
+ msgstr "White"
1463
+
1464
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:78
1465
+ msgid "Желтый"
1466
+ msgstr "Yellow"
1467
+
1468
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:88
1469
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:102
1470
+ #: application/modules/GoogleImages/views/search_panel.php:11
1471
+ msgid "Любого размера"
1472
+ msgstr "Any size"
1473
+
1474
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:89
1475
+ #: application/modules/GoogleImages/views/search_panel.php:12
1476
+ msgid "Маленькие"
1477
+ msgstr "Small"
1478
+
1479
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:90
1480
+ #: application/modules/GoogleImages/views/search_panel.php:13
1481
+ msgid "Средние"
1482
+ msgstr "Medium"
1483
+
1484
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:91
1485
+ #: application/modules/GoogleImages/views/search_panel.php:14
1486
+ msgid "Большие"
1487
+ msgstr "Large"
1488
+
1489
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:92
1490
+ #: application/modules/GoogleImages/views/search_panel.php:15
1491
+ msgid "Огромные"
1492
+ msgstr "Huge"
1493
+
1494
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:98
1495
+ msgid "Тип"
1496
+ msgstr "Type"
1497
+
1498
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:103
1499
+ msgid "Лица"
1500
+ msgstr "Faces"
1501
+
1502
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:105
1503
+ msgid "Клип-арт"
1504
+ msgstr "Clip-art"
1505
+
1506
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:106
1507
+ msgid "Ч/б рисунки"
1508
+ msgstr "B/w pictures"
1509
+
1510
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:112
1511
+ msgid "Безопасный поиск"
1512
+ msgstr "Safe search"
1513
+
1514
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:116
1515
+ msgid "Включен"
1516
+ msgstr "Included"
1517
+
1518
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:117
1519
+ msgid "Модерация"
1520
+ msgstr "Moderation"
1521
+
1522
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:118
1523
+ msgid "Отключен"
1524
+ msgstr "Disabled"
1525
+
1526
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:143
1527
+ msgid ""
1528
+ "Ограничить поиск только этим доменом. Например, задайте: photobucket.com"
1529
+ msgstr "Limit search to only that domain. For example ask: photobucket.com"
1530
+
1531
+ #: application/modules/Market/MarketConfig.php:21
1532
+ msgid ""
1533
+ "Ключ для доступа к Яндекс Маркет API. Отправить запрос на получение можно <a "
1534
+ "href=\"http://feedback2.yandex.ru/api-market-content/key/\">здесь</a>."
1535
+ msgstr ""
1536
+ "Access key to Yandex Market API. Send request to obtain is possible <a href="
1537
+ "\"http://feedback2.yandex.ru/api-market-content/key/\">here<a/>."
1538
+
1539
+ #: application/modules/Market/MarketConfig.php:35
1540
+ #: application/modules/Zanox/ZanoxConfig.php:90
1541
+ msgid "Регион"
1542
+ msgstr "Region"
1543
+
1544
+ #: application/modules/Market/MarketConfig.php:39
1545
+ msgid "Россия"
1546
+ msgstr "Russia"
1547
+
1548
+ #: application/modules/Market/MarketConfig.php:40
1549
+ msgid "Украина"
1550
+ msgstr "Ukraine"
1551
+
1552
+ #: application/modules/Market/MarketConfig.php:41
1553
+ msgid "Казахстан"
1554
+ msgstr "Kazakhstan"
1555
+
1556
+ #: application/modules/Market/MarketConfig.php:42
1557
+ msgid "Беларусь"
1558
+ msgstr "Belarus"
1559
+
1560
+ #: application/modules/Market/MarketConfig.php:64
1561
+ msgid "Предложения"
1562
+ msgstr "Offers"
1563
+
1564
+ #: application/modules/Market/MarketConfig.php:65
1565
+ msgid "Получить список предложений на модель."
1566
+ msgstr "Get a list of the offers on the model"
1567
+
1568
+ #: application/modules/Market/MarketConfig.php:71
1569
+ msgid "Количество предложений"
1570
+ msgstr "Number of offers"
1571
+
1572
+ #: application/modules/Market/MarketConfig.php:81
1573
+ msgid "Поле \"Количество предложений\" не может быть больше 30."
1574
+ msgstr "The \"Number of offers\" can not be more than 30."
1575
+
1576
+ #: application/modules/Market/MarketConfig.php:87
1577
+ msgid "Отзывы"
1578
+ msgstr "Reviews"
1579
+
1580
+ #: application/modules/Market/MarketConfig.php:88
1581
+ msgid "Получить отзывы о модели."
1582
+ msgstr "Get review about the model."
1583
+
1584
+ #: application/modules/Market/MarketConfig.php:94
1585
+ msgid "Количество отзывов"
1586
+ msgstr "Number of reviews"
1587
+
1588
+ #: application/modules/Market/MarketConfig.php:104
1589
+ msgid "Поле \"Количество отзывов\" не может быть больше 30."
1590
+ msgstr "The \"Number of reviews\" can not be more than 30."
1591
+
1592
+ #: application/modules/Market/MarketConfig.php:110
1593
+ msgid "Сортировка отзывов"
1594
+ msgstr "Sorting of reviews"
1595
+
1596
+ #: application/modules/Market/MarketConfig.php:114
1597
+ msgid "Сортировка по оценке пользователем модели"
1598
+ msgstr "Sorting by user ratings models"
1599
+
1600
+ #: application/modules/Market/MarketConfig.php:115
1601
+ msgid "Сортировка по дате написания отзыва"
1602
+ msgstr "Sorting by date of review"
1603
+
1604
+ #: application/modules/Market/MarketConfig.php:116
1605
+ msgid "Сортировка по полезности отзыва"
1606
+ msgstr "Sorting by usefulness of review"
1607
+
1608
+ #: application/modules/Market/MarketConfig.php:123
1609
+ msgid "Размер отзывов в символах (0 - не обрезать)"
1610
+ msgstr "Size of reviews in characters (0 - do not cut)"
1611
+
1612
+ #: application/modules/Market/MarketModule.php:28
1613
+ msgid "Добавляет товары из русскоязычного каталога Яндекс.Маркет"
1614
+ msgstr "Add products from the Russian-speaking catalog of Yandex.Market"
1615
+
1616
+ #: application/modules/Market/templates/data_item.php:130
1617
+ msgid "All reviews on Yandex.Market"
1618
+ msgstr "All reviews on Yandex.Market"
1619
+
1620
+ #: application/modules/Twitter/TwitterConfig.php:21
1621
+ #: application/modules/Twitter/TwitterConfig.php:36
1622
+ #: application/modules/Twitter/TwitterConfig.php:51
1623
+ #: application/modules/Twitter/TwitterConfig.php:66
1624
+ msgid "Получить можно <a href=\"https://dev.twitter.com/apps/\">здесь</a>."
1625
+ msgstr "Can get <a href=\"https://dev.twitter.com/apps/\">here<a/>."
1626
+
1627
+ #: application/modules/Twitter/TwitterConfig.php:100
1628
+ #: application/modules/Twitter/views/search_panel.php:2
1629
+ msgid "Новые"
1630
+ msgstr "New"
1631
+
1632
+ #: application/modules/Twitter/TwitterConfig.php:101
1633
+ #: application/modules/Twitter/views/search_panel.php:3
1634
+ msgid "Популярные"
1635
+ msgstr "Popular"
1636
+
1637
+ #: application/modules/Twitter/TwitterConfig.php:102
1638
+ #: application/modules/Twitter/views/search_panel.php:4
1639
+ msgid "Микс"
1640
+ msgstr "Mix"
1641
+
1642
+ #: application/modules/VkNews/VkNewsModule.php:25
1643
+ msgid "Добавляет новости из русскоязычной социальной сети vk.com"
1644
+ msgstr "Adds news from Russian-language social network vk.com"
1645
+
1646
+ #: application/modules/Youtube/YoutubeConfig.php:50
1647
+ #: application/modules/Youtube/views/search_panel.php:8
1648
+ msgid "Дата"
1649
+ msgstr "Date"
1650
+
1651
+ #: application/modules/Youtube/YoutubeConfig.php:51
1652
+ #: application/modules/Youtube/views/search_panel.php:9
1653
+ msgid "Рейтинг"
1654
+ msgstr "Rating"
1655
+
1656
+ #: application/modules/Youtube/YoutubeConfig.php:54
1657
+ #: application/modules/Youtube/views/search_panel.php:12
1658
+ msgid "Просмотры"
1659
+ msgstr "Views"
1660
+
1661
+ #: application/modules/Youtube/YoutubeConfig.php:61
1662
+ msgid ""
1663
+ "Многие видео на Youtube загружены с лицензией Creative Commons. <a href="
1664
+ "\"http://www.google.com/support/youtube/bin/answer.py?"
1665
+ "answer=1284989\">Узнать больше</a>."
1666
+ msgstr ""
1667
+ "Many videos on Youtube have Creative Commons license. <a href=\"http://www."
1668
+ "google.com/support/youtube/bin/answer.py?answer=1284989\">Know more</a>."
1669
+
1670
+ #: application/modules/Youtube/YoutubeConfig.php:65
1671
+ msgid "Сreative Сommons лицензия"
1672
+ msgstr "Creative Commons license"
1673
+
1674
+ #: application/modules/Youtube/YoutubeConfig.php:66
1675
+ #: application/modules/Youtube/views/search_panel.php:4
1676
+ msgid "Стандартная лицензия"
1677
+ msgstr "Standard license"
1678
+
1679
+ #: application/modules/Youtube/views/search_panel.php:3
1680
+ msgid "Сreative Сommons"
1681
+ msgstr "Creative Commons"
1682
+
1683
+ #: application/modules/Zanox/ZanoxConfig.php:22
1684
+ msgid ""
1685
+ "Специальный ключ для доступа к Zanox API, а также ваша связь с партнерской "
1686
+ "программой."
1687
+ msgstr ""
1688
+ "Special key for Zanox API, also this is your connection with the partner "
1689
+ "program."
1690
+
1691
+ #: application/modules/Zanox/ZanoxConfig.php:30
1692
+ msgid "Поле \"Connect ID\" не может быть пустым."
1693
+ msgstr "The field \"Connect ID\" can not be empty."
1694
+
1695
+ #: application/modules/Zanox/ZanoxConfig.php:56
1696
+ #: application/modules/Zanox/ZanoxConfig.php:72
1697
+ msgid "Поле \"Результатов\" не может быть больше 50."
1698
+ msgstr "The field \"Results\" can not be more than 50."
1699
+
1700
+ #: application/modules/Zanox/ZanoxConfig.php:78
1701
+ msgid "Тип поиска"
1702
+ msgstr "Search type"
1703
+
1704
+ #: application/modules/Zanox/ZanoxConfig.php:79
1705
+ msgid ""
1706
+ "\"Автоматически\" означает, что тип поиска будет выбран в зависимости от "
1707
+ "длины поисковой фразы."
1708
+ msgstr ""
1709
+ "\"Automatically\" means, that searching type will be chosen depending on "
1710
+ "length of the search phrase."
1711
+
1712
+ #: application/modules/Zanox/ZanoxConfig.php:82
1713
+ msgid "Автоматически"
1714
+ msgstr "Automatically"
1715
+
1716
+ #: application/modules/Zanox/ZanoxConfig.php:83
1717
+ msgid "Фраза"
1718
+ msgstr "Phrase"
1719
+
1720
+ #: application/modules/Zanox/ZanoxConfig.php:84
1721
+ msgid "Контекстный"
1722
+ msgstr "Context"
1723
+
1724
+ #: application/modules/Zanox/ZanoxConfig.php:91
1725
+ msgid "Ограничить результаты поиска выбранным регионом."
1726
+ msgstr "Limit the search of goods by this region."
1727
+
1728
+ #: application/modules/Zanox/ZanoxConfig.php:94
1729
+ msgid "Любой регион"
1730
+ msgstr "Any region"
1731
+
1732
+ #: application/modules/Zanox/ZanoxConfig.php:121
1733
+ msgid "ID программы"
1734
+ msgstr "Id of program"
1735
+
1736
+ #: application/modules/Zanox/ZanoxConfig.php:122
1737
+ msgid ""
1738
+ "Ограничить результаты поиска конкретной программой. Вы можете указать "
1739
+ "несколько ID через запятую. Например: \"1234\", \"1234,5678,9123\". Если не "
1740
+ "указано, поиск будет произведен по всем вашим подключенным программам."
1741
+ msgstr ""
1742
+ "Limit search results to the specific program. You can specify several ID "
1743
+ "through a comma. For example: \"1234 \", \"1234,5678,9123 \". If it isn't "
1744
+ "specified, search will be run for all your connected programs."
1745
+
1746
+ #: application/modules/Zanox/ZanoxConfig.php:142
1747
+ msgid "Партнерство"
1748
+ msgstr "Partnership"
1749
+
1750
+ #: application/modules/Zanox/ZanoxConfig.php:143
1751
+ msgid ""
1752
+ "Если выбрано \"Все\", партнерские ссылки не будут включены в результат. "
1753
+ "Используйте только для оценки доступных товаров."
1754
+ msgstr ""
1755
+ "If you choose \"All \", partner links won't be included in result. Use only "
1756
+ "for an assessment of available products."
1757
+
1758
+ #: application/modules/Zanox/ZanoxConfig.php:146
1759
+ msgid "Все"
1760
+ msgstr "All"
1761
+
1762
+ #: application/modules/Zanox/ZanoxConfig.php:147
1763
+ msgid "Подтвержденные"
1764
+ msgstr "Approved"
1765
+
1766
+ #: application/modules/Zanox/ZanoxModule.php:27
1767
+ msgid ""
1768
+ "Добавляет товары партнерской сети zanox.com. Вы должны получить аппрув от "
1769
+ "каждой программы отдельно."
1770
+ msgstr ""
1771
+ "Adds products from zanox.com. You must have approval from each program "
1772
+ "separately."
1773
+
1774
+ #. Plugin Name of the plugin/theme
1775
+ msgid "Content Egg"
1776
+ msgstr "Content Egg"
1777
+
1778
+ #. Plugin URI of the plugin/theme
1779
+ msgid "http://www.keywordrush.com/contentegg"
1780
+ msgstr "http://www.keywordrush.com/en/contentegg"
1781
+
1782
+ #. Description of the plugin/theme
1783
+ msgid ""
1784
+ "Plugin for adding additional content for your posts. Let you to earn money "
1785
+ "from affiliate programs."
1786
+ msgstr ""
1787
+ "Plugin for adding additional content for your posts. Let you to earn money "
1788
+ "from affiliate programs."
1789
+
1790
+ #. Author of the plugin/theme
1791
+ msgid "keywordrush.com"
1792
+ msgstr "keywordrush.com"
1793
+
1794
+ #. Author URI of the plugin/theme
1795
+ msgid "http://www.keywordrush.com"
1796
+ msgstr "http://www.keywordrush.com/en"
1797
+
1798
+ #~ msgid "Товары картинками"
1799
+ #~ msgstr "Products with photos"
1800
+
1801
+ #~ msgid "Только товары с картинками."
1802
+ #~ msgstr "Only products with photos"
1803
+
1804
+ #~ msgid "Сетка"
1805
+ #~ msgstr "Grid"
1806
+
1807
+ #~ msgid "Список"
1808
+ #~ msgstr "List"
1809
+
1810
+ #~ msgid "Tracking ID"
1811
+ #~ msgstr "Tracking ID"
1812
+
1813
+ #~ msgid "Галерея"
1814
+ #~ msgstr "Gallery"
1815
+
1816
+ #~ msgid "Простой"
1817
+ #~ msgstr "Simple"
1818
+
1819
+ #~ msgid "Источник: %s"
1820
+ #~ msgstr "Source: %s"
1821
+
1822
+ #~ msgid "Фото %s на Flickr"
1823
+ #~ msgstr "Photo %s on Flickr"
1824
+
1825
+ #~ msgid "Источник:"
1826
+ #~ msgstr "Source:"
1827
+
1828
+ #~ msgid "Отзывов:"
1829
+ #~ msgstr "Reviews:"
1830
+
1831
+ #~ msgid "Средняя цена"
1832
+ #~ msgstr "Average price"
1833
+
1834
+ #~ msgid "бесплатно"
1835
+ #~ msgstr "free"
1836
+
1837
+ #~ msgid "Отзывы покупателей"
1838
+ #~ msgstr "Customer reviews"
1839
+
1840
+ #~ msgid "Достоинства:"
1841
+ #~ msgstr "Positives:"
1842
+
1843
+ #~ msgid "Недостатки:"
1844
+ #~ msgstr "Disadvantages:"
1845
+
1846
+ #~ msgid "Комментарий:"
1847
+ #~ msgstr "Comment:"
1848
+
1849
+ #~ msgid "Все отзывы на Яндекс.Маркете"
1850
+ #~ msgstr "All reviews on Yandex.Market"
1851
+
1852
+ #~ msgid "Широкий"
1853
+ #~ msgstr "Wide"
1854
+
1855
+ #~ msgid "Плитка"
1856
+ #~ msgstr "Tile"
languages/content-egg.pot ADDED
@@ -0,0 +1,1572 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 Content Egg
2
+ # This file is distributed under the same license as the Content Egg package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Content Egg 1.6.0\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg\n"
7
+ "POT-Creation-Date: 2015-08-27 17:32:48+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+
15
+ #: application/Autoupdate.php:79
16
+ msgid "Новая версия"
17
+ msgstr ""
18
+
19
+ #: application/Installer.php:76
20
+ msgid "Вы используете Wordpress %s. <em>%s</em> требует минимум <strong>Wordpress %s</strong>."
21
+ msgstr ""
22
+
23
+ #: application/Installer.php:80
24
+ msgid "На вашем сервере установлен PHP %s. <em>%s</em> требует минимум <strong>PHP %s</strong>."
25
+ msgstr ""
26
+
27
+ #: application/Installer.php:85
28
+ msgid "Требуется расширение <strong>%s</strong>."
29
+ msgstr ""
30
+
31
+ #: application/Installer.php:91
32
+ msgid "не может быть установлен!"
33
+ msgstr ""
34
+
35
+ #: application/admin/EggMetabox.php:76
36
+ msgid "Настройте и активируйте модули Content Egg плагин."
37
+ msgstr ""
38
+
39
+ #: application/admin/GeneralConfig.php:30 application/admin/PluginAdmin.php:68
40
+ msgid "Настройки"
41
+ msgstr ""
42
+
43
+ #: application/admin/GeneralConfig.php:86
44
+ msgid "Язык сайта"
45
+ msgstr ""
46
+
47
+ #: application/admin/GeneralConfig.php:87
48
+ msgid "Модули, которые имеют поддержку мультиязычности, будут отдавать предпочтение контенту на этом языке. Также эта настройка указывает на язык для локализации шаблонов."
49
+ msgstr ""
50
+
51
+ #: application/admin/LicConfig.php:32
52
+ msgid "Лицензия"
53
+ msgstr ""
54
+
55
+ #: application/admin/LicConfig.php:40
56
+ msgid "Ключ лицензии"
57
+ msgstr ""
58
+
59
+ #: application/admin/LicConfig.php:41
60
+ msgid "Сюда необходимо ввести действующий ключ лицензии. Найти ключ вы можете в своей <a href=\"http://www.keywordrush.com/panel\">панели пользователя</a>. Если у вас еще нет ключа, вы можете приобрести его на <a href=\"http://www.keywordrush.com/contentegg\">официальном сайте</a> плагина."
61
+ msgstr ""
62
+
63
+ #: application/admin/LicConfig.php:48
64
+ msgid "Поле \"Ключ лицензии\" не может быть пустым."
65
+ msgstr ""
66
+
67
+ #: application/admin/LicConfig.php:52
68
+ msgid "Неверный ключ лицензии."
69
+ msgstr ""
70
+
71
+ #: application/admin/LicConfig.php:56
72
+ msgid "Ключ лицензии не принят. Убедитесь, что вы используйте действительный ключ. Если вы верите, что произошла ошибка, пожалуйста, обратитесь в <a href=\"http://www.keywordrush.com/contact\">поддержку</a> плагина."
73
+ msgstr ""
74
+
75
+ #: application/admin/views/_metabox_results.php:9
76
+ #: application/components/ParserModuleConfig.php:46
77
+ #: application/modules/Youtube/YoutubeConfig.php:53
78
+ #: application/modules/Youtube/views/search_panel.php:11
79
+ msgid "Заголовок"
80
+ msgstr ""
81
+
82
+ #: application/admin/views/_metabox_results.php:10
83
+ msgid "Описание"
84
+ msgstr ""
85
+
86
+ #: application/admin/views/_metabox_results.php:13
87
+ msgid "Перейти"
88
+ msgstr ""
89
+
90
+ #: application/admin/views/_metabox_results.php:14
91
+ msgid "Удалить"
92
+ msgstr ""
93
+
94
+ #: application/admin/views/lic_settings.php:2
95
+ msgid "лицензия"
96
+ msgstr ""
97
+
98
+ #: application/admin/views/metabox_general.php:8
99
+ msgid "Введите ключевое слово"
100
+ msgstr ""
101
+
102
+ #: application/admin/views/metabox_general.php:10
103
+ msgid "Найти все"
104
+ msgstr ""
105
+
106
+ #: application/admin/views/metabox_general.php:15
107
+ #: application/admin/views/metabox_module.php:71
108
+ msgid "Добавить все"
109
+ msgstr ""
110
+
111
+ #: application/admin/views/metabox_general.php:16
112
+ msgid "Вы действительно хотите удалить результаты всех модулей?"
113
+ msgstr ""
114
+
115
+ #: application/admin/views/metabox_general.php:16
116
+ #: application/admin/views/metabox_module.php:40
117
+ msgid "Удалить все"
118
+ msgstr ""
119
+
120
+ #: application/admin/views/metabox_module.php:26
121
+ msgid "Шаблон для шорткода"
122
+ msgstr ""
123
+
124
+ #: application/admin/views/metabox_module.php:36
125
+ msgid "Ключевое слово для автоматического обновления данных"
126
+ msgstr ""
127
+
128
+ #: application/admin/views/metabox_module.php:40
129
+ msgid "Вы действительно хотите удалить все результаты?"
130
+ msgstr ""
131
+
132
+ #: application/admin/views/metabox_module.php:45
133
+ msgid "Данные не найдены..."
134
+ msgstr ""
135
+
136
+ #: application/admin/views/metabox_module.php:49
137
+ msgid "Поиск"
138
+ msgstr ""
139
+
140
+ #: application/admin/views/metabox_module.php:55
141
+ msgid "Ключевое слово для поиска"
142
+ msgstr ""
143
+
144
+ #: application/admin/views/metabox_module.php:57
145
+ msgid "Найти"
146
+ msgstr ""
147
+
148
+ #: application/admin/views/metabox_module.php:79
149
+ msgid "Не найдено..."
150
+ msgstr ""
151
+
152
+ #: application/admin/views/metabox_module.php:80
153
+ msgid "Ошибка: "
154
+ msgstr ""
155
+
156
+ #: application/admin/views/settings.php:13
157
+ msgid "Content Egg Настройки"
158
+ msgstr ""
159
+
160
+ #: application/admin/views/settings.php:24
161
+ #: application/admin/views/settings.php:47
162
+ msgid "Общие настройки"
163
+ msgstr ""
164
+
165
+ #: application/admin/views/settings.php:71
166
+ msgid "Условия"
167
+ msgstr ""
168
+
169
+ #: application/admin/views/settings.php:95
170
+ msgid "Множество дополнительных модулей и расширенный функционал."
171
+ msgstr ""
172
+
173
+ #: application/admin/views/settings.php:97
174
+ msgid "Контент модули:"
175
+ msgstr ""
176
+
177
+ #: application/admin/views/settings.php:99
178
+ msgid "Bing картинки"
179
+ msgstr ""
180
+
181
+ #: application/admin/views/settings.php:100
182
+ msgid "Flickr фотографии"
183
+ msgstr ""
184
+
185
+ #: application/admin/views/settings.php:101
186
+ msgid "Google книги"
187
+ msgstr ""
188
+
189
+ #: application/admin/views/settings.php:102
190
+ msgid "Google новости"
191
+ msgstr ""
192
+
193
+ #: application/admin/views/settings.php:103
194
+ msgid "Яндекс.Маркет"
195
+ msgstr ""
196
+
197
+ #: application/admin/views/settings.php:105
198
+ msgid "ВКонтакте новости"
199
+ msgstr ""
200
+
201
+ #: application/admin/views/settings.php:108
202
+ msgid "Монетизация:"
203
+ msgstr ""
204
+
205
+ #: application/admin/views/settings.php:116
206
+ msgid "Узнать больше..."
207
+ msgstr ""
208
+
209
+ #: application/components/AffiliateParserModuleConfig.php:18
210
+ msgid "Автоматическое обновление"
211
+ msgstr ""
212
+
213
+ #: application/components/AffiliateParserModuleConfig.php:19
214
+ msgid "Время жини кэша в секундах, через которое необходимо обновить товары, если задано ключевое слово для обновления. 0 - никогда не обновлять."
215
+ msgstr ""
216
+
217
+ #: application/components/AffiliateParserModuleConfig.php:33
218
+ msgid "Обновить товары"
219
+ msgstr ""
220
+
221
+ #: application/components/AffiliateParserModuleConfig.php:34
222
+ msgid "Время в секундах, через которое необходимо обновить цену, наличие и некоторую другую информацию по товарам. 0 - никогда не обновлять."
223
+ msgstr ""
224
+
225
+ #: application/components/ModuleConfig.php:53
226
+ #: application/components/ModuleConfig.php:59
227
+ msgid "настройки"
228
+ msgstr ""
229
+
230
+ #: application/components/ModuleTemplateManager.php:81
231
+ msgid "[пользовательский]"
232
+ msgstr ""
233
+
234
+ #: application/components/ParserModuleConfig.php:19
235
+ msgid "Включить модуль"
236
+ msgstr ""
237
+
238
+ #: application/components/ParserModuleConfig.php:26
239
+ msgid "Добавить"
240
+ msgstr ""
241
+
242
+ #: application/components/ParserModuleConfig.php:27
243
+ msgid "Куда добавить контент этого модуля? Шорткоды работают всегда в независимости от настройки."
244
+ msgstr ""
245
+
246
+ #: application/components/ParserModuleConfig.php:30
247
+ msgid "В конец поста"
248
+ msgstr ""
249
+
250
+ #: application/components/ParserModuleConfig.php:31
251
+ msgid "В начало поста"
252
+ msgstr ""
253
+
254
+ #: application/components/ParserModuleConfig.php:32
255
+ msgid "Только шорткоды"
256
+ msgstr ""
257
+
258
+ #: application/components/ParserModuleConfig.php:38
259
+ msgid "Шаблон"
260
+ msgstr ""
261
+
262
+ #: application/components/ParserModuleConfig.php:39
263
+ msgid "Шаблон по-умолчанию."
264
+ msgstr ""
265
+
266
+ #: application/components/ParserModuleConfig.php:47
267
+ msgid "Шаблоны могут использовать заголовок при выводе данных."
268
+ msgstr ""
269
+
270
+ #: application/components/ParserModuleConfig.php:57
271
+ msgid "Автоматически установить Featured image для поста."
272
+ msgstr ""
273
+
274
+ #: application/components/ParserModuleConfig.php:60
275
+ msgid "Не устанавливать"
276
+ msgstr ""
277
+
278
+ #: application/components/ParserModuleConfig.php:61
279
+ msgid "Первый элемент"
280
+ msgstr ""
281
+
282
+ #: application/components/ParserModuleConfig.php:62
283
+ msgid "Второй элемент"
284
+ msgstr ""
285
+
286
+ #: application/components/ParserModuleConfig.php:63
287
+ msgid "Случайный элемент"
288
+ msgstr ""
289
+
290
+ #: application/components/ParserModuleConfig.php:64
291
+ msgid "Последний элемент"
292
+ msgstr ""
293
+
294
+ #: application/modules/Aliexpress/AliexpressConfig.php:22
295
+ msgid "Специальный ключ для доступа к Aliexpress API. Получить можно <a target=\"_blank\" href=\"http://portals.aliexpress.com/adcenter/api_setting.htm\">здесь</a>."
296
+ msgstr ""
297
+
298
+ #: application/modules/Aliexpress/AliexpressConfig.php:30
299
+ #: application/modules/Flickr/FlickrConfig.php:29
300
+ #: application/modules/Freebase/FreebaseConfig.php:29
301
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:29
302
+ #: application/modules/Market/MarketConfig.php:29
303
+ #: application/modules/Youtube/YoutubeConfig.php:29
304
+ msgid "Поле \"API Key\" не может быть пустым."
305
+ msgstr ""
306
+
307
+ #: application/modules/Aliexpress/AliexpressConfig.php:37
308
+ msgid "Укажите, если хотите посылать трафик через оригинальную партнерку Aliexpress. Найти можно <a target=\"_blank\" href=\"http://portals.aliexpress.com/track_id_manage.htm\">здесь</a>. Опция должна быть задана до сохранения товаров в базу данных."
309
+ msgstr ""
310
+
311
+ #: application/modules/Aliexpress/AliexpressConfig.php:47
312
+ msgid "Укажите этот параметр, если хотите посылать трафик через одну из CPA-сетей с поддержкой aliexpress и deeplink. Опция должна быть задана до сохранения товаров в базу данных."
313
+ msgstr ""
314
+
315
+ #: application/modules/Aliexpress/AliexpressConfig.php:57
316
+ #: application/modules/Amazon/AmazonConfig.php:66
317
+ #: application/modules/BingImages/BingImagesConfig.php:35
318
+ #: application/modules/Ebay/EbayConfig.php:87
319
+ #: application/modules/Flickr/FlickrConfig.php:35
320
+ #: application/modules/Freebase/FreebaseConfig.php:35
321
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:35
322
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:34
323
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:20
324
+ #: application/modules/Market/MarketConfig.php:48
325
+ #: application/modules/Twitter/TwitterConfig.php:80
326
+ #: application/modules/VkNews/VkNewsConfig.php:20
327
+ #: application/modules/Youtube/YoutubeConfig.php:35
328
+ #: application/modules/Zanox/ZanoxConfig.php:46
329
+ msgid "Результатов"
330
+ msgstr ""
331
+
332
+ #: application/modules/Aliexpress/AliexpressConfig.php:58
333
+ #: application/modules/Amazon/AmazonConfig.php:67
334
+ #: application/modules/Ebay/EbayConfig.php:88
335
+ #: application/modules/Zanox/ZanoxConfig.php:47
336
+ msgid "Количество результатов для одного поискового запроса."
337
+ msgstr ""
338
+
339
+ #: application/modules/Aliexpress/AliexpressConfig.php:67
340
+ #: application/modules/Aliexpress/AliexpressConfig.php:83
341
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:45
342
+ msgid "Поле \"Результатов\" не может быть больше 40."
343
+ msgstr ""
344
+
345
+ #: application/modules/Aliexpress/AliexpressConfig.php:73
346
+ #: application/modules/Amazon/AmazonConfig.php:82
347
+ #: application/modules/Zanox/ZanoxConfig.php:62
348
+ msgid "Результатов для обновления"
349
+ msgstr ""
350
+
351
+ #: application/modules/Aliexpress/AliexpressConfig.php:74
352
+ #: application/modules/Amazon/AmazonConfig.php:83
353
+ #: application/modules/Zanox/ZanoxConfig.php:63
354
+ msgid "Количество результатов для автоматического обновления."
355
+ msgstr ""
356
+
357
+ #: application/modules/Aliexpress/AliexpressConfig.php:89
358
+ msgid "Категория"
359
+ msgstr ""
360
+
361
+ #: application/modules/Aliexpress/AliexpressConfig.php:90
362
+ msgid "Ограничить поиск товаров этой категорией."
363
+ msgstr ""
364
+
365
+ #: application/modules/Aliexpress/AliexpressConfig.php:93
366
+ msgid "Все категории"
367
+ msgstr ""
368
+
369
+ #: application/modules/Aliexpress/AliexpressConfig.php:128
370
+ msgid "Минимальная комиссия"
371
+ msgstr ""
372
+
373
+ #: application/modules/Aliexpress/AliexpressConfig.php:129
374
+ msgid "Минимальная комиссия в процентах. Например, 3"
375
+ msgstr ""
376
+
377
+ #: application/modules/Aliexpress/AliexpressConfig.php:138
378
+ #: application/modules/Amazon/AmazonConfig.php:160
379
+ #: application/modules/Ebay/EbayConfig.php:284
380
+ #: application/modules/Zanox/ZanoxConfig.php:101
381
+ msgid "Минимальная цена"
382
+ msgstr ""
383
+
384
+ #: application/modules/Aliexpress/AliexpressConfig.php:139
385
+ msgid "Должна быть указана в USD. Например, 12.34"
386
+ msgstr ""
387
+
388
+ #: application/modules/Aliexpress/AliexpressConfig.php:148
389
+ #: application/modules/Amazon/AmazonConfig.php:170
390
+ #: application/modules/Ebay/EbayConfig.php:274
391
+ #: application/modules/Zanox/ZanoxConfig.php:111
392
+ msgid "Максимальная цена"
393
+ msgstr ""
394
+
395
+ #: application/modules/Aliexpress/AliexpressConfig.php:149
396
+ msgid "Должна быть указана в USD. Например, 56.78"
397
+ msgstr ""
398
+
399
+ #: application/modules/Aliexpress/AliexpressConfig.php:158
400
+ msgid "Минимальные продажи"
401
+ msgstr ""
402
+
403
+ #: application/modules/Aliexpress/AliexpressConfig.php:159
404
+ msgid "Минимальное число партнерских продаж за последний месяц. Например, 123"
405
+ msgstr ""
406
+
407
+ #: application/modules/Aliexpress/AliexpressConfig.php:168
408
+ msgid "Максимальные продажи"
409
+ msgstr ""
410
+
411
+ #: application/modules/Aliexpress/AliexpressConfig.php:169
412
+ msgid "Максимальное число партнерских продаж за последний месяц. Например, 456"
413
+ msgstr ""
414
+
415
+ #: application/modules/Aliexpress/AliexpressConfig.php:178
416
+ #: application/modules/Ebay/EbayConfig.php:122
417
+ #: application/modules/Flickr/FlickrConfig.php:46
418
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:69
419
+ #: application/modules/Twitter/TwitterConfig.php:96
420
+ #: application/modules/Youtube/YoutubeConfig.php:46
421
+ msgid "Сортировка"
422
+ msgstr ""
423
+
424
+ #: application/modules/Aliexpress/AliexpressConfig.php:182
425
+ msgid "По умолчанию"
426
+ msgstr ""
427
+
428
+ #: application/modules/Aliexpress/AliexpressConfig.php:183
429
+ msgid "Цена от низкой к выскокой"
430
+ msgstr ""
431
+
432
+ #: application/modules/Aliexpress/AliexpressConfig.php:184
433
+ msgid "Цена от высокой к низкой"
434
+ msgstr ""
435
+
436
+ #: application/modules/Aliexpress/AliexpressConfig.php:185
437
+ #: application/modules/Aliexpress/AliexpressConfig.php:195
438
+ msgid "Рейтинг продавца"
439
+ msgstr ""
440
+
441
+ #: application/modules/Aliexpress/AliexpressConfig.php:186
442
+ msgid "Комиссия от низкой к высокой"
443
+ msgstr ""
444
+
445
+ #: application/modules/Aliexpress/AliexpressConfig.php:187
446
+ msgid "Комиссия от высокой к низкой"
447
+ msgstr ""
448
+
449
+ #: application/modules/Aliexpress/AliexpressConfig.php:188
450
+ msgid "Продажи"
451
+ msgstr ""
452
+
453
+ #: application/modules/Aliexpress/AliexpressConfig.php:189
454
+ msgid "Время жизни от низкого к высокому"
455
+ msgstr ""
456
+
457
+ #: application/modules/Aliexpress/AliexpressConfig.php:190
458
+ msgid "Время жизни от высокого к низкому"
459
+ msgstr ""
460
+
461
+ #: application/modules/Aliexpress/AliexpressConfig.php:196
462
+ msgid "Минимальный рейтинг продавца, например, 12"
463
+ msgstr ""
464
+
465
+ #: application/modules/Aliexpress/AliexpressConfig.php:206
466
+ #: application/modules/BingImages/BingImagesConfig.php:71
467
+ #: application/modules/Ebay/EbayConfig.php:337
468
+ #: application/modules/Flickr/FlickrConfig.php:91
469
+ #: application/modules/Freebase/FreebaseConfig.php:51
470
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:51
471
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:124
472
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:36
473
+ #: application/modules/Market/MarketConfig.php:154
474
+ #: application/modules/Twitter/TwitterConfig.php:108
475
+ #: application/modules/VkNews/VkNewsConfig.php:31
476
+ #: application/modules/Zanox/ZanoxConfig.php:153
477
+ msgid "Сохранять картинки"
478
+ msgstr ""
479
+
480
+ #: application/modules/Aliexpress/AliexpressConfig.php:207
481
+ #: application/modules/BingImages/BingImagesConfig.php:72
482
+ #: application/modules/Ebay/EbayConfig.php:338
483
+ #: application/modules/Flickr/FlickrConfig.php:92
484
+ #: application/modules/Freebase/FreebaseConfig.php:52
485
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:52
486
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:125
487
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:37
488
+ #: application/modules/Market/MarketConfig.php:155
489
+ #: application/modules/Twitter/TwitterConfig.php:109
490
+ #: application/modules/VkNews/VkNewsConfig.php:32
491
+ #: application/modules/Zanox/ZanoxConfig.php:154
492
+ msgid "Сохранять картинки на сервер"
493
+ msgstr ""
494
+
495
+ #: application/modules/Aliexpress/AliexpressModule.php:28
496
+ msgid "Добавляет товары aliexpress.com"
497
+ msgstr ""
498
+
499
+ #: application/modules/Amazon/AmazonConfig.php:22
500
+ msgid "Специальный ключ для доступа к Amazon API."
501
+ msgstr ""
502
+
503
+ #: application/modules/Amazon/AmazonConfig.php:30
504
+ msgid "Поле \"Access Key ID\" не может быть пустым."
505
+ msgstr ""
506
+
507
+ #: application/modules/Amazon/AmazonConfig.php:37
508
+ msgid "Еще один специальный ключ для доступа к Amazon API."
509
+ msgstr ""
510
+
511
+ #: application/modules/Amazon/AmazonConfig.php:45
512
+ msgid "Поле \"Secret Access Key\" не может быть пустым."
513
+ msgstr ""
514
+
515
+ #: application/modules/Amazon/AmazonConfig.php:52
516
+ msgid "Связь с Вашим аккаунтом в партнерке. Чтобы получать комиссию от продаж, правильно укажите этот параметр."
517
+ msgstr ""
518
+
519
+ #: application/modules/Amazon/AmazonConfig.php:60
520
+ msgid "Поле \"Tracking ID\" не может быть пустым."
521
+ msgstr ""
522
+
523
+ #: application/modules/Amazon/AmazonConfig.php:76
524
+ #: application/modules/Amazon/AmazonConfig.php:92
525
+ #: application/modules/Freebase/FreebaseConfig.php:45
526
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:30
527
+ #: application/modules/Market/MarketConfig.php:58
528
+ #: application/modules/Twitter/TwitterConfig.php:90
529
+ msgid "Поле \"Результатов\" не может быть больше 10."
530
+ msgstr ""
531
+
532
+ #: application/modules/Amazon/AmazonConfig.php:98
533
+ #: application/modules/Ebay/EbayConfig.php:79
534
+ msgid "Locale"
535
+ msgstr ""
536
+
537
+ #: application/modules/Amazon/AmazonConfig.php:99
538
+ msgid "Филиал amazon. Для каждого филиала необходима отдельная регистрация в соответствующей партнерской программе."
539
+ msgstr ""
540
+
541
+ #: application/modules/Amazon/AmazonConfig.php:106
542
+ msgid "Вид ссылок"
543
+ msgstr ""
544
+
545
+ #: application/modules/Amazon/AmazonConfig.php:107
546
+ msgid "Вид партнерских ссылок. Узнайте больше про amazon <a target=\"_blank\" href=\"https://affiliate-program.amazon.com/gp/associates/help/t2/a11\">90 day cookie</a>."
547
+ msgstr ""
548
+
549
+ #: application/modules/Amazon/AmazonConfig.php:118
550
+ msgid "Категория для поиска"
551
+ msgstr ""
552
+
553
+ #: application/modules/Amazon/AmazonConfig.php:119
554
+ msgid "Список категорий для US Amazon. Для локальных филиалов некоторые категории могут быть недоступны. Если Вы не зададите категорию для поиска, то никакие другие опции фильтрации кроме поиска по ключевому слову (например, минимальная цена или сортировка) работать не будут."
555
+ msgstr ""
556
+
557
+ #: application/modules/Amazon/AmazonConfig.php:126
558
+ msgid "Порядок сортировки"
559
+ msgstr ""
560
+
561
+ #: application/modules/Amazon/AmazonConfig.php:127
562
+ msgid "Варианты сортировки зависят от locale и выбранной категории. Список доступных значений можно найти <a href=\"http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?APPNDX_SortValuesArticle.html\">здесь</a>."
563
+ msgstr ""
564
+
565
+ #: application/modules/Amazon/AmazonConfig.php:136
566
+ msgid "Brouse node"
567
+ msgstr ""
568
+
569
+ #: application/modules/Amazon/AmazonConfig.php:137
570
+ msgid "Целочисленное ID \"узла\" на amazon. Поиск будет произведен только в этом \"узле\"."
571
+ msgstr ""
572
+
573
+ #: application/modules/Amazon/AmazonConfig.php:146
574
+ msgid "Поиск в названии"
575
+ msgstr ""
576
+
577
+ #: application/modules/Amazon/AmazonConfig.php:147
578
+ msgid "Поиск будет произведет только по названиям товаров."
579
+ msgstr ""
580
+
581
+ #: application/modules/Amazon/AmazonConfig.php:153
582
+ msgid "Только Amazon"
583
+ msgstr ""
584
+
585
+ #: application/modules/Amazon/AmazonConfig.php:154
586
+ msgid "Выбрать товары, которые продает Amazon. Другие продавцы исключаются из поиска."
587
+ msgstr ""
588
+
589
+ #: application/modules/Amazon/AmazonConfig.php:161
590
+ msgid "Например, 8.99"
591
+ msgstr ""
592
+
593
+ #: application/modules/Amazon/AmazonConfig.php:171
594
+ msgid "Например, 98.50"
595
+ msgstr ""
596
+
597
+ #: application/modules/Amazon/AmazonConfig.php:180
598
+ msgid "Минимальная скидка"
599
+ msgstr ""
600
+
601
+ #: application/modules/Amazon/AmazonConfig.php:181
602
+ msgid "Выбрать товары со скидкой. Обязательно должна быть задана категория. Обратите внимание, эта опция работает не для всех категорий."
603
+ msgstr ""
604
+
605
+ #: application/modules/Amazon/AmazonConfig.php:184
606
+ msgid "Неважно"
607
+ msgstr ""
608
+
609
+ #: application/modules/Amazon/AmazonConfig.php:205
610
+ msgid "Парсить отзывы"
611
+ msgstr ""
612
+
613
+ #: application/modules/Amazon/AmazonConfig.php:206
614
+ msgid "Парсить отзывы покупателей по товарам. Это замедляет получение данных."
615
+ msgstr ""
616
+
617
+ #: application/modules/Amazon/AmazonConfig.php:212
618
+ msgid "Отзывы в iframe."
619
+ msgstr ""
620
+
621
+ #: application/modules/Amazon/AmazonConfig.php:213
622
+ msgid "Показывать отзывы покупателей в iframe с amazon (отключение этой опции, возможно, нарушает правила партнерской программы amazon)."
623
+ msgstr ""
624
+
625
+ #: application/modules/Amazon/AmazonConfig.php:219
626
+ #: application/modules/Market/MarketConfig.php:122
627
+ msgid "Обрезать отзывы"
628
+ msgstr ""
629
+
630
+ #: application/modules/Amazon/AmazonConfig.php:220
631
+ msgid "Количество символов для одного отзыва. 0 - максимально возможная длина текста."
632
+ msgstr ""
633
+
634
+ #: application/modules/Amazon/AmazonConfig.php:230
635
+ msgid "Товар с отзывами"
636
+ msgstr ""
637
+
638
+ #: application/modules/Amazon/AmazonConfig.php:231
639
+ msgid "Парсить отзывы только для заданного количества товаров."
640
+ msgstr ""
641
+
642
+ #: application/modules/Amazon/AmazonConfig.php:241
643
+ msgid "Парсить отписание"
644
+ msgstr ""
645
+
646
+ #: application/modules/Amazon/AmazonConfig.php:242
647
+ msgid "Парсить описание товаров от продавца."
648
+ msgstr ""
649
+
650
+ #: application/modules/Amazon/AmazonConfig.php:248
651
+ msgid "Вид описания"
652
+ msgstr ""
653
+
654
+ #: application/modules/Amazon/AmazonConfig.php:252
655
+ msgid "Как на Amazon"
656
+ msgstr ""
657
+
658
+ #: application/modules/Amazon/AmazonConfig.php:253
659
+ msgid "Безопасный HTML"
660
+ msgstr ""
661
+
662
+ #: application/modules/Amazon/AmazonConfig.php:254
663
+ msgid "Только разрешенные теги HTML"
664
+ msgstr ""
665
+
666
+ #: application/modules/Amazon/AmazonConfig.php:255
667
+ msgid "Только текст"
668
+ msgstr ""
669
+
670
+ #: application/modules/Amazon/AmazonConfig.php:261
671
+ #: application/modules/Ebay/EbayConfig.php:326
672
+ msgid "Размер описания"
673
+ msgstr ""
674
+
675
+ #: application/modules/Amazon/AmazonConfig.php:262
676
+ #: application/modules/Ebay/EbayConfig.php:327
677
+ msgid "Максимальный размер описания товара. 0 - не обрезать."
678
+ msgstr ""
679
+
680
+ #: application/modules/Amazon/AmazonModule.php:28
681
+ msgid "Добавляет товары amazon."
682
+ msgstr ""
683
+
684
+ #: application/modules/Amazon/views/search_panel.php:2
685
+ msgid "Мин. скидка"
686
+ msgstr ""
687
+
688
+ #: application/modules/Amazon/views/search_panel.php:3
689
+ msgid "5%"
690
+ msgstr ""
691
+
692
+ #: application/modules/Amazon/views/search_panel.php:4
693
+ msgid "10%"
694
+ msgstr ""
695
+
696
+ #: application/modules/Amazon/views/search_panel.php:5
697
+ msgid "15%"
698
+ msgstr ""
699
+
700
+ #: application/modules/Amazon/views/search_panel.php:6
701
+ msgid "20%"
702
+ msgstr ""
703
+
704
+ #: application/modules/Amazon/views/search_panel.php:7
705
+ msgid "25%"
706
+ msgstr ""
707
+
708
+ #: application/modules/Amazon/views/search_panel.php:8
709
+ msgid "30%"
710
+ msgstr ""
711
+
712
+ #: application/modules/Amazon/views/search_panel.php:9
713
+ msgid "35%"
714
+ msgstr ""
715
+
716
+ #: application/modules/Amazon/views/search_panel.php:10
717
+ msgid "40%"
718
+ msgstr ""
719
+
720
+ #: application/modules/Amazon/views/search_panel.php:11
721
+ msgid "50%"
722
+ msgstr ""
723
+
724
+ #: application/modules/Amazon/views/search_panel.php:12
725
+ msgid "60%"
726
+ msgstr ""
727
+
728
+ #: application/modules/Amazon/views/search_panel.php:13
729
+ msgid "70%"
730
+ msgstr ""
731
+
732
+ #: application/modules/Amazon/views/search_panel.php:14
733
+ msgid "80%"
734
+ msgstr ""
735
+
736
+ #: application/modules/Amazon/views/search_panel.php:15
737
+ msgid "90%"
738
+ msgstr ""
739
+
740
+ #: application/modules/BingImages/BingImagesConfig.php:21
741
+ msgid "Ключ доступа к Bing API. Получить можно <a href=\"https://datamarket.azure.com/account/keys\">здесь</a> (потребуется аккаунт в bing)."
742
+ msgstr ""
743
+
744
+ #: application/modules/BingImages/BingImagesConfig.php:29
745
+ #: application/modules/Twitter/TwitterConfig.php:29
746
+ #: application/modules/Twitter/TwitterConfig.php:44
747
+ #: application/modules/Twitter/TwitterConfig.php:59
748
+ #: application/modules/Twitter/TwitterConfig.php:74
749
+ msgid "Поле \"Account Key\" не может быть пустым."
750
+ msgstr ""
751
+
752
+ #: application/modules/BingImages/BingImagesConfig.php:36
753
+ msgid "Количество результатов для одного запроса."
754
+ msgstr ""
755
+
756
+ #: application/modules/BingImages/BingImagesConfig.php:45
757
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:44
758
+ msgid "Поле \"Результатов\" не может быть больше 8."
759
+ msgstr ""
760
+
761
+ #: application/modules/BingImages/BingImagesConfig.php:51
762
+ msgid "Фильтр"
763
+ msgstr ""
764
+
765
+ #: application/modules/BingImages/BingImagesConfig.php:55
766
+ #: application/modules/BingImages/views/search_panel.php:2
767
+ msgid "Без фильтра"
768
+ msgstr ""
769
+
770
+ #: application/modules/BingImages/BingImagesConfig.php:56
771
+ #: application/modules/BingImages/views/search_panel.php:3
772
+ msgid "Маленькие изображения"
773
+ msgstr ""
774
+
775
+ #: application/modules/BingImages/BingImagesConfig.php:57
776
+ #: application/modules/BingImages/views/search_panel.php:4
777
+ msgid "Средние изображения"
778
+ msgstr ""
779
+
780
+ #: application/modules/BingImages/BingImagesConfig.php:58
781
+ #: application/modules/BingImages/views/search_panel.php:5
782
+ msgid "Большие изображения"
783
+ msgstr ""
784
+
785
+ #: application/modules/BingImages/BingImagesConfig.php:59
786
+ #: application/modules/BingImages/views/search_panel.php:6
787
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:56
788
+ msgid "Цветные"
789
+ msgstr ""
790
+
791
+ #: application/modules/BingImages/BingImagesConfig.php:60
792
+ #: application/modules/BingImages/views/search_panel.php:7
793
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:55
794
+ msgid "Черно-белые"
795
+ msgstr ""
796
+
797
+ #: application/modules/BingImages/BingImagesConfig.php:61
798
+ #: application/modules/BingImages/views/search_panel.php:8
799
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:104
800
+ msgid "Фотографии"
801
+ msgstr ""
802
+
803
+ #: application/modules/BingImages/BingImagesConfig.php:62
804
+ #: application/modules/BingImages/views/search_panel.php:9
805
+ msgid "Графика и иллюстрации"
806
+ msgstr ""
807
+
808
+ #: application/modules/BingImages/BingImagesConfig.php:63
809
+ #: application/modules/BingImages/views/search_panel.php:10
810
+ msgid "Содержит лица"
811
+ msgstr ""
812
+
813
+ #: application/modules/BingImages/BingImagesConfig.php:64
814
+ #: application/modules/BingImages/views/search_panel.php:11
815
+ msgid "Портреты"
816
+ msgstr ""
817
+
818
+ #: application/modules/BingImages/BingImagesConfig.php:65
819
+ #: application/modules/BingImages/views/search_panel.php:12
820
+ msgid "Не содержит лиц"
821
+ msgstr ""
822
+
823
+ #: application/modules/BingImages/BingImagesConfig.php:79
824
+ msgid "Ограничить поиск только этим доменом. Например, задайте: wikimedia.org"
825
+ msgstr ""
826
+
827
+ #: application/modules/BingImages/templates/data_simple.php:5
828
+ msgid "Simple"
829
+ msgstr ""
830
+
831
+ #: application/modules/BingImages/templates/data_simple.php:18
832
+ #: application/modules/GoogleImages/templates/data_simple.php:20
833
+ msgid "Source: %s"
834
+ msgstr ""
835
+
836
+ #: application/modules/Ebay/EbayConfig.php:22
837
+ msgid "Ваш ID для доступа к eBay API. Поучить ключ вы можете в <a href=\"http://developer.ebay.com/join\">eBay Developers Program</a>."
838
+ msgstr ""
839
+
840
+ #: application/modules/Ebay/EbayConfig.php:30
841
+ msgid "Поле \"Application ID (AppID)\" не может быть пустым."
842
+ msgstr ""
843
+
844
+ #: application/modules/Ebay/EbayConfig.php:37
845
+ msgid "Это связь с партнерской программой EPN. Campaign ID валидный для всех программ, в которые вы были приняты на EPN. Если не задано - комиссия за продажи начисляться не будет."
846
+ msgstr ""
847
+
848
+ #: application/modules/Ebay/EbayConfig.php:46
849
+ msgid "EPN Custom ID (канал)"
850
+ msgstr ""
851
+
852
+ #: application/modules/Ebay/EbayConfig.php:47
853
+ msgid "Любое слово, например, имя домена. Custom ID будет включен в отчеты по продажам на EPN, таким образом, вы сможете дополнительно отслеживать трафик."
854
+ msgstr ""
855
+
856
+ #: application/modules/Ebay/EbayConfig.php:58
857
+ msgid "Skimlinks Site ID"
858
+ msgstr ""
859
+
860
+ #: application/modules/Ebay/EbayConfig.php:59
861
+ msgid "Указывайте, если хотите слать трафик через <a href=\"http://www.keywordrush.com/go/skimlinks\">Skimlinks</a>. ID для соотвествущего домена можно найти <a href=\"https://hub.skimlinks.com/account\">здесь</a>."
862
+ msgstr ""
863
+
864
+ #: application/modules/Ebay/EbayConfig.php:69
865
+ msgid "Viglink ID"
866
+ msgstr ""
867
+
868
+ #: application/modules/Ebay/EbayConfig.php:70
869
+ msgid "Указывайте, если хотите слать трафик через <a href=\"http://www.keywordrush.com/go/viglink\">Viglink</a>. Ваш ID можно найти <a href=\"http://www.viglink.com/install\">здесь</a>, он одинаковый для всех доменов."
870
+ msgstr ""
871
+
872
+ #: application/modules/Ebay/EbayConfig.php:80
873
+ msgid "Локальный сайт eBay. Для каждого локального филиала необходима отдельная регистрация в соответствующей партнерской программе."
874
+ msgstr ""
875
+
876
+ #: application/modules/Ebay/EbayConfig.php:97
877
+ msgid "Поле \"Результатов\" не может быть больше 100."
878
+ msgstr ""
879
+
880
+ #: application/modules/Ebay/EbayConfig.php:130
881
+ msgid "Время завершения"
882
+ msgstr ""
883
+
884
+ #: application/modules/Ebay/EbayConfig.php:131
885
+ msgid "Срок жизни лотов в секундах. Будут выбраны только лоты, которые закроются не позже указанного времени."
886
+ msgstr ""
887
+
888
+ #: application/modules/Ebay/EbayConfig.php:140
889
+ msgid "Категориия"
890
+ msgstr ""
891
+
892
+ #: application/modules/Ebay/EbayConfig.php:141
893
+ msgid "ID категории для поиска. ID категорий можно найти в URL категорий на <a href=\"http://www.ebay.com/sch/allcategories/all-categories\">этой странице</a>. Можно задать до трех категорий через запятую, например, \"2195,2218,20094\"."
894
+ msgstr ""
895
+
896
+ #: application/modules/Ebay/EbayConfig.php:150
897
+ msgid "Искать в описании"
898
+ msgstr ""
899
+
900
+ #: application/modules/Ebay/EbayConfig.php:151
901
+ msgid "Включить поиск по описание товара в дополнение к названию товара. Это займет больше времени, чем поиск только по названию."
902
+ msgstr ""
903
+
904
+ #: application/modules/Ebay/EbayConfig.php:157
905
+ msgid "Логика поиска"
906
+ msgstr ""
907
+
908
+ #: application/modules/Ebay/EbayConfig.php:165
909
+ msgid "Состояние товара"
910
+ msgstr ""
911
+
912
+ #: application/modules/Ebay/EbayConfig.php:173
913
+ msgid "Исключить категорию"
914
+ msgstr ""
915
+
916
+ #: application/modules/Ebay/EbayConfig.php:174
917
+ msgid "ID категории, которую необходимо исключить при поиске. ID категорий можно найти в URL категорий на <a href=\"http://www.ebay.com/sch/allcategories/all-categories\">этой странице</a>. Можно задать до 25 категорий через запятую, например, \"2195,2218,20094\"."
918
+ msgstr ""
919
+
920
+ #: application/modules/Ebay/EbayConfig.php:183
921
+ msgid "Минимальный ретинг продавца"
922
+ msgstr ""
923
+
924
+ #: application/modules/Ebay/EbayConfig.php:191
925
+ msgid "Best Offer"
926
+ msgstr ""
927
+
928
+ #: application/modules/Ebay/EbayConfig.php:192
929
+ msgid "Только \"Best Offer\" лоты."
930
+ msgstr ""
931
+
932
+ #: application/modules/Ebay/EbayConfig.php:198
933
+ msgid "Featured"
934
+ msgstr ""
935
+
936
+ #: application/modules/Ebay/EbayConfig.php:199
937
+ msgid "Только \"Featured\" лоты."
938
+ msgstr ""
939
+
940
+ #: application/modules/Ebay/EbayConfig.php:205
941
+ msgid "Free Shipping"
942
+ msgstr ""
943
+
944
+ #: application/modules/Ebay/EbayConfig.php:206
945
+ msgid "Только лоты с бесплатной доставкой."
946
+ msgstr ""
947
+
948
+ #: application/modules/Ebay/EbayConfig.php:212
949
+ msgid "Local Pickup"
950
+ msgstr ""
951
+
952
+ #: application/modules/Ebay/EbayConfig.php:213
953
+ msgid "Только лоты с опцией \"local pickup\"."
954
+ msgstr ""
955
+
956
+ #: application/modules/Ebay/EbayConfig.php:219
957
+ msgid "Get It Fast"
958
+ msgstr ""
959
+
960
+ #: application/modules/Ebay/EbayConfig.php:220
961
+ msgid "Только \"Get It Fast\" лоты."
962
+ msgstr ""
963
+
964
+ #: application/modules/Ebay/EbayConfig.php:226
965
+ msgid "Top-rated seller"
966
+ msgstr ""
967
+
968
+ #: application/modules/Ebay/EbayConfig.php:227
969
+ msgid "Только товары от \"Top-rated\" продавцов."
970
+ msgstr ""
971
+
972
+ #: application/modules/Ebay/EbayConfig.php:233
973
+ msgid "Спрятать дубли"
974
+ msgstr ""
975
+
976
+ #: application/modules/Ebay/EbayConfig.php:234
977
+ msgid "Отфильтровать похожие лоты."
978
+ msgstr ""
979
+
980
+ #: application/modules/Ebay/EbayConfig.php:240
981
+ msgid "Тип аукциона"
982
+ msgstr ""
983
+
984
+ #: application/modules/Ebay/EbayConfig.php:254
985
+ msgid "Максимум ставок"
986
+ msgstr ""
987
+
988
+ #: application/modules/Ebay/EbayConfig.php:255
989
+ msgid "Например, 10"
990
+ msgstr ""
991
+
992
+ #: application/modules/Ebay/EbayConfig.php:264
993
+ msgid "Минимум ставок"
994
+ msgstr ""
995
+
996
+ #: application/modules/Ebay/EbayConfig.php:265
997
+ msgid "Например, 3"
998
+ msgstr ""
999
+
1000
+ #: application/modules/Ebay/EbayConfig.php:275
1001
+ msgid "Например, 300.50"
1002
+ msgstr ""
1003
+
1004
+ #: application/modules/Ebay/EbayConfig.php:285
1005
+ msgid "Например, 10.98"
1006
+ msgstr ""
1007
+
1008
+ #: application/modules/Ebay/EbayConfig.php:294
1009
+ msgid "Варианты оплаты"
1010
+ msgstr ""
1011
+
1012
+ #: application/modules/Ebay/EbayConfig.php:319
1013
+ msgid "Получить описание"
1014
+ msgstr ""
1015
+
1016
+ #: application/modules/Ebay/EbayConfig.php:320
1017
+ msgid "Получить описание товара. Требует дополнительных запросов к eBay API, это замедляет работу поиска. Описание будет запрошено не более чем для 20 первых товаров за один поиск."
1018
+ msgstr ""
1019
+
1020
+ #: application/modules/Ebay/EbayModule.php:30
1021
+ msgid "Добавляет товары eBay. Поддерживает различные локальные сайты. Несколько вариантов монетизации трафика."
1022
+ msgstr ""
1023
+
1024
+ #: application/modules/Flickr/FlickrConfig.php:21
1025
+ msgid "Ключ для использования Flickr API. Получить можно <a href=\"http://www.flickr.com/services/api/misc.api_keys.html\">здесь</a>."
1026
+ msgstr ""
1027
+
1028
+ #: application/modules/Flickr/FlickrConfig.php:36
1029
+ #: application/modules/Freebase/FreebaseConfig.php:36
1030
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:36
1031
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:21
1032
+ #: application/modules/Market/MarketConfig.php:49
1033
+ #: application/modules/Twitter/TwitterConfig.php:81
1034
+ #: application/modules/VkNews/VkNewsConfig.php:21
1035
+ #: application/modules/Youtube/YoutubeConfig.php:36
1036
+ msgid "Количество результатов для одного запроса"
1037
+ msgstr ""
1038
+
1039
+ #: application/modules/Flickr/FlickrConfig.php:50
1040
+ #: application/modules/Flickr/views/search_panel.php:10
1041
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:73
1042
+ #: application/modules/Youtube/YoutubeConfig.php:52
1043
+ #: application/modules/Youtube/views/search_panel.php:10
1044
+ msgid "Релевантность"
1045
+ msgstr ""
1046
+
1047
+ #: application/modules/Flickr/FlickrConfig.php:51
1048
+ #: application/modules/Flickr/views/search_panel.php:11
1049
+ msgid "Дата поста"
1050
+ msgstr ""
1051
+
1052
+ #: application/modules/Flickr/FlickrConfig.php:52
1053
+ #: application/modules/Flickr/views/search_panel.php:12
1054
+ msgid "Дата съемки"
1055
+ msgstr ""
1056
+
1057
+ #: application/modules/Flickr/FlickrConfig.php:53
1058
+ #: application/modules/Flickr/views/search_panel.php:13
1059
+ msgid "Сначала интересные"
1060
+ msgstr ""
1061
+
1062
+ #: application/modules/Flickr/FlickrConfig.php:59
1063
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:20
1064
+ #: application/modules/Youtube/YoutubeConfig.php:60
1065
+ msgid "Тип лицензии"
1066
+ msgstr ""
1067
+
1068
+ #: application/modules/Flickr/FlickrConfig.php:60
1069
+ msgid "Многие фотографии на Flickr загружены с лицензией Creative Commons. Подробнее <a href=\"http://www.flickr.com/creativecommons/\">здесь</a>."
1070
+ msgstr ""
1071
+
1072
+ #: application/modules/Flickr/FlickrConfig.php:63
1073
+ #: application/modules/Flickr/views/search_panel.php:2
1074
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:24
1075
+ #: application/modules/GoogleImages/views/search_panel.php:2
1076
+ #: application/modules/Youtube/YoutubeConfig.php:64
1077
+ #: application/modules/Youtube/views/search_panel.php:2
1078
+ msgid "Любая лицензия"
1079
+ msgstr ""
1080
+
1081
+ #: application/modules/Flickr/FlickrConfig.php:64
1082
+ #: application/modules/Flickr/views/search_panel.php:3
1083
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:25
1084
+ #: application/modules/GoogleImages/views/search_panel.php:3
1085
+ msgid "Любая Сreative Сommons"
1086
+ msgstr ""
1087
+
1088
+ #: application/modules/Flickr/FlickrConfig.php:65
1089
+ #: application/modules/Flickr/views/search_panel.php:4
1090
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:26
1091
+ #: application/modules/GoogleImages/views/search_panel.php:4
1092
+ msgid "Разрешено коммерческое использование"
1093
+ msgstr ""
1094
+
1095
+ #: application/modules/Flickr/FlickrConfig.php:66
1096
+ #: application/modules/Flickr/views/search_panel.php:5
1097
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:27
1098
+ #: application/modules/GoogleImages/views/search_panel.php:5
1099
+ msgid "Разрешено изменение"
1100
+ msgstr ""
1101
+
1102
+ #: application/modules/Flickr/FlickrConfig.php:67
1103
+ #: application/modules/Flickr/views/search_panel.php:6
1104
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:28
1105
+ #: application/modules/GoogleImages/views/search_panel.php:6
1106
+ msgid "Коммерческое использование и изменение"
1107
+ msgstr ""
1108
+
1109
+ #: application/modules/Flickr/FlickrConfig.php:73
1110
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:84
1111
+ msgid "Размер"
1112
+ msgstr ""
1113
+
1114
+ #: application/modules/Flickr/FlickrConfig.php:77
1115
+ msgid "75x75 пикселов"
1116
+ msgstr ""
1117
+
1118
+ #: application/modules/Flickr/FlickrConfig.php:78
1119
+ msgid "150x150 пикселов"
1120
+ msgstr ""
1121
+
1122
+ #: application/modules/Flickr/FlickrConfig.php:79
1123
+ msgid "100 пикселов по длинной стороне"
1124
+ msgstr ""
1125
+
1126
+ #: application/modules/Flickr/FlickrConfig.php:80
1127
+ msgid "240 пикселов по длинной стороне"
1128
+ msgstr ""
1129
+
1130
+ #: application/modules/Flickr/FlickrConfig.php:81
1131
+ msgid "320 пикселов по длинной стороне"
1132
+ msgstr ""
1133
+
1134
+ #: application/modules/Flickr/FlickrConfig.php:82
1135
+ msgid "500 пикселов по длинной стороне"
1136
+ msgstr ""
1137
+
1138
+ #: application/modules/Flickr/FlickrConfig.php:83
1139
+ msgid "640 пикселов по длинной стороне"
1140
+ msgstr ""
1141
+
1142
+ #: application/modules/Flickr/FlickrConfig.php:84
1143
+ msgid "800 пикселов по длинной стороне"
1144
+ msgstr ""
1145
+
1146
+ #: application/modules/Flickr/FlickrConfig.php:85
1147
+ msgid "1024 пикселов по длинной стороне"
1148
+ msgstr ""
1149
+
1150
+ #: application/modules/Flickr/FlickrConfig.php:98
1151
+ #: application/modules/Freebase/FreebaseConfig.php:58
1152
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:58
1153
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:131
1154
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:43
1155
+ #: application/modules/VkNews/VkNewsConfig.php:38
1156
+ #: application/modules/Youtube/YoutubeConfig.php:72
1157
+ #: application/modules/Zanox/ZanoxConfig.php:160
1158
+ msgid "Обрезать описание"
1159
+ msgstr ""
1160
+
1161
+ #: application/modules/Flickr/FlickrConfig.php:99
1162
+ #: application/modules/Freebase/FreebaseConfig.php:59
1163
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:59
1164
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:132
1165
+ #: application/modules/GoogleNews/GoogleNewsConfig.php:44
1166
+ #: application/modules/VkNews/VkNewsConfig.php:39
1167
+ #: application/modules/Youtube/YoutubeConfig.php:73
1168
+ #: application/modules/Zanox/ZanoxConfig.php:161
1169
+ msgid "Размер описания в символах (0 - не обрезать)"
1170
+ msgstr ""
1171
+
1172
+ #: application/modules/Flickr/FlickrConfig.php:110
1173
+ msgid "Ограничить поиск только этим пользователем Flickr"
1174
+ msgstr ""
1175
+
1176
+ #: application/modules/Flickr/templates/data_justified_gallery.php:62
1177
+ msgid "Фото: %s на Flickr"
1178
+ msgstr ""
1179
+
1180
+ #: application/modules/Freebase/FreebaseConfig.php:21
1181
+ msgid "Ключ для доступа к API. Получить можно в Google <a href=\"http://code.google.com/apis/console\">API консоли</a>."
1182
+ msgstr ""
1183
+
1184
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:21
1185
+ #: application/modules/Youtube/YoutubeConfig.php:21
1186
+ msgid "Ключ для доступа к API. Получить можно в Google <a href=\"http://code.google.com/apis/console\">API консоли</a>"
1187
+ msgstr ""
1188
+
1189
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:74
1190
+ msgid "Новизна"
1191
+ msgstr ""
1192
+
1193
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:80
1194
+ msgid "Тип издания"
1195
+ msgstr ""
1196
+
1197
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:84
1198
+ msgid "Любые"
1199
+ msgstr ""
1200
+
1201
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:85
1202
+ msgid "Книги"
1203
+ msgstr ""
1204
+
1205
+ #: application/modules/GoogleBooks/GoogleBooksConfig.php:86
1206
+ msgid "Журналы"
1207
+ msgstr ""
1208
+
1209
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:21
1210
+ msgid "Поиск изображений, которые можно использовать. Подробнее <a href=\"https://support.google.com/websearch/answer/29508\">здесь</a>."
1211
+ msgstr ""
1212
+
1213
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:35
1214
+ msgid "Количество результатов для одного запроса. Не может быть больше 8."
1215
+ msgstr ""
1216
+
1217
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:50
1218
+ msgid "Цвет"
1219
+ msgstr ""
1220
+
1221
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:54
1222
+ msgid "Любого цвета"
1223
+ msgstr ""
1224
+
1225
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:62
1226
+ msgid "Преобладание цвета"
1227
+ msgstr ""
1228
+
1229
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:66
1230
+ msgid "Любой цвет"
1231
+ msgstr ""
1232
+
1233
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:67
1234
+ msgid "Черный"
1235
+ msgstr ""
1236
+
1237
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:68
1238
+ msgid "Синий"
1239
+ msgstr ""
1240
+
1241
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:69
1242
+ msgid "Коричневый"
1243
+ msgstr ""
1244
+
1245
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:70
1246
+ msgid "Серый"
1247
+ msgstr ""
1248
+
1249
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:71
1250
+ msgid "Зеленый"
1251
+ msgstr ""
1252
+
1253
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:72
1254
+ msgid "Оранжевый"
1255
+ msgstr ""
1256
+
1257
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:73
1258
+ msgid "Розовый"
1259
+ msgstr ""
1260
+
1261
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:74
1262
+ msgid "Фиолетовый"
1263
+ msgstr ""
1264
+
1265
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:75
1266
+ msgid "Красный"
1267
+ msgstr ""
1268
+
1269
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:76
1270
+ msgid "Бирюзовый"
1271
+ msgstr ""
1272
+
1273
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:77
1274
+ msgid "Белый"
1275
+ msgstr ""
1276
+
1277
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:78
1278
+ msgid "Желтый"
1279
+ msgstr ""
1280
+
1281
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:88
1282
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:102
1283
+ #: application/modules/GoogleImages/views/search_panel.php:11
1284
+ msgid "Любого размера"
1285
+ msgstr ""
1286
+
1287
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:89
1288
+ #: application/modules/GoogleImages/views/search_panel.php:12
1289
+ msgid "Маленькие"
1290
+ msgstr ""
1291
+
1292
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:90
1293
+ #: application/modules/GoogleImages/views/search_panel.php:13
1294
+ msgid "Средние"
1295
+ msgstr ""
1296
+
1297
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:91
1298
+ #: application/modules/GoogleImages/views/search_panel.php:14
1299
+ msgid "Большие"
1300
+ msgstr ""
1301
+
1302
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:92
1303
+ #: application/modules/GoogleImages/views/search_panel.php:15
1304
+ msgid "Огромные"
1305
+ msgstr ""
1306
+
1307
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:98
1308
+ msgid "Тип"
1309
+ msgstr ""
1310
+
1311
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:103
1312
+ msgid "Лица"
1313
+ msgstr ""
1314
+
1315
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:105
1316
+ msgid "Клип-арт"
1317
+ msgstr ""
1318
+
1319
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:106
1320
+ msgid "Ч/б рисунки"
1321
+ msgstr ""
1322
+
1323
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:112
1324
+ msgid "Безопасный поиск"
1325
+ msgstr ""
1326
+
1327
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:116
1328
+ msgid "Включен"
1329
+ msgstr ""
1330
+
1331
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:117
1332
+ msgid "Модерация"
1333
+ msgstr ""
1334
+
1335
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:118
1336
+ msgid "Отключен"
1337
+ msgstr ""
1338
+
1339
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:143
1340
+ msgid "Ограничить поиск только этим доменом. Например, задайте: photobucket.com"
1341
+ msgstr ""
1342
+
1343
+ #: application/modules/Market/MarketConfig.php:21
1344
+ msgid "Ключ для доступа к Яндекс Маркет API. Отправить запрос на получение можно <a href=\"http://feedback2.yandex.ru/api-market-content/key/\">здесь</a>."
1345
+ msgstr ""
1346
+
1347
+ #: application/modules/Market/MarketConfig.php:35
1348
+ #: application/modules/Zanox/ZanoxConfig.php:90
1349
+ msgid "Регион"
1350
+ msgstr ""
1351
+
1352
+ #: application/modules/Market/MarketConfig.php:39
1353
+ msgid "Россия"
1354
+ msgstr ""
1355
+
1356
+ #: application/modules/Market/MarketConfig.php:40
1357
+ msgid "Украина"
1358
+ msgstr ""
1359
+
1360
+ #: application/modules/Market/MarketConfig.php:41
1361
+ msgid "Казахстан"
1362
+ msgstr ""
1363
+
1364
+ #: application/modules/Market/MarketConfig.php:42
1365
+ msgid "Беларусь"
1366
+ msgstr ""
1367
+
1368
+ #: application/modules/Market/MarketConfig.php:64
1369
+ msgid "Предложения"
1370
+ msgstr ""
1371
+
1372
+ #: application/modules/Market/MarketConfig.php:65
1373
+ msgid "Получить список предложений на модель."
1374
+ msgstr ""
1375
+
1376
+ #: application/modules/Market/MarketConfig.php:71
1377
+ msgid "Количество предложений"
1378
+ msgstr ""
1379
+
1380
+ #: application/modules/Market/MarketConfig.php:81
1381
+ msgid "Поле \"Количество предложений\" не может быть больше 30."
1382
+ msgstr ""
1383
+
1384
+ #: application/modules/Market/MarketConfig.php:87
1385
+ msgid "Отзывы"
1386
+ msgstr ""
1387
+
1388
+ #: application/modules/Market/MarketConfig.php:88
1389
+ msgid "Получить отзывы о модели."
1390
+ msgstr ""
1391
+
1392
+ #: application/modules/Market/MarketConfig.php:94
1393
+ msgid "Количество отзывов"
1394
+ msgstr ""
1395
+
1396
+ #: application/modules/Market/MarketConfig.php:104
1397
+ msgid "Поле \"Количество отзывов\" не может быть больше 30."
1398
+ msgstr ""
1399
+
1400
+ #: application/modules/Market/MarketConfig.php:110
1401
+ msgid "Сортировка отзывов"
1402
+ msgstr ""
1403
+
1404
+ #: application/modules/Market/MarketConfig.php:114
1405
+ msgid "Сортировка по оценке пользователем модели"
1406
+ msgstr ""
1407
+
1408
+ #: application/modules/Market/MarketConfig.php:115
1409
+ msgid "Сортировка по дате написания отзыва"
1410
+ msgstr ""
1411
+
1412
+ #: application/modules/Market/MarketConfig.php:116
1413
+ msgid "Сортировка по полезности отзыва"
1414
+ msgstr ""
1415
+
1416
+ #: application/modules/Market/MarketConfig.php:123
1417
+ msgid "Размер отзывов в символах (0 - не обрезать)"
1418
+ msgstr ""
1419
+
1420
+ #: application/modules/Market/MarketModule.php:28
1421
+ msgid "Добавляет товары из русскоязычного каталога Яндекс.Маркет"
1422
+ msgstr ""
1423
+
1424
+ #: application/modules/Market/templates/data_item.php:130
1425
+ msgid "All reviews on Yandex.Market"
1426
+ msgstr ""
1427
+
1428
+ #: application/modules/Twitter/TwitterConfig.php:21
1429
+ #: application/modules/Twitter/TwitterConfig.php:36
1430
+ #: application/modules/Twitter/TwitterConfig.php:51
1431
+ #: application/modules/Twitter/TwitterConfig.php:66
1432
+ msgid "Получить можно <a href=\"https://dev.twitter.com/apps/\">здесь</a>."
1433
+ msgstr ""
1434
+
1435
+ #: application/modules/Twitter/TwitterConfig.php:100
1436
+ #: application/modules/Twitter/views/search_panel.php:2
1437
+ msgid "Новые"
1438
+ msgstr ""
1439
+
1440
+ #: application/modules/Twitter/TwitterConfig.php:101
1441
+ #: application/modules/Twitter/views/search_panel.php:3
1442
+ msgid "Популярные"
1443
+ msgstr ""
1444
+
1445
+ #: application/modules/Twitter/TwitterConfig.php:102
1446
+ #: application/modules/Twitter/views/search_panel.php:4
1447
+ msgid "Микс"
1448
+ msgstr ""
1449
+
1450
+ #: application/modules/VkNews/VkNewsModule.php:25
1451
+ msgid "Добавляет новости из русскоязычной социальной сети vk.com"
1452
+ msgstr ""
1453
+
1454
+ #: application/modules/Youtube/YoutubeConfig.php:50
1455
+ #: application/modules/Youtube/views/search_panel.php:8
1456
+ msgid "Дата"
1457
+ msgstr ""
1458
+
1459
+ #: application/modules/Youtube/YoutubeConfig.php:51
1460
+ #: application/modules/Youtube/views/search_panel.php:9
1461
+ msgid "Рейтинг"
1462
+ msgstr ""
1463
+
1464
+ #: application/modules/Youtube/YoutubeConfig.php:54
1465
+ #: application/modules/Youtube/views/search_panel.php:12
1466
+ msgid "Просмотры"
1467
+ msgstr ""
1468
+
1469
+ #: application/modules/Youtube/YoutubeConfig.php:61
1470
+ msgid "Многие видео на Youtube загружены с лицензией Creative Commons. <a href=\"http://www.google.com/support/youtube/bin/answer.py?answer=1284989\">Узнать больше</a>."
1471
+ msgstr ""
1472
+
1473
+ #: application/modules/Youtube/YoutubeConfig.php:65
1474
+ msgid "Сreative Сommons лицензия"
1475
+ msgstr ""
1476
+
1477
+ #: application/modules/Youtube/YoutubeConfig.php:66
1478
+ #: application/modules/Youtube/views/search_panel.php:4
1479
+ msgid "Стандартная лицензия"
1480
+ msgstr ""
1481
+
1482
+ #: application/modules/Youtube/views/search_panel.php:3
1483
+ msgid "Сreative Сommons"
1484
+ msgstr ""
1485
+
1486
+ #: application/modules/Zanox/ZanoxConfig.php:22
1487
+ msgid "Специальный ключ для доступа к Zanox API, а также ваша связь с партнерской программой."
1488
+ msgstr ""
1489
+
1490
+ #: application/modules/Zanox/ZanoxConfig.php:30
1491
+ msgid "Поле \"Connect ID\" не может быть пустым."
1492
+ msgstr ""
1493
+
1494
+ #: application/modules/Zanox/ZanoxConfig.php:56
1495
+ #: application/modules/Zanox/ZanoxConfig.php:72
1496
+ msgid "Поле \"Результатов\" не может быть больше 50."
1497
+ msgstr ""
1498
+
1499
+ #: application/modules/Zanox/ZanoxConfig.php:78
1500
+ msgid "Тип поиска"
1501
+ msgstr ""
1502
+
1503
+ #: application/modules/Zanox/ZanoxConfig.php:79
1504
+ msgid "\"Автоматически\" означает, что тип поиска будет выбран в зависимости от длины поисковой фразы."
1505
+ msgstr ""
1506
+
1507
+ #: application/modules/Zanox/ZanoxConfig.php:82
1508
+ msgid "Автоматически"
1509
+ msgstr ""
1510
+
1511
+ #: application/modules/Zanox/ZanoxConfig.php:83
1512
+ msgid "Фраза"
1513
+ msgstr ""
1514
+
1515
+ #: application/modules/Zanox/ZanoxConfig.php:84
1516
+ msgid "Контекстный"
1517
+ msgstr ""
1518
+
1519
+ #: application/modules/Zanox/ZanoxConfig.php:91
1520
+ msgid "Ограничить результаты поиска выбранным регионом."
1521
+ msgstr ""
1522
+
1523
+ #: application/modules/Zanox/ZanoxConfig.php:94
1524
+ msgid "Любой регион"
1525
+ msgstr ""
1526
+
1527
+ #: application/modules/Zanox/ZanoxConfig.php:121
1528
+ msgid "ID программы"
1529
+ msgstr ""
1530
+
1531
+ #: application/modules/Zanox/ZanoxConfig.php:122
1532
+ msgid "Ограничить результаты поиска конкретной программой. Вы можете указать несколько ID через запятую. Например: \"1234\", \"1234,5678,9123\". Если не указано, поиск будет произведен по всем вашим подключенным программам."
1533
+ msgstr ""
1534
+
1535
+ #: application/modules/Zanox/ZanoxConfig.php:142
1536
+ msgid "Партнерство"
1537
+ msgstr ""
1538
+
1539
+ #: application/modules/Zanox/ZanoxConfig.php:143
1540
+ msgid "Если выбрано \"Все\", партнерские ссылки не будут включены в результат. Используйте только для оценки доступных товаров."
1541
+ msgstr ""
1542
+
1543
+ #: application/modules/Zanox/ZanoxConfig.php:146
1544
+ msgid "Все"
1545
+ msgstr ""
1546
+
1547
+ #: application/modules/Zanox/ZanoxConfig.php:147
1548
+ msgid "Подтвержденные"
1549
+ msgstr ""
1550
+
1551
+ #: application/modules/Zanox/ZanoxModule.php:27
1552
+ msgid "Добавляет товары партнерской сети zanox.com. Вы должны получить аппрув от каждой программы отдельно."
1553
+ msgstr ""
1554
+ #. Plugin Name of the plugin/theme
1555
+ msgid "Content Egg"
1556
+ msgstr ""
1557
+
1558
+ #. Plugin URI of the plugin/theme
1559
+ msgid "http://www.keywordrush.com/contentegg"
1560
+ msgstr ""
1561
+
1562
+ #. Description of the plugin/theme
1563
+ msgid "Plugin for adding additional content for your posts. Let you to earn money from affiliate programs."
1564
+ msgstr ""
1565
+
1566
+ #. Author of the plugin/theme
1567
+ msgid "keywordrush.com"
1568
+ msgstr ""
1569
+
1570
+ #. Author URI of the plugin/theme
1571
+ msgid "http://www.keywordrush.com"
1572
+ msgstr ""
languages/index.php ADDED
@@ -0,0 +1,2 @@
 
 
1
+ <?php
2
+ //Nothing to see here
languages/tpl/content-egg-tpl-RU.mo ADDED
Binary file
languages/tpl/content-egg-tpl-RU.po ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 Content Egg
2
+ # This file is distributed under the same license as the Content Egg package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Content Egg 1.1.1\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg-tpl\n"
7
+ "POT-Creation-Date: 2015-08-16 09:14:02+00:00\n"
8
+ "PO-Revision-Date: 2015-08-16 12:23+0200\n"
9
+ "Last-Translator: \n"
10
+ "Language-Team: LANGUAGE <LL@li.org>\n"
11
+ "Language: ru\n"
12
+ "MIME-Version: 1.0\n"
13
+ "Content-Type: text/plain; charset=UTF-8\n"
14
+ "Content-Transfer-Encoding: 8bit\n"
15
+ "X-Generator: Poedit 1.6.5\n"
16
+ "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
17
+ "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
18
+
19
+ #: application/helpers/TemplateHelper.php:26
20
+ msgid "number_format_decimal_point"
21
+ msgstr ","
22
+
23
+ #: application/helpers/TemplateHelper.php:27
24
+ msgid "number_format_thousands_sep"
25
+ msgstr " "
26
+
27
+ #: application/helpers/TemplateHelper.php:97
28
+ msgid "d"
29
+ msgstr "д"
30
+
31
+ #: application/helpers/TemplateHelper.php:99
32
+ msgid "h"
33
+ msgstr "ч"
34
+
35
+ #: application/helpers/TemplateHelper.php:101
36
+ #: application/helpers/TemplateHelper.php:103
37
+ #: application/modules/Ebay/templates/data_item.php:90
38
+ #: application/modules/Ebay/templates/data_list.php:43
39
+ msgid "m"
40
+ msgstr "м"
41
+
42
+ #: application/modules/Aliexpress/templates/data_grid.php:6
43
+ #: application/modules/Amazon/templates/data_grid.php:6
44
+ #: application/modules/Ebay/templates/data_grid.php:6
45
+ #: application/modules/Zanox/templates/data_grid.php:6
46
+ msgid "Grid"
47
+ msgstr "Сетка"
48
+
49
+ #: application/modules/Aliexpress/templates/data_item.php:6
50
+ #: application/modules/Amazon/templates/data_item.php:6
51
+ #: application/modules/Ebay/templates/data_item.php:6
52
+ #: application/modules/Market/templates/data_item.php:5
53
+ #: application/modules/Zanox/templates/data_item.php:6
54
+ msgid "Product card"
55
+ msgstr "Карточка товара"
56
+
57
+ #: application/modules/Aliexpress/templates/data_item.php:50
58
+ #: application/modules/Amazon/templates/data_item.php:61
59
+ #: application/modules/Ebay/templates/data_item.php:68
60
+ #: application/modules/Zanox/templates/data_item.php:46
61
+ msgid "BUY THIS ITEM"
62
+ msgstr "КУПИТЬ СЕЙЧАС"
63
+
64
+ #: application/modules/Aliexpress/templates/data_list.php:6
65
+ #: application/modules/Amazon/templates/data_list.php:6
66
+ #: application/modules/Ebay/templates/data_list.php:6
67
+ #: application/modules/Zanox/templates/data_list.php:6
68
+ msgid "List"
69
+ msgstr "Список"
70
+
71
+ #: application/modules/Amazon/templates/data_item.php:52
72
+ #: application/modules/Amazon/templates/data_list.php:44
73
+ msgid "Too low to display"
74
+ msgstr "Уточните на сайте"
75
+
76
+ #: application/modules/Amazon/templates/data_item.php:57
77
+ #: application/modules/Amazon/templates/data_list.php:49
78
+ #: application/modules/Ebay/templates/data_item.php:99
79
+ #: application/modules/Ebay/templates/data_list.php:70
80
+ msgid "Free shipping"
81
+ msgstr "Бесплатная доставка"
82
+
83
+ #: application/modules/Amazon/templates/data_item.php:81
84
+ msgid "Features"
85
+ msgstr "Характеристики"
86
+
87
+ #: application/modules/Amazon/templates/data_item.php:94
88
+ #: application/modules/Market/templates/data_item.php:101
89
+ msgid "Customer reviews"
90
+ msgstr "Отзывы покупателей"
91
+
92
+ #: application/modules/BingImages/templates/data_image.php:5
93
+ #: application/modules/GoogleImages/templates/data_image.php:5
94
+ msgid "Image"
95
+ msgstr "Картинка"
96
+
97
+ #: application/modules/BingImages/templates/data_justified_gallery.php:7
98
+ #: application/modules/Flickr/templates/data_justified_gallery.php:7
99
+ #: application/modules/GoogleImages/templates/data_justified_gallery.php:7
100
+ msgid "Gallery"
101
+ msgstr "Галерея"
102
+
103
+ #: application/modules/BingImages/templates/data_simple.php:17
104
+ msgid "Source: %s"
105
+ msgstr "Источник: %s"
106
+
107
+ #: application/modules/Ebay/templates/data_grid.php:51
108
+ #: application/modules/Ebay/templates/data_item.php:45
109
+ #: application/modules/Ebay/templates/data_item.php:52
110
+ #: application/modules/Ebay/templates/data_list.php:63
111
+ msgid "Buy It Now"
112
+ msgstr "Buy It Now"
113
+
114
+ #: application/modules/Ebay/templates/data_grid.php:53
115
+ #: application/modules/Ebay/templates/data_item.php:76
116
+ #: application/modules/Ebay/templates/data_list.php:65
117
+ msgid "Bids:"
118
+ msgstr "Ставки"
119
+
120
+ #: application/modules/Ebay/templates/data_item.php:54
121
+ msgid "Current Price"
122
+ msgstr "Текущая цена"
123
+
124
+ #: application/modules/Ebay/templates/data_item.php:68
125
+ #, fuzzy
126
+ msgid "VIEW THIS ITEM"
127
+ msgstr "КУПИТЬ СЕЙЧАС"
128
+
129
+ #: application/modules/Ebay/templates/data_item.php:81
130
+ msgid "Item condition:"
131
+ msgstr "Состояние"
132
+
133
+ #: application/modules/Ebay/templates/data_item.php:89
134
+ #: application/modules/Ebay/templates/data_list.php:42
135
+ msgid "Time left:"
136
+ msgstr "Оставшееся время:"
137
+
138
+ #: application/modules/Ebay/templates/data_item.php:94
139
+ #: application/modules/Ebay/templates/data_list.php:47
140
+ msgid "Ended:"
141
+ msgstr "Завершен:"
142
+
143
+ #: application/modules/Ebay/templates/data_item.php:103
144
+ msgid "EEK:"
145
+ msgstr "EEK:"
146
+
147
+ #: application/modules/Flickr/templates/data_simple.php:5
148
+ #: application/modules/Freebase/templates/data_simple.php:5
149
+ #: application/modules/GoogleBooks/templates/data_simple.php:5
150
+ #: application/modules/GoogleImages/templates/data_simple.php:5
151
+ #: application/modules/Twitter/templates/data_simple.php:5
152
+ #: application/modules/VkNews/templates/data_simple.php:5
153
+ #: application/modules/Youtube/templates/data_simple.php:5
154
+ msgid "Simple"
155
+ msgstr "Простой"
156
+
157
+ #: application/modules/Flickr/templates/data_simple.php:19
158
+ msgid "Photo %s on Flickr"
159
+ msgstr "Фото %s на Flickr"
160
+
161
+ #: application/modules/Freebase/templates/data_simple.php:27
162
+ msgid "Source:"
163
+ msgstr "Источник:"
164
+
165
+ #: application/modules/Market/templates/data_item.php:29
166
+ msgid "Customer reviews:"
167
+ msgstr "Отзывы покупателей:"
168
+
169
+ #: application/modules/Market/templates/data_item.php:35
170
+ msgid "Average price"
171
+ msgstr "Средняя цена"
172
+
173
+ #: application/modules/Market/templates/data_item.php:46
174
+ msgid "Data from Yandex.Market"
175
+ msgstr "Данные Яндекс.Маркет"
176
+
177
+ #: application/modules/Market/templates/data_item.php:75
178
+ msgid "free"
179
+ msgstr "бесплатно"
180
+
181
+ #: application/modules/Market/templates/data_item.php:82
182
+ msgid "Pickup"
183
+ msgstr "Самовывоз"
184
+
185
+ #: application/modules/Market/templates/data_item.php:86
186
+ msgid "In stock"
187
+ msgstr "В наличии"
188
+
189
+ #: application/modules/Market/templates/data_item.php:88
190
+ msgid "Not available"
191
+ msgstr "Нет в наличии"
192
+
193
+ #: application/modules/Market/templates/data_item.php:93
194
+ msgid "Visit store"
195
+ msgstr "В магазин"
196
+
197
+ #: application/modules/Market/templates/data_item.php:118
198
+ msgid "Pros:"
199
+ msgstr "Плюсы:"
200
+
201
+ #: application/modules/Market/templates/data_item.php:119
202
+ msgid "Cons:"
203
+ msgstr "Минусы:"
204
+
205
+ #: application/modules/Market/templates/data_item.php:120
206
+ msgid "Comment:"
207
+ msgstr "Комментарий:"
208
+
209
+ #: application/modules/Youtube/templates/data_responsive_embed.php:5
210
+ msgid "Large"
211
+ msgstr "Широкий"
212
+
213
+ #: application/modules/Youtube/templates/data_tile.php:5
214
+ msgid "Tile"
215
+ msgstr "Плитка"
216
+
217
+ #~ msgid "http://www.keywordrush.com/contentegg"
218
+ #~ msgstr "http://www.keywordrush.com/contentegg"
languages/tpl/content-egg-tpl.pot ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright (C) 2015 Content Egg
2
+ # This file is distributed under the same license as the Content Egg package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: Content Egg 1.5.2\n"
6
+ "Report-Msgid-Bugs-To: http://wordpress.org/support/plugin/content-egg-tpl\n"
7
+ "POT-Creation-Date: 2015-08-26 08:29:30+00:00\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=UTF-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "PO-Revision-Date: 2015-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+
15
+ #: application/helpers/TemplateHelper.php:26
16
+ msgid "number_format_decimal_point"
17
+ msgstr ""
18
+
19
+ #: application/helpers/TemplateHelper.php:27
20
+ msgid "number_format_thousands_sep"
21
+ msgstr ""
22
+
23
+ #: application/helpers/TemplateHelper.php:97
24
+ msgid "d"
25
+ msgstr ""
26
+
27
+ #: application/helpers/TemplateHelper.php:99
28
+ msgid "h"
29
+ msgstr ""
30
+
31
+ #: application/helpers/TemplateHelper.php:101
32
+ #: application/helpers/TemplateHelper.php:103
33
+ #: application/modules/Ebay/templates/data_item.php:90
34
+ #: application/modules/Ebay/templates/data_list.php:43
35
+ msgid "m"
36
+ msgstr ""
37
+
38
+ #: application/modules/Aliexpress/templates/data_grid.php:6
39
+ #: application/modules/Amazon/templates/data_grid.php:6
40
+ #: application/modules/Ebay/templates/data_grid.php:6
41
+ #: application/modules/Zanox/templates/data_grid.php:6
42
+ msgid "Grid"
43
+ msgstr ""
44
+
45
+ #: application/modules/Aliexpress/templates/data_item.php:6
46
+ #: application/modules/Amazon/templates/data_item.php:6
47
+ #: application/modules/Ebay/templates/data_item.php:6
48
+ #: application/modules/Market/templates/data_item.php:5
49
+ #: application/modules/Zanox/templates/data_item.php:6
50
+ msgid "Product card"
51
+ msgstr ""
52
+
53
+ #: application/modules/Aliexpress/templates/data_item.php:50
54
+ #: application/modules/Amazon/templates/data_item.php:61
55
+ #: application/modules/Ebay/templates/data_item.php:68
56
+ #: application/modules/Zanox/templates/data_item.php:46
57
+ msgid "BUY THIS ITEM"
58
+ msgstr ""
59
+
60
+ #: application/modules/Aliexpress/templates/data_list.php:6
61
+ #: application/modules/Amazon/templates/data_list.php:6
62
+ #: application/modules/Ebay/templates/data_list.php:6
63
+ #: application/modules/Zanox/templates/data_list.php:6
64
+ msgid "List"
65
+ msgstr ""
66
+
67
+ #: application/modules/Amazon/templates/data_item.php:52
68
+ #: application/modules/Amazon/templates/data_list.php:44
69
+ msgid "Too low to display"
70
+ msgstr ""
71
+
72
+ #: application/modules/Amazon/templates/data_item.php:57
73
+ #: application/modules/Amazon/templates/data_list.php:49
74
+ #: application/modules/Ebay/templates/data_item.php:99
75
+ #: application/modules/Ebay/templates/data_list.php:70
76
+ msgid "Free shipping"
77
+ msgstr ""
78
+
79
+ #: application/modules/Amazon/templates/data_item.php:81
80
+ msgid "Features"
81
+ msgstr ""
82
+
83
+ #: application/modules/Amazon/templates/data_item.php:94
84
+ #: application/modules/Market/templates/data_item.php:104
85
+ msgid "Customer reviews"
86
+ msgstr ""
87
+
88
+ #: application/modules/BingImages/templates/data_image.php:5
89
+ #: application/modules/GoogleImages/templates/data_image.php:5
90
+ msgid "Image"
91
+ msgstr ""
92
+
93
+ #: application/modules/BingImages/templates/data_justified_gallery.php:7
94
+ #: application/modules/Flickr/templates/data_justified_gallery.php:7
95
+ #: application/modules/GoogleImages/templates/data_justified_gallery.php:7
96
+ msgid "Gallery"
97
+ msgstr ""
98
+
99
+ #: application/modules/Ebay/templates/data_grid.php:51
100
+ #: application/modules/Ebay/templates/data_item.php:45
101
+ #: application/modules/Ebay/templates/data_item.php:52
102
+ #: application/modules/Ebay/templates/data_list.php:63
103
+ msgid "Buy It Now"
104
+ msgstr ""
105
+
106
+ #: application/modules/Ebay/templates/data_grid.php:53
107
+ #: application/modules/Ebay/templates/data_item.php:76
108
+ #: application/modules/Ebay/templates/data_list.php:65
109
+ msgid "Bids:"
110
+ msgstr ""
111
+
112
+ #: application/modules/Ebay/templates/data_item.php:54
113
+ msgid "Current Price"
114
+ msgstr ""
115
+
116
+ #: application/modules/Ebay/templates/data_item.php:68
117
+ msgid "VIEW THIS ITEM"
118
+ msgstr ""
119
+
120
+ #: application/modules/Ebay/templates/data_item.php:81
121
+ msgid "Item condition:"
122
+ msgstr ""
123
+
124
+ #: application/modules/Ebay/templates/data_item.php:89
125
+ #: application/modules/Ebay/templates/data_list.php:42
126
+ msgid "Time left:"
127
+ msgstr ""
128
+
129
+ #: application/modules/Ebay/templates/data_item.php:94
130
+ #: application/modules/Ebay/templates/data_list.php:47
131
+ msgid "Ended:"
132
+ msgstr ""
133
+
134
+ #: application/modules/Ebay/templates/data_item.php:103
135
+ msgid "EEK:"
136
+ msgstr ""
137
+
138
+ #: application/modules/Flickr/templates/data_simple.php:5
139
+ #: application/modules/Freebase/templates/data_simple.php:5
140
+ #: application/modules/GoogleBooks/templates/data_simple.php:5
141
+ #: application/modules/GoogleImages/templates/data_simple.php:5
142
+ #: application/modules/Twitter/templates/data_simple.php:5
143
+ #: application/modules/VkNews/templates/data_simple.php:5
144
+ #: application/modules/Youtube/templates/data_simple.php:5
145
+ msgid "Simple"
146
+ msgstr ""
147
+
148
+ #: application/modules/Flickr/templates/data_simple.php:20
149
+ msgid "Photo %s on Flickr"
150
+ msgstr ""
151
+
152
+ #: application/modules/Freebase/templates/data_simple.php:27
153
+ msgid "Source:"
154
+ msgstr ""
155
+
156
+ #: application/modules/GoogleImages/GoogleImagesConfig.php:21
157
+ msgid "Поиск изображений, которые можно использовать. Подробнее <a href=\"https://support.google.com/websearch/answer/29508\">здесь</a>."
158
+ msgstr ""
159
+
160
+ #: application/modules/Market/templates/data_item.php:32
161
+ msgid "Customer reviews:"
162
+ msgstr ""
163
+
164
+ #: application/modules/Market/templates/data_item.php:38
165
+ msgid "Average price"
166
+ msgstr ""
167
+
168
+ #: application/modules/Market/templates/data_item.php:49
169
+ msgid "Data from Yandex.Market"
170
+ msgstr ""
171
+
172
+ #: application/modules/Market/templates/data_item.php:78
173
+ msgid "free"
174
+ msgstr ""
175
+
176
+ #: application/modules/Market/templates/data_item.php:85
177
+ msgid "Pickup"
178
+ msgstr ""
179
+
180
+ #: application/modules/Market/templates/data_item.php:89
181
+ msgid "In stock"
182
+ msgstr ""
183
+
184
+ #: application/modules/Market/templates/data_item.php:91
185
+ msgid "Not available"
186
+ msgstr ""
187
+
188
+ #: application/modules/Market/templates/data_item.php:96
189
+ msgid "Visit store"
190
+ msgstr ""
191
+
192
+ #: application/modules/Market/templates/data_item.php:121
193
+ msgid "Pros:"
194
+ msgstr ""
195
+
196
+ #: application/modules/Market/templates/data_item.php:122
197
+ msgid "Cons:"
198
+ msgstr ""
199
+
200
+ #: application/modules/Market/templates/data_item.php:123
201
+ msgid "Comment:"
202
+ msgstr ""
203
+
204
+ #: application/modules/Youtube/templates/data_responsive_embed.php:5
205
+ msgid "Large"
206
+ msgstr ""
207
+
208
+ #: application/modules/Youtube/templates/data_tile.php:5
209
+ msgid "Tile"
210
+ msgstr ""
211
+ #. Plugin Name of the plugin/theme
212
+ msgid "Content Egg"
213
+ msgstr ""
214
+
215
+ #. Plugin URI of the plugin/theme
216
+ msgid "http://www.keywordrush.com/contentegg"
217
+ msgstr ""
218
+
219
+ #. Description of the plugin/theme
220
+ msgid "Plugin for adding additional content for your posts. Let you to earn money from affiliate programs."
221
+ msgstr ""
222
+
223
+ #. Author of the plugin/theme
224
+ msgid "keywordrush.com"
225
+ msgstr ""
226
+
227
+ #. Author URI of the plugin/theme
228
+ msgid "http://www.keywordrush.com"
229
+ msgstr ""
loader.php ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace ContentEgg;
4
+
5
+ use ContentEgg\application\vendor\CVarDumper;
6
+
7
+ defined('ABSPATH') || die('No direct script access allowed!');
8
+
9
+ /**
10
+ * AutoLoader class file
11
+ *
12
+ * @author keywordrush.com <support@keywordrush.com>
13
+ * @link http://www.keywordrush.com/
14
+ * @copyright Copyright &copy; 2015 keywordrush.com
15
+ */
16
+ class AutoLoader {
17
+
18
+ private static $base_dir;
19
+ private static $classMap = array(
20
+ //'ContentEgg\application\ContentEgg' => 'application/ContentEgg.php',
21
+ );
22
+
23
+ public function __construct()
24
+ {
25
+
26
+ self::$base_dir = PLUGIN_PATH;
27
+ $this->register_auto_loader();
28
+ }
29
+
30
+ public function register_auto_loader()
31
+ {
32
+ spl_autoload_register(array($this, 'autoload'));
33
+ }
34
+
35
+ /**
36
+ * Implementations of PSR-4
37
+ * @link: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md
38
+ */
39
+ public static function autoload($className)
40
+ {
41
+
42
+ $prefix = __NAMESPACE__ . '\\';
43
+ // does the class use the namespace prefix?
44
+ $len = strlen($prefix);
45
+
46
+ if (strncmp($prefix, $className, $len) !== 0)
47
+ {
48
+ // no, move to the next registered autoloader
49
+ return;
50
+ }
51
+
52
+ // trying map autoloader first
53
+ if (isset(self::$classMap[$className]))
54
+ {
55
+ include(self::$base_dir . self::$classMap[$className]);
56
+ }
57
+
58
+ // get the relative class name
59
+ $relative_class = substr($className, $len);
60
+
61
+ // replace the namespace prefix with the base directory, replace namespace
62
+ // separators with directory separators in the relative class name, append
63
+ // with .php
64
+ $file = self::$base_dir . str_replace('\\', '/', $relative_class) . '.php';
65
+
66
+ // if the file exists, require it
67
+ if (file_exists($file))
68
+ {
69
+ require $file;
70
+ }
71
+ }
72
+
73
+ }
74
+
75
+ new AutoLoader();
76
+
77
+ function prn($var, $depth = 10, $highlight = true)
78
+ {
79
+ echo CVarDumper::dumpAsString($var, $depth, $highlight);
80
+ echo '<br />';
81
+ }
82
+
83
+ function prnx($var, $depth = 10, $highlight = true)
84
+ {
85
+ echo CVarDumper::dumpAsString($var, $depth, $highlight);
86
+ die('Exit');
87
+ }
readme.txt ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === Content Egg ===
2
+ Contributors: keywordrush
3
+ Tags: content, affiliate, amazon, flickr, youtube, images, wikipedia, freebase, autoblogging, ecommerce, links, shortcode, monetize, search engine optimization, moneymaking, price comparison, google images, timesaving
4
+ Requires at least: 4.2.2
5
+ Tested up to: 4.3
6
+ Stable tag: 1.6.0
7
+ License: GPLv2 or later
8
+ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
+
10
+ Plugin for adding additional content for your posts. Help you to make better posts and monetize them.
11
+
12
+ == Description ==
13
+
14
+ Content is a king. This was, is and will be true in all times. Good content posts with relevate images, videos, usefull information always get tons of traffic and easy for monetization. Such posts make your site useful for visitors and increase value in search engines.
15
+
16
+ But how much time do you spend to add images, relevant videos, books, news, photos and affiliate products to post? You have to go on youtube, find videos, then on google images, flickr, amazon, twitter, google news, etc. Searching relevant additional content, formatting, adding to post takes too much time for each article.
17
+
18
+ Good news, we solved this problem for our projects and we want to offer you the best, all in one instrument for adding additional content from open sources to your posts and best affiliate offers from different affiliate systems to make moneymaking process as easy as possible. All modules have many options to search only the best content. For example, you can enable searching only the best deals from Amazon or only products with definite price.
19
+
20
+ > <strong>PRO version</strong><br>
21
+ >Do you want to get even more? Pro version offers tons of additional modules and extended functions.
22
+ >
23
+ >Modules of free version: Amazon, Google images, Youtube, Freebase.
24
+ >
25
+ >Additional modules of PRO version: Ebay, Zanox, Aliexpress, Flickr, Bing images, Google books, Google News, Twitter, Vk news, Yandex Market.
26
+ >
27
+ >And we don't stop on these modules. All buyers of pro version can suggest us new module.
28
+ >
29
+ >Visit us at [www.keywordrush.com/en/contentegg](http://www.keywordrush.com/en/contentegg "Content Egg Pro").
30
+
31
+ It's very easy to use - just insert keyword, plugin will search all available content from modules, choose items which you want to insert. That's all. Plugin can insert blocks automatically in the end, begining of post or with shortcodes. So, you can mix content from different modules with default shortcodes of your theme. Also, plugin can store images from modules to your server and even set featured image to your post.
32
+
33
+ Of course, plugin can update price and availability in affiliate modules like Amazon, etc. It's a great way to monetize your sites!
34
+
35
+ [youtube https://www.youtube.com/watch?v=SdDfdJaVRlg]
36
+
37
+ **Features include:**
38
+
39
+ * Tons of content: images, videos, news, offers.
40
+ * Multilanguage: make site on any language.
41
+ * Easy interface: add all content from post admin page.
42
+ * Custom output templates.
43
+ * Works with any theme.
44
+ * Option to search across content with Creative Common license.
45
+ * Works through official API.
46
+ * Auto updating product lists and prices.
47
+ * Works with wordpress shortcodes.
48
+
49
+ = How it works? =
50
+
51
+ * You just enter a keyword and click "Search"
52
+ * Plugin searches and displays the results to you.
53
+ * Now you can choose what to add to the post and edit the results.
54
+ * It's very simple and fast: multiple search and add data directly to the post editing page without reloading the page.
55
+
56
+ = Multilanguage =
57
+
58
+ Most modules of Content Egg plug-in has Multi-language support. This means that you can make websites in different languages.
59
+
60
+ = Some great monetizing features =
61
+
62
+ * Option to choose 90 day cookie links for Amazon products
63
+ * Option to search only products with discount (you can set minimal discount)
64
+ * Creating comparison price list of products
65
+ * Automatically adds your partner ID to links
66
+ * Custom templates
67
+
68
+ == Installation ==
69
+
70
+ **Requirements**
71
+
72
+ * PHP 5.3+ (note, Wordpress without plugin needs PHP 5.2.4+).
73
+ * Wordpress 4.2.2+.
74
+
75
+ This section describes how to install the plugin and get it working.
76
+
77
+ 1. Upload `content-egg` folder to the `/wp-content/plugins/` directory
78
+ 1. Activate the plugin through the 'Plugins' menu in WordPress
79
+ 1. Configure plugin settings
80
+ 1. You can find manual how to configure each module - [Content Egg Manual](http://www.keywordrush.com/manuals/content_egg_manual.en.pdf)
81
+
82
+ == Frequently Asked Questions ==
83
+
84
+ = How to use plugin for monetization =
85
+
86
+ Content Egg has Amazon module. Just insert your API key and you can add different products from Amazon to posts. You can set lifetime for updating price of products. Also, you can create list of best offers and insert key for autoupdating, so, plugin will update list with actual offers from Amazon. PRO version has many other modules, like Ebay, Zanox, Aliexpress and others.
87
+
88
+ = Is it possible to use plugin without Amazon module. For example, only for youtube videos? =
89
+
90
+ Of course, you can activate only one module if you want.
91
+
92
+ = Is it difficult to make templates for the modules? =
93
+
94
+ If you can do any Wordpress page templates – you can do also templates for Content Egg. It's just html code with output variables and macros.
95
+
96
+ == Screenshots ==
97
+
98
+ 1. Searching keywords inside post
99
+ 2. Settings of modules
100
+ 3. Amazon product cart output template
101
+ 4. Amazon grid output template
102
+ 5. Output template
103
+
104
+
105
+ == Changelog ==
106
+
107
+ = 1.6.0 =
108
+ * Initial release.
res/app/ModuleService.js ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ contentEgg.factory('ModuleService', ['$http', '$timeout', function($http, $timeout) {
2
+
3
+ var service = function(module_id) {
4
+ this.module_id = module_id;
5
+ this.results = [];
6
+ this.added = [];
7
+ this.added_changed = false;
8
+ this.processing = false;
9
+ this.loaded = false;
10
+ this.error = '';
11
+ };
12
+
13
+ service.prototype.find = function(query) {
14
+ var self = this;
15
+
16
+ self.processing = true;
17
+
18
+ var params = {
19
+ 'action': 'content-egg-module-api',
20
+ 'module': this.module_id,
21
+ 'query': query,
22
+ '_contentegg_nonce': contentegg_params.nonce,
23
+ };
24
+
25
+ return $http.get(ajaxurl, {params: params})
26
+ .success(function(data) {
27
+ if (!data.error)
28
+ {
29
+ self.results = data.results;
30
+ self.error = '';
31
+ self.loaded = true;
32
+ } else {
33
+ self.error = data.error;
34
+ }
35
+ $timeout( function(){ self.processing = false; }, 1000);
36
+
37
+ return self.results;
38
+ })
39
+ .error(function(error) {
40
+ self.processing = false;
41
+ self.error = error;
42
+ //console.error(module + ' error: ' + error);
43
+ });
44
+ };
45
+ return service;
46
+ }]);
res/app/app.js ADDED
@@ -0,0 +1,253 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ var contentEgg = angular.module('contentEgg', ['ui.bootstrap']);
2
+
3
+
4
+ contentEgg.controller('ContentEggController', function($scope, ModuleService) {
5
+
6
+ //$scope.childs = {}
7
+ $scope.models = {};
8
+ $scope.query_params = {};
9
+ $scope.keywords = {};
10
+ $scope.updateKeywords = {};
11
+ $scope.activeSearchTabs = {};
12
+ $scope.activeResultTabs = {};
13
+ $scope.shortcodes = {};
14
+
15
+ $scope.processCounter = 0;
16
+ $scope.active_modules = contentegg_params.active_modules;
17
+ angular.forEach($scope.active_modules, function(module_id, key) {
18
+ $scope.models[module_id] = new ModuleService(module_id);
19
+ $scope.keywords[module_id] = '';
20
+ $scope.updateKeywords[module_id] = '';
21
+ $scope.shortcodes[module_id] = '[content-egg module=' + module_id + ']';
22
+
23
+ // init modules options
24
+ $scope.query_params[module_id] = {};
25
+ angular.forEach(contentegg_params.modulesOptions[module_id], function(value, option) {
26
+ $scope.query_params[module_id][option] = value;
27
+ });
28
+
29
+ // init post metadata
30
+ if (contentegg_params.initData[module_id])
31
+ {
32
+ $scope.models[module_id].added = contentegg_params.initData[module_id];
33
+ $scope.activeSearchTabs[module_id] = false;
34
+ $scope.activeResultTabs[module_id] = true;
35
+ }
36
+ else {
37
+ $scope.activeSearchTabs[module_id] = true;
38
+ $scope.activeResultTabs[module_id] = false;
39
+ }
40
+
41
+ // init keywords
42
+ if (contentegg_params.initKeywords[module_id])
43
+ {
44
+ $scope.updateKeywords[module_id] = contentegg_params.initKeywords[module_id];
45
+ }
46
+ });
47
+
48
+ $scope.find = function(module_id) {
49
+ if (!$scope.keywords[module_id])
50
+ return;
51
+ $scope.processCounter++;
52
+ $scope.query_params[module_id].keyword = $scope.keywords[module_id];
53
+ $scope.models[module_id].find($scope.query_params[module_id]).then(function(response) {
54
+ $scope.processCounter--;
55
+ });
56
+ };
57
+
58
+ $scope.add = function(result, module_id) {
59
+ var index = $scope.models[module_id].results.indexOf(result);
60
+ if ($scope.models[module_id].results[index].added)
61
+ return;
62
+ $scope.models[module_id].results[index].added = true;
63
+ // check for dublicates
64
+ for (var i = 0, len = $scope.models[module_id].added.length; i < len; i++) {
65
+ var item = $scope.models[module_id].added[i];
66
+ if (item['unique_id'] == $scope.models[module_id].results[index]['unique_id'])
67
+ return;
68
+ }
69
+ $scope.models[module_id].results[index].keyword = $scope.keywords[module_id];
70
+ $scope.models[module_id].added.push($scope.models[module_id].results[index]);
71
+ $scope.models[module_id].added_changed = true;
72
+ };
73
+
74
+ $scope.addAll = function(module_id) {
75
+ if (!$scope.models[module_id].results.length)
76
+ return;
77
+ angular.forEach($scope.models[module_id].results, function(result, key) {
78
+ $scope.add(result, module_id);
79
+ });
80
+ $scope.activeResultTabs[module_id] = true;
81
+ };
82
+
83
+ $scope.delete = function(data, module_id) {
84
+ var index = $scope.models[module_id].added.indexOf(data);
85
+ $scope.models[module_id].added.splice(index, 1);
86
+ $scope.models[module_id].added_changed = true;
87
+ };
88
+
89
+ $scope.deleteAll = function(module_id) {
90
+ $scope.models[module_id].added = [];
91
+ $scope.models[module_id].added_changed = true;
92
+ $scope.activeSearchTabs[module_id] = true;
93
+ };
94
+
95
+ $scope.global_findAll = function() {
96
+ if (!$scope.global_keywords)
97
+ return;
98
+ angular.forEach($scope.models, function(service, module_id) {
99
+ $scope.keywords[module_id] = $scope.global_keywords;
100
+ $scope.activeSearchTabs[module_id] = true;
101
+ $scope.find(module_id);
102
+ });
103
+ };
104
+
105
+ $scope.global_addAll = function() {
106
+ angular.forEach($scope.models, function(service, module_id) {
107
+ $scope.addAll(module_id);
108
+ });
109
+ };
110
+
111
+ $scope.global_deleteAll = function() {
112
+ angular.forEach($scope.models, function(service, module_id) {
113
+ $scope.deleteAll(module_id);
114
+ });
115
+ };
116
+
117
+ $scope.global_isSearchResults = function() {
118
+ for (var i = 0, len = $scope.active_modules.length; i < len; i++) {
119
+ var module_id = $scope.active_modules[i];
120
+ if ($scope.models[module_id].results && $scope.models[module_id].results.length)
121
+ return true;
122
+ }
123
+ return false;
124
+ };
125
+
126
+ $scope.global_isAddedResults = function() {
127
+ for (var i = 0, len = $scope.active_modules.length; i < len; i++) {
128
+ var module_id = $scope.active_modules[i];
129
+ if ($scope.models[module_id].added.length)
130
+ return true;
131
+ }
132
+ return false;
133
+ };
134
+
135
+ $scope.getYoutubeUri = function(id) {
136
+ return 'https://www.youtube.com/embed/' + id;
137
+ };
138
+
139
+ $scope.setUpdateKeyword = function(module_id) {
140
+ $scope.updateKeywords[module_id] = $scope.keywords[module_id];
141
+ $scope.activeResultTabs[module_id] = true;
142
+ };
143
+
144
+ $scope.buildShortcode = function(module_id, template) {
145
+ var shortcode = '[content-egg module=' + module_id;
146
+ if (template)
147
+ shortcode += ' template=' + template;
148
+ shortcode += ']';
149
+ $scope.shortcodes[module_id] = shortcode;
150
+ };
151
+
152
+ });
153
+
154
+ contentEgg.config(function($sceDelegateProvider) {
155
+ $sceDelegateProvider.resourceUrlWhitelist([
156
+ 'self',
157
+ 'https://www.youtube.com/**'
158
+ ]);
159
+ });
160
+
161
+ contentEgg.directive('onEnter', function() {
162
+
163
+ var linkFn = function(scope, element, attrs) {
164
+ element.bind("keypress", function(event) {
165
+ if (event.which === 13) {
166
+ scope.$apply(function() {
167
+ scope.$eval(attrs.onEnter);
168
+ });
169
+ event.preventDefault();
170
+ }
171
+ });
172
+ };
173
+
174
+ return {
175
+ link: linkFn
176
+ };
177
+ });
178
+
179
+ contentEgg.directive('imageloaded', [
180
+ function() {
181
+
182
+ 'use strict';
183
+
184
+ return {
185
+ restrict: 'A',
186
+ link: function(scope, element, attrs) {
187
+ var cssClass = attrs.loadedclass;
188
+
189
+ element.bind('load', function(e) {
190
+ angular.element(element).addClass(cssClass);
191
+ });
192
+ }
193
+ }
194
+ }
195
+ ]);
196
+
197
+ contentEgg.directive('justifiedGallery', ['$timeout', function($timeout) {
198
+ return {
199
+ restrict: 'A',
200
+ link: function(scope, el, attrs) {
201
+ scope.$watch('$last', function(n, o) {
202
+ if (n) {
203
+ $timeout(function() {
204
+ angular.element(el).justifiedGallery(scope.$eval(attrs.justifiedGallery)).on('jg.complete', function(e) {
205
+ //alert('on complete');
206
+ });
207
+ scope.$last = false;
208
+ });
209
+ }
210
+ });
211
+ }
212
+ };
213
+ }]);
214
+
215
+ contentEgg.directive('repeatDone', [function() {
216
+ return {
217
+ restrict: 'A',
218
+ link: function(scope, element, iAttrs) {
219
+ var parentScope = element.parent().scope();
220
+ if (scope.$last) {
221
+ parentScope.$last = true;
222
+ }
223
+ }
224
+ };
225
+ }]);
226
+
227
+ contentEgg.directive('ngConfirmClick', function() {
228
+ return {
229
+ priority: -1,
230
+ restrict: 'A',
231
+ link: function(scope, element, attrs) {
232
+ element.bind('click', function(e) {
233
+ var message = attrs.ngConfirmClick;
234
+ if (message && !confirm(message)) {
235
+ e.stopImmediatePropagation();
236
+ e.preventDefault();
237
+ }
238
+ });
239
+ }
240
+ };
241
+ });
242
+
243
+ contentEgg.directive('selectOnClick', function() {
244
+ return {
245
+ restrict: 'A',
246
+ link: function(scope, element, attrs) {
247
+ element.on('click', function() {
248
+ this.select();
249
+ });
250
+ }
251
+ };
252
+ });
253
+
res/app/vendor/angular-ui-bootstrap/ui-bootstrap-tpls-0.13.3.min.js ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * angular-ui-bootstrap
3
+ * http://angular-ui.github.io/bootstrap/
4
+
5
+ * Version: 0.13.3 - 2015-08-09
6
+ * License: MIT
7
+ */
8
+ angular.module("ui.bootstrap",["ui.bootstrap.tpls","ui.bootstrap.collapse","ui.bootstrap.accordion","ui.bootstrap.alert","ui.bootstrap.bindHtml","ui.bootstrap.buttons","ui.bootstrap.carousel","ui.bootstrap.dateparser","ui.bootstrap.position","ui.bootstrap.datepicker","ui.bootstrap.dropdown","ui.bootstrap.modal","ui.bootstrap.pagination","ui.bootstrap.tooltip","ui.bootstrap.popover","ui.bootstrap.progressbar","ui.bootstrap.rating","ui.bootstrap.tabs","ui.bootstrap.timepicker","ui.bootstrap.transition","ui.bootstrap.typeahead"]),angular.module("ui.bootstrap.tpls",["template/accordion/accordion-group.html","template/accordion/accordion.html","template/alert/alert.html","template/carousel/carousel.html","template/carousel/slide.html","template/datepicker/datepicker.html","template/datepicker/day.html","template/datepicker/month.html","template/datepicker/popup.html","template/datepicker/year.html","template/modal/backdrop.html","template/modal/window.html","template/pagination/pager.html","template/pagination/pagination.html","template/tooltip/tooltip-html-popup.html","template/tooltip/tooltip-html-unsafe-popup.html","template/tooltip/tooltip-popup.html","template/tooltip/tooltip-template-popup.html","template/popover/popover-html.html","template/popover/popover-template.html","template/popover/popover.html","template/progressbar/bar.html","template/progressbar/progress.html","template/progressbar/progressbar.html","template/rating/rating.html","template/tabs/tab.html","template/tabs/tabset.html","template/timepicker/timepicker.html","template/typeahead/typeahead-match.html","template/typeahead/typeahead-popup.html"]),angular.module("ui.bootstrap.collapse",[]).directive("collapse",["$animate",function(a){return{link:function(b,c,d){function e(){c.removeClass("collapse").addClass("collapsing").attr("aria-expanded",!0).attr("aria-hidden",!1),a.addClass(c,"in",{to:{height:c[0].scrollHeight+"px"}}).then(f)}function f(){c.removeClass("collapsing"),c.css({height:"auto"})}function g(){return c.hasClass("collapse")||c.hasClass("in")?(c.css({height:c[0].scrollHeight+"px"}).removeClass("collapse").addClass("collapsing").attr("aria-expanded",!1).attr("aria-hidden",!0),void a.removeClass(c,"in",{to:{height:"0"}}).then(h)):h()}function h(){c.css({height:"0"}),c.removeClass("collapsing"),c.addClass("collapse")}b.$watch(d.collapse,function(a){a?g():e()})}}}]),angular.module("ui.bootstrap.accordion",["ui.bootstrap.collapse"]).constant("accordionConfig",{closeOthers:!0}).controller("AccordionController",["$scope","$attrs","accordionConfig",function(a,b,c){this.groups=[],this.closeOthers=function(d){var e=angular.isDefined(b.closeOthers)?a.$eval(b.closeOthers):c.closeOthers;e&&angular.forEach(this.groups,function(a){a!==d&&(a.isOpen=!1)})},this.addGroup=function(a){var b=this;this.groups.push(a),a.$on("$destroy",function(){b.removeGroup(a)})},this.removeGroup=function(a){var b=this.groups.indexOf(a);-1!==b&&this.groups.splice(b,1)}}]).directive("accordion",function(){return{restrict:"EA",controller:"AccordionController",controllerAs:"accordion",transclude:!0,replace:!1,templateUrl:function(a,b){return b.templateUrl||"template/accordion/accordion.html"}}}).directive("accordionGroup",function(){return{require:"^accordion",restrict:"EA",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/accordion/accordion-group.html"},scope:{heading:"@",isOpen:"=?",isDisabled:"=?"},controller:function(){this.setHeading=function(a){this.heading=a}},link:function(a,b,c,d){d.addGroup(a),a.$watch("isOpen",function(b){b&&d.closeOthers(a)}),a.toggleOpen=function(){a.isDisabled||(a.isOpen=!a.isOpen)}}}}).directive("accordionHeading",function(){return{restrict:"EA",transclude:!0,template:"",replace:!0,require:"^accordionGroup",link:function(a,b,c,d,e){d.setHeading(e(a,angular.noop))}}}).directive("accordionTransclude",function(){return{require:"^accordionGroup",link:function(a,b,c,d){a.$watch(function(){return d[c.accordionTransclude]},function(a){a&&(b.find("span").html(""),b.find("span").append(a))})}}}),angular.module("ui.bootstrap.alert",[]).controller("AlertController",["$scope","$attrs",function(a,b){a.closeable=!!b.close,this.close=a.close}]).directive("alert",function(){return{restrict:"EA",controller:"AlertController",controllerAs:"alert",templateUrl:function(a,b){return b.templateUrl||"template/alert/alert.html"},transclude:!0,replace:!0,scope:{type:"@",close:"&"}}}).directive("dismissOnTimeout",["$timeout",function(a){return{require:"alert",link:function(b,c,d,e){a(function(){e.close()},parseInt(d.dismissOnTimeout,10))}}}]),angular.module("ui.bootstrap.bindHtml",[]).value("$bindHtmlUnsafeSuppressDeprecated",!1).directive("bindHtmlUnsafe",["$log","$bindHtmlUnsafeSuppressDeprecated",function(a,b){return function(c,d,e){b||a.warn("bindHtmlUnsafe is now deprecated. Use ngBindHtml instead"),d.addClass("ng-binding").data("$binding",e.bindHtmlUnsafe),c.$watch(e.bindHtmlUnsafe,function(a){d.html(a||"")})}}]),angular.module("ui.bootstrap.buttons",[]).constant("buttonConfig",{activeClass:"active",toggleEvent:"click"}).controller("ButtonsController",["buttonConfig",function(a){this.activeClass=a.activeClass||"active",this.toggleEvent=a.toggleEvent||"click"}]).directive("btnRadio",function(){return{require:["btnRadio","ngModel"],controller:"ButtonsController",controllerAs:"buttons",link:function(a,b,c,d){var e=d[0],f=d[1];f.$render=function(){b.toggleClass(e.activeClass,angular.equals(f.$modelValue,a.$eval(c.btnRadio)))},b.bind(e.toggleEvent,function(){if(!c.disabled){var d=b.hasClass(e.activeClass);(!d||angular.isDefined(c.uncheckable))&&a.$apply(function(){f.$setViewValue(d?null:a.$eval(c.btnRadio)),f.$render()})}})}}}).directive("btnCheckbox",function(){return{require:["btnCheckbox","ngModel"],controller:"ButtonsController",controllerAs:"button",link:function(a,b,c,d){function e(){return g(c.btnCheckboxTrue,!0)}function f(){return g(c.btnCheckboxFalse,!1)}function g(b,c){var d=a.$eval(b);return angular.isDefined(d)?d:c}var h=d[0],i=d[1];i.$render=function(){b.toggleClass(h.activeClass,angular.equals(i.$modelValue,e()))},b.bind(h.toggleEvent,function(){c.disabled||a.$apply(function(){i.$setViewValue(b.hasClass(h.activeClass)?f():e()),i.$render()})})}}}),angular.module("ui.bootstrap.carousel",[]).controller("CarouselController",["$scope","$element","$interval","$animate",function(a,b,c,d){function e(b,c,e){r||(angular.extend(b,{direction:e,active:!0}),angular.extend(l.currentSlide||{},{direction:e,active:!1}),d.enabled()&&!a.noTransition&&!a.$currentTransition&&b.$element&&l.slides.length>1&&(b.$element.data(p,b.direction),l.currentSlide&&l.currentSlide.$element&&l.currentSlide.$element.data(p,b.direction),a.$currentTransition=!0,n?d.on("addClass",b.$element,function(b,c){"close"===c&&(a.$currentTransition=null,d.off("addClass",b))}):b.$element.one("$animate:close",function(){a.$currentTransition=null})),l.currentSlide=b,q=c,g())}function f(a){if(angular.isUndefined(m[a].index))return m[a];{var b;m.length}for(b=0;b<m.length;++b)if(m[b].index==a)return m[b]}function g(){h();var b=+a.interval;!isNaN(b)&&b>0&&(j=c(i,b))}function h(){j&&(c.cancel(j),j=null)}function i(){var b=+a.interval;k&&!isNaN(b)&&b>0&&m.length?a.next():a.pause()}var j,k,l=this,m=l.slides=a.slides=[],n=angular.version.minor>=4,o="uib-noTransition",p="uib-slideDirection",q=-1;l.currentSlide=null;var r=!1;l.select=a.select=function(b,c){var d=a.indexOfSlide(b);void 0===c&&(c=d>l.getCurrentIndex()?"next":"prev"),b&&b!==l.currentSlide&&!a.$currentTransition&&e(b,d,c)},a.$on("$destroy",function(){r=!0}),l.getCurrentIndex=function(){return l.currentSlide&&angular.isDefined(l.currentSlide.index)?+l.currentSlide.index:q},a.indexOfSlide=function(a){return angular.isDefined(a.index)?+a.index:m.indexOf(a)},a.next=function(){var b=(l.getCurrentIndex()+1)%m.length;return 0===b&&a.noWrap()?void a.pause():l.select(f(b),"next")},a.prev=function(){var b=l.getCurrentIndex()-1<0?m.length-1:l.getCurrentIndex()-1;return a.noWrap()&&b===m.length-1?void a.pause():l.select(f(b),"prev")},a.isActive=function(a){return l.currentSlide===a},a.$watch("interval",g),a.$on("$destroy",h),a.play=function(){k||(k=!0,g())},a.pause=function(){a.noPause||(k=!1,h())},l.addSlide=function(b,c){b.$element=c,m.push(b),1===m.length||b.active?(l.select(m[m.length-1]),1==m.length&&a.play()):b.active=!1},l.removeSlide=function(a){angular.isDefined(a.index)&&m.sort(function(a,b){return+a.index>+b.index});var b=m.indexOf(a);m.splice(b,1),m.length>0&&a.active?l.select(b>=m.length?m[b-1]:m[b]):q>b&&q--,0===m.length&&(l.currentSlide=null)},a.$watch("noTransition",function(a){b.data(o,a)})}]).directive("carousel",[function(){return{restrict:"EA",transclude:!0,replace:!0,controller:"CarouselController",controllerAs:"carousel",require:"carousel",templateUrl:function(a,b){return b.templateUrl||"template/carousel/carousel.html"},scope:{interval:"=",noTransition:"=",noPause:"=",noWrap:"&"}}}]).directive("slide",function(){return{require:"^carousel",restrict:"EA",transclude:!0,replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/carousel/slide.html"},scope:{active:"=?",index:"=?"},link:function(a,b,c,d){d.addSlide(a,b),a.$on("$destroy",function(){d.removeSlide(a)}),a.$watch("active",function(b){b&&d.select(a)})}}}).animation(".item",["$injector","$animate",function(a,b){function c(a,b,c){a.removeClass(b),c&&c()}var d="uib-noTransition",e="uib-slideDirection",f=null;return a.has("$animateCss")&&(f=a.get("$animateCss")),{beforeAddClass:function(a,g,h){if("active"==g&&a.parent()&&!a.parent().data(d)){var i=!1,j=a.data(e),k="next"==j?"left":"right",l=c.bind(this,a,k+" "+j,h);return a.addClass(j),f?f(a,{addClass:k}).start().done(l):b.addClass(a,k).then(function(){i||l(),h()}),function(){i=!0}}h()},beforeRemoveClass:function(a,g,h){if("active"===g&&a.parent()&&!a.parent().data(d)){var i=!1,j=a.data(e),k="next"==j?"left":"right",l=c.bind(this,a,k,h);return f?f(a,{addClass:k}).start().done(l):b.addClass(a,k).then(function(){i||l(),h()}),function(){i=!0}}h()}}}]),angular.module("ui.bootstrap.dateparser",[]).service("dateParser",["$log","$locale","orderByFilter",function(a,b,c){function d(a){var b=[],d=a.split("");return angular.forEach(g,function(c,e){var f=a.indexOf(e);if(f>-1){a=a.split(""),d[f]="("+c.regex+")",a[f]="$";for(var g=f+1,h=f+e.length;h>g;g++)d[g]="",a[g]="$";a=a.join(""),b.push({index:f,apply:c.apply})}}),{regex:new RegExp("^"+d.join("")+"$"),map:c(b,"index")}}function e(a,b,c){return 1>c?!1:1===b&&c>28?29===c&&(a%4===0&&a%100!==0||a%400===0):3===b||5===b||8===b||10===b?31>c:!0}var f=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;this.parsers={};var g={yyyy:{regex:"\\d{4}",apply:function(a){this.year=+a}},yy:{regex:"\\d{2}",apply:function(a){this.year=+a+2e3}},y:{regex:"\\d{1,4}",apply:function(a){this.year=+a}},MMMM:{regex:b.DATETIME_FORMATS.MONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.MONTH.indexOf(a)}},MMM:{regex:b.DATETIME_FORMATS.SHORTMONTH.join("|"),apply:function(a){this.month=b.DATETIME_FORMATS.SHORTMONTH.indexOf(a)}},MM:{regex:"0[1-9]|1[0-2]",apply:function(a){this.month=a-1}},M:{regex:"[1-9]|1[0-2]",apply:function(a){this.month=a-1}},dd:{regex:"[0-2][0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},d:{regex:"[1-2]?[0-9]{1}|3[0-1]{1}",apply:function(a){this.date=+a}},EEEE:{regex:b.DATETIME_FORMATS.DAY.join("|")},EEE:{regex:b.DATETIME_FORMATS.SHORTDAY.join("|")},HH:{regex:"(?:0|1)[0-9]|2[0-3]",apply:function(a){this.hours=+a}},hh:{regex:"0[0-9]|1[0-2]",apply:function(a){this.hours=+a}},H:{regex:"1?[0-9]|2[0-3]",apply:function(a){this.hours=+a}},mm:{regex:"[0-5][0-9]",apply:function(a){this.minutes=+a}},m:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.minutes=+a}},sss:{regex:"[0-9][0-9][0-9]",apply:function(a){this.milliseconds=+a}},ss:{regex:"[0-5][0-9]",apply:function(a){this.seconds=+a}},s:{regex:"[0-9]|[1-5][0-9]",apply:function(a){this.seconds=+a}},a:{regex:b.DATETIME_FORMATS.AMPMS.join("|"),apply:function(a){12===this.hours&&(this.hours=0),"PM"===a&&(this.hours+=12)}}};this.parse=function(c,g,h){if(!angular.isString(c)||!g)return c;g=b.DATETIME_FORMATS[g]||g,g=g.replace(f,"\\$&"),this.parsers[g]||(this.parsers[g]=d(g));var i=this.parsers[g],j=i.regex,k=i.map,l=c.match(j);if(l&&l.length){var m,n;angular.isDate(h)&&!isNaN(h.getTime())?m={year:h.getFullYear(),month:h.getMonth(),date:h.getDate(),hours:h.getHours(),minutes:h.getMinutes(),seconds:h.getSeconds(),milliseconds:h.getMilliseconds()}:(h&&a.warn("dateparser:","baseDate is not a valid date"),m={year:1900,month:0,date:1,hours:0,minutes:0,seconds:0,milliseconds:0});for(var o=1,p=l.length;p>o;o++){var q=k[o-1];q.apply&&q.apply.call(m,l[o])}return e(m.year,m.month,m.date)&&(n=new Date(m.year,m.month,m.date,m.hours,m.minutes,m.seconds,m.milliseconds||0)),n}}}]),angular.module("ui.bootstrap.position",[]).factory("$position",["$document","$window",function(a,b){function c(a,c){return a.currentStyle?a.currentStyle[c]:b.getComputedStyle?b.getComputedStyle(a)[c]:a.style[c]}function d(a){return"static"===(c(a,"position")||"static")}var e=function(b){for(var c=a[0],e=b.offsetParent||c;e&&e!==c&&d(e);)e=e.offsetParent;return e||c};return{position:function(b){var c=this.offset(b),d={top:0,left:0},f=e(b[0]);f!=a[0]&&(d=this.offset(angular.element(f)),d.top+=f.clientTop-f.scrollTop,d.left+=f.clientLeft-f.scrollLeft);var g=b[0].getBoundingClientRect();return{width:g.width||b.prop("offsetWidth"),height:g.height||b.prop("offsetHeight"),top:c.top-d.top,left:c.left-d.left}},offset:function(c){var d=c[0].getBoundingClientRect();return{width:d.width||c.prop("offsetWidth"),height:d.height||c.prop("offsetHeight"),top:d.top+(b.pageYOffset||a[0].documentElement.scrollTop),left:d.left+(b.pageXOffset||a[0].documentElement.scrollLeft)}},positionElements:function(a,b,c,d){var e,f,g,h,i=c.split("-"),j=i[0],k=i[1]||"center";e=d?this.offset(a):this.position(a),f=b.prop("offsetWidth"),g=b.prop("offsetHeight");var l={center:function(){return e.left+e.width/2-f/2},left:function(){return e.left},right:function(){return e.left+e.width}},m={center:function(){return e.top+e.height/2-g/2},top:function(){return e.top},bottom:function(){return e.top+e.height}};switch(j){case"right":h={top:m[k](),left:l[j]()};break;case"left":h={top:m[k](),left:e.left-f};break;case"bottom":h={top:m[j](),left:l[k]()};break;default:h={top:e.top-g,left:l[k]()}}return h}}}]),angular.module("ui.bootstrap.datepicker",["ui.bootstrap.dateparser","ui.bootstrap.position"]).value("$datepickerSuppressError",!1).constant("datepickerConfig",{formatDay:"dd",formatMonth:"MMMM",formatYear:"yyyy",formatDayHeader:"EEE",formatDayTitle:"MMMM yyyy",formatMonthTitle:"yyyy",datepickerMode:"day",minMode:"day",maxMode:"year",showWeeks:!0,startingDay:0,yearRange:20,minDate:null,maxDate:null,shortcutPropagation:!1}).controller("DatepickerController",["$scope","$attrs","$parse","$interpolate","$log","dateFilter","datepickerConfig","$datepickerSuppressError",function(a,b,c,d,e,f,g,h){var i=this,j={$setViewValue:angular.noop};this.modes=["day","month","year"],angular.forEach(["formatDay","formatMonth","formatYear","formatDayHeader","formatDayTitle","formatMonthTitle","showWeeks","startingDay","yearRange","shortcutPropagation"],function(c,e){i[c]=angular.isDefined(b[c])?6>e?d(b[c])(a.$parent):a.$parent.$eval(b[c]):g[c]}),angular.forEach(["minDate","maxDate"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(a){i[d]=a?new Date(a):null,i.refreshView()}):i[d]=g[d]?new Date(g[d]):null}),angular.forEach(["minMode","maxMode"],function(d){b[d]?a.$parent.$watch(c(b[d]),function(c){i[d]=angular.isDefined(c)?c:b[d],a[d]=i[d],("minMode"==d&&i.modes.indexOf(a.datepickerMode)<i.modes.indexOf(i[d])||"maxMode"==d&&i.modes.indexOf(a.datepickerMode)>i.modes.indexOf(i[d]))&&(a.datepickerMode=i[d])}):(i[d]=g[d]||null,a[d]=i[d])}),a.datepickerMode=a.datepickerMode||g.datepickerMode,a.uniqueId="datepicker-"+a.$id+"-"+Math.floor(1e4*Math.random()),angular.isDefined(b.initDate)?(this.activeDate=a.$parent.$eval(b.initDate)||new Date,a.$parent.$watch(b.initDate,function(a){a&&(j.$isEmpty(j.$modelValue)||j.$invalid)&&(i.activeDate=a,i.refreshView())})):this.activeDate=new Date,a.isActive=function(b){return 0===i.compare(b.date,i.activeDate)?(a.activeDateId=b.uid,!0):!1},this.init=function(a){j=a,j.$render=function(){i.render()}},this.render=function(){if(j.$viewValue){var a=new Date(j.$viewValue),b=!isNaN(a);b?this.activeDate=a:h||e.error('Datepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')}this.refreshView()},this.refreshView=function(){if(this.element){this._refreshView();var a=j.$viewValue?new Date(j.$viewValue):null;j.$setValidity("dateDisabled",!a||this.element&&!this.isDisabled(a))}},this.createDateObject=function(a,b){var c=j.$viewValue?new Date(j.$viewValue):null;return{date:a,label:f(a,b),selected:c&&0===this.compare(a,c),disabled:this.isDisabled(a),current:0===this.compare(a,new Date),customClass:this.customClass(a)}},this.isDisabled=function(c){return this.minDate&&this.compare(c,this.minDate)<0||this.maxDate&&this.compare(c,this.maxDate)>0||b.dateDisabled&&a.dateDisabled({date:c,mode:a.datepickerMode})},this.customClass=function(b){return a.customClass({date:b,mode:a.datepickerMode})},this.split=function(a,b){for(var c=[];a.length>0;)c.push(a.splice(0,b));return c},this.fixTimeZone=function(a){var b=a.getHours();a.setHours(23===b?b+2:0)},a.select=function(b){if(a.datepickerMode===i.minMode){var c=j.$viewValue?new Date(j.$viewValue):new Date(0,0,0,0,0,0,0);c.setFullYear(b.getFullYear(),b.getMonth(),b.getDate()),j.$setViewValue(c),j.$render()}else i.activeDate=b,a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)-1]},a.move=function(a){var b=i.activeDate.getFullYear()+a*(i.step.years||0),c=i.activeDate.getMonth()+a*(i.step.months||0);i.activeDate.setFullYear(b,c,1),i.refreshView()},a.toggleMode=function(b){b=b||1,a.datepickerMode===i.maxMode&&1===b||a.datepickerMode===i.minMode&&-1===b||(a.datepickerMode=i.modes[i.modes.indexOf(a.datepickerMode)+b])},a.keys={13:"enter",32:"space",33:"pageup",34:"pagedown",35:"end",36:"home",37:"left",38:"up",39:"right",40:"down"};var k=function(){i.element[0].focus()};a.$on("datepicker.focus",k),a.keydown=function(b){var c=a.keys[b.which];if(c&&!b.shiftKey&&!b.altKey)if(b.preventDefault(),i.shortcutPropagation||b.stopPropagation(),"enter"===c||"space"===c){if(i.isDisabled(i.activeDate))return;a.select(i.activeDate),k()}else!b.ctrlKey||"up"!==c&&"down"!==c?(i.handleKeyDown(c,b),i.refreshView()):(a.toggleMode("up"===c?1:-1),k())}}]).directive("datepicker",function(){return{restrict:"EA",replace:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/datepicker.html"},scope:{datepickerMode:"=?",dateDisabled:"&",customClass:"&",shortcutPropagation:"&?"},require:["datepicker","^ngModel"],controller:"DatepickerController",controllerAs:"datepicker",link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}).directive("daypicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/day.html",require:"^datepicker",link:function(b,c,d,e){function f(a,b){return 1!==b||a%4!==0||a%100===0&&a%400!==0?i[b]:29}function g(a,b){for(var c,d=new Array(b),f=new Date(a),g=0;b>g;)c=new Date(f),e.fixTimeZone(c),d[g++]=c,f.setDate(f.getDate()+1);return d}function h(a){var b=new Date(a);b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();return b.setMonth(0),b.setDate(1),Math.floor(Math.round((c-b)/864e5)/7)+1}b.showWeeks=e.showWeeks,e.step={months:1},e.element=c;var i=[31,28,31,30,31,30,31,31,30,31,30,31];e._refreshView=function(){var c=e.activeDate.getFullYear(),d=e.activeDate.getMonth(),f=new Date(c,d,1),i=e.startingDay-f.getDay(),j=i>0?7-i:-i,k=new Date(f);j>0&&k.setDate(-j+1);for(var l=g(k,42),m=0;42>m;m++)l[m]=angular.extend(e.createDateObject(l[m],e.formatDay),{secondary:l[m].getMonth()!==d,uid:b.uniqueId+"-"+m});b.labels=new Array(7);for(var n=0;7>n;n++)b.labels[n]={abbr:a(l[n].date,e.formatDayHeader),full:a(l[n].date,"EEEE")};if(b.title=a(e.activeDate,e.formatDayTitle),b.rows=e.split(l,7),b.showWeeks){b.weekNumbers=[];for(var o=(11-e.startingDay)%7,p=b.rows.length,q=0;p>q;q++)b.weekNumbers.push(h(b.rows[q][o].date))}},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth(),a.getDate())-new Date(b.getFullYear(),b.getMonth(),b.getDate())},e.handleKeyDown=function(a){var b=e.activeDate.getDate();if("left"===a)b-=1;else if("up"===a)b-=7;else if("right"===a)b+=1;else if("down"===a)b+=7;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getMonth()+("pageup"===a?-1:1);e.activeDate.setMonth(c,1),b=Math.min(f(e.activeDate.getFullYear(),e.activeDate.getMonth()),b)}else"home"===a?b=1:"end"===a&&(b=f(e.activeDate.getFullYear(),e.activeDate.getMonth()));e.activeDate.setDate(b)},e.refreshView()}}}]).directive("monthpicker",["dateFilter",function(a){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/month.html",require:"^datepicker",link:function(b,c,d,e){e.step={years:1},e.element=c,e._refreshView=function(){for(var c,d=new Array(12),f=e.activeDate.getFullYear(),g=0;12>g;g++)c=new Date(f,g,1),e.fixTimeZone(c),d[g]=angular.extend(e.createDateObject(c,e.formatMonth),{uid:b.uniqueId+"-"+g});b.title=a(e.activeDate,e.formatMonthTitle),b.rows=e.split(d,3)},e.compare=function(a,b){return new Date(a.getFullYear(),a.getMonth())-new Date(b.getFullYear(),b.getMonth())},e.handleKeyDown=function(a){var b=e.activeDate.getMonth();if("left"===a)b-=1;else if("up"===a)b-=3;else if("right"===a)b+=1;else if("down"===a)b+=3;else if("pageup"===a||"pagedown"===a){var c=e.activeDate.getFullYear()+("pageup"===a?-1:1);e.activeDate.setFullYear(c)}else"home"===a?b=0:"end"===a&&(b=11);e.activeDate.setMonth(b)},e.refreshView()}}}]).directive("yearpicker",["dateFilter",function(){return{restrict:"EA",replace:!0,templateUrl:"template/datepicker/year.html",require:"^datepicker",link:function(a,b,c,d){function e(a){return parseInt((a-1)/f,10)*f+1}var f=d.yearRange;d.step={years:f},d.element=b,d._refreshView=function(){for(var b,c=new Array(f),g=0,h=e(d.activeDate.getFullYear());f>g;g++)b=new Date(h+g,0,1),d.fixTimeZone(b),c[g]=angular.extend(d.createDateObject(b,d.formatYear),{uid:a.uniqueId+"-"+g});a.title=[c[0].label,c[f-1].label].join(" - "),a.rows=d.split(c,5)},d.compare=function(a,b){return a.getFullYear()-b.getFullYear()},d.handleKeyDown=function(a){var b=d.activeDate.getFullYear();"left"===a?b-=1:"up"===a?b-=5:"right"===a?b+=1:"down"===a?b+=5:"pageup"===a||"pagedown"===a?b+=("pageup"===a?-1:1)*d.step.years:"home"===a?b=e(d.activeDate.getFullYear()):"end"===a&&(b=e(d.activeDate.getFullYear())+f-1),d.activeDate.setFullYear(b)},d.refreshView()}}}]).constant("datepickerPopupConfig",{datepickerPopup:"yyyy-MM-dd",datepickerPopupTemplateUrl:"template/datepicker/popup.html",datepickerTemplateUrl:"template/datepicker/datepicker.html",html5Types:{date:"yyyy-MM-dd","datetime-local":"yyyy-MM-ddTHH:mm:ss.sss",month:"yyyy-MM"},currentText:"Today",clearText:"Clear",closeText:"Done",closeOnDateSelection:!0,appendToBody:!1,showButtonBar:!0,onOpenFocus:!0}).directive("datepickerPopup",["$compile","$parse","$document","$rootScope","$position","dateFilter","dateParser","datepickerPopupConfig","$timeout",function(a,b,c,d,e,f,g,h,i){return{restrict:"EA",require:"ngModel",scope:{isOpen:"=?",currentText:"@",clearText:"@",closeText:"@",dateDisabled:"&",customClass:"&"},link:function(j,k,l,m){function n(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function o(a){if(angular.isNumber(a)&&(a=new Date(a)),a){if(angular.isDate(a)&&!isNaN(a))return a;if(angular.isString(a)){var b=g.parse(a,q,j.date);return isNaN(b)?void 0:b}return void 0}return null}function p(a,b){var c=a||b;if(!l.ngRequired&&!c)return!0;if(angular.isNumber(c)&&(c=new Date(c)),c){if(angular.isDate(c)&&!isNaN(c))return!0;if(angular.isString(c)){var d=g.parse(c,q);return!isNaN(d)}return!1}return!0}var q,r=angular.isDefined(l.closeOnDateSelection)?j.$parent.$eval(l.closeOnDateSelection):h.closeOnDateSelection,s=angular.isDefined(l.datepickerAppendToBody)?j.$parent.$eval(l.datepickerAppendToBody):h.appendToBody,t=angular.isDefined(l.onOpenFocus)?j.$parent.$eval(l.onOpenFocus):h.onOpenFocus,u=angular.isDefined(l.datepickerPopupTemplateUrl)?l.datepickerPopupTemplateUrl:h.datepickerPopupTemplateUrl,v=angular.isDefined(l.datepickerTemplateUrl)?l.datepickerTemplateUrl:h.datepickerTemplateUrl;j.showButtonBar=angular.isDefined(l.showButtonBar)?j.$parent.$eval(l.showButtonBar):h.showButtonBar,j.getText=function(a){return j[a+"Text"]||h[a+"Text"]};var w=!1;if(h.html5Types[l.type]?(q=h.html5Types[l.type],w=!0):(q=l.datepickerPopup||h.datepickerPopup,l.$observe("datepickerPopup",function(a){var b=a||h.datepickerPopup;if(b!==q&&(q=b,m.$modelValue=null,!q))throw new Error("datepickerPopup must have a date format specified.")})),!q)throw new Error("datepickerPopup must have a date format specified.");if(w&&l.datepickerPopup)throw new Error("HTML5 date input types do not support custom formats.");var x=angular.element("<div datepicker-popup-wrap><div datepicker></div></div>");x.attr({"ng-model":"date","ng-change":"dateSelection(date)","template-url":u});var y=angular.element(x.children()[0]);if(y.attr("template-url",v),w&&"month"==l.type&&(y.attr("datepicker-mode",'"month"'),y.attr("min-mode","month")),l.datepickerOptions){var z=j.$parent.$eval(l.datepickerOptions);z&&z.initDate&&(j.initDate=z.initDate,y.attr("init-date","initDate"),delete z.initDate),angular.forEach(z,function(a,b){y.attr(n(b),a)})}j.watchData={},angular.forEach(["minMode","maxMode","minDate","maxDate","datepickerMode","initDate","shortcutPropagation"],function(a){if(l[a]){var c=b(l[a]);if(j.$parent.$watch(c,function(b){j.watchData[a]=b}),y.attr(n(a),"watchData."+a),"datepickerMode"===a){var d=c.assign;j.$watch("watchData."+a,function(a,b){angular.isFunction(d)&&a!==b&&d(j.$parent,a)})}}}),l.dateDisabled&&y.attr("date-disabled","dateDisabled({ date: date, mode: mode })"),l.showWeeks&&y.attr("show-weeks",l.showWeeks),l.customClass&&y.attr("custom-class","customClass({ date: date, mode: mode })"),w?m.$formatters.push(function(a){return j.date=a,a}):(m.$$parserName="date",m.$validators.date=p,m.$parsers.unshift(o),m.$formatters.push(function(a){return j.date=a,m.$isEmpty(a)?a:f(a,q)})),j.dateSelection=function(a){angular.isDefined(a)&&(j.date=a);var b=j.date?f(j.date,q):null;k.val(b),m.$setViewValue(b),r&&(j.isOpen=!1,k[0].focus())},m.$viewChangeListeners.push(function(){j.date=g.parse(m.$viewValue,q,j.date)});var A=function(a){j.isOpen&&!k[0].contains(a.target)&&j.$apply(function(){j.isOpen=!1})},B=function(a){27===a.which&&j.isOpen?(a.preventDefault(),a.stopPropagation(),j.$apply(function(){j.isOpen=!1}),k[0].focus()):40!==a.which||j.isOpen||(a.preventDefault(),a.stopPropagation(),j.$apply(function(){j.isOpen=!0}))};k.bind("keydown",B),j.keydown=function(a){27===a.which&&(j.isOpen=!1,k[0].focus())},j.$watch("isOpen",function(a){a?(j.position=s?e.offset(k):e.position(k),j.position.top=j.position.top+k.prop("offsetHeight"),i(function(){t&&j.$broadcast("datepicker.focus"),c.bind("click",A)},0,!1)):c.unbind("click",A)}),j.select=function(a){if("today"===a){var b=new Date;angular.isDate(j.date)?(a=new Date(j.date),a.setFullYear(b.getFullYear(),b.getMonth(),b.getDate())):a=new Date(b.setHours(0,0,0,0))}j.dateSelection(a)},j.close=function(){j.isOpen=!1,k[0].focus()};var C=a(x)(j);x.remove(),s?c.find("body").append(C):k.after(C),j.$on("$destroy",function(){j.isOpen===!0&&(d.$$phase||j.$apply(function(){j.isOpen=!1})),C.remove(),k.unbind("keydown",B),c.unbind("click",A)})}}}]).directive("datepickerPopupWrap",function(){return{restrict:"EA",replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/datepicker/popup.html"}}}),angular.module("ui.bootstrap.dropdown",["ui.bootstrap.position"]).constant("dropdownConfig",{openClass:"open"}).service("dropdownService",["$document","$rootScope",function(a,b){var c=null;this.open=function(b){c||(a.bind("click",d),a.bind("keydown",e)),c&&c!==b&&(c.isOpen=!1),c=b},this.close=function(b){c===b&&(c=null,a.unbind("click",d),a.unbind("keydown",e))};var d=function(a){if(c&&(!a||"disabled"!==c.getAutoClose())){var d=c.getToggleElement();if(!(a&&d&&d[0].contains(a.target))){var e=c.getDropdownElement();a&&"outsideClick"===c.getAutoClose()&&e&&e[0].contains(a.target)||(c.isOpen=!1,b.$$phase||c.$apply())}}},e=function(a){27===a.which?(c.focusToggleElement(),d()):c.isKeynavEnabled()&&/(38|40)/.test(a.which)&&c.isOpen&&(a.preventDefault(),a.stopPropagation(),c.focusDropdownEntry(a.which))}}]).controller("DropdownController",["$scope","$attrs","$parse","dropdownConfig","dropdownService","$animate","$position","$document","$compile","$templateRequest",function(a,b,c,d,e,f,g,h,i,j){var k,l,m=this,n=a.$new(),o=d.openClass,p=angular.noop,q=b.onToggle?c(b.onToggle):angular.noop,r=!1,s=!1;this.init=function(d){m.$element=d,b.isOpen&&(l=c(b.isOpen),p=l.assign,a.$watch(l,function(a){n.isOpen=!!a})),r=angular.isDefined(b.dropdownAppendToBody),s=angular.isDefined(b.keyboardNav),r&&m.dropdownMenu&&(h.find("body").append(m.dropdownMenu),d.on("$destroy",function(){m.dropdownMenu.remove()}))},this.toggle=function(a){return n.isOpen=arguments.length?!!a:!n.isOpen},this.isOpen=function(){return n.isOpen},n.getToggleElement=function(){return m.toggleElement},n.getAutoClose=function(){return b.autoClose||"always"},n.getElement=function(){return m.$element},n.isKeynavEnabled=function(){return s},n.focusDropdownEntry=function(a){var b=m.dropdownMenu?angular.element(m.dropdownMenu).find("a"):angular.element(m.$element).find("ul").eq(0).find("a");switch(a){case 40:m.selectedOption=angular.isNumber(m.selectedOption)?m.selectedOption===b.length-1?m.selectedOption:m.selectedOption+1:0;break;case 38:if(!angular.isNumber(m.selectedOption))return;m.selectedOption=0===m.selectedOption?0:m.selectedOption-1}b[m.selectedOption].focus()},n.getDropdownElement=function(){return m.dropdownMenu},n.focusToggleElement=function(){m.toggleElement&&m.toggleElement[0].focus()},n.$watch("isOpen",function(b,c){if(r&&m.dropdownMenu){var d=g.positionElements(m.$element,m.dropdownMenu,"bottom-left",!0),h={top:d.top+"px",display:b?"block":"none"},l=m.dropdownMenu.hasClass("dropdown-menu-right");l?(h.left="auto",h.right=window.innerWidth-(d.left+m.$element.prop("offsetWidth"))+"px"):(h.left=d.left+"px",h.right="auto"),m.dropdownMenu.css(h)}if(f[b?"addClass":"removeClass"](m.$element,o).then(function(){angular.isDefined(b)&&b!==c&&q(a,{open:!!b})}),b)m.dropdownMenuTemplateUrl&&j(m.dropdownMenuTemplateUrl).then(function(a){k=n.$new(),i(a.trim())(k,function(a){var b=a;m.dropdownMenu.replaceWith(b),m.dropdownMenu=b})}),n.focusToggleElement(),e.open(n);else{if(m.dropdownMenuTemplateUrl){k&&k.$destroy();var s=angular.element('<ul class="dropdown-menu"></ul>');m.dropdownMenu.replaceWith(s),m.dropdownMenu=s}e.close(n),m.selectedOption=null}angular.isFunction(p)&&p(a,b)}),a.$on("$locationChangeSuccess",function(){"disabled"!==n.getAutoClose()&&(n.isOpen=!1)}),a.$on("$destroy",function(){n.$destroy()})}]).directive("dropdown",function(){return{controller:"DropdownController",link:function(a,b,c,d){d.init(b),b.addClass("dropdown")}}}).directive("dropdownMenu",function(){return{restrict:"AC",require:"?^dropdown",link:function(a,b,c,d){if(d){var e=c.templateUrl;e&&(d.dropdownMenuTemplateUrl=e),d.dropdownMenu||(d.dropdownMenu=b)}}}}).directive("keyboardNav",function(){return{restrict:"A",require:"?^dropdown",link:function(a,b,c,d){b.bind("keydown",function(a){if(-1!==[38,40].indexOf(a.which)){a.preventDefault(),a.stopPropagation();var b=d.dropdownMenu.find("a");switch(a.which){case 40:d.selectedOption=angular.isNumber(d.selectedOption)?d.selectedOption===b.length-1?d.selectedOption:d.selectedOption+1:0;break;case 38:d.selectedOption=0===d.selectedOption?0:d.selectedOption-1}b[d.selectedOption].focus()}})}}}).directive("dropdownToggle",function(){
9
+ return{require:"?^dropdown",link:function(a,b,c,d){if(d){b.addClass("dropdown-toggle"),d.toggleElement=b;var e=function(e){e.preventDefault(),b.hasClass("disabled")||c.disabled||a.$apply(function(){d.toggle()})};b.bind("click",e),b.attr({"aria-haspopup":!0,"aria-expanded":!1}),a.$watch(d.isOpen,function(a){b.attr("aria-expanded",!!a)}),a.$on("$destroy",function(){b.unbind("click",e)})}}}}),angular.module("ui.bootstrap.modal",[]).factory("$$stackedMap",function(){return{createNew:function(){var a=[];return{add:function(b,c){a.push({key:b,value:c})},get:function(b){for(var c=0;c<a.length;c++)if(b==a[c].key)return a[c]},keys:function(){for(var b=[],c=0;c<a.length;c++)b.push(a[c].key);return b},top:function(){return a[a.length-1]},remove:function(b){for(var c=-1,d=0;d<a.length;d++)if(b==a[d].key){c=d;break}return a.splice(c,1)[0]},removeTop:function(){return a.splice(a.length-1,1)[0]},length:function(){return a.length}}}}}).directive("modalBackdrop",["$animate","$injector","$modalStack",function(a,b,c){function d(b,d,f){f.modalInClass&&(e?e(d,{addClass:f.modalInClass}).start():a.addClass(d,f.modalInClass),b.$on(c.NOW_CLOSING_EVENT,function(b,c){var g=c();e?e(d,{removeClass:f.modalInClass}).start().then(g):a.removeClass(d,f.modalInClass).then(g)}))}var e=null;return b.has("$animateCss")&&(e=b.get("$animateCss")),{restrict:"EA",replace:!0,templateUrl:"template/modal/backdrop.html",compile:function(a,b){return a.addClass(b.backdropClass),d}}}]).directive("modalWindow",["$modalStack","$q","$animate","$injector",function(a,b,c,d){var e=null;return d.has("$animateCss")&&(e=d.get("$animateCss")),{restrict:"EA",scope:{index:"@"},replace:!0,transclude:!0,templateUrl:function(a,b){return b.templateUrl||"template/modal/window.html"},link:function(d,f,g){f.addClass(g.windowClass||""),d.size=g.size,d.close=function(b){var c=a.getTop();c&&c.value.backdrop&&"static"!=c.value.backdrop&&b.target===b.currentTarget&&(b.preventDefault(),b.stopPropagation(),a.dismiss(c.key,"backdrop click"))},d.$isRendered=!0;var h=b.defer();g.$observe("modalRender",function(a){"true"==a&&h.resolve()}),h.promise.then(function(){g.modalInClass&&(e?e(f,{addClass:g.modalInClass}).start():c.addClass(f,g.modalInClass),d.$on(a.NOW_CLOSING_EVENT,function(a,b){var d=b();e?e(f,{removeClass:g.modalInClass}).start().then(d):c.removeClass(f,g.modalInClass).then(d)}));var b=f[0].querySelectorAll("[autofocus]");b.length?b[0].focus():f[0].focus();var h=a.getTop();h&&a.modalRendered(h.key)})}}}]).directive("modalAnimationClass",[function(){return{compile:function(a,b){b.modalAnimation&&a.addClass(b.modalAnimationClass)}}}]).directive("modalTransclude",function(){return{link:function(a,b,c,d,e){e(a.$parent,function(a){b.empty(),b.append(a)})}}}).factory("$modalStack",["$animate","$timeout","$document","$compile","$rootScope","$q","$injector","$$stackedMap",function(a,b,c,d,e,f,g,h){function i(){for(var a=-1,b=s.keys(),c=0;c<b.length;c++)s.get(b[c]).value.backdrop&&(a=c);return a}function j(a,b){var d=c.find("body").eq(0),e=s.get(a).value;s.remove(a),l(e.modalDomEl,e.modalScope,function(){d.toggleClass(a.openedClass||r,s.length()>0)}),k(),b&&b.focus?b.focus():d.focus()}function k(){if(o&&-1==i()){var a=p;l(o,p,function(){a=null}),o=void 0,p=void 0}}function l(b,c,d){function e(){e.done||(e.done=!0,n?n(b,{event:"leave"}).start().then(function(){b.remove()}):a.leave(b),c.$destroy(),d&&d())}var g,h=null,i=function(){return g||(g=f.defer(),h=g.promise),function(){g.resolve()}};return c.$broadcast(t.NOW_CLOSING_EVENT,i),f.when(h).then(e)}function m(a,b,c){return!a.value.modalScope.$broadcast("modal.closing",b,c).defaultPrevented}var n=null;g.has("$animateCss")&&(n=g.get("$animateCss"));var o,p,q,r="modal-open",s=h.createNew(),t={NOW_CLOSING_EVENT:"modal.stack.now-closing"},u=0,v="a[href], area[href], input:not([disabled]), button:not([disabled]),select:not([disabled]), textarea:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable=true]";return e.$watch(i,function(a){p&&(p.index=a)}),c.bind("keydown",function(a){if(a.isDefaultPrevented())return a;var b=s.top();if(b&&b.value.keyboard)switch(a.which){case 27:a.preventDefault(),e.$apply(function(){t.dismiss(b.key,"escape key press")});break;case 9:t.loadFocusElementList(b);var c=!1;a.shiftKey?t.isFocusInFirstItem(a)&&(c=t.focusLastFocusableElement()):t.isFocusInLastItem(a)&&(c=t.focusFirstFocusableElement()),c&&(a.preventDefault(),a.stopPropagation())}}),t.open=function(a,b){var f=c[0].activeElement;s.add(a,{deferred:b.deferred,renderDeferred:b.renderDeferred,modalScope:b.scope,backdrop:b.backdrop,keyboard:b.keyboard,openedClass:b.openedClass});var g=c.find("body").eq(0),h=i();if(h>=0&&!o){p=e.$new(!0),p.index=h;var j=angular.element('<div modal-backdrop="modal-backdrop"></div>');j.attr("backdrop-class",b.backdropClass),b.animation&&j.attr("modal-animation","true"),o=d(j)(p),g.append(o)}var k=angular.element('<div modal-window="modal-window"></div>');k.attr({"template-url":b.windowTemplateUrl,"window-class":b.windowClass,size:b.size,index:s.length()-1,animate:"animate"}).html(b.content),b.animation&&k.attr("modal-animation","true");var l=d(k)(b.scope);s.top().value.modalDomEl=l,s.top().value.modalOpener=f,g.append(l),g.addClass(b.openedClass||r),t.clearFocusListCache()},t.close=function(a,b){var c=s.get(a);return c&&m(c,b,!0)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.resolve(b),j(a,c.value.modalOpener),!0):!c},t.dismiss=function(a,b){var c=s.get(a);return c&&m(c,b,!1)?(c.value.modalScope.$$uibDestructionScheduled=!0,c.value.deferred.reject(b),j(a,c.value.modalOpener),!0):!c},t.dismissAll=function(a){for(var b=this.getTop();b&&this.dismiss(b.key,a);)b=this.getTop()},t.getTop=function(){return s.top()},t.modalRendered=function(a){var b=s.get(a);b&&b.value.renderDeferred.resolve()},t.focusFirstFocusableElement=function(){return q.length>0?(q[0].focus(),!0):!1},t.focusLastFocusableElement=function(){return q.length>0?(q[q.length-1].focus(),!0):!1},t.isFocusInFirstItem=function(a){return q.length>0?(a.target||a.srcElement)==q[0]:!1},t.isFocusInLastItem=function(a){return q.length>0?(a.target||a.srcElement)==q[q.length-1]:!1},t.clearFocusListCache=function(){q=[],u=0},t.loadFocusElementList=function(a){if((void 0===q||!q.length0)&&a){var b=a.value.modalDomEl;b&&b.length&&(q=b[0].querySelectorAll(v))}},t}]).provider("$modal",function(){var a={options:{animation:!0,backdrop:!0,keyboard:!0},$get:["$injector","$rootScope","$q","$templateRequest","$controller","$modalStack",function(b,c,d,e,f,g){function h(a){return a.template?d.when(a.template):e(angular.isFunction(a.templateUrl)?a.templateUrl():a.templateUrl)}function i(a){var c=[];return angular.forEach(a,function(a){angular.isFunction(a)||angular.isArray(a)?c.push(d.when(b.invoke(a))):angular.isString(a)&&c.push(d.when(b.get(a)))}),c}var j={};return j.open=function(b){var e=d.defer(),j=d.defer(),k=d.defer(),l={result:e.promise,opened:j.promise,rendered:k.promise,close:function(a){return g.close(l,a)},dismiss:function(a){return g.dismiss(l,a)}};if(b=angular.extend({},a.options,b),b.resolve=b.resolve||{},!b.template&&!b.templateUrl)throw new Error("One of template or templateUrl options is required.");var m=d.all([h(b)].concat(i(b.resolve)));return m.then(function(a){var d=(b.scope||c).$new();d.$close=l.close,d.$dismiss=l.dismiss,d.$on("$destroy",function(){d.$$uibDestructionScheduled||d.$dismiss("$uibUnscheduledDestruction")});var h,i={},j=1;b.controller&&(i.$scope=d,i.$modalInstance=l,angular.forEach(b.resolve,function(b,c){i[c]=a[j++]}),h=f(b.controller,i),b.controllerAs&&(b.bindToController&&angular.extend(h,d),d[b.controllerAs]=h)),g.open(l,{scope:d,deferred:e,renderDeferred:k,content:a[0],animation:b.animation,backdrop:b.backdrop,keyboard:b.keyboard,backdropClass:b.backdropClass,windowClass:b.windowClass,windowTemplateUrl:b.windowTemplateUrl,size:b.size,openedClass:b.openedClass})},function(a){e.reject(a)}),m.then(function(){j.resolve(!0)},function(a){j.reject(a)}),l},j}]};return a}),angular.module("ui.bootstrap.pagination",[]).controller("PaginationController",["$scope","$attrs","$parse",function(a,b,c){var d=this,e={$setViewValue:angular.noop},f=b.numPages?c(b.numPages).assign:angular.noop;this.init=function(g,h){e=g,this.config=h,e.$render=function(){d.render()},b.itemsPerPage?a.$parent.$watch(c(b.itemsPerPage),function(b){d.itemsPerPage=parseInt(b,10),a.totalPages=d.calculateTotalPages()}):this.itemsPerPage=h.itemsPerPage,a.$watch("totalItems",function(){a.totalPages=d.calculateTotalPages()}),a.$watch("totalPages",function(b){f(a.$parent,b),a.page>b?a.selectPage(b):e.$render()})},this.calculateTotalPages=function(){var b=this.itemsPerPage<1?1:Math.ceil(a.totalItems/this.itemsPerPage);return Math.max(b||0,1)},this.render=function(){a.page=parseInt(e.$viewValue,10)||1},a.selectPage=function(b,c){c&&c.preventDefault();var d=!a.ngDisabled||!c;d&&a.page!==b&&b>0&&b<=a.totalPages&&(c&&c.target&&c.target.blur(),e.$setViewValue(b),e.$render())},a.getText=function(b){return a[b+"Text"]||d.config[b+"Text"]},a.noPrevious=function(){return 1===a.page},a.noNext=function(){return a.page===a.totalPages}}]).constant("paginationConfig",{itemsPerPage:10,boundaryLinks:!1,directionLinks:!0,firstText:"First",previousText:"Previous",nextText:"Next",lastText:"Last",rotate:!0}).directive("pagination",["$parse","paginationConfig",function(a,b){return{restrict:"EA",scope:{totalItems:"=",firstText:"@",previousText:"@",nextText:"@",lastText:"@",ngDisabled:"="},require:["pagination","?ngModel"],controller:"PaginationController",controllerAs:"pagination",templateUrl:function(a,b){return b.templateUrl||"template/pagination/pagination.html"},replace:!0,link:function(c,d,e,f){function g(a,b,c){return{number:a,text:b,active:c}}function h(a,b){var c=[],d=1,e=b,f=angular.isDefined(k)&&b>k;f&&(l?(d=Math.max(a-Math.floor(k/2),1),e=d+k-1,e>b&&(e=b,d=e-k+1)):(d=(Math.ceil(a/k)-1)*k+1,e=Math.min(d+k-1,b)));for(var h=d;e>=h;h++){var i=g(h,h,h===a);c.push(i)}if(f&&!l){if(d>1){var j=g(d-1,"...",!1);c.unshift(j)}if(b>e){var m=g(e+1,"...",!1);c.push(m)}}return c}var i=f[0],j=f[1];if(j){var k=angular.isDefined(e.maxSize)?c.$parent.$eval(e.maxSize):b.maxSize,l=angular.isDefined(e.rotate)?c.$parent.$eval(e.rotate):b.rotate;c.boundaryLinks=angular.isDefined(e.boundaryLinks)?c.$parent.$eval(e.boundaryLinks):b.boundaryLinks,c.directionLinks=angular.isDefined(e.directionLinks)?c.$parent.$eval(e.directionLinks):b.directionLinks,i.init(j,b),e.maxSize&&c.$parent.$watch(a(e.maxSize),function(a){k=parseInt(a,10),i.render()});var m=i.render;i.render=function(){m(),c.page>0&&c.page<=c.totalPages&&(c.pages=h(c.page,c.totalPages))}}}}}]).constant("pagerConfig",{itemsPerPage:10,previousText:"« Previous",nextText:"Next »",align:!0}).directive("pager",["pagerConfig",function(a){return{restrict:"EA",scope:{totalItems:"=",previousText:"@",nextText:"@"},require:["pager","?ngModel"],controller:"PaginationController",templateUrl:"template/pagination/pager.html",replace:!0,link:function(b,c,d,e){var f=e[0],g=e[1];g&&(b.align=angular.isDefined(d.align)?b.$parent.$eval(d.align):a.align,f.init(g,a))}}}]),angular.module("ui.bootstrap.tooltip",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).provider("$tooltip",function(){function a(a){var b=/[A-Z]/g,c="-";return a.replace(b,function(a,b){return(b?c:"")+a.toLowerCase()})}var b={placement:"top",animation:!0,popupDelay:0,useContentExp:!1},c={mouseenter:"mouseleave",click:"click",focus:"blur"},d={};this.options=function(a){angular.extend(d,a)},this.setTriggers=function(a){angular.extend(c,a)},this.$get=["$window","$compile","$timeout","$document","$position","$interpolate","$rootScope",function(e,f,g,h,i,j,k){return function(e,l,m,n){function o(a){var b=(a||n.trigger||m).split(" "),d=b.map(function(a){return c[a]||a});return{show:b,hide:d}}n=angular.extend({},b,d,n);var p=a(e),q=j.startSymbol(),r=j.endSymbol(),s="<div "+p+'-popup title="'+q+"title"+r+'" '+(n.useContentExp?'content-exp="contentExp()" ':'content="'+q+"content"+r+'" ')+'placement="'+q+"placement"+r+'" popup-class="'+q+"popupClass"+r+'" animation="animation" is-open="isOpen"origin-scope="origScope" ></div>';return{restrict:"EA",compile:function(){var a=f(s);return function(b,c,d){function f(){F.isOpen?m():j()}function j(){(!E||b.$eval(d[l+"Enable"]))&&(t(),F.popupDelay?B||(B=g(p,F.popupDelay,!1),B.then(function(a){a()})):p()())}function m(){q(),k.$$phase||k.$digest()}function p(){return B=null,A&&(g.cancel(A),A=null),(n.useContentExp?F.contentExp():F.content)?(r(),y.css({top:0,left:0,display:"block"}),H(),F.isOpen=!0,F.$apply(),H):angular.noop}function q(){F.isOpen=!1,g.cancel(B),B=null,F.animation?A||(A=g(s,500)):s()}function r(){y&&s(),z=F.$new(),y=a(z,function(a){C?h.find("body").append(a):c.after(a)}),n.useContentExp&&(z.$watch("contentExp()",function(a){!a&&F.isOpen&&q()}),z.$watch(function(){G||(G=!0,z.$$postDigest(function(){G=!1,I()}))}))}function s(){A=null,y&&(y.remove(),y=null),z&&(z.$destroy(),z=null)}function t(){u(),v(),w()}function u(){F.popupClass=d[l+"Class"]}function v(){var a=d[l+"Placement"];F.placement=angular.isDefined(a)?a:n.placement}function w(){var a=d[l+"PopupDelay"],b=parseInt(a,10);F.popupDelay=isNaN(b)?n.popupDelay:b}function x(){var a=d[l+"Trigger"];J(),D=o(a),D.show.forEach(function(a,b){a===D.hide[b]?c.bind(a,f):a&&(c.bind(a,j),c.bind(D.hide[b],m))})}var y,z,A,B,C=angular.isDefined(n.appendToBody)?n.appendToBody:!1,D=o(void 0),E=angular.isDefined(d[l+"Enable"]),F=b.$new(!0),G=!1,H=function(){if(y){var a=i.positionElements(c,y,F.placement,C);a.top+="px",a.left+="px",y.css(a)}},I=function(){g(H,0,!1)};F.origScope=b,F.isOpen=!1,F.contentExp=function(){return b.$eval(d[e])},n.useContentExp||d.$observe(e,function(a){F.content=a,!a&&F.isOpen?q():I()}),d.$observe("disabled",function(a){B&&a&&g.cancel(B),a&&F.isOpen&&q()}),d.$observe(l+"Title",function(a){F.title=a,I()}),d.$observe(l+"Placement",function(){F.isOpen&&g(function(){v(),p()()},0,!1)});var J=function(){D.show.forEach(function(a){c.unbind(a,j)}),D.hide.forEach(function(a){c.unbind(a,m)})};x();var K=b.$eval(d[l+"Animation"]);F.animation=angular.isDefined(K)?!!K:n.animation;var L=b.$eval(d[l+"AppendToBody"]);C=angular.isDefined(L)?L:C,C&&b.$on("$locationChangeSuccess",function(){F.isOpen&&q()}),b.$on("$destroy",function(){g.cancel(A),g.cancel(B),J(),s(),F=null})}}}}}]}).directive("tooltipTemplateTransclude",["$animate","$sce","$compile","$templateRequest",function(a,b,c,d){return{link:function(e,f,g){var h,i,j,k=e.$eval(g.tooltipTemplateTranscludeScope),l=0,m=function(){i&&(i.remove(),i=null),h&&(h.$destroy(),h=null),j&&(a.leave(j).then(function(){i=null}),i=j,j=null)};e.$watch(b.parseAsResourceUrl(g.tooltipTemplateTransclude),function(b){var g=++l;b?(d(b,!0).then(function(d){if(g===l){var e=k.$new(),i=d,n=c(i)(e,function(b){m(),a.enter(b,f)});h=e,j=n,h.$emit("$includeContentLoaded",b)}},function(){g===l&&(m(),e.$emit("$includeContentError",b))}),e.$emit("$includeContentRequested",b)):m()}),e.$on("$destroy",m)}}}]).directive("tooltipClasses",function(){return{restrict:"A",link:function(a,b,c){a.placement&&b.addClass(a.placement),a.popupClass&&b.addClass(a.popupClass),a.animation()&&b.addClass(c.tooltipAnimationClass)}}}).directive("tooltipPopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-popup.html"}}).directive("tooltip",["$tooltip",function(a){return a("tooltip","tooltip","mouseenter")}]).directive("tooltipTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/tooltip/tooltip-template-popup.html"}}).directive("tooltipTemplate",["$tooltip",function(a){return a("tooltipTemplate","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-popup.html"}}).directive("tooltipHtml",["$tooltip",function(a){return a("tooltipHtml","tooltip","mouseenter",{useContentExp:!0})}]).directive("tooltipHtmlUnsafePopup",function(){return{restrict:"EA",replace:!0,scope:{content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/tooltip/tooltip-html-unsafe-popup.html"}}).value("tooltipHtmlUnsafeSuppressDeprecated",!1).directive("tooltipHtmlUnsafe",["$tooltip","tooltipHtmlUnsafeSuppressDeprecated","$log",function(a,b,c){return b||c.warn("tooltip-html-unsafe is now deprecated. Use tooltip-html or tooltip-template instead."),a("tooltipHtmlUnsafe","tooltip","mouseenter")}]),angular.module("ui.bootstrap.popover",["ui.bootstrap.tooltip"]).directive("popoverTemplatePopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",contentExp:"&",placement:"@",popupClass:"@",animation:"&",isOpen:"&",originScope:"&"},templateUrl:"template/popover/popover-template.html"}}).directive("popoverTemplate",["$tooltip",function(a){return a("popoverTemplate","popover","click",{useContentExp:!0})}]).directive("popoverHtmlPopup",function(){return{restrict:"EA",replace:!0,scope:{contentExp:"&",title:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover-html.html"}}).directive("popoverHtml",["$tooltip",function(a){return a("popoverHtml","popover","click",{useContentExp:!0})}]).directive("popoverPopup",function(){return{restrict:"EA",replace:!0,scope:{title:"@",content:"@",placement:"@",popupClass:"@",animation:"&",isOpen:"&"},templateUrl:"template/popover/popover.html"}}).directive("popover",["$tooltip",function(a){return a("popover","popover","click")}]),angular.module("ui.bootstrap.progressbar",[]).constant("progressConfig",{animate:!0,max:100}).controller("ProgressController",["$scope","$attrs","progressConfig",function(a,b,c){var d=this,e=angular.isDefined(b.animate)?a.$parent.$eval(b.animate):c.animate;this.bars=[],a.max=angular.isDefined(a.max)?a.max:c.max,this.addBar=function(b,c){e||c.css({transition:"none"}),this.bars.push(b),b.max=a.max,b.$watch("value",function(){b.recalculatePercentage()}),b.recalculatePercentage=function(){b.percent=+(100*b.value/b.max).toFixed(2);var a=0;d.bars.forEach(function(b){a+=b.percent}),a>100&&(b.percent-=a-100)},b.$on("$destroy",function(){c=null,d.removeBar(b)})},this.removeBar=function(a){this.bars.splice(this.bars.indexOf(a),1)},a.$watch("max",function(){d.bars.forEach(function(b){b.max=a.max,b.recalculatePercentage()})})}]).directive("progress",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",require:"progress",scope:{max:"=?"},templateUrl:"template/progressbar/progress.html"}}).directive("bar",function(){return{restrict:"EA",replace:!0,transclude:!0,require:"^progress",scope:{value:"=",type:"@"},templateUrl:"template/progressbar/bar.html",link:function(a,b,c,d){d.addBar(a,b)}}}).directive("progressbar",function(){return{restrict:"EA",replace:!0,transclude:!0,controller:"ProgressController",scope:{value:"=",max:"=?",type:"@"},templateUrl:"template/progressbar/progressbar.html",link:function(a,b,c,d){d.addBar(a,angular.element(b.children()[0]))}}}),angular.module("ui.bootstrap.rating",[]).constant("ratingConfig",{max:5,stateOn:null,stateOff:null,titles:["one","two","three","four","five"]}).controller("RatingController",["$scope","$attrs","ratingConfig",function(a,b,c){var d={$setViewValue:angular.noop};this.init=function(e){d=e,d.$render=this.render,d.$formatters.push(function(a){return angular.isNumber(a)&&a<<0!==a&&(a=Math.round(a)),a}),this.stateOn=angular.isDefined(b.stateOn)?a.$parent.$eval(b.stateOn):c.stateOn,this.stateOff=angular.isDefined(b.stateOff)?a.$parent.$eval(b.stateOff):c.stateOff;var f=angular.isDefined(b.titles)?a.$parent.$eval(b.titles):c.titles;this.titles=angular.isArray(f)&&f.length>0?f:c.titles;var g=angular.isDefined(b.ratingStates)?a.$parent.$eval(b.ratingStates):new Array(angular.isDefined(b.max)?a.$parent.$eval(b.max):c.max);a.range=this.buildTemplateObjects(g)},this.buildTemplateObjects=function(a){for(var b=0,c=a.length;c>b;b++)a[b]=angular.extend({index:b},{stateOn:this.stateOn,stateOff:this.stateOff,title:this.getTitle(b)},a[b]);return a},this.getTitle=function(a){return a>=this.titles.length?a+1:this.titles[a]},a.rate=function(b){!a.readonly&&b>=0&&b<=a.range.length&&(d.$setViewValue(d.$viewValue===b?0:b),d.$render())},a.enter=function(b){a.readonly||(a.value=b),a.onHover({value:b})},a.reset=function(){a.value=d.$viewValue,a.onLeave()},a.onKeydown=function(b){/(37|38|39|40)/.test(b.which)&&(b.preventDefault(),b.stopPropagation(),a.rate(a.value+(38===b.which||39===b.which?1:-1)))},this.render=function(){a.value=d.$viewValue}}]).directive("rating",function(){return{restrict:"EA",require:["rating","ngModel"],scope:{readonly:"=?",onHover:"&",onLeave:"&"},controller:"RatingController",templateUrl:"template/rating/rating.html",replace:!0,link:function(a,b,c,d){var e=d[0],f=d[1];e.init(f)}}}),angular.module("ui.bootstrap.tabs",[]).controller("TabsetController",["$scope",function(a){var b=this,c=b.tabs=a.tabs=[];b.select=function(a){angular.forEach(c,function(b){b.active&&b!==a&&(b.active=!1,b.onDeselect())}),a.active=!0,a.onSelect()},b.addTab=function(a){c.push(a),1===c.length&&a.active!==!1?a.active=!0:a.active?b.select(a):a.active=!1},b.removeTab=function(a){var e=c.indexOf(a);if(a.active&&c.length>1&&!d){var f=e==c.length-1?e-1:e+1;b.select(c[f])}c.splice(e,1)};var d;a.$on("$destroy",function(){d=!0})}]).directive("tabset",function(){return{restrict:"EA",transclude:!0,replace:!0,scope:{type:"@"},controller:"TabsetController",templateUrl:"template/tabs/tabset.html",link:function(a,b,c){a.vertical=angular.isDefined(c.vertical)?a.$parent.$eval(c.vertical):!1,a.justified=angular.isDefined(c.justified)?a.$parent.$eval(c.justified):!1}}}).directive("tab",["$parse","$log",function(a,b){return{require:"^tabset",restrict:"EA",replace:!0,templateUrl:"template/tabs/tab.html",transclude:!0,scope:{active:"=?",heading:"@",onSelect:"&select",onDeselect:"&deselect"},controller:function(){},link:function(c,d,e,f,g){c.$watch("active",function(a){a&&f.select(c)}),c.disabled=!1,e.disable&&c.$parent.$watch(a(e.disable),function(a){c.disabled=!!a}),e.disabled&&(b.warn('Use of "disabled" attribute has been deprecated, please use "disable"'),c.$parent.$watch(a(e.disabled),function(a){c.disabled=!!a})),c.select=function(){c.disabled||(c.active=!0)},f.addTab(c),c.$on("$destroy",function(){f.removeTab(c)}),c.$transcludeFn=g}}}]).directive("tabHeadingTransclude",[function(){return{restrict:"A",require:"^tab",link:function(a,b){a.$watch("headingElement",function(a){a&&(b.html(""),b.append(a))})}}}]).directive("tabContentTransclude",function(){function a(a){return a.tagName&&(a.hasAttribute("tab-heading")||a.hasAttribute("data-tab-heading")||"tab-heading"===a.tagName.toLowerCase()||"data-tab-heading"===a.tagName.toLowerCase())}return{restrict:"A",require:"^tabset",link:function(b,c,d){var e=b.$eval(d.tabContentTransclude);e.$transcludeFn(e.$parent,function(b){angular.forEach(b,function(b){a(b)?e.headingElement=b:c.append(b)})})}}}),angular.module("ui.bootstrap.timepicker",[]).constant("timepickerConfig",{hourStep:1,minuteStep:1,showMeridian:!0,meridians:null,readonlyInput:!1,mousewheel:!0,arrowkeys:!0,showSpinners:!0}).controller("TimepickerController",["$scope","$attrs","$parse","$log","$locale","timepickerConfig",function(a,b,c,d,e,f){function g(){var b=parseInt(a.hours,10),c=a.showMeridian?b>0&&13>b:b>=0&&24>b;return c?(a.showMeridian&&(12===b&&(b=0),a.meridian===q[1]&&(b+=12)),b):void 0}function h(){var b=parseInt(a.minutes,10);return b>=0&&60>b?b:void 0}function i(a){return angular.isDefined(a)&&a.toString().length<2?"0"+a:a.toString()}function j(a){k(),p.$setViewValue(new Date(o)),l(a)}function k(){p.$setValidity("time",!0),a.invalidHours=!1,a.invalidMinutes=!1}function l(b){var c=o.getHours(),d=o.getMinutes();a.showMeridian&&(c=0===c||12===c?12:c%12),a.hours="h"===b?c:i(c),"m"!==b&&(a.minutes=i(d)),a.meridian=o.getHours()<12?q[0]:q[1]}function m(a,b){var c=new Date(a.getTime()+6e4*b),d=new Date(a);return d.setHours(c.getHours(),c.getMinutes()),d}function n(a){o=m(o,a),j()}var o=new Date,p={$setViewValue:angular.noop},q=angular.isDefined(b.meridians)?a.$parent.$eval(b.meridians):f.meridians||e.DATETIME_FORMATS.AMPMS;this.init=function(c,d){p=c,p.$render=this.render,p.$formatters.unshift(function(a){return a?new Date(a):null});var e=d.eq(0),g=d.eq(1),h=angular.isDefined(b.mousewheel)?a.$parent.$eval(b.mousewheel):f.mousewheel;h&&this.setupMousewheelEvents(e,g);var i=angular.isDefined(b.arrowkeys)?a.$parent.$eval(b.arrowkeys):f.arrowkeys;i&&this.setupArrowkeyEvents(e,g),a.readonlyInput=angular.isDefined(b.readonlyInput)?a.$parent.$eval(b.readonlyInput):f.readonlyInput,this.setupInputEvents(e,g)};var r=f.hourStep;b.hourStep&&a.$parent.$watch(c(b.hourStep),function(a){r=parseInt(a,10)});var s=f.minuteStep;b.minuteStep&&a.$parent.$watch(c(b.minuteStep),function(a){s=parseInt(a,10)});var t;a.$parent.$watch(c(b.min),function(a){var b=new Date(a);t=isNaN(b)?void 0:b});var u;a.$parent.$watch(c(b.max),function(a){var b=new Date(a);u=isNaN(b)?void 0:b}),a.noIncrementHours=function(){var a=m(o,60*r);return a>u||o>a&&t>a},a.noDecrementHours=function(){var a=m(o,60*-r);return t>a||a>o&&a>u},a.noIncrementMinutes=function(){var a=m(o,s);return a>u||o>a&&t>a},a.noDecrementMinutes=function(){var a=m(o,-s);return t>a||a>o&&a>u},a.noToggleMeridian=function(){return o.getHours()<13?m(o,720)>u:m(o,-720)<t},a.showMeridian=f.showMeridian,b.showMeridian&&a.$parent.$watch(c(b.showMeridian),function(b){if(a.showMeridian=!!b,p.$error.time){var c=g(),d=h();angular.isDefined(c)&&angular.isDefined(d)&&(o.setHours(c),j())}else l()}),this.setupMousewheelEvents=function(b,c){var d=function(a){a.originalEvent&&(a=a.originalEvent);var b=a.wheelDelta?a.wheelDelta:-a.deltaY;return a.detail||b>0};b.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementHours():a.decrementHours()),b.preventDefault()}),c.bind("mousewheel wheel",function(b){a.$apply(d(b)?a.incrementMinutes():a.decrementMinutes()),b.preventDefault()})},this.setupArrowkeyEvents=function(b,c){b.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementHours(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementHours(),a.$apply())}),c.bind("keydown",function(b){38===b.which?(b.preventDefault(),a.incrementMinutes(),a.$apply()):40===b.which&&(b.preventDefault(),a.decrementMinutes(),a.$apply())})},this.setupInputEvents=function(b,c){if(a.readonlyInput)return a.updateHours=angular.noop,void(a.updateMinutes=angular.noop);var d=function(b,c){p.$setViewValue(null),p.$setValidity("time",!1),angular.isDefined(b)&&(a.invalidHours=b),angular.isDefined(c)&&(a.invalidMinutes=c)};a.updateHours=function(){var a=g();angular.isDefined(a)?(o.setHours(a),t>o||o>u?d(!0):j("h")):d(!0)},b.bind("blur",function(){!a.invalidHours&&a.hours<10&&a.$apply(function(){a.hours=i(a.hours)})}),a.updateMinutes=function(){var a=h();angular.isDefined(a)?(o.setMinutes(a),t>o||o>u?d(void 0,!0):j("m")):d(void 0,!0)},c.bind("blur",function(){!a.invalidMinutes&&a.minutes<10&&a.$apply(function(){a.minutes=i(a.minutes)})})},this.render=function(){var b=p.$viewValue;isNaN(b)?(p.$setValidity("time",!1),d.error('Timepicker directive: "ng-model" value must be a Date object, a number of milliseconds since 01.01.1970 or a string representing an RFC2822 or ISO 8601 date.')):(b&&(o=b),t>o||o>u?(p.$setValidity("time",!1),a.invalidHours=!0,a.invalidMinutes=!0):k(),l())},a.showSpinners=angular.isDefined(b.showSpinners)?a.$parent.$eval(b.showSpinners):f.showSpinners,a.incrementHours=function(){a.noIncrementHours()||n(60*r)},a.decrementHours=function(){a.noDecrementHours()||n(60*-r)},a.incrementMinutes=function(){a.noIncrementMinutes()||n(s)},a.decrementMinutes=function(){a.noDecrementMinutes()||n(-s)},a.toggleMeridian=function(){a.noToggleMeridian()||n(720*(o.getHours()<12?1:-1))}}]).directive("timepicker",function(){return{restrict:"EA",require:["timepicker","?^ngModel"],controller:"TimepickerController",replace:!0,scope:{},templateUrl:"template/timepicker/timepicker.html",link:function(a,b,c,d){var e=d[0],f=d[1];f&&e.init(f,b.find("input"))}}}),angular.module("ui.bootstrap.transition",[]).value("$transitionSuppressDeprecated",!1).factory("$transition",["$q","$timeout","$rootScope","$log","$transitionSuppressDeprecated",function(a,b,c,d,e){function f(a){for(var b in a)if(void 0!==h.style[b])return a[b]}e||d.warn("$transition is now deprecated. Use $animate from ngAnimate instead.");var g=function(d,e,f){f=f||{};var h=a.defer(),i=g[f.animation?"animationEndEventName":"transitionEndEventName"],j=function(){c.$apply(function(){d.unbind(i,j),h.resolve(d)})};return i&&d.bind(i,j),b(function(){angular.isString(e)?d.addClass(e):angular.isFunction(e)?e(d):angular.isObject(e)&&d.css(e),i||h.resolve(d)}),h.promise.cancel=function(){i&&d.unbind(i,j),h.reject("Transition cancelled")},h.promise},h=document.createElement("trans"),i={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"},j={WebkitTransition:"webkitAnimationEnd",MozTransition:"animationend",OTransition:"oAnimationEnd",transition:"animationend"};return g.transitionEndEventName=f(i),g.animationEndEventName=f(j),g}]),angular.module("ui.bootstrap.typeahead",["ui.bootstrap.position","ui.bootstrap.bindHtml"]).factory("typeaheadParser",["$parse",function(a){var b=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w\d]*))\s+in\s+([\s\S]+?)$/;return{parse:function(c){var d=c.match(b);if(!d)throw new Error('Expected typeahead specification in form of "_modelValue_ (as _label_)? for _item_ in _collection_" but got "'+c+'".');return{itemName:d[3],source:a(d[4]),viewMapper:a(d[2]||d[1]),modelMapper:a(d[1])}}}}]).directive("typeahead",["$compile","$parse","$q","$timeout","$document","$window","$rootScope","$position","typeaheadParser",function(a,b,c,d,e,f,g,h,i){var j=[9,13,27,38,40],k=200;return{require:"ngModel",link:function(l,m,n,o){function p(){G.moveInProgress||(G.moveInProgress=!0,G.$digest()),N&&d.cancel(N),N=d(function(){G.matches.length&&q(),G.moveInProgress=!1,G.$digest()},k)}function q(){G.position=B?h.offset(m):h.position(m),G.position.top+=m.prop("offsetHeight")}var r=l.$eval(n.typeaheadMinLength);r||0===r||(r=1);var s,t,u=l.$eval(n.typeaheadWaitMs)||0,v=l.$eval(n.typeaheadEditable)!==!1,w=b(n.typeaheadLoading).assign||angular.noop,x=b(n.typeaheadOnSelect),y=angular.isDefined(n.typeaheadSelectOnBlur)?l.$eval(n.typeaheadSelectOnBlur):!1,z=b(n.typeaheadNoResults).assign||angular.noop,A=n.typeaheadInputFormatter?b(n.typeaheadInputFormatter):void 0,B=n.typeaheadAppendToBody?l.$eval(n.typeaheadAppendToBody):!1,C=l.$eval(n.typeaheadFocusFirst)!==!1,D=n.typeaheadSelectOnExact?l.$eval(n.typeaheadSelectOnExact):!1,E=b(n.ngModel).assign,F=i.parse(n.typeahead),G=l.$new();l.$on("$destroy",function(){G.$destroy()});var H="typeahead-"+G.$id+"-"+Math.floor(1e4*Math.random());m.attr({"aria-autocomplete":"list","aria-expanded":!1,"aria-owns":H});var I=angular.element("<div typeahead-popup></div>");I.attr({id:H,matches:"matches",active:"activeIdx",select:"select(activeIdx)","move-in-progress":"moveInProgress",query:"query",position:"position"}),angular.isDefined(n.typeaheadTemplateUrl)&&I.attr("template-url",n.typeaheadTemplateUrl);var J=function(){G.matches=[],G.activeIdx=-1,m.attr("aria-expanded",!1)},K=function(a){return H+"-option-"+a};G.$watch("activeIdx",function(a){0>a?m.removeAttr("aria-activedescendant"):m.attr("aria-activedescendant",K(a))});var L=function(a,b){return G.matches.length>b&&a?a.toUpperCase()===G.matches[b].label.toUpperCase():!1},M=function(a){var b={$viewValue:a};w(l,!0),z(l,!1),c.when(F.source(l,b)).then(function(c){var d=a===o.$viewValue;if(d&&s)if(c&&c.length>0){G.activeIdx=C?0:-1,z(l,!1),G.matches.length=0;for(var e=0;e<c.length;e++)b[F.itemName]=c[e],
10
+ G.matches.push({id:K(e),label:F.viewMapper(G,b),model:c[e]});G.query=a,q(),m.attr("aria-expanded",!0),D&&1===G.matches.length&&L(a,0)&&G.select(0)}else J(),z(l,!0);d&&w(l,!1)},function(){J(),w(l,!1),z(l,!0)})};B&&(angular.element(f).bind("resize",p),e.find("body").bind("scroll",p));var N;G.moveInProgress=!1,J(),G.query=void 0;var O,P=function(a){O=d(function(){M(a)},u)},Q=function(){O&&d.cancel(O)};o.$parsers.unshift(function(a){return s=!0,0===r||a&&a.length>=r?u>0?(Q(),P(a)):M(a):(w(l,!1),Q(),J()),v?a:a?void o.$setValidity("editable",!1):(o.$setValidity("editable",!0),null)}),o.$formatters.push(function(a){var b,c,d={};return v||o.$setValidity("editable",!0),A?(d.$model=a,A(l,d)):(d[F.itemName]=a,b=F.viewMapper(l,d),d[F.itemName]=void 0,c=F.viewMapper(l,d),b!==c?b:a)}),G.select=function(a){var b,c,e={};t=!0,e[F.itemName]=c=G.matches[a].model,b=F.modelMapper(l,e),E(l,b),o.$setValidity("editable",!0),o.$setValidity("parse",!0),x(l,{$item:c,$model:b,$label:F.viewMapper(l,e)}),J(),d(function(){m[0].focus()},0,!1)},m.bind("keydown",function(a){if(0!==G.matches.length&&-1!==j.indexOf(a.which)){if(-1===G.activeIdx&&(9===a.which||13===a.which))return J(),void G.$digest();a.preventDefault(),40===a.which?(G.activeIdx=(G.activeIdx+1)%G.matches.length,G.$digest()):38===a.which?(G.activeIdx=(G.activeIdx>0?G.activeIdx:G.matches.length)-1,G.$digest()):13===a.which||9===a.which?G.$apply(function(){G.select(G.activeIdx)}):27===a.which&&(a.stopPropagation(),J(),G.$digest())}}),m.bind("blur",function(){y&&G.matches.length&&-1!==G.activeIdx&&!t&&(t=!0,G.$apply(function(){G.select(G.activeIdx)})),s=!1,t=!1});var R=function(a){m[0]!==a.target&&3!==a.which&&0!==G.matches.length&&(J(),g.$$phase||G.$digest())};e.bind("click",R),l.$on("$destroy",function(){e.unbind("click",R),B&&S.remove(),I.remove()});var S=a(I)(G);B?e.find("body").append(S):m.after(S)}}}]).directive("typeaheadPopup",function(){return{restrict:"EA",scope:{matches:"=",query:"=",active:"=",position:"&",moveInProgress:"=",select:"&"},replace:!0,templateUrl:"template/typeahead/typeahead-popup.html",link:function(a,b,c){a.templateUrl=c.templateUrl,a.isOpen=function(){return a.matches.length>0},a.isActive=function(b){return a.active==b},a.selectActive=function(b){a.active=b},a.selectMatch=function(b){a.select({activeIdx:b})}}}}).directive("typeaheadMatch",["$templateRequest","$compile","$parse",function(a,b,c){return{restrict:"EA",scope:{index:"=",match:"=",query:"="},link:function(d,e,f){var g=c(f.templateUrl)(d.$parent)||"template/typeahead/typeahead-match.html";a(g).then(function(a){b(a.trim())(d,function(a){e.replaceWith(a)})})}}}]).filter("typeaheadHighlight",function(){function a(a){return a.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1")}return function(b,c){return c?(""+b).replace(new RegExp(a(c),"gi"),"<strong>$&</strong>"):b}}),angular.module("template/accordion/accordion-group.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion-group.html",'<div class="panel panel-default" ng-class="{\'panel-open\': isOpen}">\n <div class="panel-heading">\n <h4 class="panel-title">\n <a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" accordion-transclude="heading"><span ng-class="{\'text-muted\': isDisabled}">{{heading}}</span></a>\n </h4>\n </div>\n <div class="panel-collapse collapse" collapse="!isOpen">\n <div class="panel-body" ng-transclude></div>\n </div>\n</div>\n')}]),angular.module("template/accordion/accordion.html",[]).run(["$templateCache",function(a){a.put("template/accordion/accordion.html",'<div class="panel-group" ng-transclude></div>')}]),angular.module("template/alert/alert.html",[]).run(["$templateCache",function(a){a.put("template/alert/alert.html",'<div class="alert" ng-class="[\'alert-\' + (type || \'warning\'), closeable ? \'alert-dismissible\' : null]" role="alert">\n <button ng-show="closeable" type="button" class="close" ng-click="close($event)">\n <span aria-hidden="true">&times;</span>\n <span class="sr-only">Close</span>\n </button>\n <div ng-transclude></div>\n</div>\n')}]),angular.module("template/carousel/carousel.html",[]).run(["$templateCache",function(a){a.put("template/carousel/carousel.html",'<div ng-mouseenter="pause()" ng-mouseleave="play()" class="carousel" ng-swipe-right="prev()" ng-swipe-left="next()">\n <ol class="carousel-indicators" ng-show="slides.length > 1">\n <li ng-repeat="slide in slides | orderBy:indexOfSlide track by $index" ng-class="{active: isActive(slide)}" ng-click="select(slide)"></li>\n </ol>\n <div class="carousel-inner" ng-transclude></div>\n <a class="left carousel-control" ng-click="prev()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-left"></span></a>\n <a class="right carousel-control" ng-click="next()" ng-show="slides.length > 1"><span class="glyphicon glyphicon-chevron-right"></span></a>\n</div>\n')}]),angular.module("template/carousel/slide.html",[]).run(["$templateCache",function(a){a.put("template/carousel/slide.html",'<div ng-class="{\n \'active\': active\n }" class="item text-center" ng-transclude></div>\n')}]),angular.module("template/datepicker/datepicker.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/datepicker.html",'<div ng-switch="datepickerMode" role="application" ng-keydown="keydown($event)">\n <daypicker ng-switch-when="day" tabindex="0"></daypicker>\n <monthpicker ng-switch-when="month" tabindex="0"></monthpicker>\n <yearpicker ng-switch-when="year" tabindex="0"></yearpicker>\n</div>')}]),angular.module("template/datepicker/day.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/day.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="{{::5 + showWeeks}}"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n <tr>\n <th ng-if="showWeeks" class="text-center"></th>\n <th ng-repeat="label in ::labels track by $index" class="text-center"><small aria-label="{{::label.full}}">{{::label.abbr}}</small></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-if="showWeeks" class="text-center h6"><em>{{ weekNumbers[$index] }}</em></td>\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default btn-sm" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-muted\': dt.secondary, \'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/month.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/month.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}" ng-class="::dt.customClass">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/datepicker/popup.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/popup.html",'<ul class="dropdown-menu" ng-if="isOpen" style="display: block" ng-style="{top: position.top+\'px\', left: position.left+\'px\'}" ng-keydown="keydown($event)" ng-click="$event.stopPropagation()">\n <li ng-transclude></li>\n <li ng-if="showButtonBar" style="padding:10px 9px 2px">\n <span class="btn-group pull-left">\n <button type="button" class="btn btn-sm btn-info" ng-click="select(\'today\')">{{ getText(\'current\') }}</button>\n <button type="button" class="btn btn-sm btn-danger" ng-click="select(null)">{{ getText(\'clear\') }}</button>\n </span>\n <button type="button" class="btn btn-sm btn-success pull-right" ng-click="close()">{{ getText(\'close\') }}</button>\n </li>\n</ul>\n')}]),angular.module("template/datepicker/year.html",[]).run(["$templateCache",function(a){a.put("template/datepicker/year.html",'<table role="grid" aria-labelledby="{{::uniqueId}}-title" aria-activedescendant="{{activeDateId}}">\n <thead>\n <tr>\n <th><button type="button" class="btn btn-default btn-sm pull-left" ng-click="move(-1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-left"></i></button></th>\n <th colspan="3"><button id="{{::uniqueId}}-title" role="heading" aria-live="assertive" aria-atomic="true" type="button" class="btn btn-default btn-sm" ng-click="toggleMode()" ng-disabled="datepickerMode === maxMode" tabindex="-1" style="width:100%;"><strong>{{title}}</strong></button></th>\n <th><button type="button" class="btn btn-default btn-sm pull-right" ng-click="move(1)" tabindex="-1"><i class="glyphicon glyphicon-chevron-right"></i></button></th>\n </tr>\n </thead>\n <tbody>\n <tr ng-repeat="row in rows track by $index">\n <td ng-repeat="dt in row track by dt.date" class="text-center" role="gridcell" id="{{::dt.uid}}">\n <button type="button" style="min-width:100%;" class="btn btn-default" ng-class="{\'btn-info\': dt.selected, active: isActive(dt)}" ng-click="select(dt.date)" ng-disabled="dt.disabled" tabindex="-1"><span ng-class="::{\'text-info\': dt.current}">{{::dt.label}}</span></button>\n </td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/modal/backdrop.html",[]).run(["$templateCache",function(a){a.put("template/modal/backdrop.html",'<div class="modal-backdrop"\n modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1040 + (index && 1 || 0) + index*10}"\n></div>\n')}]),angular.module("template/modal/window.html",[]).run(["$templateCache",function(a){a.put("template/modal/window.html",'<div modal-render="{{$isRendered}}" tabindex="-1" role="dialog" class="modal"\n modal-animation-class="fade"\n modal-in-class="in"\n ng-style="{\'z-index\': 1050 + index*10, display: \'block\'}" ng-click="close($event)">\n <div class="modal-dialog" ng-class="size ? \'modal-\' + size : \'\'"><div class="modal-content" modal-transclude></div></div>\n</div>\n')}]),angular.module("template/pagination/pager.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pager.html",'<ul class="pager">\n <li ng-class="{disabled: noPrevious(), previous: align}"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-class="{disabled: noNext(), next: align}"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n</ul>')}]),angular.module("template/pagination/pagination.html",[]).run(["$templateCache",function(a){a.put("template/pagination/pagination.html",'<ul class="pagination">\n <li ng-if="::boundaryLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-first"><a href ng-click="selectPage(1, $event)">{{::getText(\'first\')}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noPrevious()||ngDisabled}" class="pagination-prev"><a href ng-click="selectPage(page - 1, $event)">{{::getText(\'previous\')}}</a></li>\n <li ng-repeat="page in pages track by $index" ng-class="{active: page.active,disabled: ngDisabled&&!page.active}" class="pagination-page"><a href ng-click="selectPage(page.number, $event)">{{page.text}}</a></li>\n <li ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next"><a href ng-click="selectPage(page + 1, $event)">{{::getText(\'next\')}}</a></li>\n <li ng-if="::boundaryLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-last"><a href ng-click="selectPage(totalPages, $event)">{{::getText(\'last\')}}</a></li>\n</ul>\n')}]),angular.module("template/tooltip/tooltip-html-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind-html="contentExp()"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-html-unsafe-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-html-unsafe-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" bind-html-unsafe="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner" ng-bind="content"></div>\n</div>\n')}]),angular.module("template/tooltip/tooltip-template-popup.html",[]).run(["$templateCache",function(a){a.put("template/tooltip/tooltip-template-popup.html",'<div class="tooltip"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="tooltip-arrow"></div>\n <div class="tooltip-inner"\n tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n</div>\n')}]),angular.module("template/popover/popover-html.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-html.html",'<div class="popover"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind-html="contentExp()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover-template.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover-template.html",'<div class="popover"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content"\n tooltip-template-transclude="contentExp()"\n tooltip-template-transclude-scope="originScope()"></div>\n </div>\n</div>\n')}]),angular.module("template/popover/popover.html",[]).run(["$templateCache",function(a){a.put("template/popover/popover.html",'<div class="popover"\n tooltip-animation-class="fade"\n tooltip-classes\n ng-class="{ in: isOpen() }">\n <div class="arrow"></div>\n\n <div class="popover-inner">\n <h3 class="popover-title" ng-bind="title" ng-if="title"></h3>\n <div class="popover-content" ng-bind="content"></div>\n </div>\n</div>\n')}]),angular.module("template/progressbar/bar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/bar.html",'<div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" style="min-width: 0;" ng-transclude></div>\n')}]),angular.module("template/progressbar/progress.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progress.html",'<div class="progress" ng-transclude></div>')}]),angular.module("template/progressbar/progressbar.html",[]).run(["$templateCache",function(a){a.put("template/progressbar/progressbar.html",'<div class="progress">\n <div class="progress-bar" ng-class="type && \'progress-bar-\' + type" role="progressbar" aria-valuenow="{{value}}" aria-valuemin="0" aria-valuemax="{{max}}" ng-style="{width: (percent < 100 ? percent : 100) + \'%\'}" aria-valuetext="{{percent | number:0}}%" style="min-width: 0;" ng-transclude></div>\n</div>\n')}]),angular.module("template/rating/rating.html",[]).run(["$templateCache",function(a){a.put("template/rating/rating.html",'<span ng-mouseleave="reset()" ng-keydown="onKeydown($event)" tabindex="0" role="slider" aria-valuemin="0" aria-valuemax="{{range.length}}" aria-valuenow="{{value}}">\n <span ng-repeat-start="r in range track by $index" class="sr-only">({{ $index < value ? \'*\' : \' \' }})</span>\n <i ng-repeat-end ng-mouseenter="enter($index + 1)" ng-click="rate($index + 1)" class="glyphicon" ng-class="$index < value && (r.stateOn || \'glyphicon-star\') || (r.stateOff || \'glyphicon-star-empty\')" ng-attr-title="{{r.title}}" ></i>\n</span>\n')}]),angular.module("template/tabs/tab.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tab.html",'<li ng-class="{active: active, disabled: disabled}">\n <a href ng-click="select()" tab-heading-transclude>{{heading}}</a>\n</li>\n')}]),angular.module("template/tabs/tabset.html",[]).run(["$templateCache",function(a){a.put("template/tabs/tabset.html",'<div>\n <ul class="nav nav-{{type || \'tabs\'}}" ng-class="{\'nav-stacked\': vertical, \'nav-justified\': justified}" ng-transclude></ul>\n <div class="tab-content">\n <div class="tab-pane" \n ng-repeat="tab in tabs" \n ng-class="{active: tab.active}"\n tab-content-transclude="tab">\n </div>\n </div>\n</div>\n')}]),angular.module("template/timepicker/timepicker.html",[]).run(["$templateCache",function(a){a.put("template/timepicker/timepicker.html",'<table>\n <tbody>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="incrementHours()" ng-class="{disabled: noIncrementHours()}" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td>&nbsp;</td>\n <td><a ng-click="incrementMinutes()" ng-class="{disabled: noIncrementMinutes()}" class="btn btn-link"><span class="glyphicon glyphicon-chevron-up"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n <tr>\n <td class="form-group" ng-class="{\'has-error\': invalidHours}">\n <input style="width:50px;" type="text" ng-model="hours" ng-change="updateHours()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2">\n </td>\n <td>:</td>\n <td class="form-group" ng-class="{\'has-error\': invalidMinutes}">\n <input style="width:50px;" type="text" ng-model="minutes" ng-change="updateMinutes()" class="form-control text-center" ng-readonly="::readonlyInput" maxlength="2">\n </td>\n <td ng-show="showMeridian"><button type="button" ng-class="{disabled: noToggleMeridian()}" class="btn btn-default text-center" ng-click="toggleMeridian()">{{meridian}}</button></td>\n </tr>\n <tr class="text-center" ng-show="::showSpinners">\n <td><a ng-click="decrementHours()" ng-class="{disabled: noDecrementHours()}" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td>&nbsp;</td>\n <td><a ng-click="decrementMinutes()" ng-class="{disabled: noDecrementMinutes()}" class="btn btn-link"><span class="glyphicon glyphicon-chevron-down"></span></a></td>\n <td ng-show="showMeridian"></td>\n </tr>\n </tbody>\n</table>\n')}]),angular.module("template/typeahead/typeahead-match.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-match.html",'<a href tabindex="-1" bind-html-unsafe="match.label | typeaheadHighlight:query"></a>\n')}]),angular.module("template/typeahead/typeahead-popup.html",[]).run(["$templateCache",function(a){a.put("template/typeahead/typeahead-popup.html",'<ul class="dropdown-menu" ng-show="isOpen() && !moveInProgress" ng-style="{top: position().top+\'px\', left: position().left+\'px\'}" style="display: block;" role="listbox" aria-hidden="{{!isOpen()}}">\n <li ng-repeat="match in matches track by $index" ng-class="{active: isActive($index) }" ng-mouseenter="selectActive($index)" ng-click="selectMatch($index)" role="option" id="{{::match.id}}">\n <div typeahead-match index="$index" match="match" query="query" template-url="templateUrl"></div>\n </li>\n</ul>\n')}]),!angular.$$csp()&&angular.element(document).find("head").prepend('<style type="text/css">.ng-animate.item:not(.left):not(.right){-webkit-transition:0s ease-in-out left;transition:0s ease-in-out left}</style>');
res/bootstrap/css/egg-bootstrap.css ADDED
@@ -0,0 +1,5319 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ .egg-container {
8
+ /* font-family: sans-serif; */
9
+ -webkit-text-size-adjust: 100%;
10
+ -ms-text-size-adjust: 100%;
11
+ }
12
+ .egg-container {
13
+ margin: 0;
14
+ }
15
+ .egg-container input[type="button"],
16
+ .egg-container input[disabled] {
17
+ cursor: default;
18
+ }
19
+ .egg-container .thumbnail > img,
20
+ .egg-container .thumbnail a > img,
21
+ .egg-container .img-responsive {
22
+ display: block;
23
+ max-width: 100%;
24
+ height: auto;
25
+ }
26
+ .egg-container {
27
+ /*! normalize.css v3.0.2 | MIT License | git.io/normalize */
28
+ /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
29
+ }
30
+ .egg-container html {
31
+ /* font-family: sans-serif; */
32
+ -webkit-text-size-adjust: 100%;
33
+ -ms-text-size-adjust: 100%;
34
+ }
35
+ .egg-container body {
36
+ margin: 0;
37
+ }
38
+ .egg-container article,
39
+ .egg-container aside,
40
+ .egg-container details,
41
+ .egg-container figcaption,
42
+ .egg-container figure,
43
+ .egg-container footer,
44
+ .egg-container header,
45
+ .egg-container hgroup,
46
+ .egg-container main,
47
+ .egg-container menu,
48
+ .egg-container nav,
49
+ .egg-container section,
50
+ .egg-container summary {
51
+ display: block;
52
+ }
53
+ .egg-container audio,
54
+ .egg-container canvas,
55
+ .egg-container progress,
56
+ .egg-container video {
57
+ display: inline-block;
58
+ vertical-align: baseline;
59
+ }
60
+ .egg-container audio:not([controls]) {
61
+ display: none;
62
+ height: 0;
63
+ }
64
+ .egg-container [hidden],
65
+ .egg-container template {
66
+ display: none;
67
+ }
68
+ .egg-container a {
69
+ background-color: transparent;
70
+ }
71
+ .egg-container a:active,
72
+ .egg-container a:hover {
73
+ outline: 0;
74
+ }
75
+ .egg-container abbr[title] {
76
+ border-bottom: 1px dotted;
77
+ }
78
+ .egg-container b,
79
+ .egg-container strong {
80
+ font-weight: bold;
81
+ }
82
+ .egg-container dfn {
83
+ font-style: italic;
84
+ }
85
+ .egg-container h1 {
86
+ margin: .67em 0;
87
+ font-size: 2em;
88
+ }
89
+ .egg-container mark {
90
+ color: #000;
91
+ background: #ff0;
92
+ }
93
+ .egg-container small {
94
+ font-size: 80%;
95
+ }
96
+ .egg-container sub,
97
+ .egg-container sup {
98
+ position: relative;
99
+ font-size: 75%;
100
+ line-height: 0;
101
+ vertical-align: baseline;
102
+ }
103
+ .egg-container sup {
104
+ top: -.5em;
105
+ }
106
+ .egg-container sub {
107
+ bottom: -.25em;
108
+ }
109
+ .egg-container img {
110
+ border: 0;
111
+ }
112
+ .egg-container svg:not(:root) {
113
+ overflow: hidden;
114
+ }
115
+ .egg-container figure {
116
+ margin: 1em 40px;
117
+ }
118
+ .egg-container hr {
119
+ height: 0;
120
+ -webkit-box-sizing: content-box;
121
+ -moz-box-sizing: content-box;
122
+ box-sizing: content-box;
123
+ }
124
+ .egg-container pre {
125
+ overflow: auto;
126
+ }
127
+ .egg-container code,
128
+ .egg-container kbd,
129
+ .egg-container pre,
130
+ .egg-container samp {
131
+ /* font-family: monospace, monospace; */
132
+ font-size: 1em;
133
+ }
134
+ .egg-container button,
135
+ .egg-container input,
136
+ .egg-container optgroup,
137
+ .egg-container select,
138
+ .egg-container textarea {
139
+ margin: 0;
140
+ font: inherit;
141
+ color: inherit;
142
+ }
143
+ .egg-container button {
144
+ overflow: visible;
145
+ }
146
+ .egg-container button,
147
+ .egg-container select {
148
+ text-transform: none;
149
+ }
150
+ .egg-container button,
151
+ .egg-container html input[type="button"],
152
+ .egg-container input[type="reset"],
153
+ .egg-container input[type="submit"] {
154
+ -webkit-appearance: button;
155
+ cursor: pointer;
156
+ }
157
+ .egg-container button[disabled],
158
+ .egg-container html input[disabled] {
159
+ cursor: default;
160
+ }
161
+ .egg-container button::-moz-focus-inner,
162
+ .egg-container input::-moz-focus-inner {
163
+ padding: 0;
164
+ border: 0;
165
+ }
166
+ .egg-container input {
167
+ line-height: normal;
168
+ }
169
+ .egg-container input[type="checkbox"],
170
+ .egg-container input[type="radio"] {
171
+ -webkit-box-sizing: border-box;
172
+ -moz-box-sizing: border-box;
173
+ box-sizing: border-box;
174
+ padding: 0;
175
+ }
176
+ .egg-container input[type="number"]::-webkit-inner-spin-button,
177
+ .egg-container input[type="number"]::-webkit-outer-spin-button {
178
+ height: auto;
179
+ }
180
+ .egg-container input[type="search"] {
181
+ -webkit-box-sizing: content-box;
182
+ -moz-box-sizing: content-box;
183
+ box-sizing: content-box;
184
+ -webkit-appearance: textfield;
185
+ }
186
+ .egg-container input[type="search"]::-webkit-search-cancel-button,
187
+ .egg-container input[type="search"]::-webkit-search-decoration {
188
+ -webkit-appearance: none;
189
+ }
190
+ .egg-container fieldset {
191
+ padding: .35em .625em .75em;
192
+ margin: 0 2px;
193
+ border: 1px solid #c0c0c0;
194
+ }
195
+ .egg-container legend {
196
+ padding: 0;
197
+ border: 0;
198
+ }
199
+ .egg-container textarea {
200
+ overflow: auto;
201
+ }
202
+ .egg-container optgroup {
203
+ font-weight: bold;
204
+ }
205
+ .egg-container table {
206
+ border-spacing: 0;
207
+ border-collapse: collapse;
208
+ }
209
+ .egg-container td,
210
+ .egg-container th {
211
+ padding: 0;
212
+ }
213
+ @media print {
214
+ .egg-container *,
215
+ .egg-container *:before,
216
+ .egg-container *:after {
217
+ color: #000 !important;
218
+ text-shadow: none !important;
219
+ background: transparent !important;
220
+ -webkit-box-shadow: none !important;
221
+ box-shadow: none !important;
222
+ }
223
+ .egg-container a,
224
+ .egg-container a:visited {
225
+ text-decoration: underline;
226
+ }
227
+ .egg-container a[href]:after {
228
+ content: " (" attr(href) ")";
229
+ }
230
+ .egg-container abbr[title]:after {
231
+ content: " (" attr(title) ")";
232
+ }
233
+ .egg-container a[href^="#"]:after,
234
+ .egg-container a[href^="javascript:"]:after {
235
+ content: "";
236
+ }
237
+ .egg-container pre,
238
+ .egg-container blockquote {
239
+ border: 1px solid #999;
240
+
241
+ page-break-inside: avoid;
242
+ }
243
+ .egg-container thead {
244
+ display: table-header-group;
245
+ }
246
+ .egg-container tr,
247
+ .egg-container img {
248
+ page-break-inside: avoid;
249
+ }
250
+ .egg-container img {
251
+ max-width: 100% !important;
252
+ }
253
+ .egg-container p,
254
+ .egg-container h2,
255
+ .egg-container h3 {
256
+ orphans: 3;
257
+ widows: 3;
258
+ }
259
+ .egg-container h2,
260
+ .egg-container h3 {
261
+ page-break-after: avoid;
262
+ }
263
+ .egg-container select {
264
+ background: #fff !important;
265
+ }
266
+ .egg-container .navbar {
267
+ display: none;
268
+ }
269
+ .egg-container .btn > .caret,
270
+ .egg-container .dropup > .btn > .caret {
271
+ border-top-color: #000 !important;
272
+ }
273
+ .egg-container .label {
274
+ border: 1px solid #000;
275
+ }
276
+ .egg-container .table {
277
+ border-collapse: collapse !important;
278
+ }
279
+ .egg-container .table td,
280
+ .egg-container .table th {
281
+ background-color: #fff !important;
282
+ }
283
+ .egg-container .table-bordered th,
284
+ .egg-container .table-bordered td {
285
+ border: 1px solid #ddd !important;
286
+ }
287
+ }
288
+ @font-face {
289
+ font-family: 'Glyphicons Halflings';
290
+
291
+ src: url('../fonts/glyphicons-halflings-regular.eot');
292
+ src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
293
+ }
294
+ .egg-container .glyphicon {
295
+ position: relative;
296
+ top: 1px;
297
+ display: inline-block;
298
+ font-family: 'Glyphicons Halflings';
299
+ font-style: normal;
300
+ font-weight: normal;
301
+ line-height: 1;
302
+
303
+ -webkit-font-smoothing: antialiased;
304
+ -moz-osx-font-smoothing: grayscale;
305
+ }
306
+ .egg-container .glyphicon-asterisk:before {
307
+ content: "\2a";
308
+ }
309
+ .egg-container .glyphicon-plus:before {
310
+ content: "\2b";
311
+ }
312
+ .egg-container .glyphicon-euro:before,
313
+ .egg-container .glyphicon-eur:before {
314
+ content: "\20ac";
315
+ }
316
+ .egg-container .glyphicon-minus:before {
317
+ content: "\2212";
318
+ }
319
+ .egg-container .glyphicon-cloud:before {
320
+ content: "\2601";
321
+ }
322
+ .egg-container .glyphicon-envelope:before {
323
+ content: "\2709";
324
+ }
325
+ .egg-container .glyphicon-pencil:before {
326
+ content: "\270f";
327
+ }
328
+ .egg-container .glyphicon-glass:before {
329
+ content: "\e001";
330
+ }
331
+ .egg-container .glyphicon-music:before {
332
+ content: "\e002";
333
+ }
334
+ .egg-container .glyphicon-search:before {
335
+ content: "\e003";
336
+ }
337
+ .egg-container .glyphicon-heart:before {
338
+ content: "\e005";
339
+ }
340
+ .egg-container .glyphicon-star:before {
341
+ content: "\e006";
342
+ }
343
+ .egg-container .glyphicon-star-empty:before {
344
+ content: "\e007";
345
+ }
346
+ .egg-container .glyphicon-user:before {
347
+ content: "\e008";
348
+ }
349
+ .egg-container .glyphicon-film:before {
350
+ content: "\e009";
351
+ }
352
+ .egg-container .glyphicon-th-large:before {
353
+ content: "\e010";
354
+ }
355
+ .egg-container .glyphicon-th:before {
356
+ content: "\e011";
357
+ }
358
+ .egg-container .glyphicon-th-list:before {
359
+ content: "\e012";
360
+ }
361
+ .egg-container .glyphicon-ok:before {
362
+ content: "\e013";
363
+ }
364
+ .egg-container .glyphicon-remove:before {
365
+ content: "\e014";
366
+ }
367
+ .egg-container .glyphicon-zoom-in:before {
368
+ content: "\e015";
369
+ }
370
+ .egg-container .glyphicon-zoom-out:before {
371
+ content: "\e016";
372
+ }
373
+ .egg-container .glyphicon-off:before {
374
+ content: "\e017";
375
+ }
376
+ .egg-container .glyphicon-signal:before {
377
+ content: "\e018";
378
+ }
379
+ .egg-container .glyphicon-cog:before {
380
+ content: "\e019";
381
+ }
382
+ .egg-container .glyphicon-trash:before {
383
+ content: "\e020";
384
+ }
385
+ .egg-container .glyphicon-home:before {
386
+ content: "\e021";
387
+ }
388
+ .egg-container .glyphicon-file:before {
389
+ content: "\e022";
390
+ }
391
+ .egg-container .glyphicon-time:before {
392
+ content: "\e023";
393
+ }
394
+ .egg-container .glyphicon-road:before {
395
+ content: "\e024";
396
+ }
397
+ .egg-container .glyphicon-download-alt:before {
398
+ content: "\e025";
399
+ }
400
+ .egg-container .glyphicon-download:before {
401
+ content: "\e026";
402
+ }
403
+ .egg-container .glyphicon-upload:before {
404
+ content: "\e027";
405
+ }
406
+ .egg-container .glyphicon-inbox:before {
407
+ content: "\e028";
408
+ }
409
+ .egg-container .glyphicon-play-circle:before {
410
+ content: "\e029";
411
+ }
412
+ .egg-container .glyphicon-repeat:before {
413
+ content: "\e030";
414
+ }
415
+ .egg-container .glyphicon-refresh:before {
416
+ content: "\e031";
417
+ }
418
+ .egg-container .glyphicon-list-alt:before {
419
+ content: "\e032";
420
+ }
421
+ .egg-container .glyphicon-lock:before {
422
+ content: "\e033";
423
+ }
424
+ .egg-container .glyphicon-flag:before {
425
+ content: "\e034";
426
+ }
427
+ .egg-container .glyphicon-headphones:before {
428
+ content: "\e035";
429
+ }
430
+ .egg-container .glyphicon-volume-off:before {
431
+ content: "\e036";
432
+ }
433
+ .egg-container .glyphicon-volume-down:before {
434
+ content: "\e037";
435
+ }
436
+ .egg-container .glyphicon-volume-up:before {
437
+ content: "\e038";
438
+ }
439
+ .egg-container .glyphicon-qrcode:before {
440
+ content: "\e039";
441
+ }
442
+ .egg-container .glyphicon-barcode:before {
443
+ content: "\e040";
444
+ }
445
+ .egg-container .glyphicon-tag:before {
446
+ content: "\e041";
447
+ }
448
+ .egg-container .glyphicon-tags:before {
449
+ content: "\e042";
450
+ }
451
+ .egg-container .glyphicon-book:before {
452
+ content: "\e043";
453
+ }
454
+ .egg-container .glyphicon-bookmark:before {
455
+ content: "\e044";
456
+ }
457
+ .egg-container .glyphicon-print:before {
458
+ content: "\e045";
459
+ }
460
+ .egg-container .glyphicon-camera:before {
461
+ content: "\e046";
462
+ }
463
+ .egg-container .glyphicon-font:before {
464
+ content: "\e047";
465
+ }
466
+ .egg-container .glyphicon-bold:before {
467
+ content: "\e048";
468
+ }
469
+ .egg-container .glyphicon-italic:before {
470
+ content: "\e049";
471
+ }
472
+ .egg-container .glyphicon-text-height:before {
473
+ content: "\e050";
474
+ }
475
+ .egg-container .glyphicon-text-width:before {
476
+ content: "\e051";
477
+ }
478
+ .egg-container .glyphicon-align-left:before {
479
+ content: "\e052";
480
+ }
481
+ .egg-container .glyphicon-align-center:before {
482
+ content: "\e053";
483
+ }
484
+ .egg-container .glyphicon-align-right:before {
485
+ content: "\e054";
486
+ }
487
+ .egg-container .glyphicon-align-justify:before {
488
+ content: "\e055";
489
+ }
490
+ .egg-container .glyphicon-list:before {
491
+ content: "\e056";
492
+ }
493
+ .egg-container .glyphicon-indent-left:before {
494
+ content: "\e057";
495
+ }
496
+ .egg-container .glyphicon-indent-right:before {
497
+ content: "\e058";
498
+ }
499
+ .egg-container .glyphicon-facetime-video:before {
500
+ content: "\e059";
501
+ }
502
+ .egg-container .glyphicon-picture:before {
503
+ content: "\e060";
504
+ }
505
+ .egg-container .glyphicon-map-marker:before {
506
+ content: "\e062";
507
+ }
508
+ .egg-container .glyphicon-adjust:before {
509
+ content: "\e063";
510
+ }
511
+ .egg-container .glyphicon-tint:before {
512
+ content: "\e064";
513
+ }
514
+ .egg-container .glyphicon-edit:before {
515
+ content: "\e065";
516
+ }
517
+ .egg-container .glyphicon-share:before {
518
+ content: "\e066";
519
+ }
520
+ .egg-container .glyphicon-check:before {
521
+ content: "\e067";
522
+ }
523
+ .egg-container .glyphicon-move:before {
524
+ content: "\e068";
525
+ }
526
+ .egg-container .glyphicon-step-backward:before {
527
+ content: "\e069";
528
+ }
529
+ .egg-container .glyphicon-fast-backward:before {
530
+ content: "\e070";
531
+ }
532
+ .egg-container .glyphicon-backward:before {
533
+ content: "\e071";
534
+ }
535
+ .egg-container .glyphicon-play:before {
536
+ content: "\e072";
537
+ }
538
+ .egg-container .glyphicon-pause:before {
539
+ content: "\e073";
540
+ }
541
+ .egg-container .glyphicon-stop:before {
542
+ content: "\e074";
543
+ }
544
+ .egg-container .glyphicon-forward:before {
545
+ content: "\e075";
546
+ }
547
+ .egg-container .glyphicon-fast-forward:before {
548
+ content: "\e076";
549
+ }
550
+ .egg-container .glyphicon-step-forward:before {
551
+ content: "\e077";
552
+ }
553
+ .egg-container .glyphicon-eject:before {
554
+ content: "\e078";
555
+ }
556
+ .egg-container .glyphicon-chevron-left:before {
557
+ content: "\e079";
558
+ }
559
+ .egg-container .glyphicon-chevron-right:before {
560
+ content: "\e080";
561
+ }
562
+ .egg-container .glyphicon-plus-sign:before {
563
+ content: "\e081";
564
+ }
565
+ .egg-container .glyphicon-minus-sign:before {
566
+ content: "\e082";
567
+ }
568
+ .egg-container .glyphicon-remove-sign:before {
569
+ content: "\e083";
570
+ }
571
+ .egg-container .glyphicon-ok-sign:before {
572
+ content: "\e084";
573
+ }
574
+ .egg-container .glyphicon-question-sign:before {
575
+ content: "\e085";
576
+ }
577
+ .egg-container .glyphicon-info-sign:before {
578
+ content: "\e086";
579
+ }
580
+ .egg-container .glyphicon-screenshot:before {
581
+ content: "\e087";
582
+ }
583
+ .egg-container .glyphicon-remove-circle:before {
584
+ content: "\e088";
585
+ }
586
+ .egg-container .glyphicon-ok-circle:before {
587
+ content: "\e089";
588
+ }
589
+ .egg-container .glyphicon-ban-circle:before {
590
+ content: "\e090";
591
+ }
592
+ .egg-container .glyphicon-arrow-left:before {
593
+ content: "\e091";
594
+ }
595
+ .egg-container .glyphicon-arrow-right:before {
596
+ content: "\e092";
597
+ }
598
+ .egg-container .glyphicon-arrow-up:before {
599
+ content: "\e093";
600
+ }
601
+ .egg-container .glyphicon-arrow-down:before {
602
+ content: "\e094";
603
+ }
604
+ .egg-container .glyphicon-share-alt:before {
605
+ content: "\e095";
606
+ }
607
+ .egg-container .glyphicon-resize-full:before {
608
+ content: "\e096";
609
+ }
610
+ .egg-container .glyphicon-resize-small:before {
611
+ content: "\e097";
612
+ }
613
+ .egg-container .glyphicon-exclamation-sign:before {
614
+ content: "\e101";
615
+ }
616
+ .egg-container .glyphicon-gift:before {
617
+ content: "\e102";
618
+ }
619
+ .egg-container .glyphicon-leaf:before {
620
+ content: "\e103";
621
+ }
622
+ .egg-container .glyphicon-fire:before {
623
+ content: "\e104";
624
+ }
625
+ .egg-container .glyphicon-eye-open:before {
626
+ content: "\e105";
627
+ }
628
+ .egg-container .glyphicon-eye-close:before {
629
+ content: "\e106";
630
+ }
631
+ .egg-container .glyphicon-warning-sign:before {
632
+ content: "\e107";
633
+ }
634
+ .egg-container .glyphicon-plane:before {
635
+ content: "\e108";
636
+ }
637
+ .egg-container .glyphicon-calendar:before {
638
+ content: "\e109";
639
+ }
640
+ .egg-container .glyphicon-random:before {
641
+ content: "\e110";
642
+ }
643
+ .egg-container .glyphicon-comment:before {
644
+ content: "\e111";
645
+ }
646
+ .egg-container .glyphicon-magnet:before {
647
+ content: "\e112";
648
+ }
649
+ .egg-container .glyphicon-chevron-up:before {
650
+ content: "\e113";
651
+ }
652
+ .egg-container .glyphicon-chevron-down:before {
653
+ content: "\e114";
654
+ }
655
+ .egg-container .glyphicon-retweet:before {
656
+ content: "\e115";
657
+ }
658
+ .egg-container .glyphicon-shopping-cart:before {
659
+ content: "\e116";
660
+ }
661
+ .egg-container .glyphicon-folder-close:before {
662
+ content: "\e117";
663
+ }
664
+ .egg-container .glyphicon-folder-open:before {
665
+ content: "\e118";
666
+ }
667
+ .egg-container .glyphicon-resize-vertical:before {
668
+ content: "\e119";
669
+ }
670
+ .egg-container .glyphicon-resize-horizontal:before {
671
+ content: "\e120";
672
+ }
673
+ .egg-container .glyphicon-hdd:before {
674
+ content: "\e121";
675
+ }
676
+ .egg-container .glyphicon-bullhorn:before {
677
+ content: "\e122";
678
+ }
679
+ .egg-container .glyphicon-bell:before {
680
+ content: "\e123";
681
+ }
682
+ .egg-container .glyphicon-certificate:before {
683
+ content: "\e124";
684
+ }
685
+ .egg-container .glyphicon-thumbs-up:before {
686
+ content: "\e125";
687
+ }
688
+ .egg-container .glyphicon-thumbs-down:before {
689
+ content: "\e126";
690
+ }
691
+ .egg-container .glyphicon-hand-right:before {
692
+ content: "\e127";
693
+ }
694
+ .egg-container .glyphicon-hand-left:before {
695
+ content: "\e128";
696
+ }
697
+ .egg-container .glyphicon-hand-up:before {
698
+ content: "\e129";
699
+ }
700
+ .egg-container .glyphicon-hand-down:before {
701
+ content: "\e130";
702
+ }
703
+ .egg-container .glyphicon-circle-arrow-right:before {
704
+ content: "\e131";
705
+ }
706
+ .egg-container .glyphicon-circle-arrow-left:before {
707
+ content: "\e132";
708
+ }
709
+ .egg-container .glyphicon-circle-arrow-up:before {
710
+ content: "\e133";
711
+ }
712
+ .egg-container .glyphicon-circle-arrow-down:before {
713
+ content: "\e134";
714
+ }
715
+ .egg-container .glyphicon-globe:before {
716
+ content: "\e135";
717
+ }
718
+ .egg-container .glyphicon-wrench:before {
719
+ content: "\e136";
720
+ }
721
+ .egg-container .glyphicon-tasks:before {
722
+ content: "\e137";
723
+ }
724
+ .egg-container .glyphicon-filter:before {
725
+ content: "\e138";
726
+ }
727
+ .egg-container .glyphicon-briefcase:before {
728
+ content: "\e139";
729
+ }
730
+ .egg-container .glyphicon-fullscreen:before {
731
+ content: "\e140";
732
+ }
733
+ .egg-container .glyphicon-dashboard:before {
734
+ content: "\e141";
735
+ }
736
+ .egg-container .glyphicon-paperclip:before {
737
+ content: "\e142";
738
+ }
739
+ .egg-container .glyphicon-heart-empty:before {
740
+ content: "\e143";
741
+ }
742
+ .egg-container .glyphicon-link:before {
743
+ content: "\e144";
744
+ }
745
+ .egg-container .glyphicon-phone:before {
746
+ content: "\e145";
747
+ }
748
+ .egg-container .glyphicon-pushpin:before {
749
+ content: "\e146";
750
+ }
751
+ .egg-container .glyphicon-usd:before {
752
+ content: "\e148";
753
+ }
754
+ .egg-container .glyphicon-gbp:before {
755
+ content: "\e149";
756
+ }
757
+ .egg-container .glyphicon-sort:before {
758
+ content: "\e150";
759
+ }
760
+ .egg-container .glyphicon-sort-by-alphabet:before {
761
+ content: "\e151";
762
+ }
763
+ .egg-container .glyphicon-sort-by-alphabet-alt:before {
764
+ content: "\e152";
765
+ }
766
+ .egg-container .glyphicon-sort-by-order:before {
767
+ content: "\e153";
768
+ }
769
+ .egg-container .glyphicon-sort-by-order-alt:before {
770
+ content: "\e154";
771
+ }
772
+ .egg-container .glyphicon-sort-by-attributes:before {
773
+ content: "\e155";
774
+ }
775
+ .egg-container .glyphicon-sort-by-attributes-alt:before {
776
+ content: "\e156";
777
+ }
778
+ .egg-container .glyphicon-unchecked:before {
779
+ content: "\e157";
780
+ }
781
+ .egg-container .glyphicon-expand:before {
782
+ content: "\e158";
783
+ }
784
+ .egg-container .glyphicon-collapse-down:before {
785
+ content: "\e159";
786
+ }
787
+ .egg-container .glyphicon-collapse-up:before {
788
+ content: "\e160";
789
+ }
790
+ .egg-container .glyphicon-log-in:before {
791
+ content: "\e161";
792
+ }
793
+ .egg-container .glyphicon-flash:before {
794
+ content: "\e162";
795
+ }
796
+ .egg-container .glyphicon-log-out:before {
797
+ content: "\e163";
798
+ }
799
+ .egg-container .glyphicon-new-window:before {
800
+ content: "\e164";
801
+ }
802
+ .egg-container .glyphicon-record:before {
803
+ content: "\e165";
804
+ }
805
+ .egg-container .glyphicon-save:before {
806
+ content: "\e166";
807
+ }
808
+ .egg-container .glyphicon-open:before {
809
+ content: "\e167";
810
+ }
811
+ .egg-container .glyphicon-saved:before {
812
+ content: "\e168";
813
+ }
814
+ .egg-container .glyphicon-import:before {
815
+ content: "\e169";
816
+ }
817
+ .egg-container .glyphicon-export:before {
818
+ content: "\e170";
819
+ }
820
+ .egg-container .glyphicon-send:before {
821
+ content: "\e171";
822
+ }
823
+ .egg-container .glyphicon-floppy-disk:before {
824
+ content: "\e172";
825
+ }
826
+ .egg-container .glyphicon-floppy-saved:before {
827
+ content: "\e173";
828
+ }
829
+ .egg-container .glyphicon-floppy-remove:before {
830
+ content: "\e174";
831
+ }
832
+ .egg-container .glyphicon-floppy-save:before {
833
+ content: "\e175";
834
+ }
835
+ .egg-container .glyphicon-floppy-open:before {
836
+ content: "\e176";
837
+ }
838
+ .egg-container .glyphicon-credit-card:before {
839
+ content: "\e177";
840
+ }
841
+ .egg-container .glyphicon-transfer:before {
842
+ content: "\e178";
843
+ }
844
+ .egg-container .glyphicon-cutlery:before {
845
+ content: "\e179";
846
+ }
847
+ .egg-container .glyphicon-header:before {
848
+ content: "\e180";
849
+ }
850
+ .egg-container .glyphicon-compressed:before {
851
+ content: "\e181";
852
+ }
853
+ .egg-container .glyphicon-earphone:before {
854
+ content: "\e182";
855
+ }
856
+ .egg-container .glyphicon-phone-alt:before {
857
+ content: "\e183";
858
+ }
859
+ .egg-container .glyphicon-tower:before {
860
+ content: "\e184";
861
+ }
862
+ .egg-container .glyphicon-stats:before {
863
+ content: "\e185";
864
+ }
865
+ .egg-container .glyphicon-sd-video:before {
866
+ content: "\e186";
867
+ }
868
+ .egg-container .glyphicon-hd-video:before {
869
+ content: "\e187";
870
+ }
871
+ .egg-container .glyphicon-subtitles:before {
872
+ content: "\e188";
873
+ }
874
+ .egg-container .glyphicon-sound-stereo:before {
875
+ content: "\e189";
876
+ }
877
+ .egg-container .glyphicon-sound-dolby:before {
878
+ content: "\e190";
879
+ }
880
+ .egg-container .glyphicon-sound-5-1:before {
881
+ content: "\e191";
882
+ }
883
+ .egg-container .glyphicon-sound-6-1:before {
884
+ content: "\e192";
885
+ }
886
+ .egg-container .glyphicon-sound-7-1:before {
887
+ content: "\e193";
888
+ }
889
+ .egg-container .glyphicon-copyright-mark:before {
890
+ content: "\e194";
891
+ }
892
+ .egg-container .glyphicon-registration-mark:before {
893
+ content: "\e195";
894
+ }
895
+ .egg-container .glyphicon-cloud-download:before {
896
+ content: "\e197";
897
+ }
898
+ .egg-container .glyphicon-cloud-upload:before {
899
+ content: "\e198";
900
+ }
901
+ .egg-container .glyphicon-tree-conifer:before {
902
+ content: "\e199";
903
+ }
904
+ .egg-container .glyphicon-tree-deciduous:before {
905
+ content: "\e200";
906
+ }
907
+ .egg-container .glyphicon-cd:before {
908
+ content: "\e201";
909
+ }
910
+ .egg-container .glyphicon-save-file:before {
911
+ content: "\e202";
912
+ }
913
+ .egg-container .glyphicon-open-file:before {
914
+ content: "\e203";
915
+ }
916
+ .egg-container .glyphicon-level-up:before {
917
+ content: "\e204";
918
+ }
919
+ .egg-container .glyphicon-copy:before {
920
+ content: "\e205";
921
+ }
922
+ .egg-container .glyphicon-paste:before {
923
+ content: "\e206";
924
+ }
925
+ .egg-container .glyphicon-alert:before {
926
+ content: "\e209";
927
+ }
928
+ .egg-container .glyphicon-equalizer:before {
929
+ content: "\e210";
930
+ }
931
+ .egg-container .glyphicon-king:before {
932
+ content: "\e211";
933
+ }
934
+ .egg-container .glyphicon-queen:before {
935
+ content: "\e212";
936
+ }
937
+ .egg-container .glyphicon-pawn:before {
938
+ content: "\e213";
939
+ }
940
+ .egg-container .glyphicon-bishop:before {
941
+ content: "\e214";
942
+ }
943
+ .egg-container .glyphicon-knight:before {
944
+ content: "\e215";
945
+ }
946
+ .egg-container .glyphicon-baby-formula:before {
947
+ content: "\e216";
948
+ }
949
+ .egg-container .glyphicon-tent:before {
950
+ content: "\26fa";
951
+ }
952
+ .egg-container .glyphicon-blackboard:before {
953
+ content: "\e218";
954
+ }
955
+ .egg-container .glyphicon-bed:before {
956
+ content: "\e219";
957
+ }
958
+ .egg-container .glyphicon-apple:before {
959
+ content: "\f8ff";
960
+ }
961
+ .egg-container .glyphicon-erase:before {
962
+ content: "\e221";
963
+ }
964
+ .egg-container .glyphicon-hourglass:before {
965
+ content: "\231b";
966
+ }
967
+ .egg-container .glyphicon-lamp:before {
968
+ content: "\e223";
969
+ }
970
+ .egg-container .glyphicon-duplicate:before {
971
+ content: "\e224";
972
+ }
973
+ .egg-container .glyphicon-piggy-bank:before {
974
+ content: "\e225";
975
+ }
976
+ .egg-container .glyphicon-scissors:before {
977
+ content: "\e226";
978
+ }
979
+ .egg-container .glyphicon-bitcoin:before {
980
+ content: "\e227";
981
+ }
982
+ .egg-container .glyphicon-btc:before {
983
+ content: "\e227";
984
+ }
985
+ .egg-container .glyphicon-xbt:before {
986
+ content: "\e227";
987
+ }
988
+ .egg-container .glyphicon-yen:before {
989
+ content: "\00a5";
990
+ }
991
+ .egg-container .glyphicon-jpy:before {
992
+ content: "\00a5";
993
+ }
994
+ .egg-container .glyphicon-ruble:before {
995
+ content: "\20bd";
996
+ }
997
+ .egg-container .glyphicon-rub:before {
998
+ content: "\20bd";
999
+ }
1000
+ .egg-container .glyphicon-scale:before {
1001
+ content: "\e230";
1002
+ }
1003
+ .egg-container .glyphicon-ice-lolly:before {
1004
+ content: "\e231";
1005
+ }
1006
+ .egg-container .glyphicon-ice-lolly-tasted:before {
1007
+ content: "\e232";
1008
+ }
1009
+ .egg-container .glyphicon-education:before {
1010
+ content: "\e233";
1011
+ }
1012
+ .egg-container .glyphicon-option-horizontal:before {
1013
+ content: "\e234";
1014
+ }
1015
+ .egg-container .glyphicon-option-vertical:before {
1016
+ content: "\e235";
1017
+ }
1018
+ .egg-container .glyphicon-menu-hamburger:before {
1019
+ content: "\e236";
1020
+ }
1021
+ .egg-container .glyphicon-modal-window:before {
1022
+ content: "\e237";
1023
+ }
1024
+ .egg-container .glyphicon-oil:before {
1025
+ content: "\e238";
1026
+ }
1027
+ .egg-container .glyphicon-grain:before {
1028
+ content: "\e239";
1029
+ }
1030
+ .egg-container .glyphicon-sunglasses:before {
1031
+ content: "\e240";
1032
+ }
1033
+ .egg-container .glyphicon-text-size:before {
1034
+ content: "\e241";
1035
+ }
1036
+ .egg-container .glyphicon-text-color:before {
1037
+ content: "\e242";
1038
+ }
1039
+ .egg-container .glyphicon-text-background:before {
1040
+ content: "\e243";
1041
+ }
1042
+ .egg-container .glyphicon-object-align-top:before {
1043
+ content: "\e244";
1044
+ }
1045
+ .egg-container .glyphicon-object-align-bottom:before {
1046
+ content: "\e245";
1047
+ }
1048
+ .egg-container .glyphicon-object-align-horizontal:before {
1049
+ content: "\e246";
1050
+ }
1051
+ .egg-container .glyphicon-object-align-left:before {
1052
+ content: "\e247";
1053
+ }
1054
+ .egg-container .glyphicon-object-align-vertical:before {
1055
+ content: "\e248";
1056
+ }
1057
+ .egg-container .glyphicon-object-align-right:before {
1058
+ content: "\e249";
1059
+ }
1060
+ .egg-container .glyphicon-triangle-right:before {
1061
+ content: "\e250";
1062
+ }
1063
+ .egg-container .glyphicon-triangle-left:before {
1064
+ content: "\e251";
1065
+ }
1066
+ .egg-container .glyphicon-triangle-bottom:before {
1067
+ content: "\e252";
1068
+ }
1069
+ .egg-container .glyphicon-triangle-top:before {
1070
+ content: "\e253";
1071
+ }
1072
+ .egg-container .glyphicon-console:before {
1073
+ content: "\e254";
1074
+ }
1075
+ .egg-container .glyphicon-superscript:before {
1076
+ content: "\e255";
1077
+ }
1078
+ .egg-container .glyphicon-subscript:before {
1079
+ content: "\e256";
1080
+ }
1081
+ .egg-container .glyphicon-menu-left:before {
1082
+ content: "\e257";
1083
+ }
1084
+ .egg-container .glyphicon-menu-right:before {
1085
+ content: "\e258";
1086
+ }
1087
+ .egg-container .glyphicon-menu-down:before {
1088
+ content: "\e259";
1089
+ }
1090
+ .egg-container .glyphicon-menu-up:before {
1091
+ content: "\e260";
1092
+ }
1093
+ .egg-container * {
1094
+ -webkit-box-sizing: border-box;
1095
+ -moz-box-sizing: border-box;
1096
+ box-sizing: border-box;
1097
+ }
1098
+ .egg-container *:before,
1099
+ .egg-container *:after {
1100
+ -webkit-box-sizing: border-box;
1101
+ -moz-box-sizing: border-box;
1102
+ box-sizing: border-box;
1103
+ }
1104
+ .egg-container html {
1105
+ font-size: 10px;
1106
+
1107
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
1108
+ }
1109
+ .egg-container body {
1110
+ /* font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; */
1111
+ font-size: 14px;
1112
+ line-height: 1.42857143;
1113
+ color: #333;
1114
+ background-color: #fff;
1115
+ }
1116
+ .egg-container input,
1117
+ .egg-container button,
1118
+ .egg-container select,
1119
+ .egg-container textarea {
1120
+ font-family: inherit;
1121
+ font-size: inherit;
1122
+ line-height: inherit;
1123
+ }
1124
+ .egg-container a {
1125
+ color: #337ab7;
1126
+ text-decoration: none;
1127
+ }
1128
+ .egg-container a:hover,
1129
+ .egg-container a:focus {
1130
+ color: #23527c;
1131
+ text-decoration: underline;
1132
+ }
1133
+ .egg-container a:focus {
1134
+ outline: thin dotted;
1135
+ outline: 5px auto -webkit-focus-ring-color;
1136
+ outline-offset: -2px;
1137
+ }
1138
+ .egg-container figure {
1139
+ margin: 0;
1140
+ }
1141
+ .egg-container img {
1142
+ vertical-align: middle;
1143
+ }
1144
+ .egg-container .img-responsive {
1145
+ display: block;
1146
+ max-width: 100%;
1147
+ height: auto;
1148
+ }
1149
+ .egg-container .img-rounded {
1150
+ border-radius: 6px;
1151
+ }
1152
+ .egg-container .img-thumbnail {
1153
+ display: inline-block;
1154
+ max-width: 100%;
1155
+ height: auto;
1156
+ padding: 4px;
1157
+ line-height: 1.42857143;
1158
+ background-color: #fff;
1159
+ border: 1px solid #ddd;
1160
+ border-radius: 4px;
1161
+ -webkit-transition: all .2s ease-in-out;
1162
+ -o-transition: all .2s ease-in-out;
1163
+ transition: all .2s ease-in-out;
1164
+ }
1165
+ .egg-container .img-circle {
1166
+ border-radius: 50%;
1167
+ }
1168
+ .egg-container hr {
1169
+ margin-top: 20px;
1170
+ margin-bottom: 20px;
1171
+ border: 0;
1172
+ border-top: 1px solid #eee;
1173
+ }
1174
+ .egg-container .sr-only {
1175
+ position: absolute;
1176
+ width: 1px;
1177
+ height: 1px;
1178
+ padding: 0;
1179
+ margin: -1px;
1180
+ overflow: hidden;
1181
+ clip: rect(0, 0, 0, 0);
1182
+ border: 0;
1183
+ }
1184
+ .egg-container .sr-only-focusable:active,
1185
+ .egg-container .sr-only-focusable:focus {
1186
+ position: static;
1187
+ width: auto;
1188
+ height: auto;
1189
+ margin: 0;
1190
+ overflow: visible;
1191
+ clip: auto;
1192
+ }
1193
+ .egg-container [role="button"] {
1194
+ cursor: pointer;
1195
+ }
1196
+ .egg-container h1,
1197
+ .egg-container h2,
1198
+ .egg-container h3,
1199
+ .egg-container h4,
1200
+ .egg-container h5,
1201
+ .egg-container h6,
1202
+ .egg-container .h1,
1203
+ .egg-container .h2,
1204
+ .egg-container .h3,
1205
+ .egg-container .h4,
1206
+ .egg-container .h5,
1207
+ .egg-container .h6 {
1208
+ /*font-family: inherit;*/
1209
+ /*font-weight: 500;*/
1210
+ /*line-height: 1.1;*/
1211
+ color: inherit;
1212
+ }
1213
+ .egg-container h1 small,
1214
+ .egg-container h2 small,
1215
+ .egg-container h3 small,
1216
+ .egg-container h4 small,
1217
+ .egg-container h5 small,
1218
+ .egg-container h6 small,
1219
+ .egg-container .h1 small,
1220
+ .egg-container .h2 small,
1221
+ .egg-container .h3 small,
1222
+ .egg-container .h4 small,
1223
+ .egg-container .h5 small,
1224
+ .egg-container .h6 small,
1225
+ .egg-container h1 .small,
1226
+ .egg-container h2 .small,
1227
+ .egg-container h3 .small,
1228
+ .egg-container h4 .small,
1229
+ .egg-container h5 .small,
1230
+ .egg-container h6 .small,
1231
+ .egg-container .h1 .small,
1232
+ .egg-container .h2 .small,
1233
+ .egg-container .h3 .small,
1234
+ .egg-container .h4 .small,
1235
+ .egg-container .h5 .small,
1236
+ .egg-container .h6 .small {
1237
+ font-weight: normal;
1238
+ line-height: 1;
1239
+ color: #777;
1240
+ }
1241
+ /*.egg-container h1,
1242
+ .egg-container .h1,
1243
+ .egg-container h2,
1244
+ .egg-container .h2,
1245
+ .egg-container h3,
1246
+ .egg-container .h3 {
1247
+ margin-top: 20px;
1248
+ margin-bottom: 10px;
1249
+ }*/
1250
+ .egg-container h1 small,
1251
+ .egg-container .h1 small,
1252
+ .egg-container h2 small,
1253
+ .egg-container .h2 small,
1254
+ .egg-container h3 small,
1255
+ .egg-container .h3 small,
1256
+ .egg-container h1 .small,
1257
+ .egg-container .h1 .small,
1258
+ .egg-container h2 .small,
1259
+ .egg-container .h2 .small,
1260
+ .egg-container h3 .small,
1261
+ .egg-container .h3 .small {
1262
+ font-size: 65%;
1263
+ }
1264
+ .egg-container h4,
1265
+ .egg-container .h4,
1266
+ .egg-container h5,
1267
+ .egg-container .h5,
1268
+ .egg-container h6,
1269
+ .egg-container .h6 {
1270
+ margin-top: 10px;
1271
+ margin-bottom: 10px;
1272
+ }
1273
+ .egg-container h4 small,
1274
+ .egg-container .h4 small,
1275
+ .egg-container h5 small,
1276
+ .egg-container .h5 small,
1277
+ .egg-container h6 small,
1278
+ .egg-container .h6 small,
1279
+ .egg-container h4 .small,
1280
+ .egg-container .h4 .small,
1281
+ .egg-container h5 .small,
1282
+ .egg-container .h5 .small,
1283
+ .egg-container h6 .small,
1284
+ .egg-container .h6 .small {
1285
+ font-size: 75%;
1286
+ }
1287
+ /*.egg-container h1,
1288
+ .egg-container .h1 {
1289
+ font-size: 36px;
1290
+ }
1291
+ .egg-container h2,
1292
+ .egg-container .h2 {
1293
+ font-size: 30px;
1294
+ }
1295
+ .egg-container h3,
1296
+ .egg-container .h3 {
1297
+ font-size: 24px;
1298
+ }
1299
+ .egg-container h4,
1300
+ .egg-container .h4 {
1301
+ font-size: 18px;
1302
+ }
1303
+ .egg-container h5,
1304
+ .egg-container .h5 {
1305
+ font-size: 14px;
1306
+ }
1307
+ .egg-container h6,
1308
+ .egg-container .h6 {
1309
+ font-size: 12px;
1310
+ }
1311
+ .egg-container p {
1312
+ margin: 0 0 10px;
1313
+ }*/
1314
+ .egg-container .lead {
1315
+ margin-bottom: 20px;
1316
+ font-size: 16px;
1317
+ font-weight: 300;
1318
+ line-height: 1.4;
1319
+ }
1320
+ @media (min-width: 768px) {
1321
+ .egg-container .lead {
1322
+ font-size: 21px;
1323
+ }
1324
+ }
1325
+ .egg-container small,
1326
+ .egg-container .small {
1327
+ font-size: 85%;
1328
+ }
1329
+ .egg-container mark,
1330
+ .egg-container .mark {
1331
+ padding: .2em;
1332
+ background-color: #fcf8e3;
1333
+ }
1334
+ .egg-container .text-left {
1335
+ text-align: left;
1336
+ }
1337
+ .egg-container .text-right {
1338
+ text-align: right;
1339
+ }
1340
+ .egg-container .text-center {
1341
+ text-align: center;
1342
+ }
1343
+ .egg-container .text-justify {
1344
+ text-align: justify;
1345
+ }
1346
+ .egg-container .text-nowrap {
1347
+ white-space: nowrap;
1348
+ }
1349
+ .egg-container .text-lowercase {
1350
+ text-transform: lowercase;
1351
+ }
1352
+ .egg-container .text-uppercase {
1353
+ text-transform: uppercase;
1354
+ }
1355
+ .egg-container .text-capitalize {
1356
+ text-transform: capitalize;
1357
+ }
1358
+ .egg-container .text-muted {
1359
+ color: #777;
1360
+ }
1361
+ .egg-container .text-primary {
1362
+ color: #337ab7;
1363
+ }
1364
+ a.egg-container .text-primary:hover {
1365
+ color: #286090;
1366
+ }
1367
+ .egg-container .text-success {
1368
+ color: #3c763d;
1369
+ }
1370
+ a.egg-container .text-success:hover {
1371
+ color: #2b542c;
1372
+ }
1373
+ .egg-container .text-info {
1374
+ color: #31708f;
1375
+ }
1376
+ a.egg-container .text-info:hover {
1377
+ color: #245269;
1378
+ }
1379
+ .egg-container .text-warning {
1380
+ color: #8a6d3b;
1381
+ }
1382
+ a.egg-container .text-warning:hover {
1383
+ color: #66512c;
1384
+ }
1385
+ .egg-container .text-danger {
1386
+ color: #a94442;
1387
+ }
1388
+ a.egg-container .text-danger:hover {
1389
+ color: #843534;
1390
+ }
1391
+ .egg-container .bg-primary {
1392
+ color: #fff;
1393
+ background-color: #337ab7;
1394
+ }
1395
+ a.egg-container .bg-primary:hover {
1396
+ background-color: #286090;
1397
+ }
1398
+ .egg-container .bg-success {
1399
+ background-color: #dff0d8;
1400
+ }
1401
+ a.egg-container .bg-success:hover {
1402
+ background-color: #c1e2b3;
1403
+ }
1404
+ .egg-container .bg-info {
1405
+ background-color: #d9edf7;
1406
+ }
1407
+ a.egg-container .bg-info:hover {
1408
+ background-color: #afd9ee;
1409
+ }
1410
+ .egg-container .bg-warning {
1411
+ background-color: #fcf8e3;
1412
+ }
1413
+ a.egg-container .bg-warning:hover {
1414
+ background-color: #f7ecb5;
1415
+ }
1416
+ .egg-container .bg-danger {
1417
+ background-color: #f2dede;
1418
+ }
1419
+ a.egg-container .bg-danger:hover {
1420
+ background-color: #e4b9b9;
1421
+ }
1422
+ .egg-container .page-header {
1423
+ padding-bottom: 9px;
1424
+ margin: 40px 0 20px;
1425
+ border-bottom: 1px solid #eee;
1426
+ }
1427
+ .egg-container ul,
1428
+ .egg-container ol {
1429
+ margin-top: 0;
1430
+ margin-bottom: 10px;
1431
+ }
1432
+ .egg-container ul ul,
1433
+ .egg-container ol ul,
1434
+ .egg-container ul ol,
1435
+ .egg-container ol ol {
1436
+ margin-bottom: 0;
1437
+ }
1438
+ .egg-container .list-unstyled {
1439
+ padding-left: 0;
1440
+ list-style: none;
1441
+ }
1442
+ .egg-container .list-inline {
1443
+ padding-left: 0;
1444
+ margin-left: -5px;
1445
+ list-style: none;
1446
+ }
1447
+ .egg-container .list-inline > li {
1448
+ display: inline-block;
1449
+ padding-right: 5px;
1450
+ padding-left: 5px;
1451
+ }
1452
+ .egg-container dl {
1453
+ margin-top: 0;
1454
+ margin-bottom: 20px;
1455
+ }
1456
+ .egg-container dt,
1457
+ .egg-container dd {
1458
+ line-height: 1.42857143;
1459
+ }
1460
+ .egg-container dt {
1461
+ font-weight: bold;
1462
+ }
1463
+ .egg-container dd {
1464
+ margin-left: 0;
1465
+ }
1466
+ @media (min-width: 768px) {
1467
+ .egg-container .dl-horizontal dt {
1468
+ float: left;
1469
+ width: 160px;
1470
+ overflow: hidden;
1471
+ clear: left;
1472
+ text-align: right;
1473
+ text-overflow: ellipsis;
1474
+ white-space: nowrap;
1475
+ }
1476
+ .egg-container .dl-horizontal dd {
1477
+ margin-left: 180px;
1478
+ }
1479
+ }
1480
+ .egg-container abbr[title],
1481
+ .egg-container abbr[data-original-title] {
1482
+ cursor: help;
1483
+ border-bottom: 1px dotted #777;
1484
+ }
1485
+ .egg-container .initialism {
1486
+ font-size: 90%;
1487
+ text-transform: uppercase;
1488
+ }
1489
+ .egg-container blockquote {
1490
+ padding: 10px 20px;
1491
+ margin: 20px 0;
1492
+ font-size: 17.5px;
1493
+ /*border-left: 5px solid #eee;*/
1494
+ }
1495
+ .egg-container blockquote p:last-child,
1496
+ .egg-container blockquote ul:last-child,
1497
+ .egg-container blockquote ol:last-child {
1498
+ margin-bottom: 0;
1499
+ }
1500
+ .egg-container blockquote footer,
1501
+ .egg-container blockquote small,
1502
+ .egg-container blockquote .small {
1503
+ display: block;
1504
+ font-size: 80%;
1505
+ line-height: 1.42857143;
1506
+ color: #777;
1507
+ }
1508
+ .egg-container blockquote footer:before,
1509
+ .egg-container blockquote small:before,
1510
+ .egg-container blockquote .small:before {
1511
+ content: '\2014 \00A0';
1512
+ }
1513
+ .egg-container .blockquote-reverse,
1514
+ .egg-container blockquote.pull-right {
1515
+ padding-right: 15px;
1516
+ padding-left: 0;
1517
+ text-align: right;
1518
+ border-right: 5px solid #eee;
1519
+ border-left: 0;
1520
+ }
1521
+ .egg-container .blockquote-reverse footer:before,
1522
+ .egg-container blockquote.pull-right footer:before,
1523
+ .egg-container .blockquote-reverse small:before,
1524
+ .egg-container blockquote.pull-right small:before,
1525
+ .egg-container .blockquote-reverse .small:before,
1526
+ .egg-container blockquote.pull-right .small:before {
1527
+ content: '';
1528
+ }
1529
+ .egg-container .blockquote-reverse footer:after,
1530
+ .egg-container blockquote.pull-right footer:after,
1531
+ .egg-container .blockquote-reverse small:after,
1532
+ .egg-container blockquote.pull-right small:after,
1533
+ .egg-container .blockquote-reverse .small:after,
1534
+ .egg-container blockquote.pull-right .small:after {
1535
+ content: '\00A0 \2014';
1536
+ }
1537
+ .egg-container address {
1538
+ margin-bottom: 20px;
1539
+ font-style: normal;
1540
+ line-height: 1.42857143;
1541
+ }
1542
+ .egg-container code,
1543
+ .egg-container kbd,
1544
+ .egg-container pre,
1545
+ .egg-container samp {
1546
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1547
+ }
1548
+ .egg-container code {
1549
+ padding: 2px 4px;
1550
+ font-size: 90%;
1551
+ color: #c7254e;
1552
+ background-color: #f9f2f4;
1553
+ border-radius: 4px;
1554
+ }
1555
+ .egg-container kbd {
1556
+ padding: 2px 4px;
1557
+ font-size: 90%;
1558
+ color: #fff;
1559
+ background-color: #333;
1560
+ border-radius: 3px;
1561
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
1562
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
1563
+ }
1564
+ .egg-container kbd kbd {
1565
+ padding: 0;
1566
+ font-size: 100%;
1567
+ font-weight: bold;
1568
+ -webkit-box-shadow: none;
1569
+ box-shadow: none;
1570
+ }
1571
+ .egg-container pre {
1572
+ display: block;
1573
+ padding: 9.5px;
1574
+ margin: 0 0 10px;
1575
+ font-size: 13px;
1576
+ line-height: 1.42857143;
1577
+ color: #333;
1578
+ word-break: break-all;
1579
+ word-wrap: break-word;
1580
+ background-color: #f5f5f5;
1581
+ border: 1px solid #ccc;
1582
+ border-radius: 4px;
1583
+ }
1584
+ .egg-container pre code {
1585
+ padding: 0;
1586
+ font-size: inherit;
1587
+ color: inherit;
1588
+ white-space: pre-wrap;
1589
+ background-color: transparent;
1590
+ border-radius: 0;
1591
+ }
1592
+ .egg-container .pre-scrollable {
1593
+ max-height: 340px;
1594
+ overflow-y: scroll;
1595
+ }
1596
+ .egg-container .container {
1597
+ padding-right: 15px;
1598
+ padding-left: 15px;
1599
+ margin-right: auto;
1600
+ margin-left: auto;
1601
+ }
1602
+ @media (min-width: 768px) {
1603
+ .egg-container .container {
1604
+ width: 750px;
1605
+ }
1606
+ }
1607
+ @media (min-width: 992px) {
1608
+ .egg-container .container {
1609
+ width: 970px;
1610
+ }
1611
+ }
1612
+ @media (min-width: 1200px) {
1613
+ .egg-container .container {
1614
+ width: 1170px;
1615
+ }
1616
+ }
1617
+ .egg-container .container-fluid {
1618
+ padding-right: 15px;
1619
+ padding-left: 15px;
1620
+ margin-right: auto;
1621
+ margin-left: auto;
1622
+ }
1623
+ .egg-container .row {
1624
+ margin-right: -15px;
1625
+ margin-left: -15px;
1626
+ margin-bottom: 20px
1627
+ }
1628
+ .egg-container .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
1629
+ position: relative;
1630
+ min-height: 1px;
1631
+ padding-right: 15px;
1632
+ padding-left: 15px;
1633
+ }
1634
+ .egg-container .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
1635
+ float: left;
1636
+ }
1637
+ .egg-container .col-xs-12 {
1638
+ width: 100%;
1639
+ }
1640
+ .egg-container .col-xs-11 {
1641
+ width: 91.66666667%;
1642
+ }
1643
+ .egg-container .col-xs-10 {
1644
+ width: 83.33333333%;
1645
+ }
1646
+ .egg-container .col-xs-9 {
1647
+ width: 75%;
1648
+ }
1649
+ .egg-container .col-xs-8 {
1650
+ width: 66.66666667%;
1651
+ }
1652
+ .egg-container .col-xs-7 {
1653
+ width: 58.33333333%;
1654
+ }
1655
+ .egg-container .col-xs-6 {
1656
+ width: 50%;
1657
+ }
1658
+ .egg-container .col-xs-5 {
1659
+ width: 41.66666667%;
1660
+ }
1661
+ .egg-container .col-xs-4 {
1662
+ width: 33.33333333%;
1663
+ }
1664
+ .egg-container .col-xs-3 {
1665
+ width: 25%;
1666
+ }
1667
+ .egg-container .col-xs-2 {
1668
+ width: 16.66666667%;
1669
+ }
1670
+ .egg-container .col-xs-1 {
1671
+ width: 8.33333333%;
1672
+ }
1673
+ .egg-container .col-xs-pull-12 {
1674
+ right: 100%;
1675
+ }
1676
+ .egg-container .col-xs-pull-11 {
1677
+ right: 91.66666667%;
1678
+ }
1679
+ .egg-container .col-xs-pull-10 {
1680
+ right: 83.33333333%;
1681
+ }
1682
+ .egg-container .col-xs-pull-9 {
1683
+ right: 75%;
1684
+ }
1685
+ .egg-container .col-xs-pull-8 {
1686
+ right: 66.66666667%;
1687
+ }
1688
+ .egg-container .col-xs-pull-7 {
1689
+ right: 58.33333333%;
1690
+ }
1691
+ .egg-container .col-xs-pull-6 {
1692
+ right: 50%;
1693
+ }
1694
+ .egg-container .col-xs-pull-5 {
1695
+ right: 41.66666667%;
1696
+ }
1697
+ .egg-container .col-xs-pull-4 {
1698
+ right: 33.33333333%;
1699
+ }
1700
+ .egg-container .col-xs-pull-3 {
1701
+ right: 25%;
1702
+ }
1703
+ .egg-container .col-xs-pull-2 {
1704
+ right: 16.66666667%;
1705
+ }
1706
+ .egg-container .col-xs-pull-1 {
1707
+ right: 8.33333333%;
1708
+ }
1709
+ .egg-container .col-xs-pull-0 {
1710
+ right: auto;
1711
+ }
1712
+ .egg-container .col-xs-push-12 {
1713
+ left: 100%;
1714
+ }
1715
+ .egg-container .col-xs-push-11 {
1716
+ left: 91.66666667%;
1717
+ }
1718
+ .egg-container .col-xs-push-10 {
1719
+ left: 83.33333333%;
1720
+ }
1721
+ .egg-container .col-xs-push-9 {
1722
+ left: 75%;
1723
+ }
1724
+ .egg-container .col-xs-push-8 {
1725
+ left: 66.66666667%;
1726
+ }
1727
+ .egg-container .col-xs-push-7 {
1728
+ left: 58.33333333%;
1729
+ }
1730
+ .egg-container .col-xs-push-6 {
1731
+ left: 50%;
1732
+ }
1733
+ .egg-container .col-xs-push-5 {
1734
+ left: 41.66666667%;
1735
+ }
1736
+ .egg-container .col-xs-push-4 {
1737
+ left: 33.33333333%;
1738
+ }
1739
+ .egg-container .col-xs-push-3 {
1740
+ left: 25%;
1741
+ }
1742
+ .egg-container .col-xs-push-2 {
1743
+ left: 16.66666667%;
1744
+ }
1745
+ .egg-container .col-xs-push-1 {
1746
+ left: 8.33333333%;
1747
+ }
1748
+ .egg-container .col-xs-push-0 {
1749
+ left: auto;
1750
+ }
1751
+ .egg-container .col-xs-offset-12 {
1752
+ margin-left: 100%;
1753
+ }
1754
+ .egg-container .col-xs-offset-11 {
1755
+ margin-left: 91.66666667%;
1756
+ }
1757
+ .egg-container .col-xs-offset-10 {
1758
+ margin-left: 83.33333333%;
1759
+ }
1760
+ .egg-container .col-xs-offset-9 {
1761
+ margin-left: 75%;
1762
+ }
1763
+ .egg-container .col-xs-offset-8 {
1764
+ margin-left: 66.66666667%;
1765
+ }
1766
+ .egg-container .col-xs-offset-7 {
1767
+ margin-left: 58.33333333%;
1768
+ }
1769
+ .egg-container .col-xs-offset-6 {
1770
+ margin-left: 50%;
1771
+ }
1772
+ .egg-container .col-xs-offset-5 {
1773
+ margin-left: 41.66666667%;
1774
+ }
1775
+ .egg-container .col-xs-offset-4 {
1776
+ margin-left: 33.33333333%;
1777
+ }
1778
+ .egg-container .col-xs-offset-3 {
1779
+ margin-left: 25%;
1780
+ }
1781
+ .egg-container .col-xs-offset-2 {
1782
+ margin-left: 16.66666667%;
1783
+ }
1784
+ .egg-container .col-xs-offset-1 {
1785
+ margin-left: 8.33333333%;
1786
+ }
1787
+ .egg-container .col-xs-offset-0 {
1788
+ margin-left: 0;
1789
+ }
1790
+ @media (min-width: 768px) {
1791
+ .egg-container .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
1792
+ float: left;
1793
+ }
1794
+ .egg-container .col-sm-12 {
1795
+ width: 100%;
1796
+ }
1797
+ .egg-container .col-sm-11 {
1798
+ width: 91.66666667%;
1799
+ }
1800
+ .egg-container .col-sm-10 {
1801
+ width: 83.33333333%;
1802
+ }
1803
+ .egg-container .col-sm-9 {
1804
+ width: 75%;
1805
+ }
1806
+ .egg-container .col-sm-8 {
1807
+ width: 66.66666667%;
1808
+ }
1809
+ .egg-container .col-sm-7 {
1810
+ width: 58.33333333%;
1811
+ }
1812
+ .egg-container .col-sm-6 {
1813
+ width: 50%;
1814
+ }
1815
+ .egg-container .col-sm-5 {
1816
+ width: 41.66666667%;
1817
+ }
1818
+ .egg-container .col-sm-4 {
1819
+ width: 33.33333333%;
1820
+ }
1821
+ .egg-container .col-sm-3 {
1822
+ width: 25%;
1823
+ }
1824
+ .egg-container .col-sm-2 {
1825
+ width: 16.66666667%;
1826
+ }
1827
+ .egg-container .col-sm-1 {
1828
+ width: 8.33333333%;
1829
+ }
1830
+ .egg-container .col-sm-pull-12 {
1831
+ right: 100%;
1832
+ }
1833
+ .egg-container .col-sm-pull-11 {
1834
+ right: 91.66666667%;
1835
+ }
1836
+ .egg-container .col-sm-pull-10 {
1837
+ right: 83.33333333%;
1838
+ }
1839
+ .egg-container .col-sm-pull-9 {
1840
+ right: 75%;
1841
+ }
1842
+ .egg-container .col-sm-pull-8 {
1843
+ right: 66.66666667%;
1844
+ }
1845
+ .egg-container .col-sm-pull-7 {
1846
+ right: 58.33333333%;
1847
+ }
1848
+ .egg-container .col-sm-pull-6 {
1849
+ right: 50%;
1850
+ }
1851
+ .egg-container .col-sm-pull-5 {
1852
+ right: 41.66666667%;
1853
+ }
1854
+ .egg-container .col-sm-pull-4 {
1855
+ right: 33.33333333%;
1856
+ }
1857
+ .egg-container .col-sm-pull-3 {
1858
+ right: 25%;
1859
+ }
1860
+ .egg-container .col-sm-pull-2 {
1861
+ right: 16.66666667%;
1862
+ }
1863
+ .egg-container .col-sm-pull-1 {
1864
+ right: 8.33333333%;
1865
+ }
1866
+ .egg-container .col-sm-pull-0 {
1867
+ right: auto;
1868
+ }
1869
+ .egg-container .col-sm-push-12 {
1870
+ left: 100%;
1871
+ }
1872
+ .egg-container .col-sm-push-11 {
1873
+ left: 91.66666667%;
1874
+ }
1875
+ .egg-container .col-sm-push-10 {
1876
+ left: 83.33333333%;
1877
+ }
1878
+ .egg-container .col-sm-push-9 {
1879
+ left: 75%;
1880
+ }
1881
+ .egg-container .col-sm-push-8 {
1882
+ left: 66.66666667%;
1883
+ }
1884
+ .egg-container .col-sm-push-7 {
1885
+ left: 58.33333333%;
1886
+ }
1887
+ .egg-container .col-sm-push-6 {
1888
+ left: 50%;
1889
+ }
1890
+ .egg-container .col-sm-push-5 {
1891
+ left: 41.66666667%;
1892
+ }
1893
+ .egg-container .col-sm-push-4 {
1894
+ left: 33.33333333%;
1895
+ }
1896
+ .egg-container .col-sm-push-3 {
1897
+ left: 25%;
1898
+ }
1899
+ .egg-container .col-sm-push-2 {
1900
+ left: 16.66666667%;
1901
+ }
1902
+ .egg-container .col-sm-push-1 {
1903
+ left: 8.33333333%;
1904
+ }
1905
+ .egg-container .col-sm-push-0 {
1906
+ left: auto;
1907
+ }
1908
+ .egg-container .col-sm-offset-12 {
1909
+ margin-left: 100%;
1910
+ }
1911
+ .egg-container .col-sm-offset-11 {
1912
+ margin-left: 91.66666667%;
1913
+ }
1914
+ .egg-container .col-sm-offset-10 {
1915
+ margin-left: 83.33333333%;
1916
+ }
1917
+ .egg-container .col-sm-offset-9 {
1918
+ margin-left: 75%;
1919
+ }
1920
+ .egg-container .col-sm-offset-8 {
1921
+ margin-left: 66.66666667%;
1922
+ }
1923
+ .egg-container .col-sm-offset-7 {
1924
+ margin-left: 58.33333333%;
1925
+ }
1926
+ .egg-container .col-sm-offset-6 {
1927
+ margin-left: 50%;
1928
+ }
1929
+ .egg-container .col-sm-offset-5 {
1930
+ margin-left: 41.66666667%;
1931
+ }
1932
+ .egg-container .col-sm-offset-4 {
1933
+ margin-left: 33.33333333%;
1934
+ }
1935
+ .egg-container .col-sm-offset-3 {
1936
+ margin-left: 25%;
1937
+ }
1938
+ .egg-container .col-sm-offset-2 {
1939
+ margin-left: 16.66666667%;
1940
+ }
1941
+ .egg-container .col-sm-offset-1 {
1942
+ margin-left: 8.33333333%;
1943
+ }
1944
+ .egg-container .col-sm-offset-0 {
1945
+ margin-left: 0;
1946
+ }
1947
+ }
1948
+ @media (min-width: 992px) {
1949
+ .egg-container .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
1950
+ float: left;
1951
+ }
1952
+ .egg-container .col-md-12 {
1953
+ width: 100%;
1954
+ }
1955
+ .egg-container .col-md-11 {
1956
+ width: 91.66666667%;
1957
+ }
1958
+ .egg-container .col-md-10 {
1959
+ width: 83.33333333%;
1960
+ }
1961
+ .egg-container .col-md-9 {
1962
+ width: 75%;
1963
+ }
1964
+ .egg-container .col-md-8 {
1965
+ width: 66.66666667%;
1966
+ }
1967
+ .egg-container .col-md-7 {
1968
+ width: 58.33333333%;
1969
+ }
1970
+ .egg-container .col-md-6 {
1971
+ width: 50%;
1972
+ }
1973
+ .egg-container .col-md-5 {
1974
+ width: 41.66666667%;
1975
+ }
1976
+ .egg-container .col-md-4 {
1977
+ width: 33.33333333%;
1978
+ }
1979
+ .egg-container .col-md-3 {
1980
+ width: 25%;
1981
+ }
1982
+ .egg-container .col-md-2 {
1983
+ width: 16.66666667%;
1984
+ }
1985
+ .egg-container .col-md-1 {
1986
+ width: 8.33333333%;
1987
+ }
1988
+ .egg-container .col-md-pull-12 {
1989
+ right: 100%;
1990
+ }
1991
+ .egg-container .col-md-pull-11 {
1992
+ right: 91.66666667%;
1993
+ }
1994
+ .egg-container .col-md-pull-10 {
1995
+ right: 83.33333333%;
1996
+ }
1997
+ .egg-container .col-md-pull-9 {
1998
+ right: 75%;
1999
+ }
2000
+ .egg-container .col-md-pull-8 {
2001
+ right: 66.66666667%;
2002
+ }
2003
+ .egg-container .col-md-pull-7 {
2004
+ right: 58.33333333%;
2005
+ }
2006
+ .egg-container .col-md-pull-6 {
2007
+ right: 50%;
2008
+ }
2009
+ .egg-container .col-md-pull-5 {
2010
+ right: 41.66666667%;
2011
+ }
2012
+ .egg-container .col-md-pull-4 {
2013
+ right: 33.33333333%;
2014
+ }
2015
+ .egg-container .col-md-pull-3 {
2016
+ right: 25%;
2017
+ }
2018
+ .egg-container .col-md-pull-2 {
2019
+ right: 16.66666667%;
2020
+ }
2021
+ .egg-container .col-md-pull-1 {
2022
+ right: 8.33333333%;
2023
+ }
2024
+ .egg-container .col-md-pull-0 {
2025
+ right: auto;
2026
+ }
2027
+ .egg-container .col-md-push-12 {
2028
+ left: 100%;
2029
+ }
2030
+ .egg-container .col-md-push-11 {
2031
+ left: 91.66666667%;
2032
+ }
2033
+ .egg-container .col-md-push-10 {
2034
+ left: 83.33333333%;
2035
+ }
2036
+ .egg-container .col-md-push-9 {
2037
+ left: 75%;
2038
+ }
2039
+ .egg-container .col-md-push-8 {
2040
+ left: 66.66666667%;
2041
+ }
2042
+ .egg-container .col-md-push-7 {
2043
+ left: 58.33333333%;
2044
+ }
2045
+ .egg-container .col-md-push-6 {
2046
+ left: 50%;
2047
+ }
2048
+ .egg-container .col-md-push-5 {
2049
+ left: 41.66666667%;
2050
+ }
2051
+ .egg-container .col-md-push-4 {
2052
+ left: 33.33333333%;
2053
+ }
2054
+ .egg-container .col-md-push-3 {
2055
+ left: 25%;
2056
+ }
2057
+ .egg-container .col-md-push-2 {
2058
+ left: 16.66666667%;
2059
+ }
2060
+ .egg-container .col-md-push-1 {
2061
+ left: 8.33333333%;
2062
+ }
2063
+ .egg-container .col-md-push-0 {
2064
+ left: auto;
2065
+ }
2066
+ .egg-container .col-md-offset-12 {
2067
+ margin-left: 100%;
2068
+ }
2069
+ .egg-container .col-md-offset-11 {
2070
+ margin-left: 91.66666667%;
2071
+ }
2072
+ .egg-container .col-md-offset-10 {
2073
+ margin-left: 83.33333333%;
2074
+ }
2075
+ .egg-container .col-md-offset-9 {
2076
+ margin-left: 75%;
2077
+ }
2078
+ .egg-container .col-md-offset-8 {
2079
+ margin-left: 66.66666667%;
2080
+ }
2081
+ .egg-container .col-md-offset-7 {
2082
+ margin-left: 58.33333333%;
2083
+ }
2084
+ .egg-container .col-md-offset-6 {
2085
+ margin-left: 50%;
2086
+ }
2087
+ .egg-container .col-md-offset-5 {
2088
+ margin-left: 41.66666667%;
2089
+ }
2090
+ .egg-container .col-md-offset-4 {
2091
+ margin-left: 33.33333333%;
2092
+ }
2093
+ .egg-container .col-md-offset-3 {
2094
+ margin-left: 25%;
2095
+ }
2096
+ .egg-container .col-md-offset-2 {
2097
+ margin-left: 16.66666667%;
2098
+ }
2099
+ .egg-container .col-md-offset-1 {
2100
+ margin-left: 8.33333333%;
2101
+ }
2102
+ .egg-container .col-md-offset-0 {
2103
+ margin-left: 0;
2104
+ }
2105
+ }
2106
+ @media (min-width: 1200px) {
2107
+ .egg-container .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
2108
+ float: left;
2109
+ }
2110
+ .egg-container .col-lg-12 {
2111
+ width: 100%;
2112
+ }
2113
+ .egg-container .col-lg-11 {
2114
+ width: 91.66666667%;
2115
+ }
2116
+ .egg-container .col-lg-10 {
2117
+ width: 83.33333333%;
2118
+ }
2119
+ .egg-container .col-lg-9 {
2120
+ width: 75%;
2121
+ }
2122
+ .egg-container .col-lg-8 {
2123
+ width: 66.66666667%;
2124
+ }
2125
+ .egg-container .col-lg-7 {
2126
+ width: 58.33333333%;
2127
+ }
2128
+ .egg-container .col-lg-6 {
2129
+ width: 50%;
2130
+ }
2131
+ .egg-container .col-lg-5 {
2132
+ width: 41.66666667%;
2133
+ }
2134
+ .egg-container .col-lg-4 {
2135
+ width: 33.33333333%;
2136
+ }
2137
+ .egg-container .col-lg-3 {
2138
+ width: 25%;
2139
+ }
2140
+ .egg-container .col-lg-2 {
2141
+ width: 16.66666667%;
2142
+ }
2143
+ .egg-container .col-lg-1 {
2144
+ width: 8.33333333%;
2145
+ }
2146
+ .egg-container .col-lg-pull-12 {
2147
+ right: 100%;
2148
+ }
2149
+ .egg-container .col-lg-pull-11 {
2150
+ right: 91.66666667%;
2151
+ }
2152
+ .egg-container .col-lg-pull-10 {
2153
+ right: 83.33333333%;
2154
+ }
2155
+ .egg-container .col-lg-pull-9 {
2156
+ right: 75%;
2157
+ }
2158
+ .egg-container .col-lg-pull-8 {
2159
+ right: 66.66666667%;
2160
+ }
2161
+ .egg-container .col-lg-pull-7 {
2162
+ right: 58.33333333%;
2163
+ }
2164
+ .egg-container .col-lg-pull-6 {
2165
+ right: 50%;
2166
+ }
2167
+ .egg-container .col-lg-pull-5 {
2168
+ right: 41.66666667%;
2169
+ }
2170
+ .egg-container .col-lg-pull-4 {
2171
+ right: 33.33333333%;
2172
+ }
2173
+ .egg-container .col-lg-pull-3 {
2174
+ right: 25%;
2175
+ }
2176
+ .egg-container .col-lg-pull-2 {
2177
+ right: 16.66666667%;
2178
+ }
2179
+ .egg-container .col-lg-pull-1 {
2180
+ right: 8.33333333%;
2181
+ }
2182
+ .egg-container .col-lg-pull-0 {
2183
+ right: auto;
2184
+ }
2185
+ .egg-container .col-lg-push-12 {
2186
+ left: 100%;
2187
+ }
2188
+ .egg-container .col-lg-push-11 {
2189
+ left: 91.66666667%;
2190
+ }
2191
+ .egg-container .col-lg-push-10 {
2192
+ left: 83.33333333%;
2193
+ }
2194
+ .egg-container .col-lg-push-9 {
2195
+ left: 75%;
2196
+ }
2197
+ .egg-container .col-lg-push-8 {
2198
+ left: 66.66666667%;
2199
+ }
2200
+ .egg-container .col-lg-push-7 {
2201
+ left: 58.33333333%;
2202
+ }
2203
+ .egg-container .col-lg-push-6 {
2204
+ left: 50%;
2205
+ }
2206
+ .egg-container .col-lg-push-5 {
2207
+ left: 41.66666667%;
2208
+ }
2209
+ .egg-container .col-lg-push-4 {
2210
+ left: 33.33333333%;
2211
+ }
2212
+ .egg-container .col-lg-push-3 {
2213
+ left: 25%;
2214
+ }
2215
+ .egg-container .col-lg-push-2 {
2216
+ left: 16.66666667%;
2217
+ }
2218
+ .egg-container .col-lg-push-1 {
2219
+ left: 8.33333333%;
2220
+ }
2221
+ .egg-container .col-lg-push-0 {
2222
+ left: auto;
2223
+ }
2224
+ .egg-container .col-lg-offset-12 {
2225
+ margin-left: 100%;
2226
+ }
2227
+ .egg-container .col-lg-offset-11 {
2228
+ margin-left: 91.66666667%;
2229
+ }
2230
+ .egg-container .col-lg-offset-10 {
2231
+ margin-left: 83.33333333%;
2232
+ }
2233
+ .egg-container .col-lg-offset-9 {
2234
+ margin-left: 75%;
2235
+ }
2236
+ .egg-container .col-lg-offset-8 {
2237
+ margin-left: 66.66666667%;
2238
+ }
2239
+ .egg-container .col-lg-offset-7 {
2240
+ margin-left: 58.33333333%;
2241
+ }
2242
+ .egg-container .col-lg-offset-6 {
2243
+ margin-left: 50%;
2244
+ }
2245
+ .egg-container .col-lg-offset-5 {
2246
+ margin-left: 41.66666667%;
2247
+ }
2248
+ .egg-container .col-lg-offset-4 {
2249
+ margin-left: 33.33333333%;
2250
+ }
2251
+ .egg-container .col-lg-offset-3 {
2252
+ margin-left: 25%;
2253
+ }
2254
+ .egg-container .col-lg-offset-2 {
2255
+ margin-left: 16.66666667%;
2256
+ }
2257
+ .egg-container .col-lg-offset-1 {
2258
+ margin-left: 8.33333333%;
2259
+ }
2260
+ .egg-container .col-lg-offset-0 {
2261
+ margin-left: 0;
2262
+ }
2263
+ }
2264
+ .egg-container table {
2265
+ background-color: transparent;
2266
+ }
2267
+ .egg-container caption {
2268
+ padding-top: 8px;
2269
+ padding-bottom: 8px;
2270
+ color: #777;
2271
+ text-align: left;
2272
+ }
2273
+ .egg-container th {
2274
+ text-align: left;
2275
+ }
2276
+ .egg-container .table {
2277
+ width: 100%;
2278
+ max-width: 100%;
2279
+ margin-bottom: 20px;
2280
+ }
2281
+ .egg-container .table > thead > tr > th,
2282
+ .egg-container .table > tbody > tr > th,
2283
+ .egg-container .table > tfoot > tr > th,
2284
+ .egg-container .table > thead > tr > td,
2285
+ .egg-container .table > tbody > tr > td,
2286
+ .egg-container .table > tfoot > tr > td {
2287
+ padding: 8px;
2288
+ line-height: 1.42857143;
2289
+ vertical-align: top;
2290
+ border-top: 1px solid #ddd;
2291
+ }
2292
+ .egg-container .table > thead > tr > th {
2293
+ vertical-align: bottom;
2294
+ border-bottom: 2px solid #ddd;
2295
+ }
2296
+ .egg-container .table > caption + thead > tr:first-child > th,
2297
+ .egg-container .table > colgroup + thead > tr:first-child > th,
2298
+ .egg-container .table > thead:first-child > tr:first-child > th,
2299
+ .egg-container .table > caption + thead > tr:first-child > td,
2300
+ .egg-container .table > colgroup + thead > tr:first-child > td,
2301
+ .egg-container .table > thead:first-child > tr:first-child > td {
2302
+ border-top: 0;
2303
+ }
2304
+ .egg-container .table > tbody + tbody {
2305
+ border-top: 2px solid #ddd;
2306
+ }
2307
+ .egg-container .table .table {
2308
+ background-color: #fff;
2309
+ }
2310
+ .egg-container .table-condensed > thead > tr > th,
2311
+ .egg-container .table-condensed > tbody > tr > th,
2312
+ .egg-container .table-condensed > tfoot > tr > th,
2313
+ .egg-container .table-condensed > thead > tr > td,
2314
+ .egg-container .table-condensed > tbody > tr > td,
2315
+ .egg-container .table-condensed > tfoot > tr > td {
2316
+ padding: 5px;
2317
+ }
2318
+ .egg-container .table-bordered {
2319
+ border: 1px solid #ddd;
2320
+ }
2321
+ .egg-container .table-bordered > thead > tr > th,
2322
+ .egg-container .table-bordered > tbody > tr > th,
2323
+ .egg-container .table-bordered > tfoot > tr > th,
2324
+ .egg-container .table-bordered > thead > tr > td,
2325
+ .egg-container .table-bordered > tbody > tr > td,
2326
+ .egg-container .table-bordered > tfoot > tr > td {
2327
+ border: 1px solid #ddd;
2328
+ }
2329
+ .egg-container .table-bordered > thead > tr > th,
2330
+ .egg-container .table-bordered > thead > tr > td {
2331
+ border-bottom-width: 2px;
2332
+ }
2333
+ .egg-container .table-striped > tbody > tr:nth-of-type(odd) {
2334
+ background-color: #f9f9f9;
2335
+ }
2336
+ .egg-container .table-hover > tbody > tr:hover {
2337
+ background-color: #f5f5f5;
2338
+ }
2339
+ .egg-container table col[class*="col-"] {
2340
+ position: static;
2341
+ display: table-column;
2342
+ float: none;
2343
+ }
2344
+ .egg-container table td[class*="col-"],
2345
+ .egg-container table th[class*="col-"] {
2346
+ position: static;
2347
+ display: table-cell;
2348
+ float: none;
2349
+ }
2350
+ .egg-container .table > thead > tr > td.active,
2351
+ .egg-container .table > tbody > tr > td.active,
2352
+ .egg-container .table > tfoot > tr > td.active,
2353
+ .egg-container .table > thead > tr > th.active,
2354
+ .egg-container .table > tbody > tr > th.active,
2355
+ .egg-container .table > tfoot > tr > th.active,
2356
+ .egg-container .table > thead > tr.active > td,
2357
+ .egg-container .table > tbody > tr.active > td,
2358
+ .egg-container .table > tfoot > tr.active > td,
2359
+ .egg-container .table > thead > tr.active > th,
2360
+ .egg-container .table > tbody > tr.active > th,
2361
+ .egg-container .table > tfoot > tr.active > th {
2362
+ background-color: #f5f5f5;
2363
+ }
2364
+ .egg-container .table-hover > tbody > tr > td.active:hover,
2365
+ .egg-container .table-hover > tbody > tr > th.active:hover,
2366
+ .egg-container .table-hover > tbody > tr.active:hover > td,
2367
+ .egg-container .table-hover > tbody > tr:hover > .active,
2368
+ .egg-container .table-hover > tbody > tr.active:hover > th {
2369
+ background-color: #e8e8e8;
2370
+ }
2371
+ .egg-container .table > thead > tr > td.success,
2372
+ .egg-container .table > tbody > tr > td.success,
2373
+ .egg-container .table > tfoot > tr > td.success,
2374
+ .egg-container .table > thead > tr > th.success,
2375
+ .egg-container .table > tbody > tr > th.success,
2376
+ .egg-container .table > tfoot > tr > th.success,
2377
+ .egg-container .table > thead > tr.success > td,
2378
+ .egg-container .table > tbody > tr.success > td,
2379
+ .egg-container .table > tfoot > tr.success > td,
2380
+ .egg-container .table > thead > tr.success > th,
2381
+ .egg-container .table > tbody > tr.success > th,
2382
+ .egg-container .table > tfoot > tr.success > th {
2383
+ background-color: #dff0d8;
2384
+ }
2385
+ .egg-container .table-hover > tbody > tr > td.success:hover,
2386
+ .egg-container .table-hover > tbody > tr > th.success:hover,
2387
+ .egg-container .table-hover > tbody > tr.success:hover > td,
2388
+ .egg-container .table-hover > tbody > tr:hover > .success,
2389
+ .egg-container .table-hover > tbody > tr.success:hover > th {
2390
+ background-color: #d0e9c6;
2391
+ }
2392
+ .egg-container .table > thead > tr > td.info,
2393
+ .egg-container .table > tbody > tr > td.info,
2394
+ .egg-container .table > tfoot > tr > td.info,
2395
+ .egg-container .table > thead > tr > th.info,
2396
+ .egg-container .table > tbody > tr > th.info,
2397
+ .egg-container .table > tfoot > tr > th.info,
2398
+ .egg-container .table > thead > tr.info > td,
2399
+ .egg-container .table > tbody > tr.info > td,
2400
+ .egg-container .table > tfoot > tr.info > td,
2401
+ .egg-container .table > thead > tr.info > th,
2402
+ .egg-container .table > tbody > tr.info > th,
2403
+ .egg-container .table > tfoot > tr.info > th {
2404
+ background-color: #d9edf7;
2405
+ }
2406
+ .egg-container .table-hover > tbody > tr > td.info:hover,
2407
+ .egg-container .table-hover > tbody > tr > th.info:hover,
2408
+ .egg-container .table-hover > tbody > tr.info:hover > td,
2409
+ .egg-container .table-hover > tbody > tr:hover > .info,
2410
+ .egg-container .table-hover > tbody > tr.info:hover > th {
2411
+ background-color: #c4e3f3;
2412
+ }
2413
+ .egg-container .table > thead > tr > td.warning,
2414
+ .egg-container .table > tbody > tr > td.warning,
2415
+ .egg-container .table > tfoot > tr > td.warning,
2416
+ .egg-container .table > thead > tr > th.warning,
2417
+ .egg-container .table > tbody > tr > th.warning,
2418
+ .egg-container .table > tfoot > tr > th.warning,
2419
+ .egg-container .table > thead > tr.warning > td,
2420
+ .egg-container .table > tbody > tr.warning > td,
2421
+ .egg-container .table > tfoot > tr.warning > td,
2422
+ .egg-container .table > thead > tr.warning > th,
2423
+ .egg-container .table > tbody > tr.warning > th,
2424
+ .egg-container .table > tfoot > tr.warning > th {
2425
+ background-color: #fcf8e3;
2426
+ }
2427
+ .egg-container .table-hover > tbody > tr > td.warning:hover,
2428
+ .egg-container .table-hover > tbody > tr > th.warning:hover,
2429
+ .egg-container .table-hover > tbody > tr.warning:hover > td,
2430
+ .egg-container .table-hover > tbody > tr:hover > .warning,
2431
+ .egg-container .table-hover > tbody > tr.warning:hover > th {
2432
+ background-color: #faf2cc;
2433
+ }
2434
+ .egg-container .table > thead > tr > td.danger,
2435
+ .egg-container .table > tbody > tr > td.danger,
2436
+ .egg-container .table > tfoot > tr > td.danger,
2437
+ .egg-container .table > thead > tr > th.danger,
2438
+ .egg-container .table > tbody > tr > th.danger,
2439
+ .egg-container .table > tfoot > tr > th.danger,
2440
+ .egg-container .table > thead > tr.danger > td,
2441
+ .egg-container .table > tbody > tr.danger > td,
2442
+ .egg-container .table > tfoot > tr.danger > td,
2443
+ .egg-container .table > thead > tr.danger > th,
2444
+ .egg-container .table > tbody > tr.danger > th,
2445
+ .egg-container .table > tfoot > tr.danger > th {
2446
+ background-color: #f2dede;
2447
+ }
2448
+ .egg-container .table-hover > tbody > tr > td.danger:hover,
2449
+ .egg-container .table-hover > tbody > tr > th.danger:hover,
2450
+ .egg-container .table-hover > tbody > tr.danger:hover > td,
2451
+ .egg-container .table-hover > tbody > tr:hover > .danger,
2452
+ .egg-container .table-hover > tbody > tr.danger:hover > th {
2453
+ background-color: #ebcccc;
2454
+ }
2455
+ .egg-container .table-responsive {
2456
+ min-height: .01%;
2457
+ overflow-x: auto;
2458
+ }
2459
+ @media screen and (max-width: 767px) {
2460
+ .egg-container .table-responsive {
2461
+ width: 100%;
2462
+ margin-bottom: 15px;
2463
+ overflow-y: hidden;
2464
+ -ms-overflow-style: -ms-autohiding-scrollbar;
2465
+ border: 1px solid #ddd;
2466
+ }
2467
+ .egg-container .table-responsive > .table {
2468
+ margin-bottom: 0;
2469
+ }
2470
+ .egg-container .table-responsive > .table > thead > tr > th,
2471
+ .egg-container .table-responsive > .table > tbody > tr > th,
2472
+ .egg-container .table-responsive > .table > tfoot > tr > th,
2473
+ .egg-container .table-responsive > .table > thead > tr > td,
2474
+ .egg-container .table-responsive > .table > tbody > tr > td,
2475
+ .egg-container .table-responsive > .table > tfoot > tr > td {
2476
+ white-space: nowrap;
2477
+ }
2478
+ .egg-container .table-responsive > .table-bordered {
2479
+ border: 0;
2480
+ }
2481
+ .egg-container .table-responsive > .table-bordered > thead > tr > th:first-child,
2482
+ .egg-container .table-responsive > .table-bordered > tbody > tr > th:first-child,
2483
+ .egg-container .table-responsive > .table-bordered > tfoot > tr > th:first-child,
2484
+ .egg-container .table-responsive > .table-bordered > thead > tr > td:first-child,
2485
+ .egg-container .table-responsive > .table-bordered > tbody > tr > td:first-child,
2486
+ .egg-container .table-responsive > .table-bordered > tfoot > tr > td:first-child {
2487
+ border-left: 0;
2488
+ }
2489
+ .egg-container .table-responsive > .table-bordered > thead > tr > th:last-child,
2490
+ .egg-container .table-responsive > .table-bordered > tbody > tr > th:last-child,
2491
+ .egg-container .table-responsive > .table-bordered > tfoot > tr > th:last-child,
2492
+ .egg-container .table-responsive > .table-bordered > thead > tr > td:last-child,
2493
+ .egg-container .table-responsive > .table-bordered > tbody > tr > td:last-child,
2494
+ .egg-container .table-responsive > .table-bordered > tfoot > tr > td:last-child {
2495
+ border-right: 0;
2496
+ }
2497
+ .egg-container .table-responsive > .table-bordered > tbody > tr:last-child > th,
2498
+ .egg-container .table-responsive > .table-bordered > tfoot > tr:last-child > th,
2499
+ .egg-container .table-responsive > .table-bordered > tbody > tr:last-child > td,
2500
+ .egg-container .table-responsive > .table-bordered > tfoot > tr:last-child > td {
2501
+ border-bottom: 0;
2502
+ }
2503
+ }
2504
+ .egg-container fieldset {
2505
+ min-width: 0;
2506
+ padding: 0;
2507
+ margin: 0;
2508
+ border: 0;
2509
+ }
2510
+ .egg-container legend {
2511
+ display: block;
2512
+ width: 100%;
2513
+ padding: 0;
2514
+ margin-bottom: 20px;
2515
+ font-size: 21px;
2516
+ line-height: inherit;
2517
+ color: #333;
2518
+ border: 0;
2519
+ border-bottom: 1px solid #e5e5e5;
2520
+ }
2521
+ .egg-container label {
2522
+ display: inline-block;
2523
+ max-width: 100%;
2524
+ margin-bottom: 5px;
2525
+ font-weight: bold;
2526
+ }
2527
+ .egg-container input[type="search"] {
2528
+ -webkit-box-sizing: border-box;
2529
+ -moz-box-sizing: border-box;
2530
+ box-sizing: border-box;
2531
+ }
2532
+ .egg-container input[type="radio"],
2533
+ .egg-container input[type="checkbox"] {
2534
+ margin: 4px 0 0;
2535
+ margin-top: 1px \9;
2536
+ line-height: normal;
2537
+ }
2538
+ .egg-container input[type="file"] {
2539
+ display: block;
2540
+ }
2541
+ .egg-container input[type="range"] {
2542
+ display: block;
2543
+ width: 100%;
2544
+ }
2545
+ .egg-container select[multiple],
2546
+ .egg-container select[size] {
2547
+ height: auto;
2548
+ }
2549
+ .egg-container input[type="file"]:focus,
2550
+ .egg-container input[type="radio"]:focus,
2551
+ .egg-container input[type="checkbox"]:focus {
2552
+ outline: thin dotted;
2553
+ outline: 5px auto -webkit-focus-ring-color;
2554
+ outline-offset: -2px;
2555
+ }
2556
+ .egg-container output {
2557
+ display: block;
2558
+ padding-top: 7px;
2559
+ font-size: 14px;
2560
+ line-height: 1.42857143;
2561
+ color: #555;
2562
+ }
2563
+ .egg-container .form-control {
2564
+ display: block;
2565
+ width: 100%;
2566
+ height: 34px;
2567
+ padding: 6px 12px;
2568
+ font-size: 14px;
2569
+ line-height: 1.42857143;
2570
+ color: #555;
2571
+ background-color: #fff;
2572
+ background-image: none;
2573
+ border: 1px solid #ccc;
2574
+ border-radius: 4px;
2575
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2576
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2577
+ -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
2578
+ -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2579
+ transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
2580
+ }
2581
+ .egg-container .form-control:focus {
2582
+ border-color: #66afe9;
2583
+ outline: 0;
2584
+ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
2585
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
2586
+ }
2587
+ .egg-container .form-control::-moz-placeholder {
2588
+ color: #999;
2589
+ opacity: 1;
2590
+ }
2591
+ .egg-container .form-control:-ms-input-placeholder {
2592
+ color: #999;
2593
+ }
2594
+ .egg-container .form-control::-webkit-input-placeholder {
2595
+ color: #999;
2596
+ }
2597
+ .egg-container .form-control[disabled],
2598
+ .egg-container .form-control[readonly],
2599
+ fieldset[disabled] .egg-container .form-control {
2600
+ background-color: #eee;
2601
+ opacity: 1;
2602
+ }
2603
+ .egg-container .form-control[disabled],
2604
+ fieldset[disabled] .egg-container .form-control {
2605
+ cursor: not-allowed;
2606
+ }
2607
+ textarea.egg-container .form-control {
2608
+ height: auto;
2609
+ }
2610
+ .egg-container input[type="search"] {
2611
+ -webkit-appearance: none;
2612
+ }
2613
+ @media screen and (-webkit-min-device-pixel-ratio: 0) {
2614
+ .egg-container input[type="date"],
2615
+ .egg-container input[type="time"],
2616
+ .egg-container input[type="datetime-local"],
2617
+ .egg-container input[type="month"] {
2618
+ line-height: 34px;
2619
+ }
2620
+ .egg-container input[type="date"].input-sm,
2621
+ .egg-container input[type="time"].input-sm,
2622
+ .egg-container input[type="datetime-local"].input-sm,
2623
+ .egg-container input[type="month"].input-sm,
2624
+ .input-group-sm .egg-container input[type="date"],
2625
+ .input-group-sm .egg-container input[type="time"],
2626
+ .input-group-sm .egg-container input[type="datetime-local"],
2627
+ .input-group-sm .egg-container input[type="month"] {
2628
+ line-height: 30px;
2629
+ }
2630
+ .egg-container input[type="date"].input-lg,
2631
+ .egg-container input[type="time"].input-lg,
2632
+ .egg-container input[type="datetime-local"].input-lg,
2633
+ .egg-container input[type="month"].input-lg,
2634
+ .input-group-lg .egg-container input[type="date"],
2635
+ .input-group-lg .egg-container input[type="time"],
2636
+ .input-group-lg .egg-container input[type="datetime-local"],
2637
+ .input-group-lg .egg-container input[type="month"] {
2638
+ line-height: 46px;
2639
+ }
2640
+ }
2641
+ .egg-container .form-group {
2642
+ margin-bottom: 15px;
2643
+ }
2644
+ .egg-container .radio,
2645
+ .egg-container .checkbox {
2646
+ position: relative;
2647
+ display: block;
2648
+ margin-top: 10px;
2649
+ margin-bottom: 10px;
2650
+ }
2651
+ .egg-container .radio label,
2652
+ .egg-container .checkbox label {
2653
+ min-height: 20px;
2654
+ padding-left: 20px;
2655
+ margin-bottom: 0;
2656
+ font-weight: normal;
2657
+ cursor: pointer;
2658
+ }
2659
+ .egg-container .radio input[type="radio"],
2660
+ .egg-container .radio-inline input[type="radio"],
2661
+ .egg-container .checkbox input[type="checkbox"],
2662
+ .egg-container .checkbox-inline input[type="checkbox"] {
2663
+ position: absolute;
2664
+ margin-top: 4px \9;
2665
+ margin-left: -20px;
2666
+ }
2667
+ .egg-container .radio + .radio,
2668
+ .egg-container .checkbox + .checkbox {
2669
+ margin-top: -5px;
2670
+ }
2671
+ .egg-container .radio-inline,
2672
+ .egg-container .checkbox-inline {
2673
+ position: relative;
2674
+ display: inline-block;
2675
+ padding-left: 20px;
2676
+ margin-bottom: 0;
2677
+ font-weight: normal;
2678
+ vertical-align: middle;
2679
+ cursor: pointer;
2680
+ }
2681
+ .egg-container .radio-inline + .radio-inline,
2682
+ .egg-container .checkbox-inline + .checkbox-inline {
2683
+ margin-top: 0;
2684
+ margin-left: 10px;
2685
+ }
2686
+ .egg-container input[type="radio"][disabled],
2687
+ .egg-container input[type="checkbox"][disabled],
2688
+ .egg-container input[type="radio"].disabled,
2689
+ .egg-container input[type="checkbox"].disabled,
2690
+ fieldset[disabled] .egg-container input[type="radio"],
2691
+ fieldset[disabled] .egg-container input[type="checkbox"] {
2692
+ cursor: not-allowed;
2693
+ }
2694
+ .egg-container .radio-inline.disabled,
2695
+ .egg-container .checkbox-inline.disabled,
2696
+ fieldset[disabled] .egg-container .radio-inline,
2697
+ fieldset[disabled] .egg-container .checkbox-inline {
2698
+ cursor: not-allowed;
2699
+ }
2700
+ .egg-container .radio.disabled label,
2701
+ .egg-container .checkbox.disabled label,
2702
+ fieldset[disabled] .egg-container .radio label,
2703
+ fieldset[disabled] .egg-container .checkbox label {
2704
+ cursor: not-allowed;
2705
+ }
2706
+ .egg-container .form-control-static {
2707
+ min-height: 34px;
2708
+ padding-top: 7px;
2709
+ padding-bottom: 7px;
2710
+ margin-bottom: 0;
2711
+ }
2712
+ .egg-container .form-control-static.input-lg,
2713
+ .egg-container .form-control-static.input-sm {
2714
+ padding-right: 0;
2715
+ padding-left: 0;
2716
+ }
2717
+ .egg-container .input-sm {
2718
+ height: 30px;
2719
+ padding: 5px 10px;
2720
+ font-size: 12px;
2721
+ line-height: 1.5;
2722
+ border-radius: 3px;
2723
+ }
2724
+ select.egg-container .input-sm {
2725
+ height: 30px;
2726
+ line-height: 30px;
2727
+ }
2728
+ textarea.egg-container .input-sm,
2729
+ select[multiple].egg-container .input-sm {
2730
+ height: auto;
2731
+ }
2732
+ .egg-container .form-group-sm .form-control {
2733
+ height: 30px;
2734
+ padding: 5px 10px;
2735
+ font-size: 12px;
2736
+ line-height: 1.5;
2737
+ border-radius: 3px;
2738
+ }
2739
+ select.egg-container .form-group-sm .form-control {
2740
+ height: 30px;
2741
+ line-height: 30px;
2742
+ }
2743
+ textarea.egg-container .form-group-sm .form-control,
2744
+ select[multiple].egg-container .form-group-sm .form-control {
2745
+ height: auto;
2746
+ }
2747
+ .egg-container .form-group-sm .form-control-static {
2748
+ height: 30px;
2749
+ min-height: 32px;
2750
+ padding: 5px 10px;
2751
+ font-size: 12px;
2752
+ line-height: 1.5;
2753
+ }
2754
+ .egg-container .input-lg {
2755
+ height: 46px;
2756
+ padding: 10px 16px;
2757
+ font-size: 18px;
2758
+ line-height: 1.3333333;
2759
+ border-radius: 6px;
2760
+ }
2761
+ select.egg-container .input-lg {
2762
+ height: 46px;
2763
+ line-height: 46px;
2764
+ }
2765
+ textarea.egg-container .input-lg,
2766
+ select[multiple].egg-container .input-lg {
2767
+ height: auto;
2768
+ }
2769
+ .egg-container .form-group-lg .form-control {
2770
+ height: 46px;
2771
+ padding: 10px 16px;
2772
+ font-size: 18px;
2773
+ line-height: 1.3333333;
2774
+ border-radius: 6px;
2775
+ }
2776
+ select.egg-container .form-group-lg .form-control {
2777
+ height: 46px;
2778
+ line-height: 46px;
2779
+ }
2780
+ textarea.egg-container .form-group-lg .form-control,
2781
+ select[multiple].egg-container .form-group-lg .form-control {
2782
+ height: auto;
2783
+ }
2784
+ .egg-container .form-group-lg .form-control-static {
2785
+ height: 46px;
2786
+ min-height: 38px;
2787
+ padding: 10px 16px;
2788
+ font-size: 18px;
2789
+ line-height: 1.3333333;
2790
+ }
2791
+ .egg-container .has-feedback {
2792
+ position: relative;
2793
+ }
2794
+ .egg-container .has-feedback .form-control {
2795
+ padding-right: 42.5px;
2796
+ }
2797
+ .egg-container .form-control-feedback {
2798
+ position: absolute;
2799
+ top: 0;
2800
+ right: 0;
2801
+ z-index: 2;
2802
+ display: block;
2803
+ width: 34px;
2804
+ height: 34px;
2805
+ line-height: 34px;
2806
+ text-align: center;
2807
+ pointer-events: none;
2808
+ }
2809
+ .egg-container .input-lg + .form-control-feedback {
2810
+ width: 46px;
2811
+ height: 46px;
2812
+ line-height: 46px;
2813
+ }
2814
+ .egg-container .input-sm + .form-control-feedback {
2815
+ width: 30px;
2816
+ height: 30px;
2817
+ line-height: 30px;
2818
+ }
2819
+ .egg-container .has-success .help-block,
2820
+ .egg-container .has-success .control-label,
2821
+ .egg-container .has-success .radio,
2822
+ .egg-container .has-success .checkbox,
2823
+ .egg-container .has-success .radio-inline,
2824
+ .egg-container .has-success .checkbox-inline,
2825
+ .egg-container .has-success.radio label,
2826
+ .egg-container .has-success.checkbox label,
2827
+ .egg-container .has-success.radio-inline label,
2828
+ .egg-container .has-success.checkbox-inline label {
2829
+ color: #3c763d;
2830
+ }
2831
+ .egg-container .has-success .form-control {
2832
+ border-color: #3c763d;
2833
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2834
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2835
+ }
2836
+ .egg-container .has-success .form-control:focus {
2837
+ border-color: #2b542c;
2838
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
2839
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
2840
+ }
2841
+ .egg-container .has-success .input-group-addon {
2842
+ color: #3c763d;
2843
+ background-color: #dff0d8;
2844
+ border-color: #3c763d;
2845
+ }
2846
+ .egg-container .has-success .form-control-feedback {
2847
+ color: #3c763d;
2848
+ }
2849
+ .egg-container .has-warning .help-block,
2850
+ .egg-container .has-warning .control-label,
2851
+ .egg-container .has-warning .radio,
2852
+ .egg-container .has-warning .checkbox,
2853
+ .egg-container .has-warning .radio-inline,
2854
+ .egg-container .has-warning .checkbox-inline,
2855
+ .egg-container .has-warning.radio label,
2856
+ .egg-container .has-warning.checkbox label,
2857
+ .egg-container .has-warning.radio-inline label,
2858
+ .egg-container .has-warning.checkbox-inline label {
2859
+ color: #8a6d3b;
2860
+ }
2861
+ .egg-container .has-warning .form-control {
2862
+ border-color: #8a6d3b;
2863
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2864
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2865
+ }
2866
+ .egg-container .has-warning .form-control:focus {
2867
+ border-color: #66512c;
2868
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
2869
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
2870
+ }
2871
+ .egg-container .has-warning .input-group-addon {
2872
+ color: #8a6d3b;
2873
+ background-color: #fcf8e3;
2874
+ border-color: #8a6d3b;
2875
+ }
2876
+ .egg-container .has-warning .form-control-feedback {
2877
+ color: #8a6d3b;
2878
+ }
2879
+ .egg-container .has-error .help-block,
2880
+ .egg-container .has-error .control-label,
2881
+ .egg-container .has-error .radio,
2882
+ .egg-container .has-error .checkbox,
2883
+ .egg-container .has-error .radio-inline,
2884
+ .egg-container .has-error .checkbox-inline,
2885
+ .egg-container .has-error.radio label,
2886
+ .egg-container .has-error.checkbox label,
2887
+ .egg-container .has-error.radio-inline label,
2888
+ .egg-container .has-error.checkbox-inline label {
2889
+ color: #a94442;
2890
+ }
2891
+ .egg-container .has-error .form-control {
2892
+ border-color: #a94442;
2893
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2894
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
2895
+ }
2896
+ .egg-container .has-error .form-control:focus {
2897
+ border-color: #843534;
2898
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
2899
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
2900
+ }
2901
+ .egg-container .has-error .input-group-addon {
2902
+ color: #a94442;
2903
+ background-color: #f2dede;
2904
+ border-color: #a94442;
2905
+ }
2906
+ .egg-container .has-error .form-control-feedback {
2907
+ color: #a94442;
2908
+ }
2909
+ .egg-container .has-feedback label ~ .form-control-feedback {
2910
+ top: 25px;
2911
+ }
2912
+ .egg-container .has-feedback label.sr-only ~ .form-control-feedback {
2913
+ top: 0;
2914
+ }
2915
+ .egg-container .help-block {
2916
+ display: block;
2917
+ margin-top: 5px;
2918
+ margin-bottom: 10px;
2919
+ color: #737373;
2920
+ }
2921
+ @media (min-width: 768px) {
2922
+ .egg-container .form-inline .form-group {
2923
+ display: inline-block;
2924
+ margin-bottom: 0;
2925
+ vertical-align: middle;
2926
+ }
2927
+ .egg-container .form-inline .form-control {
2928
+ display: inline-block;
2929
+ width: auto;
2930
+ vertical-align: middle;
2931
+ }
2932
+ .egg-container .form-inline .form-control-static {
2933
+ display: inline-block;
2934
+ }
2935
+ .egg-container .form-inline .input-group {
2936
+ display: inline-table;
2937
+ vertical-align: middle;
2938
+ }
2939
+ .egg-container .form-inline .input-group .input-group-addon,
2940
+ .egg-container .form-inline .input-group .input-group-btn,
2941
+ .egg-container .form-inline .input-group .form-control {
2942
+ width: auto;
2943
+ }
2944
+ .egg-container .form-inline .input-group > .form-control {
2945
+ width: 100%;
2946
+ }
2947
+ .egg-container .form-inline .control-label {
2948
+ margin-bottom: 0;
2949
+ vertical-align: middle;
2950
+ }
2951
+ .egg-container .form-inline .radio,
2952
+ .egg-container .form-inline .checkbox {
2953
+ display: inline-block;
2954
+ margin-top: 0;
2955
+ margin-bottom: 0;
2956
+ vertical-align: middle;
2957
+ }
2958
+ .egg-container .form-inline .radio label,
2959
+ .egg-container .form-inline .checkbox label {
2960
+ padding-left: 0;
2961
+ }
2962
+ .egg-container .form-inline .radio input[type="radio"],
2963
+ .egg-container .form-inline .checkbox input[type="checkbox"] {
2964
+ position: relative;
2965
+ margin-left: 0;
2966
+ }
2967
+ .egg-container .form-inline .has-feedback .form-control-feedback {
2968
+ top: 0;
2969
+ }
2970
+ }
2971
+ .egg-container .form-horizontal .radio,
2972
+ .egg-container .form-horizontal .checkbox,
2973
+ .egg-container .form-horizontal .radio-inline,
2974
+ .egg-container .form-horizontal .checkbox-inline {
2975
+ padding-top: 7px;
2976
+ margin-top: 0;
2977
+ margin-bottom: 0;
2978
+ }
2979
+ .egg-container .form-horizontal .radio,
2980
+ .egg-container .form-horizontal .checkbox {
2981
+ min-height: 27px;
2982
+ }
2983
+ .egg-container .form-horizontal .form-group {
2984
+ margin-right: -15px;
2985
+ margin-left: -15px;
2986
+ }
2987
+ @media (min-width: 768px) {
2988
+ .egg-container .form-horizontal .control-label {
2989
+ padding-top: 7px;
2990
+ margin-bottom: 0;
2991
+ text-align: right;
2992
+ }
2993
+ }
2994
+ .egg-container .form-horizontal .has-feedback .form-control-feedback {
2995
+ right: 15px;
2996
+ }
2997
+ @media (min-width: 768px) {
2998
+ .egg-container .form-horizontal .form-group-lg .control-label {
2999
+ padding-top: 14.333333px;
3000
+ }
3001
+ }
3002
+ @media (min-width: 768px) {
3003
+ .egg-container .form-horizontal .form-group-sm .control-label {
3004
+ padding-top: 6px;
3005
+ }
3006
+ }
3007
+ .egg-container .btn {
3008
+ display: inline-block;
3009
+ padding: 6px 12px;
3010
+ margin-bottom: 0;
3011
+ font-size: 14px;
3012
+ font-weight: normal;
3013
+ line-height: 1.42857143;
3014
+ text-align: center;
3015
+ white-space: nowrap;
3016
+ vertical-align: middle;
3017
+ -ms-touch-action: manipulation;
3018
+ touch-action: manipulation;
3019
+ cursor: pointer;
3020
+ -webkit-user-select: none;
3021
+ -moz-user-select: none;
3022
+ -ms-user-select: none;
3023
+ user-select: none;
3024
+ background-image: none;
3025
+ border: 1px solid transparent;
3026
+ border-radius: 4px;
3027
+ }
3028
+ .egg-container .btn:focus,
3029
+ .egg-container .btn:active:focus,
3030
+ .egg-container .btn.active:focus,
3031
+ .egg-container .btn.focus,
3032
+ .egg-container .btn:active.focus,
3033
+ .egg-container .btn.active.focus {
3034
+ outline: thin dotted;
3035
+ outline: 5px auto -webkit-focus-ring-color;
3036
+ outline-offset: -2px;
3037
+ }
3038
+ .egg-container .btn:hover,
3039
+ .egg-container .btn:focus,
3040
+ .egg-container .btn.focus {
3041
+ color: #333;
3042
+ text-decoration: none;
3043
+ }
3044
+ .egg-container .btn:active,
3045
+ .egg-container .btn.active {
3046
+ background-image: none;
3047
+ outline: 0;
3048
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3049
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3050
+ }
3051
+ .egg-container .btn.disabled,
3052
+ .egg-container .btn[disabled],
3053
+ fieldset[disabled] .egg-container .btn {
3054
+ pointer-events: none;
3055
+ cursor: not-allowed;
3056
+ filter: alpha(opacity=65);
3057
+ -webkit-box-shadow: none;
3058
+ box-shadow: none;
3059
+ opacity: .65;
3060
+ }
3061
+ .egg-container .btn-default {
3062
+ color: #333;
3063
+ background-color: #fff;
3064
+ border-color: #ccc;
3065
+ }
3066
+ .egg-container .btn-default:hover,
3067
+ .egg-container .btn-default:focus,
3068
+ .egg-container .btn-default.focus,
3069
+ .egg-container .btn-default:active,
3070
+ .egg-container .btn-default.active,
3071
+ .open > .dropdown-toggle.egg-container .btn-default {
3072
+ color: #333;
3073
+ background-color: #e6e6e6;
3074
+ border-color: #adadad;
3075
+ }
3076
+ .egg-container .btn-default:active,
3077
+ .egg-container .btn-default.active,
3078
+ .open > .dropdown-toggle.egg-container .btn-default {
3079
+ background-image: none;
3080
+ }
3081
+ .egg-container .btn-default.disabled,
3082
+ .egg-container .btn-default[disabled],
3083
+ fieldset[disabled] .egg-container .btn-default,
3084
+ .egg-container .btn-default.disabled:hover,
3085
+ .egg-container .btn-default[disabled]:hover,
3086
+ fieldset[disabled] .egg-container .btn-default:hover,
3087
+ .egg-container .btn-default.disabled:focus,
3088
+ .egg-container .btn-default[disabled]:focus,
3089
+ fieldset[disabled] .egg-container .btn-default:focus,
3090
+ .egg-container .btn-default.disabled.focus,
3091
+ .egg-container .btn-default[disabled].focus,
3092
+ fieldset[disabled] .egg-container .btn-default.focus,
3093
+ .egg-container .btn-default.disabled:active,
3094
+ .egg-container .btn-default[disabled]:active,
3095
+ fieldset[disabled] .egg-container .btn-default:active,
3096
+ .egg-container .btn-default.disabled.active,
3097
+ .egg-container .btn-default[disabled].active,
3098
+ fieldset[disabled] .egg-container .btn-default.active {
3099
+ background-color: #fff;
3100
+ border-color: #ccc;
3101
+ }
3102
+ .egg-container .btn-default .badge {
3103
+ color: #fff;
3104
+ background-color: #333;
3105
+ }
3106
+ .egg-container .btn-primary {
3107
+ color: #fff;
3108
+ background-color: #337ab7;
3109
+ border-color: #2e6da4;
3110
+ }
3111
+ .egg-container .btn-primary:hover,
3112
+ .egg-container .btn-primary:focus,
3113
+ .egg-container .btn-primary.focus,
3114
+ .egg-container .btn-primary:active,
3115
+ .egg-container .btn-primary.active,
3116
+ .open > .dropdown-toggle.egg-container .btn-primary {
3117
+ color: #fff;
3118
+ background-color: #286090;
3119
+ border-color: #204d74;
3120
+ }
3121
+ .egg-container .btn-primary:active,
3122
+ .egg-container .btn-primary.active,
3123
+ .open > .dropdown-toggle.egg-container .btn-primary {
3124
+ background-image: none;
3125
+ }
3126
+ .egg-container .btn-primary.disabled,
3127
+ .egg-container .btn-primary[disabled],
3128
+ fieldset[disabled] .egg-container .btn-primary,
3129
+ .egg-container .btn-primary.disabled:hover,
3130
+ .egg-container .btn-primary[disabled]:hover,
3131
+ fieldset[disabled] .egg-container .btn-primary:hover,
3132
+ .egg-container .btn-primary.disabled:focus,
3133
+ .egg-container .btn-primary[disabled]:focus,
3134
+ fieldset[disabled] .egg-container .btn-primary:focus,
3135
+ .egg-container .btn-primary.disabled.focus,
3136
+ .egg-container .btn-primary[disabled].focus,
3137
+ fieldset[disabled] .egg-container .btn-primary.focus,
3138
+ .egg-container .btn-primary.disabled:active,
3139
+ .egg-container .btn-primary[disabled]:active,
3140
+ fieldset[disabled] .egg-container .btn-primary:active,
3141
+ .egg-container .btn-primary.disabled.active,
3142
+ .egg-container .btn-primary[disabled].active,
3143
+ fieldset[disabled] .egg-container .btn-primary.active {
3144
+ background-color: #337ab7;
3145
+ border-color: #2e6da4;
3146
+ }
3147
+ .egg-container .btn-primary .badge {
3148
+ color: #337ab7;
3149
+ background-color: #fff;
3150
+ }
3151
+ .egg-container .btn-success {
3152
+ color: #fff;
3153
+ background-color: #5cb85c;
3154
+ border-color: #4cae4c;
3155
+ text-decoration: none !important;
3156
+ }
3157
+ .egg-container .btn-success:hover,
3158
+ .egg-container .btn-success:focus,
3159
+ .egg-container .btn-success.focus,
3160
+ .egg-container .btn-success:active,
3161
+ .egg-container .btn-success.active,
3162
+ .open > .dropdown-toggle.egg-container .btn-success {
3163
+ color: #fff;
3164
+ background-color: #449d44;
3165
+ border-color: #398439;
3166
+ }
3167
+ .egg-container .btn-success:active,
3168
+ .egg-container .btn-success.active,
3169
+ .open > .dropdown-toggle.egg-container .btn-success {
3170
+ background-image: none;
3171
+ }
3172
+ .egg-container .btn-success.disabled,
3173
+ .egg-container .btn-success[disabled],
3174
+ fieldset[disabled] .egg-container .btn-success,
3175
+ .egg-container .btn-success.disabled:hover,
3176
+ .egg-container .btn-success[disabled]:hover,
3177
+ fieldset[disabled] .egg-container .btn-success:hover,
3178
+ .egg-container .btn-success.disabled:focus,
3179
+ .egg-container .btn-success[disabled]:focus,
3180
+ fieldset[disabled] .egg-container .btn-success:focus,
3181
+ .egg-container .btn-success.disabled.focus,
3182
+ .egg-container .btn-success[disabled].focus,
3183
+ fieldset[disabled] .egg-container .btn-success.focus,
3184
+ .egg-container .btn-success.disabled:active,
3185
+ .egg-container .btn-success[disabled]:active,
3186
+ fieldset[disabled] .egg-container .btn-success:active,
3187
+ .egg-container .btn-success.disabled.active,
3188
+ .egg-container .btn-success[disabled].active,
3189
+ fieldset[disabled] .egg-container .btn-success.active {
3190
+ background-color: #5cb85c;
3191
+ border-color: #4cae4c;
3192
+ }
3193
+ .egg-container .btn-success .badge {
3194
+ color: #5cb85c;
3195
+ background-color: #fff;
3196
+ }
3197
+ .egg-container .btn-info {
3198
+ color: #fff;
3199
+ background-color: #5bc0de;
3200
+ border-color: #46b8da;
3201
+ }
3202
+ .egg-container .btn-info:hover,
3203
+ .egg-container .btn-info:focus,
3204
+ .egg-container .btn-info.focus,
3205
+ .egg-container .btn-info:active,
3206
+ .egg-container .btn-info.active,
3207
+ .open > .dropdown-toggle.egg-container .btn-info {
3208
+ color: #fff;
3209
+ background-color: #31b0d5;
3210
+ border-color: #269abc;
3211
+ }
3212
+ .egg-container .btn-info:active,
3213
+ .egg-container .btn-info.active,
3214
+ .open > .dropdown-toggle.egg-container .btn-info {
3215
+ background-image: none;
3216
+ }
3217
+ .egg-container .btn-info.disabled,
3218
+ .egg-container .btn-info[disabled],
3219
+ fieldset[disabled] .egg-container .btn-info,
3220
+ .egg-container .btn-info.disabled:hover,
3221
+ .egg-container .btn-info[disabled]:hover,
3222
+ fieldset[disabled] .egg-container .btn-info:hover,
3223
+ .egg-container .btn-info.disabled:focus,
3224
+ .egg-container .btn-info[disabled]:focus,
3225
+ fieldset[disabled] .egg-container .btn-info:focus,
3226
+ .egg-container .btn-info.disabled.focus,
3227
+ .egg-container .btn-info[disabled].focus,
3228
+ fieldset[disabled] .egg-container .btn-info.focus,
3229
+ .egg-container .btn-info.disabled:active,
3230
+ .egg-container .btn-info[disabled]:active,
3231
+ fieldset[disabled] .egg-container .btn-info:active,
3232
+ .egg-container .btn-info.disabled.active,
3233
+ .egg-container .btn-info[disabled].active,
3234
+ fieldset[disabled] .egg-container .btn-info.active {
3235
+ background-color: #5bc0de;
3236
+ border-color: #46b8da;
3237
+ }
3238
+ .egg-container .btn-info .badge {
3239
+ color: #5bc0de;
3240
+ background-color: #fff;
3241
+ }
3242
+ .egg-container .btn-warning {
3243
+ color: #fff;
3244
+ background-color: #f0ad4e;
3245
+ border-color: #eea236;
3246
+ }
3247
+ .egg-container .btn-warning:hover,
3248
+ .egg-container .btn-warning:focus,
3249
+ .egg-container .btn-warning.focus,
3250
+ .egg-container .btn-warning:active,
3251
+ .egg-container .btn-warning.active,
3252
+ .open > .dropdown-toggle.egg-container .btn-warning {
3253
+ color: #fff;
3254
+ background-color: #ec971f;
3255
+ border-color: #d58512;
3256
+ }
3257
+ .egg-container .btn-warning:active,
3258
+ .egg-container .btn-warning.active,
3259
+ .open > .dropdown-toggle.egg-container .btn-warning {
3260
+ background-image: none;
3261
+ }
3262
+ .egg-container .btn-warning.disabled,
3263
+ .egg-container .btn-warning[disabled],
3264
+ fieldset[disabled] .egg-container .btn-warning,
3265
+ .egg-container .btn-warning.disabled:hover,
3266
+ .egg-container .btn-warning[disabled]:hover,
3267
+ fieldset[disabled] .egg-container .btn-warning:hover,
3268
+ .egg-container .btn-warning.disabled:focus,
3269
+ .egg-container .btn-warning[disabled]:focus,
3270
+ fieldset[disabled] .egg-container .btn-warning:focus,
3271
+ .egg-container .btn-warning.disabled.focus,
3272
+ .egg-container .btn-warning[disabled].focus,
3273
+ fieldset[disabled] .egg-container .btn-warning.focus,
3274
+ .egg-container .btn-warning.disabled:active,
3275
+ .egg-container .btn-warning[disabled]:active,
3276
+ fieldset[disabled] .egg-container .btn-warning:active,
3277
+ .egg-container .btn-warning.disabled.active,
3278
+ .egg-container .btn-warning[disabled].active,
3279
+ fieldset[disabled] .egg-container .btn-warning.active {
3280
+ background-color: #f0ad4e;
3281
+ border-color: #eea236;
3282
+ }
3283
+ .egg-container .btn-warning .badge {
3284
+ color: #f0ad4e;
3285
+ background-color: #fff;
3286
+ }
3287
+ .egg-container .btn-danger {
3288
+ color: #fff;
3289
+ background-color: #d9534f;
3290
+ border-color: #d43f3a;
3291
+ }
3292
+ .egg-container .btn-danger:hover,
3293
+ .egg-container .btn-danger:focus,
3294
+ .egg-container .btn-danger.focus,
3295
+ .egg-container .btn-danger:active,
3296
+ .egg-container .btn-danger.active,
3297
+ .open > .dropdown-toggle.egg-container .btn-danger {
3298
+ color: #fff;
3299
+ background-color: #c9302c;
3300
+ border-color: #ac2925;
3301
+ }
3302
+ .egg-container .btn-danger:active,
3303
+ .egg-container .btn-danger.active,
3304
+ .open > .dropdown-toggle.egg-container .btn-danger {
3305
+ background-image: none;
3306
+ }
3307
+ .egg-container .btn-danger.disabled,
3308
+ .egg-container .btn-danger[disabled],
3309
+ fieldset[disabled] .egg-container .btn-danger,
3310
+ .egg-container .btn-danger.disabled:hover,
3311
+ .egg-container .btn-danger[disabled]:hover,
3312
+ fieldset[disabled] .egg-container .btn-danger:hover,
3313
+ .egg-container .btn-danger.disabled:focus,
3314
+ .egg-container .btn-danger[disabled]:focus,
3315
+ fieldset[disabled] .egg-container .btn-danger:focus,
3316
+ .egg-container .btn-danger.disabled.focus,
3317
+ .egg-container .btn-danger[disabled].focus,
3318
+ fieldset[disabled] .egg-container .btn-danger.focus,
3319
+ .egg-container .btn-danger.disabled:active,
3320
+ .egg-container .btn-danger[disabled]:active,
3321
+ fieldset[disabled] .egg-container .btn-danger:active,
3322
+ .egg-container .btn-danger.disabled.active,
3323
+ .egg-container .btn-danger[disabled].active,
3324
+ fieldset[disabled] .egg-container .btn-danger.active {
3325
+ background-color: #d9534f;
3326
+ border-color: #d43f3a;
3327
+ }
3328
+ .egg-container .btn-danger .badge {
3329
+ color: #d9534f;
3330
+ background-color: #fff;
3331
+ }
3332
+ .egg-container .btn-link {
3333
+ font-weight: normal;
3334
+ color: #337ab7;
3335
+ border-radius: 0;
3336
+ }
3337
+ .egg-container .btn-link,
3338
+ .egg-container .btn-link:active,
3339
+ .egg-container .btn-link.active,
3340
+ .egg-container .btn-link[disabled],
3341
+ fieldset[disabled] .egg-container .btn-link {
3342
+ background-color: transparent;
3343
+ -webkit-box-shadow: none;
3344
+ box-shadow: none;
3345
+ }
3346
+ .egg-container .btn-link,
3347
+ .egg-container .btn-link:hover,
3348
+ .egg-container .btn-link:focus,
3349
+ .egg-container .btn-link:active {
3350
+ border-color: transparent;
3351
+ }
3352
+ .egg-container .btn-link:hover,
3353
+ .egg-container .btn-link:focus {
3354
+ color: #23527c;
3355
+ text-decoration: underline;
3356
+ background-color: transparent;
3357
+ }
3358
+ .egg-container .btn-link[disabled]:hover,
3359
+ fieldset[disabled] .egg-container .btn-link:hover,
3360
+ .egg-container .btn-link[disabled]:focus,
3361
+ fieldset[disabled] .egg-container .btn-link:focus {
3362
+ color: #777;
3363
+ text-decoration: none;
3364
+ }
3365
+ .egg-container .btn-lg {
3366
+ padding: 10px 16px;
3367
+ font-size: 18px;
3368
+ line-height: 1.3333333;
3369
+ border-radius: 6px;
3370
+ }
3371
+ .egg-container .btn-sm {
3372
+ padding: 5px 10px;
3373
+ font-size: 12px;
3374
+ line-height: 1.5;
3375
+ border-radius: 3px;
3376
+ }
3377
+ .egg-container .btn-xs {
3378
+ padding: 1px 5px;
3379
+ font-size: 12px;
3380
+ line-height: 1.5;
3381
+ border-radius: 3px;
3382
+ }
3383
+ .egg-container .btn-block {
3384
+ display: block;
3385
+ width: 100%;
3386
+ }
3387
+ .egg-container .btn-block + .btn-block {
3388
+ margin-top: 5px;
3389
+ }
3390
+ .egg-container input[type="submit"].btn-block,
3391
+ .egg-container input[type="reset"].btn-block,
3392
+ .egg-container input[type="button"].btn-block {
3393
+ width: 100%;
3394
+ }
3395
+ .egg-container .fade {
3396
+ opacity: 0;
3397
+ -webkit-transition: opacity .15s linear;
3398
+ -o-transition: opacity .15s linear;
3399
+ transition: opacity .15s linear;
3400
+ }
3401
+ .egg-container .fade.in {
3402
+ opacity: 1;
3403
+ }
3404
+ .egg-container .collapse {
3405
+ display: none;
3406
+ }
3407
+ .egg-container .collapse.in {
3408
+ display: block;
3409
+ }
3410
+ tr.egg-container .collapse.in {
3411
+ display: table-row;
3412
+ }
3413
+ tbody.egg-container .collapse.in {
3414
+ display: table-row-group;
3415
+ }
3416
+ .egg-container .collapsing {
3417
+ position: relative;
3418
+ height: 0;
3419
+ overflow: hidden;
3420
+ -webkit-transition-timing-function: ease;
3421
+ -o-transition-timing-function: ease;
3422
+ transition-timing-function: ease;
3423
+ -webkit-transition-duration: .35s;
3424
+ -o-transition-duration: .35s;
3425
+ transition-duration: .35s;
3426
+ -webkit-transition-property: height, visibility;
3427
+ -o-transition-property: height, visibility;
3428
+ transition-property: height, visibility;
3429
+ }
3430
+ .egg-container .caret {
3431
+ display: inline-block;
3432
+ width: 0;
3433
+ height: 0;
3434
+ margin-left: 2px;
3435
+ vertical-align: middle;
3436
+ border-top: 4px dashed;
3437
+ border-right: 4px solid transparent;
3438
+ border-left: 4px solid transparent;
3439
+ }
3440
+ .egg-container .dropup,
3441
+ .egg-container .dropdown {
3442
+ position: relative;
3443
+ }
3444
+ .egg-container .dropdown-toggle:focus {
3445
+ outline: 0;
3446
+ }
3447
+ .egg-container .dropdown-menu {
3448
+ position: absolute;
3449
+ top: 100%;
3450
+ left: 0;
3451
+ z-index: 1000;
3452
+ display: none;
3453
+ float: left;
3454
+ min-width: 160px;
3455
+ padding: 5px 0;
3456
+ margin: 2px 0 0;
3457
+ font-size: 14px;
3458
+ text-align: left;
3459
+ list-style: none;
3460
+ background-color: #fff;
3461
+ -webkit-background-clip: padding-box;
3462
+ background-clip: padding-box;
3463
+ border: 1px solid #ccc;
3464
+ border: 1px solid rgba(0, 0, 0, .15);
3465
+ border-radius: 4px;
3466
+ -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
3467
+ box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
3468
+ }
3469
+ .egg-container .dropdown-menu.pull-right {
3470
+ right: 0;
3471
+ left: auto;
3472
+ }
3473
+ .egg-container .dropdown-menu .divider {
3474
+ height: 1px;
3475
+ margin: 9px 0;
3476
+ overflow: hidden;
3477
+ background-color: #e5e5e5;
3478
+ }
3479
+ .egg-container .dropdown-menu > li > a {
3480
+ display: block;
3481
+ padding: 3px 20px;
3482
+ clear: both;
3483
+ font-weight: normal;
3484
+ line-height: 1.42857143;
3485
+ color: #333;
3486
+ white-space: nowrap;
3487
+ }
3488
+ .egg-container .dropdown-menu > li > a:hover,
3489
+ .egg-container .dropdown-menu > li > a:focus {
3490
+ color: #262626;
3491
+ text-decoration: none;
3492
+ background-color: #f5f5f5;
3493
+ }
3494
+ .egg-container .dropdown-menu > .active > a,
3495
+ .egg-container .dropdown-menu > .active > a:hover,
3496
+ .egg-container .dropdown-menu > .active > a:focus {
3497
+ color: #fff;
3498
+ text-decoration: none;
3499
+ background-color: #337ab7;
3500
+ outline: 0;
3501
+ }
3502
+ .egg-container .dropdown-menu > .disabled > a,
3503
+ .egg-container .dropdown-menu > .disabled > a:hover,
3504
+ .egg-container .dropdown-menu > .disabled > a:focus {
3505
+ color: #777;
3506
+ }
3507
+ .egg-container .dropdown-menu > .disabled > a:hover,
3508
+ .egg-container .dropdown-menu > .disabled > a:focus {
3509
+ text-decoration: none;
3510
+ cursor: not-allowed;
3511
+ background-color: transparent;
3512
+ background-image: none;
3513
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3514
+ }
3515
+ .egg-container .open > .dropdown-menu {
3516
+ display: block;
3517
+ }
3518
+ .egg-container .open > a {
3519
+ outline: 0;
3520
+ }
3521
+ .egg-container .dropdown-menu-right {
3522
+ right: 0;
3523
+ left: auto;
3524
+ }
3525
+ .egg-container .dropdown-menu-left {
3526
+ right: auto;
3527
+ left: 0;
3528
+ }
3529
+ .egg-container .dropdown-header {
3530
+ display: block;
3531
+ padding: 3px 20px;
3532
+ font-size: 12px;
3533
+ line-height: 1.42857143;
3534
+ color: #777;
3535
+ white-space: nowrap;
3536
+ }
3537
+ .egg-container .dropdown-backdrop {
3538
+ position: fixed;
3539
+ top: 0;
3540
+ right: 0;
3541
+ bottom: 0;
3542
+ left: 0;
3543
+ z-index: 990;
3544
+ }
3545
+ .egg-container .pull-right > .dropdown-menu {
3546
+ right: 0;
3547
+ left: auto;
3548
+ }
3549
+ .egg-container .dropup .caret,
3550
+ .egg-container .navbar-fixed-bottom .dropdown .caret {
3551
+ content: "";
3552
+ border-top: 0;
3553
+ border-bottom: 4px solid;
3554
+ }
3555
+ .egg-container .dropup .dropdown-menu,
3556
+ .egg-container .navbar-fixed-bottom .dropdown .dropdown-menu {
3557
+ top: auto;
3558
+ bottom: 100%;
3559
+ margin-bottom: 2px;
3560
+ }
3561
+ @media (min-width: 768px) {
3562
+ .egg-container .navbar-right .dropdown-menu {
3563
+ right: 0;
3564
+ left: auto;
3565
+ }
3566
+ .egg-container .navbar-right .dropdown-menu-left {
3567
+ right: auto;
3568
+ left: 0;
3569
+ }
3570
+ }
3571
+ .egg-container .btn-group,
3572
+ .egg-container .btn-group-vertical {
3573
+ position: relative;
3574
+ display: inline-block;
3575
+ vertical-align: middle;
3576
+ }
3577
+ .egg-container .btn-group > .btn,
3578
+ .egg-container .btn-group-vertical > .btn {
3579
+ position: relative;
3580
+ float: left;
3581
+ }
3582
+ .egg-container .btn-group > .btn:hover,
3583
+ .egg-container .btn-group-vertical > .btn:hover,
3584
+ .egg-container .btn-group > .btn:focus,
3585
+ .egg-container .btn-group-vertical > .btn:focus,
3586
+ .egg-container .btn-group > .btn:active,
3587
+ .egg-container .btn-group-vertical > .btn:active,
3588
+ .egg-container .btn-group > .btn.active,
3589
+ .egg-container .btn-group-vertical > .btn.active {
3590
+ z-index: 2;
3591
+ }
3592
+ .egg-container .btn-group .btn + .btn,
3593
+ .egg-container .btn-group .btn + .btn-group,
3594
+ .egg-container .btn-group .btn-group + .btn,
3595
+ .egg-container .btn-group .btn-group + .btn-group {
3596
+ margin-left: -1px;
3597
+ }
3598
+ .egg-container .btn-toolbar {
3599
+ margin-left: -5px;
3600
+ }
3601
+ .egg-container .btn-toolbar .btn-group,
3602
+ .egg-container .btn-toolbar .input-group {
3603
+ float: left;
3604
+ }
3605
+ .egg-container .btn-toolbar > .btn,
3606
+ .egg-container .btn-toolbar > .btn-group,
3607
+ .egg-container .btn-toolbar > .input-group {
3608
+ margin-left: 5px;
3609
+ }
3610
+ .egg-container .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3611
+ border-radius: 0;
3612
+ }
3613
+ .egg-container .btn-group > .btn:first-child {
3614
+ margin-left: 0;
3615
+ }
3616
+ .egg-container .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3617
+ border-top-right-radius: 0;
3618
+ border-bottom-right-radius: 0;
3619
+ }
3620
+ .egg-container .btn-group > .btn:last-child:not(:first-child),
3621
+ .egg-container .btn-group > .dropdown-toggle:not(:first-child) {
3622
+ border-top-left-radius: 0;
3623
+ border-bottom-left-radius: 0;
3624
+ }
3625
+ .egg-container .btn-group > .btn-group {
3626
+ float: left;
3627
+ }
3628
+ .egg-container .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
3629
+ border-radius: 0;
3630
+ }
3631
+ .egg-container .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
3632
+ .egg-container .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3633
+ border-top-right-radius: 0;
3634
+ border-bottom-right-radius: 0;
3635
+ }
3636
+ .egg-container .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
3637
+ border-top-left-radius: 0;
3638
+ border-bottom-left-radius: 0;
3639
+ }
3640
+ .egg-container .btn-group .dropdown-toggle:active,
3641
+ .egg-container .btn-group.open .dropdown-toggle {
3642
+ outline: 0;
3643
+ }
3644
+ .egg-container .btn-group > .btn + .dropdown-toggle {
3645
+ padding-right: 8px;
3646
+ padding-left: 8px;
3647
+ }
3648
+ .egg-container .btn-group > .btn-lg + .dropdown-toggle {
3649
+ padding-right: 12px;
3650
+ padding-left: 12px;
3651
+ }
3652
+ .egg-container .btn-group.open .dropdown-toggle {
3653
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3654
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
3655
+ }
3656
+ .egg-container .btn-group.open .dropdown-toggle.btn-link {
3657
+ -webkit-box-shadow: none;
3658
+ box-shadow: none;
3659
+ }
3660
+ .egg-container .btn .caret {
3661
+ margin-left: 0;
3662
+ }
3663
+ .egg-container .btn-lg .caret {
3664
+ border-width: 5px 5px 0;
3665
+ border-bottom-width: 0;
3666
+ }
3667
+ .egg-container .dropup .btn-lg .caret {
3668
+ border-width: 0 5px 5px;
3669
+ }
3670
+ .egg-container .btn-group-vertical > .btn,
3671
+ .egg-container .btn-group-vertical > .btn-group,
3672
+ .egg-container .btn-group-vertical > .btn-group > .btn {
3673
+ display: block;
3674
+ float: none;
3675
+ width: 100%;
3676
+ max-width: 100%;
3677
+ }
3678
+ .egg-container .btn-group-vertical > .btn-group > .btn {
3679
+ float: none;
3680
+ }
3681
+ .egg-container .btn-group-vertical > .btn + .btn,
3682
+ .egg-container .btn-group-vertical > .btn + .btn-group,
3683
+ .egg-container .btn-group-vertical > .btn-group + .btn,
3684
+ .egg-container .btn-group-vertical > .btn-group + .btn-group {
3685
+ margin-top: -1px;
3686
+ margin-left: 0;
3687
+ }
3688
+ .egg-container .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
3689
+ border-radius: 0;
3690
+ }
3691
+ .egg-container .btn-group-vertical > .btn:first-child:not(:last-child) {
3692
+ border-top-right-radius: 4px;
3693
+ border-bottom-right-radius: 0;
3694
+ border-bottom-left-radius: 0;
3695
+ }
3696
+ .egg-container .btn-group-vertical > .btn:last-child:not(:first-child) {
3697
+ border-top-left-radius: 0;
3698
+ border-top-right-radius: 0;
3699
+ border-bottom-left-radius: 4px;
3700
+ }
3701
+ .egg-container .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
3702
+ border-radius: 0;
3703
+ }
3704
+ .egg-container .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
3705
+ .egg-container .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
3706
+ border-bottom-right-radius: 0;
3707
+ border-bottom-left-radius: 0;
3708
+ }
3709
+ .egg-container .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
3710
+ border-top-left-radius: 0;
3711
+ border-top-right-radius: 0;
3712
+ }
3713
+ .egg-container .btn-group-justified {
3714
+ display: table;
3715
+ width: 100%;
3716
+ table-layout: fixed;
3717
+ border-collapse: separate;
3718
+ }
3719
+ .egg-container .btn-group-justified > .btn,
3720
+ .egg-container .btn-group-justified > .btn-group {
3721
+ display: table-cell;
3722
+ float: none;
3723
+ width: 1%;
3724
+ }
3725
+ .egg-container .btn-group-justified > .btn-group .btn {
3726
+ width: 100%;
3727
+ }
3728
+ .egg-container .btn-group-justified > .btn-group .dropdown-menu {
3729
+ left: auto;
3730
+ }
3731
+ .egg-container [data-toggle="buttons"] > .btn input[type="radio"],
3732
+ .egg-container [data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
3733
+ .egg-container [data-toggle="buttons"] > .btn input[type="checkbox"],
3734
+ .egg-container [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
3735
+ position: absolute;
3736
+ clip: rect(0, 0, 0, 0);
3737
+ pointer-events: none;
3738
+ }
3739
+ .egg-container .input-group {
3740
+ position: relative;
3741
+ display: table;
3742
+ border-collapse: separate;
3743
+ }
3744
+ .egg-container .input-group[class*="col-"] {
3745
+ float: none;
3746
+ padding-right: 0;
3747
+ padding-left: 0;
3748
+ }
3749
+ .egg-container .input-group .form-control {
3750
+ position: relative;
3751
+ z-index: 2;
3752
+ float: left;
3753
+ width: 100%;
3754
+ margin-bottom: 0;
3755
+ }
3756
+ .egg-container .input-group-lg > .form-control,
3757
+ .egg-container .input-group-lg > .input-group-addon,
3758
+ .egg-container .input-group-lg > .input-group-btn > .btn {
3759
+ height: 46px;
3760
+ padding: 10px 16px;
3761
+ font-size: 18px;
3762
+ line-height: 1.3333333;
3763
+ border-radius: 6px;
3764
+ }
3765
+ select.egg-container .input-group-lg > .form-control,
3766
+ select.egg-container .input-group-lg > .input-group-addon,
3767
+ select.egg-container .input-group-lg > .input-group-btn > .btn {
3768
+ height: 46px;
3769
+ line-height: 46px;
3770
+ }
3771
+ textarea.egg-container .input-group-lg > .form-control,
3772
+ textarea.egg-container .input-group-lg > .input-group-addon,
3773
+ textarea.egg-container .input-group-lg > .input-group-btn > .btn,
3774
+ select[multiple].egg-container .input-group-lg > .form-control,
3775
+ select[multiple].egg-container .input-group-lg > .input-group-addon,
3776
+ select[multiple].egg-container .input-group-lg > .input-group-btn > .btn {
3777
+ height: auto;
3778
+ }
3779
+ .egg-container .input-group-sm > .form-control,
3780
+ .egg-container .input-group-sm > .input-group-addon,
3781
+ .egg-container .input-group-sm > .input-group-btn > .btn {
3782
+ height: 30px;
3783
+ padding: 5px 10px;
3784
+ font-size: 12px;
3785
+ line-height: 1.5;
3786
+ border-radius: 3px;
3787
+ }
3788
+ select.egg-container .input-group-sm > .form-control,
3789
+ select.egg-container .input-group-sm > .input-group-addon,
3790
+ select.egg-container .input-group-sm > .input-group-btn > .btn {
3791
+ height: 30px;
3792
+ line-height: 30px;
3793
+ }
3794
+ textarea.egg-container .input-group-sm > .form-control,
3795
+ textarea.egg-container .input-group-sm > .input-group-addon,
3796
+ textarea.egg-container .input-group-sm > .input-group-btn > .btn,
3797
+ select[multiple].egg-container .input-group-sm > .form-control,
3798
+ select[multiple].egg-container .input-group-sm > .input-group-addon,
3799
+ select[multiple].egg-container .input-group-sm > .input-group-btn > .btn {
3800
+ height: auto;
3801
+ }
3802
+ .egg-container .input-group-addon,
3803
+ .egg-container .input-group-btn,
3804
+ .egg-container .input-group .form-control {
3805
+ display: table-cell;
3806
+ }
3807
+ .egg-container .input-group-addon:not(:first-child):not(:last-child),
3808
+ .egg-container .input-group-btn:not(:first-child):not(:last-child),
3809
+ .egg-container .input-group .form-control:not(:first-child):not(:last-child) {
3810
+ border-radius: 0;
3811
+ }
3812
+ .egg-container .input-group-addon,
3813
+ .egg-container .input-group-btn {
3814
+ width: 1%;
3815
+ white-space: nowrap;
3816
+ vertical-align: middle;
3817
+ }
3818
+ .egg-container .input-group-addon {
3819
+ padding: 6px 12px;
3820
+ font-size: 14px;
3821
+ font-weight: normal;
3822
+ line-height: 1;
3823
+ color: #555;
3824
+ text-align: center;
3825
+ background-color: #eee;
3826
+ border: 1px solid #ccc;
3827
+ border-radius: 4px;
3828
+ }
3829
+ .egg-container .input-group-addon.input-sm {
3830
+ padding: 5px 10px;
3831
+ font-size: 12px;
3832
+ border-radius: 3px;
3833
+ }
3834
+ .egg-container .input-group-addon.input-lg {
3835
+ padding: 10px 16px;
3836
+ font-size: 18px;
3837
+ border-radius: 6px;
3838
+ }
3839
+ .egg-container .input-group-addon input[type="radio"],
3840
+ .egg-container .input-group-addon input[type="checkbox"] {
3841
+ margin-top: 0;
3842
+ }
3843
+ .egg-container .input-group .form-control:first-child,
3844
+ .egg-container .input-group-addon:first-child,
3845
+ .egg-container .input-group-btn:first-child > .btn,
3846
+ .egg-container .input-group-btn:first-child > .btn-group > .btn,
3847
+ .egg-container .input-group-btn:first-child > .dropdown-toggle,
3848
+ .egg-container .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
3849
+ .egg-container .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
3850
+ border-top-right-radius: 0;
3851
+ border-bottom-right-radius: 0;
3852
+ }
3853
+ .egg-container .input-group-addon:first-child {
3854
+ border-right: 0;
3855
+ }
3856
+ .egg-container .input-group .form-control:last-child,
3857
+ .egg-container .input-group-addon:last-child,
3858
+ .egg-container .input-group-btn:last-child > .btn,
3859
+ .egg-container .input-group-btn:last-child > .btn-group > .btn,
3860
+ .egg-container .input-group-btn:last-child > .dropdown-toggle,
3861
+ .egg-container .input-group-btn:first-child > .btn:not(:first-child),
3862
+ .egg-container .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
3863
+ border-top-left-radius: 0;
3864
+ border-bottom-left-radius: 0;
3865
+ }
3866
+ .egg-container .input-group-addon:last-child {
3867
+ border-left: 0;
3868
+ }
3869
+ .egg-container .input-group-btn {
3870
+ position: relative;
3871
+ font-size: 0;
3872
+ white-space: nowrap;
3873
+ }
3874
+ .egg-container .input-group-btn > .btn {
3875
+ position: relative;
3876
+ }
3877
+ .egg-container .input-group-btn > .btn + .btn {
3878
+ margin-left: -1px;
3879
+ }
3880
+ .egg-container .input-group-btn > .btn:hover,
3881
+ .egg-container .input-group-btn > .btn:focus,
3882
+ .egg-container .input-group-btn > .btn:active {
3883
+ z-index: 2;
3884
+ }
3885
+ .egg-container .input-group-btn:first-child > .btn,
3886
+ .egg-container .input-group-btn:first-child > .btn-group {
3887
+ margin-right: -1px;
3888
+ }
3889
+ .egg-container .input-group-btn:last-child > .btn,
3890
+ .egg-container .input-group-btn:last-child > .btn-group {
3891
+ margin-left: -1px;
3892
+ }
3893
+ .egg-container .nav {
3894
+ padding-left: 0;
3895
+ margin-bottom: 0;
3896
+ list-style: none;
3897
+ }
3898
+ .egg-container .nav > li {
3899
+ position: relative;
3900
+ display: block;
3901
+ }
3902
+ .egg-container .nav > li > a {
3903
+ position: relative;
3904
+ display: block;
3905
+ padding: 10px 15px;
3906
+ }
3907
+ .egg-container .nav > li > a:hover,
3908
+ .egg-container .nav > li > a:focus {
3909
+ text-decoration: none;
3910
+ background-color: #eee;
3911
+ }
3912
+ .egg-container .nav > li.disabled > a {
3913
+ color: #777;
3914
+ }
3915
+ .egg-container .nav > li.disabled > a:hover,
3916
+ .egg-container .nav > li.disabled > a:focus {
3917
+ color: #777;
3918
+ text-decoration: none;
3919
+ cursor: not-allowed;
3920
+ background-color: transparent;
3921
+ }
3922
+ .egg-container .nav .open > a,
3923
+ .egg-container .nav .open > a:hover,
3924
+ .egg-container .nav .open > a:focus {
3925
+ background-color: #eee;
3926
+ border-color: #337ab7;
3927
+ }
3928
+ .egg-container .nav .nav-divider {
3929
+ height: 1px;
3930
+ margin: 9px 0;
3931
+ overflow: hidden;
3932
+ background-color: #e5e5e5;
3933
+ }
3934
+ .egg-container .nav > li > a > img {
3935
+ max-width: none;
3936
+ }
3937
+ .egg-container .nav-tabs {
3938
+ border-bottom: 1px solid #ddd;
3939
+ }
3940
+ .egg-container .nav-tabs > li {
3941
+ float: left;
3942
+ margin-bottom: -1px;
3943
+ }
3944
+ .egg-container .nav-tabs > li > a {
3945
+ margin-right: 2px;
3946
+ line-height: 1.42857143;
3947
+ border: 1px solid transparent;
3948
+ border-radius: 4px 4px 0 0;
3949
+ }
3950
+ .egg-container .nav-tabs > li > a:hover {
3951
+ border-color: #eee #eee #ddd;
3952
+ }
3953
+ .egg-container .nav-tabs > li.active > a,
3954
+ .egg-container .nav-tabs > li.active > a:hover,
3955
+ .egg-container .nav-tabs > li.active > a:focus {
3956
+ color: #555;
3957
+ cursor: default;
3958
+ background-color: #fff;
3959
+ border: 1px solid #ddd;
3960
+ border-bottom-color: transparent;
3961
+ }
3962
+ .egg-container .nav-tabs.nav-justified {
3963
+ width: 100%;
3964
+ border-bottom: 0;
3965
+ }
3966
+ .egg-container .nav-tabs.nav-justified > li {
3967
+ float: none;
3968
+ }
3969
+ .egg-container .nav-tabs.nav-justified > li > a {
3970
+ margin-bottom: 5px;
3971
+ text-align: center;
3972
+ }
3973
+ .egg-container .nav-tabs.nav-justified > .dropdown .dropdown-menu {
3974
+ top: auto;
3975
+ left: auto;
3976
+ }
3977
+ @media (min-width: 768px) {
3978
+ .egg-container .nav-tabs.nav-justified > li {
3979
+ display: table-cell;
3980
+ width: 1%;
3981
+ }
3982
+ .egg-container .nav-tabs.nav-justified > li > a {
3983
+ margin-bottom: 0;
3984
+ }
3985
+ }
3986
+ .egg-container .nav-tabs.nav-justified > li > a {
3987
+ margin-right: 0;
3988
+ border-radius: 4px;
3989
+ }
3990
+ .egg-container .nav-tabs.nav-justified > .active > a,
3991
+ .egg-container .nav-tabs.nav-justified > .active > a:hover,
3992
+ .egg-container .nav-tabs.nav-justified > .active > a:focus {
3993
+ border: 1px solid #ddd;
3994
+ }
3995
+ @media (min-width: 768px) {
3996
+ .egg-container .nav-tabs.nav-justified > li > a {
3997
+ border-bottom: 1px solid #ddd;
3998
+ border-radius: 4px 4px 0 0;
3999
+ }
4000
+ .egg-container .nav-tabs.nav-justified > .active > a,
4001
+ .egg-container .nav-tabs.nav-justified > .active > a:hover,
4002
+ .egg-container .nav-tabs.nav-justified > .active > a:focus {
4003
+ border-bottom-color: #fff;
4004
+ }
4005
+ }
4006
+ .egg-container .nav-pills > li {
4007
+ float: left;
4008
+ }
4009
+ .egg-container .nav-pills > li > a {
4010
+ border-radius: 4px;
4011
+ }
4012
+ .egg-container .nav-pills > li + li {
4013
+ margin-left: 2px;
4014
+ }
4015
+ .egg-container .nav-pills > li.active > a,
4016
+ .egg-container .nav-pills > li.active > a:hover,
4017
+ .egg-container .nav-pills > li.active > a:focus {
4018
+ color: #fff;
4019
+ background-color: #337ab7;
4020
+ }
4021
+ .egg-container .nav-stacked > li {
4022
+ float: none;
4023
+ }
4024
+ .egg-container .nav-stacked > li + li {
4025
+ margin-top: 2px;
4026
+ margin-left: 0;
4027
+ }
4028
+ .egg-container .nav-justified {
4029
+ width: 100%;
4030
+ }
4031
+ .egg-container .nav-justified > li {
4032
+ float: none;
4033
+ }
4034
+ .egg-container .nav-justified > li > a {
4035
+ margin-bottom: 5px;
4036
+ text-align: center;
4037
+ }
4038
+ .egg-container .nav-justified > .dropdown .dropdown-menu {
4039
+ top: auto;
4040
+ left: auto;
4041
+ }
4042
+ @media (min-width: 768px) {
4043
+ .egg-container .nav-justified > li {
4044
+ display: table-cell;
4045
+ width: 1%;
4046
+ }
4047
+ .egg-container .nav-justified > li > a {
4048
+ margin-bottom: 0;
4049
+ }
4050
+ }
4051
+ .egg-container .nav-tabs-justified {
4052
+ border-bottom: 0;
4053
+ }
4054
+ .egg-container .nav-tabs-justified > li > a {
4055
+ margin-right: 0;
4056
+ border-radius: 4px;
4057
+ }
4058
+ .egg-container .nav-tabs-justified > .active > a,
4059
+ .egg-container .nav-tabs-justified > .active > a:hover,
4060
+ .egg-container .nav-tabs-justified > .active > a:focus {
4061
+ border: 1px solid #ddd;
4062
+ }
4063
+ @media (min-width: 768px) {
4064
+ .egg-container .nav-tabs-justified > li > a {
4065
+ border-bottom: 1px solid #ddd;
4066
+ border-radius: 4px 4px 0 0;
4067
+ }
4068
+ .egg-container .nav-tabs-justified > .active > a,
4069
+ .egg-container .nav-tabs-justified > .active > a:hover,
4070
+ .egg-container .nav-tabs-justified > .active > a:focus {
4071
+ border-bottom-color: #fff;
4072
+ }
4073
+ }
4074
+ .egg-container .tab-content > .tab-pane {
4075
+ display: none;
4076
+ }
4077
+ .egg-container .tab-content > .active {
4078
+ display: block;
4079
+ }
4080
+ .egg-container .nav-tabs .dropdown-menu {
4081
+ margin-top: -1px;
4082
+ border-top-left-radius: 0;
4083
+ border-top-right-radius: 0;
4084
+ }
4085
+ .egg-container .breadcrumb {
4086
+ padding: 8px 15px;
4087
+ margin-bottom: 20px;
4088
+ list-style: none;
4089
+ background-color: #f5f5f5;
4090
+ border-radius: 4px;
4091
+ }
4092
+ .egg-container .breadcrumb > li {
4093
+ display: inline-block;
4094
+ }
4095
+ .egg-container .breadcrumb > li + li:before {
4096
+ padding: 0 5px;
4097
+ color: #ccc;
4098
+ content: "/\00a0";
4099
+ }
4100
+ .egg-container .breadcrumb > .active {
4101
+ color: #777;
4102
+ }
4103
+ .egg-container .label {
4104
+ display: inline;
4105
+ padding: .2em .6em .3em;
4106
+ font-size: 75%;
4107
+ font-weight: bold;
4108
+ line-height: 1;
4109
+ color: #fff;
4110
+ text-align: center;
4111
+ white-space: nowrap;
4112
+ vertical-align: baseline;
4113
+ border-radius: .25em;
4114
+ }
4115
+ a.egg-container .label:hover,
4116
+ a.egg-container .label:focus {
4117
+ color: #fff;
4118
+ text-decoration: none;
4119
+ cursor: pointer;
4120
+ }
4121
+ .egg-container .label:empty {
4122
+ display: none;
4123
+ }
4124
+ .btn .egg-container .label {
4125
+ position: relative;
4126
+ top: -1px;
4127
+ }
4128
+ .egg-container .label-default {
4129
+ background-color: #777;
4130
+ }
4131
+ .egg-container .label-default[href]:hover,
4132
+ .egg-container .label-default[href]:focus {
4133
+ background-color: #5e5e5e;
4134
+ }
4135
+ .egg-container .label-primary {
4136
+ background-color: #337ab7;
4137
+ }
4138
+ .egg-container .label-primary[href]:hover,
4139
+ .egg-container .label-primary[href]:focus {
4140
+ background-color: #286090;
4141
+ }
4142
+ .egg-container .label-success {
4143
+ background-color: #5cb85c;
4144
+ }
4145
+ .egg-container .label-success[href]:hover,
4146
+ .egg-container .label-success[href]:focus {
4147
+ background-color: #449d44;
4148
+ }
4149
+ .egg-container .label-info {
4150
+ background-color: #5bc0de;
4151
+ }
4152
+ .egg-container .label-info[href]:hover,
4153
+ .egg-container .label-info[href]:focus {
4154
+ background-color: #31b0d5;
4155
+ }
4156
+ .egg-container .label-warning {
4157
+ background-color: #f0ad4e;
4158
+ }
4159
+ .egg-container .label-warning[href]:hover,
4160
+ .egg-container .label-warning[href]:focus {
4161
+ background-color: #ec971f;
4162
+ }
4163
+ .egg-container .label-danger {
4164
+ background-color: #d9534f;
4165
+ }
4166
+ .egg-container .label-danger[href]:hover,
4167
+ .egg-container .label-danger[href]:focus {
4168
+ background-color: #c9302c;
4169
+ }
4170
+ .egg-container .badge {
4171
+ display: inline-block;
4172
+ min-width: 10px;
4173
+ padding: 3px 7px;
4174
+ font-size: 12px;
4175
+ font-weight: bold;
4176
+ line-height: 1;
4177
+ color: #fff;
4178
+ text-align: center;
4179
+ white-space: nowrap;
4180
+ vertical-align: baseline;
4181
+ background-color: #777;
4182
+ border-radius: 10px;
4183
+ }
4184
+ .egg-container .badge:empty {
4185
+ display: none;
4186
+ }
4187
+ .btn .egg-container .badge {
4188
+ position: relative;
4189
+ top: -1px;
4190
+ }
4191
+ .btn-xs .egg-container .badge,
4192
+ .btn-group-xs > .btn .egg-container .badge {
4193
+ top: 0;
4194
+ padding: 1px 5px;
4195
+ }
4196
+ a.egg-container .badge:hover,
4197
+ a.egg-container .badge:focus {
4198
+ color: #fff;
4199
+ text-decoration: none;
4200
+ cursor: pointer;
4201
+ }
4202
+ .list-group-item.active > .egg-container .badge,
4203
+ .nav-pills > .active > a > .egg-container .badge {
4204
+ color: #337ab7;
4205
+ background-color: #fff;
4206
+ }
4207
+ .list-group-item > .egg-container .badge {
4208
+ float: right;
4209
+ }
4210
+ .list-group-item > .egg-container .badge + .egg-container .badge {
4211
+ margin-right: 5px;
4212
+ }
4213
+ .nav-pills > li > a > .egg-container .badge {
4214
+ margin-left: 3px;
4215
+ }
4216
+ .egg-container .thumbnail {
4217
+ display: block;
4218
+ padding: 4px;
4219
+ margin-bottom: 20px;
4220
+ line-height: 1.42857143;
4221
+ background-color: #fff;
4222
+ border: 1px solid #ddd;
4223
+ border-radius: 4px;
4224
+ -webkit-transition: border .2s ease-in-out;
4225
+ -o-transition: border .2s ease-in-out;
4226
+ transition: border .2s ease-in-out;
4227
+ }
4228
+ .egg-container .thumbnail > img,
4229
+ .egg-container .thumbnail a > img {
4230
+ margin-right: auto;
4231
+ margin-left: auto;
4232
+ }
4233
+
4234
+ .egg-container a.thumbnail:hover,
4235
+ .egg-container a.thumbnail:focus,
4236
+ .egg-container a.thumbnail.active {
4237
+ border-color: #337ab7;
4238
+ }
4239
+
4240
+ .egg-container .thumbnail .caption {
4241
+ padding: 9px;
4242
+ color: #333;
4243
+ }
4244
+ .egg-container .alert {
4245
+ padding: 15px;
4246
+ margin-bottom: 20px;
4247
+ border: 1px solid transparent;
4248
+ border-radius: 4px;
4249
+ }
4250
+ .egg-container .alert h4 {
4251
+ margin-top: 0;
4252
+ color: inherit;
4253
+ }
4254
+ .egg-container .alert .alert-link {
4255
+ font-weight: bold;
4256
+ }
4257
+ .egg-container .alert > p,
4258
+ .egg-container .alert > ul {
4259
+ margin-bottom: 0;
4260
+ }
4261
+ .egg-container .alert > p + p {
4262
+ margin-top: 5px;
4263
+ }
4264
+ .egg-container .alert-dismissable,
4265
+ .egg-container .alert-dismissible {
4266
+ padding-right: 35px;
4267
+ }
4268
+ .egg-container .alert-dismissable .close,
4269
+ .egg-container .alert-dismissible .close {
4270
+ position: relative;
4271
+ top: -2px;
4272
+ right: -21px;
4273
+ color: inherit;
4274
+ }
4275
+ .egg-container .alert-success {
4276
+ color: #3c763d;
4277
+ background-color: #dff0d8;
4278
+ border-color: #d6e9c6;
4279
+ }
4280
+ .egg-container .alert-success hr {
4281
+ border-top-color: #c9e2b3;
4282
+ }
4283
+ .egg-container .alert-success .alert-link {
4284
+ color: #2b542c;
4285
+ }
4286
+ .egg-container .alert-info {
4287
+ color: #31708f;
4288
+ background-color: #d9edf7;
4289
+ border-color: #bce8f1;
4290
+ }
4291
+ .egg-container .alert-info hr {
4292
+ border-top-color: #a6e1ec;
4293
+ }
4294
+ .egg-container .alert-info .alert-link {
4295
+ color: #245269;
4296
+ }
4297
+ .egg-container .alert-warning {
4298
+ color: #8a6d3b;
4299
+ background-color: #fcf8e3;
4300
+ border-color: #faebcc;
4301
+ }
4302
+ .egg-container .alert-warning hr {
4303
+ border-top-color: #f7e1b5;
4304
+ }
4305
+ .egg-container .alert-warning .alert-link {
4306
+ color: #66512c;
4307
+ }
4308
+ .egg-container .alert-danger {
4309
+ color: #a94442;
4310
+ background-color: #f2dede;
4311
+ border-color: #ebccd1;
4312
+ }
4313
+ .egg-container .alert-danger hr {
4314
+ border-top-color: #e4b9c0;
4315
+ }
4316
+ .egg-container .alert-danger .alert-link {
4317
+ color: #843534;
4318
+ }
4319
+ @-webkit-keyframes progress-bar-stripes {
4320
+ from {
4321
+ background-position: 40px 0;
4322
+ }
4323
+ to {
4324
+ background-position: 0 0;
4325
+ }
4326
+ }
4327
+ @-o-keyframes progress-bar-stripes {
4328
+ from {
4329
+ background-position: 40px 0;
4330
+ }
4331
+ to {
4332
+ background-position: 0 0;
4333
+ }
4334
+ }
4335
+ @keyframes progress-bar-stripes {
4336
+ from {
4337
+ background-position: 40px 0;
4338
+ }
4339
+ to {
4340
+ background-position: 0 0;
4341
+ }
4342
+ }
4343
+ .egg-container .progress {
4344
+ height: 20px;
4345
+ margin-bottom: 20px;
4346
+ overflow: hidden;
4347
+ background-color: #f5f5f5;
4348
+ border-radius: 4px;
4349
+ -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
4350
+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
4351
+ }
4352
+ .egg-container .progress-bar {
4353
+ float: left;
4354
+ width: 0;
4355
+ height: 100%;
4356
+ font-size: 12px;
4357
+ line-height: 20px;
4358
+ color: #fff;
4359
+ text-align: center;
4360
+ background-color: #337ab7;
4361
+ -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
4362
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
4363
+ -webkit-transition: width .6s ease;
4364
+ -o-transition: width .6s ease;
4365
+ transition: width .6s ease;
4366
+ }
4367
+ .egg-container .progress-striped .progress-bar,
4368
+ .egg-container .progress-bar-striped {
4369
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4370
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4371
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4372
+ -webkit-background-size: 40px 40px;
4373
+ background-size: 40px 40px;
4374
+ }
4375
+ .egg-container .progress.active .progress-bar,
4376
+ .egg-container .progress-bar.active {
4377
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
4378
+ -o-animation: progress-bar-stripes 2s linear infinite;
4379
+ animation: progress-bar-stripes 2s linear infinite;
4380
+ }
4381
+ .egg-container .progress-bar-success {
4382
+ background-color: #5cb85c;
4383
+ }
4384
+ .progress-striped .egg-container .progress-bar-success {
4385
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4386
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4387
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4388
+ }
4389
+ .egg-container .progress-bar-info {
4390
+ background-color: #5bc0de;
4391
+ }
4392
+ .progress-striped .egg-container .progress-bar-info {
4393
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4394
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4395
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4396
+ }
4397
+ .egg-container .progress-bar-warning {
4398
+ background-color: #f0ad4e;
4399
+ }
4400
+ .progress-striped .egg-container .progress-bar-warning {
4401
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4402
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4403
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4404
+ }
4405
+ .egg-container .progress-bar-danger {
4406
+ background-color: #d9534f;
4407
+ }
4408
+ .progress-striped .egg-container .progress-bar-danger {
4409
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4410
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4411
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
4412
+ }
4413
+ .egg-container .media {
4414
+ margin-top: 15px;
4415
+ }
4416
+ .egg-container .media:first-child {
4417
+ margin-top: 0;
4418
+ }
4419
+ .egg-container .media,
4420
+ .egg-container .media-body {
4421
+ overflow: hidden;
4422
+ zoom: 1;
4423
+ }
4424
+ .egg-container .media-body {
4425
+ width: 10000px;
4426
+ }
4427
+ .egg-container .media-object {
4428
+ display: block;
4429
+ }
4430
+ .egg-container .media-right,
4431
+ .egg-container .media > .pull-right {
4432
+ padding-left: 10px;
4433
+ }
4434
+ .egg-container .media-left,
4435
+ .egg-container .media > .pull-left {
4436
+ padding-right: 20px;
4437
+ }
4438
+ .egg-container .media-left,
4439
+ .egg-container .media-right,
4440
+ .egg-container .media-body {
4441
+ display: table-cell;
4442
+ vertical-align: top;
4443
+ }
4444
+ .egg-container .media-middle {
4445
+ vertical-align: middle;
4446
+ }
4447
+ .egg-container .media-bottom {
4448
+ vertical-align: bottom;
4449
+ }
4450
+ /*.egg-container .media-heading {
4451
+ margin-top: 0;
4452
+ margin-bottom: 10px;
4453
+ }*/
4454
+ .egg-container .media-list {
4455
+ padding-left: 0;
4456
+ list-style: none;
4457
+ }
4458
+ .egg-container .list-group {
4459
+ padding-left: 0;
4460
+ margin-bottom: 20px;
4461
+ }
4462
+ .egg-container .list-group-item {
4463
+ position: relative;
4464
+ display: block;
4465
+ padding: 10px 15px;
4466
+ margin-bottom: -1px;
4467
+ background-color: #fff;
4468
+ border: 1px solid #ddd;
4469
+ }
4470
+ .egg-container .list-group-item:first-child {
4471
+ border-top-left-radius: 4px;
4472
+ border-top-right-radius: 4px;
4473
+ }
4474
+ .egg-container .list-group-item:last-child {
4475
+ margin-bottom: 0;
4476
+ border-bottom-right-radius: 4px;
4477
+ border-bottom-left-radius: 4px;
4478
+ }
4479
+ .egg-container a.list-group-item {
4480
+ color: #555;
4481
+ }
4482
+ .egg-container a.list-group-item .list-group-item-heading {
4483
+ color: #333;
4484
+ }
4485
+ .egg-container a.list-group-item:hover,
4486
+ .egg-container a.list-group-item:focus {
4487
+ color: #555;
4488
+ text-decoration: none;
4489
+ background-color: #f5f5f5;
4490
+ }
4491
+ .egg-container .list-group-item.disabled,
4492
+ .egg-container .list-group-item.disabled:hover,
4493
+ .egg-container .list-group-item.disabled:focus {
4494
+ color: #777;
4495
+ cursor: not-allowed;
4496
+ background-color: #eee;
4497
+ }
4498
+ .egg-container .list-group-item.disabled .list-group-item-heading,
4499
+ .egg-container .list-group-item.disabled:hover .list-group-item-heading,
4500
+ .egg-container .list-group-item.disabled:focus .list-group-item-heading {
4501
+ color: inherit;
4502
+ }
4503
+ .egg-container .list-group-item.disabled .list-group-item-text,
4504
+ .egg-container .list-group-item.disabled:hover .list-group-item-text,
4505
+ .egg-container .list-group-item.disabled:focus .list-group-item-text {
4506
+ color: #777;
4507
+ }
4508
+ .egg-container .list-group-item.active,
4509
+ .egg-container .list-group-item.active:hover,
4510
+ .egg-container .list-group-item.active:focus {
4511
+ z-index: 2;
4512
+ color: #fff;
4513
+ background-color: #337ab7;
4514
+ border-color: #337ab7;
4515
+ }
4516
+ .egg-container .list-group-item.active .list-group-item-heading,
4517
+ .egg-container .list-group-item.active:hover .list-group-item-heading,
4518
+ .egg-container .list-group-item.active:focus .list-group-item-heading,
4519
+ .egg-container .list-group-item.active .list-group-item-heading > small,
4520
+ .egg-container .list-group-item.active:hover .list-group-item-heading > small,
4521
+ .egg-container .list-group-item.active:focus .list-group-item-heading > small,
4522
+ .egg-container .list-group-item.active .list-group-item-heading > .small,
4523
+ .egg-container .list-group-item.active:hover .list-group-item-heading > .small,
4524
+ .egg-container .list-group-item.active:focus .list-group-item-heading > .small {
4525
+ color: inherit;
4526
+ }
4527
+ .egg-container .list-group-item.active .list-group-item-text,
4528
+ .egg-container .list-group-item.active:hover .list-group-item-text,
4529
+ .egg-container .list-group-item.active:focus .list-group-item-text {
4530
+ color: #c7ddef;
4531
+ }
4532
+ .egg-container .list-group-item-success {
4533
+ color: #3c763d;
4534
+ background-color: #dff0d8;
4535
+ }
4536
+ a.egg-container .list-group-item-success {
4537
+ color: #3c763d;
4538
+ }
4539
+ a.egg-container .list-group-item-success .list-group-item-heading {
4540
+ color: inherit;
4541
+ }
4542
+ a.egg-container .list-group-item-success:hover,
4543
+ a.egg-container .list-group-item-success:focus {
4544
+ color: #3c763d;
4545
+ background-color: #d0e9c6;
4546
+ }
4547
+ a.egg-container .list-group-item-success.active,
4548
+ a.egg-container .list-group-item-success.active:hover,
4549
+ a.egg-container .list-group-item-success.active:focus {
4550
+ color: #fff;
4551
+ background-color: #3c763d;
4552
+ border-color: #3c763d;
4553
+ }
4554
+ .egg-container .list-group-item-info {
4555
+ color: #31708f;
4556
+ background-color: #d9edf7;
4557
+ }
4558
+ a.egg-container .list-group-item-info {
4559
+ color: #31708f;
4560
+ }
4561
+ a.egg-container .list-group-item-info .list-group-item-heading {
4562
+ color: inherit;
4563
+ }
4564
+ a.egg-container .list-group-item-info:hover,
4565
+ a.egg-container .list-group-item-info:focus {
4566
+ color: #31708f;
4567
+ background-color: #c4e3f3;
4568
+ }
4569
+ a.egg-container .list-group-item-info.active,
4570
+ a.egg-container .list-group-item-info.active:hover,
4571
+ a.egg-container .list-group-item-info.active:focus {
4572
+ color: #fff;
4573
+ background-color: #31708f;
4574
+ border-color: #31708f;
4575
+ }
4576
+ .egg-container .list-group-item-warning {
4577
+ color: #8a6d3b;
4578
+ background-color: #fcf8e3;
4579
+ }
4580
+ a.egg-container .list-group-item-warning {
4581
+ color: #8a6d3b;
4582
+ }
4583
+ a.egg-container .list-group-item-warning .list-group-item-heading {
4584
+ color: inherit;
4585
+ }
4586
+ a.egg-container .list-group-item-warning:hover,
4587
+ a.egg-container .list-group-item-warning:focus {
4588
+ color: #8a6d3b;
4589
+ background-color: #faf2cc;
4590
+ }
4591
+ a.egg-container .list-group-item-warning.active,
4592
+ a.egg-container .list-group-item-warning.active:hover,
4593
+ a.egg-container .list-group-item-warning.active:focus {
4594
+ color: #fff;
4595
+ background-color: #8a6d3b;
4596
+ border-color: #8a6d3b;
4597
+ }
4598
+ .egg-container .list-group-item-danger {
4599
+ color: #a94442;
4600
+ background-color: #f2dede;
4601
+ }
4602
+ a.egg-container .list-group-item-danger {
4603
+ color: #a94442;
4604
+ }
4605
+ a.egg-container .list-group-item-danger .list-group-item-heading {
4606
+ color: inherit;
4607
+ }
4608
+ a.egg-container .list-group-item-danger:hover,
4609
+ a.egg-container .list-group-item-danger:focus {
4610
+ color: #a94442;
4611
+ background-color: #ebcccc;
4612
+ }
4613
+ a.egg-container .list-group-item-danger.active,
4614
+ a.egg-container .list-group-item-danger.active:hover,
4615
+ a.egg-container .list-group-item-danger.active:focus {
4616
+ color: #fff;
4617
+ background-color: #a94442;
4618
+ border-color: #a94442;
4619
+ }
4620
+ .egg-container .list-group-item-heading {
4621
+ margin-top: 0;
4622
+ margin-bottom: 5px;
4623
+ }
4624
+ .egg-container .list-group-item-text {
4625
+ margin-bottom: 0;
4626
+ line-height: 1.3;
4627
+ }
4628
+ .egg-container .panel {
4629
+ margin-bottom: 20px;
4630
+ background-color: #fff;
4631
+ border: 1px solid transparent;
4632
+ border-radius: 4px;
4633
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
4634
+ box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
4635
+ }
4636
+ .egg-container .panel-body {
4637
+ padding: 15px;
4638
+ }
4639
+ .egg-container .panel-heading {
4640
+ padding: 10px 15px;
4641
+ border-bottom: 1px solid transparent;
4642
+ border-top-left-radius: 3px;
4643
+ border-top-right-radius: 3px;
4644
+ }
4645
+ .egg-container .panel-heading > .dropdown .dropdown-toggle {
4646
+ color: inherit;
4647
+ }
4648
+ .egg-container .panel-title {
4649
+ margin-top: 0;
4650
+ margin-bottom: 0;
4651
+ font-size: 16px;
4652
+ color: inherit;
4653
+ }
4654
+ .egg-container .panel-title > a,
4655
+ .egg-container .panel-title > small,
4656
+ .egg-container .panel-title > .small,
4657
+ .egg-container .panel-title > small > a,
4658
+ .egg-container .panel-title > .small > a {
4659
+ color: inherit;
4660
+ }
4661
+ .egg-container .panel-footer {
4662
+ padding: 10px 15px;
4663
+ background-color: #f5f5f5;
4664
+ border-top: 1px solid #ddd;
4665
+ border-bottom-right-radius: 3px;
4666
+ border-bottom-left-radius: 3px;
4667
+ }
4668
+ .egg-container .panel > .list-group,
4669
+ .egg-container .panel > .panel-collapse > .list-group {
4670
+ margin-bottom: 0;
4671
+ }
4672
+ .egg-container .panel > .list-group .list-group-item,
4673
+ .egg-container .panel > .panel-collapse > .list-group .list-group-item {
4674
+ border-width: 1px 0;
4675
+ border-radius: 0;
4676
+ }
4677
+ .egg-container .panel > .list-group:first-child .list-group-item:first-child,
4678
+ .egg-container .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
4679
+ border-top: 0;
4680
+ border-top-left-radius: 3px;
4681
+ border-top-right-radius: 3px;
4682
+ }
4683
+ .egg-container .panel > .list-group:last-child .list-group-item:last-child,
4684
+ .egg-container .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
4685
+ border-bottom: 0;
4686
+ border-bottom-right-radius: 3px;
4687
+ border-bottom-left-radius: 3px;
4688
+ }
4689
+ .egg-container .panel-heading + .list-group .list-group-item:first-child {
4690
+ border-top-width: 0;
4691
+ }
4692
+ .egg-container .list-group + .panel-footer {
4693
+ border-top-width: 0;
4694
+ }
4695
+ .egg-container .panel > .table,
4696
+ .egg-container .panel > .table-responsive > .table,
4697
+ .egg-container .panel > .panel-collapse > .table {
4698
+ margin-bottom: 0;
4699
+ }
4700
+ .egg-container .panel > .table caption,
4701
+ .egg-container .panel > .table-responsive > .table caption,
4702
+ .egg-container .panel > .panel-collapse > .table caption {
4703
+ padding-right: 15px;
4704
+ padding-left: 15px;
4705
+ }
4706
+ .egg-container .panel > .table:first-child,
4707
+ .egg-container .panel > .table-responsive:first-child > .table:first-child {
4708
+ border-top-left-radius: 3px;
4709
+ border-top-right-radius: 3px;
4710
+ }
4711
+ .egg-container .panel > .table:first-child > thead:first-child > tr:first-child,
4712
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
4713
+ .egg-container .panel > .table:first-child > tbody:first-child > tr:first-child,
4714
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
4715
+ border-top-left-radius: 3px;
4716
+ border-top-right-radius: 3px;
4717
+ }
4718
+ .egg-container .panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
4719
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
4720
+ .egg-container .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
4721
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
4722
+ .egg-container .panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
4723
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
4724
+ .egg-container .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
4725
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
4726
+ border-top-left-radius: 3px;
4727
+ }
4728
+ .egg-container .panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
4729
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
4730
+ .egg-container .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
4731
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
4732
+ .egg-container .panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
4733
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
4734
+ .egg-container .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
4735
+ .egg-container .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
4736
+ border-top-right-radius: 3px;
4737
+ }
4738
+ .egg-container .panel > .table:last-child,
4739
+ .egg-container .panel > .table-responsive:last-child > .table:last-child {
4740
+ border-bottom-right-radius: 3px;
4741
+ border-bottom-left-radius: 3px;
4742
+ }
4743
+ .egg-container .panel > .table:last-child > tbody:last-child > tr:last-child,
4744
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
4745
+ .egg-container .panel > .table:last-child > tfoot:last-child > tr:last-child,
4746
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
4747
+ border-bottom-right-radius: 3px;
4748
+ border-bottom-left-radius: 3px;
4749
+ }
4750
+ .egg-container .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
4751
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
4752
+ .egg-container .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
4753
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
4754
+ .egg-container .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
4755
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
4756
+ .egg-container .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
4757
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
4758
+ border-bottom-left-radius: 3px;
4759
+ }
4760
+ .egg-container .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
4761
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
4762
+ .egg-container .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
4763
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
4764
+ .egg-container .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
4765
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
4766
+ .egg-container .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
4767
+ .egg-container .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
4768
+ border-bottom-right-radius: 3px;
4769
+ }
4770
+ .egg-container .panel > .panel-body + .table,
4771
+ .egg-container .panel > .panel-body + .table-responsive,
4772
+ .egg-container .panel > .table + .panel-body,
4773
+ .egg-container .panel > .table-responsive + .panel-body {
4774
+ border-top: 1px solid #ddd;
4775
+ }
4776
+ .egg-container .panel > .table > tbody:first-child > tr:first-child th,
4777
+ .egg-container .panel > .table > tbody:first-child > tr:first-child td {
4778
+ border-top: 0;
4779
+ }
4780
+ .egg-container .panel > .table-bordered,
4781
+ .egg-container .panel > .table-responsive > .table-bordered {
4782
+ border: 0;
4783
+ }
4784
+ .egg-container .panel > .table-bordered > thead > tr > th:first-child,
4785
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
4786
+ .egg-container .panel > .table-bordered > tbody > tr > th:first-child,
4787
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
4788
+ .egg-container .panel > .table-bordered > tfoot > tr > th:first-child,
4789
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
4790
+ .egg-container .panel > .table-bordered > thead > tr > td:first-child,
4791
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
4792
+ .egg-container .panel > .table-bordered > tbody > tr > td:first-child,
4793
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
4794
+ .egg-container .panel > .table-bordered > tfoot > tr > td:first-child,
4795
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
4796
+ border-left: 0;
4797
+ }
4798
+ .egg-container .panel > .table-bordered > thead > tr > th:last-child,
4799
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
4800
+ .egg-container .panel > .table-bordered > tbody > tr > th:last-child,
4801
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
4802
+ .egg-container .panel > .table-bordered > tfoot > tr > th:last-child,
4803
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
4804
+ .egg-container .panel > .table-bordered > thead > tr > td:last-child,
4805
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
4806
+ .egg-container .panel > .table-bordered > tbody > tr > td:last-child,
4807
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
4808
+ .egg-container .panel > .table-bordered > tfoot > tr > td:last-child,
4809
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
4810
+ border-right: 0;
4811
+ }
4812
+ .egg-container .panel > .table-bordered > thead > tr:first-child > td,
4813
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
4814
+ .egg-container .panel > .table-bordered > tbody > tr:first-child > td,
4815
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
4816
+ .egg-container .panel > .table-bordered > thead > tr:first-child > th,
4817
+ .egg-container .panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
4818
+ .egg-container .panel > .table-bordered > tbody > tr:first-child > th,
4819
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
4820
+ border-bottom: 0;
4821
+ }
4822
+ .egg-container .panel > .table-bordered > tbody > tr:last-child > td,
4823
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
4824
+ .egg-container .panel > .table-bordered > tfoot > tr:last-child > td,
4825
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
4826
+ .egg-container .panel > .table-bordered > tbody > tr:last-child > th,
4827
+ .egg-container .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
4828
+ .egg-container .panel > .table-bordered > tfoot > tr:last-child > th,
4829
+ .egg-container .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
4830
+ border-bottom: 0;
4831
+ }
4832
+ .egg-container .panel > .table-responsive {
4833
+ margin-bottom: 0;
4834
+ border: 0;
4835
+ }
4836
+ .egg-container .panel-group {
4837
+ margin-bottom: 20px;
4838
+ }
4839
+ .egg-container .panel-group .panel {
4840
+ margin-bottom: 0;
4841
+ border-radius: 4px;
4842
+ }
4843
+ .egg-container .panel-group .panel + .panel {
4844
+ margin-top: 5px;
4845
+ }
4846
+ .egg-container .panel-group .panel-heading {
4847
+ border-bottom: 0;
4848
+ }
4849
+ .egg-container .panel-group .panel-heading + .panel-collapse > .panel-body,
4850
+ .egg-container .panel-group .panel-heading + .panel-collapse > .list-group {
4851
+ border-top: 1px solid #ddd;
4852
+ }
4853
+ .egg-container .panel-group .panel-footer {
4854
+ border-top: 0;
4855
+ }
4856
+ .egg-container .panel-group .panel-footer + .panel-collapse .panel-body {
4857
+ border-bottom: 1px solid #ddd;
4858
+ }
4859
+ .egg-container .panel-default {
4860
+ border-color: #ddd;
4861
+ }
4862
+ .egg-container .panel-default > .panel-heading {
4863
+ color: #333;
4864
+ background-color: #f5f5f5;
4865
+ border-color: #ddd;
4866
+ }
4867
+ .egg-container .panel-default > .panel-heading + .panel-collapse > .panel-body {
4868
+ border-top-color: #ddd;
4869
+ }
4870
+ .egg-container .panel-default > .panel-heading .badge {
4871
+ color: #f5f5f5;
4872
+ background-color: #333;
4873
+ }
4874
+ .egg-container .panel-default > .panel-footer + .panel-collapse > .panel-body {
4875
+ border-bottom-color: #ddd;
4876
+ }
4877
+ .egg-container .panel-primary {
4878
+ border-color: #337ab7;
4879
+ }
4880
+ .egg-container .panel-primary > .panel-heading {
4881
+ color: #fff;
4882
+ background-color: #337ab7;
4883
+ border-color: #337ab7;
4884
+ }
4885
+ .egg-container .panel-primary > .panel-heading + .panel-collapse > .panel-body {
4886
+ border-top-color: #337ab7;
4887
+ }
4888
+ .egg-container .panel-primary > .panel-heading .badge {
4889
+ color: #337ab7;
4890
+ background-color: #fff;
4891
+ }
4892
+ .egg-container .panel-primary > .panel-footer + .panel-collapse > .panel-body {
4893
+ border-bottom-color: #337ab7;
4894
+ }
4895
+ .egg-container .panel-success {
4896
+ border-color: #d6e9c6;
4897
+ }
4898
+ .egg-container .panel-success > .panel-heading {
4899
+ color: #3c763d;
4900
+ background-color: #dff0d8;
4901
+ border-color: #d6e9c6;
4902
+ }
4903
+ .egg-container .panel-success > .panel-heading + .panel-collapse > .panel-body {
4904
+ border-top-color: #d6e9c6;
4905
+ }
4906
+ .egg-container .panel-success > .panel-heading .badge {
4907
+ color: #dff0d8;
4908
+ background-color: #3c763d;
4909
+ }
4910
+ .egg-container .panel-success > .panel-footer + .panel-collapse > .panel-body {
4911
+ border-bottom-color: #d6e9c6;
4912
+ }
4913
+ .egg-container .panel-info {
4914
+ border-color: #bce8f1;
4915
+ }
4916
+ .egg-container .panel-info > .panel-heading {
4917
+ color: #31708f;
4918
+ background-color: #d9edf7;
4919
+ border-color: #bce8f1;
4920
+ }
4921
+ .egg-container .panel-info > .panel-heading + .panel-collapse > .panel-body {
4922
+ border-top-color: #bce8f1;
4923
+ }
4924
+ .egg-container .panel-info > .panel-heading .badge {
4925
+ color: #d9edf7;
4926
+ background-color: #31708f;
4927
+ }
4928
+ .egg-container .panel-info > .panel-footer + .panel-collapse > .panel-body {
4929
+ border-bottom-color: #bce8f1;
4930
+ }
4931
+ .egg-container .panel-warning {
4932
+ border-color: #faebcc;
4933
+ }
4934
+ .egg-container .panel-warning > .panel-heading {
4935
+ color: #8a6d3b;
4936
+ background-color: #fcf8e3;
4937
+ border-color: #faebcc;
4938
+ }
4939
+ .egg-container .panel-warning > .panel-heading + .panel-collapse > .panel-body {
4940
+ border-top-color: #faebcc;
4941
+ }
4942
+ .egg-container .panel-warning > .panel-heading .badge {
4943
+ color: #fcf8e3;
4944
+ background-color: #8a6d3b;
4945
+ }
4946
+ .egg-container .panel-warning > .panel-footer + .panel-collapse > .panel-body {
4947
+ border-bottom-color: #faebcc;
4948
+ }
4949
+ .egg-container .panel-danger {
4950
+ border-color: #ebccd1;
4951
+ }
4952
+ .egg-container .panel-danger > .panel-heading {
4953
+ color: #a94442;
4954
+ background-color: #f2dede;
4955
+ border-color: #ebccd1;
4956
+ }
4957
+ .egg-container .panel-danger > .panel-heading + .panel-collapse > .panel-body {
4958
+ border-top-color: #ebccd1;
4959
+ }
4960
+ .egg-container .panel-danger > .panel-heading .badge {
4961
+ color: #f2dede;
4962
+ background-color: #a94442;
4963
+ }
4964
+ .egg-container .panel-danger > .panel-footer + .panel-collapse > .panel-body {
4965
+ border-bottom-color: #ebccd1;
4966
+ }
4967
+ .egg-container .embed-responsive {
4968
+ position: relative;
4969
+ display: block;
4970
+ height: 0;
4971
+ padding: 0;
4972
+ overflow: hidden;
4973
+ }
4974
+ .egg-container .embed-responsive .embed-responsive-item,
4975
+ .egg-container .embed-responsive iframe,
4976
+ .egg-container .embed-responsive embed,
4977
+ .egg-container .embed-responsive object,
4978
+ .egg-container .embed-responsive video {
4979
+ position: absolute;
4980
+ top: 0;
4981
+ bottom: 0;
4982
+ left: 0;
4983
+ width: 100%;
4984
+ height: 100%;
4985
+ border: 0;
4986
+ }
4987
+ .egg-container .embed-responsive-16by9 {
4988
+ padding-bottom: 56.25%;
4989
+ }
4990
+ .egg-container .embed-responsive-4by3 {
4991
+ padding-bottom: 75%;
4992
+ }
4993
+ .egg-container .well {
4994
+ min-height: 20px;
4995
+ padding: 19px;
4996
+ margin-bottom: 20px;
4997
+ background-color: #f5f5f5;
4998
+ border: 1px solid #e3e3e3;
4999
+ border-radius: 4px;
5000
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
5001
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
5002
+ }
5003
+ .egg-container .well blockquote {
5004
+ border-color: #ddd;
5005
+ border-color: rgba(0, 0, 0, .15);
5006
+ }
5007
+ .egg-container .well-lg {
5008
+ padding: 24px;
5009
+ border-radius: 6px;
5010
+ }
5011
+ .egg-container .well-sm {
5012
+ padding: 9px;
5013
+ border-radius: 3px;
5014
+ }
5015
+ .egg-container .close {
5016
+ float: right;
5017
+ font-size: 21px;
5018
+ font-weight: bold;
5019
+ line-height: 1;
5020
+ color: #000;
5021
+ text-shadow: 0 1px 0 #fff;
5022
+ filter: alpha(opacity=20);
5023
+ opacity: .2;
5024
+ }
5025
+ .egg-container .close:hover,
5026
+ .egg-container .close:focus {
5027
+ color: #000;
5028
+ text-decoration: none;
5029
+ cursor: pointer;
5030
+ filter: alpha(opacity=50);
5031
+ opacity: .5;
5032
+ }
5033
+ button.egg-container .close {
5034
+ -webkit-appearance: none;
5035
+ padding: 0;
5036
+ cursor: pointer;
5037
+ background: transparent;
5038
+ border: 0;
5039
+ }
5040
+ .egg-container .clearfix:before,
5041
+ .egg-container .clearfix:after,
5042
+ .egg-container .dl-horizontal dd:before,
5043
+ .egg-container .dl-horizontal dd:after,
5044
+ .egg-container .container:before,
5045
+ .egg-container .container:after,
5046
+ .egg-container .container-fluid:before,
5047
+ .egg-container .container-fluid:after,
5048
+ .egg-container .row:before,
5049
+ .egg-container .row:after,
5050
+ .egg-container .form-horizontal .form-group:before,
5051
+ .egg-container .form-horizontal .form-group:after,
5052
+ .egg-container .btn-toolbar:before,
5053
+ .egg-container .btn-toolbar:after,
5054
+ .egg-container .btn-group-vertical > .btn-group:before,
5055
+ .egg-container .btn-group-vertical > .btn-group:after,
5056
+ .egg-container .nav:before,
5057
+ .egg-container .nav:after,
5058
+ .egg-container .panel-body:before,
5059
+ .egg-container .panel-body:after {
5060
+ display: table;
5061
+ content: " ";
5062
+ }
5063
+ .egg-container .clearfix:after,
5064
+ .egg-container .dl-horizontal dd:after,
5065
+ .egg-container .container:after,
5066
+ .egg-container .container-fluid:after,
5067
+ .egg-container .row:after,
5068
+ .egg-container .form-horizontal .form-group:after,
5069
+ .egg-container .btn-toolbar:after,
5070
+ .egg-container .btn-group-vertical > .btn-group:after,
5071
+ .egg-container .nav:after,
5072
+ .egg-container .panel-body:after {
5073
+ clear: both;
5074
+ }
5075
+ .egg-container .center-block {
5076
+ display: block;
5077
+ margin-right: auto;
5078
+ margin-left: auto;
5079
+ }
5080
+ .egg-container .pull-right {
5081
+ float: right !important;
5082
+ }
5083
+ .egg-container .pull-left {
5084
+ float: left !important;
5085
+ }
5086
+ .egg-container .hide {
5087
+ display: none !important;
5088
+ }
5089
+ .egg-container .show {
5090
+ display: block !important;
5091
+ }
5092
+ .egg-container .invisible {
5093
+ visibility: hidden;
5094
+ }
5095
+ .egg-container .text-hide {
5096
+ font: 0/0 a;
5097
+ color: transparent;
5098
+ text-shadow: none;
5099
+ background-color: transparent;
5100
+ border: 0;
5101
+ }
5102
+ .egg-container .hidden {
5103
+ display: none !important;
5104
+ }
5105
+ .egg-container .affix {
5106
+ position: fixed;
5107
+ }
5108
+ @-ms-viewport {
5109
+ width: device-width;
5110
+ }
5111
+ .egg-container .visible-xs,
5112
+ .egg-container .visible-sm,
5113
+ .egg-container .visible-md,
5114
+ .egg-container .visible-lg {
5115
+ display: none !important;
5116
+ }
5117
+ .egg-container .visible-xs-block,
5118
+ .egg-container .visible-xs-inline,
5119
+ .egg-container .visible-xs-inline-block,
5120
+ .egg-container .visible-sm-block,
5121
+ .egg-container .visible-sm-inline,
5122
+ .egg-container .visible-sm-inline-block,
5123
+ .egg-container .visible-md-block,
5124
+ .egg-container .visible-md-inline,
5125
+ .egg-container .visible-md-inline-block,
5126
+ .egg-container .visible-lg-block,
5127
+ .egg-container .visible-lg-inline,
5128
+ .egg-container .visible-lg-inline-block {
5129
+ display: none !important;
5130
+ }
5131
+ @media (max-width: 767px) {
5132
+ .egg-container .visible-xs {
5133
+ display: block !important;
5134
+ }
5135
+ table.egg-container .visible-xs {
5136
+ display: table;
5137
+ }
5138
+ tr.egg-container .visible-xs {
5139
+ display: table-row !important;
5140
+ }
5141
+ th.egg-container .visible-xs,
5142
+ td.egg-container .visible-xs {
5143
+ display: table-cell !important;
5144
+ }
5145
+ }
5146
+ @media (max-width: 767px) {
5147
+ .egg-container .visible-xs-block {
5148
+ display: block !important;
5149
+ }
5150
+ }
5151
+ @media (max-width: 767px) {
5152
+ .egg-container .visible-xs-inline {
5153
+ display: inline !important;
5154
+ }
5155
+ }
5156
+ @media (max-width: 767px) {
5157
+ .egg-container .visible-xs-inline-block {
5158
+ display: inline-block !important;
5159
+ }
5160
+ }
5161
+ @media (min-width: 768px) and (max-width: 991px) {
5162
+ .egg-container .visible-sm {
5163
+ display: block !important;
5164
+ }
5165
+ table.egg-container .visible-sm {
5166
+ display: table;
5167
+ }
5168
+ tr.egg-container .visible-sm {
5169
+ display: table-row !important;
5170
+ }
5171
+ th.egg-container .visible-sm,
5172
+ td.egg-container .visible-sm {
5173
+ display: table-cell !important;
5174
+ }
5175
+ }
5176
+ @media (min-width: 768px) and (max-width: 991px) {
5177
+ .egg-container .visible-sm-block {
5178
+ display: block !important;
5179
+ }
5180
+ }
5181
+ @media (min-width: 768px) and (max-width: 991px) {
5182
+ .egg-container .visible-sm-inline {
5183
+ display: inline !important;
5184
+ }
5185
+ }
5186
+ @media (min-width: 768px) and (max-width: 991px) {
5187
+ .egg-container .visible-sm-inline-block {
5188
+ display: inline-block !important;
5189
+ }
5190
+ }
5191
+ @media (min-width: 992px) and (max-width: 1199px) {
5192
+ .egg-container .visible-md {
5193
+ display: block !important;
5194
+ }
5195
+ table.egg-container .visible-md {
5196
+ display: table;
5197
+ }
5198
+ tr.egg-container .visible-md {
5199
+ display: table-row !important;
5200
+ }
5201
+ th.egg-container .visible-md,
5202
+ td.egg-container .visible-md {
5203
+ display: table-cell !important;
5204
+ }
5205
+ }
5206
+ @media (min-width: 992px) and (max-width: 1199px) {
5207
+ .egg-container .visible-md-block {
5208
+ display: block !important;
5209
+ }
5210
+ }
5211
+ @media (min-width: 992px) and (max-width: 1199px) {
5212
+ .egg-container .visible-md-inline {
5213
+ display: inline !important;
5214
+ }
5215
+ }
5216
+ @media (min-width: 992px) and (max-width: 1199px) {
5217
+ .egg-container .visible-md-inline-block {
5218
+ display: inline-block !important;
5219
+ }
5220
+ }
5221
+ @media (min-width: 1200px) {
5222
+ .egg-container .visible-lg {
5223
+ display: block !important;
5224
+ }
5225
+ table.egg-container .visible-lg {
5226
+ display: table;
5227
+ }
5228
+ tr.egg-container .visible-lg {
5229
+ display: table-row !important;
5230
+ }
5231
+ th.egg-container .visible-lg,
5232
+ td.egg-container .visible-lg {
5233
+ display: table-cell !important;
5234
+ }
5235
+ }
5236
+ @media (min-width: 1200px) {
5237
+ .egg-container .visible-lg-block {
5238
+ display: block !important;
5239
+ }
5240
+ }
5241
+ @media (min-width: 1200px) {
5242
+ .egg-container .visible-lg-inline {
5243
+ display: inline !important;
5244
+ }
5245
+ }
5246
+ @media (min-width: 1200px) {
5247
+ .egg-container .visible-lg-inline-block {
5248
+ display: inline-block !important;
5249
+ }
5250
+ }
5251
+ @media (max-width: 767px) {
5252
+ .egg-container .hidden-xs {
5253
+ display: none !important;
5254
+ }
5255
+ }
5256
+ @media (min-width: 768px) and (max-width: 991px) {
5257
+ .egg-container .hidden-sm {
5258
+ display: none !important;
5259
+ }
5260
+ }
5261
+ @media (min-width: 992px) and (max-width: 1199px) {
5262
+ .egg-container .hidden-md {
5263
+ display: none !important;
5264
+ }
5265
+ }
5266
+ @media (min-width: 1200px) {
5267
+ .egg-container .hidden-lg {
5268
+ display: none !important;
5269
+ }
5270
+ }
5271
+ .egg-container .visible-print {
5272
+ display: none !important;
5273
+ }
5274
+ @media print {
5275
+ .egg-container .visible-print {
5276
+ display: block !important;
5277
+ }
5278
+ table.egg-container .visible-print {
5279
+ display: table;
5280
+ }
5281
+ tr.egg-container .visible-print {
5282
+ display: table-row !important;
5283
+ }
5284
+ th.egg-container .visible-print,
5285
+ td.egg-container .visible-print {
5286
+ display: table-cell !important;
5287
+ }
5288
+ }
5289
+ .egg-container .visible-print-block {
5290
+ display: none !important;
5291
+ }
5292
+ @media print {
5293
+ .egg-container .visible-print-block {
5294
+ display: block !important;
5295
+ }
5296
+ }
5297
+ .egg-container .visible-print-inline {
5298
+ display: none !important;
5299
+ }
5300
+ @media print {
5301
+ .egg-container .visible-print-inline {
5302
+ display: inline !important;
5303
+ }
5304
+ }
5305
+ .egg-container .visible-print-inline-block {
5306
+ display: none !important;
5307
+ }
5308
+ @media print {
5309
+ .egg-container .visible-print-inline-block {
5310
+ display: inline-block !important;
5311
+ }
5312
+ }
5313
+ @media print {
5314
+ .egg-container .hidden-print {
5315
+ display: none !important;
5316
+ }
5317
+ }
5318
+ /*# sourceMappingURL=bootstrap.css.map */
5319
+ .egg-container .products .col-md-5{ text-align: center;}
res/bootstrap/js/bootstrap.js ADDED
@@ -0,0 +1,2317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+
7
+ if (typeof jQuery === 'undefined') {
8
+ throw new Error('Bootstrap\'s JavaScript requires jQuery')
9
+ }
10
+
11
+ +function ($) {
12
+ 'use strict';
13
+ var version = $.fn.jquery.split(' ')[0].split('.')
14
+ if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) {
15
+ throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher')
16
+ }
17
+ }(jQuery);
18
+
19
+ /* ========================================================================
20
+ * Bootstrap: transition.js v3.3.4
21
+ * http://getbootstrap.com/javascript/#transitions
22
+ * ========================================================================
23
+ * Copyright 2011-2015 Twitter, Inc.
24
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
25
+ * ======================================================================== */
26
+
27
+
28
+ +function ($) {
29
+ 'use strict';
30
+
31
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
32
+ // ============================================================
33
+
34
+ function transitionEnd() {
35
+ var el = document.createElement('bootstrap')
36
+
37
+ var transEndEventNames = {
38
+ WebkitTransition : 'webkitTransitionEnd',
39
+ MozTransition : 'transitionend',
40
+ OTransition : 'oTransitionEnd otransitionend',
41
+ transition : 'transitionend'
42
+ }
43
+
44
+ for (var name in transEndEventNames) {
45
+ if (el.style[name] !== undefined) {
46
+ return { end: transEndEventNames[name] }
47
+ }
48
+ }
49
+
50
+ return false // explicit for ie8 ( ._.)
51
+ }
52
+
53
+ // http://blog.alexmaccaw.com/css-transitions
54
+ $.fn.emulateTransitionEnd = function (duration) {
55
+ var called = false
56
+ var $el = this
57
+ $(this).one('bsTransitionEnd', function () { called = true })
58
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
59
+ setTimeout(callback, duration)
60
+ return this
61
+ }
62
+
63
+ $(function () {
64
+ $.support.transition = transitionEnd()
65
+
66
+ if (!$.support.transition) return
67
+
68
+ $.event.special.bsTransitionEnd = {
69
+ bindType: $.support.transition.end,
70
+ delegateType: $.support.transition.end,
71
+ handle: function (e) {
72
+ if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
73
+ }
74
+ }
75
+ })
76
+
77
+ }(jQuery);
78
+
79
+ /* ========================================================================
80
+ * Bootstrap: alert.js v3.3.4
81
+ * http://getbootstrap.com/javascript/#alerts
82
+ * ========================================================================
83
+ * Copyright 2011-2015 Twitter, Inc.
84
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
85
+ * ======================================================================== */
86
+
87
+
88
+ +function ($) {
89
+ 'use strict';
90
+
91
+ // ALERT CLASS DEFINITION
92
+ // ======================
93
+
94
+ var dismiss = '[data-dismiss="alert"]'
95
+ var Alert = function (el) {
96
+ $(el).on('click', dismiss, this.close)
97
+ }
98
+
99
+ Alert.VERSION = '3.3.4'
100
+
101
+ Alert.TRANSITION_DURATION = 150
102
+
103
+ Alert.prototype.close = function (e) {
104
+ var $this = $(this)
105
+ var selector = $this.attr('data-target')
106
+
107
+ if (!selector) {
108
+ selector = $this.attr('href')
109
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
110
+ }
111
+
112
+ var $parent = $(selector)
113
+
114
+ if (e) e.preventDefault()
115
+
116
+ if (!$parent.length) {
117
+ $parent = $this.closest('.alert')
118
+ }
119
+
120
+ $parent.trigger(e = $.Event('close.bs.alert'))
121
+
122
+ if (e.isDefaultPrevented()) return
123
+
124
+ $parent.removeClass('in')
125
+
126
+ function removeElement() {
127
+ // detach from parent, fire event then clean up data
128
+ $parent.detach().trigger('closed.bs.alert').remove()
129
+ }
130
+
131
+ $.support.transition && $parent.hasClass('fade') ?
132
+ $parent
133
+ .one('bsTransitionEnd', removeElement)
134
+ .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
135
+ removeElement()
136
+ }
137
+
138
+
139
+ // ALERT PLUGIN DEFINITION
140
+ // =======================
141
+
142
+ function Plugin(option) {
143
+ return this.each(function () {
144
+ var $this = $(this)
145
+ var data = $this.data('bs.alert')
146
+
147
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
148
+ if (typeof option == 'string') data[option].call($this)
149
+ })
150
+ }
151
+
152
+ var old = $.fn.alert
153
+
154
+ $.fn.alert = Plugin
155
+ $.fn.alert.Constructor = Alert
156
+
157
+
158
+ // ALERT NO CONFLICT
159
+ // =================
160
+
161
+ $.fn.alert.noConflict = function () {
162
+ $.fn.alert = old
163
+ return this
164
+ }
165
+
166
+
167
+ // ALERT DATA-API
168
+ // ==============
169
+
170
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
171
+
172
+ }(jQuery);
173
+
174
+ /* ========================================================================
175
+ * Bootstrap: button.js v3.3.4
176
+ * http://getbootstrap.com/javascript/#buttons
177
+ * ========================================================================
178
+ * Copyright 2011-2015 Twitter, Inc.
179
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
180
+ * ======================================================================== */
181
+
182
+
183
+ +function ($) {
184
+ 'use strict';
185
+
186
+ // BUTTON PUBLIC CLASS DEFINITION
187
+ // ==============================
188
+
189
+ var Button = function (element, options) {
190
+ this.$element = $(element)
191
+ this.options = $.extend({}, Button.DEFAULTS, options)
192
+ this.isLoading = false
193
+ }
194
+
195
+ Button.VERSION = '3.3.4'
196
+
197
+ Button.DEFAULTS = {
198
+ loadingText: 'loading...'
199
+ }
200
+
201
+ Button.prototype.setState = function (state) {
202
+ var d = 'disabled'
203
+ var $el = this.$element
204
+ var val = $el.is('input') ? 'val' : 'html'
205
+ var data = $el.data()
206
+
207
+ state = state + 'Text'
208
+
209
+ if (data.resetText == null) $el.data('resetText', $el[val]())
210
+
211
+ // push to event loop to allow forms to submit
212
+ setTimeout($.proxy(function () {
213
+ $el[val](data[state] == null ? this.options[state] : data[state])
214
+
215
+ if (state == 'loadingText') {
216
+ this.isLoading = true
217
+ $el.addClass(d).attr(d, d)
218
+ } else if (this.isLoading) {
219
+ this.isLoading = false
220
+ $el.removeClass(d).removeAttr(d)
221
+ }
222
+ }, this), 0)
223
+ }
224
+
225
+ Button.prototype.toggle = function () {
226
+ var changed = true
227
+ var $parent = this.$element.closest('[data-toggle="buttons"]')
228
+
229
+ if ($parent.length) {
230
+ var $input = this.$element.find('input')
231
+ if ($input.prop('type') == 'radio') {
232
+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
233
+ else $parent.find('.active').removeClass('active')
234
+ }
235
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
236
+ } else {
237
+ this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
238
+ }
239
+
240
+ if (changed) this.$element.toggleClass('active')
241
+ }
242
+
243
+
244
+ // BUTTON PLUGIN DEFINITION
245
+ // ========================
246
+
247
+ function Plugin(option) {
248
+ return this.each(function () {
249
+ var $this = $(this)
250
+ var data = $this.data('bs.button')
251
+ var options = typeof option == 'object' && option
252
+
253
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
254
+
255
+ if (option == 'toggle') data.toggle()
256
+ else if (option) data.setState(option)
257
+ })
258
+ }
259
+
260
+ var old = $.fn.button
261
+
262
+ $.fn.button = Plugin
263
+ $.fn.button.Constructor = Button
264
+
265
+
266
+ // BUTTON NO CONFLICT
267
+ // ==================
268
+
269
+ $.fn.button.noConflict = function () {
270
+ $.fn.button = old
271
+ return this
272
+ }
273
+
274
+
275
+ // BUTTON DATA-API
276
+ // ===============
277
+
278
+ $(document)
279
+ .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
280
+ var $btn = $(e.target)
281
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
282
+ Plugin.call($btn, 'toggle')
283
+ e.preventDefault()
284
+ })
285
+ .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
286
+ $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
287
+ })
288
+
289
+ }(jQuery);
290
+
291
+ /* ========================================================================
292
+ * Bootstrap: carousel.js v3.3.4
293
+ * http://getbootstrap.com/javascript/#carousel
294
+ * ========================================================================
295
+ * Copyright 2011-2015 Twitter, Inc.
296
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
297
+ * ======================================================================== */
298
+
299
+
300
+ +function ($) {
301
+ 'use strict';
302
+
303
+ // CAROUSEL CLASS DEFINITION
304
+ // =========================
305
+
306
+ var Carousel = function (element, options) {
307
+ this.$element = $(element)
308
+ this.$indicators = this.$element.find('.carousel-indicators')
309
+ this.options = options
310
+ this.paused = null
311
+ this.sliding = null
312
+ this.interval = null
313
+ this.$active = null
314
+ this.$items = null
315
+
316
+ this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
317
+
318
+ this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
319
+ .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
320
+ .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
321
+ }
322
+
323
+ Carousel.VERSION = '3.3.4'
324
+
325
+ Carousel.TRANSITION_DURATION = 600
326
+
327
+ Carousel.DEFAULTS = {
328
+ interval: 5000,
329
+ pause: 'hover',
330
+ wrap: true,
331
+ keyboard: true
332
+ }
333
+
334
+ Carousel.prototype.keydown = function (e) {
335
+ if (/input|textarea/i.test(e.target.tagName)) return
336
+ switch (e.which) {
337
+ case 37: this.prev(); break
338
+ case 39: this.next(); break
339
+ default: return
340
+ }
341
+
342
+ e.preventDefault()
343
+ }
344
+
345
+ Carousel.prototype.cycle = function (e) {
346
+ e || (this.paused = false)
347
+
348
+ this.interval && clearInterval(this.interval)
349
+
350
+ this.options.interval
351
+ && !this.paused
352
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
353
+
354
+ return this
355
+ }
356
+
357
+ Carousel.prototype.getItemIndex = function (item) {
358
+ this.$items = item.parent().children('.item')
359
+ return this.$items.index(item || this.$active)
360
+ }
361
+
362
+ Carousel.prototype.getItemForDirection = function (direction, active) {
363
+ var activeIndex = this.getItemIndex(active)
364
+ var willWrap = (direction == 'prev' && activeIndex === 0)
365
+ || (direction == 'next' && activeIndex == (this.$items.length - 1))
366
+ if (willWrap && !this.options.wrap) return active
367
+ var delta = direction == 'prev' ? -1 : 1
368
+ var itemIndex = (activeIndex + delta) % this.$items.length
369
+ return this.$items.eq(itemIndex)
370
+ }
371
+
372
+ Carousel.prototype.to = function (pos) {
373
+ var that = this
374
+ var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
375
+
376
+ if (pos > (this.$items.length - 1) || pos < 0) return
377
+
378
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
379
+ if (activeIndex == pos) return this.pause().cycle()
380
+
381
+ return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
382
+ }
383
+
384
+ Carousel.prototype.pause = function (e) {
385
+ e || (this.paused = true)
386
+
387
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
388
+ this.$element.trigger($.support.transition.end)
389
+ this.cycle(true)
390
+ }
391
+
392
+ this.interval = clearInterval(this.interval)
393
+
394
+ return this
395
+ }
396
+
397
+ Carousel.prototype.next = function () {
398
+ if (this.sliding) return
399
+ return this.slide('next')
400
+ }
401
+
402
+ Carousel.prototype.prev = function () {
403
+ if (this.sliding) return
404
+ return this.slide('prev')
405
+ }
406
+
407
+ Carousel.prototype.slide = function (type, next) {
408
+ var $active = this.$element.find('.item.active')
409
+ var $next = next || this.getItemForDirection(type, $active)
410
+ var isCycling = this.interval
411
+ var direction = type == 'next' ? 'left' : 'right'
412
+ var that = this
413
+
414
+ if ($next.hasClass('active')) return (this.sliding = false)
415
+
416
+ var relatedTarget = $next[0]
417
+ var slideEvent = $.Event('slide.bs.carousel', {
418
+ relatedTarget: relatedTarget,
419
+ direction: direction
420
+ })
421
+ this.$element.trigger(slideEvent)
422
+ if (slideEvent.isDefaultPrevented()) return
423
+
424
+ this.sliding = true
425
+
426
+ isCycling && this.pause()
427
+
428
+ if (this.$indicators.length) {
429
+ this.$indicators.find('.active').removeClass('active')
430
+ var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
431
+ $nextIndicator && $nextIndicator.addClass('active')
432
+ }
433
+
434
+ var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
435
+ if ($.support.transition && this.$element.hasClass('slide')) {
436
+ $next.addClass(type)
437
+ $next[0].offsetWidth // force reflow
438
+ $active.addClass(direction)
439
+ $next.addClass(direction)
440
+ $active
441
+ .one('bsTransitionEnd', function () {
442
+ $next.removeClass([type, direction].join(' ')).addClass('active')
443
+ $active.removeClass(['active', direction].join(' '))
444
+ that.sliding = false
445
+ setTimeout(function () {
446
+ that.$element.trigger(slidEvent)
447
+ }, 0)
448
+ })
449
+ .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
450
+ } else {
451
+ $active.removeClass('active')
452
+ $next.addClass('active')
453
+ this.sliding = false
454
+ this.$element.trigger(slidEvent)
455
+ }
456
+
457
+ isCycling && this.cycle()
458
+
459
+ return this
460
+ }
461
+
462
+
463
+ // CAROUSEL PLUGIN DEFINITION
464
+ // ==========================
465
+
466
+ function Plugin(option) {
467
+ return this.each(function () {
468
+ var $this = $(this)
469
+ var data = $this.data('bs.carousel')
470
+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
471
+ var action = typeof option == 'string' ? option : options.slide
472
+
473
+ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
474
+ if (typeof option == 'number') data.to(option)
475
+ else if (action) data[action]()
476
+ else if (options.interval) data.pause().cycle()
477
+ })
478
+ }
479
+
480
+ var old = $.fn.carousel
481
+
482
+ $.fn.carousel = Plugin
483
+ $.fn.carousel.Constructor = Carousel
484
+
485
+
486
+ // CAROUSEL NO CONFLICT
487
+ // ====================
488
+
489
+ $.fn.carousel.noConflict = function () {
490
+ $.fn.carousel = old
491
+ return this
492
+ }
493
+
494
+
495
+ // CAROUSEL DATA-API
496
+ // =================
497
+
498
+ var clickHandler = function (e) {
499
+ var href
500
+ var $this = $(this)
501
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
502
+ if (!$target.hasClass('carousel')) return
503
+ var options = $.extend({}, $target.data(), $this.data())
504
+ var slideIndex = $this.attr('data-slide-to')
505
+ if (slideIndex) options.interval = false
506
+
507
+ Plugin.call($target, options)
508
+
509
+ if (slideIndex) {
510
+ $target.data('bs.carousel').to(slideIndex)
511
+ }
512
+
513
+ e.preventDefault()
514
+ }
515
+
516
+ $(document)
517
+ .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
518
+ .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
519
+
520
+ $(window).on('load', function () {
521
+ $('[data-ride="carousel"]').each(function () {
522
+ var $carousel = $(this)
523
+ Plugin.call($carousel, $carousel.data())
524
+ })
525
+ })
526
+
527
+ }(jQuery);
528
+
529
+ /* ========================================================================
530
+ * Bootstrap: collapse.js v3.3.4
531
+ * http://getbootstrap.com/javascript/#collapse
532
+ * ========================================================================
533
+ * Copyright 2011-2015 Twitter, Inc.
534
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
535
+ * ======================================================================== */
536
+
537
+
538
+ +function ($) {
539
+ 'use strict';
540
+
541
+ // COLLAPSE PUBLIC CLASS DEFINITION
542
+ // ================================
543
+
544
+ var Collapse = function (element, options) {
545
+ this.$element = $(element)
546
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
547
+ this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
548
+ '[data-toggle="collapse"][data-target="#' + element.id + '"]')
549
+ this.transitioning = null
550
+
551
+ if (this.options.parent) {
552
+ this.$parent = this.getParent()
553
+ } else {
554
+ this.addAriaAndCollapsedClass(this.$element, this.$trigger)
555
+ }
556
+
557
+ if (this.options.toggle) this.toggle()
558
+ }
559
+
560
+ Collapse.VERSION = '3.3.4'
561
+
562
+ Collapse.TRANSITION_DURATION = 350
563
+
564
+ Collapse.DEFAULTS = {
565
+ toggle: true
566
+ }
567
+
568
+ Collapse.prototype.dimension = function () {
569
+ var hasWidth = this.$element.hasClass('width')
570
+ return hasWidth ? 'width' : 'height'
571
+ }
572
+
573
+ Collapse.prototype.show = function () {
574
+ if (this.transitioning || this.$element.hasClass('in')) return
575
+
576
+ var activesData
577
+ var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
578
+
579
+ if (actives && actives.length) {
580
+ activesData = actives.data('bs.collapse')
581
+ if (activesData && activesData.transitioning) return
582
+ }
583
+
584
+ var startEvent = $.Event('show.bs.collapse')
585
+ this.$element.trigger(startEvent)
586
+ if (startEvent.isDefaultPrevented()) return
587
+
588
+ if (actives && actives.length) {
589
+ Plugin.call(actives, 'hide')
590
+ activesData || actives.data('bs.collapse', null)
591
+ }
592
+
593
+ var dimension = this.dimension()
594
+
595
+ this.$element
596
+ .removeClass('collapse')
597
+ .addClass('collapsing')[dimension](0)
598
+ .attr('aria-expanded', true)
599
+
600
+ this.$trigger
601
+ .removeClass('collapsed')
602
+ .attr('aria-expanded', true)
603
+
604
+ this.transitioning = 1
605
+
606
+ var complete = function () {
607
+ this.$element
608
+ .removeClass('collapsing')
609
+ .addClass('collapse in')[dimension]('')
610
+ this.transitioning = 0
611
+ this.$element
612
+ .trigger('shown.bs.collapse')
613
+ }
614
+
615
+ if (!$.support.transition) return complete.call(this)
616
+
617
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
618
+
619
+ this.$element
620
+ .one('bsTransitionEnd', $.proxy(complete, this))
621
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
622
+ }
623
+
624
+ Collapse.prototype.hide = function () {
625
+ if (this.transitioning || !this.$element.hasClass('in')) return
626
+
627
+ var startEvent = $.Event('hide.bs.collapse')
628
+ this.$element.trigger(startEvent)
629
+ if (startEvent.isDefaultPrevented()) return
630
+
631
+ var dimension = this.dimension()
632
+
633
+ this.$element[dimension](this.$element[dimension]())[0].offsetHeight
634
+
635
+ this.$element
636
+ .addClass('collapsing')
637
+ .removeClass('collapse in')
638
+ .attr('aria-expanded', false)
639
+
640
+ this.$trigger
641
+ .addClass('collapsed')
642
+ .attr('aria-expanded', false)
643
+
644
+ this.transitioning = 1
645
+
646
+ var complete = function () {
647
+ this.transitioning = 0
648
+ this.$element
649
+ .removeClass('collapsing')
650
+ .addClass('collapse')
651
+ .trigger('hidden.bs.collapse')
652
+ }
653
+
654
+ if (!$.support.transition) return complete.call(this)
655
+
656
+ this.$element
657
+ [dimension](0)
658
+ .one('bsTransitionEnd', $.proxy(complete, this))
659
+ .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
660
+ }
661
+
662
+ Collapse.prototype.toggle = function () {
663
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
664
+ }
665
+
666
+ Collapse.prototype.getParent = function () {
667
+ return $(this.options.parent)
668
+ .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
669
+ .each($.proxy(function (i, element) {
670
+ var $element = $(element)
671
+ this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
672
+ }, this))
673
+ .end()
674
+ }
675
+
676
+ Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
677
+ var isOpen = $element.hasClass('in')
678
+
679
+ $element.attr('aria-expanded', isOpen)
680
+ $trigger
681
+ .toggleClass('collapsed', !isOpen)
682
+ .attr('aria-expanded', isOpen)
683
+ }
684
+
685
+ function getTargetFromTrigger($trigger) {
686
+ var href
687
+ var target = $trigger.attr('data-target')
688
+ || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
689
+
690
+ return $(target)
691
+ }
692
+
693
+
694
+ // COLLAPSE PLUGIN DEFINITION
695
+ // ==========================
696
+
697
+ function Plugin(option) {
698
+ return this.each(function () {
699
+ var $this = $(this)
700
+ var data = $this.data('bs.collapse')
701
+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
702
+
703
+ if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
704
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
705
+ if (typeof option == 'string') data[option]()
706
+ })
707
+ }
708
+
709
+ var old = $.fn.collapse
710
+
711
+ $.fn.collapse = Plugin
712
+ $.fn.collapse.Constructor = Collapse
713
+
714
+
715
+ // COLLAPSE NO CONFLICT
716
+ // ====================
717
+
718
+ $.fn.collapse.noConflict = function () {
719
+ $.fn.collapse = old
720
+ return this
721
+ }
722
+
723
+
724
+ // COLLAPSE DATA-API
725
+ // =================
726
+
727
+ $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
728
+ var $this = $(this)
729
+
730
+ if (!$this.attr('data-target')) e.preventDefault()
731
+
732
+ var $target = getTargetFromTrigger($this)
733
+ var data = $target.data('bs.collapse')
734
+ var option = data ? 'toggle' : $this.data()
735
+
736
+ Plugin.call($target, option)
737
+ })
738
+
739
+ }(jQuery);
740
+
741
+ /* ========================================================================
742
+ * Bootstrap: dropdown.js v3.3.4
743
+ * http://getbootstrap.com/javascript/#dropdowns
744
+ * ========================================================================
745
+ * Copyright 2011-2015 Twitter, Inc.
746
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
747
+ * ======================================================================== */
748
+
749
+
750
+ +function ($) {
751
+ 'use strict';
752
+
753
+ // DROPDOWN CLASS DEFINITION
754
+ // =========================
755
+
756
+ var backdrop = '.dropdown-backdrop'
757
+ var toggle = '[data-toggle="dropdown"]'
758
+ var Dropdown = function (element) {
759
+ $(element).on('click.bs.dropdown', this.toggle)
760
+ }
761
+
762
+ Dropdown.VERSION = '3.3.4'
763
+
764
+ Dropdown.prototype.toggle = function (e) {
765
+ var $this = $(this)
766
+
767
+ if ($this.is('.disabled, :disabled')) return
768
+
769
+ var $parent = getParent($this)
770
+ var isActive = $parent.hasClass('open')
771
+
772
+ clearMenus()
773
+
774
+ if (!isActive) {
775
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
776
+ // if mobile we use a backdrop because click events don't delegate
777
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
778
+ }
779
+
780
+ var relatedTarget = { relatedTarget: this }
781
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
782
+
783
+ if (e.isDefaultPrevented()) return
784
+
785
+ $this
786
+ .trigger('focus')
787
+ .attr('aria-expanded', 'true')
788
+
789
+ $parent
790
+ .toggleClass('open')
791
+ .trigger('shown.bs.dropdown', relatedTarget)
792
+ }
793
+
794
+ return false
795
+ }
796
+
797
+ Dropdown.prototype.keydown = function (e) {
798
+ if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
799
+
800
+ var $this = $(this)
801
+
802
+ e.preventDefault()
803
+ e.stopPropagation()
804
+
805
+ if ($this.is('.disabled, :disabled')) return
806
+
807
+ var $parent = getParent($this)
808
+ var isActive = $parent.hasClass('open')
809
+
810
+ if ((!isActive && e.which != 27) || (isActive && e.which == 27)) {
811
+ if (e.which == 27) $parent.find(toggle).trigger('focus')
812
+ return $this.trigger('click')
813
+ }
814
+
815
+ var desc = ' li:not(.disabled):visible a'
816
+ var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc)
817
+
818
+ if (!$items.length) return
819
+
820
+ var index = $items.index(e.target)
821
+
822
+ if (e.which == 38 && index > 0) index-- // up
823
+ if (e.which == 40 && index < $items.length - 1) index++ // down
824
+ if (!~index) index = 0
825
+
826
+ $items.eq(index).trigger('focus')
827
+ }
828
+
829
+ function clearMenus(e) {
830
+ if (e && e.which === 3) return
831
+ $(backdrop).remove()
832
+ $(toggle).each(function () {
833
+ var $this = $(this)
834
+ var $parent = getParent($this)
835
+ var relatedTarget = { relatedTarget: this }
836
+
837
+ if (!$parent.hasClass('open')) return
838
+
839
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
840
+
841
+ if (e.isDefaultPrevented()) return
842
+
843
+ $this.attr('aria-expanded', 'false')
844
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
845
+ })
846
+ }
847
+
848
+ function getParent($this) {
849
+ var selector = $this.attr('data-target')
850
+
851
+ if (!selector) {
852
+ selector = $this.attr('href')
853
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
854
+ }
855
+
856
+ var $parent = selector && $(selector)
857
+
858
+ return $parent && $parent.length ? $parent : $this.parent()
859
+ }
860
+
861
+
862
+ // DROPDOWN PLUGIN DEFINITION
863
+ // ==========================
864
+
865
+ function Plugin(option) {
866
+ return this.each(function () {
867
+ var $this = $(this)
868
+ var data = $this.data('bs.dropdown')
869
+
870
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
871
+ if (typeof option == 'string') data[option].call($this)
872
+ })
873
+ }
874
+
875
+ var old = $.fn.dropdown
876
+
877
+ $.fn.dropdown = Plugin
878
+ $.fn.dropdown.Constructor = Dropdown
879
+
880
+
881
+ // DROPDOWN NO CONFLICT
882
+ // ====================
883
+
884
+ $.fn.dropdown.noConflict = function () {
885
+ $.fn.dropdown = old
886
+ return this
887
+ }
888
+
889
+
890
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
891
+ // ===================================
892
+
893
+ $(document)
894
+ .on('click.bs.dropdown.data-api', clearMenus)
895
+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
896
+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
897
+ .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
898
+ .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown)
899
+ .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown)
900
+
901
+ }(jQuery);
902
+
903
+ /* ========================================================================
904
+ * Bootstrap: modal.js v3.3.4
905
+ * http://getbootstrap.com/javascript/#modals
906
+ * ========================================================================
907
+ * Copyright 2011-2015 Twitter, Inc.
908
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
909
+ * ======================================================================== */
910
+
911
+
912
+ +function ($) {
913
+ 'use strict';
914
+
915
+ // MODAL CLASS DEFINITION
916
+ // ======================
917
+
918
+ var Modal = function (element, options) {
919
+ this.options = options
920
+ this.$body = $(document.body)
921
+ this.$element = $(element)
922
+ this.$dialog = this.$element.find('.modal-dialog')
923
+ this.$backdrop = null
924
+ this.isShown = null
925
+ this.originalBodyPad = null
926
+ this.scrollbarWidth = 0
927
+ this.ignoreBackdropClick = false
928
+
929
+ if (this.options.remote) {
930
+ this.$element
931
+ .find('.modal-content')
932
+ .load(this.options.remote, $.proxy(function () {
933
+ this.$element.trigger('loaded.bs.modal')
934
+ }, this))
935
+ }
936
+ }
937
+
938
+ Modal.VERSION = '3.3.4'
939
+
940
+ Modal.TRANSITION_DURATION = 300
941
+ Modal.BACKDROP_TRANSITION_DURATION = 150
942
+
943
+ Modal.DEFAULTS = {
944
+ backdrop: true,
945
+ keyboard: true,
946
+ show: true
947
+ }
948
+
949
+ Modal.prototype.toggle = function (_relatedTarget) {
950
+ return this.isShown ? this.hide() : this.show(_relatedTarget)
951
+ }
952
+
953
+ Modal.prototype.show = function (_relatedTarget) {
954
+ var that = this
955
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
956
+
957
+ this.$element.trigger(e)
958
+
959
+ if (this.isShown || e.isDefaultPrevented()) return
960
+
961
+ this.isShown = true
962
+
963
+ this.checkScrollbar()
964
+ this.setScrollbar()
965
+ this.$body.addClass('modal-open')
966
+
967
+ this.escape()
968
+ this.resize()
969
+
970
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
971
+
972
+ this.$dialog.on('mousedown.dismiss.bs.modal', function () {
973
+ that.$element.one('mouseup.dismiss.bs.modal', function (e) {
974
+ if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
975
+ })
976
+ })
977
+
978
+ this.backdrop(function () {
979
+ var transition = $.support.transition && that.$element.hasClass('fade')
980
+
981
+ if (!that.$element.parent().length) {
982
+ that.$element.appendTo(that.$body) // don't move modals dom position
983
+ }
984
+
985
+ that.$element
986
+ .show()
987
+ .scrollTop(0)
988
+
989
+ that.adjustDialog()
990
+
991
+ if (transition) {
992
+ that.$element[0].offsetWidth // force reflow
993
+ }
994
+
995
+ that.$element
996
+ .addClass('in')
997
+ .attr('aria-hidden', false)
998
+
999
+ that.enforceFocus()
1000
+
1001
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
1002
+
1003
+ transition ?
1004
+ that.$dialog // wait for modal to slide in
1005
+ .one('bsTransitionEnd', function () {
1006
+ that.$element.trigger('focus').trigger(e)
1007
+ })
1008
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1009
+ that.$element.trigger('focus').trigger(e)
1010
+ })
1011
+ }
1012
+
1013
+ Modal.prototype.hide = function (e) {
1014
+ if (e) e.preventDefault()
1015
+
1016
+ e = $.Event('hide.bs.modal')
1017
+
1018
+ this.$element.trigger(e)
1019
+
1020
+ if (!this.isShown || e.isDefaultPrevented()) return
1021
+
1022
+ this.isShown = false
1023
+
1024
+ this.escape()
1025
+ this.resize()
1026
+
1027
+ $(document).off('focusin.bs.modal')
1028
+
1029
+ this.$element
1030
+ .removeClass('in')
1031
+ .attr('aria-hidden', true)
1032
+ .off('click.dismiss.bs.modal')
1033
+ .off('mouseup.dismiss.bs.modal')
1034
+
1035
+ this.$dialog.off('mousedown.dismiss.bs.modal')
1036
+
1037
+ $.support.transition && this.$element.hasClass('fade') ?
1038
+ this.$element
1039
+ .one('bsTransitionEnd', $.proxy(this.hideModal, this))
1040
+ .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
1041
+ this.hideModal()
1042
+ }
1043
+
1044
+ Modal.prototype.enforceFocus = function () {
1045
+ $(document)
1046
+ .off('focusin.bs.modal') // guard against infinite focus loop
1047
+ .on('focusin.bs.modal', $.proxy(function (e) {
1048
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
1049
+ this.$element.trigger('focus')
1050
+ }
1051
+ }, this))
1052
+ }
1053
+
1054
+ Modal.prototype.escape = function () {
1055
+ if (this.isShown && this.options.keyboard) {
1056
+ this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
1057
+ e.which == 27 && this.hide()
1058
+ }, this))
1059
+ } else if (!this.isShown) {
1060
+ this.$element.off('keydown.dismiss.bs.modal')
1061
+ }
1062
+ }
1063
+
1064
+ Modal.prototype.resize = function () {
1065
+ if (this.isShown) {
1066
+ $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
1067
+ } else {
1068
+ $(window).off('resize.bs.modal')
1069
+ }
1070
+ }
1071
+
1072
+ Modal.prototype.hideModal = function () {
1073
+ var that = this
1074
+ this.$element.hide()
1075
+ this.backdrop(function () {
1076
+ that.$body.removeClass('modal-open')
1077
+ that.resetAdjustments()
1078
+ that.resetScrollbar()
1079
+ that.$element.trigger('hidden.bs.modal')
1080
+ })
1081
+ }
1082
+
1083
+ Modal.prototype.removeBackdrop = function () {
1084
+ this.$backdrop && this.$backdrop.remove()
1085
+ this.$backdrop = null
1086
+ }
1087
+
1088
+ Modal.prototype.backdrop = function (callback) {
1089
+ var that = this
1090
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
1091
+
1092
+ if (this.isShown && this.options.backdrop) {
1093
+ var doAnimate = $.support.transition && animate
1094
+
1095
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
1096
+ .appendTo(this.$body)
1097
+
1098
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
1099
+ if (this.ignoreBackdropClick) {
1100
+ this.ignoreBackdropClick = false
1101
+ return
1102
+ }
1103
+ if (e.target !== e.currentTarget) return
1104
+ this.options.backdrop == 'static'
1105
+ ? this.$element[0].focus()
1106
+ : this.hide()
1107
+ }, this))
1108
+
1109
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
1110
+
1111
+ this.$backdrop.addClass('in')
1112
+
1113
+ if (!callback) return
1114
+
1115
+ doAnimate ?
1116
+ this.$backdrop
1117
+ .one('bsTransitionEnd', callback)
1118
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1119
+ callback()
1120
+
1121
+ } else if (!this.isShown && this.$backdrop) {
1122
+ this.$backdrop.removeClass('in')
1123
+
1124
+ var callbackRemove = function () {
1125
+ that.removeBackdrop()
1126
+ callback && callback()
1127
+ }
1128
+ $.support.transition && this.$element.hasClass('fade') ?
1129
+ this.$backdrop
1130
+ .one('bsTransitionEnd', callbackRemove)
1131
+ .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
1132
+ callbackRemove()
1133
+
1134
+ } else if (callback) {
1135
+ callback()
1136
+ }
1137
+ }
1138
+
1139
+ // these following methods are used to handle overflowing modals
1140
+
1141
+ Modal.prototype.handleUpdate = function () {
1142
+ this.adjustDialog()
1143
+ }
1144
+
1145
+ Modal.prototype.adjustDialog = function () {
1146
+ var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
1147
+
1148
+ this.$element.css({
1149
+ paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
1150
+ paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
1151
+ })
1152
+ }
1153
+
1154
+ Modal.prototype.resetAdjustments = function () {
1155
+ this.$element.css({
1156
+ paddingLeft: '',
1157
+ paddingRight: ''
1158
+ })
1159
+ }
1160
+
1161
+ Modal.prototype.checkScrollbar = function () {
1162
+ var fullWindowWidth = window.innerWidth
1163
+ if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
1164
+ var documentElementRect = document.documentElement.getBoundingClientRect()
1165
+ fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
1166
+ }
1167
+ this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
1168
+ this.scrollbarWidth = this.measureScrollbar()
1169
+ }
1170
+
1171
+ Modal.prototype.setScrollbar = function () {
1172
+ var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
1173
+ this.originalBodyPad = document.body.style.paddingRight || ''
1174
+ if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
1175
+ }
1176
+
1177
+ Modal.prototype.resetScrollbar = function () {
1178
+ this.$body.css('padding-right', this.originalBodyPad)
1179
+ }
1180
+
1181
+ Modal.prototype.measureScrollbar = function () { // thx walsh
1182
+ var scrollDiv = document.createElement('div')
1183
+ scrollDiv.className = 'modal-scrollbar-measure'
1184
+ this.$body.append(scrollDiv)
1185
+ var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
1186
+ this.$body[0].removeChild(scrollDiv)
1187
+ return scrollbarWidth
1188
+ }
1189
+
1190
+
1191
+ // MODAL PLUGIN DEFINITION
1192
+ // =======================
1193
+
1194
+ function Plugin(option, _relatedTarget) {
1195
+ return this.each(function () {
1196
+ var $this = $(this)
1197
+ var data = $this.data('bs.modal')
1198
+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
1199
+
1200
+ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
1201
+ if (typeof option == 'string') data[option](_relatedTarget)
1202
+ else if (options.show) data.show(_relatedTarget)
1203
+ })
1204
+ }
1205
+
1206
+ var old = $.fn.modal
1207
+
1208
+ $.fn.modal = Plugin
1209
+ $.fn.modal.Constructor = Modal
1210
+
1211
+
1212
+ // MODAL NO CONFLICT
1213
+ // =================
1214
+
1215
+ $.fn.modal.noConflict = function () {
1216
+ $.fn.modal = old
1217
+ return this
1218
+ }
1219
+
1220
+
1221
+ // MODAL DATA-API
1222
+ // ==============
1223
+
1224
+ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
1225
+ var $this = $(this)
1226
+ var href = $this.attr('href')
1227
+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
1228
+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
1229
+
1230
+ if ($this.is('a')) e.preventDefault()
1231
+
1232
+ $target.one('show.bs.modal', function (showEvent) {
1233
+ if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
1234
+ $target.one('hidden.bs.modal', function () {
1235
+ $this.is(':visible') && $this.trigger('focus')
1236
+ })
1237
+ })
1238
+ Plugin.call($target, option, this)
1239
+ })
1240
+
1241
+ }(jQuery);
1242
+
1243
+ /* ========================================================================
1244
+ * Bootstrap: tooltip.js v3.3.4
1245
+ * http://getbootstrap.com/javascript/#tooltip
1246
+ * Inspired by the original jQuery.tipsy by Jason Frame
1247
+ * ========================================================================
1248
+ * Copyright 2011-2015 Twitter, Inc.
1249
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1250
+ * ======================================================================== */
1251
+
1252
+
1253
+ +function ($) {
1254
+ 'use strict';
1255
+
1256
+ // TOOLTIP PUBLIC CLASS DEFINITION
1257
+ // ===============================
1258
+
1259
+ var Tooltip = function (element, options) {
1260
+ this.type = null
1261
+ this.options = null
1262
+ this.enabled = null
1263
+ this.timeout = null
1264
+ this.hoverState = null
1265
+ this.$element = null
1266
+
1267
+ this.init('tooltip', element, options)
1268
+ }
1269
+
1270
+ Tooltip.VERSION = '3.3.4'
1271
+
1272
+ Tooltip.TRANSITION_DURATION = 150
1273
+
1274
+ Tooltip.DEFAULTS = {
1275
+ animation: true,
1276
+ placement: 'top',
1277
+ selector: false,
1278
+ template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
1279
+ trigger: 'hover focus',
1280
+ title: '',
1281
+ delay: 0,
1282
+ html: false,
1283
+ container: false,
1284
+ viewport: {
1285
+ selector: 'body',
1286
+ padding: 0
1287
+ }
1288
+ }
1289
+
1290
+ Tooltip.prototype.init = function (type, element, options) {
1291
+ this.enabled = true
1292
+ this.type = type
1293
+ this.$element = $(element)
1294
+ this.options = this.getOptions(options)
1295
+ this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
1296
+
1297
+ if (this.$element[0] instanceof document.constructor && !this.options.selector) {
1298
+ throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
1299
+ }
1300
+
1301
+ var triggers = this.options.trigger.split(' ')
1302
+
1303
+ for (var i = triggers.length; i--;) {
1304
+ var trigger = triggers[i]
1305
+
1306
+ if (trigger == 'click') {
1307
+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
1308
+ } else if (trigger != 'manual') {
1309
+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
1310
+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
1311
+
1312
+ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
1313
+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
1314
+ }
1315
+ }
1316
+
1317
+ this.options.selector ?
1318
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
1319
+ this.fixTitle()
1320
+ }
1321
+
1322
+ Tooltip.prototype.getDefaults = function () {
1323
+ return Tooltip.DEFAULTS
1324
+ }
1325
+
1326
+ Tooltip.prototype.getOptions = function (options) {
1327
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
1328
+
1329
+ if (options.delay && typeof options.delay == 'number') {
1330
+ options.delay = {
1331
+ show: options.delay,
1332
+ hide: options.delay
1333
+ }
1334
+ }
1335
+
1336
+ return options
1337
+ }
1338
+
1339
+ Tooltip.prototype.getDelegateOptions = function () {
1340
+ var options = {}
1341
+ var defaults = this.getDefaults()
1342
+
1343
+ this._options && $.each(this._options, function (key, value) {
1344
+ if (defaults[key] != value) options[key] = value
1345
+ })
1346
+
1347
+ return options
1348
+ }
1349
+
1350
+ Tooltip.prototype.enter = function (obj) {
1351
+ var self = obj instanceof this.constructor ?
1352
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1353
+
1354
+ if (self && self.$tip && self.$tip.is(':visible')) {
1355
+ self.hoverState = 'in'
1356
+ return
1357
+ }
1358
+
1359
+ if (!self) {
1360
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1361
+ $(obj.currentTarget).data('bs.' + this.type, self)
1362
+ }
1363
+
1364
+ clearTimeout(self.timeout)
1365
+
1366
+ self.hoverState = 'in'
1367
+
1368
+ if (!self.options.delay || !self.options.delay.show) return self.show()
1369
+
1370
+ self.timeout = setTimeout(function () {
1371
+ if (self.hoverState == 'in') self.show()
1372
+ }, self.options.delay.show)
1373
+ }
1374
+
1375
+ Tooltip.prototype.leave = function (obj) {
1376
+ var self = obj instanceof this.constructor ?
1377
+ obj : $(obj.currentTarget).data('bs.' + this.type)
1378
+
1379
+ if (!self) {
1380
+ self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
1381
+ $(obj.currentTarget).data('bs.' + this.type, self)
1382
+ }
1383
+
1384
+ clearTimeout(self.timeout)
1385
+
1386
+ self.hoverState = 'out'
1387
+
1388
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
1389
+
1390
+ self.timeout = setTimeout(function () {
1391
+ if (self.hoverState == 'out') self.hide()
1392
+ }, self.options.delay.hide)
1393
+ }
1394
+
1395
+ Tooltip.prototype.show = function () {
1396
+ var e = $.Event('show.bs.' + this.type)
1397
+
1398
+ if (this.hasContent() && this.enabled) {
1399
+ this.$element.trigger(e)
1400
+
1401
+ var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
1402
+ if (e.isDefaultPrevented() || !inDom) return
1403
+ var that = this
1404
+
1405
+ var $tip = this.tip()
1406
+
1407
+ var tipId = this.getUID(this.type)
1408
+
1409
+ this.setContent()
1410
+ $tip.attr('id', tipId)
1411
+ this.$element.attr('aria-describedby', tipId)
1412
+
1413
+ if (this.options.animation) $tip.addClass('fade')
1414
+
1415
+ var placement = typeof this.options.placement == 'function' ?
1416
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
1417
+ this.options.placement
1418
+
1419
+ var autoToken = /\s?auto?\s?/i
1420
+ var autoPlace = autoToken.test(placement)
1421
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
1422
+
1423
+ $tip
1424
+ .detach()
1425
+ .css({ top: 0, left: 0, display: 'block' })
1426
+ .addClass(placement)
1427
+ .data('bs.' + this.type, this)
1428
+
1429
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
1430
+
1431
+ var pos = this.getPosition()
1432
+ var actualWidth = $tip[0].offsetWidth
1433
+ var actualHeight = $tip[0].offsetHeight
1434
+
1435
+ if (autoPlace) {
1436
+ var orgPlacement = placement
1437
+ var $container = this.options.container ? $(this.options.container) : this.$element.parent()
1438
+ var containerDim = this.getPosition($container)
1439
+
1440
+ placement = placement == 'bottom' && pos.bottom + actualHeight > containerDim.bottom ? 'top' :
1441
+ placement == 'top' && pos.top - actualHeight < containerDim.top ? 'bottom' :
1442
+ placement == 'right' && pos.right + actualWidth > containerDim.width ? 'left' :
1443
+ placement == 'left' && pos.left - actualWidth < containerDim.left ? 'right' :
1444
+ placement
1445
+
1446
+ $tip
1447
+ .removeClass(orgPlacement)
1448
+ .addClass(placement)
1449
+ }
1450
+
1451
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
1452
+
1453
+ this.applyPlacement(calculatedOffset, placement)
1454
+
1455
+ var complete = function () {
1456
+ var prevHoverState = that.hoverState
1457
+ that.$element.trigger('shown.bs.' + that.type)
1458
+ that.hoverState = null
1459
+
1460
+ if (prevHoverState == 'out') that.leave(that)
1461
+ }
1462
+
1463
+ $.support.transition && this.$tip.hasClass('fade') ?
1464
+ $tip
1465
+ .one('bsTransitionEnd', complete)
1466
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1467
+ complete()
1468
+ }
1469
+ }
1470
+
1471
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
1472
+ var $tip = this.tip()
1473
+ var width = $tip[0].offsetWidth
1474
+ var height = $tip[0].offsetHeight
1475
+
1476
+ // manually read margins because getBoundingClientRect includes difference
1477
+ var marginTop = parseInt($tip.css('margin-top'), 10)
1478
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
1479
+
1480
+ // we must check for NaN for ie 8/9
1481
+ if (isNaN(marginTop)) marginTop = 0
1482
+ if (isNaN(marginLeft)) marginLeft = 0
1483
+
1484
+ offset.top = offset.top + marginTop
1485
+ offset.left = offset.left + marginLeft
1486
+
1487
+ // $.fn.offset doesn't round pixel values
1488
+ // so we use setOffset directly with our own function B-0
1489
+ $.offset.setOffset($tip[0], $.extend({
1490
+ using: function (props) {
1491
+ $tip.css({
1492
+ top: Math.round(props.top),
1493
+ left: Math.round(props.left)
1494
+ })
1495
+ }
1496
+ }, offset), 0)
1497
+
1498
+ $tip.addClass('in')
1499
+
1500
+ // check to see if placing tip in new offset caused the tip to resize itself
1501
+ var actualWidth = $tip[0].offsetWidth
1502
+ var actualHeight = $tip[0].offsetHeight
1503
+
1504
+ if (placement == 'top' && actualHeight != height) {
1505
+ offset.top = offset.top + height - actualHeight
1506
+ }
1507
+
1508
+ var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
1509
+
1510
+ if (delta.left) offset.left += delta.left
1511
+ else offset.top += delta.top
1512
+
1513
+ var isVertical = /top|bottom/.test(placement)
1514
+ var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
1515
+ var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
1516
+
1517
+ $tip.offset(offset)
1518
+ this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
1519
+ }
1520
+
1521
+ Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
1522
+ this.arrow()
1523
+ .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
1524
+ .css(isVertical ? 'top' : 'left', '')
1525
+ }
1526
+
1527
+ Tooltip.prototype.setContent = function () {
1528
+ var $tip = this.tip()
1529
+ var title = this.getTitle()
1530
+
1531
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
1532
+ $tip.removeClass('fade in top bottom left right')
1533
+ }
1534
+
1535
+ Tooltip.prototype.hide = function (callback) {
1536
+ var that = this
1537
+ var $tip = $(this.$tip)
1538
+ var e = $.Event('hide.bs.' + this.type)
1539
+
1540
+ function complete() {
1541
+ if (that.hoverState != 'in') $tip.detach()
1542
+ that.$element
1543
+ .removeAttr('aria-describedby')
1544
+ .trigger('hidden.bs.' + that.type)
1545
+ callback && callback()
1546
+ }
1547
+
1548
+ this.$element.trigger(e)
1549
+
1550
+ if (e.isDefaultPrevented()) return
1551
+
1552
+ $tip.removeClass('in')
1553
+
1554
+ $.support.transition && $tip.hasClass('fade') ?
1555
+ $tip
1556
+ .one('bsTransitionEnd', complete)
1557
+ .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
1558
+ complete()
1559
+
1560
+ this.hoverState = null
1561
+
1562
+ return this
1563
+ }
1564
+
1565
+ Tooltip.prototype.fixTitle = function () {
1566
+ var $e = this.$element
1567
+ if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
1568
+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
1569
+ }
1570
+ }
1571
+
1572
+ Tooltip.prototype.hasContent = function () {
1573
+ return this.getTitle()
1574
+ }
1575
+
1576
+ Tooltip.prototype.getPosition = function ($element) {
1577
+ $element = $element || this.$element
1578
+
1579
+ var el = $element[0]
1580
+ var isBody = el.tagName == 'BODY'
1581
+
1582
+ var elRect = el.getBoundingClientRect()
1583
+ if (elRect.width == null) {
1584
+ // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
1585
+ elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
1586
+ }
1587
+ var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
1588
+ var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
1589
+ var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
1590
+
1591
+ return $.extend({}, elRect, scroll, outerDims, elOffset)
1592
+ }
1593
+
1594
+ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
1595
+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1596
+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
1597
+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
1598
+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
1599
+
1600
+ }
1601
+
1602
+ Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
1603
+ var delta = { top: 0, left: 0 }
1604
+ if (!this.$viewport) return delta
1605
+
1606
+ var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
1607
+ var viewportDimensions = this.getPosition(this.$viewport)
1608
+
1609
+ if (/right|left/.test(placement)) {
1610
+ var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
1611
+ var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
1612
+ if (topEdgeOffset < viewportDimensions.top) { // top overflow
1613
+ delta.top = viewportDimensions.top - topEdgeOffset
1614
+ } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
1615
+ delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
1616
+ }
1617
+ } else {
1618
+ var leftEdgeOffset = pos.left - viewportPadding
1619
+ var rightEdgeOffset = pos.left + viewportPadding + actualWidth
1620
+ if (leftEdgeOffset < viewportDimensions.left) { // left overflow
1621
+ delta.left = viewportDimensions.left - leftEdgeOffset
1622
+ } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow
1623
+ delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
1624
+ }
1625
+ }
1626
+
1627
+ return delta
1628
+ }
1629
+
1630
+ Tooltip.prototype.getTitle = function () {
1631
+ var title
1632
+ var $e = this.$element
1633
+ var o = this.options
1634
+
1635
+ title = $e.attr('data-original-title')
1636
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
1637
+
1638
+ return title
1639
+ }
1640
+
1641
+ Tooltip.prototype.getUID = function (prefix) {
1642
+ do prefix += ~~(Math.random() * 1000000)
1643
+ while (document.getElementById(prefix))
1644
+ return prefix
1645
+ }
1646
+
1647
+ Tooltip.prototype.tip = function () {
1648
+ return (this.$tip = this.$tip || $(this.options.template))
1649
+ }
1650
+
1651
+ Tooltip.prototype.arrow = function () {
1652
+ return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
1653
+ }
1654
+
1655
+ Tooltip.prototype.enable = function () {
1656
+ this.enabled = true
1657
+ }
1658
+
1659
+ Tooltip.prototype.disable = function () {
1660
+ this.enabled = false
1661
+ }
1662
+
1663
+ Tooltip.prototype.toggleEnabled = function () {
1664
+ this.enabled = !this.enabled
1665
+ }
1666
+
1667
+ Tooltip.prototype.toggle = function (e) {
1668
+ var self = this
1669
+ if (e) {
1670
+ self = $(e.currentTarget).data('bs.' + this.type)
1671
+ if (!self) {
1672
+ self = new this.constructor(e.currentTarget, this.getDelegateOptions())
1673
+ $(e.currentTarget).data('bs.' + this.type, self)
1674
+ }
1675
+ }
1676
+
1677
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
1678
+ }
1679
+
1680
+ Tooltip.prototype.destroy = function () {
1681
+ var that = this
1682
+ clearTimeout(this.timeout)
1683
+ this.hide(function () {
1684
+ that.$element.off('.' + that.type).removeData('bs.' + that.type)
1685
+ })
1686
+ }
1687
+
1688
+
1689
+ // TOOLTIP PLUGIN DEFINITION
1690
+ // =========================
1691
+
1692
+ function Plugin(option) {
1693
+ return this.each(function () {
1694
+ var $this = $(this)
1695
+ var data = $this.data('bs.tooltip')
1696
+ var options = typeof option == 'object' && option
1697
+
1698
+ if (!data && /destroy|hide/.test(option)) return
1699
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
1700
+ if (typeof option == 'string') data[option]()
1701
+ })
1702
+ }
1703
+
1704
+ var old = $.fn.tooltip
1705
+
1706
+ $.fn.tooltip = Plugin
1707
+ $.fn.tooltip.Constructor = Tooltip
1708
+
1709
+
1710
+ // TOOLTIP NO CONFLICT
1711
+ // ===================
1712
+
1713
+ $.fn.tooltip.noConflict = function () {
1714
+ $.fn.tooltip = old
1715
+ return this
1716
+ }
1717
+
1718
+ }(jQuery);
1719
+
1720
+ /* ========================================================================
1721
+ * Bootstrap: popover.js v3.3.4
1722
+ * http://getbootstrap.com/javascript/#popovers
1723
+ * ========================================================================
1724
+ * Copyright 2011-2015 Twitter, Inc.
1725
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1726
+ * ======================================================================== */
1727
+
1728
+
1729
+ +function ($) {
1730
+ 'use strict';
1731
+
1732
+ // POPOVER PUBLIC CLASS DEFINITION
1733
+ // ===============================
1734
+
1735
+ var Popover = function (element, options) {
1736
+ this.init('popover', element, options)
1737
+ }
1738
+
1739
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
1740
+
1741
+ Popover.VERSION = '3.3.4'
1742
+
1743
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
1744
+ placement: 'right',
1745
+ trigger: 'click',
1746
+ content: '',
1747
+ template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
1748
+ })
1749
+
1750
+
1751
+ // NOTE: POPOVER EXTENDS tooltip.js
1752
+ // ================================
1753
+
1754
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
1755
+
1756
+ Popover.prototype.constructor = Popover
1757
+
1758
+ Popover.prototype.getDefaults = function () {
1759
+ return Popover.DEFAULTS
1760
+ }
1761
+
1762
+ Popover.prototype.setContent = function () {
1763
+ var $tip = this.tip()
1764
+ var title = this.getTitle()
1765
+ var content = this.getContent()
1766
+
1767
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
1768
+ $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events
1769
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
1770
+ ](content)
1771
+
1772
+ $tip.removeClass('fade top bottom left right in')
1773
+
1774
+ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
1775
+ // this manually by checking the contents.
1776
+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
1777
+ }
1778
+
1779
+ Popover.prototype.hasContent = function () {
1780
+ return this.getTitle() || this.getContent()
1781
+ }
1782
+
1783
+ Popover.prototype.getContent = function () {
1784
+ var $e = this.$element
1785
+ var o = this.options
1786
+
1787
+ return $e.attr('data-content')
1788
+ || (typeof o.content == 'function' ?
1789
+ o.content.call($e[0]) :
1790
+ o.content)
1791
+ }
1792
+
1793
+ Popover.prototype.arrow = function () {
1794
+ return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
1795
+ }
1796
+
1797
+
1798
+ // POPOVER PLUGIN DEFINITION
1799
+ // =========================
1800
+
1801
+ function Plugin(option) {
1802
+ return this.each(function () {
1803
+ var $this = $(this)
1804
+ var data = $this.data('bs.popover')
1805
+ var options = typeof option == 'object' && option
1806
+
1807
+ if (!data && /destroy|hide/.test(option)) return
1808
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
1809
+ if (typeof option == 'string') data[option]()
1810
+ })
1811
+ }
1812
+
1813
+ var old = $.fn.popover
1814
+
1815
+ $.fn.popover = Plugin
1816
+ $.fn.popover.Constructor = Popover
1817
+
1818
+
1819
+ // POPOVER NO CONFLICT
1820
+ // ===================
1821
+
1822
+ $.fn.popover.noConflict = function () {
1823
+ $.fn.popover = old
1824
+ return this
1825
+ }
1826
+
1827
+ }(jQuery);
1828
+
1829
+ /* ========================================================================
1830
+ * Bootstrap: scrollspy.js v3.3.4
1831
+ * http://getbootstrap.com/javascript/#scrollspy
1832
+ * ========================================================================
1833
+ * Copyright 2011-2015 Twitter, Inc.
1834
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
1835
+ * ======================================================================== */
1836
+
1837
+
1838
+ +function ($) {
1839
+ 'use strict';
1840
+
1841
+ // SCROLLSPY CLASS DEFINITION
1842
+ // ==========================
1843
+
1844
+ function ScrollSpy(element, options) {
1845
+ this.$body = $(document.body)
1846
+ this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
1847
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
1848
+ this.selector = (this.options.target || '') + ' .nav li > a'
1849
+ this.offsets = []
1850
+ this.targets = []
1851
+ this.activeTarget = null
1852
+ this.scrollHeight = 0
1853
+
1854
+ this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
1855
+ this.refresh()
1856
+ this.process()
1857
+ }
1858
+
1859
+ ScrollSpy.VERSION = '3.3.4'
1860
+
1861
+ ScrollSpy.DEFAULTS = {
1862
+ offset: 10
1863
+ }
1864
+
1865
+ ScrollSpy.prototype.getScrollHeight = function () {
1866
+ return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
1867
+ }
1868
+
1869
+ ScrollSpy.prototype.refresh = function () {
1870
+ var that = this
1871
+ var offsetMethod = 'offset'
1872
+ var offsetBase = 0
1873
+
1874
+ this.offsets = []
1875
+ this.targets = []
1876
+ this.scrollHeight = this.getScrollHeight()
1877
+
1878
+ if (!$.isWindow(this.$scrollElement[0])) {
1879
+ offsetMethod = 'position'
1880
+ offsetBase = this.$scrollElement.scrollTop()
1881
+ }
1882
+
1883
+ this.$body
1884
+ .find(this.selector)
1885
+ .map(function () {
1886
+ var $el = $(this)
1887
+ var href = $el.data('target') || $el.attr('href')
1888
+ var $href = /^#./.test(href) && $(href)
1889
+
1890
+ return ($href
1891
+ && $href.length
1892
+ && $href.is(':visible')
1893
+ && [[$href[offsetMethod]().top + offsetBase, href]]) || null
1894
+ })
1895
+ .sort(function (a, b) { return a[0] - b[0] })
1896
+ .each(function () {
1897
+ that.offsets.push(this[0])
1898
+ that.targets.push(this[1])
1899
+ })
1900
+ }
1901
+
1902
+ ScrollSpy.prototype.process = function () {
1903
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
1904
+ var scrollHeight = this.getScrollHeight()
1905
+ var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
1906
+ var offsets = this.offsets
1907
+ var targets = this.targets
1908
+ var activeTarget = this.activeTarget
1909
+ var i
1910
+
1911
+ if (this.scrollHeight != scrollHeight) {
1912
+ this.refresh()
1913
+ }
1914
+
1915
+ if (scrollTop >= maxScroll) {
1916
+ return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
1917
+ }
1918
+
1919
+ if (activeTarget && scrollTop < offsets[0]) {
1920
+ this.activeTarget = null
1921
+ return this.clear()
1922
+ }
1923
+
1924
+ for (i = offsets.length; i--;) {
1925
+ activeTarget != targets[i]
1926
+ && scrollTop >= offsets[i]
1927
+ && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
1928
+ && this.activate(targets[i])
1929
+ }
1930
+ }
1931
+
1932
+ ScrollSpy.prototype.activate = function (target) {
1933
+ this.activeTarget = target
1934
+
1935
+ this.clear()
1936
+
1937
+ var selector = this.selector +
1938
+ '[data-target="' + target + '"],' +
1939
+ this.selector + '[href="' + target + '"]'
1940
+
1941
+ var active = $(selector)
1942
+ .parents('li')
1943
+ .addClass('active')
1944
+
1945
+ if (active.parent('.dropdown-menu').length) {
1946
+ active = active
1947
+ .closest('li.dropdown')
1948
+ .addClass('active')
1949
+ }
1950
+
1951
+ active.trigger('activate.bs.scrollspy')
1952
+ }
1953
+
1954
+ ScrollSpy.prototype.clear = function () {
1955
+ $(this.selector)
1956
+ .parentsUntil(this.options.target, '.active')
1957
+ .removeClass('active')
1958
+ }
1959
+
1960
+
1961
+ // SCROLLSPY PLUGIN DEFINITION
1962
+ // ===========================
1963
+
1964
+ function Plugin(option) {
1965
+ return this.each(function () {
1966
+ var $this = $(this)
1967
+ var data = $this.data('bs.scrollspy')
1968
+ var options = typeof option == 'object' && option
1969
+
1970
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
1971
+ if (typeof option == 'string') data[option]()
1972
+ })
1973
+ }
1974
+
1975
+ var old = $.fn.scrollspy
1976
+
1977
+ $.fn.scrollspy = Plugin
1978
+ $.fn.scrollspy.Constructor = ScrollSpy
1979
+
1980
+
1981
+ // SCROLLSPY NO CONFLICT
1982
+ // =====================
1983
+
1984
+ $.fn.scrollspy.noConflict = function () {
1985
+ $.fn.scrollspy = old
1986
+ return this
1987
+ }
1988
+
1989
+
1990
+ // SCROLLSPY DATA-API
1991
+ // ==================
1992
+
1993
+ $(window).on('load.bs.scrollspy.data-api', function () {
1994
+ $('[data-spy="scroll"]').each(function () {
1995
+ var $spy = $(this)
1996
+ Plugin.call($spy, $spy.data())
1997
+ })
1998
+ })
1999
+
2000
+ }(jQuery);
2001
+
2002
+ /* ========================================================================
2003
+ * Bootstrap: tab.js v3.3.4
2004
+ * http://getbootstrap.com/javascript/#tabs
2005
+ * ========================================================================
2006
+ * Copyright 2011-2015 Twitter, Inc.
2007
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2008
+ * ======================================================================== */
2009
+
2010
+
2011
+ +function ($) {
2012
+ 'use strict';
2013
+
2014
+ // TAB CLASS DEFINITION
2015
+ // ====================
2016
+
2017
+ var Tab = function (element) {
2018
+ this.element = $(element)
2019
+ }
2020
+
2021
+ Tab.VERSION = '3.3.4'
2022
+
2023
+ Tab.TRANSITION_DURATION = 150
2024
+
2025
+ Tab.prototype.show = function () {
2026
+ var $this = this.element
2027
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
2028
+ var selector = $this.data('target')
2029
+
2030
+ if (!selector) {
2031
+ selector = $this.attr('href')
2032
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
2033
+ }
2034
+
2035
+ if ($this.parent('li').hasClass('active')) return
2036
+
2037
+ var $previous = $ul.find('.active:last a')
2038
+ var hideEvent = $.Event('hide.bs.tab', {
2039
+ relatedTarget: $this[0]
2040
+ })
2041
+ var showEvent = $.Event('show.bs.tab', {
2042
+ relatedTarget: $previous[0]
2043
+ })
2044
+
2045
+ $previous.trigger(hideEvent)
2046
+ $this.trigger(showEvent)
2047
+
2048
+ if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
2049
+
2050
+ var $target = $(selector)
2051
+
2052
+ this.activate($this.closest('li'), $ul)
2053
+ this.activate($target, $target.parent(), function () {
2054
+ $previous.trigger({
2055
+ type: 'hidden.bs.tab',
2056
+ relatedTarget: $this[0]
2057
+ })
2058
+ $this.trigger({
2059
+ type: 'shown.bs.tab',
2060
+ relatedTarget: $previous[0]
2061
+ })
2062
+ })
2063
+ }
2064
+
2065
+ Tab.prototype.activate = function (element, container, callback) {
2066
+ var $active = container.find('> .active')
2067
+ var transition = callback
2068
+ && $.support.transition
2069
+ && (($active.length && $active.hasClass('fade')) || !!container.find('> .fade').length)
2070
+
2071
+ function next() {
2072
+ $active
2073
+ .removeClass('active')
2074
+ .find('> .dropdown-menu > .active')
2075
+ .removeClass('active')
2076
+ .end()
2077
+ .find('[data-toggle="tab"]')
2078
+ .attr('aria-expanded', false)
2079
+
2080
+ element
2081
+ .addClass('active')
2082
+ .find('[data-toggle="tab"]')
2083
+ .attr('aria-expanded', true)
2084
+
2085
+ if (transition) {
2086
+ element[0].offsetWidth // reflow for transition
2087
+ element.addClass('in')
2088
+ } else {
2089
+ element.removeClass('fade')
2090
+ }
2091
+
2092
+ if (element.parent('.dropdown-menu').length) {
2093
+ element
2094
+ .closest('li.dropdown')
2095
+ .addClass('active')
2096
+ .end()
2097
+ .find('[data-toggle="tab"]')
2098
+ .attr('aria-expanded', true)
2099
+ }
2100
+
2101
+ callback && callback()
2102
+ }
2103
+
2104
+ $active.length && transition ?
2105
+ $active
2106
+ .one('bsTransitionEnd', next)
2107
+ .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
2108
+ next()
2109
+
2110
+ $active.removeClass('in')
2111
+ }
2112
+
2113
+
2114
+ // TAB PLUGIN DEFINITION
2115
+ // =====================
2116
+
2117
+ function Plugin(option) {
2118
+ return this.each(function () {
2119
+ var $this = $(this)
2120
+ var data = $this.data('bs.tab')
2121
+
2122
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
2123
+ if (typeof option == 'string') data[option]()
2124
+ })
2125
+ }
2126
+
2127
+ var old = $.fn.tab
2128
+
2129
+ $.fn.tab = Plugin
2130
+ $.fn.tab.Constructor = Tab
2131
+
2132
+
2133
+ // TAB NO CONFLICT
2134
+ // ===============
2135
+
2136
+ $.fn.tab.noConflict = function () {
2137
+ $.fn.tab = old
2138
+ return this
2139
+ }
2140
+
2141
+
2142
+ // TAB DATA-API
2143
+ // ============
2144
+
2145
+ var clickHandler = function (e) {
2146
+ e.preventDefault()
2147
+ Plugin.call($(this), 'show')
2148
+ }
2149
+
2150
+ $(document)
2151
+ .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
2152
+ .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
2153
+
2154
+ }(jQuery);
2155
+
2156
+ /* ========================================================================
2157
+ * Bootstrap: affix.js v3.3.4
2158
+ * http://getbootstrap.com/javascript/#affix
2159
+ * ========================================================================
2160
+ * Copyright 2011-2015 Twitter, Inc.
2161
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
2162
+ * ======================================================================== */
2163
+
2164
+
2165
+ +function ($) {
2166
+ 'use strict';
2167
+
2168
+ // AFFIX CLASS DEFINITION
2169
+ // ======================
2170
+
2171
+ var Affix = function (element, options) {
2172
+ this.options = $.extend({}, Affix.DEFAULTS, options)
2173
+
2174
+ this.$target = $(this.options.target)
2175
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
2176
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
2177
+
2178
+ this.$element = $(element)
2179
+ this.affixed = null
2180
+ this.unpin = null
2181
+ this.pinnedOffset = null
2182
+
2183
+ this.checkPosition()
2184
+ }
2185
+
2186
+ Affix.VERSION = '3.3.4'
2187
+
2188
+ Affix.RESET = 'affix affix-top affix-bottom'
2189
+
2190
+ Affix.DEFAULTS = {
2191
+ offset: 0,
2192
+ target: window
2193
+ }
2194
+
2195
+ Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
2196
+ var scrollTop = this.$target.scrollTop()
2197
+ var position = this.$element.offset()
2198
+ var targetHeight = this.$target.height()
2199
+
2200
+ if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
2201
+
2202
+ if (this.affixed == 'bottom') {
2203
+ if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
2204
+ return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
2205
+ }
2206
+
2207
+ var initializing = this.affixed == null
2208
+ var colliderTop = initializing ? scrollTop : position.top
2209
+ var colliderHeight = initializing ? targetHeight : height
2210
+
2211
+ if (offsetTop != null && scrollTop <= offsetTop) return 'top'
2212
+ if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
2213
+
2214
+ return false
2215
+ }
2216
+
2217
+ Affix.prototype.getPinnedOffset = function () {
2218
+ if (this.pinnedOffset) return this.pinnedOffset
2219
+ this.$element.removeClass(Affix.RESET).addClass('affix')
2220
+ var scrollTop = this.$target.scrollTop()
2221
+ var position = this.$element.offset()
2222
+ return (this.pinnedOffset = position.top - scrollTop)
2223
+ }
2224
+
2225
+ Affix.prototype.checkPositionWithEventLoop = function () {
2226
+ setTimeout($.proxy(this.checkPosition, this), 1)
2227
+ }
2228
+
2229
+ Affix.prototype.checkPosition = function () {
2230
+ if (!this.$element.is(':visible')) return
2231
+
2232
+ var height = this.$element.height()
2233
+ var offset = this.options.offset
2234
+ var offsetTop = offset.top
2235
+ var offsetBottom = offset.bottom
2236
+ var scrollHeight = $(document.body).height()
2237
+
2238
+ if (typeof offset != 'object') offsetBottom = offsetTop = offset
2239
+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
2240
+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
2241
+
2242
+ var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
2243
+
2244
+ if (this.affixed != affix) {
2245
+ if (this.unpin != null) this.$element.css('top', '')
2246
+
2247
+ var affixType = 'affix' + (affix ? '-' + affix : '')
2248
+ var e = $.Event(affixType + '.bs.affix')
2249
+
2250
+ this.$element.trigger(e)
2251
+
2252
+ if (e.isDefaultPrevented()) return
2253
+
2254
+ this.affixed = affix
2255
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
2256
+
2257
+ this.$element
2258
+ .removeClass(Affix.RESET)
2259
+ .addClass(affixType)
2260
+ .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
2261
+ }
2262
+
2263
+ if (affix == 'bottom') {
2264
+ this.$element.offset({
2265
+ top: scrollHeight - height - offsetBottom
2266
+ })
2267
+ }
2268
+ }
2269
+
2270
+
2271
+ // AFFIX PLUGIN DEFINITION
2272
+ // =======================
2273
+
2274
+ function Plugin(option) {
2275
+ return this.each(function () {
2276
+ var $this = $(this)
2277
+ var data = $this.data('bs.affix')
2278
+ var options = typeof option == 'object' && option
2279
+
2280
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
2281
+ if (typeof option == 'string') data[option]()
2282
+ })
2283
+ }
2284
+
2285
+ var old = $.fn.affix
2286
+
2287
+ $.fn.affix = Plugin
2288
+ $.fn.affix.Constructor = Affix
2289
+
2290
+
2291
+ // AFFIX NO CONFLICT
2292
+ // =================
2293
+
2294
+ $.fn.affix.noConflict = function () {
2295
+ $.fn.affix = old
2296
+ return this
2297
+ }
2298
+
2299
+
2300
+ // AFFIX DATA-API
2301
+ // ==============
2302
+
2303
+ $(window).on('load', function () {
2304
+ $('[data-spy="affix"]').each(function () {
2305
+ var $spy = $(this)
2306
+ var data = $spy.data()
2307
+
2308
+ data.offset = data.offset || {}
2309
+
2310
+ if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
2311
+ if (data.offsetTop != null) data.offset.top = data.offsetTop
2312
+
2313
+ Plugin.call($spy, data)
2314
+ })
2315
+ })
2316
+
2317
+ }(jQuery);
res/bootstrap/js/bootstrap.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Bootstrap v3.3.4 (http://getbootstrap.com)
3
+ * Copyright 2011-2015 Twitter, Inc.
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ */
6
+ if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.4",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a(f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.4",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active"));a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));return a>this.$items.length-1||0>a?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.4",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=c(d),f={relatedTarget:this};e.hasClass("open")&&(e.trigger(b=a.Event("hide.bs.dropdown",f)),b.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger("hidden.bs.dropdown",f)))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.4",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27|32)/.test(b.which)&&!/input|textarea/i.test(b.target.tagName)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g&&27!=b.which||g&&27==b.which)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(b.target);38==b.which&&j>0&&j--,40==b.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="menu"]',g.prototype.keydown).on("keydown.bs.dropdown.data-api",'[role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.4",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in").attr("aria-hidden",!1),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a('<div class="modal-backdrop '+e+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport),this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c&&c.$tip&&c.$tip.is(":visible")?void(c.hoverState="in"):(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.options.container?a(this.options.container):this.$element.parent(),p=this.getPosition(o);h="bottom"==h&&k.bottom+m>p.bottom?"top":"top"==h&&k.top-m<p.top?"bottom":"right"==h&&k.right+l>p.width?"left":"left"==h&&k.left-l<p.left?"right":h,f.removeClass(n).addClass(h)}var q=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(q,h);var r=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",r).emulateTransitionEnd(c.TRANSITION_DURATION):r()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);return this.$element.trigger(g),g.isDefaultPrevented()?void 0:(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=d?{top:0,left:0}:b.offset(),g={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},h=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,g,h,f)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type)})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.4",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.4",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.4",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){
7
+ var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.4",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=a(document.body).height();"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
res/colorbox/colorbox.css ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ Colorbox Core Style:
3
+ The following CSS is consistent between example themes and should not be altered.
4
+ */
5
+ #colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
6
+ #cboxWrapper {max-width:none;}
7
+ #cboxOverlay{position:fixed; width:100%; height:100%;}
8
+ #cboxMiddleLeft, #cboxBottomLeft{clear:left;}
9
+ #cboxContent{position:relative;}
10
+ #cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
11
+ #cboxTitle{margin:0;}
12
+ #cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
13
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
14
+ .cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
15
+ .cboxIframe{width:100%; height:100%; display:block; border:0; padding:0; margin:0;}
16
+ #colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
17
+
18
+ /*
19
+ User Style:
20
+ Change the following styles to modify the appearance of Colorbox. They are
21
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
22
+ */
23
+ #cboxOverlay{background:url(images/overlay.png) repeat 0 0; opacity: 0.9; filter: alpha(opacity = 90);}
24
+ #colorbox{outline:0;}
25
+ #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
26
+ #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
27
+ #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
28
+ #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
29
+ #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
30
+ #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
31
+ #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
32
+ #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
33
+ #cboxContent{background:#fff; overflow:hidden;}
34
+ .cboxIframe{background:#fff;}
35
+ #cboxError{padding:50px; border:1px solid #ccc;}
36
+ #cboxLoadedContent{margin-bottom:28px;}
37
+ #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
38
+ #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
39
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
40
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
41
+
42
+ /* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
43
+ #cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
44
+
45
+ /* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
46
+ #cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
47
+
48
+ #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
49
+ #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
50
+ #cboxPrevious:hover{background-position:-75px -25px;}
51
+ #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
52
+ #cboxNext:hover{background-position:-50px -25px;}
53
+ #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
54
+ #cboxClose:hover{background-position:-25px -25px;}
55
+
56
+ /*
57
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
58
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
59
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
60
+ */
61
+ .cboxIE #cboxTopLeft,
62
+ .cboxIE #cboxTopCenter,
63
+ .cboxIE #cboxTopRight,
64
+ .cboxIE #cboxBottomLeft,
65
+ .cboxIE #cboxBottomCenter,
66
+ .cboxIE #cboxBottomRight,
67
+ .cboxIE #cboxMiddleLeft,
68
+ .cboxIE #cboxMiddleRight {
69
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
70
+ }
res/colorbox/images/border.png ADDED
Binary file
res/colorbox/images/controls.png ADDED
Binary file
res/colorbox/images/loading.gif ADDED
Binary file
res/colorbox/images/loading_background.png ADDED
Binary file
res/colorbox/images/overlay.png ADDED
Binary file
res/colorbox/jquery.colorbox-min.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ /*!
2
+ Colorbox 1.6.1
3
+ license: MIT
4
+ http://www.jacklmoore.com/colorbox
5
+ */
6
+ (function(t,e,i){function n(i,n,o){var r=e.createElement(i);return n&&(r.id=Z+n),o&&(r.style.cssText=o),t(r)}function o(){return i.innerHeight?i.innerHeight:t(i).height()}function r(e,i){i!==Object(i)&&(i={}),this.cache={},this.el=e,this.value=function(e){var n;return void 0===this.cache[e]&&(n=t(this.el).attr("data-cbox-"+e),void 0!==n?this.cache[e]=n:void 0!==i[e]?this.cache[e]=i[e]:void 0!==X[e]&&(this.cache[e]=X[e])),this.cache[e]},this.get=function(e){var i=this.value(e);return t.isFunction(i)?i.call(this.el,this):i}}function h(t){var e=W.length,i=(A+t)%e;return 0>i?e+i:i}function a(t,e){return Math.round((/%/.test(t)?("x"===e?E.width():o())/100:1)*parseInt(t,10))}function s(t,e){return t.get("photo")||t.get("photoRegex").test(e)}function l(t,e){return t.get("retinaUrl")&&i.devicePixelRatio>1?e.replace(t.get("photoRegex"),t.get("retinaSuffix")):e}function d(t){"contains"in y[0]&&!y[0].contains(t.target)&&t.target!==v[0]&&(t.stopPropagation(),y.focus())}function c(t){c.str!==t&&(y.add(v).removeClass(c.str).addClass(t),c.str=t)}function g(e){A=0,e&&e!==!1&&"nofollow"!==e?(W=t("."+te).filter(function(){var i=t.data(this,Y),n=new r(this,i);return n.get("rel")===e}),A=W.index(_.el),-1===A&&(W=W.add(_.el),A=W.length-1)):W=t(_.el)}function u(i){t(e).trigger(i),ae.triggerHandler(i)}function f(i){var o;if(!G){if(o=t(i).data(Y),_=new r(i,o),g(_.get("rel")),!$){$=q=!0,c(_.get("className")),y.css({visibility:"hidden",display:"block",opacity:""}),I=n(se,"LoadedContent","width:0; height:0; overflow:hidden; visibility:hidden"),b.css({width:"",height:""}).append(I),j=T.height()+k.height()+b.outerHeight(!0)-b.height(),D=C.width()+H.width()+b.outerWidth(!0)-b.width(),N=I.outerHeight(!0),z=I.outerWidth(!0);var h=a(_.get("initialWidth"),"x"),s=a(_.get("initialHeight"),"y"),l=_.get("maxWidth"),f=_.get("maxHeight");_.w=(l!==!1?Math.min(h,a(l,"x")):h)-z-D,_.h=(f!==!1?Math.min(s,a(f,"y")):s)-N-j,I.css({width:"",height:_.h}),J.position(),u(ee),_.get("onOpen"),O.add(S).hide(),y.focus(),_.get("trapFocus")&&e.addEventListener&&(e.addEventListener("focus",d,!0),ae.one(re,function(){e.removeEventListener("focus",d,!0)})),_.get("returnFocus")&&ae.one(re,function(){t(_.el).focus()})}var p=parseFloat(_.get("opacity"));v.css({opacity:p===p?p:"",cursor:_.get("overlayClose")?"pointer":"",visibility:"visible"}).show(),_.get("closeButton")?B.html(_.get("close")).appendTo(b):B.appendTo("<div/>"),w()}}function p(){y||(V=!1,E=t(i),y=n(se).attr({id:Y,"class":t.support.opacity===!1?Z+"IE":"",role:"dialog",tabindex:"-1"}).hide(),v=n(se,"Overlay").hide(),M=t([n(se,"LoadingOverlay")[0],n(se,"LoadingGraphic")[0]]),x=n(se,"Wrapper"),b=n(se,"Content").append(S=n(se,"Title"),F=n(se,"Current"),P=t('<button type="button"/>').attr({id:Z+"Previous"}),K=t('<button type="button"/>').attr({id:Z+"Next"}),R=n("button","Slideshow"),M),B=t('<button type="button"/>').attr({id:Z+"Close"}),x.append(n(se).append(n(se,"TopLeft"),T=n(se,"TopCenter"),n(se,"TopRight")),n(se,!1,"clear:left").append(C=n(se,"MiddleLeft"),b,H=n(se,"MiddleRight")),n(se,!1,"clear:left").append(n(se,"BottomLeft"),k=n(se,"BottomCenter"),n(se,"BottomRight"))).find("div div").css({"float":"left"}),L=n(se,!1,"position:absolute; width:9999px; visibility:hidden; display:none; max-width:none;"),O=K.add(P).add(F).add(R)),e.body&&!y.parent().length&&t(e.body).append(v,y.append(x,L))}function m(){function i(t){t.which>1||t.shiftKey||t.altKey||t.metaKey||t.ctrlKey||(t.preventDefault(),f(this))}return y?(V||(V=!0,K.click(function(){J.next()}),P.click(function(){J.prev()}),B.click(function(){J.close()}),v.click(function(){_.get("overlayClose")&&J.close()}),t(e).bind("keydown."+Z,function(t){var e=t.keyCode;$&&_.get("escKey")&&27===e&&(t.preventDefault(),J.close()),$&&_.get("arrowKey")&&W[1]&&!t.altKey&&(37===e?(t.preventDefault(),P.click()):39===e&&(t.preventDefault(),K.click()))}),t.isFunction(t.fn.on)?t(e).on("click."+Z,"."+te,i):t("."+te).live("click."+Z,i)),!0):!1}function w(){var e,o,r,h=J.prep,d=++le;if(q=!0,U=!1,u(he),u(ie),_.get("onLoad"),_.h=_.get("height")?a(_.get("height"),"y")-N-j:_.get("innerHeight")&&a(_.get("innerHeight"),"y"),_.w=_.get("width")?a(_.get("width"),"x")-z-D:_.get("innerWidth")&&a(_.get("innerWidth"),"x"),_.mw=_.w,_.mh=_.h,_.get("maxWidth")&&(_.mw=a(_.get("maxWidth"),"x")-z-D,_.mw=_.w&&_.w<_.mw?_.w:_.mw),_.get("maxHeight")&&(_.mh=a(_.get("maxHeight"),"y")-N-j,_.mh=_.h&&_.h<_.mh?_.h:_.mh),e=_.get("href"),Q=setTimeout(function(){M.show()},100),_.get("inline")){var c=t(e);r=t("<div>").hide().insertBefore(c),ae.one(he,function(){r.replaceWith(c)}),h(c)}else _.get("iframe")?h(" "):_.get("html")?h(_.get("html")):s(_,e)?(e=l(_,e),U=_.get("createImg"),t(U).addClass(Z+"Photo").bind("error."+Z,function(){h(n(se,"Error").html(_.get("imgError")))}).one("load",function(){d===le&&setTimeout(function(){var e;_.get("retinaImage")&&i.devicePixelRatio>1&&(U.height=U.height/i.devicePixelRatio,U.width=U.width/i.devicePixelRatio),_.get("scalePhotos")&&(o=function(){U.height-=U.height*e,U.width-=U.width*e},_.mw&&U.width>_.mw&&(e=(U.width-_.mw)/U.width,o()),_.mh&&U.height>_.mh&&(e=(U.height-_.mh)/U.height,o())),_.h&&(U.style.marginTop=Math.max(_.mh-U.height,0)/2+"px"),W[1]&&(_.get("loop")||W[A+1])&&(U.style.cursor="pointer",t(U).bind("click."+Z,function(){J.next()})),U.style.width=U.width+"px",U.style.height=U.height+"px",h(U)},1)}),U.src=e):e&&L.load(e,_.get("data"),function(e,i){d===le&&h("error"===i?n(se,"Error").html(_.get("xhrError")):t(this).contents())})}var v,y,x,b,T,C,H,k,W,E,I,L,M,S,F,R,K,P,B,O,_,j,D,N,z,A,U,$,q,G,Q,J,V,X={html:!1,photo:!1,iframe:!1,inline:!1,transition:"elastic",speed:300,fadeOut:300,width:!1,initialWidth:"600",innerWidth:!1,maxWidth:!1,height:!1,initialHeight:"450",innerHeight:!1,maxHeight:!1,scalePhotos:!0,scrolling:!0,opacity:.9,preloading:!0,className:!1,overlayClose:!0,escKey:!0,arrowKey:!0,top:!1,bottom:!1,left:!1,right:!1,fixed:!1,data:void 0,closeButton:!0,fastIframe:!0,open:!1,reposition:!0,loop:!0,slideshow:!1,slideshowAuto:!0,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",photoRegex:/\.(gif|png|jp(e|g|eg)|bmp|ico|webp|jxr|svg)((#|\?).*)?$/i,retinaImage:!1,retinaUrl:!1,retinaSuffix:"@2x.$1",current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",returnFocus:!0,trapFocus:!0,onOpen:!1,onLoad:!1,onComplete:!1,onCleanup:!1,onClosed:!1,rel:function(){return this.rel},href:function(){return t(this).attr("href")},title:function(){return this.title},createImg:function(){var e=new Image,i=t(this).data("cbox-img-attrs");return"object"==typeof i&&t.each(i,function(t,i){e[t]=i}),e},createIframe:function(){var i=e.createElement("iframe"),n=t(this).data("cbox-iframe-attrs");return"object"==typeof n&&t.each(n,function(t,e){i[t]=e}),"frameBorder"in i&&(i.frameBorder=0),"allowTransparency"in i&&(i.allowTransparency="true"),i.name=(new Date).getTime(),i.allowFullScreen=!0,i}},Y="colorbox",Z="cbox",te=Z+"Element",ee=Z+"_open",ie=Z+"_load",ne=Z+"_complete",oe=Z+"_cleanup",re=Z+"_closed",he=Z+"_purge",ae=t("<a/>"),se="div",le=0,de={},ce=function(){function t(){clearTimeout(h)}function e(){(_.get("loop")||W[A+1])&&(t(),h=setTimeout(J.next,_.get("slideshowSpeed")))}function i(){R.html(_.get("slideshowStop")).unbind(s).one(s,n),ae.bind(ne,e).bind(ie,t),y.removeClass(a+"off").addClass(a+"on")}function n(){t(),ae.unbind(ne,e).unbind(ie,t),R.html(_.get("slideshowStart")).unbind(s).one(s,function(){J.next(),i()}),y.removeClass(a+"on").addClass(a+"off")}function o(){r=!1,R.hide(),t(),ae.unbind(ne,e).unbind(ie,t),y.removeClass(a+"off "+a+"on")}var r,h,a=Z+"Slideshow_",s="click."+Z;return function(){r?_.get("slideshow")||(ae.unbind(oe,o),o()):_.get("slideshow")&&W[1]&&(r=!0,ae.one(oe,o),_.get("slideshowAuto")?i():n(),R.show())}}();t[Y]||(t(p),J=t.fn[Y]=t[Y]=function(e,i){var n,o=this;return e=e||{},t.isFunction(o)&&(o=t("<a/>"),e.open=!0),o[0]?(p(),m()&&(i&&(e.onComplete=i),o.each(function(){var i=t.data(this,Y)||{};t.data(this,Y,t.extend(i,e))}).addClass(te),n=new r(o[0],e),n.get("open")&&f(o[0])),o):o},J.position=function(e,i){function n(){T[0].style.width=k[0].style.width=b[0].style.width=parseInt(y[0].style.width,10)-D+"px",b[0].style.height=C[0].style.height=H[0].style.height=parseInt(y[0].style.height,10)-j+"px"}var r,h,s,l=0,d=0,c=y.offset();if(E.unbind("resize."+Z),y.css({top:-9e4,left:-9e4}),h=E.scrollTop(),s=E.scrollLeft(),_.get("fixed")?(c.top-=h,c.left-=s,y.css({position:"fixed"})):(l=h,d=s,y.css({position:"absolute"})),d+=_.get("right")!==!1?Math.max(E.width()-_.w-z-D-a(_.get("right"),"x"),0):_.get("left")!==!1?a(_.get("left"),"x"):Math.round(Math.max(E.width()-_.w-z-D,0)/2),l+=_.get("bottom")!==!1?Math.max(o()-_.h-N-j-a(_.get("bottom"),"y"),0):_.get("top")!==!1?a(_.get("top"),"y"):Math.round(Math.max(o()-_.h-N-j,0)/2),y.css({top:c.top,left:c.left,visibility:"visible"}),x[0].style.width=x[0].style.height="9999px",r={width:_.w+z+D,height:_.h+N+j,top:l,left:d},e){var g=0;t.each(r,function(t){return r[t]!==de[t]?(g=e,void 0):void 0}),e=g}de=r,e||y.css(r),y.dequeue().animate(r,{duration:e||0,complete:function(){n(),q=!1,x[0].style.width=_.w+z+D+"px",x[0].style.height=_.h+N+j+"px",_.get("reposition")&&setTimeout(function(){E.bind("resize."+Z,J.position)},1),t.isFunction(i)&&i()},step:n})},J.resize=function(t){var e;$&&(t=t||{},t.width&&(_.w=a(t.width,"x")-z-D),t.innerWidth&&(_.w=a(t.innerWidth,"x")),I.css({width:_.w}),t.height&&(_.h=a(t.height,"y")-N-j),t.innerHeight&&(_.h=a(t.innerHeight,"y")),t.innerHeight||t.height||(e=I.scrollTop(),I.css({height:"auto"}),_.h=I.height()),I.css({height:_.h}),e&&I.scrollTop(e),J.position("none"===_.get("transition")?0:_.get("speed")))},J.prep=function(i){function o(){return _.w=_.w||I.width(),_.w=_.mw&&_.mw<_.w?_.mw:_.w,_.w}function a(){return _.h=_.h||I.height(),_.h=_.mh&&_.mh<_.h?_.mh:_.h,_.h}if($){var d,g="none"===_.get("transition")?0:_.get("speed");I.remove(),I=n(se,"LoadedContent").append(i),I.hide().appendTo(L.show()).css({width:o(),overflow:_.get("scrolling")?"auto":"hidden"}).css({height:a()}).prependTo(b),L.hide(),t(U).css({"float":"none"}),c(_.get("className")),d=function(){function i(){t.support.opacity===!1&&y[0].style.removeAttribute("filter")}var n,o,a=W.length;$&&(o=function(){clearTimeout(Q),M.hide(),u(ne),_.get("onComplete")},S.html(_.get("title")).show(),I.show(),a>1?("string"==typeof _.get("current")&&F.html(_.get("current").replace("{current}",A+1).replace("{total}",a)).show(),K[_.get("loop")||a-1>A?"show":"hide"]().html(_.get("next")),P[_.get("loop")||A?"show":"hide"]().html(_.get("previous")),ce(),_.get("preloading")&&t.each([h(-1),h(1)],function(){var i,n=W[this],o=new r(n,t.data(n,Y)),h=o.get("href");h&&s(o,h)&&(h=l(o,h),i=e.createElement("img"),i.src=h)})):O.hide(),_.get("iframe")?(n=_.get("createIframe"),_.get("scrolling")||(n.scrolling="no"),t(n).attr({src:_.get("href"),"class":Z+"Iframe"}).one("load",o).appendTo(I),ae.one(he,function(){n.src="//about:blank"}),_.get("fastIframe")&&t(n).trigger("load")):o(),"fade"===_.get("transition")?y.fadeTo(g,1,i):i())},"fade"===_.get("transition")?y.fadeTo(g,0,function(){J.position(0,d)}):J.position(g,d)}},J.next=function(){!q&&W[1]&&(_.get("loop")||W[A+1])&&(A=h(1),f(W[A]))},J.prev=function(){!q&&W[1]&&(_.get("loop")||A)&&(A=h(-1),f(W[A]))},J.close=function(){$&&!G&&(G=!0,$=!1,u(oe),_.get("onCleanup"),E.unbind("."+Z),v.fadeTo(_.get("fadeOut")||0,0),y.stop().fadeTo(_.get("fadeOut")||0,0,function(){y.hide(),v.hide(),u(he),I.remove(),setTimeout(function(){G=!1,u(re),_.get("onClosed")},1)}))},J.remove=function(){y&&(y.stop(),t[Y].close(),y.stop(!1,!0).remove(),v.remove(),G=!1,y=null,t("."+te).removeData(Y).removeClass(te),t(e).unbind("click."+Z).unbind("keydown."+Z))},J.element=function(){return t(_.el)},J.settings=X)})(jQuery,document,window);
res/css/admin.css ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .egg-container .deckgrid[deckgrid]::before {
2
+ content: '4 .col-md-3';
3
+ font-size: 0;
4
+ visibility: hidden;
5
+ }
6
+
7
+ .egg-container .animation-fade {
8
+ opacity:0;
9
+ }
10
+
11
+ .egg-container .animation-faded {
12
+ opacity:1;
13
+ }
14
+
15
+ .egg-container .animation-faded {
16
+ -webkit-transition: opacity 1s linear .2s;
17
+ -moz-transition: opacity 1s linear .2s;
18
+ -o-transition: opacity 1s linear .2s;
19
+ transition: opacity 1s linear .2s;
20
+ }
21
+
22
+ .egg-container .thumbnail-meta {
23
+ min-height:100px;
24
+ }
25
+
26
+ .egg-container .thumbnail:hover {
27
+ background: #f5f5f5 !important;
28
+ opacity: 1 !important;;
29
+ }
30
+
31
+ .egg-container .result_added{
32
+ opacity: 0.15 !important;
33
+ cursor: default !important;
34
+ }
35
+
36
+ .egg-container .search_panel, .egg-container .data_panel{
37
+ padding-top: 15px;
38
+ padding-bottom: 50px;
39
+ }
40
+
41
+ .egg-container .search_results, .egg-container .data_results{
42
+ max-height: 600px;
43
+ overflow-y:scroll;
44
+ padding-right: 20px;
45
+ }
46
+
47
+ .egg-container .search_results a {
48
+ cursor: pointer;
49
+ }
50
+
51
+ .egg-container a {
52
+ cursor: pointer;
53
+ }
54
+
55
+ .egg-container .added_data:hover{
56
+ background-color: #f5f5f5;
57
+ }
58
+
59
+ .egg-container .search_results_row{
60
+ cursor: pointer !important;
61
+ padding-bottom: 1px;
62
+ }
63
+
64
+ .egg-container .search_results_row:hover {
65
+ background: #f5f5f5;
66
+ }
67
+
68
+ .cegg-wrap {
69
+ position:relative;
70
+ }
71
+
72
+ .cegg-maincol {
73
+ margin-right: 260px;
74
+ }
75
+ .cegg-rightcol {
76
+ position: absolute;
77
+ width: 250px;
78
+ right: 0;
79
+ top: 0px;
80
+ }
81
+
82
+ @media (max-width:600px) {
83
+ .cegg-leftcol {margin: 0 0 20px 0}
84
+ .cegg-maincol {width: 100%; position:static}
85
+ }
86
+
87
+ .cegg-box {
88
+ border:1px solid #337ab7;
89
+ background-color:#fff;
90
+ padding:10px;
91
+ max-width:200px;
92
+ }
93
+
94
+ .cegg-box ul li {
95
+ padding-left: 15px;
96
+ }
97
+
98
+ .cegg_required{
99
+ color: #e32;
100
+ }
101
+
102
+ .cegg-pro-label
103
+ {
104
+ display: inline;
105
+ padding: .2em .6em .3em;
106
+ font-size: 45%;
107
+ font-weight: bold;
108
+ color: #fff;
109
+ text-align: center;
110
+ white-space: nowrap;
111
+ vertical-align: baseline;
112
+ border-radius: .25em;
113
+ background-color: #337ab7;
114
+ position: relative;
115
+ top: -15px;
116
+ }
res/css/products.css ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .egg-container .products .rating > span {
2
+ display: inline-block;
3
+ position: relative;
4
+ font-size: 30px;
5
+ color: #337ACE;
6
+ }
7
+
8
+ .egg-container .products .rating_small > span {
9
+ display: inline-block;
10
+ position: relative;
11
+ font-size: 16px;
12
+ color: #337ACE;
13
+ }
14
+
15
+ .egg-container .products .rating_default > span {
16
+ display: inline-block;
17
+ position: relative;
18
+ font-size: 22px;
19
+ color: #337ACE;
20
+ }
21
+
22
+ .egg-container .products .cegg-price{
23
+ font-size: 32px;
24
+ line-height: 30px;
25
+ }
26
+ .egg-container .products .cegg-price small{
27
+ font-size: 22px;
28
+ }
29
+ .egg-container .products .offer_price{
30
+ font-weight: bold;
31
+ }
32
+ .egg-container .products span{
33
+ font-size: 14px;
34
+ font-weight: normal;
35
+ }
36
+ .egg-container .products .v-align{
37
+ vertical-align: middle;
38
+ }
39
+
40
+
41
+
42
+
43
+ .egg-container .productbox {
44
+ background-color:#ffffff;
45
+ margin-bottom:10px;
46
+ padding-bottom:10px;
47
+ border: 1px solid white;
48
+ }
49
+ .egg-container .productbox:hover {
50
+ -webkit-box-shadow: 0 8px 6px -6px #999;
51
+ -moz-box-shadow: 0 8px 6px -6px #999;
52
+ box-shadow: 0 8px 6px -6px #999;
53
+ border: 1px solid #ccc;
54
+
55
+ }
56
+ .egg-container .producttitle, .egg-container .producttitle a {
57
+ color: black;
58
+ padding:5px 0 5px 0;
59
+ font-weight:bold;
60
+ line-height: 20px;
61
+
62
+ }
63
+
64
+ .egg-container .producttitle span {
65
+ font-weight:normal;
66
+ color: gray;
67
+ display: block;
68
+ line-height: 20px;
69
+ }
70
+
71
+ .egg-container .productprice {
72
+ color: black;
73
+ font-weight:bold;
74
+ line-height: 20px;
75
+ }
76
+
77
+ .egg-container .productprice strike {
78
+ color: grey;
79
+ font-weight:normal;
80
+ }
81
+
82
+ .egg-container .productprice span {
83
+ font-weight:normal;
84
+ }
85
+
86
+ .egg-container .productbox img{
87
+ border: 0 none;
88
+ box-shadow: none;
89
+ }
90
+
91
+ .egg-container .cegg-promotion {
92
+ line-height: 18px;
93
+ }
94
+ .egg-container .cegg-promotion {
95
+ border-radius: 4px;
96
+ top: 25px;
97
+ left: 0;
98
+ height: 24px;
99
+ position: absolute;
100
+ width: auto;
101
+ z-index: 10;
102
+ }
103
+ .egg-container .cegg-discount {
104
+ background: none repeat scroll 0 0 #eb5e58;
105
+ border-radius: 0 4px 4px 0;
106
+ color: #fff;
107
+ display: inline-block;
108
+ float: left;
109
+ font-size: 16px;
110
+ font-weight: lighter;
111
+ height: 100%;
112
+ padding: 3px 5px;
113
+ }
114
+
115
+ .egg-container .egg-padding-top {
116
+ padding-top: 22px;
117
+ }
118
+
119
+ .borderless tbody tr td, .borderless tbody tr th, .borderless thead tr th {
120
+ border: none;
121
+ }
122
+
123
+ .borderless td, .borderless th {
124
+ border: none;
125
+ }
res/img/loader.gif ADDED
Binary file
res/img/loader2.gif ADDED
Binary file
res/img/status-active.png ADDED
Binary file
res/img/status-inactive.png ADDED
Binary file
res/justified_gallery/jquery.justifiedGallery.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Justified Gallery - v3.6.0
3
+ * http://miromannino.github.io/Justified-Gallery/
4
+ * Copyright (c) 2015 Miro Mannino
5
+ * Licensed under the MIT license.
6
+ */
7
+ !function(a){var b=function(b,c){this.settings=c,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,aspectRatio:0},this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=c.border>=0?c.border:c.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.spinner={phase:0,timeSlot:150,$el:a('<div class="spinner"><span></span><span></span><span></span></div>'),intervalId:null},this.checkWidthIntervalId=null,this.galleryWidth=b.width(),this.$gallery=b};b.prototype.getSuffix=function(a,b){var c,d;for(c=a>b?a:b,d=0;d<this.suffixRanges.length;d++)if(c<=this.suffixRanges[d])return this.settings.sizeRangeSuffixes[this.suffixRanges[d]];return this.settings.sizeRangeSuffixes[this.suffixRanges[d-1]]},b.prototype.removeSuffix=function(a,b){return a.substring(0,a.length-b.length)},b.prototype.endsWith=function(a,b){return-1!==a.indexOf(b,a.length-b.length)},b.prototype.getUsedSuffix=function(a){for(var b in this.settings.sizeRangeSuffixes)if(this.settings.sizeRangeSuffixes.hasOwnProperty(b)){if(0===this.settings.sizeRangeSuffixes[b].length)continue;if(this.endsWith(a,this.settings.sizeRangeSuffixes[b]))return this.settings.sizeRangeSuffixes[b]}return""},b.prototype.newSrc=function(a,b,c){var d=a.match(this.settings.extension),e=null!=d?d[0]:"",f=a.replace(this.settings.extension,"");return f=this.removeSuffix(f,this.getUsedSuffix(f)),f+=this.getSuffix(b,c)+e},b.prototype.showImg=function(a,b){this.settings.cssAnimation?(a.addClass("entry-visible"),b&&b()):a.stop().fadeTo(this.settings.imagesAnimationDuration,1,b)},b.prototype.extractImgSrcFromImage=function(a){var b="undefined"!=typeof a.data("safe-src")?a.data("safe-src"):a.attr("src");return a.data("jg.originalSrc",b),b},b.prototype.imgFromEntry=function(a){var b=a.find("> img");return 0===b.length&&(b=a.find("> a > img")),0===b.length?null:b},b.prototype.captionFromEntry=function(a){var b=a.find("> .caption");return 0===b.length?null:b},b.prototype.displayEntry=function(b,c,d,e,f,g){b.width(e),b.height(g),b.css("top",d),b.css("left",c);var h=this.imgFromEntry(b);if(null!==h){h.css("width",e),h.css("height",f),h.css("margin-left",-e/2),h.css("margin-top",-f/2);var i=h.attr("src"),j=this.newSrc(i,e,f);h.one("error",function(){h.attr("src",h.data("jg.originalSrc"))});var k=function(){i!==j&&h.attr("src",j)};"skipped"===b.data("jg.loaded")?this.onImageEvent(i,a.proxy(function(){this.showImg(b,k),b.data("jg.loaded",!0)},this)):this.showImg(b,k)}else this.showImg(b);this.displayEntryCaption(b)},b.prototype.displayEntryCaption=function(b){var c=this.imgFromEntry(b);if(null!==c&&this.settings.captions){var d=this.captionFromEntry(b);if(null==d){var e=c.attr("alt");"undefined"==typeof e&&(e=b.attr("title")),"undefined"!=typeof e&&(d=a('<div class="caption">'+e+"</div>"),b.append(d),b.data("jg.createdCaption",!0))}null!==d&&(this.settings.cssAnimation||d.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(b))}else this.removeCaptionEventsHandlers(b)},b.prototype.onEntryMouseEnterForCaption=function(b){var c=this.captionFromEntry(a(b.currentTarget));this.settings.cssAnimation?c.addClass("caption-visible").removeClass("caption-hidden"):c.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.visibleOpacity)},b.prototype.onEntryMouseLeaveForCaption=function(b){var c=this.captionFromEntry(a(b.currentTarget));this.settings.cssAnimation?c.removeClass("caption-visible").removeClass("caption-hidden"):c.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.nonVisibleOpacity)},b.prototype.addCaptionEventsHandlers=function(b){var c=b.data("jg.captionMouseEvents");"undefined"==typeof c&&(c={mouseenter:a.proxy(this.onEntryMouseEnterForCaption,this),mouseleave:a.proxy(this.onEntryMouseLeaveForCaption,this)},b.on("mouseenter",void 0,void 0,c.mouseenter),b.on("mouseleave",void 0,void 0,c.mouseleave),b.data("jg.captionMouseEvents",c))},b.prototype.removeCaptionEventsHandlers=function(a){var b=a.data("jg.captionMouseEvents");"undefined"!=typeof b&&(a.off("mouseenter",void 0,b.mouseenter),a.off("mouseleave",void 0,b.mouseleave),a.removeData("jg.captionMouseEvents"))},b.prototype.prepareBuildingRow=function(a){var b,c,d,e,f,g=!0,h=0,i=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,j=i/this.buildingRow.aspectRatio,k=this.buildingRow.width/i>this.settings.justifyThreshold;if(a&&"hide"===this.settings.lastRow&&!k){for(b=0;b<this.buildingRow.entriesBuff.length;b++)c=this.buildingRow.entriesBuff[b],this.settings.cssAnimation?c.removeClass("entry-visible"):c.stop().fadeTo(0,0);return-1}for(a&&!k&&"nojustify"===this.settings.lastRow&&(g=!1),b=0;b<this.buildingRow.entriesBuff.length;b++)c=this.buildingRow.entriesBuff[b],d=c.data("jg.width")/c.data("jg.height"),g?(e=b===this.buildingRow.entriesBuff.length-1?i:j*d,f=j):(e=this.settings.rowHeight*d,f=this.settings.rowHeight),i-=Math.round(e),c.data("jg.jwidth",Math.round(e)),c.data("jg.jheight",Math.ceil(f)),(0===b||h>f)&&(h=f);return this.settings.fixedHeight&&h>this.settings.rowHeight&&(h=this.settings.rowHeight),{minHeight:h,justify:g}},b.prototype.clearBuildingRow=function(){this.buildingRow.entriesBuff=[],this.buildingRow.aspectRatio=0,this.buildingRow.width=0},b.prototype.flushRow=function(a){var b,c,d,e=this.settings,f=this.border;if(d=this.prepareBuildingRow(a),c=d.minHeight,a&&"hide"===e.lastRow&&-1===c)return void this.clearBuildingRow();this.maxRowHeight.percentage?this.maxRowHeight.value*e.rowHeight<c&&(c=this.maxRowHeight.value*e.rowHeight):this.maxRowHeight.value>0&&this.maxRowHeight.value<c&&(c=this.maxRowHeight.value);for(var g=0;g<this.buildingRow.entriesBuff.length;g++)b=this.buildingRow.entriesBuff[g],this.displayEntry(b,f,this.offY,b.data("jg.jwidth"),b.data("jg.jheight"),c),f+=b.data("jg.jwidth")+e.margins;this.$gallery.height(this.offY+c+this.border+(this.isSpinnerActive()?this.getSpinnerHeight():0)),(!a||c<=this.settings.rowHeight&&d.justify)&&(this.offY+=c+this.settings.margins,this.clearBuildingRow(),this.$gallery.trigger("jg.rowflush"))},b.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(a.proxy(function(){var a=parseInt(this.$gallery.width(),10);this.galleryWidth!==a&&(this.galleryWidth=a,this.rewind(),this.startImgAnalyzer(!0))},this),this.settings.refreshTime)},b.prototype.isSpinnerActive=function(){return null!=this.spinner.intervalId},b.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},b.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.$gallery.height(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},b.prototype.startLoadingSpinnerAnimation=function(){var a=this.spinner,b=a.$el.find("span");clearInterval(a.intervalId),this.$gallery.append(a.$el),this.$gallery.height(this.offY+this.getSpinnerHeight()),a.intervalId=setInterval(function(){a.phase<b.length?b.eq(a.phase).fadeTo(a.timeSlot,1):b.eq(a.phase-b.length).fadeTo(a.timeSlot,0),a.phase=(a.phase+1)%(2*b.length)},a.timeSlot)},b.prototype.rewind=function(){this.lastAnalyzedIndex=-1,this.offY=this.border,this.clearBuildingRow()},b.prototype.hideBuildingRowImages=function(){for(var a=0;a<this.buildingRow.entriesBuff.length;a++)this.settings.cssAnimation?this.buildingRow.entriesBuff[a].removeClass("entry-visible"):this.buildingRow.entriesBuff[a].stop().fadeTo(0,0)},b.prototype.updateEntries=function(b){return this.entries=this.$gallery.find(this.settings.selector).toArray(),0===this.entries.length?!1:(this.settings.filter?this.modifyEntries(this.filterArray,b):this.modifyEntries(this.resetFilters,b),a.isFunction(this.settings.sort)?this.modifyEntries(this.sortArray,b):this.settings.randomize&&this.modifyEntries(this.shuffleArray,b),!0)},b.prototype.insertToGallery=function(b){var c=this;a.each(b,function(){a(this).appendTo(c.$gallery)})},b.prototype.shuffleArray=function(a){var b,c,d;for(b=a.length-1;b>0;b--)c=Math.floor(Math.random()*(b+1)),d=a[b],a[b]=a[c],a[c]=d;return this.insertToGallery(a),a},b.prototype.sortArray=function(a){return a.sort(this.settings.sort),this.insertToGallery(a),a},b.prototype.resetFilters=function(b){for(var c=0;c<b.length;c++)a(b[c]).removeClass("jg-filtered");return b},b.prototype.filterArray=function(b){var c=this.settings;return"string"===a.type(c.filter)?b.filter(function(b){var d=a(b);return d.is(c.filter)?(d.removeClass("jg-filtered"),!0):(d.addClass("jg-filtered"),!1)}):a.isFunction(c.filter)?b.filter(c.filter):void 0},b.prototype.modifyEntries=function(a,b){var c=b?this.entries.splice(this.lastAnalyzedIndex+1,this.entries.length-this.lastAnalyzedIndex-1):this.entries;c=a.call(this,c),this.entries=b?this.entries.concat(c):c},b.prototype.destroy=function(){clearInterval(this.checkWidthIntervalId),a.each(this.entries,a.proxy(function(b,c){var d=a(c);d.css("width",""),d.css("height",""),d.css("top",""),d.css("left",""),d.data("jg.loaded",void 0),d.removeClass("jg-entry");var e=this.imgFromEntry(d);e.css("width",""),e.css("height",""),e.css("margin-left",""),e.css("margin-top",""),e.attr("src",e.data("jg.originalSrc")),e.data("jg.originalSrc",void 0),this.removeCaptionEventsHandlers(d);var f=this.captionFromEntry(d);d.data("jg.createdCaption")?(d.data("jg.createdCaption",void 0),null!=f&&f.remove()):null!=f&&f.fadeTo(0,1)},this)),this.$gallery.css("height",""),this.$gallery.removeClass("justified-gallery"),this.$gallery.data("jg.controller",void 0)},b.prototype.analyzeImages=function(b){for(var c=this.lastAnalyzedIndex+1;c<this.entries.length;c++){var d=a(this.entries[c]);if(d.data("jg.loaded")===!0||"skipped"===d.data("jg.loaded")){var e=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,f=d.data("jg.width")/d.data("jg.height");if(e/(this.buildingRow.aspectRatio+f)<this.settings.rowHeight&&(this.flushRow(!1),++this.yield.flushed>=this.yield.every))return void this.startImgAnalyzer(b);this.buildingRow.entriesBuff.push(d),this.buildingRow.aspectRatio+=f,this.buildingRow.width+=f*this.settings.rowHeight,this.lastAnalyzedIndex=c}else if("error"!==d.data("jg.loaded"))return}this.buildingRow.entriesBuff.length>0&&this.flushRow(!0),this.isSpinnerActive()&&this.stopLoadingSpinnerAnimation(),this.stopImgAnalyzerStarter(),this.$gallery.trigger(b?"jg.resize":"jg.complete")},b.prototype.stopImgAnalyzerStarter=function(){this.yield.flushed=0,null!==this.imgAnalyzerTimeout&&clearTimeout(this.imgAnalyzerTimeout)},b.prototype.startImgAnalyzer=function(a){var b=this;this.stopImgAnalyzerStarter(),this.imgAnalyzerTimeout=setTimeout(function(){b.analyzeImages(a)},.001)},b.prototype.onImageEvent=function(b,c,d){if(c||d){var e=new Image,f=a(e);c&&f.one("load",function(){f.off("load error"),c(e)}),d&&f.one("error",function(){f.off("load error"),d(e)}),e.src=b}},b.prototype.init=function(){var b=!1,c=!1,d=this;a.each(this.entries,function(e,f){var g=a(f),h=d.imgFromEntry(g);if(g.addClass("jg-entry"),g.data("jg.loaded")!==!0&&"skipped"!==g.data("jg.loaded"))if(null!==d.settings.rel&&g.attr("rel",d.settings.rel),null!==d.settings.target&&g.attr("target",d.settings.target),null!==h){var i=d.extractImgSrcFromImage(h);if(h.attr("src",i),d.settings.waitThumbnailsLoad===!1){var j=parseInt(h.attr("width"),10),k=parseInt(h.attr("height"),10);if(!isNaN(j)&&!isNaN(k))return g.data("jg.width",j),g.data("jg.height",k),g.data("jg.loaded","skipped"),c=!0,d.startImgAnalyzer(!1),!0}g.data("jg.loaded",!1),b=!0,d.isSpinnerActive()||d.startLoadingSpinnerAnimation(),d.onImageEvent(i,function(a){g.data("jg.width",a.width),g.data("jg.height",a.height),g.data("jg.loaded",!0),d.startImgAnalyzer(!1)},function(){g.data("jg.loaded","error"),d.startImgAnalyzer(!1)})}else g.data("jg.loaded",!0),g.data("jg.width",g.width()|g.css("width")|1),g.data("jg.height",g.height()|g.css("height")|1)}),b||c||this.startImgAnalyzer(!1),this.checkWidth()},b.prototype.checkOrConvertNumber=function(b,c){if("string"===a.type(b[c])&&(b[c]=parseFloat(b[c])),"number"!==a.type(b[c]))throw c+" must be a number";if(isNaN(b[c]))throw"invalid number for "+c},b.prototype.checkSizeRangesSuffixes=function(){if("object"!==a.type(this.settings.sizeRangeSuffixes))throw"sizeRangeSuffixes must be defined and must be an object";var b=[];for(var c in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(c)&&b.push(c);for(var d={0:""},e=0;e<b.length;e++)if("string"===a.type(b[e]))try{var f=parseInt(b[e].replace(/^[a-z]+/,""),10);d[f]=this.settings.sizeRangeSuffixes[b[e]]}catch(g){throw"sizeRangeSuffixes keys must contains correct numbers ("+g+")"}else d[b[e]]=this.settings.sizeRangeSuffixes[b[e]];this.settings.sizeRangeSuffixes=d},b.prototype.retrieveMaxRowHeight=function(){var b={};if("string"===a.type(this.settings.maxRowHeight))this.settings.maxRowHeight.match(/^[0-9]+%$/)?(b.value=parseFloat(this.settings.maxRowHeight.match(/^([0-9])+%$/)[1])/100,b.percentage=!1):(b.value=parseFloat(this.settings.maxRowHeight),b.percentage=!0);else{if("number"!==a.type(this.settings.maxRowHeight))throw"maxRowHeight must be a number or a percentage";b.value=this.settings.maxRowHeight,b.percentage=!1}if(isNaN(b.value))throw"invalid number for maxRowHeight";return b.percentage?b.value<100&&(b.value=100):b.value>0&&b.value<this.settings.rowHeight&&(b.value=this.settings.rowHeight),b},b.prototype.checkSettings=function(){if(this.checkSizeRangesSuffixes(),this.checkOrConvertNumber(this.settings,"rowHeight"),this.checkOrConvertNumber(this.settings,"margins"),this.checkOrConvertNumber(this.settings,"border"),"nojustify"!==this.settings.lastRow&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow)throw'lastRow must be "nojustify", "justify" or "hide"';if(this.checkOrConvertNumber(this.settings,"justifyThreshold"),this.settings.justifyThreshold<0||this.settings.justifyThreshold>1)throw"justifyThreshold must be in the interval [0,1]";if("boolean"!==a.type(this.settings.cssAnimation))throw"cssAnimation must be a boolean";if("boolean"!==a.type(this.settings.captions))throw"captions must be a boolean";if(this.checkOrConvertNumber(this.settings.captionSettings,"animationDuration"),this.checkOrConvertNumber(this.settings.captionSettings,"visibleOpacity"),this.settings.captionSettings.visibleOpacity<0||this.settings.captionSettings.visibleOpacity>1)throw"captionSettings.visibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings.captionSettings,"nonVisibleOpacity"),this.settings.captionSettings.nonVisibleOpacity<0||this.settings.captionSettings.nonVisibleOpacity>1)throw"captionSettings.nonVisibleOpacity must be in the interval [0, 1]";if("boolean"!==a.type(this.settings.fixedHeight))throw"fixedHeight must be a boolean";if(this.checkOrConvertNumber(this.settings,"imagesAnimationDuration"),this.checkOrConvertNumber(this.settings,"refreshTime"),"boolean"!==a.type(this.settings.randomize))throw"randomize must be a boolean";if("string"!==a.type(this.settings.selector))throw"selector must be a string";if(this.settings.sort!==!1&&!a.isFunction(this.settings.sort))throw"sort must be false or a comparison function";if(this.settings.filter!==!1&&!a.isFunction(this.settings.sort)&&"string"!==a.type(this.settings.filter))throw"filter must be false, a string or a filter function"},b.prototype.retrieveSuffixRanges=function(){var a=[];for(var b in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(b)&&a.push(parseInt(b,10));return a.sort(function(a,b){return a>b?1:b>a?-1:0}),a},b.prototype.updateSettings=function(b){this.settings=a.extend({},this.settings,b),this.checkSettings(),this.border=this.settings.border>=0?this.settings.border:this.settings.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges()},a.fn.justifiedGallery=function(c){return this.each(function(d,e){var f=a(e);f.addClass("justified-gallery");var g=f.data("jg.controller");if("undefined"==typeof g){if("undefined"!=typeof c&&null!==c&&"object"!==a.type(c))throw"The argument must be an object";g=new b(f,a.extend({},a.fn.justifiedGallery.defaults,c)),f.data("jg.controller",g)}else if("norewind"===c)g.hideBuildingRowImages();else{if("destroy"===c)return void g.destroy();g.updateSettings(c),g.rewind()}g.updateEntries("norewind"===c)&&g.init()})},a.fn.justifiedGallery.defaults={sizeRangeSuffixes:{},rowHeight:120,maxRowHeight:"200%",margins:1,border:-1,lastRow:"nojustify",justifyThreshold:.75,fixedHeight:!1,waitThumbnailsLoad:!0,captions:!0,cssAnimation:!1,imagesAnimationDuration:500,captionSettings:{animationDuration:500,visibleOpacity:.7,nonVisibleOpacity:0},rel:null,target:null,extension:/\.[^.\\/]+$/,refreshTime:100,randomize:!1,sort:!1,filter:!1,selector:"> a, > div:not(.spinner)"}}(jQuery);
res/justified_gallery/justifiedGallery.min.css ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ /*!
2
+ * Justified Gallery - v3.6.0
3
+ * http://miromannino.github.io/Justified-Gallery/
4
+ * Copyright (c) 2015 Miro Mannino
5
+ * Licensed under the MIT license.
6
+ */
7
+ @-webkit-keyframes justified-gallery-show-caption-animation{from{opacity:0}to{opacity:.7}}@-moz-keyframes justified-gallery-show-caption-animation{from{opacity:0}to{opacity:.7}}@-o-keyframes justified-gallery-show-caption-animation{from{opacity:0}to{opacity:.7}}@keyframes justified-gallery-show-caption-animation{from{opacity:0}to{opacity:.7}}@-webkit-keyframes justified-gallery-show-entry-animation{from{opacity:0}to{opacity:1}}@-moz-keyframes justified-gallery-show-entry-animation{from{opacity:0}to{opacity:1}}@-o-keyframes justified-gallery-show-entry-animation{from{opacity:0}to{opacity:1}}@keyframes justified-gallery-show-entry-animation{from{opacity:0}to{opacity:1}}.justified-gallery{width:100%;position:relative;overflow:hidden}.justified-gallery>a,.justified-gallery>div{position:absolute;display:inline-block;overflow:hidden;opacity:0;filter:alpha(opacity=0)}.justified-gallery>a>img,.justified-gallery>div>img,.justified-gallery>a>a>img,.justified-gallery>div>a>img{position:absolute;top:50%;left:50%;margin:0;padding:0;border:0}.justified-gallery>a>.caption,.justified-gallery>div>.caption{display:none;position:absolute;bottom:0;padding:5px;background-color:#000;left:0;right:0;margin:0;color:#fff;font-size:12px;font-weight:300;font-family:sans-serif}.justified-gallery>a>.caption.caption-visible,.justified-gallery>div>.caption.caption-visible{display:initial;opacity:.7;filter:"alpha(opacity=70)";-webkit-animation:justified-gallery-show-caption-animation 500ms 0 ease;-moz-animation:justified-gallery-show-caption-animation 500ms 0 ease;-ms-animation:justified-gallery-show-caption-animation 500ms 0 ease}.justified-gallery>.entry-visible{opacity:1;filter:alpha(opacity=100);-webkit-animation:justified-gallery-show-entry-animation 500ms 0 ease;-moz-animation:justified-gallery-show-entry-animation 500ms 0 ease;-ms-animation:justified-gallery-show-entry-animation 500ms 0 ease}.justified-gallery>.jg-filtered{display:none}.justified-gallery>.spinner{position:absolute;bottom:0;margin-left:-24px;padding:10px 0;left:50%;opacity:initial;filter:initial;overflow:initial}.justified-gallery>.spinner>span{display:inline-block;opacity:0;filter:alpha(opacity=0);width:8px;height:8px;margin:0 4px;background-color:#000;border-top-left-radius:6px;border-top-right-radius:6px;border-bottom-right-radius:6px;border-bottom-left-radius:6px}