Version 4.0.13.1
This commit is contained in:
1 parent
f9e857d255
commit
c6a86f0d9b
7517 files changed
+597400
-668041
No files matched your search
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Gallery Application Class
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2014 Invision Power Services, Inc.
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version
|
||||
*/
|
||||
|
||||
namespace IPS\gallery;
|
||||
|
||||
/**
|
||||
* Gallery Application Class
|
||||
*/
|
||||
class _Application extends \IPS\Application
|
||||
{
|
||||
/**
|
||||
* Init
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function init()
|
||||
{
|
||||
/* If the viewing member cannot view the board (ex: guests must login first), then send a 404 Not Found header here, before the Login page shows in the dispatcher */
|
||||
if ( \IPS\Dispatcher::hasInstance() AND \IPS\Dispatcher::i()->controllerLocation === 'front')
|
||||
{
|
||||
if ( !\IPS\Member::loggedIn()->group['g_view_board'] and ( \IPS\Request::i()->module == 'gallery' and \IPS\Request::i()->controller == 'browse' and \IPS\Request::i()->do == 'rss' )
|
||||
or ( \IPS\Member::loggedIn()->members_bitoptions['remove_gallery_access'] )
|
||||
)
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G218/1', 404, '' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [Node] Get Icon for tree
|
||||
*
|
||||
* @note Return the class for the icon (e.g. 'globe')
|
||||
* @return string|null
|
||||
*/
|
||||
protected function get__icon()
|
||||
{
|
||||
return 'camera';
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"gallery": {
|
||||
"categories": {
|
||||
"tab": "community",
|
||||
"controller": "categories",
|
||||
"do": "",
|
||||
"restriction": "categories_manage"
|
||||
},
|
||||
"settings": {
|
||||
"tab": "community",
|
||||
"controller": "settings",
|
||||
"do": "",
|
||||
"restriction": "settings_manage"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"diskspace": {
|
||||
"tab": "stats",
|
||||
"controller": "diskspace",
|
||||
"do": "",
|
||||
"restriction": "diskspace_manage"
|
||||
},
|
||||
"bandwidth": {
|
||||
"tab": "stats",
|
||||
"controller": "bandwidth",
|
||||
"do": "",
|
||||
"restriction": "bandwidth_manage"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"gallery": {
|
||||
"categories": {
|
||||
"categories_manage": "categories_manage"
|
||||
},
|
||||
"albums": {
|
||||
"albums_manage": "albums_manage"
|
||||
},
|
||||
"settings": {
|
||||
"settings_manage": "settings_manage"
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"diskspace": {
|
||||
"diskspace_manage": "diskspace_manage"
|
||||
},
|
||||
"bandwidth": {
|
||||
"bandwidth_manage": "bandwidth_manage"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"app=gallery&module=gallery&controller=categories":{"lang_key":"menu__gallery_gallery_categories","restriction":"categories_manage","keywords":["gallery categories","image categories"]},"app=gallery&module=gallery&controller=settings&searchResult=form_gallery_large_dims":{"lang_key":"gallery_large_dims","restriction":"settings_manage","keywords":["image dimensions","image size"]},"app=gallery&module=gallery&controller=settings&searchResult=form_gallery_use_square_thumbnails":{"lang_key":"gallery_use_square_thumbnails","restriction":"settings_manage","keywords":["thumbnails"]},"app=gallery&module=gallery&controller=settings&searchResult=form_gallery_watermark_path":{"lang_key":"gallery_watermark_path","restriction":"settings_manage","keywords":["watermark"]},"app=gallery&module=gallery&controller=settings&searchResult=form_gallery_detailed_bandwidth":{"lang_key":"gallery_detailed_bandwidth","restriction":"settings_manage","keywords":["bandwidth"]},"app=gallery&module=gallery&controller=settings&searchResult=form_gallery_rss_enabled":{"lang_key":"gallery_rss_enabled","restriction":"settings_manage","keywords":["image rss","gallery rss"]},"app=gallery&module=stats&controller=diskspace":{"lang_key":"menu__gallery_stats_diskspace","restriction":"diskspace_manage","keywords":["top uploaders"]},"app=gallery&module=stats&controller=bandwidth":{"lang_key":"menu__gallery_stats_bandwidth","restriction":"bandwidth_manage","keywords":["bandwidth"]}}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"application_title": "Gallery",
|
||||
"app_author": "Invision Power Services, Inc.",
|
||||
"app_directory": "gallery",
|
||||
"app_protected": 0,
|
||||
"app_website": null,
|
||||
"app_update_check": null
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<emails><template><template_app>gallery</template_app><template_name>digests__item</template_name><template_content_html><![CDATA[<tr style='border-bottom: 1px solid #eeeeee'>
|
||||
<td width='120' align='center' valign='top'>
|
||||
<img src='{$image->thumb_file_name}' style='border: 1px solid #000; vertical-align: middle;' width='100' height='100'>
|
||||
</td>
|
||||
<td align='left'>
|
||||
<p style='font-family: "Helvetica Neue", helvetica, sans-serif; margin: 0; font-size: 13px; font-weight: bold'>
|
||||
{$email->language->addToStack("x_added_image_in", FALSE, array( 'sprintf' => array( $image->author()->name, $image->container()->_title ) ) )}
|
||||
</p>
|
||||
<h2 style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 20px; font-weight: 500 !important; margin: 0;">
|
||||
<a href='{$image->url()}' style='text-decoration: none;'>{$image->mapped('name')}</a>
|
||||
</h2>
|
||||
<div style='font-family: "Helvetica Neue", helvetica, sans-serif; line-height: 22px; margin-top: 10px; margin-bottom: 10px'>
|
||||
{$email->parseTextForEmail( $image->content() )|raw}
|
||||
</div>
|
||||
<p style='font-family: "Helvetica Neue", helvetica, sans-serif; margin: 0; font-size: 13px;'>
|
||||
{{if $image->container()->allow_rating}}
|
||||
{{foreach range( 1, 5 ) as $i}}{{if $i <= $image->averageRating()}}<img src='{resource="email/rating_on.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{else}}<img src='{resource="email/rating_off.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{endif}}{{endforeach}}
|
||||
|
||||
{{endif}}
|
||||
|
||||
<strong style='font-family: "Helvetica Neue", helvetica, sans-serif; '><img src='{resource="email/comment.png" location="interface" app="core"}' width='13' height='12' style='vertical-align: middle'> {$email->language->addToStack("num_comments", FALSE, array( 'pluralize' => array( $image->comments ) ) )}</strong>
|
||||
</p>
|
||||
</td>
|
||||
</tr>]]></template_content_html><template_data>$image, $email</template_data><template_content_plaintext><![CDATA[{$email->language->addToStack("x_added_image_in", FALSE, array( 'sprintf' => array( $image->author()->name, $image->container()->_title ) ) )}: {$image->mapped('name')} ({$image->url()})]]></template_content_plaintext></template><template><template_app>gallery</template_app><template_name>digests__comment</template_name><template_content_html><![CDATA[<tr style='border-bottom: 1px solid #eeeeee'>
|
||||
<td width='120' align='center' valign='top'>
|
||||
<img src='{$image->thumb_file_name}' style='border: 1px solid #000; vertical-align: middle;' width='100' height='100'>
|
||||
</td>
|
||||
<td align='left'>
|
||||
<p style='font-family: "Helvetica Neue", helvetica, sans-serif; margin: 0; font-size: 13px; font-weight: bold'>
|
||||
{$email->language->addToStack("x_commented_photo", FALSE, array( 'sprintf' => array( $comment->author()->name ) ) )}
|
||||
</p>
|
||||
<h2 style="font-family: 'Helvetica Neue', helvetica, sans-serif; font-size: 15px; font-weight: 500 !important; margin: 0;">
|
||||
<a href='{$comment->item()->url()}' style='text-decoration: none;'>{$comment->item()->mapped('name')}</a>
|
||||
</h2>
|
||||
<div style='font-family: "Helvetica Neue", helvetica, sans-serif; line-height: 22px; margin-top: 10px; margin-bottom: 10px; border-left: 3px solid #8c8c8c; padding-left: 15px; font-size: 14px; margin-left: 15px;'>
|
||||
{$email->parseTextForEmail( $comment->content() )|raw}
|
||||
</div>
|
||||
</td>
|
||||
</tr>]]></template_content_html><template_data>$comment, $email</template_data><template_content_plaintext><![CDATA[{$email->language->addToStack("x_commented_photo", FALSE, array( 'sprintf' => array( $comment->author()->name ) ) )}: {$comment->item()->name} ({$comment->url()})
|
||||
]]></template_content_plaintext></template></emails>
|
||||
@@ -0,0 +1,59 @@
|
||||
/**
|
||||
* Friendly URL Structure
|
||||
*
|
||||
* For each value in the $furl array:
|
||||
* The key should be the "SEO Template" - an identifier which you'll use when displaying a URL.
|
||||
* The value should be an associative array with two or three elements: 'friendly' and 'real', and optionally 'verify':
|
||||
* 'friendly'
|
||||
* The friendly URL to use - encase variables in {curly braces} containing a symbol, followed by the name of the parameter that matches in the "real" URL
|
||||
* The symbol should be # for numbers or @ for strings
|
||||
* For example, if the "real" URL contains id=XXX, where XXX is a number, you should include {#id} somewhere in the friendly URL.
|
||||
* You can also use the tag {?} for the "SEO Title" (that is, any variables that shouldn't be part of the real URL, such as the name of the topipc being viewed).
|
||||
* If you want to support more than one SEO Title, you can give them zero-indexed keys like so: {?0} {?1} {?2}
|
||||
* 'real'
|
||||
* This should be the base of the real URL. You should not include parameters which will be parsed out from the friendly URL.
|
||||
* 'verify'
|
||||
* This should be the name of a class that contains a loadFromUrl() and an url() method. The dynamic URL (i.e. app=core&...) will be passed to loadFromUrl(), and the url()
|
||||
* method will subsequently be called to retrieve the correct URL, ideal with ActiveRecord pattern classes.
|
||||
*
|
||||
* IMPORTANT: Ensure values are listed with the most specific ones first. This is to ensure that non-FURL redirects are done correctly. For example, if you have these FURLs:
|
||||
* /index.php?app=myapp&module=mymodule&controller=mycontroller&do=myaction -> /myfolder/myaction
|
||||
* /index.php?app=myapp&module=mymodule&controller=mycontroller -> /myfolder
|
||||
* They must be provided in that order, otherwise the former will redirec to /myfolder/?do=myaction rather than /myfolder/myaction
|
||||
*/
|
||||
{
|
||||
"topLevel": "gallery",
|
||||
"pages": {
|
||||
"gallery_category": {
|
||||
"friendly": "category/{#category}-{?}",
|
||||
"real": "app=gallery&module=gallery&controller=browse",
|
||||
"verify": "\\IPS\\gallery\\Category"
|
||||
},
|
||||
"gallery_album": {
|
||||
"friendly": "album/{#album}-{?}",
|
||||
"real": "app=gallery&module=gallery&controller=browse",
|
||||
"verify": "\\IPS\\gallery\\Album"
|
||||
},
|
||||
"gallery_categories": {
|
||||
"friendly": "categories",
|
||||
"real": "app=gallery&module=gallery&controller=browse&do=categories"
|
||||
},
|
||||
"gallery_rss": {
|
||||
"friendly": "images.xml",
|
||||
"real": "app=gallery&module=gallery&controller=browse&do=rss"
|
||||
},
|
||||
"gallery_image": {
|
||||
"friendly": "image/{#id}-{?}",
|
||||
"real": "app=gallery&module=gallery&controller=view",
|
||||
"verify": "\\IPS\\gallery\\Image"
|
||||
},
|
||||
"gallery_submit": {
|
||||
"friendly": "submit",
|
||||
"real": "app=gallery&module=gallery&controller=submit"
|
||||
},
|
||||
"gallery": {
|
||||
"friendly": "",
|
||||
"real": "app=gallery&module=gallery&controller=browse"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[]
|
||||
Whitespace-only changes.
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"gallery_category_1": "Member Albums",
|
||||
"gallery_category_1_desc": ""
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,626 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<language>
|
||||
<app key="gallery" version="100045">
|
||||
<word key="__app_gallery" js="0">Gallery</word>
|
||||
<word key="frontnavigation_gallery" js="0">Gallery</word>
|
||||
<word key="gallery_title" js="0">Gallery</word>
|
||||
<word key="__indefart_gallery_image_comment" js="0">a comment on a gallery image</word>
|
||||
<word key="__indefart_gallery_image" js="0">a gallery image</word>
|
||||
<word key="module__gallery_stats" js="0">Statistics</word>
|
||||
<word key="menu__gallery_gallery" js="0">Gallery</word>
|
||||
<word key="menu__gallery_gallery_categories" js="0">Categories</word>
|
||||
<word key="menu__gallery_gallery_albums" js="0">Albums</word>
|
||||
<word key="menu__gallery_stats" js="0">Gallery</word>
|
||||
<word key="menu__gallery_stats_diskspace" js="0">Top Uploaders</word>
|
||||
<word key="menu__gallery_stats_bandwidth" js="0">Bandwidth Usage</word>
|
||||
<word key="menu__gallery_gallery_settings" js="0">Settings</word>
|
||||
<word key="image" js="0">Image</word>
|
||||
<word key="gallery_image" js="0">Gallery Image</word>
|
||||
<word key="filestorage__gallery_Images" js="0">IP.Gallery Images</word>
|
||||
<word key="acp_search_title_gallery_Categories" js="0">Gallery Categories</word>
|
||||
<word key="acp_search_title_gallery_Albums" js="0">Gallery Albums</word>
|
||||
<word key="gallery_images" js="0">Images</word>
|
||||
<word key="gallery_media" js="0">Gallery Videos</word>
|
||||
<word key="block_gallery_Overview" js="0">Gallery Overview</word>
|
||||
<word key="total_images" js="0">Total Images</word>
|
||||
<word key="total_disk_spaceg" js="0">Total Diskspace Used</word>
|
||||
<word key="total_albums" js="0">Total Albums</word>
|
||||
<word key="largest_image" js="0">Largest Image</word>
|
||||
<word key="most_viewed_image" js="0">Most Viewed Image</word>
|
||||
<word key="editor__gallery_Albums" js="0">Gallery Albums</word>
|
||||
<word key="editor__gallery_Categories" js="0">Gallery Categories</word>
|
||||
<word key="editor__gallery_Gallery" js="0">Image Comments</word>
|
||||
<word key="editor__gallery_Images" js="0">Gallery Images</word>
|
||||
<word key="editorMedia_gallery_Images" js="0">Gallery Images</word>
|
||||
<word key="member_gallery_image" js="0">Keep using my Gallery Image</word>
|
||||
<word key="group__gallery_Gallery" js="0">Gallery</word>
|
||||
<word key="gallery_album_permissions" js="0">Album Restrictions</word>
|
||||
<word key="g_create_albums" js="0">Can create albums?</word>
|
||||
<word key="g_create_albums_private" js="0">Can create private albums?</word>
|
||||
<word key="g_create_albums_private_desc" js="0">Private albums are albums that only the creator can view</word>
|
||||
<word key="g_create_albums_fo" js="0">Can create restricted access albums?</word>
|
||||
<word key="g_create_albums_fo_desc" js="0">Restricted access albums are albums that only the creator and designated users can view</word>
|
||||
<word key="g_album_limit" js="0">Maximum number of albums</word>
|
||||
<word key="g_img_album_limit" js="0">Maximum number of images per album</word>
|
||||
<word key="g_delete_own_albums" js="0">Can delete own albums?</word>
|
||||
<word key="gallery_restrictions" js="0">Usage Restrictions</word>
|
||||
<word key="g_movies" js="0">Can upload movies?</word>
|
||||
<word key="g_movie_size" js="0">Maximum size of movies</word>
|
||||
<word key="g_max_upload" js="0">Maximum size of images</word>
|
||||
<word key="g_max_transfer" js="0">Maximum bandwidth consumption</word>
|
||||
<word key="g_max_views" js="0">Maximum image and movie views</word>
|
||||
<word key="gallery_suffix_kb" js="0">kB</word>
|
||||
<word key="gallery_suffix_day" js="0">per day</word>
|
||||
<word key="gallery_suffix_kb_day" js="0">kB/day</word>
|
||||
<word key="gallery_requires_log" js="0">These settings rely on the detailed bandwidth log which can be disabled in the Gallery Settings and cleared periodically. If using these settings, it is recommended that you leave the log turned on and set not to clear more often than every 48 hours otherwise you may experience unexpected behavior.</word>
|
||||
<word key="r__albums" js="0">Albums</word>
|
||||
<word key="r__albums_manage" js="0">Can view albums?</word>
|
||||
<word key="r__diskspace" js="0">Diskspace</word>
|
||||
<word key="r__diskspace_manage" js="0">Can view diskspace statistics?</word>
|
||||
<word key="r__bandwidth" js="0">Bandwidth</word>
|
||||
<word key="r__bandwidth_manage" js="0">Can view bandwidth statistics?</word>
|
||||
<word key="gcategory_parent_id" js="0">Parent Category</word>
|
||||
<word key="category_sort_options" js="0">Default sort order</word>
|
||||
<word key="category_approve_img" js="0">Images must be approved?</word>
|
||||
<word key="category_comments_and_ratings" js="0">Comments and Ratings</word>
|
||||
<word key="category_allow_comments" js="0">Allow comments?</word>
|
||||
<word key="category_approve_com" js="0">Comments must be approved?</word>
|
||||
<word key="gcategory_allow_rating" js="0">Allow ratings?</word>
|
||||
<word key="category_can_tag" js="0">Allow tags?</word>
|
||||
<word key="category_tag_prefixes" js="0">Allow prefixes?</word>
|
||||
<word key="category_allow_albums" js="0">Allow albums?</word>
|
||||
<word key="category_watermark" js="0">Watermark images?</word>
|
||||
<word key="category_preset_tags" js="0">Preset tags</word>
|
||||
<word key="perm__view" js="0">See Category</word>
|
||||
<word key="perm__read" js="0">View Images</word>
|
||||
<word key="perm__add" js="0">Upload Images</word>
|
||||
<word key="perm__comment" js="0">Comment</word>
|
||||
<word key="perm__rate" js="0">Rate Images</word>
|
||||
<word key="perm__reply" js="0">Comment</word>
|
||||
<word key="category_rules" js="0">Rules</word>
|
||||
<word key="category_show_rules" js="0">Show rules?</word>
|
||||
<word key="category_show_rules_none" js="0">Do not show</word>
|
||||
<word key="category_show_rules_link" js="0">Show link to rules</word>
|
||||
<word key="category_show_rules_link_desc" js="0">The rules will be shown on a separate page with a link added in the category header</word>
|
||||
<word key="category_show_rules_full" js="0">Show rules</word>
|
||||
<word key="category_show_rules_full_desc" js="0">The rules will be shown inline in the category header</word>
|
||||
<word key="category_rules_title" js="0">Rules title</word>
|
||||
<word key="category_rules_text" js="0">Rules</word>
|
||||
<word key="category_rules_link" js="0">Link to rules</word>
|
||||
<word key="node_move_catsalbums" js="0">Move child categories and albums to</word>
|
||||
<word key="node_move_subalbums" js="0">Move albums to</word>
|
||||
<word key="node_delete_children_catsalbums" js="0">Delete child categories and albums</word>
|
||||
<word key="node_delete_children_cats" js="0">Delete child categories</word>
|
||||
<word key="node_delete_children_albums" js="0">Delete albums</word>
|
||||
<word key="delete_or_move_pick_one" js="0">If you choose not to delete images in this category, you must select a new category or album to move them to instead</word>
|
||||
<word key="error_messages" js="0">Error Messages</word>
|
||||
<word key="category_permission_custom_error" js="0">Custom permission denied message</word>
|
||||
<word key="category_permission_custom_error_desc" js="0">This error message will be shown to anyone who can browse the category but cannot view images within it</word>
|
||||
<word key="gallery_permerror_placeholder" js="0">Add an error message...</word>
|
||||
<word key="image_category_id" js="0">Category</word>
|
||||
<word key="node_no_parentg" js="0">No Parent</word>
|
||||
<word key="albums" js="0">Albums</word>
|
||||
<word key="album_settings" js="0">Settings</word>
|
||||
<word key="album_name" js="0">Name</word>
|
||||
<word key="album_description" js="0">Description</word>
|
||||
<word key="album_owner" js="0">Owner's Name</word>
|
||||
<word key="album_category" js="0">Category</word>
|
||||
<word key="album_sort_options" js="0">Default sort order</word>
|
||||
<word key="album_comments_and_ratings" js="0">Comments and Ratings</word>
|
||||
<word key="album_allow_comments" js="0">Allow comments?</word>
|
||||
<word key="album_allow_rating" js="0">Allow ratings?</word>
|
||||
<word key="album_type" js="0">Privacy</word>
|
||||
<word key="album_public" js="0">Everyone can see this album</word>
|
||||
<word key="album_private" js="0">Only I can see this album</word>
|
||||
<word key="album_private_mod" js="0">Only the owner can see this album</word>
|
||||
<word key="album_private_badge" js="0">Private album</word>
|
||||
<word key="album_friend_only" js="0">I want to choose who can see this album</word>
|
||||
<word key="album_friend_only_badge" js="0">Invite-only album</word>
|
||||
<word key="album_allowed_access" js="0">Members with access</word>
|
||||
<word key="set_album_owner" js="0">Owner</word>
|
||||
<word key="set_album_owner_me" js="0">This album is for me</word>
|
||||
<word key="set_album_owner_other" js="0">This album is for someone else</word>
|
||||
<word key="modperms__core_Content_gallery_Image" js="0">Gallery</word>
|
||||
<word key="gallery_categories" js="0">Categories</word>
|
||||
<word key="can_pin_gallery_image" js="0">Can pin images?</word>
|
||||
<word key="can_unpin_gallery_image" js="0">Can unpin images?</word>
|
||||
<word key="can_feature_gallery_image" js="0">Can feature images?</word>
|
||||
<word key="can_unfeature_gallery_image" js="0">Can unfeature images?</word>
|
||||
<word key="can_move_gallery_image" js="0">Can move images?</word>
|
||||
<word key="can_lock_gallery_image" js="0">Can lock images?</word>
|
||||
<word key="can_unlock_gallery_image" js="0">Can unlock images?</word>
|
||||
<word key="can_reply_to_locked_gallery_image" js="0">Can comment on locked images?</word>
|
||||
<word key="can_edit_gallery_image" js="0">Can edit images?</word>
|
||||
<word key="can_hide_gallery_image" js="0">Can hide images?</word>
|
||||
<word key="can_unhide_gallery_image" js="0">Can unhide images?</word>
|
||||
<word key="can_view_hidden_gallery_image" js="0">Can view hidden images?</word>
|
||||
<word key="can_delete_gallery_image" js="0">Can delete images?</word>
|
||||
<word key="can_edit_gallery_image_comment" js="0">Can edit comments?</word>
|
||||
<word key="can_hide_gallery_image_comment" js="0">Can hide comments?</word>
|
||||
<word key="can_unhide_gallery_image_comment" js="0">Can unhide comments?</word>
|
||||
<word key="can_view_hidden_gallery_image_comment" js="0">Can view hidden comments?</word>
|
||||
<word key="can_delete_gallery_image_comment" js="0">Can delete comments?</word>
|
||||
<word key="acplogs__gallery_settings" js="0">Gallery settings updated</word>
|
||||
<word key="gallery_dims_explanation" js="0"><![CDATA[Copies of all images uploaded to the gallery are created at different sizes and are then used as appropriate in the interface throughout the gallery. Note that the images used throughout the Gallery may not exactly reflect the dimensions specified here. You can control the maximum dimensions of each size below. The settings apply to new images only, unless you <a data-confirm href='{internal.app=gallery&module=gallery&controller=settings&do=rebuildImages}'>rebuild existing images</a>.]]></word>
|
||||
<word key="gallery_large_dims" js="0">Large image dimensions</word>
|
||||
<word key="gallery_medium_dims" js="0">Medium image dimensions</word>
|
||||
<word key="gallery_small_dims" js="0">Small image dimensions</word>
|
||||
<word key="gallery_thumb_dims" js="0">Thumbnail dimensions</word>
|
||||
<word key="gallery_use_square_thumbnails" js="0">Use square thumbnails</word>
|
||||
<word key="gallery_use_square_thumbnails_desc" js="0"><![CDATA[If you change this, you may want to <a data-confirm href='{internal.app=gallery&module=gallery&controller=settings&do=rebuildImages}'>rebuild existing images</a> otherwise the change will only apply to newly uploaded images.]]></word>
|
||||
<word key="gallery_watermark_path" js="0">Watermark image</word>
|
||||
<word key="gallery_watermark_path_desc" js="0"><![CDATA[The image provided will be overlaid on all gallery images (for example, to show a copyright message). Be aware that individual categories can disable the watermark on images. For best results, use a small image with a transparent background.<br><br><a data-confirm href='{internal.app=gallery&module=gallery&controller=settings&do=rebuildImages}'>Rebuild Existing Images</a>]]></word>
|
||||
<word key="gallery_bandwidth" js="0">Bandwidth Logging</word>
|
||||
<word key="gallery_detailed_bandwidth" js="0">Store detailed bandwidth logs</word>
|
||||
<word key="gallery_detailed_bandwidth_desc" js="0">Enabling this setting will cause the suite to track Gallery image views. You can then use the bandwidth logs to see how much bandwidth image views consume over periods of time, and you can view bandwidth statistics on a per-member basis when editing members.</word>
|
||||
<word key="gallery_bandwidth_period" js="0">Number of hours to keep bandwidth logs</word>
|
||||
<word key="gallery_options" js="0">General Options</word>
|
||||
<word key="gallery_rss_enabled" js="0">Enable latest images RSS feed</word>
|
||||
<word key="gallery_rebuildimages" js="0">Rebuilding images</word>
|
||||
<word key="member__gallery_Images" js="0">Gallery</word>
|
||||
<word key="remove_gallery_access" js="0">Allowed to access gallery?</word>
|
||||
<word key="remove_gallery_upload" js="0">Allowed to upload images?</word>
|
||||
<word key="gallery_stats" js="0">View Gallery Statistics</word>
|
||||
<word key="deleted_image" js="0">Deleted image</word>
|
||||
<word key="bandwidth" js="0">Bandwidth</word>
|
||||
<word key="image_id" js="0">Image</word>
|
||||
<word key="bdate" js="0">Date</word>
|
||||
<word key="bsize" js="0">Image size</word>
|
||||
<word key="bandwidth_stats" js="0">Bandwidth Usage</word>
|
||||
<word key="images_submitted" js="0">Images Submitted</word>
|
||||
<word key="gdiskspace_used" js="0">Diskspace Used</word>
|
||||
<word key="gaverage_filesize" js="0">Average Filesize</word>
|
||||
<word key="number_of_views" js="0">Number of Views *</word>
|
||||
<word key="gallery_bandwidth_used" js="0">Bandwidth Used *</word>
|
||||
<word key="images_stat_of_total" js="0">%s (%d%% of total)</word>
|
||||
<word key="images_stat_average" js="0">%s (average for all users: %s)</word>
|
||||
<word key="gallery_stats_disclaimer" js="0">* This statistic comes from the bandwidth log which may be disabled or set to be pruned periodically.</word>
|
||||
<word key="gallery_graph_disclaimer" js="0">This data comes from the bandwidth log which may be disabled or set to be pruned periodically.</word>
|
||||
<word key="member_images_chart" js="0">%s's Image Statistics</word>
|
||||
<word key="embed_gallery_image" js="0">Gallery Image</word>
|
||||
<word key="module__gallery_gallery" js="0">Gallery</word>
|
||||
<word key="view_this_album" js="0">View the album %s</word>
|
||||
<word key="add_gallery_image" js="0">Add Images</word>
|
||||
<word key="add_gallery_image_movies" js="0">Add Images or Movies</word>
|
||||
<word key="submit_first_image" js="0">Add the first image</word>
|
||||
<word key="browse_categories" js="0">Browse categories</word>
|
||||
<word key="save_submit_images" js="0">Save Images</word>
|
||||
<word key="loc_gallery_adding_image" js="0">Uploading an image</word>
|
||||
<word key="upload_more_images" js="0">Upload more images</word>
|
||||
<word key="select_your_images" js="0">Select your images</word>
|
||||
<word key="select_your_movies" js="0">Select your movies</word>
|
||||
<word key="upload_more_movies" js="0">Upload more movies</word>
|
||||
<word key="image_title" js="0">Caption</word>
|
||||
<word key="image_tags" js="0">Tags</word>
|
||||
<word key="image_auto_follow" js="0"></word>
|
||||
<word key="image_auto_follow_suffix" js="0">Notify me when other comments are posted</word>
|
||||
<word key="image_description" js="0">Description</word>
|
||||
<word key="image_credit_info" js="0">Credit</word>
|
||||
<word key="image_credit_info_desc" js="0">If credit must be provided for use of the image, supply the source of the image</word>
|
||||
<word key="image_copyright" js="0">Copyright</word>
|
||||
<word key="image_pending_approval" js="0">This image has not yet been approved and is only visible to staff</word>
|
||||
<word key="image_details" js="0">About this image</word>
|
||||
<word key="manage_image" js="0">Manage Image</word>
|
||||
<word key="report_image" js="0">Report Image</word>
|
||||
<word key="image_uploaded_by" js="0">Uploaded by %s</word>
|
||||
<word key="image_category" js="0">Category</word>
|
||||
<word key="image_album" js="0">Album</word>
|
||||
<word key="image_new_album" js="0">Create new album?</word>
|
||||
<word key="image__comment_placeholder" js="0">Add a comment...</word>
|
||||
<word key="image_submit_comment" js="0">Submit Comment</word>
|
||||
<word key="map_enabled" js="0">Show map?</word>
|
||||
<word key="map_privacy" js="0">Map privacy</word>
|
||||
<word key="view_all_sizes" js="0">Other sizes</word>
|
||||
<word key="set_image_as" js="0">Set as</word>
|
||||
<word key="loc_gallery_browsing" js="0">Browsing Gallery</word>
|
||||
<word key="loc_gallery_browsing_categories" js="0">Browsing gallery categories</word>
|
||||
<word key="featured_images" js="0">Featured Images</word>
|
||||
<word key="new_images" js="0">New Images</word>
|
||||
<word key="images_no_number" js="0">{!# [1:image][?:images]}</word>
|
||||
<word key="loc_gallery_viewing_image" js="0">Viewing image: %s</word>
|
||||
<word key="loc_gallery_viewing_category" js="0">Viewing category: %s</word>
|
||||
<word key="loc_gallery_viewing_album" js="0">Viewing album: %s</word>
|
||||
<word key="slider_text" js="0"><![CDATA[{# [1:image][?:images]} in <strong>%s</strong>]]></word>
|
||||
<word key="gallery_rss_title" js="0">Latest Images</word>
|
||||
<word key="gallery_rss_title_container" js="0">Latest Images: %s</word>
|
||||
<word key="gallery_rss_offline" js="0">This RSS feed is disabled</word>
|
||||
<word key="gallery_rss_offline_admin" js="0">The IP.Gallery option "Enable latest images RSS feed" is currently disabled. Toggle this option to yes in the admin control panel to enable the latest images RSS feed.</word>
|
||||
<word key="no_images_in_album" js="0">There are no images in this album yet</word>
|
||||
<word key="no_images_in_cat" js="0">There are no images in this category yet</word>
|
||||
<word key="image_gps_show" js="0">Show map?</word>
|
||||
<word key="image_gps_show_desc" js="0">You can optionally display a map for this image showing where it was taken</word>
|
||||
<word key="view_this_image" js="0">View the image %s</word>
|
||||
<word key="num_images" js="0">{# [1:image][?:images]}</word>
|
||||
<word key="num_images_in_album" js="0">{# [1:image][?:images]} in this album</word>
|
||||
<word key="album_latest_images" js="0">Latest Images</word>
|
||||
<word key="rotate_image" js="0">Rotate</word>
|
||||
<word key="rotate_left" js="0">Rotate Left</word>
|
||||
<word key="rotate_right" js="0">Rotate Right</word>
|
||||
<word key="set_cover_photo" js="0">Set cover photo</word>
|
||||
<word key="set_for_album" js="0">Set for album?</word>
|
||||
<word key="set_for_category" js="0">Set for category?</word>
|
||||
<word key="cover_category_only" js="0">Category cover</word>
|
||||
<word key="cover_category" js="0">Set as category cover photo</word>
|
||||
<word key="cover_album_only" js="0">Album cover</word>
|
||||
<word key="cover_album" js="0">Set as album cover photo</word>
|
||||
<word key="cover_both" js="0"><![CDATA[Both Category & Album cover]]></word>
|
||||
<word key="set_as_profile_photo" js="0">This image has been set as your profile photo</word>
|
||||
<word key="set_as_category_done" js="0">This image has been set as the category cover</word>
|
||||
<word key="set_as_album_done" js="0">This image has been set as the album cover</word>
|
||||
<word key="set_as_both_done" js="0">This image has been set as the category and album covers</word>
|
||||
<word key="find_users_images" js="0">Find their other images</word>
|
||||
<word key="change_author" js="0">Change Author</word>
|
||||
<word key="change_author_ititle" js="0">Change the member who owns this image</word>
|
||||
<word key="gallery_metadata" js="0">Photo Information</word>
|
||||
<word key="gallery_no_metadata" js="0">No extra image data</word>
|
||||
<word key="view_all_photo_info" js="0">View all photo EXIF information</word>
|
||||
<word key="view_photo_info" js="0">View photo EXIF information</word>
|
||||
<word key="gallery_images_too_many" js="0">You have uploaded more images than you are permitted to add to this album</word>
|
||||
<word key="gallery_image_or_movie" js="0">You must upload at least one image or one movie</word>
|
||||
<word key="gallery_movies_too_many" js="0">You have uploaded more movies than you are permitted to add to this album</word>
|
||||
<word key="image_thumbnail" js="0">Thumbnail</word>
|
||||
<word key="maximum_daily_views" js="0">You have reached the maximum number of daily image and movie views that the administrator has allowed</word>
|
||||
<word key="maximum_daily_views_admin" js="0">You have reached the value specified for your user group for 'Maximum image and movie views' on the Gallery tab within the last 24 hours</word>
|
||||
<word key="maximum_daily_transfer" js="0">You have reached the maximum amount of bandwidth that the administrator has allowed for image and video viewing in the gallery</word>
|
||||
<word key="maximum_daily_transfer_admin" js="0">You have reached the value specified for your user group for 'Maximum bandwidth consumption' on the Gallery tab within the last 24 hours</word>
|
||||
<word key="move_to_category" js="0">Move to category</word>
|
||||
<word key="move_to_album" js="0">Move to album</word>
|
||||
<word key="move_to_new_album" js="0">New Album</word>
|
||||
<word key="imageLocation" js="0">Upload new image</word>
|
||||
<word key="mediaLocation" js="0">Upload new media file</word>
|
||||
<word key="viewfilter_thumbnails" js="0">Thumbnails</word>
|
||||
<word key="viewfilter_large" js="0">Large Images</word>
|
||||
<word key="set_gallery_image_photo" js="0">Set as my profile photo</word>
|
||||
<word key="no_photo_for_media" js="0">You can only set an image as your profile photo image</word>
|
||||
<word key="delete_album" js="0">Delete Album</word>
|
||||
<word key="edit_album" js="0">Edit Album</word>
|
||||
<word key="sort_last_img_date" js="0">Newest Image</word>
|
||||
<word key="sort_count_comments" js="0">Most Comments</word>
|
||||
<word key="sort_rating_aggregate" js="0">Highest Rated</word>
|
||||
<word key="sort_name" js="0">Album Title</word>
|
||||
<word key="sort_count_imgs" js="0">Most Images</word>
|
||||
<word key="delete_images" js="0">Delete images?</word>
|
||||
<word key="move_image_category" js="0">Move images to category</word>
|
||||
<word key="move_image_album" js="0">Move images to album</word>
|
||||
<word key="map_not_being_shown" js="0">This image is not currently being displayed to other users.</word>
|
||||
<word key="next_image_set" js="0">Continue</word>
|
||||
<word key="uploaded" js="0">Uploaded</word>
|
||||
<word key="in_album" js="0">In album: </word>
|
||||
<word key="image__save" js="0">Save Image</word>
|
||||
<word key="gallery_move_title" js="0">Move this image</word>
|
||||
<word key="feature_title_image" js="0">Feature this image</word>
|
||||
<word key="unfeature_title_image" js="0">Unfeature this image</word>
|
||||
<word key="pin_title_image" js="0">Pin this image</word>
|
||||
<word key="unpin_title_image" js="0">Unpin this image</word>
|
||||
<word key="hide_title_image" js="0">Hide this image</word>
|
||||
<word key="unhide_title_image" js="0">Unhide this image</word>
|
||||
<word key="lock_title_image" js="0">Lock this image</word>
|
||||
<word key="unlock_title_image" js="0">Unlock this image</word>
|
||||
<word key="approve_title_image" js="0">Approve this image</word>
|
||||
<word key="delete_title_image" js="0">Delete this image</word>
|
||||
<word key="cat_img_count" js="0">{# [1:image][?:images]}</word>
|
||||
<word key="cat_album_count" js="0">{# [1:album][?:albums]}</word>
|
||||
<word key="cat_comment_count" js="0">{# [1:comment][?:comments]}</word>
|
||||
<word key="from_the_album" js="0">From the album</word>
|
||||
<word key="album_created_by" js="0">Album created by</word>
|
||||
<word key="album_everything_seen" js="0">You've seen everything in this album</word>
|
||||
<word key="album_new_content" js="0">This album has unseen content</word>
|
||||
<word key="camera_information" js="0">Camera information</word>
|
||||
<word key="add_image_note" js="0">Add note</word>
|
||||
<word key="view_in_lightbox" js="0">View in lightbox</word>
|
||||
<word key="view_entire_album" js="0">View the entire %s album</word>
|
||||
<word key="events_in_album" js="0">{!# [1:Event][?:Events]} in this album</word>
|
||||
<word key="view_as_thumbnails" js="0">Show as thumbnails</word>
|
||||
<word key="view_as_large" js="0">Show as large previews</word>
|
||||
<word key="view_as_list" js="0">Show as list</word>
|
||||
<word key="gallery_image_comment" js="0">Image Comment</word>
|
||||
<word key="gallery_image_pl" js="0">Images</word>
|
||||
<word key="gallery_image_pl_lc" js="0">images</word>
|
||||
<word key="gallery_image_comment_pl" js="0">Image Comments</word>
|
||||
<word key="image_locked_can_comment" js="0">This image is locked, but your permissions allow you to add new comments.</word>
|
||||
<word key="image_locked_cannot_comment" js="0">This image is now closed to further comments.</word>
|
||||
<word key="all_image_sizes" js="0">All Sizes For %s</word>
|
||||
<word key="back_to_image_page" js="0">Back to image page</word>
|
||||
<word key="size_thumb" js="0">Thumb</word>
|
||||
<word key="size_small" js="0">Small</word>
|
||||
<word key="size_medium" js="0">Medium</word>
|
||||
<word key="size_large" js="0">Large</word>
|
||||
<word key="gallery_edit_details" js="0">Edit Details</word>
|
||||
<word key="gallery_edit_details_title" js="0">Edit this image's details</word>
|
||||
<word key="block_imageFeed" js="0">Image Feed</word>
|
||||
<word key="block_imageFeed_desc" js="0">Create a feed of images</word>
|
||||
<word key="widget_feed_container_gallery_image" js="0">Categories</word>
|
||||
<word key="block_galleryStats" js="0">Gallery Statistics</word>
|
||||
<word key="block_galleryStats_desc" js="0">Shows gallery application statistics</word>
|
||||
<word key="block_recentComments" js="0">Recent Comments</word>
|
||||
<word key="block_recentComments_desc" js="0">Shows newest comments</word>
|
||||
<word key="total_images_front_h" js="0">{!#[1:Image][?:Images]}</word>
|
||||
<word key="total_images_front_v" js="0">{!#[?:Images]}</word>
|
||||
<word key="stats_total_comments_v" js="0">{!#[1:Comment][?:Comments]}</word>
|
||||
<word key="stats_total_comments_h" js="0">{!#[?:Comments]}</word>
|
||||
<word key="total_albums_h" js="0">{!#[1:Album][?:Albums]}</word>
|
||||
<word key="total_albums_v" js="0">{!#[?:Albums]}</word>
|
||||
<word key="latest_image" js="0">Latest Image</word>
|
||||
<word key="profile_gallery_album" js="0">Albums</word>
|
||||
<word key="gallery_category_id" js="0">Category</word>
|
||||
<word key="profile_gallery_gallery" js="0">Albums</word>
|
||||
<word key="submit_breadcrumb" js="0">Submit Image</word>
|
||||
<word key="choose_category" js="0">Select Category</word>
|
||||
<word key="add_information" js="0">Add Image Information</word>
|
||||
<word key="add_information_desc" js="0">Add titles and descriptions to your images</word>
|
||||
<word key="add_information_plus_album_desc" js="0">Add titles and descriptions to your images, and optionally add them to an album</word>
|
||||
<word key="images_you_uploaded" js="0">Images you uploaded</word>
|
||||
<word key="movies_you_uploaded" js="0">Videos you uploaded</word>
|
||||
<word key="media_you_uploaded" js="0">Files you uploaded</word>
|
||||
<word key="new_album" js="0"><![CDATA[Adding {# [1:image][?:images]} to album: <strong>%s</strong>]]></word>
|
||||
<word key="with_all_images" js="0">With all images</word>
|
||||
<word key="create_album" js="0">Create Album</word>
|
||||
<word key="create_an_album" js="0">Create an album</word>
|
||||
<word key="add_to_existing_album" js="0">Add to an existing album</word>
|
||||
<word key="choose_existing_album" js="0">Choose Existing Album</word>
|
||||
<word key="change_album" js="0">change</word>
|
||||
<word key="set_tags" js="0">Set tags...</word>
|
||||
<word key="set_copyright" js="0">Set copyright...</word>
|
||||
<word key="notify_me" js="0">Notify me when comments are posted</word>
|
||||
<word key="album_limit_message" js="0"><![CDATA[Albums can contain up to <strong>{# [1:image or video][?:images or videos]}</strong>, but you've uploaded <strong>%d</strong>. Only the first {# [1:image or video][?:images or videos]} will be added to the album when you save; any remaining will be removed.]]></word>
|
||||
<word key="too_many_images" js="0">Too many images</word>
|
||||
<word key="editing_image" js="0">Editing Image</word>
|
||||
<word key="editing_movie" js="0">Editing Video</word>
|
||||
<word key="ready_to_submit" js="0">Ready to submit</word>
|
||||
<word key="x_of_y" js="0">%d of %d</word>
|
||||
<word key="continue_next_image" js="0">Save this image</word>
|
||||
<word key="finish_all_images" js="0">Finish and save all images</word>
|
||||
<word key="image_info_finish" js="0">Finish</word>
|
||||
<word key="add_gallery_image_desc" js="0">Choose the images you want to add to the gallery</word>
|
||||
<word key="add_gallery_image_limit" js="0"><![CDATA[Planning to add these to an album? Albums can contain up to <strong>{# [1:image or video][?:images or videos]}</strong>.]]></word>
|
||||
<word key="add_gallery_album_limit" js="0"><![CDATA[You can upload up to <strong>{# [1:image or video][?:images or videos]}</strong> to this album]]></word>
|
||||
<word key="album_full" js="0">Album full</word>
|
||||
<word key="choose_album" js="0">Choose Album</word>
|
||||
<word key="album_full_desc" js="0">You can't add any more images to this album</word>
|
||||
<word key="x_more_images_album" js="0">You can add {# [1:more image][?:more images]} to this album</word>
|
||||
<word key="saving_images" js="0">Saving Images</word>
|
||||
<word key="saving_images_desc" js="0">Your images are being stored, please wait...</word>
|
||||
<word key="adding_to_category_x" js="0"><![CDATA[Adding images to <strong>%s</strong>]]></word>
|
||||
<word key="exif_title" js="0">Full EXIF data</word>
|
||||
<word key="gallery_focal_length_mm" js="0">%smm</word>
|
||||
<word key="gallery_exif_camera" js="0">Taken with</word>
|
||||
<word key="gallery_exif_isospeed" js="0">ISO Speed</word>
|
||||
<word key="FILE.FileName" js="0"></word>
|
||||
<word key="FILE.SectionsFound" js="0"></word>
|
||||
<word key="FILE.FileDateTime" js="0"></word>
|
||||
<word key="FILE.FileType" js="0"></word>
|
||||
<word key="FILE.MimeType" js="0">Mime Type</word>
|
||||
<word key="FILE.FileSize" js="0">Original File Size</word>
|
||||
<word key="COMPUTED.html" js="0"></word>
|
||||
<word key="COMPUTED.ApertureFNumber" js="0">Aperture</word>
|
||||
<word key="COMPUTED.Thumbnail.MimeType" js="0"></word>
|
||||
<word key="COMPUTED.Height" js="0">Image Height</word>
|
||||
<word key="COMPUTED.Width" js="0">Image Width</word>
|
||||
<word key="COMPUTED.IsColor" js="0">Color</word>
|
||||
<word key="COMPUTED.IsColor_map_0" js="0">FALSE</word>
|
||||
<word key="COMPUTED.IsColor_map_1" js="0">TRUE</word>
|
||||
<word key="COMPUTED.ByteOrderMotorola" js="0">Byte Order Motorola</word>
|
||||
<word key="COMPUTED.ByteOrderMotorola_map_0" js="0">FALSE</word>
|
||||
<word key="COMPUTED.ByteOrderMotorola_map_1" js="0">TRUE</word>
|
||||
<word key="COMPUTED.CCDWidth" js="0">CCD Width</word>
|
||||
<word key="COMPUTED.UserCommentEncoding" js="0"></word>
|
||||
<word key="COMPUTED.UserComment" js="0"></word>
|
||||
<word key="COMPUTED.Thumbnail.FileType" js="0"></word>
|
||||
<word key="COMPUTED.FocusDistance" js="0">Focus Distance</word>
|
||||
<word key="IFD0.ImageDescription" js="0">Image Description</word>
|
||||
<word key="IFD0.Make" js="0">Camera Make</word>
|
||||
<word key="IFD0.Model" js="0">Camera Model</word>
|
||||
<word key="IFD0.Artist" js="0">Artist</word>
|
||||
<word key="IFD0.Copyright" js="0">Copyright</word>
|
||||
<word key="IFD0.XResolution" js="0">X-Resolution</word>
|
||||
<word key="IFD0.YResolution" js="0">Y-Resolution</word>
|
||||
<word key="IFD0.DateTime" js="0">Date Taken</word>
|
||||
<word key="IFD0.Orientation" js="0">Orientation</word>
|
||||
<word key="IFD0.Orientation_map_1" js="0">The 0th row is at the visual top of the image, and the 0th column is the visual left-hand side</word>
|
||||
<word key="IFD0.Orientation_map_2" js="0">The 0th row is at the visual top of the image, and the 0th column is the visual right-hand side</word>
|
||||
<word key="IFD0.Orientation_map_3" js="0">The 0th row is at the visual bottom of the image, and the 0th column is the visual right-hand side</word>
|
||||
<word key="IFD0.Orientation_map_4" js="0">The 0th row is at the visual bottom of the image, and the 0th column is the visual left-hand side</word>
|
||||
<word key="IFD0.Orientation_map_5" js="0">The 0th row is the visual left-hand side of the image, and the 0th column is the visual top</word>
|
||||
<word key="IFD0.Orientation_map_6" js="0">The 0th row is the visual right-hand side of the image, and the 0th column is the visual top</word>
|
||||
<word key="IFD0.Orientation_map_7" js="0">The 0th row is the visual right-hand side of the image, and the 0th column is the visual bottom</word>
|
||||
<word key="IFD0.Orientation_map_8" js="0">The 0th row is the visual left-hand side of the image, and the 0th column is the visual bottom</word>
|
||||
<word key="IFD0.ResolutionUnit" js="0">Resolution Unit</word>
|
||||
<word key="IFD0.Software" js="0">Software</word>
|
||||
<word key="IFD0.YCbCrPositioning" js="0">YCbCr Positioning</word>
|
||||
<word key="IFD0.YCbCrPositioning_map_1" js="0">centered</word>
|
||||
<word key="IFD0.YCbCrPositioning_map_2" js="0">co-sited</word>
|
||||
<word key="IFD0.Exif_IFD_Pointer" js="0"></word>
|
||||
<word key="IFD0.GPS_IFD_Pointer" js="0"></word>
|
||||
<word key="EXIF.ExposureTime" js="0">Exposure Time in Seconds</word>
|
||||
<word key="EXIF.FNumber" js="0">F Number</word>
|
||||
<word key="EXIF.ExifVersion" js="0">Exif Version</word>
|
||||
<word key="EXIF.DateTimeOriginal" js="0">Date Taken</word>
|
||||
<word key="EXIF.DateTimeDigitized" js="0">Date Digitized</word>
|
||||
<word key="EXIF.ComponentsConfiguration" js="0"></word>
|
||||
<word key="EXIF.CompressedBitsPerPixel" js="0">Compressed bits/pixel</word>
|
||||
<word key="EXIF.ExposureBiasValue" js="0">Exposure Bias Value</word>
|
||||
<word key="EXIF.MaxApertureValue" js="0">Max Aperture Value</word>
|
||||
<word key="EXIF.FocalLength" js="0">Focal Length</word>
|
||||
<word key="EXIF.MakerNote" js="0"></word>
|
||||
<word key="EXIF.ShutterSpeedValue" js="0">Shutter Speed</word>
|
||||
<word key="EXIF.ApertureValue" js="0">Aperture Value</word>
|
||||
<word key="EXIF.BrightnessValue" js="0">Brightness Value</word>
|
||||
<word key="EXIF.SubSecTimeOriginal" js="0"></word>
|
||||
<word key="EXIF.SubSecTimeDigitized" js="0"></word>
|
||||
<word key="EXIF.ExposureIndex" js="0">Exposure Index</word>
|
||||
<word key="EXIF.CustomRendered" js="0"></word>
|
||||
<word key="EXIF.DigitalZoomRatio" js="0">Digital Zoom Ratio</word>
|
||||
<word key="EXIF.FocalLengthIn35mmFilm" js="0">Focal Length (35mm equiv)</word>
|
||||
<word key="EXIF.SubjectDistanceRange" js="0">Distance Range</word>
|
||||
<word key="EXIF.SubjectDistance" js="0">Subject Distance</word>
|
||||
<word key="EXIF.FlashPixVersion" js="0">Flashpix Version</word>
|
||||
<word key="EXIF.FlashPixVersion_map_0100" js="0">Flashpix Format Version 1.0</word>
|
||||
<word key="EXIF.FileSource" js="0"></word>
|
||||
<word key="EXIF.SceneType" js="0"></word>
|
||||
<word key="EXIF.SceneCaptureType" js="0">Scene Capture Type</word>
|
||||
<word key="EXIF.SceneCaptureType_map_0" js="0">Standard</word>
|
||||
<word key="EXIF.SceneCaptureType_map_1" js="0">Landscape</word>
|
||||
<word key="EXIF.SceneCaptureType_map_2" js="0">Portrait</word>
|
||||
<word key="EXIF.SceneCaptureType_map_3" js="0">Night scene</word>
|
||||
<word key="EXIF.GainControl" js="0">Gain Control</word>
|
||||
<word key="EXIF.GainControl_map_0" js="0">None</word>
|
||||
<word key="EXIF.GainControl_map_1" js="0">Low gain up</word>
|
||||
<word key="EXIF.GainControl_map_2" js="0">High gain up</word>
|
||||
<word key="EXIF.GainControl_map_3" js="0">Low gain down</word>
|
||||
<word key="EXIF.GainControl_map_4" js="0">High gain down</word>
|
||||
<word key="EXIF.Contrast" js="0">Contrast</word>
|
||||
<word key="EXIF.Contrast_map_0" js="0">Normal</word>
|
||||
<word key="EXIF.Contrast_map_1" js="0">Soft</word>
|
||||
<word key="EXIF.Contrast_map_2" js="0">Hard</word>
|
||||
<word key="EXIF.Saturation" js="0">Saturation</word>
|
||||
<word key="EXIF.Saturation_map_0" js="0">Normal</word>
|
||||
<word key="EXIF.Saturation_map_1" js="0">Low saturation</word>
|
||||
<word key="EXIF.Saturation_map_2" js="0">High saturation</word>
|
||||
<word key="EXIF.Sharpness" js="0">Sharpness</word>
|
||||
<word key="EXIF.Sharpness_map_0" js="0">Normal</word>
|
||||
<word key="EXIF.Sharpness_map_1" js="0">Soft</word>
|
||||
<word key="EXIF.Sharpness_map_2" js="0">Hard</word>
|
||||
<word key="EXIF.ExposureMode" js="0">Exposure Mode</word>
|
||||
<word key="EXIF.ExposureMode_map_0" js="0">Auto exposure</word>
|
||||
<word key="EXIF.ExposureMode_map_1" js="0">Manual exposure</word>
|
||||
<word key="EXIF.ExposureMode_map_2" js="0">Auto bracket</word>
|
||||
<word key="EXIF.WhiteBalance" js="0">White Balance</word>
|
||||
<word key="EXIF.WhiteBalance_map_0" js="0">Auto white balance</word>
|
||||
<word key="EXIF.WhiteBalance_map_1" js="0">Manual white balance</word>
|
||||
<word key="EXIF.ExposureProgram" js="0">Exposure Program</word>
|
||||
<word key="EXIF.ExposureProgram_map_0" js="0">Not defined</word>
|
||||
<word key="EXIF.ExposureProgram_map_1" js="0">Manual</word>
|
||||
<word key="EXIF.ExposureProgram_map_2" js="0">Normal program</word>
|
||||
<word key="EXIF.ExposureProgram_map_3" js="0">Aperture priority</word>
|
||||
<word key="EXIF.ExposureProgram_map_4" js="0">Shutter priority</word>
|
||||
<word key="EXIF.ExposureProgram_map_5" js="0">Creative program (biased toward depth of field)</word>
|
||||
<word key="EXIF.ExposureProgram_map_6" js="0">Action program (biased toward fast shutter speed)</word>
|
||||
<word key="EXIF.ExposureProgram_map_7" js="0">Portrait mode (for closeup photos with the background out of focus)</word>
|
||||
<word key="EXIF.ExposureProgram_map_8" js="0">Landscape mode (for landscape photos with the background in focus)</word>
|
||||
<word key="EXIF.ISOSpeedRatings" js="0">ISO Speed Ratings</word>
|
||||
<word key="EXIF.MeteringMode" js="0">Metering Mode</word>
|
||||
<word key="EXIF.MeteringMode_map_0" js="0">Unknown</word>
|
||||
<word key="EXIF.MeteringMode_map_1" js="0">Average</word>
|
||||
<word key="EXIF.MeteringMode_map_2" js="0">CenterWeightedAverage</word>
|
||||
<word key="EXIF.MeteringMode_map_3" js="0">Spot</word>
|
||||
<word key="EXIF.MeteringMode_map_4" js="0">MultiSpot</word>
|
||||
<word key="EXIF.MeteringMode_map_5" js="0">Pattern</word>
|
||||
<word key="EXIF.MeteringMode_map_6" js="0">Partial</word>
|
||||
<word key="EXIF.MeteringMode_map_255" js="0">Other</word>
|
||||
<word key="EXIF.LightSource" js="0">Light Source</word>
|
||||
<word key="EXIF.LightSource_map_0" js="0">Unknown</word>
|
||||
<word key="EXIF.LightSource_map_1" js="0">Daylight</word>
|
||||
<word key="EXIF.LightSource_map_2" js="0">Fluorescent</word>
|
||||
<word key="EXIF.LightSource_map_3" js="0">Tungsten (incandescent light)</word>
|
||||
<word key="EXIF.LightSource_map_4" js="0">Flash</word>
|
||||
<word key="EXIF.LightSource_map_9" js="0">Fine weather</word>
|
||||
<word key="EXIF.LightSource_map_10" js="0">Cloudy weather</word>
|
||||
<word key="EXIF.LightSource_map_11" js="0">Shade</word>
|
||||
<word key="EXIF.LightSource_map_12" js="0">Daylight fluorescent (D 5700 - 7100K)</word>
|
||||
<word key="EXIF.LightSource_map_13" js="0">Day white fluorescent (N 4600 - 5400K)</word>
|
||||
<word key="EXIF.LightSource_map_14" js="0">Cool white fluorescent (W 3900 - 4500K)</word>
|
||||
<word key="EXIF.LightSource_map_15" js="0">White fluorescent (WW 3200 - 3700K)</word>
|
||||
<word key="EXIF.LightSource_map_17" js="0">Standard light A</word>
|
||||
<word key="EXIF.LightSource_map_18" js="0">Standard light B</word>
|
||||
<word key="EXIF.LightSource_map_19" js="0">Standard light C</word>
|
||||
<word key="EXIF.LightSource_map_20" js="0">D55</word>
|
||||
<word key="EXIF.LightSource_map_21" js="0">D65</word>
|
||||
<word key="EXIF.LightSource_map_22" js="0">D75</word>
|
||||
<word key="EXIF.LightSource_map_23" js="0">D50</word>
|
||||
<word key="EXIF.LightSource_map_24" js="0">ISO studio tungsten</word>
|
||||
<word key="EXIF.LightSource_map_255" js="0">Other light source</word>
|
||||
<word key="EXIF.Flash" js="0">Flash</word>
|
||||
<word key="EXIF.Flash_map_0" js="0">Flash did not fire</word>
|
||||
<word key="EXIF.Flash_map_1" js="0">Flash fired</word>
|
||||
<word key="EXIF.Flash_map_5" js="0">Strobe return light not detected</word>
|
||||
<word key="EXIF.Flash_map_7" js="0">Strobe return light detected</word>
|
||||
<word key="EXIF.Flash_map_9" js="0">Flash fired, compulsory flash mode</word>
|
||||
<word key="EXIF.Flash_map_D" js="0">Flash fired, compulsory flash mode, return light not detected</word>
|
||||
<word key="EXIF.Flash_map_F" js="0">Flash fired, compulsory flash mode, return light detected</word>
|
||||
<word key="EXIF.Flash_map_10" js="0">Flash did not fire, compulsory flash mode</word>
|
||||
<word key="EXIF.Flash_map_18" js="0">Flash did not fire, auto mode</word>
|
||||
<word key="EXIF.Flash_map_19" js="0">Flash fired, auto mode</word>
|
||||
<word key="EXIF.Flash_map_1D" js="0">Flash fired, auto mode, return light not detected</word>
|
||||
<word key="EXIF.Flash_map_1F" js="0">Flash fired, auto mode, return light detected</word>
|
||||
<word key="EXIF.Flash_map_20" js="0">No flash function</word>
|
||||
<word key="EXIF.Flash_map_41" js="0">Flash fired, red-eye reduction mode</word>
|
||||
<word key="EXIF.Flash_map_45" js="0">Flash fired, red-eye reduction mode, return light not detected</word>
|
||||
<word key="EXIF.Flash_map_47" js="0">Flash fired, red-eye reduction mode, return light detected</word>
|
||||
<word key="EXIF.Flash_map_49" js="0">Flash fired, compulsory flash mode, red-eye reduction mode</word>
|
||||
<word key="EXIF.Flash_map_4D" js="0">Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected</word>
|
||||
<word key="EXIF.Flash_map_4F" js="0">Flash fired, compulsory flash mode, red-eye reduction mode, return light detected</word>
|
||||
<word key="EXIF.Flash_map_59" js="0">Flash fired, auto mode, red-eye reduction mode</word>
|
||||
<word key="EXIF.Flash_map_5D" js="0">Flash fired, auto mode, return light not detected, red-eye reduction mode</word>
|
||||
<word key="EXIF.Flash_map_5F" js="0">Flash fired, auto mode, return light detected, red-eye reduction mode</word>
|
||||
<word key="EXIF.UserComment" js="0"></word>
|
||||
<word key="EXIF.ColorSpace" js="0">Color Space</word>
|
||||
<word key="EXIF.ColorSpace_map_1" js="0">sRGB</word>
|
||||
<word key="EXIF.ColorSpace_map_FFFF" js="0">Uncalibrated</word>
|
||||
<word key="EXIF.ExifImageWidth" js="0">Image Width</word>
|
||||
<word key="EXIF.ExifImageLength" js="0">Image Length</word>
|
||||
<word key="EXIF.InteroperabilityOffset" js="0">Interoperability Offset</word>
|
||||
<word key="EXIF.SensingMethod" js="0">Sensing Method</word>
|
||||
<word key="EXIF.SensingMethod_map_1" js="0">Not Defined</word>
|
||||
<word key="EXIF.SensingMethod_map_2" js="0">One-chip color area sensor</word>
|
||||
<word key="EXIF.SensingMethod_map_3" js="0">Two-chip color area sensor</word>
|
||||
<word key="EXIF.SensingMethod_map_4" js="0">Three-chip color area sensor</word>
|
||||
<word key="EXIF.SensingMethod_map_5" js="0">Color sequential area sensor</word>
|
||||
<word key="EXIF.SensingMethod_map_7" js="0">Trilinear sensor</word>
|
||||
<word key="EXIF.SensingMethod_map_8" js="0">Color sequential linear sensor</word>
|
||||
<word key="EXIF.FocalPlaneXResolution" js="0">Focal Plane X-Resolution</word>
|
||||
<word key="EXIF.FocalPlaneYResolution" js="0">Focal Plane Y-Resolution</word>
|
||||
<word key="EXIF.FocalPlaneResolutionUnit" js="0">Focal Plane Resolution Unit</word>
|
||||
<word key="INTEROP.InterOperabilityIndex" js="0">Inter-operability Index</word>
|
||||
<word key="INTEROP.InterOperabilityVersion" js="0">Inter-operability Version</word>
|
||||
<word key="INTEROP.RelatedImageWidth" js="0"></word>
|
||||
<word key="INTEROP.RelatedImageHeight" js="0"></word>
|
||||
<word key="MAKERNOTE.ImageType" js="0">Camera (Maker Note)</word>
|
||||
<word key="MAKERNOTE.FirmwareVersion" js="0">Firmware Version</word>
|
||||
<word key="MAKERNOTE.ImageNumber" js="0"></word>
|
||||
<word key="MAKERNOTE.OwnerName" js="0"></word>
|
||||
<word key="GPS.GPSVersion" js="0"></word>
|
||||
<word key="GPS.GPSAltitudeRef" js="0"></word>
|
||||
<word key="GPS.GPSProcessingMode" js="0"></word>
|
||||
<word key="EXIF.CFAPattern" js="0"></word>
|
||||
<word key="THUMBNAIL.Make" js="0"></word>
|
||||
<word key="THUMBNAIL.Model" js="0"></word>
|
||||
<word key="THUMBNAIL.XResolution" js="0"></word>
|
||||
<word key="THUMBNAIL.YResolution" js="0"></word>
|
||||
<word key="THUMBNAIL.DateTime" js="0"></word>
|
||||
<word key="THUMBNAIL.Compression" js="0"></word>
|
||||
<word key="THUMBNAIL.Compression_map_1" js="0"></word>
|
||||
<word key="THUMBNAIL.Compression_map_6" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_1" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_2" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_3" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_4" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_5" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_6" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_7" js="0"></word>
|
||||
<word key="THUMBNAIL.Orientation_map_8" js="0"></word>
|
||||
<word key="THUMBNAIL.ResolutionUnit" js="0"></word>
|
||||
<word key="THUMBNAIL.JPEGInterchangeFormat" js="0"></word>
|
||||
<word key="THUMBNAIL.JPEGInterchangeFormatLength" js="0"></word>
|
||||
<word key="THUMBNAIL.YCbCrPositioning" js="0"></word>
|
||||
<word key="THUMBNAIL.YCbCrPositioning_map_1" js="0"></word>
|
||||
<word key="THUMBNAIL.YCbCrPositioning_map_2" js="0"></word>
|
||||
<word key="digest_area_image" js="0">Images</word>
|
||||
<word key="digest_area_album" js="0">Albums</word>
|
||||
<word key="x_added_image_in" js="0">%s added an image in %s</word>
|
||||
<word key="x_commented_photo" js="0">%s commented on a photo</word>
|
||||
<word key="delete_note" js="1">Delete note</word>
|
||||
<word key="save_note" js="1">Save</word>
|
||||
<word key="saving_note" js="1">Saving...</word>
|
||||
<word key="cancel_note" js="1">Cancel</word>
|
||||
<word key="count_image" js="1">{# [1:image][?:images]}</word>
|
||||
<word key="delete_note_confirm" js="1">Are you sure you want to delete this note?</word>
|
||||
<word key="new_album" js="1"><![CDATA[Adding {{count}} to new album: <strong>{{album}}</strong>]]></word>
|
||||
<word key="existing_album" js="1"><![CDATA[Adding {{count}} to existing album: <strong>{{album}}</strong>]]></word>
|
||||
<word key="unsaved_image_data" js="1">You haven't saved your changes for this image. Are you sure you want to switch image?</word>
|
||||
<word key="unsaved_image_data_desc" js="1">Information for this image will be lost.</word>
|
||||
<word key="images_without_data" js="1">You haven't added any information for {{count}}. Are you sure you want to continue?</word>
|
||||
<word key="images_without_data_desc" js="1">You can edit the images later to update them.</word>
|
||||
<word key="set_as_photo_confirm" js="1">Are you sure you want to update your profile photo?</word>
|
||||
</app>
|
||||
</language>
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"admin": {
|
||||
"gallery": {
|
||||
"default_controller": null,
|
||||
"protected": 0
|
||||
},
|
||||
"stats": {
|
||||
"default_controller": null,
|
||||
"protected": 0
|
||||
}
|
||||
},
|
||||
"front": {
|
||||
"gallery": {
|
||||
"default_controller": "browse",
|
||||
"protected": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"key": "gallery_bandwidth_period",
|
||||
"default": "-1"
|
||||
},
|
||||
{
|
||||
"key": "gallery_detailed_bandwidth",
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"key": "gallery_large_dims",
|
||||
"default": "1600x1200"
|
||||
},
|
||||
{
|
||||
"key": "gallery_medium_dims",
|
||||
"default": "640x480"
|
||||
},
|
||||
{
|
||||
"key": "gallery_rss_enabled",
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"key": "gallery_small_dims",
|
||||
"default": "240x240"
|
||||
},
|
||||
{
|
||||
"key": "gallery_thumb_dims",
|
||||
"default": "100x100"
|
||||
},
|
||||
{
|
||||
"key": "gallery_use_square_thumbnails",
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"key": "gallery_watermark_path",
|
||||
"default": ""
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1 @@
|
||||
{"clearBandwidthLog":"P0Y0M1DT0H0M0S","clearUploads":"P0Y0M1DT0H0M0S"}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1,87 @@
|
||||
{
|
||||
"31000": "3.1.0 Beta 1",
|
||||
"31001": "3.1.0 RC 1",
|
||||
"31002": "3.1.0 RC 2",
|
||||
"31003": "3.1.0",
|
||||
"32000": "3.2.0 Beta 1",
|
||||
"32001": "3.2.0 Beta 2",
|
||||
"32002": "3.2.0 Beta 3",
|
||||
"32003": "3.2.0",
|
||||
"32004": "3.2.1",
|
||||
"32005": "3.2.2",
|
||||
"40000": "4.0.0 Beta 1",
|
||||
"40001": "4.0.0 Beta 2",
|
||||
"40002": "4.0.0 Beta 3",
|
||||
"40003": "4.0.0 Beta 4",
|
||||
"40004": "4.0.0 Beta 4a",
|
||||
"40005": "4.0.0 Beta 6",
|
||||
"40006": "4.0.0",
|
||||
"40007": "4.0.1",
|
||||
"40008": "4.0.2",
|
||||
"40009": "4.0.3",
|
||||
"40010": "4.0.4",
|
||||
"41000": "4.1.0 Beta 1",
|
||||
"41001": "4.1.0 Beta 2",
|
||||
"41002": "4.1.0",
|
||||
"41003": "4.1.1",
|
||||
"42000": "4.2.0 RC 1",
|
||||
"42001": "4.2.0",
|
||||
"42002": "4.2.1",
|
||||
"42003": "4.2.2",
|
||||
"50000": "5.0.0 Beta 1",
|
||||
"50001": "5.0.0 Beta 2",
|
||||
"50002": "5.0.0",
|
||||
"50003": "5.0.1",
|
||||
"50004": "5.0.2",
|
||||
"50005": "5.0.3",
|
||||
"50006": "5.0.4",
|
||||
"50007": "5.0.5",
|
||||
"50008": "5.0.6",
|
||||
"60000": "4.0.0",
|
||||
"100000": "4.0.0 Beta 0",
|
||||
"100001": "4.0.0 Beta 1",
|
||||
"100002": "4.0.0 Beta 2",
|
||||
"100003": "4.0.0 Beta 3",
|
||||
"100004": "4.0.0 Beta 3a",
|
||||
"100005": "4.0.0 Beta 4",
|
||||
"100006": "4.0.0 Beta 4a",
|
||||
"100007": "4.0.0 Beta 4b",
|
||||
"100008": "4.0.0 Beta 5",
|
||||
"100009": "4.0.0 Beta 5a",
|
||||
"100010": "4.0.0 Beta 6",
|
||||
"100011": "4.0.0 Beta 7",
|
||||
"100012": "4.0.0 Beta 7a",
|
||||
"100013": "4.0.0 Beta 8",
|
||||
"100014": "4.0.0 RC1",
|
||||
"100015": "4.0.0 RC2",
|
||||
"100016": "4.0.0 RC3",
|
||||
"100017": "4.0.0 RC4",
|
||||
"100018": "4.0.0 RC5",
|
||||
"100019": "4.0.0 RC5a",
|
||||
"100020": "4.0.0 RC6",
|
||||
"100021": "4.0.0 RC7",
|
||||
"100022": "4.0.0 RC7a",
|
||||
"100023": "4.0.0",
|
||||
"100024": "4.0.1",
|
||||
"100025": "4.0.2",
|
||||
"100026": "4.0.3",
|
||||
"100027": "4.0.4",
|
||||
"100028": "4.0.5",
|
||||
"100029": "4.0.5.1",
|
||||
"100030": "4.0.6",
|
||||
"100031": "4.0.6.1",
|
||||
"100032": "4.0.7",
|
||||
"100033": "4.0.8",
|
||||
"100034": "4.0.8.1",
|
||||
"100035": "4.0.9",
|
||||
"100036": "4.0.9.1",
|
||||
"100037": "4.0.9.2",
|
||||
"100038": "4.0.10",
|
||||
"100039": "4.0.10.1",
|
||||
"100040": "4.0.10.2",
|
||||
"100041": "4.0.11",
|
||||
"100042": "4.0.12",
|
||||
"100043": "4.0.12.1",
|
||||
"100044": "4.0.13",
|
||||
"100045": "4.0.13.1"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{"galleryStats":{"class":"\\IPS\\Widget\\PermissionCache","restrict":[],"default_area":""},"recentComments":{"class":"\\IPS\\Widget\\PermissionCache","restrict":["sidebar","cms"],"default_area":"","allow_reuse":false,"menu_style":"menu","embeddable":true},"imageFeed":{"class":"\\IPS\\Widget\\PermissionCache","restrict":["sidebar","cms"],"default_area":"","allow_reuse":true,"menu_style":"modal","embeddable":true}}
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Content Router extension: Gallery
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\ContentRouter;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Content Router extension: Gallery
|
||||
*/
|
||||
class _Gallery
|
||||
{
|
||||
/**
|
||||
* @brief Content Item Classes
|
||||
*/
|
||||
public $classes = array( 'IPS\gallery\Image' );
|
||||
|
||||
/**
|
||||
* @brief Owned Node Classes
|
||||
*/
|
||||
public $ownedNodes = array( 'IPS\gallery\Album' );
|
||||
|
||||
/**
|
||||
* Use a custom table helper when building content item tables
|
||||
*
|
||||
* @param string $className The content item class
|
||||
* @param \IPS\Http\Url $url The URL to use for the table
|
||||
* @param array $where Custom where clause to pass to the table helper
|
||||
* @return \IPS\Helpers\Table|void Custom table helper class to use
|
||||
*/
|
||||
public function customTableHelper( $className, $url, $where=array() )
|
||||
{
|
||||
if( !in_array( $className, $this->classes ) )
|
||||
{
|
||||
return new \IPS\Helpers\Table\Content( $className, $url, $where );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'gallery.css', 'gallery', 'front' ) );
|
||||
|
||||
if ( \IPS\Theme::i()->settings['responsive'] )
|
||||
{
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'gallery_responsive.css', 'gallery', 'front' ) );
|
||||
}
|
||||
|
||||
$table = new \IPS\gallery\Image\Table( $className, $url, $where );
|
||||
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'gallery' ), 'imageTable' );
|
||||
|
||||
/* Get rows template */
|
||||
if( isset( \IPS\Request::i()->cookie['thumbnailSize'] ) AND \IPS\Request::i()->cookie['thumbnailSize'] == 'large' AND \IPS\Request::i()->controller != 'search' )
|
||||
{
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'gallery' ), 'tableRowsLarge' );
|
||||
}
|
||||
else if( isset( \IPS\Request::i()->cookie['thumbnailSize'] ) AND \IPS\Request::i()->cookie['thumbnailSize'] == 'rows' AND \IPS\Request::i()->controller != 'search' )
|
||||
{
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'gallery' ), 'tableRowsRows' );
|
||||
}
|
||||
else
|
||||
{
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'gallery' ), 'tableRowsThumbs' );
|
||||
}
|
||||
|
||||
return $table;
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Create Menu Extension : gallery
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\CreateMenu;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Menu Extension: gallery
|
||||
*/
|
||||
class _gallery
|
||||
{
|
||||
/**
|
||||
* Get Items
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
if ( \IPS\gallery\Category::canOnAny( 'add' ) )
|
||||
{
|
||||
return array(
|
||||
'gallery_image' => array(
|
||||
'link' => \IPS\Http\Url::internal( "app=gallery&module=gallery&controller=submit&_new=1", 'front', 'gallery_submit' ),
|
||||
'extraData' => array( 'data-ipsDialog-size' => "narrow", 'data-ipsDialog' => true ),
|
||||
'title' => 'select_category'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return array();
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Dashboard extension: Overview
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\Dashboard;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Dashboard extension: Overview
|
||||
*/
|
||||
class _Overview
|
||||
{
|
||||
/**
|
||||
* Can the current user view this dashboard item?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function canView()
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the block HTML show on the dashboard
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getBlock()
|
||||
{
|
||||
/* Basic stats */
|
||||
$data = array(
|
||||
'total_disk_spaceg' => (int) \IPS\Db::i()->select( 'SUM(image_file_size)', 'gallery_images' )->first(),
|
||||
'total_images' => (int) \IPS\Db::i()->select( 'COUNT(*)', 'gallery_images' )->first(),
|
||||
'total_views' => (int) \IPS\Db::i()->select( 'SUM(image_views)', 'gallery_images' )->first(),
|
||||
'total_comments' => (int) \IPS\Db::i()->select( 'COUNT(*)', 'gallery_comments' )->first(),
|
||||
'total_albums' => (int) \IPS\Db::i()->select( 'COUNT(*)', 'gallery_albums' )->first(),
|
||||
);
|
||||
|
||||
/* Specific files (will fail if no files yet) */
|
||||
try
|
||||
{
|
||||
$data['largest_image'] = \IPS\gallery\Image::constructFromData( \IPS\Db::i()->select( '*', 'gallery_images', NULL, 'image_file_size DESC', 1 )->first() );
|
||||
$data['most_viewed_image'] = \IPS\gallery\Image::constructFromData( \IPS\Db::i()->select( '*', 'gallery_images', NULL, 'image_views DESC', 1 )->first() );
|
||||
}
|
||||
catch ( \Exception $e ) { }
|
||||
|
||||
/* Display */
|
||||
return \IPS\Theme::i()->getTemplate( 'dashboard', 'gallery' )->overview( $data );
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Editor Extension: Albums
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\EditorLocations;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Editor Extension: Albums
|
||||
*/
|
||||
class _Albums
|
||||
{
|
||||
/**
|
||||
* Can we use HTML in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canUseHtml( $member )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can we use attachments in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Helpers\Form\Editor $field The editor field
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canAttach( $member, $field )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Permission check for attachments
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return bool
|
||||
*/
|
||||
public function attachmentPermissionCheck( $member, $id1, $id2, $id3 )
|
||||
{
|
||||
try
|
||||
{
|
||||
$album = \IPS\gallery\Album::load( $id1 );
|
||||
return $album->can( 'view', $member );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attachment lookup
|
||||
*
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return \IPS\Http\Url|\IPS\Content|\IPS\Node\Model
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function attachmentLookup( $id1, $id2, $id3 )
|
||||
{
|
||||
return \IPS\gallery\Album::load( $id1 );
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Editor Extension: Categories
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\EditorLocations;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Editor Extension: Categories
|
||||
*/
|
||||
class _Categories
|
||||
{
|
||||
/**
|
||||
* Can we use HTML in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canUseHtml( $member )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can we use attachments in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Helpers\Form\Editor $field The editor field
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canAttach( $member, $field )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Permission check for attachments
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return bool
|
||||
*/
|
||||
public function attachmentPermissionCheck( $member, $id1, $id2, $id3 )
|
||||
{
|
||||
try
|
||||
{
|
||||
$category = \IPS\gallery\Category::load( $id1 );
|
||||
return $category->can( 'view', $member );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attachment lookup
|
||||
*
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return \IPS\Http\Url|\IPS\Content|\IPS\Node\Model
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function attachmentLookup( $id1, $id2, $id3 )
|
||||
{
|
||||
return \IPS\gallery\Category::load( $id1 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild attachment images in non-content item areas
|
||||
*
|
||||
* @param int|null $offset Offset to start from
|
||||
* @param int|null $max Maximum to parse
|
||||
* @return int Number completed
|
||||
* @note This method is optional and will only be called if it exists
|
||||
*/
|
||||
public function rebuildAttachmentImages( $offset, $max )
|
||||
{
|
||||
return $this->performRebuild( $offset, $max, array( 'IPS\Text\Parser', 'rebuildAttachmentUrls' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild content post-upgrade
|
||||
*
|
||||
* @param int|null $offset Offset to start from
|
||||
* @param int|null $max Maximum to parse
|
||||
* @return int Number completed
|
||||
* @note This method is optional and will only be called if it exists
|
||||
*/
|
||||
public function rebuildContent( $offset, $max )
|
||||
{
|
||||
return $this->performRebuild( $offset, $max, array( 'IPS\Text\LegacyParser', 'parseStatic' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform rebuild - abstracted as the call for rebuildContent() and rebuildAttachmentImages() is nearly identical
|
||||
*
|
||||
* @param int|null $offset Offset to start from
|
||||
* @param int|null $max Maximum to parse
|
||||
* @param callable $callback Method to call to rebuild content
|
||||
* @return int Number completed
|
||||
*/
|
||||
protected function performRebuild( $offset, $max, $callback )
|
||||
{
|
||||
$did = 0;
|
||||
|
||||
/* Language bits */
|
||||
foreach( \IPS\Db::i()->select( '*', 'core_sys_lang_words', "word_key LIKE 'gallery_album_%_desc' OR word_key LIKE 'gallery_category_%_desc' OR word_key LIKE 'gallery_category_%_permerror' OR word_key LIKE 'gallery_category_%_rules'", 'word_id ASC', array( $offset, $max ) ) as $word )
|
||||
{
|
||||
$did++;
|
||||
|
||||
try
|
||||
{
|
||||
$rebuilt = call_user_func( $callback, $word['word_custom'] );
|
||||
}
|
||||
catch( \InvalidArgumentException $e )
|
||||
{
|
||||
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
|
||||
{
|
||||
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
|
||||
}
|
||||
else
|
||||
{
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
if( $rebuilt !== FALSE )
|
||||
{
|
||||
\IPS\Db::i()->update( 'core_sys_lang_words', array( 'word_custom' => $rebuilt ), 'word_id=' . $word['word_id'] );
|
||||
}
|
||||
}
|
||||
|
||||
return $did;
|
||||
}
|
||||
|
||||
/**
|
||||
* Total content count to be used in progress indicator
|
||||
*
|
||||
* @return int Total Count
|
||||
*/
|
||||
public function contentCount()
|
||||
{
|
||||
return \IPS\Db::i()->select( 'COUNT(*)', 'core_sys_lang_words', "word_key LIKE 'gallery_album_%_desc' OR word_key LIKE 'gallery_category_%_desc' OR word_key LIKE 'gallery_category_%_permerror' OR word_key LIKE 'gallery_category_%_rules'" )->first();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Editor Extension: Image comments
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 13 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\EditorLocations;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Editor Extension: Image comments
|
||||
*/
|
||||
class _Gallery extends \IPS\gallery\extensions\core\EditorLocations\Images
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Editor Extension: Images
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\EditorLocations;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Editor Extension: Images
|
||||
*/
|
||||
class _Images
|
||||
{
|
||||
/**
|
||||
* Can we use HTML in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canUseHtml( $member )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can we use attachments in this editor?
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param \IPS\Helpers\Form\Editor $field The editor field
|
||||
* @return bool|null NULL will cause the default value (based on the member's permissions) to be used, and is recommended in most cases. A boolean value will override that.
|
||||
*/
|
||||
public function canAttach( $member, $field )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Permission check for attachments
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return bool
|
||||
*/
|
||||
public function attachmentPermissionCheck( $member, $id1, $id2, $id3 )
|
||||
{
|
||||
try
|
||||
{
|
||||
$image = \IPS\gallery\Image::load( $id1 );
|
||||
return $image->canView( $member );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attachment lookup
|
||||
*
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @return \IPS\Http\Url|\IPS\Content|\IPS\Node\Model
|
||||
* @throws \LogicException
|
||||
*/
|
||||
public function attachmentLookup( $id1, $id2, $id3 )
|
||||
{
|
||||
if ( $id2 )
|
||||
{
|
||||
return \IPS\gallery\Image\Comment::load( $id2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
return \IPS\gallery\Image::load( $id1 );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Editor Media: Images
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\EditorMedia;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Editor Media: Images
|
||||
*/
|
||||
class _Images
|
||||
{
|
||||
/**
|
||||
* Get Counts
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param string $postKey The post key
|
||||
* @param string|null $search The search term (or NULL for all)
|
||||
* @return array array( 'Title' => 0 )
|
||||
*/
|
||||
public function count( $member, $postKey, $search=NULL )
|
||||
{
|
||||
$where = array(
|
||||
array( "image_member_id=? AND image_approved=?", $member->member_id, 1 ),
|
||||
);
|
||||
|
||||
if ( $search )
|
||||
{
|
||||
$where[] = array( "image_caption LIKE ( CONCAT( '%', ?, '%' ) )", $search );
|
||||
}
|
||||
|
||||
return \IPS\Db::i()->select( 'COUNT(*)', 'gallery_images', $where )->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Files
|
||||
*
|
||||
* @param \IPS\Member $member The member
|
||||
* @param string|null $search The search term (or NULL for all)
|
||||
* @param string $postKey The post key
|
||||
* @param int $page Page
|
||||
* @param int $limit Number to get
|
||||
* @return array array( 'Title' => array( (IPS\File, \IPS\File, ... ), ... )
|
||||
*/
|
||||
public function get( $member, $search, $postKey, $page, $limit )
|
||||
{
|
||||
$where = array(
|
||||
array( "image_member_id=? AND image_approved=?", $member->member_id, 1 ),
|
||||
);
|
||||
|
||||
if ( $search )
|
||||
{
|
||||
$where[] = array( "image_caption LIKE ( CONCAT( '%', ?, '%' ) )", $search );
|
||||
}
|
||||
|
||||
$return = array();
|
||||
foreach ( \IPS\Db::i()->select( '*', 'gallery_images', $where, 'image_date DESC', array( ( $page - 1 ) * $limit, $limit ) ) as $row )
|
||||
{
|
||||
$image = \IPS\gallery\Image::load( $row['image_id'] );
|
||||
$obj = \IPS\File::get( 'gallery_Images', $row['image_masked_file_name'] );
|
||||
$obj->contextInfo = \IPS\Theme::i()->getTemplate( 'global', 'gallery', 'global' )->link( $image );
|
||||
$return[ (string) $image->url() ] = $obj;
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,257 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief File Storage Extension: Images
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\FileStorage;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* File Storage Extension: Images
|
||||
*/
|
||||
class _Images
|
||||
{
|
||||
/**
|
||||
* Count stored files
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return \IPS\Db::i()->select( 'COUNT(*)', 'gallery_images' )->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Move stored files
|
||||
*
|
||||
* @param int $offset This will be sent starting with 0, increasing to get all files stored by this extension
|
||||
* @param int $storageConfiguration New storage configuration ID
|
||||
* @param int|NULL $oldConfiguration Old storage configuration ID
|
||||
* @throws \Underflowexception When file record doesn't exist. Indicating there are no more files to move
|
||||
* @return void
|
||||
*/
|
||||
public function move( $offset, $storageConfiguration, $oldConfiguration=NULL )
|
||||
{
|
||||
$image = \IPS\Db::i()->select( '*', 'gallery_images', array(), 'image_id', array( $offset, 1 ) )->first();
|
||||
$update = array();
|
||||
|
||||
if( $image['image_thumb_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
$file = \IPS\File::get( $oldConfiguration ?: 'gallery_Images', $image['image_thumb_file_name'] )->move( $storageConfiguration );
|
||||
$update['image_thumb_file_name'] = (string) $file;
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
/* Any issues are logged */
|
||||
}
|
||||
}
|
||||
|
||||
if( $image['image_small_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
$file = \IPS\File::get( $oldConfiguration ?: 'gallery_Images', $image['image_small_file_name'] )->move( $storageConfiguration );
|
||||
$update['image_small_file_name'] = (string) $file;
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
/* Any issues are logged */
|
||||
}
|
||||
}
|
||||
|
||||
if( $image['image_masked_file_name'] )
|
||||
{
|
||||
if( $image['image_masked_file_name'] == $image['image_small_file_name'] AND isset( $update['image_small_file_name'] ) )
|
||||
{
|
||||
$update['image_masked_file_name'] = $update['image_small_file_name'];
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$file = \IPS\File::get( $oldConfiguration ?: 'gallery_Images', $image['image_masked_file_name'] )->move( $storageConfiguration );
|
||||
$update['image_masked_file_name'] = (string) $file;
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
/* Any issues are logged */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( $image['image_medium_file_name'] )
|
||||
{
|
||||
if( $image['image_medium_file_name'] == $image['image_masked_file_name'] AND isset( $update['image_masked_file_name'] ) )
|
||||
{
|
||||
$update['image_medium_file_name'] = $update['image_masked_file_name'];
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$file = \IPS\File::get( $oldConfiguration ?: 'gallery_Images', $image['image_medium_file_name'] )->move( $storageConfiguration );
|
||||
$update['image_medium_file_name'] = (string) $file;
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
/* Any issues are logged */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( $image['image_original_file_name'] )
|
||||
{
|
||||
if( $image['image_original_file_name'] == $image['image_masked_file_name'] AND isset( $update['image_masked_file_name'] ) )
|
||||
{
|
||||
$update['image_original_file_name'] = $update['image_masked_file_name'];
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$file = \IPS\File::get( $oldConfiguration ?: 'gallery_Images', $image['image_original_file_name'] )->move( $storageConfiguration );
|
||||
$update['image_original_file_name'] = (string) $file;
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
/* Any issues are logged */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $update ) )
|
||||
{
|
||||
foreach( $update as $k => $v )
|
||||
{
|
||||
if ( $update[ $k ] == $image[ $k ] )
|
||||
{
|
||||
unset( $update[ $k ] );
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $update ) )
|
||||
{
|
||||
\IPS\Db::i()->update( 'gallery_images', $update, array( 'image_id=?', $image['image_id'] ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix all URLs
|
||||
*
|
||||
* @param int $offset This will be sent starting with 0, increasing to get all files stored by this extension
|
||||
* @return void
|
||||
*/
|
||||
public function fixUrls( $offset )
|
||||
{
|
||||
$image = \IPS\Db::i()->select( '*', 'gallery_images', array(), 'image_id', array( $offset, 1 ) )->first();
|
||||
$update = array();
|
||||
|
||||
foreach( array( 'image_thumb_file_name', 'image_small_file_name', 'image_masked_file_name', 'image_medium_file_name', 'image_original_file_name' ) as $key )
|
||||
{
|
||||
if( $image[ $key ] )
|
||||
{
|
||||
if ( $new = \IPS\File::repairUrl( $image[ $key ] ) )
|
||||
{
|
||||
$update[ $key ] = $new;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( count( $update ) )
|
||||
{
|
||||
\IPS\Db::i()->update( 'gallery_images', $update, array( 'image_id=?', $image['image_id'] ) );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a file is valid
|
||||
*
|
||||
* @param \IPS\Http\Url $file The file to check
|
||||
* @return bool
|
||||
*/
|
||||
public function isValidFile( $file )
|
||||
{
|
||||
try
|
||||
{
|
||||
$record = \IPS\Db::i()->select( '*', 'gallery_images', array( 'image_masked_file_name=? OR image_medium_file_name=? OR image_original_file_name=? OR image_thumb_file_name=? OR image_small_file_name=?', (string) $file, (string) $file, (string) $file, (string) $file, (string) $file ) )->first();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
catch ( \UnderflowException $e )
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete all stored files
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function delete()
|
||||
{
|
||||
foreach( \IPS\Db::i()->select( '*', 'gallery_images' ) as $image )
|
||||
{
|
||||
if( $image['image_masked_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'gallery_Images', $image['image_masked_file_name'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
|
||||
if( $image['image_original_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'gallery_Images', $image['image_original_file_name'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
|
||||
if( $image['image_medium_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'gallery_Images', $image['image_medium_file_name'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
|
||||
if( $image['image_thumb_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'gallery_Images', $image['image_thumb_file_name'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
|
||||
if( $image['image_small_file_name'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\File::get( 'gallery_Images', $image['image_small_file_name'] )->delete();
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Front Navigation Extension: Gallery
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\FrontNavigation;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Front Navigation Extension: Gallery
|
||||
*/
|
||||
class _Gallery
|
||||
{
|
||||
/**
|
||||
* Can access?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function canView()
|
||||
{
|
||||
return !\IPS\Application::load('gallery')->hide_tab and \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'gallery', 'gallery' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Title
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function title()
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->addToStack('frontnavigation_gallery');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Link
|
||||
*
|
||||
* @return \IPS\Http\Url
|
||||
*/
|
||||
public function link()
|
||||
{
|
||||
return \IPS\Http\Url::internal( "app=gallery&module=gallery&controller=browse", 'front', 'gallery' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Is Active?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function active()
|
||||
{
|
||||
return \IPS\Dispatcher::i()->application->directory === 'gallery';
|
||||
}
|
||||
|
||||
/**
|
||||
* Children
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function children()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Admin CP Group Form
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\GroupForm;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Admin CP Group Form
|
||||
*/
|
||||
class _Gallery
|
||||
{
|
||||
/**
|
||||
* Process Form
|
||||
*
|
||||
* @param \IPS\Form\Tabbed $form The form
|
||||
* @param \IPS\Member\Group $group Existing Group
|
||||
* @return void
|
||||
*/
|
||||
public function process( &$form, $group )
|
||||
{
|
||||
$form->addHeader( 'gallery_album_permissions' );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'g_create_albums', $group->g_create_albums, FALSE, array( 'togglesOn' => array( 'g_create_albums_private', 'g_create_albums_fo', 'g_delete_own_albums', 'g_album_limit', 'g_img_album_limit' ) ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'g_create_albums_private', $group->g_create_albums_private, FALSE, array(), NULL, NULL, NULL, 'g_create_albums_private' ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'g_create_albums_fo', $group->g_create_albums_fo, FALSE, array(), NULL, NULL, NULL, 'g_create_albums_fo' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_album_limit', $group->g_album_limit, FALSE, array( 'unlimited' => 0 ), NULL, NULL, NULL, 'g_album_limit' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_img_album_limit', $group->g_img_album_limit, FALSE, array( 'unlimited' => 0 ), NULL, NULL, NULL, 'g_img_album_limit' ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'g_delete_own_albums', $group->g_delete_own_albums, FALSE, array(), NULL, NULL, NULL, 'g_delete_own_albums' ) );
|
||||
|
||||
$form->addHeader( 'gallery_restrictions' );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'g_movies', $group->g_movies, FALSE, array( 'togglesOn' => array( 'g_movie_size' ) ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_movie_size', $group->g_movie_size, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('gallery_suffix_kb'), 'g_movie_size' ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_max_upload', $group->g_max_upload, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('gallery_suffix_kb') ) );
|
||||
|
||||
$form->addMessage( 'gallery_requires_log' );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_max_transfer', $group->g_max_transfer, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('gallery_suffix_kb_day') ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'g_max_views', $group->g_max_views, FALSE, array( 'unlimited' => 0 ), NULL, NULL, \IPS\Member::loggedIn()->language()->addToStack('gallery_suffix_day') ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save
|
||||
*
|
||||
* @param array $values Values from form
|
||||
* @param \IPS\Member\Group $group The group
|
||||
* @return void
|
||||
*/
|
||||
public function save( $values, &$group )
|
||||
{
|
||||
$group->g_create_albums = $values['g_create_albums'];
|
||||
$group->g_create_albums_private = $values['g_create_albums_private'];
|
||||
$group->g_create_albums_fo = $values['g_create_albums_fo'];
|
||||
$group->g_album_limit = $values['g_album_limit'];
|
||||
$group->g_img_album_limit = $values['g_img_album_limit'];
|
||||
$group->g_delete_own_albums = $values['g_delete_own_albums'];
|
||||
$group->g_movies = $values['g_movies'];
|
||||
$group->g_movie_size = $values['g_movie_size'];
|
||||
$group->g_max_upload = $values['g_max_upload'];
|
||||
$group->g_max_transfer = $values['g_max_transfer'];
|
||||
$group->g_max_views = $values['g_max_views'];
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Group Limits
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 23 May 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\GroupLimits;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Group Limits
|
||||
*
|
||||
* This extension is used to define which limit values "win" when a user has secondary groups defined
|
||||
*
|
||||
*/
|
||||
class _Album
|
||||
{
|
||||
/**
|
||||
* Get group limits by priority
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getLimits()
|
||||
{
|
||||
return array (
|
||||
'exclude' => array(),
|
||||
'lessIsMore' => array(),
|
||||
'neg1IsBest' => array(),
|
||||
'zeroIsBest' => array( 'g_album_limit' ),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief ACP Live Search Extension
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\LiveSearch;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ACP Live Search Extension
|
||||
*/
|
||||
class _Categories
|
||||
{
|
||||
/**
|
||||
* Check we have access
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function hasAccess()
|
||||
{
|
||||
/* Check Permissions */
|
||||
return \IPS\Member::loggedIn()->hasAcpRestriction( 'gallery', 'gallery', 'categories_manage' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the search results
|
||||
*
|
||||
* @param string Search Term
|
||||
* @return array Array of results
|
||||
*/
|
||||
public function getResults( $searchTerm )
|
||||
{
|
||||
/* Init */
|
||||
$results = array();
|
||||
$searchTerm = mb_strtolower( $searchTerm );
|
||||
|
||||
/* Start with categories */
|
||||
if( $this->hasAccess() )
|
||||
{
|
||||
/* Perform the search */
|
||||
$categories = \IPS\Db::i()->select(
|
||||
"*",
|
||||
'gallery_categories',
|
||||
array( "word_custom LIKE CONCAT( '%', ?, '%' ) AND lang_id=?", $searchTerm, \IPS\Member::loggedIn()->language()->id ),
|
||||
NULL,
|
||||
NULL
|
||||
)->join(
|
||||
'core_sys_lang_words',
|
||||
"word_key=CONCAT( 'gallery_category_', category_id )"
|
||||
);
|
||||
|
||||
/* Format results */
|
||||
foreach ( $categories as $category )
|
||||
{
|
||||
$category = \IPS\gallery\Category::constructFromData( $category );
|
||||
|
||||
$results[] = \IPS\Theme::i()->getTemplate( 'livesearch', 'gallery', 'admin' )->category( $category );
|
||||
}
|
||||
}
|
||||
|
||||
return $results;
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Admin CP Member Form
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 07 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\MemberForm;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Admin CP Member Form
|
||||
*/
|
||||
class _Images
|
||||
{
|
||||
/**
|
||||
* Process Form
|
||||
*
|
||||
* @param \IPS\Form\Tabbed $form The form
|
||||
* @param \IPS\Member $member Existing Member
|
||||
* @return void
|
||||
*/
|
||||
public function process( &$form, $member )
|
||||
{
|
||||
$form->addMessage( "<a href='" . \IPS\Http\Url::internal( 'app=gallery&module=stats&controller=member&do=images&id=' . $member->member_id ) . "'>" . \IPS\Member::loggedIn()->language()->addToStack('gallery_stats') . '</a>', '', FALSE );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'remove_gallery_access', !$member->members_bitoptions['remove_gallery_access'], NULL, array( 'togglesOn' => array( 'remove_gallery_upload' ) ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'remove_gallery_upload', !$member->members_bitoptions['remove_gallery_upload'], NULL, array(), NULL, NULL, NULL, 'remove_gallery_upload' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save
|
||||
*
|
||||
* @param array $values Values from form
|
||||
* @param \IPS\Member $member The member
|
||||
* @return void
|
||||
*/
|
||||
public function save( $values, &$member )
|
||||
{
|
||||
$member->members_bitoptions['remove_gallery_access'] = !$values['remove_gallery_access'];
|
||||
$member->members_bitoptions['remove_gallery_upload'] = !$values['remove_gallery_upload'];
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,65 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Member Sync
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\MemberSync;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Member Sync
|
||||
*/
|
||||
class _Gallery
|
||||
{
|
||||
/**
|
||||
* Member is merged with another member
|
||||
*
|
||||
* @param \IPS\Member $member Member being kept
|
||||
* @param \IPS\Member $member2 Member being removed
|
||||
* @return void
|
||||
*/
|
||||
public function onMerge( $member, $member2 )
|
||||
{
|
||||
\IPS\Db::i()->update( 'gallery_albums', array( 'album_owner_id' => $member->member_id ), array( 'album_owner_id=?', $member2->member_id ) );
|
||||
\IPS\Db::i()->update( 'gallery_bandwidth', array( 'member_id' => $member->member_id ), array( 'member_id=?', $member2->member_id ) );
|
||||
\IPS\Db::i()->update( 'gallery_images_uploads', array( 'upload_member_id' => $member->member_id ), array( 'upload_member_id=?', $member2->member_id ) );
|
||||
|
||||
foreach( \IPS\gallery\Album::loadByOwner( $member2 ) as $album )
|
||||
{
|
||||
$album->owner_id = $member->member_id;
|
||||
$album->save();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Member is deleted
|
||||
*
|
||||
* @param $member \IPS\Member The member
|
||||
* @return void
|
||||
*/
|
||||
public function onDelete( $member )
|
||||
{
|
||||
\IPS\Db::i()->delete( 'gallery_bandwidth', array( 'member_id=?', $member->member_id ) );
|
||||
\IPS\Db::i()->delete( 'gallery_images_uploads', array( 'upload_member_id=?', $member->member_id ) );
|
||||
|
||||
foreach( \IPS\gallery\Album::loadByOwner( $member ) as $album )
|
||||
{
|
||||
//$album->delete();
|
||||
$album->owner_id = 0;
|
||||
$album->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Permissions
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage
|
||||
* @since 16 Apr 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\Permissions;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Permissions
|
||||
*/
|
||||
class _Permissions
|
||||
{
|
||||
/**
|
||||
* Get node classes
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getNodeClasses()
|
||||
{
|
||||
return array(
|
||||
'IPS\gallery\Category' => function( $current, $group )
|
||||
{
|
||||
$rows = array();
|
||||
foreach( \IPS\gallery\Category::roots( NULL ) AS $root )
|
||||
{
|
||||
\IPS\gallery\Category::populatePermissionMatrix( $rows, $root, $group, $current );
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Profile extension: Gallery
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 02 Apr 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\Profile;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Profile extension: Gallery
|
||||
*/
|
||||
class _gallery
|
||||
{
|
||||
/**
|
||||
* Member
|
||||
*/
|
||||
protected $member;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param \IPS\Member $member Member whose profile we are viewing
|
||||
* @return void
|
||||
*/
|
||||
public function __construct( \IPS\Member $member )
|
||||
{
|
||||
$this->member = $member;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is there content to display?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function showTab()
|
||||
{
|
||||
$where = array( array( 'album_owner_id=?', $this->member->member_id ) );
|
||||
|
||||
if( count( \IPS\Member::loggedIn()->socialGroups() ) )
|
||||
{
|
||||
$where[] = array( '( album_type=1 OR ( album_type=2 AND album_owner_id=? ) OR ( album_type=3 AND ( album_owner_id=? OR ( album_allowed_access IS NOT NULL AND album_allowed_access IN(' . implode( ',', \IPS\Member::loggedIn()->socialGroups() ) . ') ) ) ) )', \IPS\Member::loggedIn()->member_id, \IPS\Member::loggedIn()->member_id );
|
||||
}
|
||||
else
|
||||
{
|
||||
$where[] = array( '( album_type=1 OR ( album_type IN (2,3) AND album_owner_id=? ) )', \IPS\Member::loggedIn()->member_id );
|
||||
}
|
||||
|
||||
return (bool) \IPS\Db::i()->select( 'COUNT(*)', 'gallery_albums', $where )->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Display
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function render()
|
||||
{
|
||||
\IPS\Output::i()->cssFiles = array_merge( \IPS\Output::i()->cssFiles, \IPS\Theme::i()->css( 'profile.css', 'gallery', 'front' ) );
|
||||
|
||||
$table = new \IPS\gallery\Album\Table( $this->member->url()->setQueryString( 'tab', 'node_gallery_gallery') );
|
||||
$table->setOwner( $this->member );
|
||||
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'global', 'gallery' ), 'profileAlbumTable' );
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'global', 'gallery' ), 'profileAlbumRow' );
|
||||
|
||||
return (string) $table;
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,76 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Background Task
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage
|
||||
* @since 23 Sep 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\extensions\core\Queue;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Background Task
|
||||
*/
|
||||
class _Follow
|
||||
{
|
||||
/**
|
||||
* Run Background Task
|
||||
*
|
||||
* @param mixed $data Data as it was passed to \IPS\Task::queue()
|
||||
* @param int $offset Offset
|
||||
* @return int|null New offset or NULL if complete
|
||||
* @throws \OutOfRangeException Indicates offset doesn't exist and thus task is complete
|
||||
*/
|
||||
public function run( $data, $offset )
|
||||
{
|
||||
$category = \IPS\gallery\Category::load( $data['category_id'] );
|
||||
$album = ( !is_null( $data['album_id'] ) ) ? \IPS\gallery\Album::load( $data['album_id'] ) : NULL;
|
||||
$member = \IPS\Member::load( $data['member_id'] );
|
||||
return \IPS\gallery\Image::_sendNotificationsBatch( $category, $album, $member, $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Progress
|
||||
*
|
||||
* @param mixed $data Data as it was passed to \IPS\Task::queue()
|
||||
* @param int $offset Offset
|
||||
* @return array( 'text' => 'Doing something...', 'complete' => 50 ) Text explaning task and percentage complete
|
||||
* @throws \OutOfRangeException Indicates offset doesn't exist and thus task is complete
|
||||
*/
|
||||
public function getProgress( $data, $offset )
|
||||
{
|
||||
if ( !is_null( $data['album_id'] ) )
|
||||
{
|
||||
$numberOfFollowers = \IPS\gallery\Image::_notificationRecipients( \IPS\gallery\Category::load( $data['category_id'] ), \IPS\gallery\Album::load( $data['album_id'] ) )->count( TRUE );
|
||||
}
|
||||
else
|
||||
{
|
||||
$numberOfFollowers = \IPS\gallery\Image::_notificationRecipients( \IPS\gallery\Category::load( $data['category_id'] ) )->count( TRUE );
|
||||
}
|
||||
|
||||
if ( $numberOfFollowers )
|
||||
{
|
||||
$complete = round( 100 / $numberOfFollowers * $offset, 2 );
|
||||
}
|
||||
else
|
||||
{
|
||||
$complete = 100;
|
||||
}
|
||||
|
||||
$directContainer = ( !is_null( $data['album_id'] ) ) ? \IPS\gallery\Album::load( $data['album_id'] ) : \IPS\gallery\Category::load( $data['category_id'] );
|
||||
|
||||
$title = $directContainer->_title;
|
||||
return array( 'text' => \IPS\Member::loggedIn()->language()->addToStack('backgroundQueue_follow', FALSE, array( 'htmlsprintf' => array( "<a href='{$directContainer->url()}' target='_blank'>{$title}</a>" ) ) ), 'complete' => $complete );
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
Whitespace-only changes.
@@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Gallery image download handler
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @since 30 May 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
require_once str_replace( 'applications/gallery/interface/legacy/image.php', '', str_replace( '\\', '/', __FILE__ ) ) . 'init.php';
|
||||
\IPS\Session\Front::i();
|
||||
|
||||
try
|
||||
{
|
||||
/* Get file and data */
|
||||
$config = \IPS\File::getClass( 'gallery_Images' );
|
||||
$file = \IPS\File::get( 'gallery_Images', \IPS\Request::i()->path );
|
||||
|
||||
$headers = array_merge( \IPS\Output::getCacheHeaders( time(), 360 ), array( "Content-Disposition" => \IPS\Output::getContentDisposition( 'inline', $file->originalFilename ), "X-Content-Type-Options" => "nosniff" ) );
|
||||
|
||||
/* Send headers and print file */
|
||||
\IPS\Output::i()->sendStatusCodeHeader( 200 );
|
||||
\IPS\Output::i()->sendHeader( "Content-type: " . \IPS\File::getMimeType( $file->originalFilename ) . ";charset=UTF-8" );
|
||||
|
||||
foreach( $headers as $key => $header )
|
||||
{
|
||||
\IPS\Output::i()->sendHeader( $key . ': ' . $header );
|
||||
}
|
||||
\IPS\Output::i()->sendHeader( "Content-Length: " . $file->filesize() );
|
||||
|
||||
$file->printFile();
|
||||
exit;
|
||||
}
|
||||
catch ( \UnderflowException $e )
|
||||
{
|
||||
\IPS\Output::i()->sendOutput( '', 404 );
|
||||
}
|
||||
Whitespace-only changes.
Whitespace-only changes.
Binary file not shown.
@@ -0,0 +1,28 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>Generated by IcoMoon</metadata>
|
||||
<defs>
|
||||
<font id="icomoon" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " d="" horiz-adv-x="512" />
|
||||
<glyph unicode="" d="M1024 960v-416l-160 160-192-192-96 96 192 192-160 160zM448 288l-192-192 160-160h-416v416l160-160 192 192z" />
|
||||
<glyph unicode="" d="M192 832l640-384-640-384z" />
|
||||
<glyph unicode="" d="M128 832h320v-768h-320zM576 832h320v-768h-320z" />
|
||||
<glyph unicode="" d="M401.332 881.332c25.668 25.668 46.668 16.968 46.668-19.332v-828c0-36.3-21-44.998-46.668-19.33l-241.332 241.33h-160v384h160l241.332 241.332z" />
|
||||
<glyph unicode="" d="M549.020 218.98c-12.286 0-24.568 4.686-33.942 14.058-18.746 18.746-18.746 49.136 0 67.882 81.1 81.1 81.1 213.058 0 294.156-18.746 18.746-18.746 49.138 0 67.882 18.746 18.744 49.136 18.744 67.882 0 118.53-118.53 118.53-311.392 0-429.922-9.372-9.37-21.656-14.056-33.94-14.056zM401.332 881.332c25.668 25.668 46.668 16.968 46.668-19.332v-828c0-36.3-21-44.998-46.668-19.33l-241.332 241.33h-160v384h160l241.332 241.332z" />
|
||||
<glyph unicode="" d="M719.53 128.47c-12.286 0-24.568 4.686-33.942 14.058-18.744 18.744-18.744 49.136 0 67.882 131.006 131.006 131.006 344.17 0 475.176-18.744 18.746-18.744 49.138 0 67.882 18.744 18.742 49.138 18.744 67.882 0 81.594-81.592 126.53-190.076 126.53-305.468 0-115.39-44.936-223.876-126.53-305.47-9.372-9.374-21.656-14.060-33.94-14.060zM549.020 218.98c-12.286 0-24.568 4.686-33.942 14.058-18.746 18.746-18.746 49.136 0 67.882 81.1 81.1 81.1 213.058 0 294.156-18.746 18.746-18.746 49.138 0 67.882 18.746 18.744 49.136 18.744 67.882 0 118.53-118.53 118.53-311.392 0-429.922-9.372-9.37-21.656-14.056-33.94-14.056zM401.332 881.332c25.668 25.668 46.668 16.968 46.668-19.332v-828c0-36.3-21-44.998-46.668-19.33l-241.332 241.33h-160v384h160l241.332 241.332z" />
|
||||
<glyph unicode="" d="M890.040 37.96c-12.286 0-24.568 4.686-33.942 14.058-18.744 18.746-18.744 49.136 0 67.882 87.638 87.642 135.904 204.16 135.904 328.1 0 123.938-48.266 240.458-135.904 328.098-18.744 18.746-18.744 49.138 0 67.882 18.744 18.744 49.138 18.744 67.882 0 105.77-105.772 164.022-246.4 164.022-395.98 0-149.582-58.252-290.208-164.022-395.98-9.372-9.374-21.656-14.060-33.94-14.060zM719.53 128.47c-12.286 0-24.568 4.686-33.942 14.058-18.744 18.744-18.744 49.136 0 67.882 131.006 131.006 131.006 344.17 0 475.176-18.744 18.746-18.744 49.138 0 67.882 18.744 18.742 49.138 18.744 67.882 0 81.594-81.592 126.53-190.076 126.53-305.468 0-115.39-44.936-223.876-126.53-305.47-9.372-9.374-21.656-14.060-33.94-14.060zM549.020 218.98c-12.286 0-24.568 4.686-33.942 14.058-18.746 18.746-18.746 49.136 0 67.882 81.1 81.1 81.1 213.058 0 294.156-18.746 18.746-18.746 49.138 0 67.882 18.746 18.744 49.136 18.744 67.882 0 118.53-118.53 118.53-311.392 0-429.922-9.372-9.37-21.656-14.056-33.94-14.056zM401.332 881.332c25.668 25.668 46.668 16.968 46.668-19.332v-828c0-36.3-21-44.998-46.668-19.33l-241.332 241.33h-160v384h160l241.332 241.332z" horiz-adv-x="1088" />
|
||||
<glyph unicode="" d="M512 960l-320-512 320-512 320 512z" />
|
||||
<glyph unicode="" d="M0 960h1374.316v-1030.414h-1374.316v1030.414zM1245.462 449.276c-1.706 180.052-8.542 258.568-51.2 314.036-7.68 11.946-22.186 18.772-34.132 27.296-41.814 30.73-238.944 41.814-467.636 41.814-228.702 0-435.21-11.084-476.17-41.814-12.8-8.524-27.316-15.35-35.84-27.296-41.822-55.468-47.786-133.984-50.346-314.036 2.56-180.062 8.524-258.57 50.346-314.036 8.524-12.8 23.040-18.774 35.84-27.306 40.96-31.574 247.468-41.814 476.17-43.52 228.692 1.706 425.822 11.946 467.636 43.52 11.946 8.532 26.452 14.506 34.132 27.306 42.658 55.466 49.494 133.974 51.2 314.036zM662.358 495.904c-11.58 140.898-86.51 223.906-220.556 223.906-122.458 0-218.722-110.432-218.722-287.88 0-178.212 87.73-289.396 232.734-289.396 115.766 0 196.798 85.298 209.588 226.95h-138.302c-5.48-52.548-27.414-92.914-73.72-92.914-73.108 0-86.51 72.354-86.51 149.27 0 105.868 30.46 159.932 81.032 159.932 45.082 0 73.718-32.75 77.976-89.868h136.48zM1140.026 495.904c-11.57 140.898-86.51 223.906-220.546 223.906-122.466 0-218.722-110.432-218.722-287.88 0-178.212 87.73-289.396 232.734-289.396 115.758 0 196.788 85.298 209.58 226.95h-138.304c-5.47-52.548-27.404-92.914-73.71-92.914-73.116 0-86.518 72.354-86.518 149.27 0 105.868 30.468 159.932 81.030 159.932 45.084 0 73.728-32.75 77.986-89.868h136.47z" horiz-adv-x="1374" />
|
||||
<glyph unicode="" d="M128 832h768v-768h-768z" />
|
||||
<glyph unicode="" d="M384 832c0-70.692 57.308-128 128-128s128 57.308 128 128c0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM655.53 719.53c0-70.692 57.308-128 128-128s128 57.308 128 128c0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM832 448c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM719.53 176.47c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64zM448.002 64c0 0 0 0 0 0 0-35.346 28.654-64 64-64 35.346 0 64 28.654 64 64 0 0 0 0 0 0 0 0 0 0 0 0 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64s0 0 0 0zM176.472 176.47c0 0 0 0 0 0 0-35.346 28.654-64 64-64 35.346 0 64 28.654 64 64 0 0 0 0 0 0 0 0 0 0 0 0 0 35.346-28.654 64-64 64-35.346 0-64-28.654-64-64s0 0 0 0zM144.472 719.53c0 0 0 0 0 0 0-53.019 42.981-96 96-96 53.019 0 96 42.981 96 96 0 0 0 0 0 0 0 0 0 0 0 0 0 53.019-42.981 96-96 96-53.019 0-96-42.981-96-96s0 0 0 0zM56 448c0-39.765 32.235-72 72-72s72 32.235 72 72c0 39.765-32.235 72-72 72-39.765 0-72-32.235-72-72z" />
|
||||
<glyph unicode="" d="M448 384v-416l-160 160-192-192-96 96 192 192-160 160zM1024 864l-192-192 160-160h-416v416l160-160 192 192z" />
|
||||
<glyph unicode="" d="M512 896c282.77 0 512-186.25 512-416 0-229.752-229.23-416-512-416-27.156 0-53.81 1.734-79.824 5.044-109.978-109.978-241.25-129.7-368.176-132.596v26.916c68.536 33.578 128 94.74 128 164.636 0 9.754-0.758 19.33-2.164 28.696-115.796 76.264-189.836 192.754-189.836 323.304 0 229.75 229.23 416 512 416z" />
|
||||
<glyph unicode="" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 704c141.384 0 256-114.616 256-256s-114.616-256-256-256-256 114.616-256 256 114.616 256 256 256zM817.47 142.53c-81.594-81.594-190.080-126.53-305.47-126.53-115.392 0-223.876 44.936-305.47 126.53-81.594 81.594-126.53 190.078-126.53 305.47 0 115.39 44.936 223.876 126.53 305.47l67.882-67.882c0 0 0 0 0 0-131.006-131.006-131.006-344.17 0-475.176 63.462-63.462 147.838-98.412 237.588-98.412 89.748 0 174.124 34.95 237.588 98.412 131.006 131.006 131.006 344.168 0 475.176l67.882 67.882c81.594-81.594 126.53-190.080 126.53-305.47 0-115.392-44.936-223.876-126.53-305.47z" />
|
||||
<glyph unicode="" d="M864 256c-45.16 0-85.92-18.738-115.012-48.83l-431.004 215.502c1.314 8.252 2.016 16.706 2.016 25.328s-0.702 17.076-2.016 25.326l431.004 215.502c29.092-30.090 69.852-48.828 115.012-48.828 88.366 0 160 71.634 160 160s-71.634 160-160 160-160-71.634-160-160c0-8.622 0.704-17.076 2.016-25.326l-431.004-215.504c-29.092 30.090-69.852 48.83-115.012 48.83-88.366 0-160-71.636-160-160 0-88.368 71.634-160 160-160 45.16 0 85.92 18.738 115.012 48.828l431.004-215.502c-1.312-8.25-2.016-16.704-2.016-25.326 0-88.368 71.634-160 160-160s160 71.632 160 160c0 88.364-71.634 160-160 160z" />
|
||||
<glyph unicode="" d="M1024 448c-1.278 66.862-15.784 133.516-42.576 194.462-26.704 61-65.462 116.258-113.042 161.92-47.552 45.696-103.944 81.82-164.984 105.652-61.004 23.924-126.596 35.352-191.398 33.966-64.81-1.282-129.332-15.374-188.334-41.356-59.048-25.896-112.542-63.47-156.734-109.576-44.224-46.082-79.16-100.708-102.186-159.798-23.114-59.062-34.128-122.52-32.746-185.27 1.286-62.76 14.964-125.148 40.134-182.206 25.088-57.1 61.476-108.828 106.11-151.548 44.61-42.754 97.472-76.504 154.614-98.72 57.118-22.304 118.446-32.902 179.142-31.526 60.708 1.29 120.962 14.554 176.076 38.914 55.15 24.282 105.116 59.48 146.366 102.644 41.282 43.14 73.844 94.236 95.254 149.43 13.034 33.458 21.88 68.4 26.542 103.798 1.246-0.072 2.498-0.12 3.762-0.12 35.346 0 64 28.652 64 64 0 1.796-0.094 3.572-0.238 5.332h0.238zM922.306 278.052c-23.472-53.202-57.484-101.4-99.178-141.18-41.67-39.81-91-71.186-144.244-91.79-53.228-20.678-110.29-30.452-166.884-29.082-56.604 1.298-112.596 13.736-163.82 36.474-51.25 22.666-97.684 55.49-135.994 95.712-38.338 40.198-68.528 87.764-88.322 139.058-19.87 51.284-29.228 106.214-27.864 160.756 1.302 54.552 13.328 108.412 35.254 157.69 21.858 49.3 53.498 93.97 92.246 130.81 38.73 36.868 84.53 65.87 133.874 84.856 49.338 19.060 102.136 28.006 154.626 26.644 52.5-1.306 104.228-12.918 151.562-34.034 47.352-21.050 90.256-51.502 125.624-88.782 35.396-37.258 63.21-81.294 81.39-128.688 18.248-47.392 26.782-98.058 25.424-148.496h0.238c-0.144-1.76-0.238-3.536-0.238-5.332 0-33.012 24.992-60.174 57.086-63.624-6.224-34.822-16.53-68.818-30.78-100.992z" />
|
||||
<glyph unicode="" d="M512 960c-278.748 0-505.458-222.762-511.848-499.974 5.92 241.864 189.832 435.974 415.848 435.974 229.75 0 416-200.576 416-448 0-53.020 42.98-96 96-96 53.020 0 96 42.98 96 96 0 282.77-229.23 512-512 512zM512-64c278.748 0 505.458 222.762 511.848 499.974-5.92-241.864-189.832-435.974-415.848-435.974-229.75 0-416 200.576-416 448 0 53.020-42.98 96-96 96-53.020 0-96-42.98-96-96 0-282.77 229.23-512 512-512z" />
|
||||
<glyph unicode="" d="M1024 351.906v192.188l-146.774 24.462c-5.958 18.132-13.222 35.668-21.694 52.5l86.454 121.034-135.896 135.898-120.826-86.304c-16.91 8.554-34.538 15.888-52.768 21.902l-24.402 146.414h-192.188l-24.402-146.416c-18.23-6.014-35.858-13.348-52.766-21.902l-120.828 86.304-135.898-135.898 86.454-121.036c-8.47-16.83-15.734-34.366-21.692-52.498l-146.774-24.46v-192.188l147.118-24.52c5.96-17.968 13.21-35.348 21.642-52.030l-86.748-121.448 135.898-135.896 121.654 86.894c16.602-8.35 33.89-15.528 51.764-21.434l24.578-147.472h192.188l24.578 147.474c17.874 5.906 35.162 13.084 51.766 21.432l121.652-86.892 135.896 135.896-86.744 121.446c8.432 16.682 15.678 34.062 21.64 52.032l147.118 24.518zM512 320c-70.692 0-128 57.306-128 128 0 70.692 57.308 128 128 128 70.694 0 128-57.308 128-128 0-70.694-57.306-128-128-128z" />
|
||||
</font></defs></svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
Binary file not shown.
Whitespace-only changes.
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("ar",{
|
||||
"Play": "تشغيل",
|
||||
"Pause": "ايقاف",
|
||||
"Current Time": "الوقت الحالي",
|
||||
"Duration Time": "Dauer",
|
||||
"Remaining Time": "الوقت المتبقي",
|
||||
"Stream Type": "نوع التيار",
|
||||
"LIVE": "مباشر",
|
||||
"Loaded": "تم التحميل",
|
||||
"Progress": "التقدم",
|
||||
"Fullscreen": "ملء الشاشة",
|
||||
"Non-Fullscreen": "غير ملء الشاشة",
|
||||
"Mute": "صامت",
|
||||
"Unmuted": "غير الصامت",
|
||||
"Playback Rate": "معدل التشغيل",
|
||||
"Subtitles": "الترجمة",
|
||||
"subtitles off": "ايقاف الترجمة",
|
||||
"Captions": "التعليقات",
|
||||
"captions off": "ايقاف التعليقات",
|
||||
"Chapters": "فصول",
|
||||
"You aborted the video playback": "لقد ألغيت تشغيل الفيديو",
|
||||
"A network error caused the video download to fail part-way.": "تسبب خطأ في الشبكة بفشل تحميل الفيديو بالكامل.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "لا يمكن تحميل الفيديو بسبب فشل في الخادم أو الشبكة ، أو فشل بسبب عدم امكانية قراءة تنسيق الفيديو.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "تم ايقاف تشغيل الفيديو بسبب مشكلة فساد أو لأن الفيديو المستخدم يستخدم ميزات غير مدعومة من متصفحك.",
|
||||
"No compatible source was found for this video.": "فشل العثور على أي مصدر متوافق مع هذا الفيديو."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("ca",{
|
||||
"Play": "Reproducció",
|
||||
"Pause": "Pausa",
|
||||
"Current Time": "Temps reproduït",
|
||||
"Duration Time": "Durada total",
|
||||
"Remaining Time": "Temps restant",
|
||||
"Stream Type": "Tipus de seqüència",
|
||||
"LIVE": "EN DIRECTE",
|
||||
"Loaded": "Carregat",
|
||||
"Progress": "Progrés",
|
||||
"Fullscreen": "Pantalla completa",
|
||||
"Non-Fullscreen": "Pantalla no completa",
|
||||
"Mute": "Silencia",
|
||||
"Unmuted": "Amb so",
|
||||
"Playback Rate": "Velocitat de reproducció",
|
||||
"Subtitles": "Subtítols",
|
||||
"subtitles off": "Subtítols desactivats",
|
||||
"Captions": "Llegendes",
|
||||
"captions off": "Llegendes desactivades",
|
||||
"Chapters": "Capítols",
|
||||
"You aborted the video playback": "Heu interromput la reproducció del vídeo.",
|
||||
"A network error caused the video download to fail part-way.": "Un error de la xarxa ha interromput la baixada del vídeo.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "No s'ha pogut carregar el vídeo perquè el servidor o la xarxa han fallat, o bé perquè el seu format no és compatible.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducció de vídeo s'ha interrumput per un problema de corrupció de dades o bé perquè el vídeo demanava funcions que el vostre navegador no ofereix.",
|
||||
"No compatible source was found for this video.": "No s'ha trobat cap font compatible amb el vídeo."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("cs",{
|
||||
"Play": "Přehrát",
|
||||
"Pause": "Pauza",
|
||||
"Current Time": "Aktuální čas",
|
||||
"Duration Time": "Doba trvání",
|
||||
"Remaining Time": "Zbývající čas",
|
||||
"Stream Type": "Stream Type",
|
||||
"LIVE": "ŽIVĚ",
|
||||
"Loaded": "Načteno",
|
||||
"Progress": "Stav",
|
||||
"Fullscreen": "Celá obrazovka",
|
||||
"Non-Fullscreen": "Zmenšená obrazovka",
|
||||
"Mute": "Ztlumit zvuk",
|
||||
"Unmuted": "Přehrát zvuk",
|
||||
"Playback Rate": "Rychlost přehrávání",
|
||||
"Subtitles": "Titulky",
|
||||
"subtitles off": "Titulky vypnuty",
|
||||
"Captions": "Popisky",
|
||||
"captions off": "Popisky vypnuty",
|
||||
"Chapters": "Kapitoly",
|
||||
"You aborted the video playback": "Přehrávání videa je přerušeno.",
|
||||
"A network error caused the video download to fail part-way.": "Video nemohlo být načteno, kvůli chybě v síti.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Video nemohlo být načteno, buď kvůli chybě serveru nebo sítě nebo proto, že daný formát není podporován.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Váš prohlížeč nepodporuje formát videa.",
|
||||
"No compatible source was found for this video.": "Špatně zadaný zdroj videa."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("de",{
|
||||
"Play": "Wiedergabe",
|
||||
"Pause": "Pause",
|
||||
"Current Time": "Aktueller Zeitpunkt",
|
||||
"Duration Time": "Dauer",
|
||||
"Remaining Time": "Verbleibende Zeit",
|
||||
"Stream Type": "Streamtyp",
|
||||
"LIVE": "LIVE",
|
||||
"Loaded": "Geladen",
|
||||
"Progress": "Status",
|
||||
"Fullscreen": "Vollbild",
|
||||
"Non-Fullscreen": "Kein Vollbild",
|
||||
"Mute": "Ton aus",
|
||||
"Unmuted": "Ton ein",
|
||||
"Playback Rate": "Wiedergabegeschwindigkeit",
|
||||
"Subtitles": "Untertitel",
|
||||
"subtitles off": "Untertitel aus",
|
||||
"Captions": "Untertitel",
|
||||
"captions off": "Untertitel aus",
|
||||
"Chapters": "Kapitel",
|
||||
"You aborted the video playback": "Sie haben die Videowiedergabe abgebrochen.",
|
||||
"A network error caused the video download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.",
|
||||
"No compatible source was found for this video.": "Für dieses Video wurde keine kompatible Quelle gefunden."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("es",{
|
||||
"Play": "Reproducción",
|
||||
"Pause": "Pausa",
|
||||
"Current Time": "Tiempo reproducido",
|
||||
"Duration Time": "Duración total",
|
||||
"Remaining Time": "Tiempo restante",
|
||||
"Stream Type": "Tipo de secuencia",
|
||||
"LIVE": "DIRECTO",
|
||||
"Loaded": "Cargado",
|
||||
"Progress": "Progreso",
|
||||
"Fullscreen": "Pantalla completa",
|
||||
"Non-Fullscreen": "Pantalla no completa",
|
||||
"Mute": "Silenciar",
|
||||
"Unmuted": "No silenciado",
|
||||
"Playback Rate": "Velocidad de reproducción",
|
||||
"Subtitles": "Subtítulos",
|
||||
"subtitles off": "Subtítulos desactivados",
|
||||
"Captions": "Subtítulos especiales",
|
||||
"captions off": "Subtítulos especiales desactivados",
|
||||
"Chapters": "Capítulos",
|
||||
"You aborted the video playback": "Ha interrumpido la reproducción del vídeo.",
|
||||
"A network error caused the video download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
|
||||
"No compatible source was found for this video.": "No se ha encontrado ninguna fuente compatible con este vídeo."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("fr",{
|
||||
"Play": "Lecture",
|
||||
"Pause": "Pause",
|
||||
"Current Time": "Temps actuel",
|
||||
"Duration Time": "Durée",
|
||||
"Remaining Time": "Temps restant",
|
||||
"Stream Type": "Type de flux",
|
||||
"LIVE": "EN DIRECT",
|
||||
"Loaded": "Chargé",
|
||||
"Progress": "Progression",
|
||||
"Fullscreen": "Plein écran",
|
||||
"Non-Fullscreen": "Fenêtré",
|
||||
"Mute": "Sourdine",
|
||||
"Unmuted": "Son activé",
|
||||
"Playback Rate": "Vitesse de lecture",
|
||||
"Subtitles": "Sous-titres",
|
||||
"subtitles off": "Sous-titres désactivés",
|
||||
"Captions": "Sous-titres",
|
||||
"captions off": "Sous-titres désactivés",
|
||||
"Chapters": "Chapitres",
|
||||
"You aborted the video playback": "Vous avez interrompu la lecture de la vidéo.",
|
||||
"A network error caused the video download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.",
|
||||
"No compatible source was found for this video.": "Aucune source compatible n'a été trouvée pour cette vidéo."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("hu",{
|
||||
"Play": "Lejátszás",
|
||||
"Pause": "Szünet",
|
||||
"Current Time": "Aktuális időpont",
|
||||
"Duration Time": "Hossz",
|
||||
"Remaining Time": "Hátralévő idő",
|
||||
"Stream Type": "Adatfolyam típusa",
|
||||
"LIVE": "ÉLŐ",
|
||||
"Loaded": "Betöltve",
|
||||
"Progress": "Állapot",
|
||||
"Fullscreen": "Teljes képernyő",
|
||||
"Non-Fullscreen": "Normál méret",
|
||||
"Mute": "Némítás",
|
||||
"Unmuted": "Némítás kikapcsolva",
|
||||
"Playback Rate": "Lejátszási sebesség",
|
||||
"Subtitles": "Feliratok",
|
||||
"subtitles off": "Feliratok kikapcsolva",
|
||||
"Captions": "Magyarázó szöveg",
|
||||
"captions off": "Magyarázó szöveg kikapcsolva",
|
||||
"Chapters": "Fejezetek",
|
||||
"You aborted the video playback": "Leállította a lejátszást",
|
||||
"A network error caused the video download to fail part-way.": "Hálózati hiba miatt a videó részlegesen töltődött le.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "A videó nem tölthető be hálózati vagy kiszolgálói hiba miatt, vagy a formátuma nem támogatott.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "A lejátszás adatsérülés miatt leállt, vagy a videó egyes tulajdonságait a böngészője nem támogatja.",
|
||||
"No compatible source was found for this video.": "Nincs kompatibilis forrás ehhez a videóhoz."
|
||||
});
|
||||
Whitespace-only changes.
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("it",{
|
||||
"Play": "Play",
|
||||
"Pause": "Pausa",
|
||||
"Current Time": "Orario attuale",
|
||||
"Duration Time": "Durata",
|
||||
"Remaining Time": "Tempo rimanente",
|
||||
"Stream Type": "Tipo del Streaming",
|
||||
"LIVE": "LIVE",
|
||||
"Loaded": "Caricato",
|
||||
"Progress": "Stato",
|
||||
"Fullscreen": "Schermo intero",
|
||||
"Non-Fullscreen": "Chiudi schermo intero",
|
||||
"Mute": "Muto",
|
||||
"Unmuted": "Audio",
|
||||
"Playback Rate": "Tasso di riproduzione",
|
||||
"Subtitles": "Sottotitoli",
|
||||
"subtitles off": "Senza sottotitoli",
|
||||
"Captions": "Sottotitoli non udenti",
|
||||
"captions off": "Senza sottotitoli non udenti",
|
||||
"Chapters": "Capitolo",
|
||||
"You aborted the video playback": "La riproduzione del filmato è stata interrotta.",
|
||||
"A network error caused the video download to fail part-way.": "Il download del filmato è stato interrotto a causa di un problema rete.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.",
|
||||
"No compatible source was found for this video.": "Non ci sono fonti compatibili per questo filmato."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("ja",{
|
||||
"Play": "再生",
|
||||
"Pause": "一時停止",
|
||||
"Current Time": "現在の時間",
|
||||
"Duration Time": "長さ",
|
||||
"Remaining Time": "残りの時間",
|
||||
"Stream Type": "ストリームの種類",
|
||||
"LIVE": "ライブ",
|
||||
"Loaded": "ロード済み",
|
||||
"Progress": "進行状況",
|
||||
"Fullscreen": "フルスクリーン",
|
||||
"Non-Fullscreen": "フルスクリーン以外",
|
||||
"Mute": "ミュート",
|
||||
"Unmuted": "ミュート解除",
|
||||
"Playback Rate": "再生レート",
|
||||
"Subtitles": "サブタイトル",
|
||||
"subtitles off": "サブタイトル オフ",
|
||||
"Captions": "キャプション",
|
||||
"captions off": "キャプション オフ",
|
||||
"Chapters": "チャプター",
|
||||
"You aborted the video playback": "動画再生を中止しました",
|
||||
"A network error caused the video download to fail part-way.": "ネットワーク エラーにより動画のダウンロードが途中で失敗しました",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "サーバーまたはネットワークのエラー、またはフォーマットがサポートされていないため、動画をロードできませんでした",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "破損の問題、またはお使いのブラウザがサポートしていない機能が動画に使用されていたため、動画の再生が中止されました",
|
||||
"No compatible source was found for this video.": "この動画に対して互換性のあるソースが見つかりませんでした"
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("ko",{
|
||||
"Play": "재생",
|
||||
"Pause": "일시중지",
|
||||
"Current Time": "현재 시간",
|
||||
"Duration Time": "지정 기간",
|
||||
"Remaining Time": "남은 시간",
|
||||
"Stream Type": "스트리밍 유형",
|
||||
"LIVE": "라이브",
|
||||
"Loaded": "로드됨",
|
||||
"Progress": "진행",
|
||||
"Fullscreen": "전체 화면",
|
||||
"Non-Fullscreen": "전체 화면 해제",
|
||||
"Mute": "음소거",
|
||||
"Unmuted": "음소거 해제",
|
||||
"Playback Rate": "재생 비율",
|
||||
"Subtitles": "서브타이틀",
|
||||
"subtitles off": "서브타이틀 끄기",
|
||||
"Captions": "자막",
|
||||
"captions off": "자막 끄기",
|
||||
"Chapters": "챕터",
|
||||
"You aborted the video playback": "비디오 재생을 취소했습니다.",
|
||||
"A network error caused the video download to fail part-way.": "네트워크 오류로 인하여 비디오 일부를 다운로드하지 못 했습니다.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "비디오를 로드할 수 없습니다. 서버 혹은 네트워크 오류 때문이거나 지원되지 않는 형식 때문일 수 있습니다.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "비디오 재생이 취소됐습니다. 비디오가 손상되었거나 비디오가 사용하는 기능을 브라우저에서 지원하지 않는 것 같습니다.",
|
||||
"No compatible source was found for this video.": "비디오에 호환되지 않는 소스가 있습니다."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("nl",{
|
||||
"Play": "Afspelen",
|
||||
"Pause": "Pauze",
|
||||
"Current Time": "Huidige Tijd",
|
||||
"Duration Time": "Looptijd",
|
||||
"Remaining Time": "Resterende Tijd",
|
||||
"Stream Type": "Stream Type",
|
||||
"LIVE": "LIVE",
|
||||
"Loaded": "Geladen",
|
||||
"Progress": "Status",
|
||||
"Fullscreen": "Volledig scherm",
|
||||
"Non-Fullscreen": "Geen volledig scherm",
|
||||
"Mute": "Geluid Uit",
|
||||
"Unmuted": "Geluid Aan",
|
||||
"Playback Rate": "Weergave Rate",
|
||||
"Subtitles": "Ondertiteling",
|
||||
"subtitles off": "Ondertiteling uit",
|
||||
"Captions": "Onderschriften",
|
||||
"captions off": "Onderschriften uit",
|
||||
"Chapters": "Hoofdstukken",
|
||||
"You aborted the video playback": "Je hebt de video weergave afgebroken.",
|
||||
"A network error caused the video download to fail part-way.": "De video download is mislukt door een netwerkfout.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "De video kon niet worden geladen, veroorzaakt door een server of netwerkfout of het formaat word niet ondersteund.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "De video weergave is afgebroken omdat deze beschadigd is of de video gebruikt functionaliteit die niet door je browser word ondersteund.",
|
||||
"No compatible source was found for this video.": "Voor deze video is geen ondersteunde bron gevonden."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("pt-BR",{
|
||||
"Play": "Tocar",
|
||||
"Pause": "Pause",
|
||||
"Current Time": "Tempo",
|
||||
"Duration Time": "Duração",
|
||||
"Remaining Time": "Tempo Restante",
|
||||
"Stream Type": "Tipo de Stream",
|
||||
"LIVE": "AO VIVO",
|
||||
"Loaded": "Carregado",
|
||||
"Progress": "Progressão",
|
||||
"Fullscreen": "Tela Cheia",
|
||||
"Non-Fullscreen": "Tela Normal",
|
||||
"Mute": "Mudo",
|
||||
"Unmuted": "Habilitar Som",
|
||||
"Playback Rate": "Velocidade",
|
||||
"Subtitles": "Legendas",
|
||||
"subtitles off": "Sem Legendas",
|
||||
"Captions": "Anotações",
|
||||
"captions off": "Sem Anotações",
|
||||
"Chapters": "Capítulos",
|
||||
"You aborted the video playback": "Você parou a execução de vídeo.",
|
||||
"A network error caused the video download to fail part-way.": "Um erro na rede fez o vídeo parar parcialmente.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "O vídeo não pode ser carregado, ou porque houve um problema com sua rede ou pelo formato do vídeo não ser suportado.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "A Execução foi interrompida por um problema com o vídeo ou por seu navegador não dar suporte ao seu formato.",
|
||||
"No compatible source was found for this video.": "Não foi encontrada fonte de vídeo compatível."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("ru",{
|
||||
"Play": "Воспроизвести",
|
||||
"Pause": "Приостановить",
|
||||
"Current Time": "Текущее время",
|
||||
"Duration Time": "Продолжительность",
|
||||
"Remaining Time": "Оставшееся время",
|
||||
"Stream Type": "Тип потока",
|
||||
"LIVE": "ОНЛАЙН",
|
||||
"Loaded": "Загрузка",
|
||||
"Progress": "Прогресс",
|
||||
"Fullscreen": "Полноэкранный режим",
|
||||
"Non-Fullscreen": "Неполноэкранный режим",
|
||||
"Mute": "Без звука",
|
||||
"Unmuted": "Со звуком",
|
||||
"Playback Rate": "Скорость воспроизведения",
|
||||
"Subtitles": "Субтитры",
|
||||
"subtitles off": "Субтитры выкл.",
|
||||
"Captions": "Подписи",
|
||||
"captions off": "Подписи выкл.",
|
||||
"Chapters": "Главы",
|
||||
"You aborted the video playback": "Вы прервали воспроизведение видео",
|
||||
"A network error caused the video download to fail part-way.": "Ошибка сети вызвала сбой во время загрузки видео.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Невозможно загрузить видео из-за сетевого или серверного сбоя либо формат не поддерживается.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Воспроизведение видео было приостановлено из-за повреждения либо в связи с тем, что видео использует функции, неподдерживаемые вашим браузером.",
|
||||
"No compatible source was found for this video.": "Совместимые источники для этого видео отсутствуют."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("uk",{
|
||||
"Play": "Відтворити",
|
||||
"Pause": "Призупинити",
|
||||
"Current Time": "Поточний час",
|
||||
"Duration Time": "Тривалість",
|
||||
"Remaining Time": "Час, що залишився",
|
||||
"Stream Type": "Тип потоку",
|
||||
"LIVE": "НАЖИВО",
|
||||
"Loaded": "Завантаження",
|
||||
"Progress": "Прогрес",
|
||||
"Fullscreen": "Повноекранний режим",
|
||||
"Non-Fullscreen": "Неповноекранний режим",
|
||||
"Mute": "Без звуку",
|
||||
"Unmuted": "Зі звуком",
|
||||
"Playback Rate": "Швидкість відтворення",
|
||||
"Subtitles": "Субтитри",
|
||||
"subtitles off": "Без субтитрів",
|
||||
"Captions": "Підписи",
|
||||
"captions off": "Без підписів",
|
||||
"Chapters": "Розділи",
|
||||
"You aborted the video playback": "Ви припинили відтворення відео",
|
||||
"A network error caused the video download to fail part-way.": "Помилка мережі викликала збій під час завантаження відео.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Неможливо завантажити відео через мережевий чи серверний збій або формат не підтримується.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Відтворення відео було припинено через пошкодження або у зв'язку з тим, що відео використовує функції, які не підтримуються вашим браузером.",
|
||||
"No compatible source was found for this video.": "Сумісні джерела для цього відео відсутні."
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
videojs.addLanguage("vi",{
|
||||
"Play": "Phát",
|
||||
"Pause": "Tạm dừng",
|
||||
"Current Time": "Thời gian hiện tại",
|
||||
"Duration Time": "Độ dài",
|
||||
"Remaining Time": "Thời gian còn lại",
|
||||
"Stream Type": "Kiểu Stream",
|
||||
"LIVE": "TRỰC TIẾP",
|
||||
"Loaded": "Đã tải",
|
||||
"Progress": "Tiến trình",
|
||||
"Fullscreen": "Toàn màn hình",
|
||||
"Non-Fullscreen": "Thoát toàn màn hình",
|
||||
"Mute": "Tắt tiếng",
|
||||
"Unmuted": "Bật âm thanh",
|
||||
"Playback Rate": "Tốc độ phát",
|
||||
"Subtitles": "Phụ đề",
|
||||
"subtitles off": "Tắt phụ đề",
|
||||
"Captions": "Chú thích",
|
||||
"captions off": "Tắt chú thích",
|
||||
"Chapters": "Chương",
|
||||
"You aborted the video playback": "Bạn đã hủy việc phát video.",
|
||||
"A network error caused the video download to fail part-way.": "Một lỗi mạng dẫn đến việc tải video bị lỗi.",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "Video không tải được, mạng hay server có lỗi hoặc định dạng không được hỗ trợ.",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "Phát video đã bị hủy do một sai lỗi hoặc video sử dụng những tính năng trình duyệt không hỗ trợ.",
|
||||
"No compatible source was found for this video.": "Không có nguồn tương thích cho video này."
|
||||
});
|
||||
@@ -0,0 +1,27 @@
|
||||
videojs.addLanguage("zh-TW",{
|
||||
"Play": "播放",
|
||||
"Pause": "暫停",
|
||||
"Current Time": "目前時間",
|
||||
"Duration Time": "總共時間",
|
||||
"Remaining Time": "剩餘時間",
|
||||
"Stream Type": "串流類型",
|
||||
"LIVE": "直播",
|
||||
"Loaded": "載入完畢",
|
||||
"Progress": "進度",
|
||||
"Fullscreen": "全螢幕",
|
||||
"Non-Fullscreen": "退出全螢幕",
|
||||
"Mute": "靜音",
|
||||
"Unmuted": "取消靜音",
|
||||
"Playback Rate": " 播放速率",
|
||||
"Subtitles": "字幕",
|
||||
"subtitles off": "關閉字幕",
|
||||
"Captions": "內嵌字幕",
|
||||
"captions off": "關閉內嵌字幕",
|
||||
"Chapters": "章節",
|
||||
"You aborted the video playback": "影片播放已終止",
|
||||
"A network error caused the video download to fail part-way.": "網路錯誤導致影片下載失敗。",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "影片因格式不支援或者伺服器或網路的問題無法載入。",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "由於影片檔案損毀或是該影片使用了您的瀏覽器不支援的功能,播放終止。",
|
||||
"No compatible source was found for this video.": "無法找到相容此影片的來源。",
|
||||
"The video is encrypted and we do not have the keys to decrypt it.": "影片已加密,無法解密。"
|
||||
});
|
||||
@@ -0,0 +1,27 @@
|
||||
videojs.addLanguage("zh",{
|
||||
"Play": "播放",
|
||||
"Pause": "暂停",
|
||||
"Current Time": "当前时间",
|
||||
"Duration Time": "时长",
|
||||
"Remaining Time": "剩余时间",
|
||||
"Stream Type": "媒体流类型",
|
||||
"LIVE": "直播",
|
||||
"Loaded": "加载完毕",
|
||||
"Progress": "进度",
|
||||
"Fullscreen": "全屏",
|
||||
"Non-Fullscreen": "退出全屏",
|
||||
"Mute": "静音",
|
||||
"Unmuted": "取消静音",
|
||||
"Playback Rate": "播放码率",
|
||||
"Subtitles": "字幕",
|
||||
"subtitles off": "字幕关闭",
|
||||
"Captions": "内嵌字幕",
|
||||
"captions off": "内嵌字幕关闭",
|
||||
"Chapters": "节目段落",
|
||||
"You aborted the video playback": "视频播放被终止",
|
||||
"A network error caused the video download to fail part-way.": "网络错误导致视频下载中途失败。",
|
||||
"The video could not be loaded, either because the server or network failed or because the format is not supported.": "视频因格式不支持或者服务器或网络的问题无法加载。",
|
||||
"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.": "由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。",
|
||||
"No compatible source was found for this video.": "无法找到此视频兼容的源。",
|
||||
"The video is encrypted and we do not have the keys to decrypt it.": "视频已加密,无法解密。"
|
||||
});
|
||||
@@ -0,0 +1,968 @@
|
||||
/*!
|
||||
Video.js Default Styles (http://videojs.com)
|
||||
Version 4.11.4
|
||||
Create your own skin at http://designer.videojs.com
|
||||
*/
|
||||
/* SKIN
|
||||
================================================================================
|
||||
The main class name for all skin-specific styles. To make your own skin,
|
||||
replace all occurrences of 'vjs-default-skin' with a new name. Then add your new
|
||||
skin name to your video tag instead of the default skin.
|
||||
e.g. <video class="video-js my-skin-name">
|
||||
*/
|
||||
.vjs-default-skin {
|
||||
color: #cccccc;
|
||||
}
|
||||
/* Custom Icon Font
|
||||
--------------------------------------------------------------------------------
|
||||
The control icons are from a custom font. Each icon corresponds to a character
|
||||
(e.g. "\e001"). Font icons allow for easy scaling and coloring of icons.
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'VideoJS';
|
||||
src: url('font/vjs.eot');
|
||||
src: url('font/vjs.eot?#iefix') format('embedded-opentype'), url('font/vjs.woff') format('woff'), url('font/vjs.ttf') format('truetype'), url('font/vjs.svg#icomoon') format('svg');
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
/* Base UI Component Classes
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
/* Slider - used for Volume bar and Seek bar */
|
||||
.vjs-default-skin .vjs-slider {
|
||||
/* Replace browser focus highlight with handle highlight */
|
||||
outline: 0;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
/* background-color-with-alpha */
|
||||
background-color: #333333;
|
||||
background-color: rgba(51, 51, 51, 0.9);
|
||||
}
|
||||
.vjs-default-skin .vjs-slider:focus {
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: 0 0 2em #ffffff;
|
||||
-moz-box-shadow: 0 0 2em #ffffff;
|
||||
box-shadow: 0 0 2em #ffffff;
|
||||
}
|
||||
.vjs-default-skin .vjs-slider-handle {
|
||||
position: absolute;
|
||||
/* Needed for IE6 */
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.vjs-default-skin .vjs-slider-handle:before {
|
||||
content: "\e009";
|
||||
font-family: VideoJS;
|
||||
font-size: 1em;
|
||||
line-height: 1;
|
||||
text-align: center;
|
||||
text-shadow: 0em 0em 1em #fff;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
/* Rotate the square icon to make a diamond */
|
||||
/* transform */
|
||||
-webkit-transform: rotate(-45deg);
|
||||
-moz-transform: rotate(-45deg);
|
||||
-ms-transform: rotate(-45deg);
|
||||
-o-transform: rotate(-45deg);
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
/* Control Bar
|
||||
--------------------------------------------------------------------------------
|
||||
The default control bar that is a container for most of the controls.
|
||||
*/
|
||||
.vjs-default-skin .vjs-control-bar {
|
||||
/* Start hidden */
|
||||
display: none;
|
||||
position: absolute;
|
||||
/* Place control bar at the bottom of the player box/video.
|
||||
If you want more margin below the control bar, add more height. */
|
||||
bottom: 0;
|
||||
/* Use left/right to stretch to 100% width of player div */
|
||||
left: 0;
|
||||
right: 0;
|
||||
/* Height includes any margin you want above or below control items */
|
||||
height: 3.0em;
|
||||
/* background-color-with-alpha */
|
||||
background-color: #07141e;
|
||||
background-color: rgba(7, 20, 30, 0.7);
|
||||
}
|
||||
/* Show the control bar only once the video has started playing */
|
||||
.vjs-default-skin.vjs-has-started .vjs-control-bar {
|
||||
display: block;
|
||||
/* Visibility needed to make sure things hide in older browsers too. */
|
||||
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
/* transition */
|
||||
-webkit-transition: visibility 0.1s, opacity 0.1s;
|
||||
-moz-transition: visibility 0.1s, opacity 0.1s;
|
||||
-o-transition: visibility 0.1s, opacity 0.1s;
|
||||
transition: visibility 0.1s, opacity 0.1s;
|
||||
}
|
||||
/* Hide the control bar when the video is playing and the user is inactive */
|
||||
.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
|
||||
display: block;
|
||||
visibility: hidden;
|
||||
opacity: 0;
|
||||
/* transition */
|
||||
-webkit-transition: visibility 1s, opacity 1s;
|
||||
-moz-transition: visibility 1s, opacity 1s;
|
||||
-o-transition: visibility 1s, opacity 1s;
|
||||
transition: visibility 1s, opacity 1s;
|
||||
}
|
||||
.vjs-default-skin.vjs-controls-disabled .vjs-control-bar {
|
||||
display: none;
|
||||
}
|
||||
.vjs-default-skin.vjs-using-native-controls .vjs-control-bar {
|
||||
display: none;
|
||||
}
|
||||
/* The control bar shouldn't show after an error */
|
||||
.vjs-default-skin.vjs-error .vjs-control-bar {
|
||||
display: none;
|
||||
}
|
||||
/* Don't hide the control bar if it's audio */
|
||||
.vjs-audio.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
/* IE8 is flakey with fonts, and you have to change the actual content to force
|
||||
fonts to show/hide properly.
|
||||
- "\9" IE8 hack didn't work for this
|
||||
- Found in XP IE8 from http://modern.ie. Does not show up in "IE8 mode" in IE9
|
||||
*/
|
||||
@media \0screen {
|
||||
.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before {
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
/* General styles for individual controls. */
|
||||
.vjs-default-skin .vjs-control {
|
||||
outline: none;
|
||||
position: relative;
|
||||
float: left;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 3.0em;
|
||||
width: 4em;
|
||||
}
|
||||
/* Font button icons */
|
||||
.vjs-default-skin .vjs-control:before {
|
||||
font-family: VideoJS;
|
||||
font-size: 1.5em;
|
||||
line-height: 2;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
/* Replacement for focus outline */
|
||||
.vjs-default-skin .vjs-control:focus:before,
|
||||
.vjs-default-skin .vjs-control:hover:before {
|
||||
text-shadow: 0em 0em 1em #ffffff;
|
||||
}
|
||||
.vjs-default-skin .vjs-control:focus {
|
||||
/* outline: 0; */
|
||||
/* keyboard-only users cannot see the focus on several of the UI elements when
|
||||
this is set to 0 */
|
||||
|
||||
}
|
||||
/* Hide control text visually, but have it available for screenreaders */
|
||||
.vjs-default-skin .vjs-control-text {
|
||||
/* hide-visually */
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
}
|
||||
/* Play/Pause
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-play-control {
|
||||
width: 5em;
|
||||
cursor: pointer;
|
||||
}
|
||||
.vjs-default-skin .vjs-play-control:before {
|
||||
content: "\e001";
|
||||
}
|
||||
.vjs-default-skin.vjs-playing .vjs-play-control:before {
|
||||
content: "\e002";
|
||||
}
|
||||
/* Playback toggle
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-playback-rate .vjs-playback-rate-value {
|
||||
font-size: 1.5em;
|
||||
line-height: 2;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.vjs-default-skin .vjs-playback-rate.vjs-menu-button .vjs-menu .vjs-menu-content {
|
||||
width: 4em;
|
||||
left: -2em;
|
||||
list-style: none;
|
||||
}
|
||||
/* Volume/Mute
|
||||
-------------------------------------------------------------------------------- */
|
||||
.vjs-default-skin .vjs-mute-control,
|
||||
.vjs-default-skin .vjs-volume-menu-button {
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
}
|
||||
.vjs-default-skin .vjs-mute-control:before,
|
||||
.vjs-default-skin .vjs-volume-menu-button:before {
|
||||
content: "\e006";
|
||||
}
|
||||
.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,
|
||||
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before {
|
||||
content: "\e003";
|
||||
}
|
||||
.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,
|
||||
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before {
|
||||
content: "\e004";
|
||||
}
|
||||
.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,
|
||||
.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before {
|
||||
content: "\e005";
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-control {
|
||||
width: 5em;
|
||||
float: right;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-bar {
|
||||
width: 5em;
|
||||
height: 0.6em;
|
||||
margin: 1.1em auto 0;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-level {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
height: 0.5em;
|
||||
/* assuming volume starts at 1.0 */
|
||||
|
||||
width: 100%;
|
||||
background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-bar .vjs-volume-handle {
|
||||
width: 0.5em;
|
||||
height: 0.5em;
|
||||
/* Assumes volume starts at 1.0. If you change the size of the
|
||||
handle relative to the volume bar, you'll need to update this value
|
||||
too. */
|
||||
|
||||
left: 4.5em;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-handle:before {
|
||||
font-size: 0.9em;
|
||||
top: -0.2em;
|
||||
left: -0.2em;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
}
|
||||
/* The volume menu button is like menu buttons (captions/subtitles) but works
|
||||
a little differently. It needs to be possible to tab to the volume slider
|
||||
without hitting space bar on the menu button. To do this we're not using
|
||||
display:none to hide the slider menu by default, and instead setting the
|
||||
width and height to zero. */
|
||||
.vjs-default-skin .vjs-volume-menu-button .vjs-menu {
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-top-color: transparent;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content {
|
||||
height: 0;
|
||||
width: 0;
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu,
|
||||
.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing {
|
||||
border-top-color: rgba(7, 40, 50, 0.5);
|
||||
/* Same as ul background */
|
||||
|
||||
}
|
||||
.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content,
|
||||
.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content {
|
||||
height: 2.9em;
|
||||
width: 10em;
|
||||
}
|
||||
/* Progress
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-progress-control {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
width: auto;
|
||||
font-size: 0.3em;
|
||||
height: 1em;
|
||||
/* Set above the rest of the controls. */
|
||||
top: -1em;
|
||||
/* Shrink the bar slower than it grows. */
|
||||
/* transition */
|
||||
-webkit-transition: all 0.4s;
|
||||
-moz-transition: all 0.4s;
|
||||
-o-transition: all 0.4s;
|
||||
transition: all 0.4s;
|
||||
}
|
||||
/* On hover, make the progress bar grow to something that's more clickable.
|
||||
This simply changes the overall font for the progress bar, and this
|
||||
updates both the em-based widths and heights, as wells as the icon font */
|
||||
.vjs-default-skin:hover .vjs-progress-control {
|
||||
font-size: .9em;
|
||||
/* Even though we're not changing the top/height, we need to include them in
|
||||
the transition so they're handled correctly. */
|
||||
|
||||
/* transition */
|
||||
-webkit-transition: all 0.2s;
|
||||
-moz-transition: all 0.2s;
|
||||
-o-transition: all 0.2s;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
/* Box containing play and load progresses. Also acts as seek scrubber. */
|
||||
.vjs-default-skin .vjs-progress-holder {
|
||||
height: 100%;
|
||||
}
|
||||
/* Progress Bars */
|
||||
.vjs-default-skin .vjs-progress-holder .vjs-play-progress,
|
||||
.vjs-default-skin .vjs-progress-holder .vjs-load-progress,
|
||||
.vjs-default-skin .vjs-progress-holder .vjs-load-progress div {
|
||||
position: absolute;
|
||||
display: block;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
/* updated by javascript during playback */
|
||||
|
||||
width: 0;
|
||||
/* Needed for IE6 */
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.vjs-default-skin .vjs-play-progress {
|
||||
/*
|
||||
Using a data URI to create the white diagonal lines with a transparent
|
||||
background. Surprisingly works in IE8.
|
||||
Created using http://www.patternify.com
|
||||
Changing the first color value will change the bar color.
|
||||
Also using a paralax effect to make the lines move backwards.
|
||||
The -50% left position makes that happen.
|
||||
*/
|
||||
|
||||
background: #66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat;
|
||||
}
|
||||
.vjs-default-skin .vjs-load-progress {
|
||||
background: #646464 /* IE8- Fallback */;
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
/* there are child elements of the load progress bar that represent the
|
||||
specific time ranges that have been buffered */
|
||||
.vjs-default-skin .vjs-load-progress div {
|
||||
background: #787878 /* IE8- Fallback */;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
.vjs-default-skin .vjs-seek-handle {
|
||||
width: 1.5em;
|
||||
height: 100%;
|
||||
}
|
||||
.vjs-default-skin .vjs-seek-handle:before {
|
||||
padding-top: 0.1em /* Minor adjustment */;
|
||||
}
|
||||
/* Live Mode
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin.vjs-live .vjs-time-controls,
|
||||
.vjs-default-skin.vjs-live .vjs-time-divider,
|
||||
.vjs-default-skin.vjs-live .vjs-progress-control {
|
||||
display: none;
|
||||
}
|
||||
.vjs-default-skin.vjs-live .vjs-live-display {
|
||||
display: block;
|
||||
}
|
||||
/* Live Display
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-live-display {
|
||||
display: none;
|
||||
font-size: 1em;
|
||||
line-height: 3em;
|
||||
}
|
||||
/* Time Display
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-time-controls {
|
||||
font-size: 1em;
|
||||
/* Align vertically by making the line height the same as the control bar */
|
||||
line-height: 3em;
|
||||
}
|
||||
.vjs-default-skin .vjs-current-time {
|
||||
float: left;
|
||||
}
|
||||
.vjs-default-skin .vjs-duration {
|
||||
float: left;
|
||||
}
|
||||
/* Remaining time is in the HTML, but not included in default design */
|
||||
.vjs-default-skin .vjs-remaining-time {
|
||||
display: none;
|
||||
float: left;
|
||||
}
|
||||
.vjs-time-divider {
|
||||
float: left;
|
||||
line-height: 3em;
|
||||
}
|
||||
/* Fullscreen
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-fullscreen-control {
|
||||
width: 3.8em;
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
}
|
||||
.vjs-default-skin .vjs-fullscreen-control:before {
|
||||
content: "\e000";
|
||||
}
|
||||
/* Switch to the exit icon when the player is in fullscreen */
|
||||
.vjs-default-skin.vjs-fullscreen .vjs-fullscreen-control:before {
|
||||
content: "\e00b";
|
||||
}
|
||||
/* Big Play Button (play button at start)
|
||||
--------------------------------------------------------------------------------
|
||||
Positioning of the play button in the center or other corners can be done more
|
||||
easily in the skin designer. http://designer.videojs.com/
|
||||
*/
|
||||
.vjs-default-skin .vjs-big-play-button {
|
||||
left: 0.5em;
|
||||
top: 0.5em;
|
||||
font-size: 3em;
|
||||
display: block;
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
width: 4em;
|
||||
height: 2.6em;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
cursor: pointer;
|
||||
opacity: 1;
|
||||
/* Need a slightly gray bg so it can be seen on black backgrounds */
|
||||
/* background-color-with-alpha */
|
||||
background-color: #07141e;
|
||||
background-color: rgba(7, 20, 30, 0.7);
|
||||
border: 0.1em solid #3b4249;
|
||||
/* border-radius */
|
||||
-webkit-border-radius: 0.8em;
|
||||
-moz-border-radius: 0.8em;
|
||||
border-radius: 0.8em;
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
|
||||
-moz-box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
|
||||
box-shadow: 0px 0px 1em rgba(255, 255, 255, 0.25);
|
||||
/* transition */
|
||||
-webkit-transition: all 0.4s;
|
||||
-moz-transition: all 0.4s;
|
||||
-o-transition: all 0.4s;
|
||||
transition: all 0.4s;
|
||||
}
|
||||
/* Optionally center */
|
||||
.vjs-default-skin.vjs-big-play-centered .vjs-big-play-button {
|
||||
/* Center it horizontally */
|
||||
left: 50%;
|
||||
margin-left: -2.1em;
|
||||
/* Center it vertically */
|
||||
top: 50%;
|
||||
margin-top: -1.4000000000000001em;
|
||||
}
|
||||
/* Hide if controls are disabled */
|
||||
.vjs-default-skin.vjs-controls-disabled .vjs-big-play-button {
|
||||
display: none;
|
||||
}
|
||||
/* Hide when video starts playing */
|
||||
.vjs-default-skin.vjs-has-started .vjs-big-play-button {
|
||||
display: none;
|
||||
}
|
||||
/* Hide on mobile devices. Remove when we stop using native controls
|
||||
by default on mobile */
|
||||
.vjs-default-skin.vjs-using-native-controls .vjs-big-play-button {
|
||||
display: none;
|
||||
}
|
||||
.vjs-default-skin:hover .vjs-big-play-button,
|
||||
.vjs-default-skin .vjs-big-play-button:focus {
|
||||
outline: 0;
|
||||
border-color: #fff;
|
||||
/* IE8 needs a non-glow hover state */
|
||||
background-color: #505050;
|
||||
background-color: rgba(50, 50, 50, 0.75);
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: 0 0 3em #ffffff;
|
||||
-moz-box-shadow: 0 0 3em #ffffff;
|
||||
box-shadow: 0 0 3em #ffffff;
|
||||
/* transition */
|
||||
-webkit-transition: all 0s;
|
||||
-moz-transition: all 0s;
|
||||
-o-transition: all 0s;
|
||||
transition: all 0s;
|
||||
}
|
||||
.vjs-default-skin .vjs-big-play-button:before {
|
||||
content: "\e001";
|
||||
font-family: VideoJS;
|
||||
/* In order to center the play icon vertically we need to set the line height
|
||||
to the same as the button height */
|
||||
|
||||
line-height: 2.6em;
|
||||
text-shadow: 0.05em 0.05em 0.1em #000;
|
||||
text-align: center /* Needed for IE8 */;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.vjs-error .vjs-big-play-button {
|
||||
display: none;
|
||||
}
|
||||
/* Error Display
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-error-display {
|
||||
display: none;
|
||||
}
|
||||
.vjs-error .vjs-error-display {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.vjs-error .vjs-error-display:before {
|
||||
content: 'X';
|
||||
font-family: Arial;
|
||||
font-size: 4em;
|
||||
color: #666666;
|
||||
/* In order to center the play icon vertically we need to set the line height
|
||||
to the same as the button height */
|
||||
|
||||
line-height: 1;
|
||||
text-shadow: 0.05em 0.05em 0.1em #000;
|
||||
text-align: center /* Needed for IE8 */;
|
||||
vertical-align: middle;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
margin-top: -0.5em;
|
||||
width: 100%;
|
||||
}
|
||||
.vjs-error-display div {
|
||||
position: absolute;
|
||||
bottom: 1em;
|
||||
right: 0;
|
||||
left: 0;
|
||||
font-size: 1.4em;
|
||||
text-align: center;
|
||||
padding: 3px;
|
||||
background: #000000;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.vjs-error-display a,
|
||||
.vjs-error-display a:visited {
|
||||
color: #F4A460;
|
||||
}
|
||||
/* Loading Spinner
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-loading-spinner {
|
||||
/* Should be hidden by default */
|
||||
display: none;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
font-size: 4em;
|
||||
line-height: 1;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-left: -0.5em;
|
||||
margin-top: -0.5em;
|
||||
opacity: 0.75;
|
||||
}
|
||||
/* Show the spinner when waiting for data and seeking to a new time */
|
||||
.vjs-waiting .vjs-loading-spinner,
|
||||
.vjs-seeking .vjs-loading-spinner {
|
||||
display: block;
|
||||
/* only animate when showing because it can be processor heavy */
|
||||
/* animation */
|
||||
-webkit-animation: spin 1.5s infinite linear;
|
||||
-moz-animation: spin 1.5s infinite linear;
|
||||
-o-animation: spin 1.5s infinite linear;
|
||||
animation: spin 1.5s infinite linear;
|
||||
}
|
||||
/* Errors are unrecoverable without user interaction so hide the spinner */
|
||||
.vjs-error .vjs-loading-spinner {
|
||||
display: none;
|
||||
/* ensure animation doesn't continue while hidden */
|
||||
/* animation */
|
||||
-webkit-animation: none;
|
||||
-moz-animation: none;
|
||||
-o-animation: none;
|
||||
animation: none;
|
||||
}
|
||||
.vjs-default-skin .vjs-loading-spinner:before {
|
||||
content: "\e01e";
|
||||
font-family: VideoJS;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
text-align: center;
|
||||
text-shadow: 0em 0em 0.1em #000;
|
||||
}
|
||||
@-moz-keyframes spin {
|
||||
0% {
|
||||
-moz-transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-moz-transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes spin {
|
||||
0% {
|
||||
-webkit-transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-webkit-transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
@-o-keyframes spin {
|
||||
0% {
|
||||
-o-transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
-o-transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
@keyframes spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(359deg);
|
||||
}
|
||||
}
|
||||
/* Menu Buttons (Captions/Subtitles/etc.)
|
||||
--------------------------------------------------------------------------------
|
||||
*/
|
||||
.vjs-default-skin .vjs-menu-button {
|
||||
float: right;
|
||||
cursor: pointer;
|
||||
}
|
||||
.vjs-default-skin .vjs-menu {
|
||||
display: none;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0em;
|
||||
/* (Width of vjs-menu - width of button) / 2 */
|
||||
|
||||
width: 0em;
|
||||
height: 0em;
|
||||
margin-bottom: 3em;
|
||||
border-left: 2em solid transparent;
|
||||
border-right: 2em solid transparent;
|
||||
border-top: 1.55em solid #000000;
|
||||
/* Same width top as ul bottom */
|
||||
|
||||
border-top-color: rgba(7, 40, 50, 0.5);
|
||||
/* Same as ul background */
|
||||
|
||||
}
|
||||
/* Button Pop-up Menu */
|
||||
.vjs-default-skin .vjs-menu-button .vjs-menu .vjs-menu-content {
|
||||
display: block;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
position: absolute;
|
||||
width: 10em;
|
||||
bottom: 1.5em;
|
||||
/* Same bottom as vjs-menu border-top */
|
||||
|
||||
max-height: 15em;
|
||||
overflow: auto;
|
||||
left: -5em;
|
||||
/* Width of menu - width of button / 2 */
|
||||
|
||||
/* background-color-with-alpha */
|
||||
background-color: #07141e;
|
||||
background-color: rgba(7, 20, 30, 0.7);
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
|
||||
-moz-box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
|
||||
box-shadow: -0.2em -0.2em 0.3em rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
.vjs-default-skin .vjs-menu-button:hover .vjs-control-content .vjs-menu,
|
||||
.vjs-default-skin .vjs-control-content .vjs-menu.vjs-lock-showing {
|
||||
display: block;
|
||||
}
|
||||
.vjs-default-skin .vjs-menu-button ul li {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
padding: 0.3em 0 0.3em 0;
|
||||
line-height: 1.4em;
|
||||
font-size: 1.2em;
|
||||
text-align: center;
|
||||
text-transform: lowercase;
|
||||
}
|
||||
.vjs-default-skin .vjs-menu-button ul li.vjs-selected {
|
||||
background-color: #000;
|
||||
}
|
||||
.vjs-default-skin .vjs-menu-button ul li:focus,
|
||||
.vjs-default-skin .vjs-menu-button ul li:hover,
|
||||
.vjs-default-skin .vjs-menu-button ul li.vjs-selected:focus,
|
||||
.vjs-default-skin .vjs-menu-button ul li.vjs-selected:hover {
|
||||
outline: 0;
|
||||
color: #111;
|
||||
/* background-color-with-alpha */
|
||||
background-color: #ffffff;
|
||||
background-color: rgba(255, 255, 255, 0.75);
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: 0 0 1em #ffffff;
|
||||
-moz-box-shadow: 0 0 1em #ffffff;
|
||||
box-shadow: 0 0 1em #ffffff;
|
||||
}
|
||||
.vjs-default-skin .vjs-menu-button ul li.vjs-menu-title {
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
font-size: 1em;
|
||||
line-height: 2em;
|
||||
padding: 0;
|
||||
margin: 0 0 0.3em 0;
|
||||
font-weight: bold;
|
||||
cursor: default;
|
||||
}
|
||||
/* Subtitles Button */
|
||||
.vjs-default-skin .vjs-subtitles-button:before {
|
||||
content: "\e00c";
|
||||
}
|
||||
/* Captions Button */
|
||||
.vjs-default-skin .vjs-captions-button:before {
|
||||
content: "\e008";
|
||||
}
|
||||
/* Chapters Button */
|
||||
.vjs-default-skin .vjs-chapters-button:before {
|
||||
content: "\e00c";
|
||||
}
|
||||
.vjs-default-skin .vjs-chapters-button.vjs-menu-button .vjs-menu .vjs-menu-content {
|
||||
width: 24em;
|
||||
left: -12em;
|
||||
}
|
||||
/* Replacement for focus outline */
|
||||
.vjs-default-skin .vjs-captions-button:focus .vjs-control-content:before,
|
||||
.vjs-default-skin .vjs-captions-button:hover .vjs-control-content:before {
|
||||
/* box-shadow */
|
||||
-webkit-box-shadow: 0 0 1em #ffffff;
|
||||
-moz-box-shadow: 0 0 1em #ffffff;
|
||||
box-shadow: 0 0 1em #ffffff;
|
||||
}
|
||||
/*
|
||||
REQUIRED STYLES (be careful overriding)
|
||||
================================================================================
|
||||
When loading the player, the video tag is replaced with a DIV,
|
||||
that will hold the video tag or object tag for other playback methods.
|
||||
The div contains the video playback element (Flash or HTML5) and controls,
|
||||
and sets the width and height of the video.
|
||||
|
||||
** If you want to add some kind of border/padding (e.g. a frame), or special
|
||||
positioning, use another containing element. Otherwise you risk messing up
|
||||
control positioning and full window mode. **
|
||||
*/
|
||||
.video-js {
|
||||
background-color: #000;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
/* Start with 10px for base font size so other dimensions can be em based and
|
||||
easily calculable. */
|
||||
|
||||
font-size: 10px;
|
||||
/* Allow poster to be vertically aligned. */
|
||||
|
||||
vertical-align: middle;
|
||||
/* display: table-cell; */
|
||||
/*This works in Safari but not Firefox.*/
|
||||
|
||||
/* Provide some basic defaults for fonts */
|
||||
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
/* Avoiding helvetica: issue #376 */
|
||||
|
||||
font-family: Arial, sans-serif;
|
||||
/* Turn off user selection (text highlighting) by default.
|
||||
The majority of player components will not be text blocks.
|
||||
Text areas will need to turn user selection back on. */
|
||||
|
||||
/* user-select */
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
/* Playback technology elements expand to the width/height of the containing div
|
||||
<video> or <object> */
|
||||
.video-js .vjs-tech {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
/* Fix for Firefox 9 fullscreen (only if it is enabled). Not needed when
|
||||
checking fullScreenEnabled. */
|
||||
.video-js:-moz-full-screen {
|
||||
position: absolute;
|
||||
}
|
||||
/* Fullscreen Styles */
|
||||
body.vjs-full-window {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
/* Fix for IE6 full-window. http://www.cssplay.co.uk/layouts/fixed.html */
|
||||
overflow-y: auto;
|
||||
}
|
||||
.video-js.vjs-fullscreen {
|
||||
position: fixed;
|
||||
overflow: hidden;
|
||||
z-index: 1000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
/* IE6 full-window (underscore hack) */
|
||||
_position: absolute;
|
||||
}
|
||||
.video-js:-webkit-full-screen {
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
}
|
||||
.video-js.vjs-fullscreen.vjs-user-inactive {
|
||||
cursor: none;
|
||||
}
|
||||
/* Poster Styles */
|
||||
.vjs-poster {
|
||||
background-repeat: no-repeat;
|
||||
background-position: 50% 50%;
|
||||
background-size: contain;
|
||||
cursor: pointer;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
.vjs-poster img {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
max-height: 100%;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
}
|
||||
/* Hide the poster after the video has started playing */
|
||||
.video-js.vjs-has-started .vjs-poster {
|
||||
display: none;
|
||||
}
|
||||
/* Don't hide the poster if we're playing audio */
|
||||
.video-js.vjs-audio.vjs-has-started .vjs-poster {
|
||||
display: block;
|
||||
}
|
||||
/* Hide the poster when controls are disabled because it's clickable
|
||||
and the native poster can take over */
|
||||
.video-js.vjs-controls-disabled .vjs-poster {
|
||||
display: none;
|
||||
}
|
||||
/* Hide the poster when native controls are used otherwise it covers them */
|
||||
.video-js.vjs-using-native-controls .vjs-poster {
|
||||
display: none;
|
||||
}
|
||||
/* Text Track Styles */
|
||||
/* Overall track holder for both captions and subtitles */
|
||||
.video-js .vjs-text-track-display {
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
bottom: 4em;
|
||||
/* Leave padding on left and right */
|
||||
left: 1em;
|
||||
right: 1em;
|
||||
}
|
||||
/* Move captions down when controls aren't being shown */
|
||||
.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {
|
||||
bottom: 1em;
|
||||
}
|
||||
/* Individual tracks */
|
||||
.video-js .vjs-text-track {
|
||||
display: none;
|
||||
font-size: 1.4em;
|
||||
text-align: center;
|
||||
margin-bottom: 0.1em;
|
||||
/* Transparent black background, or fallback to all black (oldIE) */
|
||||
/* background-color-with-alpha */
|
||||
background-color: #000000;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
}
|
||||
.video-js .vjs-subtitles {
|
||||
color: #ffffff /* Subtitles are white */;
|
||||
}
|
||||
.video-js .vjs-captions {
|
||||
color: #ffcc66 /* Captions are yellow */;
|
||||
}
|
||||
.vjs-tt-cue {
|
||||
display: block;
|
||||
}
|
||||
/* Increase font-size when fullscreen */
|
||||
.video-js.vjs-fullscreen .vjs-text-track {
|
||||
font-size: 3em;
|
||||
}
|
||||
/* Hide disabled or unsupported controls */
|
||||
.vjs-default-skin .vjs-hidden {
|
||||
display: none;
|
||||
}
|
||||
.vjs-lock-showing {
|
||||
display: block !important;
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
/* In IE8 w/ no JavaScript (no HTML5 shim), the video tag doesn't register.
|
||||
The .video-js classname on the video tag also isn't considered.
|
||||
This optional paragraph inside the video tag can provide a message to users
|
||||
about what's required to play video. */
|
||||
.vjs-no-js {
|
||||
padding: 20px;
|
||||
color: #ccc;
|
||||
background-color: #333;
|
||||
font-size: 18px;
|
||||
font-family: Arial, sans-serif;
|
||||
text-align: center;
|
||||
width: 300px;
|
||||
height: 150px;
|
||||
margin: 0px auto;
|
||||
}
|
||||
.vjs-no-js a,
|
||||
.vjs-no-js a:visited {
|
||||
color: #F4A460;
|
||||
}
|
||||
/* -----------------------------------------------------------------------------
|
||||
The original source of this file lives at
|
||||
https://github.com/videojs/video.js/blob/master/src/css/video-js.less */
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
Video.js Default Styles (http://videojs.com)
|
||||
Version 4.11.4
|
||||
Create your own skin at http://designer.videojs.com
|
||||
*/.vjs-default-skin{color:#ccc}@font-face{font-family:VideoJS;src:url(font/vjs.eot);src:url(font/vjs.eot?#iefix) format('embedded-opentype'),url(font/vjs.woff) format('woff'),url(font/vjs.ttf) format('truetype'),url(font/vjs.svg#icomoon) format('svg');font-weight:400;font-style:normal}.vjs-default-skin .vjs-slider{outline:0;position:relative;cursor:pointer;padding:0;background-color:#333;background-color:rgba(51,51,51,.9)}.vjs-default-skin .vjs-slider:focus{-webkit-box-shadow:0 0 2em #fff;-moz-box-shadow:0 0 2em #fff;box-shadow:0 0 2em #fff}.vjs-default-skin .vjs-slider-handle{position:absolute;left:0;top:0}.vjs-default-skin .vjs-slider-handle:before{content:"\e009";font-family:VideoJS;font-size:1em;line-height:1;text-align:center;text-shadow:0 0 1em #fff;position:absolute;top:0;left:0;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-o-transform:rotate(-45deg);transform:rotate(-45deg)}.vjs-default-skin .vjs-control-bar{display:none;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#07141e;background-color:rgba(7,20,30,.7)}.vjs-default-skin.vjs-has-started .vjs-control-bar{display:block;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{display:block;visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-default-skin.vjs-controls-disabled .vjs-control-bar{display:none}.vjs-default-skin.vjs-using-native-controls .vjs-control-bar{display:none}.vjs-default-skin.vjs-error .vjs-control-bar{display:none}.vjs-audio.vjs-default-skin.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}@media \0screen{.vjs-default-skin.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}.vjs-default-skin .vjs-control{outline:0;position:relative;float:left;text-align:center;margin:0;padding:0;height:3em;width:4em}.vjs-default-skin .vjs-control:before{font-family:VideoJS;font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-control:focus:before,.vjs-default-skin .vjs-control:hover:before{text-shadow:0 0 1em #fff}.vjs-default-skin .vjs-control:focus{}.vjs-default-skin .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-default-skin .vjs-play-control{width:5em;cursor:pointer}.vjs-default-skin .vjs-play-control:before{content:"\e001"}.vjs-default-skin.vjs-playing .vjs-play-control:before{content:"\e002"}.vjs-default-skin .vjs-playback-rate .vjs-playback-rate-value{font-size:1.5em;line-height:2;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.5)}.vjs-default-skin .vjs-playback-rate.vjs-menu-button .vjs-menu .vjs-menu-content{width:4em;left:-2em;list-style:none}.vjs-default-skin .vjs-mute-control,.vjs-default-skin .vjs-volume-menu-button{cursor:pointer;float:right}.vjs-default-skin .vjs-mute-control:before,.vjs-default-skin .vjs-volume-menu-button:before{content:"\e006"}.vjs-default-skin .vjs-mute-control.vjs-vol-0:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-0:before{content:"\e003"}.vjs-default-skin .vjs-mute-control.vjs-vol-1:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-1:before{content:"\e004"}.vjs-default-skin .vjs-mute-control.vjs-vol-2:before,.vjs-default-skin .vjs-volume-menu-button.vjs-vol-2:before{content:"\e005"}.vjs-default-skin .vjs-volume-control{width:5em;float:right}.vjs-default-skin .vjs-volume-bar{width:5em;height:.6em;margin:1.1em auto 0}.vjs-default-skin .vjs-volume-level{position:absolute;top:0;left:0;height:.5em;width:100%;background:#66a8cc url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAAP0lEQVQIHWWMAQoAIAgDR/QJ/Ub//04+w7ZICBwcOg5FZi5iBB82AGzixEglJrd4TVK5XUJpskSTEvpdFzX9AB2pGziSQcvAAAAAAElFTkSuQmCC) -50% 0 repeat}.vjs-default-skin .vjs-volume-bar .vjs-volume-handle{width:.5em;height:.5em;left:4.5em}.vjs-default-skin .vjs-volume-handle:before{font-size:.9em;top:-.2em;left:-.2em;width:1em;height:1em}.vjs-default-skin .vjs-volume-menu-button .vjs-menu{display:block;width:0;height:0;border-top-color:transparent}.vjs-default-skin .vjs-volume-menu-button .vjs-menu .vjs-menu-content{height:0;width:0}.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu,.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing{border-top-color:rgba(7,40,50,.5)}.vjs-default-skin .vjs-volume-menu-button:hover .vjs-menu .vjs-menu-content,.vjs-default-skin .vjs-volume-menu-button .vjs-menu.vjs-lock-showing .vjs-menu-content{height:2.9em;width:10em}.vjs-default-skin .vLine truncated
|
||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,165 @@
|
||||
/*! Video.js v4.11.4 Copyright 2014 Brightcove, Inc. https://github.com/videojs/video.js/blob/master/LICENSE */
|
||||
(function() {var b=void 0,f=!0,k=null,l=!1;function m(){return function(){}}function n(a){return function(){return this[a]}}function r(a){return function(){return a}}var s;document.createElement("video");document.createElement("audio");document.createElement("track");function t(a,c,d){if("string"===typeof a){0===a.indexOf("#")&&(a=a.slice(1));if(t.Ga[a])return t.Ga[a];a=t.w(a)}if(!a||!a.nodeName)throw new TypeError("The element or ID supplied is not valid. (videojs)");return a.player||new t.Player(a,c,d)}
|
||||
var videojs=window.videojs=t;t.bc="4.11";t.ed="https:"==document.location.protocol?"https://":"http://";
|
||||
t.options={techOrder:["html5","flash"],html5:{},flash:{},width:300,height:150,defaultVolume:0,playbackRates:[],inactivityTimeout:2E3,children:{mediaLoader:{},posterImage:{},textTrackDisplay:{},loadingSpinner:{},bigPlayButton:{},controlBar:{},errorDisplay:{}},language:document.getElementsByTagName("html")[0].getAttribute("lang")||navigator.languages&&navigator.languages[0]||navigator.Ke||navigator.language||"en",languages:{},notSupportedMessage:"No compatible source was found for this video."};
|
||||
"GENERATED_CDN_VSN"!==t.bc&&(videojs.options.flash.swf=t.ed+"vjs.zencdn.net/"+t.bc+"/video-js.swf");t.sd=function(a,c){t.options.languages[a]=t.options.languages[a]!==b?t.W.pa(t.options.languages[a],c):c;return t.options.languages};t.Ga={};"function"===typeof define&&define.amd?define([],function(){return videojs}):"object"===typeof exports&&"object"===typeof module&&(module.exports=videojs);t.va=t.CoreObject=m();
|
||||
t.va.extend=function(a){var c,d;a=a||{};c=a.init||a.i||this.prototype.init||this.prototype.i||m();d=function(){c.apply(this,arguments)};d.prototype=t.h.create(this.prototype);d.prototype.constructor=d;d.extend=t.va.extend;d.create=t.va.create;for(var e in a)a.hasOwnProperty(e)&&(d.prototype[e]=a[e]);return d};t.va.create=function(){var a=t.h.create(this.prototype);this.apply(a,arguments);return a};
|
||||
t.c=function(a,c,d){if(t.h.isArray(c))return u(t.c,a,c,d);var e=t.getData(a);e.C||(e.C={});e.C[c]||(e.C[c]=[]);d.q||(d.q=t.q++);e.C[c].push(d);e.X||(e.disabled=l,e.X=function(c){if(!e.disabled){c=t.Cc(c);var d=e.C[c.type];if(d)for(var d=d.slice(0),j=0,p=d.length;j<p&&!c.Jc();j++)d[j].call(a,c)}});1==e.C[c].length&&(a.addEventListener?a.addEventListener(c,e.X,l):a.attachEvent&&a.attachEvent("on"+c,e.X))};
|
||||
t.k=function(a,c,d){if(t.Ec(a)){var e=t.getData(a);if(e.C){if(t.h.isArray(c))return u(t.k,a,c,d);if(c){var g=e.C[c];if(g){if(d){if(d.q)for(e=0;e<g.length;e++)g[e].q===d.q&&g.splice(e--,1)}else e.C[c]=[];t.sc(a,c)}}else for(g in e.C)c=g,e.C[c]=[],t.sc(a,c)}}};t.sc=function(a,c){var d=t.getData(a);0===d.C[c].length&&(delete d.C[c],a.removeEventListener?a.removeEventListener(c,d.X,l):a.detachEvent&&a.detachEvent("on"+c,d.X));t.Ob(d.C)&&(delete d.C,delete d.X,delete d.disabled);t.Ob(d)&&t.Sc(a)};
|
||||
t.Cc=function(a){function c(){return f}function d(){return l}if(!a||!a.Pb){var e=a||window.event;a={};for(var g in e)"layerX"!==g&&("layerY"!==g&&"keyLocation"!==g)&&("returnValue"==g&&e.preventDefault||(a[g]=e[g]));a.target||(a.target=a.srcElement||document);a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;a.preventDefault=function(){e.preventDefault&&e.preventDefault();a.returnValue=l;a.Nd=c;a.defaultPrevented=f};a.Nd=d;a.defaultPrevented=l;a.stopPropagation=function(){e.stopPropagation&&
|
||||
e.stopPropagation();a.cancelBubble=f;a.Pb=c};a.Pb=d;a.stopImmediatePropagation=function(){e.stopImmediatePropagation&&e.stopImmediatePropagation();a.Jc=c;a.stopPropagation()};a.Jc=d;if(a.clientX!=k){g=document.documentElement;var h=document.body;a.pageX=a.clientX+(g&&g.scrollLeft||h&&h.scrollLeft||0)-(g&&g.clientLeft||h&&h.clientLeft||0);a.pageY=a.clientY+(g&&g.scrollTop||h&&h.scrollTop||0)-(g&&g.clientTop||h&&h.clientTop||0)}a.which=a.charCode||a.keyCode;a.button!=k&&(a.button=a.button&1?0:a.button&
|
||||
4?1:a.button&2?2:0)}return a};t.l=function(a,c){var d=t.Ec(a)?t.getData(a):{},e=a.parentNode||a.ownerDocument;"string"===typeof c&&(c={type:c,target:a});c=t.Cc(c);d.X&&d.X.call(a,c);if(e&&!c.Pb()&&c.bubbles!==l)t.l(e,c);else if(!e&&!c.defaultPrevented&&(d=t.getData(c.target),c.target[c.type])){d.disabled=f;if("function"===typeof c.target[c.type])c.target[c.type]();d.disabled=l}return!c.defaultPrevented};
|
||||
t.Q=function(a,c,d){function e(){t.k(a,c,e);d.apply(this,arguments)}if(t.h.isArray(c))return u(t.Q,a,c,d);e.q=d.q=d.q||t.q++;t.c(a,c,e)};function u(a,c,d,e){t.pc.forEach(d,function(d){a(c,d,e)})}var v=Object.prototype.hasOwnProperty;t.e=function(a,c){var d;c=c||{};d=document.createElement(a||"div");t.h.Y(c,function(a,c){-1!==a.indexOf("aria-")||"role"==a?d.setAttribute(a,c):d[a]=c});return d};t.ba=function(a){return a.charAt(0).toUpperCase()+a.slice(1)};t.h={};
|
||||
t.h.create=Object.create||function(a){function c(){}c.prototype=a;return new c};t.h.Y=function(a,c,d){for(var e in a)v.call(a,e)&&c.call(d||this,e,a[e])};t.h.z=function(a,c){if(!c)return a;for(var d in c)v.call(c,d)&&(a[d]=c[d]);return a};t.h.Ad=function(a,c){var d,e,g;a=t.h.copy(a);for(d in c)v.call(c,d)&&(e=a[d],g=c[d],a[d]=t.h.ab(e)&&t.h.ab(g)?t.h.Ad(e,g):c[d]);return a};t.h.copy=function(a){return t.h.z({},a)};
|
||||
t.h.ab=function(a){return!!a&&"object"===typeof a&&"[object Object]"===a.toString()&&a.constructor===Object};t.h.isArray=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};t.Pd=function(a){return a!==a};t.bind=function(a,c,d){function e(){return c.apply(a,arguments)}c.q||(c.q=t.q++);e.q=d?d+"_"+c.q:c.q;return e};t.ya={};t.q=1;t.expando="vdata"+(new Date).getTime();t.getData=function(a){var c=a[t.expando];c||(c=a[t.expando]=t.q++,t.ya[c]={});return t.ya[c]};
|
||||
t.Ec=function(a){a=a[t.expando];return!(!a||t.Ob(t.ya[a]))};t.Sc=function(a){var c=a[t.expando];if(c){delete t.ya[c];try{delete a[t.expando]}catch(d){a.removeAttribute?a.removeAttribute(t.expando):a[t.expando]=k}}};t.Ob=function(a){for(var c in a)if(a[c]!==k)return l;return f};t.$a=function(a,c){return-1!==(" "+a.className+" ").indexOf(" "+c+" ")};t.n=function(a,c){t.$a(a,c)||(a.className=""===a.className?c:a.className+" "+c)};
|
||||
t.r=function(a,c){var d,e;if(t.$a(a,c)){d=a.className.split(" ");for(e=d.length-1;0<=e;e--)d[e]===c&&d.splice(e,1);a.className=d.join(" ")}};t.A=t.e("video");t.N=navigator.userAgent;t.md=/iPhone/i.test(t.N);t.ld=/iPad/i.test(t.N);t.nd=/iPod/i.test(t.N);t.kd=t.md||t.ld||t.nd;var aa=t,x;var y=t.N.match(/OS (\d+)_/i);x=y&&y[1]?y[1]:b;aa.Ae=x;t.hd=/Android/i.test(t.N);var ba=t,z;var A=t.N.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),B,C;
|
||||
A?(B=A[1]&&parseFloat(A[1]),C=A[2]&&parseFloat(A[2]),z=B&&C?parseFloat(A[1]+"."+A[2]):B?B:k):z=k;ba.ac=z;t.od=t.hd&&/webkit/i.test(t.N)&&2.3>t.ac;t.jd=/Firefox/i.test(t.N);t.Be=/Chrome/i.test(t.N);t.wb=!!("ontouchstart"in window||window.gd&&document instanceof window.gd);t.fd="backgroundSize"in t.A.style;t.Uc=function(a,c){t.h.Y(c,function(c,e){e===k||"undefined"===typeof e||e===l?a.removeAttribute(c):a.setAttribute(c,e===f?"":e)})};
|
||||
t.Ea=function(a){var c,d,e,g;c={};if(a&&a.attributes&&0<a.attributes.length){d=a.attributes;for(var h=d.length-1;0<=h;h--){e=d[h].name;g=d[h].value;if("boolean"===typeof a[e]||-1!==",autoplay,controls,loop,muted,default,".indexOf(","+e+","))g=g!==k?f:l;c[e]=g}}return c};
|
||||
t.He=function(a,c){var d="";document.defaultView&&document.defaultView.getComputedStyle?d=document.defaultView.getComputedStyle(a,"").getPropertyValue(c):a.currentStyle&&(d=a["client"+c.substr(0,1).toUpperCase()+c.substr(1)]+"px");return d};t.Nb=function(a,c){c.firstChild?c.insertBefore(a,c.firstChild):c.appendChild(a)};t.Va={};t.w=function(a){0===a.indexOf("#")&&(a=a.slice(1));return document.getElementById(a)};
|
||||
t.Da=function(a,c){c=c||a;var d=Math.floor(a%60),e=Math.floor(a/60%60),g=Math.floor(a/3600),h=Math.floor(c/60%60),j=Math.floor(c/3600);if(isNaN(a)||Infinity===a)g=e=d="-";g=0<g||0<j?g+":":"";return g+(((g||10<=h)&&10>e?"0"+e:e)+":")+(10>d?"0"+d:d)};t.ud=function(){document.body.focus();document.onselectstart=r(l)};t.ve=function(){document.onselectstart=r(f)};t.trim=function(a){return(a+"").replace(/^\s+|\s+$/g,"")};t.round=function(a,c){c||(c=0);return Math.round(a*Math.pow(10,c))/Math.pow(10,c)};
|
||||
t.Eb=function(a,c){return{length:1,start:function(){return a},end:function(){return c}}};t.je=function(a){try{var c=window.localStorage||l;c&&(c.volume=a)}catch(d){22==d.code||1014==d.code?t.log("LocalStorage Full (VideoJS)",d):18==d.code?t.log("LocalStorage not allowed (VideoJS)",d):t.log("LocalStorage Error (VideoJS)",d)}};t.Jd=function(a){a.match(/^https?:\/\//)||(a=t.e("div",{innerHTML:'<a href="'+a+'">x</a>'}).firstChild.href);return a};
|
||||
t.fe=function(a){var c,d,e,g;g="protocol hostname port pathname search hash host".split(" ");d=t.e("a",{href:a});if(e=""===d.host&&"file:"!==d.protocol)c=t.e("div"),c.innerHTML='<a href="'+a+'"></a>',d=c.firstChild,c.setAttribute("style","display:none; position:absolute;"),document.body.appendChild(c);a={};for(var h=0;h<g.length;h++)a[g[h]]=d[g[h]];e&&document.body.removeChild(c);return a};
|
||||
function D(a,c){var d,e;d=Array.prototype.slice.call(c);e=m();e=window.console||{log:e,warn:e,error:e};a?d.unshift(a.toUpperCase()+":"):a="log";t.log.history.push(d);d.unshift("VIDEOJS:");if(e[a].apply)e[a].apply(e,d);else e[a](d.join(" "))}t.log=function(){D(k,arguments)};t.log.history=[];t.log.error=function(){D("error",arguments)};t.log.warn=function(){D("warn",arguments)};
|
||||
t.Hd=function(a){var c,d;a.getBoundingClientRect&&a.parentNode&&(c=a.getBoundingClientRect());if(!c)return{left:0,top:0};a=document.documentElement;d=document.body;return{left:t.round(c.left+(window.pageXOffset||d.scrollLeft)-(a.clientLeft||d.clientLeft||0)),top:t.round(c.top+(window.pageYOffset||d.scrollTop)-(a.clientTop||d.clientTop||0))}};t.pc={};t.pc.forEach=function(a,c,d){if(t.h.isArray(a)&&c instanceof Function)for(var e=0,g=a.length;e<g;++e)c.call(d||t,a[e],e,a);return a};
|
||||
t.ye=function(a,c){var d,e,g,h,j,p,q;"string"===typeof a&&(a={uri:a});videojs.W.pa({method:"GET",timeout:45E3},a);c=c||m();p=function(){window.clearTimeout(j);c(k,e,e.response||e.responseText)};q=function(a){window.clearTimeout(j);if(!a||"string"===typeof a)a=Error(a);c(a,e)};d=window.XMLHttpRequest;"undefined"===typeof d&&(d=function(){try{return new window.ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(a){}try{return new window.ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(c){}try{return new window.ActiveXObject("Msxml2.XMLHTTP")}catch(d){}throw Error("This browser does not support XMLHttpRequest.");
|
||||
});e=new d;e.uri=a.uri;d=t.fe(a.uri);g=window.location;d.protocol+d.host!==g.protocol+g.host&&window.XDomainRequest&&!("withCredentials"in e)?(e=new window.XDomainRequest,e.onload=p,e.onerror=q,e.onprogress=m(),e.ontimeout=m()):(h="file:"==d.protocol||"file:"==g.protocol,e.onreadystatechange=function(){if(4===e.readyState){if(e.te)return q("timeout");200===e.status||h&&0===e.status?p():q()}},a.timeout&&(j=window.setTimeout(function(){4!==e.readyState&&(e.te=f,e.abort())},a.timeout)));try{e.open(a.method||
|
||||
"GET",a.uri,f)}catch(w){q(w);return}a.withCredentials&&(e.withCredentials=f);a.responseType&&(e.responseType=a.responseType);try{e.send()}catch(ja){q(ja)}};t.W={};t.W.pa=function(a,c){var d,e,g;a=t.h.copy(a);for(d in c)c.hasOwnProperty(d)&&(e=a[d],g=c[d],a[d]=t.h.ab(e)&&t.h.ab(g)?t.W.pa(e,g):c[d]);return a};
|
||||
t.a=t.va.extend({i:function(a,c,d){this.d=a;this.m=t.h.copy(this.m);c=this.options(c);this.K=c.id||c.el&&c.el.id;this.K||(this.K=(a.id&&a.id()||"no_player")+"_component_"+t.q++);this.Vd=c.name||k;this.b=c.el||this.e();this.O=[];this.Xa={};this.Ya={};this.Gc();this.H(d);if(c.Tc!==l){var e,g;this.j().reportUserActivity&&(e=t.bind(this.j(),this.j().reportUserActivity),this.c("touchstart",function(){e();this.clearInterval(g);g=this.setInterval(e,250)}),a=function(){e();this.clearInterval(g)},this.c("touchmove",
|
||||
e),this.c("touchend",a),this.c("touchcancel",a))}}});s=t.a.prototype;s.dispose=function(){this.l({type:"dispose",bubbles:l});if(this.O)for(var a=this.O.length-1;0<=a;a--)this.O[a].dispose&&this.O[a].dispose();this.Ya=this.Xa=this.O=k;this.k();this.b.parentNode&&this.b.parentNode.removeChild(this.b);t.Sc(this.b);this.b=k};s.d=f;s.j=n("d");s.options=function(a){return a===b?this.m:this.m=t.W.pa(this.m,a)};s.e=function(a,c){return t.e(a,c)};
|
||||
s.t=function(a){var c=this.d.language(),d=this.d.languages();return d&&d[c]&&d[c][a]?d[c][a]:a};s.w=n("b");s.ma=function(){return this.v||this.b};s.id=n("K");s.name=n("Vd");s.children=n("O");s.Kd=function(a){return this.Xa[a]};s.na=function(a){return this.Ya[a]};
|
||||
s.U=function(a,c){var d,e;"string"===typeof a?(e=a,c=c||{},d=c.componentClass||t.ba(e),c.name=e,d=new window.videojs[d](this.d||this,c)):d=a;this.O.push(d);"function"===typeof d.id&&(this.Xa[d.id()]=d);(e=e||d.name&&d.name())&&(this.Ya[e]=d);"function"===typeof d.el&&d.el()&&this.ma().appendChild(d.el());return d};
|
||||
s.removeChild=function(a){"string"===typeof a&&(a=this.na(a));if(a&&this.O){for(var c=l,d=this.O.length-1;0<=d;d--)if(this.O[d]===a){c=f;this.O.splice(d,1);break}c&&(this.Xa[a.id()]=k,this.Ya[a.name()]=k,(c=a.w())&&c.parentNode===this.ma()&&this.ma().removeChild(a.w()))}};
|
||||
s.Gc=function(){var a,c,d,e,g,h;a=this;c=a.options();if(d=c.children)if(h=function(d,e){c[d]!==b&&(e=c[d]);e!==l&&(a[d]=a.U(d,e))},t.h.isArray(d))for(var j=0;j<d.length;j++)e=d[j],"string"==typeof e?(g=e,e={}):g=e.name,h(g,e);else t.h.Y(d,h)};s.S=r("");
|
||||
s.c=function(a,c,d){var e,g,h;"string"===typeof a||t.h.isArray(a)?t.c(this.b,a,t.bind(this,c)):(e=t.bind(this,d),h=this,g=function(){h.k(a,c,e)},g.q=e.q,this.c("dispose",g),d=function(){h.k("dispose",g)},d.q=e.q,a.nodeName?(t.c(a,c,e),t.c(a,"dispose",d)):"function"===typeof a.c&&(a.c(c,e),a.c("dispose",d)));return this};
|
||||
s.k=function(a,c,d){!a||"string"===typeof a||t.h.isArray(a)?t.k(this.b,a,c):(d=t.bind(this,d),this.k("dispose",d),a.nodeName?(t.k(a,c,d),t.k(a,"dispose",d)):(a.k(c,d),a.k("dispose",d)));return this};s.Q=function(a,c,d){var e,g,h;"string"===typeof a||t.h.isArray(a)?t.Q(this.b,a,t.bind(this,c)):(e=t.bind(this,d),g=this,h=function(){g.k(a,c,h);e.apply(this,arguments)},h.q=e.q,this.c(a,c,h));return this};s.l=function(a){t.l(this.b,a);return this};
|
||||
s.H=function(a){a&&(this.oa?a.call(this):(this.hb===b&&(this.hb=[]),this.hb.push(a)));return this};s.Na=function(){this.oa=f;var a=this.hb;if(a&&0<a.length){for(var c=0,d=a.length;c<d;c++)a[c].call(this);this.hb=[];this.l("ready")}};s.$a=function(a){return t.$a(this.b,a)};s.n=function(a){t.n(this.b,a);return this};s.r=function(a){t.r(this.b,a);return this};s.show=function(){this.b.style.display="block";return this};s.Z=function(){this.b.style.display="none";return this};
|
||||
function E(a){a.r("vjs-lock-showing")}s.disable=function(){this.Z();this.show=m()};s.width=function(a,c){return F(this,"width",a,c)};s.height=function(a,c){return F(this,"height",a,c)};s.Dd=function(a,c){return this.width(a,f).height(c)};
|
||||
function F(a,c,d,e){if(d!==b){if(d===k||t.Pd(d))d=0;a.b.style[c]=-1!==(""+d).indexOf("%")||-1!==(""+d).indexOf("px")?d:"auto"===d?"":d+"px";e||a.l("resize");return a}if(!a.b)return 0;d=a.b.style[c];e=d.indexOf("px");return-1!==e?parseInt(d.slice(0,e),10):parseInt(a.b["offset"+t.ba(c)],10)}
|
||||
function G(a){var c,d,e,g,h,j,p,q;c=0;d=k;a.c("touchstart",function(a){1===a.touches.length&&(d=a.touches[0],c=(new Date).getTime(),g=f)});a.c("touchmove",function(a){1<a.touches.length?g=l:d&&(j=a.touches[0].pageX-d.pageX,p=a.touches[0].pageY-d.pageY,q=Math.sqrt(j*j+p*p),22<q&&(g=l))});h=function(){g=l};a.c("touchleave",h);a.c("touchcancel",h);a.c("touchend",function(a){d=k;g===f&&(e=(new Date).getTime()-c,250>e&&(a.preventDefault(),this.l("tap")))})}
|
||||
s.setTimeout=function(a,c){function d(){this.clearTimeout(e)}a=t.bind(this,a);var e=setTimeout(a,c);d.q="vjs-timeout-"+e;this.c("dispose",d);return e};s.clearTimeout=function(a){function c(){}clearTimeout(a);c.q="vjs-timeout-"+a;this.k("dispose",c);return a};s.setInterval=function(a,c){function d(){this.clearInterval(e)}a=t.bind(this,a);var e=setInterval(a,c);d.q="vjs-interval-"+e;this.c("dispose",d);return e};
|
||||
s.clearInterval=function(a){function c(){}clearInterval(a);c.q="vjs-interval-"+a;this.k("dispose",c);return a};t.u=t.a.extend({i:function(a,c){t.a.call(this,a,c);G(this);this.c("tap",this.s);this.c("click",this.s);this.c("focus",this.fb);this.c("blur",this.eb)}});s=t.u.prototype;
|
||||
s.e=function(a,c){var d;c=t.h.z({className:this.S(),role:"button","aria-live":"polite",tabIndex:0},c);d=t.a.prototype.e.call(this,a,c);c.innerHTML||(this.v=t.e("div",{className:"vjs-control-content"}),this.Cb=t.e("span",{className:"vjs-control-text",innerHTML:this.t(this.la)||"Need Text"}),this.v.appendChild(this.Cb),d.appendChild(this.v));return d};s.S=function(){return"vjs-control "+t.a.prototype.S.call(this)};s.s=m();s.fb=function(){t.c(document,"keydown",t.bind(this,this.ea))};
|
||||
s.ea=function(a){if(32==a.which||13==a.which)a.preventDefault(),this.s()};s.eb=function(){t.k(document,"keydown",t.bind(this,this.ea))};t.R=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.td=this.na(this.m.barName);this.handle=this.na(this.m.handleName);this.c("mousedown",this.gb);this.c("touchstart",this.gb);this.c("focus",this.fb);this.c("blur",this.eb);this.c("click",this.s);this.c(a,"controlsvisible",this.update);this.c(a,this.Oc,this.update)}});s=t.R.prototype;
|
||||
s.e=function(a,c){c=c||{};c.className+=" vjs-slider";c=t.h.z({role:"slider","aria-valuenow":0,"aria-valuemin":0,"aria-valuemax":100,tabIndex:0},c);return t.a.prototype.e.call(this,a,c)};s.gb=function(a){a.preventDefault();t.ud();this.n("vjs-sliding");this.c(document,"mousemove",this.fa);this.c(document,"mouseup",this.ra);this.c(document,"touchmove",this.fa);this.c(document,"touchend",this.ra);this.fa(a)};s.fa=m();
|
||||
s.ra=function(){t.ve();this.r("vjs-sliding");this.k(document,"mousemove",this.fa);this.k(document,"mouseup",this.ra);this.k(document,"touchmove",this.fa);this.k(document,"touchend",this.ra);this.update()};s.update=function(){if(this.b){var a,c=this.Lb(),d=this.handle,e=this.td;isNaN(c)&&(c=0);a=c;if(d){a=this.b.offsetWidth;var g=d.w().offsetWidth;a=g?g/a:0;c*=1-a;a=c+a/2;d.w().style.left=t.round(100*c,2)+"%"}e&&(e.w().style.width=t.round(100*a,2)+"%")}};
|
||||
function H(a,c){var d,e,g,h;d=a.b;e=t.Hd(d);h=g=d.offsetWidth;d=a.handle;if(a.options().vertical)return h=e.top,e=c.changedTouches?c.changedTouches[0].pageY:c.pageY,d&&(d=d.w().offsetHeight,h+=d/2,g-=d),Math.max(0,Math.min(1,(h-e+g)/g));g=e.left;e=c.changedTouches?c.changedTouches[0].pageX:c.pageX;d&&(d=d.w().offsetWidth,g+=d/2,h-=d);return Math.max(0,Math.min(1,(e-g)/h))}s.fb=function(){this.c(document,"keydown",this.ea)};
|
||||
s.ea=function(a){if(37==a.which||40==a.which)a.preventDefault(),this.Yc();else if(38==a.which||39==a.which)a.preventDefault(),this.Zc()};s.eb=function(){this.k(document,"keydown",this.ea)};s.s=function(a){a.stopImmediatePropagation();a.preventDefault()};t.$=t.a.extend();t.$.prototype.defaultValue=0;t.$.prototype.e=function(a,c){c=c||{};c.className+=" vjs-slider-handle";c=t.h.z({innerHTML:'<span class="vjs-control-text">'+this.defaultValue+"</span>"},c);return t.a.prototype.e.call(this,"div",c)};
|
||||
t.ja=t.a.extend();function ca(a,c){a.U(c);c.c("click",t.bind(a,function(){E(this)}))}t.ja.prototype.e=function(){var a=this.options().uc||"ul";this.v=t.e(a,{className:"vjs-menu-content"});a=t.a.prototype.e.call(this,"div",{append:this.v,className:"vjs-menu"});a.appendChild(this.v);t.c(a,"click",function(a){a.preventDefault();a.stopImmediatePropagation()});return a};t.J=t.u.extend({i:function(a,c){t.u.call(this,a,c);this.selected(c.selected)}});
|
||||
t.J.prototype.e=function(a,c){return t.u.prototype.e.call(this,"li",t.h.z({className:"vjs-menu-item",innerHTML:this.t(this.m.label)},c))};t.J.prototype.s=function(){this.selected(f)};t.J.prototype.selected=function(a){a?(this.n("vjs-selected"),this.b.setAttribute("aria-selected",f)):(this.r("vjs-selected"),this.b.setAttribute("aria-selected",l))};
|
||||
t.L=t.u.extend({i:function(a,c){t.u.call(this,a,c);this.Fa=this.Aa();this.U(this.Fa);this.P&&0===this.P.length&&this.Z();this.c("keydown",this.ea);this.b.setAttribute("aria-haspopup",f);this.b.setAttribute("role","button")}});s=t.L.prototype;s.xa=l;s.Aa=function(){var a=new t.ja(this.d);this.options().title&&a.ma().appendChild(t.e("li",{className:"vjs-menu-title",innerHTML:t.ba(this.options().title),re:-1}));if(this.P=this.createItems())for(var c=0;c<this.P.length;c++)ca(a,this.P[c]);return a};
|
||||
s.za=m();s.S=function(){return this.className+" vjs-menu-button "+t.u.prototype.S.call(this)};s.fb=m();s.eb=m();s.s=function(){this.Q("mouseout",t.bind(this,function(){E(this.Fa);this.b.blur()}));this.xa?I(this):J(this)};s.ea=function(a){32==a.which||13==a.which?(this.xa?I(this):J(this),a.preventDefault()):27==a.which&&(this.xa&&I(this),a.preventDefault())};function J(a){a.xa=f;a.Fa.n("vjs-lock-showing");a.b.setAttribute("aria-pressed",f);a.P&&0<a.P.length&&a.P[0].w().focus()}
|
||||
function I(a){a.xa=l;E(a.Fa);a.b.setAttribute("aria-pressed",l)}t.D=function(a){"number"===typeof a?this.code=a:"string"===typeof a?this.message=a:"object"===typeof a&&t.h.z(this,a);this.message||(this.message=t.D.Bd[this.code]||"")};t.D.prototype.code=0;t.D.prototype.message="";t.D.prototype.status=k;t.D.Za="MEDIA_ERR_CUSTOM MEDIA_ERR_ABORTED MEDIA_ERR_NETWORK MEDIA_ERR_DECODE MEDIA_ERR_SRC_NOT_SUPPORTED MEDIA_ERR_ENCRYPTED".split(" ");
|
||||
t.D.Bd={1:"You aborted the video playback",2:"A network error caused the video download to fail part-way.",3:"The video playback was aborted due to a corruption problem or because the video used features your browser did not support.",4:"The video could not be loaded, either because the server or network failed or because the format is not supported.",5:"The video is encrypted and we do not have the keys to decrypt it."};for(var K=0;K<t.D.Za.length;K++)t.D[t.D.Za[K]]=K,t.D.prototype[t.D.Za[K]]=K;
|
||||
var L,M,N,O;
|
||||
L=["requestFullscreen exitFullscreen fullscreenElement fullscreenEnabled fullscreenchange fullscreenerror".split(" "),"webkitRequestFullscreen webkitExitFullscreen webkitFullscreenElement webkitFullscreenEnabled webkitfullscreenchange webkitfullscreenerror".split(" "),"webkitRequestFullScreen webkitCancelFullScreen webkitCurrentFullScreenElement webkitCancelFullScreen webkitfullscreenchange webkitfullscreenerror".split(" "),"mozRequestFullScreen mozCancelFullScreen mozFullScreenElement mozFullScreenEnabled mozfullscreenchange mozfullscreenerror".split(" "),"msRequestFullscreen msExitFullscreen msFullscreenElement msFullscreenEnabled MSFullscreenChange MSFullscreenError".split(" ")];
|
||||
M=L[0];for(O=0;O<L.length;O++)if(L[O][1]in document){N=L[O];break}if(N){t.Va.Kb={};for(O=0;O<N.length;O++)t.Va.Kb[M[O]]=N[O]}
|
||||
t.Player=t.a.extend({i:function(a,c,d){this.I=a;a.id=a.id||"vjs_video_"+t.q++;this.se=a&&t.Ea(a);c=t.h.z(da(a),c);this.bb=c.language||t.options.language;this.Td=c.languages||t.options.languages;this.F={};this.Pc=c.poster||"";this.Db=!!c.controls;a.controls=l;c.Tc=l;P(this,"audio"===this.I.nodeName.toLowerCase());t.a.call(this,this,c,d);this.controls()?this.n("vjs-controls-enabled"):this.n("vjs-controls-disabled");P(this)&&this.n("vjs-audio");t.Ga[this.K]=this;c.plugins&&t.h.Y(c.plugins,function(a,
|
||||
c){this[a](c)},this);var e,g,h,j,p;e=t.bind(this,this.reportUserActivity);this.c("mousedown",function(){e();this.clearInterval(g);g=this.setInterval(e,250)});this.c("mousemove",function(a){if(a.screenX!=j||a.screenY!=p)j=a.screenX,p=a.screenY,e()});this.c("mouseup",function(){e();this.clearInterval(g)});this.c("keydown",e);this.c("keyup",e);this.setInterval(function(){if(this.ua){this.ua=l;this.userActive(f);this.clearTimeout(h);var a=this.options().inactivityTimeout;0<a&&(h=this.setTimeout(function(){this.ua||
|
||||
this.userActive(l)},a))}},250)}});s=t.Player.prototype;s.language=function(a){if(a===b)return this.bb;this.bb=a;return this};s.languages=n("Td");s.m=t.options;s.dispose=function(){this.l("dispose");this.k("dispose");t.Ga[this.K]=k;this.I&&this.I.player&&(this.I.player=k);this.b&&this.b.player&&(this.b.player=k);this.o&&this.o.dispose();t.a.prototype.dispose.call(this)};
|
||||
function da(a){var c,d,e={sources:[],tracks:[]};c=t.Ea(a);d=c["data-setup"];d!==k&&t.h.z(c,t.JSON.parse(d||"{}"));t.h.z(e,c);if(a.hasChildNodes()){var g,h;a=a.childNodes;g=0;for(h=a.length;g<h;g++)c=a[g],d=c.nodeName.toLowerCase(),"source"===d?e.sources.push(t.Ea(c)):"track"===d&&e.tracks.push(t.Ea(c))}return e}
|
||||
s.e=function(){var a=this.b=t.a.prototype.e.call(this,"div"),c=this.I,d;c.removeAttribute("width");c.removeAttribute("height");if(c.hasChildNodes()){var e,g,h,j,p;e=c.childNodes;g=e.length;for(p=[];g--;)h=e[g],j=h.nodeName.toLowerCase(),"track"===j&&p.push(h);for(e=0;e<p.length;e++)c.removeChild(p[e])}d=t.Ea(c);t.h.Y(d,function(c){"class"==c?a.className=d[c]:a.setAttribute(c,d[c])});c.id+="_html5_api";c.className="vjs-tech";c.player=a.player=this;this.n("vjs-paused");this.width(this.m.width,f);this.height(this.m.height,
|
||||
f);c.Md=c.networkState;c.parentNode&&c.parentNode.insertBefore(a,c);t.Nb(c,a);this.b=a;this.c("loadstart",this.Zd);this.c("waiting",this.ee);this.c(["canplay","canplaythrough","playing","ended"],this.de);this.c("seeking",this.be);this.c("seeked",this.ae);this.c("ended",this.Wd);this.c("play",this.Tb);this.c("firstplay",this.Xd);this.c("pause",this.Sb);this.c("progress",this.$d);this.c("durationchange",this.Mc);this.c("fullscreenchange",this.Yd);return a};
|
||||
function Q(a,c,d){a.o&&(a.oa=l,a.o.dispose(),a.o=l);"Html5"!==c&&a.I&&(t.g.Gb(a.I),a.I=k);a.La=c;a.oa=l;var e=t.h.z({source:d,parentEl:a.b},a.m[c.toLowerCase()]);d&&(a.xc=d.type,d.src==a.F.src&&0<a.F.currentTime&&(e.startTime=a.F.currentTime),a.F.src=d.src);a.o=new window.videojs[c](a,e);a.o.H(function(){this.d.Na()})}s.Zd=function(){this.error(k);this.paused()?(R(this,l),this.Q("play",function(){R(this,f)})):this.l("firstplay")};s.Fc=l;
|
||||
function R(a,c){c!==b&&a.Fc!==c&&((a.Fc=c)?(a.n("vjs-has-started"),a.l("firstplay")):a.r("vjs-has-started"))}s.Tb=function(){this.r("vjs-paused");this.n("vjs-playing")};s.ee=function(){this.n("vjs-waiting")};s.de=function(){this.r("vjs-waiting")};s.be=function(){this.n("vjs-seeking")};s.ae=function(){this.r("vjs-seeking")};s.Xd=function(){this.m.starttime&&this.currentTime(this.m.starttime);this.n("vjs-has-started")};s.Sb=function(){this.r("vjs-playing");this.n("vjs-paused")};
|
||||
s.$d=function(){1==this.bufferedPercent()&&this.l("loadedalldata")};s.Wd=function(){this.m.loop?(this.currentTime(0),this.play()):this.paused()||this.pause()};s.Mc=function(){var a=S(this,"duration");a&&(0>a&&(a=Infinity),this.duration(a),Infinity===a?this.n("vjs-live"):this.r("vjs-live"))};s.Yd=function(){this.isFullscreen()?this.n("vjs-fullscreen"):this.r("vjs-fullscreen")};function T(a,c,d){if(a.o&&!a.o.oa)a.o.H(function(){this[c](d)});else try{a.o[c](d)}catch(e){throw t.log(e),e;}}
|
||||
function S(a,c){if(a.o&&a.o.oa)try{return a.o[c]()}catch(d){throw a.o[c]===b?t.log("Video.js: "+c+" method not defined for "+a.La+" playback technology.",d):"TypeError"==d.name?(t.log("Video.js: "+c+" unavailable on "+a.La+" playback technology element.",d),a.o.oa=l):t.log(d),d;}}s.play=function(){T(this,"play");return this};s.pause=function(){T(this,"pause");return this};s.paused=function(){return S(this,"paused")===l?l:f};
|
||||
s.currentTime=function(a){return a!==b?(T(this,"setCurrentTime",a),this):this.F.currentTime=S(this,"currentTime")||0};s.duration=function(a){if(a!==b)return this.F.duration=parseFloat(a),this;this.F.duration===b&&this.Mc();return this.F.duration||0};s.remainingTime=function(){return this.duration()-this.currentTime()};s.buffered=function(){var a=S(this,"buffered");if(!a||!a.length)a=t.Eb(0,0);return a};
|
||||
s.bufferedPercent=function(){var a=this.duration(),c=this.buffered(),d=0,e,g;if(!a)return 0;for(var h=0;h<c.length;h++)e=c.start(h),g=c.end(h),g>a&&(g=a),d+=g-e;return d/a};s.volume=function(a){if(a!==b)return a=Math.max(0,Math.min(1,parseFloat(a))),this.F.volume=a,T(this,"setVolume",a),t.je(a),this;a=parseFloat(S(this,"volume"));return isNaN(a)?1:a};s.muted=function(a){return a!==b?(T(this,"setMuted",a),this):S(this,"muted")||l};s.Ka=function(){return S(this,"supportsFullScreen")||l};s.Ic=l;
|
||||
s.isFullscreen=function(a){return a!==b?(this.Ic=!!a,this):this.Ic};s.isFullScreen=function(a){t.log.warn('player.isFullScreen() has been deprecated, use player.isFullscreen() with a lowercase "s")');return this.isFullscreen(a)};
|
||||
s.requestFullscreen=function(){var a=t.Va.Kb;this.isFullscreen(f);a?(t.c(document,a.fullscreenchange,t.bind(this,function(c){this.isFullscreen(document[a.fullscreenElement]);this.isFullscreen()===l&&t.k(document,a.fullscreenchange,arguments.callee);this.l("fullscreenchange")})),this.b[a.requestFullscreen]()):this.o.Ka()?T(this,"enterFullScreen"):(this.Bc(),this.l("fullscreenchange"));return this};
|
||||
s.requestFullScreen=function(){t.log.warn('player.requestFullScreen() has been deprecated, use player.requestFullscreen() with a lowercase "s")');return this.requestFullscreen()};s.exitFullscreen=function(){var a=t.Va.Kb;this.isFullscreen(l);if(a)document[a.exitFullscreen]();else this.o.Ka()?T(this,"exitFullScreen"):(this.Hb(),this.l("fullscreenchange"));return this};s.cancelFullScreen=function(){t.log.warn("player.cancelFullScreen() has been deprecated, use player.exitFullscreen()");return this.exitFullscreen()};
|
||||
s.Bc=function(){this.Od=f;this.Ed=document.documentElement.style.overflow;t.c(document,"keydown",t.bind(this,this.Dc));document.documentElement.style.overflow="hidden";t.n(document.body,"vjs-full-window");this.l("enterFullWindow")};s.Dc=function(a){27===a.keyCode&&(this.isFullscreen()===f?this.exitFullscreen():this.Hb())};s.Hb=function(){this.Od=l;t.k(document,"keydown",this.Dc);document.documentElement.style.overflow=this.Ed;t.r(document.body,"vjs-full-window");this.l("exitFullWindow")};
|
||||
s.selectSource=function(a){for(var c=0,d=this.m.techOrder;c<d.length;c++){var e=t.ba(d[c]),g=window.videojs[e];if(g){if(g.isSupported())for(var h=0,j=a;h<j.length;h++){var p=j[h];if(g.canPlaySource(p))return{source:p,o:e}}}else t.log.error('The "'+e+'" tech is undefined. Skipped browser support check for that tech.')}return l};
|
||||
s.src=function(a){if(a===b)return S(this,"src");t.h.isArray(a)?U(this,a):"string"===typeof a?this.src({src:a}):a instanceof Object&&(a.type&&!window.videojs[this.La].canPlaySource(a)?U(this,[a]):(this.F.src=a.src,this.xc=a.type||"",this.H(function(){window.videojs[this.La].prototype.hasOwnProperty("setSource")?T(this,"setSource",a):T(this,"src",a.src);"auto"==this.m.preload&&this.load();this.m.autoplay&&this.play()})));return this};
|
||||
function U(a,c){var d=a.selectSource(c);d?d.o===a.La?a.src(d.source):Q(a,d.o,d.source):(a.setTimeout(function(){this.error({code:4,message:this.t(this.options().notSupportedMessage)})},0),a.Na())}s.load=function(){T(this,"load");return this};s.currentSrc=function(){return S(this,"currentSrc")||this.F.src||""};s.zd=function(){return this.xc||""};s.Ha=function(a){return a!==b?(T(this,"setPreload",a),this.m.preload=a,this):S(this,"preload")};
|
||||
s.autoplay=function(a){return a!==b?(T(this,"setAutoplay",a),this.m.autoplay=a,this):S(this,"autoplay")};s.loop=function(a){return a!==b?(T(this,"setLoop",a),this.m.loop=a,this):S(this,"loop")};s.poster=function(a){if(a===b)return this.Pc;a||(a="");this.Pc=a;T(this,"setPoster",a);this.l("posterchange");return this};
|
||||
s.controls=function(a){return a!==b?(a=!!a,this.Db!==a&&((this.Db=a)?(this.r("vjs-controls-disabled"),this.n("vjs-controls-enabled"),this.l("controlsenabled")):(this.r("vjs-controls-enabled"),this.n("vjs-controls-disabled"),this.l("controlsdisabled"))),this):this.Db};t.Player.prototype.Zb;s=t.Player.prototype;
|
||||
s.usingNativeControls=function(a){return a!==b?(a=!!a,this.Zb!==a&&((this.Zb=a)?(this.n("vjs-using-native-controls"),this.l("usingnativecontrols")):(this.r("vjs-using-native-controls"),this.l("usingcustomcontrols"))),this):this.Zb};s.da=k;s.error=function(a){if(a===b)return this.da;if(a===k)return this.da=a,this.r("vjs-error"),this;this.da=a instanceof t.D?a:new t.D(a);this.l("error");this.n("vjs-error");t.log.error("(CODE:"+this.da.code+" "+t.D.Za[this.da.code]+")",this.da.message,this.da);return this};
|
||||
s.ended=function(){return S(this,"ended")};s.seeking=function(){return S(this,"seeking")};s.ua=f;s.reportUserActivity=function(){this.ua=f};s.Yb=f;s.userActive=function(a){return a!==b?(a=!!a,a!==this.Yb&&((this.Yb=a)?(this.ua=f,this.r("vjs-user-inactive"),this.n("vjs-user-active"),this.l("useractive")):(this.ua=l,this.o&&this.o.Q("mousemove",function(a){a.stopPropagation();a.preventDefault()}),this.r("vjs-user-active"),this.n("vjs-user-inactive"),this.l("userinactive"))),this):this.Yb};
|
||||
s.playbackRate=function(a){return a!==b?(T(this,"setPlaybackRate",a),this):this.o&&this.o.featuresPlaybackRate?S(this,"playbackRate"):1};s.Hc=l;function P(a,c){return c!==b?(a.Hc=!!c,a):a.Hc}t.Qa=t.a.extend();t.Qa.prototype.m={Ie:"play",children:{playToggle:{},currentTimeDisplay:{},timeDivider:{},durationDisplay:{},remainingTimeDisplay:{},liveDisplay:{},progressControl:{},fullscreenToggle:{},volumeControl:{},muteToggle:{},playbackRateMenuButton:{}}};t.Qa.prototype.e=function(){return t.e("div",{className:"vjs-control-bar"})};
|
||||
t.ec=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.ec.prototype.e=function(){var a=t.a.prototype.e.call(this,"div",{className:"vjs-live-controls vjs-control"});this.v=t.e("div",{className:"vjs-live-display",innerHTML:'<span class="vjs-control-text">'+this.t("Stream Type")+"</span>"+this.t("LIVE"),"aria-live":"off"});a.appendChild(this.v);return a};t.hc=t.u.extend({i:function(a,c){t.u.call(this,a,c);this.c(a,"play",this.Tb);this.c(a,"pause",this.Sb)}});s=t.hc.prototype;s.la="Play";
|
||||
s.S=function(){return"vjs-play-control "+t.u.prototype.S.call(this)};s.s=function(){this.d.paused()?this.d.play():this.d.pause()};s.Tb=function(){this.r("vjs-paused");this.n("vjs-playing");this.b.children[0].children[0].innerHTML=this.t("Pause")};s.Sb=function(){this.r("vjs-playing");this.n("vjs-paused");this.b.children[0].children[0].innerHTML=this.t("Play")};t.nb=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.c(a,"timeupdate",this.ia)}});
|
||||
t.nb.prototype.e=function(){var a=t.a.prototype.e.call(this,"div",{className:"vjs-current-time vjs-time-controls vjs-control"});this.v=t.e("div",{className:"vjs-current-time-display",innerHTML:'<span class="vjs-control-text">Current Time </span>0:00',"aria-live":"off"});a.appendChild(this.v);return a};t.nb.prototype.ia=function(){var a=this.d.ib?this.d.F.currentTime:this.d.currentTime();this.v.innerHTML='<span class="vjs-control-text">'+this.t("Current Time")+"</span> "+t.Da(a,this.d.duration())};
|
||||
t.ob=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.c(a,"timeupdate",this.ia)}});t.ob.prototype.e=function(){var a=t.a.prototype.e.call(this,"div",{className:"vjs-duration vjs-time-controls vjs-control"});this.v=t.e("div",{className:"vjs-duration-display",innerHTML:'<span class="vjs-control-text">'+this.t("Duration Time")+"</span> 0:00","aria-live":"off"});a.appendChild(this.v);return a};
|
||||
t.ob.prototype.ia=function(){var a=this.d.duration();a&&(this.v.innerHTML='<span class="vjs-control-text">'+this.t("Duration Time")+"</span> "+t.Da(a))};t.nc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.nc.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-time-divider",innerHTML:"<div><span>/</span></div>"})};t.vb=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.c(a,"timeupdate",this.ia)}});
|
||||
t.vb.prototype.e=function(){var a=t.a.prototype.e.call(this,"div",{className:"vjs-remaining-time vjs-time-controls vjs-control"});this.v=t.e("div",{className:"vjs-remaining-time-display",innerHTML:'<span class="vjs-control-text">'+this.t("Remaining Time")+"</span> -0:00","aria-live":"off"});a.appendChild(this.v);return a};t.vb.prototype.ia=function(){this.d.duration()&&(this.v.innerHTML='<span class="vjs-control-text">'+this.t("Remaining Time")+"</span> -"+t.Da(this.d.remainingTime()))};
|
||||
t.Ra=t.u.extend({i:function(a,c){t.u.call(this,a,c)}});t.Ra.prototype.la="Fullscreen";t.Ra.prototype.S=function(){return"vjs-fullscreen-control "+t.u.prototype.S.call(this)};t.Ra.prototype.s=function(){this.d.isFullscreen()?(this.d.exitFullscreen(),this.Cb.innerHTML=this.t("Fullscreen")):(this.d.requestFullscreen(),this.Cb.innerHTML=this.t("Non-Fullscreen"))};t.ub=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});t.ub.prototype.m={children:{seekBar:{}}};
|
||||
t.ub.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-progress-control vjs-control"})};t.kc=t.R.extend({i:function(a,c){t.R.call(this,a,c);this.c(a,"timeupdate",this.ta);a.H(t.bind(this,this.ta))}});s=t.kc.prototype;s.m={children:{loadProgressBar:{},playProgressBar:{},seekHandle:{}},barName:"playProgressBar",handleName:"seekHandle"};s.Oc="timeupdate";s.e=function(){return t.R.prototype.e.call(this,"div",{className:"vjs-progress-holder","aria-label":"video progress bar"})};
|
||||
s.ta=function(){var a=this.d.ib?this.d.F.currentTime:this.d.currentTime();this.b.setAttribute("aria-valuenow",t.round(100*this.Lb(),2));this.b.setAttribute("aria-valuetext",t.Da(a,this.d.duration()))};s.Lb=function(){return this.d.currentTime()/this.d.duration()};s.gb=function(a){t.R.prototype.gb.call(this,a);this.d.ib=f;this.xe=!this.d.paused();this.d.pause()};s.fa=function(a){a=H(this,a)*this.d.duration();a==this.d.duration()&&(a-=0.1);this.d.currentTime(a)};
|
||||
s.ra=function(a){t.R.prototype.ra.call(this,a);this.d.ib=l;this.xe&&this.d.play()};s.Zc=function(){this.d.currentTime(this.d.currentTime()+5)};s.Yc=function(){this.d.currentTime(this.d.currentTime()-5)};t.rb=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.c(a,"progress",this.update)}});t.rb.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-load-progress",innerHTML:'<span class="vjs-control-text"><span>'+this.t("Loaded")+"</span>: 0%</span>"})};
|
||||
t.rb.prototype.update=function(){var a,c,d,e,g=this.d.buffered();a=this.d.duration();var h,j=this.d;h=j.buffered();j=j.duration();h=h.end(h.length-1);h>j&&(h=j);j=this.b.children;this.b.style.width=100*(h/a||0)+"%";for(a=0;a<g.length;a++)c=g.start(a),d=g.end(a),(e=j[a])||(e=this.b.appendChild(t.e())),e.style.left=100*(c/h||0)+"%",e.style.width=100*((d-c)/h||0)+"%";for(a=j.length;a>g.length;a--)this.b.removeChild(j[a-1])};t.gc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});
|
||||
t.gc.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-play-progress",innerHTML:'<span class="vjs-control-text"><span>'+this.t("Progress")+"</span>: 0%</span>"})};t.Sa=t.$.extend({i:function(a,c){t.$.call(this,a,c);this.c(a,"timeupdate",this.ia)}});t.Sa.prototype.defaultValue="00:00";t.Sa.prototype.e=function(){return t.$.prototype.e.call(this,"div",{className:"vjs-seek-handle","aria-live":"off"})};
|
||||
t.Sa.prototype.ia=function(){var a=this.d.ib?this.d.F.currentTime:this.d.currentTime();this.b.innerHTML='<span class="vjs-control-text">'+t.Da(a,this.d.duration())+"</span>"};t.yb=t.a.extend({i:function(a,c){t.a.call(this,a,c);a.o&&a.o.featuresVolumeControl===l&&this.n("vjs-hidden");this.c(a,"loadstart",function(){a.o.featuresVolumeControl===l?this.n("vjs-hidden"):this.r("vjs-hidden")})}});t.yb.prototype.m={children:{volumeBar:{}}};
|
||||
t.yb.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-volume-control vjs-control"})};t.xb=t.R.extend({i:function(a,c){t.R.call(this,a,c);this.c(a,"volumechange",this.ta);a.H(t.bind(this,this.ta))}});s=t.xb.prototype;s.ta=function(){this.b.setAttribute("aria-valuenow",t.round(100*this.d.volume(),2));this.b.setAttribute("aria-valuetext",t.round(100*this.d.volume(),2)+"%")};s.m={children:{volumeLevel:{},volumeHandle:{}},barName:"volumeLevel",handleName:"volumeHandle"};
|
||||
s.Oc="volumechange";s.e=function(){return t.R.prototype.e.call(this,"div",{className:"vjs-volume-bar","aria-label":"volume level"})};s.fa=function(a){this.d.muted()&&this.d.muted(l);this.d.volume(H(this,a))};s.Lb=function(){return this.d.muted()?0:this.d.volume()};s.Zc=function(){this.d.volume(this.d.volume()+0.1)};s.Yc=function(){this.d.volume(this.d.volume()-0.1)};t.oc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});
|
||||
t.oc.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-volume-level",innerHTML:'<span class="vjs-control-text"></span>'})};t.zb=t.$.extend();t.zb.prototype.defaultValue="00:00";t.zb.prototype.e=function(){return t.$.prototype.e.call(this,"div",{className:"vjs-volume-handle"})};
|
||||
t.ka=t.u.extend({i:function(a,c){t.u.call(this,a,c);this.c(a,"volumechange",this.update);a.o&&a.o.featuresVolumeControl===l&&this.n("vjs-hidden");this.c(a,"loadstart",function(){a.o.featuresVolumeControl===l?this.n("vjs-hidden"):this.r("vjs-hidden")})}});t.ka.prototype.e=function(){return t.u.prototype.e.call(this,"div",{className:"vjs-mute-control vjs-control",innerHTML:'<div><span class="vjs-control-text">'+this.t("Mute")+"</span></div>"})};
|
||||
t.ka.prototype.s=function(){this.d.muted(this.d.muted()?l:f)};t.ka.prototype.update=function(){var a=this.d.volume(),c=3;0===a||this.d.muted()?c=0:0.33>a?c=1:0.67>a&&(c=2);this.d.muted()?this.b.children[0].children[0].innerHTML!=this.t("Unmute")&&(this.b.children[0].children[0].innerHTML=this.t("Unmute")):this.b.children[0].children[0].innerHTML!=this.t("Mute")&&(this.b.children[0].children[0].innerHTML=this.t("Mute"));for(a=0;4>a;a++)t.r(this.b,"vjs-vol-"+a);t.n(this.b,"vjs-vol-"+c)};
|
||||
t.wa=t.L.extend({i:function(a,c){t.L.call(this,a,c);this.c(a,"volumechange",this.update);a.o&&a.o.featuresVolumeControl===l&&this.n("vjs-hidden");this.c(a,"loadstart",function(){a.o.featuresVolumeControl===l?this.n("vjs-hidden"):this.r("vjs-hidden")});this.n("vjs-menu-button")}});t.wa.prototype.Aa=function(){var a=new t.ja(this.d,{uc:"div"}),c=new t.xb(this.d,this.m.volumeBar);c.c("focus",function(){a.n("vjs-lock-showing")});c.c("blur",function(){E(a)});a.U(c);return a};
|
||||
t.wa.prototype.s=function(){t.ka.prototype.s.call(this);t.L.prototype.s.call(this)};t.wa.prototype.e=function(){return t.u.prototype.e.call(this,"div",{className:"vjs-volume-menu-button vjs-menu-button vjs-control",innerHTML:'<div><span class="vjs-control-text">'+this.t("Mute")+"</span></div>"})};t.wa.prototype.update=t.ka.prototype.update;t.ic=t.L.extend({i:function(a,c){t.L.call(this,a,c);this.cd();this.bd();this.c(a,"loadstart",this.cd);this.c(a,"ratechange",this.bd)}});s=t.ic.prototype;s.la="Playback Rate";
|
||||
s.className="vjs-playback-rate";s.e=function(){var a=t.L.prototype.e.call(this);this.Kc=t.e("div",{className:"vjs-playback-rate-value",innerHTML:1});a.appendChild(this.Kc);return a};s.Aa=function(){var a=new t.ja(this.j()),c=this.j().options().playbackRates;if(c)for(var d=c.length-1;0<=d;d--)a.U(new t.tb(this.j(),{rate:c[d]+"x"}));return a};s.ta=function(){this.w().setAttribute("aria-valuenow",this.j().playbackRate())};
|
||||
s.s=function(){for(var a=this.j().playbackRate(),c=this.j().options().playbackRates,d=c[0],e=0;e<c.length;e++)if(c[e]>a){d=c[e];break}this.j().playbackRate(d)};function ea(a){return a.j().o&&a.j().o.featuresPlaybackRate&&a.j().options().playbackRates&&0<a.j().options().playbackRates.length}s.cd=function(){ea(this)?this.r("vjs-hidden"):this.n("vjs-hidden")};s.bd=function(){ea(this)&&(this.Kc.innerHTML=this.j().playbackRate()+"x")};
|
||||
t.tb=t.J.extend({uc:"button",i:function(a,c){var d=this.label=c.rate,e=this.Rc=parseFloat(d,10);c.label=d;c.selected=1===e;t.J.call(this,a,c);this.c(a,"ratechange",this.update)}});t.tb.prototype.s=function(){t.J.prototype.s.call(this);this.j().playbackRate(this.Rc)};t.tb.prototype.update=function(){this.selected(this.j().playbackRate()==this.Rc)};t.jc=t.u.extend({i:function(a,c){t.u.call(this,a,c);this.update();a.c("posterchange",t.bind(this,this.update))}});s=t.jc.prototype;
|
||||
s.dispose=function(){this.j().k("posterchange",this.update);t.u.prototype.dispose.call(this)};s.e=function(){var a=t.e("div",{className:"vjs-poster",tabIndex:-1});t.fd||(this.Ib=t.e("img"),a.appendChild(this.Ib));return a};s.update=function(){var a=this.j().poster();this.ga(a);a?this.b.style.display="":this.Z()};s.ga=function(a){var c;this.Ib?this.Ib.src=a:(c="",a&&(c='url("'+a+'")'),this.b.style.backgroundImage=c)};s.s=function(){this.d.play()};t.fc=t.a.extend({i:function(a,c){t.a.call(this,a,c)}});
|
||||
t.fc.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-loading-spinner"})};t.lb=t.u.extend();t.lb.prototype.e=function(){return t.u.prototype.e.call(this,"div",{className:"vjs-big-play-button",innerHTML:'<span aria-hidden="true"></span>',"aria-label":"play video"})};t.lb.prototype.s=function(){this.d.play()};t.pb=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.update();this.c(a,"error",this.update)}});
|
||||
t.pb.prototype.e=function(){var a=t.a.prototype.e.call(this,"div",{className:"vjs-error-display"});this.v=t.e("div");a.appendChild(this.v);return a};t.pb.prototype.update=function(){this.j().error()&&(this.v.innerHTML=this.t(this.j().error().message))};
|
||||
t.p=t.a.extend({i:function(a,c,d){c=c||{};c.Tc=l;t.a.call(this,a,c,d);this.featuresProgressEvents||(this.Lc=f,this.Qc=this.setInterval(function(){var a=this.j().bufferedPercent();this.vd!=a&&this.j().l("progress");this.vd=a;1===a&&this.clearInterval(this.Qc)},500));this.featuresTimeupdateEvents||(a=this.d,this.Rb=f,this.c(a,"play",this.ad),this.c(a,"pause",this.kb),this.Q("timeupdate",function(){this.featuresTimeupdateEvents=f;fa(this)}));var e;e=this.j();a=function(){if(e.controls()&&!e.usingNativeControls()){var a;
|
||||
this.c("mousedown",this.s);this.c("touchstart",function(){a=this.d.userActive()});this.c("touchmove",function(){a&&this.j().reportUserActivity()});this.c("touchend",function(a){a.preventDefault()});G(this);this.c("tap",this.ce)}};this.H(a);this.c(e,"controlsenabled",a);this.c(e,"controlsdisabled",this.he);this.H(function(){this.networkState&&0<this.networkState()&&this.j().l("loadstart")})}});s=t.p.prototype;
|
||||
s.he=function(){this.k("tap");this.k("touchstart");this.k("touchmove");this.k("touchleave");this.k("touchcancel");this.k("touchend");this.k("click");this.k("mousedown")};s.s=function(a){0===a.button&&this.j().controls()&&(this.j().paused()?this.j().play():this.j().pause())};s.ce=function(){this.j().userActive(!this.j().userActive())};function fa(a){a.Rb=l;a.kb();a.k("play",a.ad);a.k("pause",a.kb)}s.ad=function(){this.wc&&this.kb();this.wc=this.setInterval(function(){this.j().l("timeupdate")},250)};
|
||||
s.kb=function(){this.clearInterval(this.wc);this.j().l("timeupdate")};s.dispose=function(){this.Lc&&(this.Lc=l,this.clearInterval(this.Qc));this.Rb&&fa(this);t.a.prototype.dispose.call(this)};s.Wb=function(){this.Rb&&this.j().l("timeupdate")};s.Vc=m();t.p.prototype.featuresVolumeControl=f;t.p.prototype.featuresFullscreenResize=l;t.p.prototype.featuresPlaybackRate=l;t.p.prototype.featuresProgressEvents=l;t.p.prototype.featuresTimeupdateEvents=l;
|
||||
t.p.$b=function(a){a.Ia=function(c,d){var e=a.Wc;e||(e=a.Wc=[]);d===b&&(d=e.length);e.splice(d,0,c)};a.jb=function(c){for(var d=a.Wc||[],e,g=0;g<d.length;g++)if(e=d[g].Wa(c))return d[g];return k};a.rc=function(c){var d=a.jb(c);return d?d.Wa(c):""};a.prototype.Ja=function(c){var d=a.jb(c);this.Ba();this.k("dispose",this.Ba);this.vc=c;this.Xb=d.Mb(c,this);this.c("dispose",this.Ba);return this};a.prototype.Ba=function(){this.Xb&&this.Xb.dispose&&this.Xb.dispose()}};
|
||||
t.g=t.p.extend({i:function(a,c,d){t.p.call(this,a,c,d);for(d=t.g.qb.length-1;0<=d;d--)this.c(t.g.qb[d],this.Fd);(c=c.source)&&(this.b.currentSrc!==c.src||a.I&&3===a.I.Md)&&this.Ja(c);if(t.wb&&a.options().nativeControlsForTouch===f){var e,g,h,j;e=this;g=this.j();c=g.controls();e.b.controls=!!c;h=function(){e.b.controls=f};j=function(){e.b.controls=l};g.c("controlsenabled",h);g.c("controlsdisabled",j);c=function(){g.k("controlsenabled",h);g.k("controlsdisabled",j)};e.c("dispose",c);g.c("usingcustomcontrols",
|
||||
c);g.usingNativeControls(f)}a.H(function(){this.I&&(this.m.autoplay&&this.paused())&&(delete this.I.poster,this.play())});this.Na()}});s=t.g.prototype;s.dispose=function(){t.g.Gb(this.b);t.p.prototype.dispose.call(this)};
|
||||
s.e=function(){var a=this.d,c=a.I,d;if(!c||this.movingMediaElementInDOM===l)c?(d=c.cloneNode(l),t.g.Gb(c),c=d,a.I=k):(c=t.e("video"),d=videojs.W.pa({},a.se),(!t.wb||a.options().nativeControlsForTouch!==f)&&delete d.controls,t.Uc(c,t.h.z(d,{id:a.id()+"_html5_api","class":"vjs-tech"}))),c.player=a,t.Nb(c,a.w());d=["autoplay","preload","loop","muted"];for(var e=d.length-1;0<=e;e--){var g=d[e],h={};"undefined"!==typeof a.m[g]&&(h[g]=a.m[g]);t.Uc(c,h)}return c};
|
||||
s.Fd=function(a){"error"==a.type&&this.error()?this.j().error(this.error().code):(a.bubbles=l,this.j().l(a))};s.play=function(){this.b.play()};s.pause=function(){this.b.pause()};s.paused=function(){return this.b.paused};s.currentTime=function(){return this.b.currentTime};s.Wb=function(a){try{this.b.currentTime=a}catch(c){t.log(c,"Video is not ready. (Video.js)")}};s.duration=function(){return this.b.duration||0};s.buffered=function(){return this.b.buffered};s.volume=function(){return this.b.volume};
|
||||
s.oe=function(a){this.b.volume=a};s.muted=function(){return this.b.muted};s.le=function(a){this.b.muted=a};s.width=function(){return this.b.offsetWidth};s.height=function(){return this.b.offsetHeight};s.Ka=function(){return"function"==typeof this.b.webkitEnterFullScreen&&(/Android/.test(t.N)||!/Chrome|Mac OS X 10.5/.test(t.N))?f:l};
|
||||
s.Ac=function(){var a=this.b;"webkitDisplayingFullscreen"in a&&this.Q("webkitbeginfullscreen",function(){this.d.isFullscreen(f);this.Q("webkitendfullscreen",function(){this.d.isFullscreen(l);this.d.l("fullscreenchange")});this.d.l("fullscreenchange")});a.paused&&a.networkState<=a.ze?(this.b.play(),this.setTimeout(function(){a.pause();a.webkitEnterFullScreen()},0)):a.webkitEnterFullScreen()};s.Gd=function(){this.b.webkitExitFullScreen()};s.src=function(a){if(a===b)return this.b.src;this.ga(a)};
|
||||
s.ga=function(a){this.b.src=a};s.load=function(){this.b.load()};s.currentSrc=function(){return this.b.currentSrc};s.poster=function(){return this.b.poster};s.Vc=function(a){this.b.poster=a};s.Ha=function(){return this.b.Ha};s.ne=function(a){this.b.Ha=a};s.autoplay=function(){return this.b.autoplay};s.ie=function(a){this.b.autoplay=a};s.controls=function(){return this.b.controls};s.loop=function(){return this.b.loop};s.ke=function(a){this.b.loop=a};s.error=function(){return this.b.error};
|
||||
s.seeking=function(){return this.b.seeking};s.ended=function(){return this.b.ended};s.playbackRate=function(){return this.b.playbackRate};s.me=function(a){this.b.playbackRate=a};s.networkState=function(){return this.b.networkState};t.g.isSupported=function(){try{t.A.volume=0.5}catch(a){return l}return!!t.A.canPlayType};t.p.$b(t.g);t.g.V={};
|
||||
t.g.V.Wa=function(a){function c(a){try{return t.A.canPlayType(a)}catch(c){return""}}return a.type?c(a.type):a.src?(a=(a=a.src.match(/\.([^.\/\?]+)(\?[^\/]+)?$/i))&&a[1],c("video/"+a)):""};t.g.V.Mb=function(a,c){c.ga(a.src)};t.g.V.dispose=m();t.g.Ia(t.g.V);t.g.xd=function(){var a=t.A.volume;t.A.volume=a/2+0.1;return a!==t.A.volume};t.g.wd=function(){var a=t.A.playbackRate;t.A.playbackRate=a/2+0.1;return a!==t.A.playbackRate};t.g.prototype.featuresVolumeControl=t.g.xd();
|
||||
t.g.prototype.featuresPlaybackRate=t.g.wd();t.g.prototype.movingMediaElementInDOM=!t.kd;t.g.prototype.featuresFullscreenResize=f;t.g.prototype.featuresProgressEvents=f;var V,ga=/^application\/(?:x-|vnd\.apple\.)mpegurl/i,ha=/^video\/mp4/i;
|
||||
t.g.Nc=function(){4<=t.ac&&(V||(V=t.A.constructor.prototype.canPlayType),t.A.constructor.prototype.canPlayType=function(a){return a&&ga.test(a)?"maybe":V.call(this,a)});t.od&&(V||(V=t.A.constructor.prototype.canPlayType),t.A.constructor.prototype.canPlayType=function(a){return a&&ha.test(a)?"maybe":V.call(this,a)})};t.g.we=function(){var a=t.A.constructor.prototype.canPlayType;t.A.constructor.prototype.canPlayType=V;V=k;return a};t.g.Nc();t.g.qb="loadstart suspend abort error emptied stalled loadedmetadata loadeddata canplay canplaythrough playing waiting seeking seeked ended durationchange timeupdate progress play pause ratechange volumechange".split(" ");
|
||||
t.g.Gb=function(a){if(a){a.player=k;for(a.parentNode&&a.parentNode.removeChild(a);a.hasChildNodes();)a.removeChild(a.firstChild);a.removeAttribute("src");if("function"===typeof a.load)try{a.load()}catch(c){}}};
|
||||
t.f=t.p.extend({i:function(a,c,d){t.p.call(this,a,c,d);var e=c.source;d=c.parentEl;var g=this.b=t.e("div",{id:a.id()+"_temp_flash"}),h=a.id()+"_flash_api",j=a.m,j=t.h.z({readyFunction:"videojs.Flash.onReady",eventProxyFunction:"videojs.Flash.onEvent",errorEventProxyFunction:"videojs.Flash.onError",autoplay:j.autoplay,preload:j.Ha,loop:j.loop,muted:j.muted},c.flashVars),p=t.h.z({wmode:"opaque",bgcolor:"#000000"},c.params),h=t.h.z({id:h,name:h,"class":"vjs-tech"},c.attributes);e&&this.H(function(){this.Ja(e)});
|
||||
t.Nb(g,d);c.startTime&&this.H(function(){this.load();this.play();this.currentTime(c.startTime)});t.jd&&this.H(function(){this.c("mousemove",function(){this.j().l({type:"mousemove",bubbles:l})})});a.c("stageclick",a.reportUserActivity);this.b=t.f.zc(c.swf,g,j,p,h)}});s=t.f.prototype;s.dispose=function(){t.p.prototype.dispose.call(this)};s.play=function(){this.b.vjs_play()};s.pause=function(){this.b.vjs_pause()};s.src=function(a){return a===b?this.currentSrc():this.ga(a)};
|
||||
s.ga=function(a){a=t.Jd(a);this.b.vjs_src(a);if(this.d.autoplay()){var c=this;this.setTimeout(function(){c.play()},0)}};t.f.prototype.setCurrentTime=function(a){this.Ud=a;this.b.vjs_setProperty("currentTime",a);t.p.prototype.Wb.call(this)};t.f.prototype.currentTime=function(){return this.seeking()?this.Ud||0:this.b.vjs_getProperty("currentTime")};t.f.prototype.currentSrc=function(){return this.vc?this.vc.src:this.b.vjs_getProperty("currentSrc")};t.f.prototype.load=function(){this.b.vjs_load()};
|
||||
t.f.prototype.poster=function(){this.b.vjs_getProperty("poster")};t.f.prototype.setPoster=m();t.f.prototype.buffered=function(){return t.Eb(0,this.b.vjs_getProperty("buffered"))};t.f.prototype.Ka=r(l);t.f.prototype.Ac=r(l);function ia(){var a=W[X],c=a.charAt(0).toUpperCase()+a.slice(1);ka["set"+c]=function(c){return this.b.vjs_setProperty(a,c)}}function la(a){ka[a]=function(){return this.b.vjs_getProperty(a)}}
|
||||
var ka=t.f.prototype,W="rtmpConnection rtmpStream preload defaultPlaybackRate playbackRate autoplay loop mediaGroup controller controls volume muted defaultMuted".split(" "),ma="error networkState readyState seeking initialTime duration startOffsetTime paused played seekable ended videoTracks audioTracks videoWidth videoHeight textTracks".split(" "),X;for(X=0;X<W.length;X++)la(W[X]),ia();for(X=0;X<ma.length;X++)la(ma[X]);t.f.isSupported=function(){return 10<=t.f.version()[0]};t.p.$b(t.f);t.f.V={};
|
||||
t.f.V.Wa=function(a){return!a.type?"":a.type.replace(/;.*/,"").toLowerCase()in t.f.Id?"maybe":""};t.f.V.Mb=function(a,c){c.ga(a.src)};t.f.V.dispose=m();t.f.Ia(t.f.V);t.f.Id={"video/flv":"FLV","video/x-flv":"FLV","video/mp4":"MP4","video/m4v":"MP4"};t.f.onReady=function(a){var c;if(c=(a=t.w(a))&&a.parentNode&&a.parentNode.player)a.player=c,t.f.checkReady(c.o)};t.f.checkReady=function(a){a.w()&&(a.w().vjs_getProperty?a.Na():this.setTimeout(function(){t.f.checkReady(a)},50))};
|
||||
t.f.onEvent=function(a,c){t.w(a).player.l(c)};t.f.onError=function(a,c){var d=t.w(a).player,e="FLASH: "+c;"srcnotfound"==c?d.error({code:4,message:e}):d.error(e)};
|
||||
t.f.version=function(){var a="0,0,0";try{a=(new window.ActiveXObject("ShockwaveFlash.ShockwaveFlash")).GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(c){try{navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin&&(a=(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1])}catch(d){}}return a.split(",")};
|
||||
t.f.zc=function(a,c,d,e,g){a=t.f.Ld(a,d,e,g);a=t.e("div",{innerHTML:a}).childNodes[0];d=c.parentNode;c.parentNode.replaceChild(a,c);var h=d.childNodes[0];setTimeout(function(){h.style.display="block"},1E3);return a};
|
||||
t.f.Ld=function(a,c,d,e){var g="",h="",j="";c&&t.h.Y(c,function(a,c){g+=a+"="+c+"&"});d=t.h.z({movie:a,flashvars:g,allowScriptAccess:"always",allowNetworking:"all"},d);t.h.Y(d,function(a,c){h+='<param name="'+a+'" value="'+c+'" />'});e=t.h.z({data:a,width:"100%",height:"100%"},e);t.h.Y(e,function(a,c){j+=a+'="'+c+'" '});return'<object type="application/x-shockwave-flash" '+j+">"+h+"</object>"};t.f.qe={"rtmp/mp4":"MP4","rtmp/flv":"FLV"};t.f.Je=function(a,c){return a+"&"+c};
|
||||
t.f.pe=function(a){var c={tc:"",$c:""};if(!a)return c;var d=a.indexOf("&"),e;-1!==d?e=d+1:(d=e=a.lastIndexOf("/")+1,0===d&&(d=e=a.length));c.tc=a.substring(0,d);c.$c=a.substring(e,a.length);return c};t.f.Rd=function(a){return a in t.f.qe};t.f.qd=/^rtmp[set]?:\/\//i;t.f.Qd=function(a){return t.f.qd.test(a)};t.f.Vb={};t.f.Vb.Wa=function(a){return t.f.Rd(a.type)||t.f.Qd(a.src)?"maybe":""};t.f.Vb.Mb=function(a,c){var d=t.f.pe(a.src);c.setRtmpConnection(d.tc);c.setRtmpStream(d.$c)};t.f.Ia(t.f.Vb);
|
||||
t.pd=t.a.extend({i:function(a,c,d){t.a.call(this,a,c,d);if(!a.m.sources||0===a.m.sources.length){c=0;for(d=a.m.techOrder;c<d.length;c++){var e=t.ba(d[c]),g=window.videojs[e];if(g&&g.isSupported()){Q(a,e);break}}}else a.src(a.m.sources)}});t.Player.prototype.textTracks=function(){return this.Ma=this.Ma||[]};
|
||||
function na(a,c,d,e,g){var h=a.Ma=a.Ma||[];g=g||{};g.kind=c;g.label=d;g.language=e;c=t.ba(c||"subtitles");var j=new window.videojs[c+"Track"](a,g);h.push(j);j.Fb()&&a.H(function(){this.setTimeout(function(){Y(j.j(),j.id())},0)})}function Y(a,c,d){for(var e=a.Ma,g=0,h=e.length,j,p;g<h;g++)j=e[g],j.id()===c?(j.show(),p=j):d&&(j.M()==d&&0<j.mode())&&j.disable();(c=p?p.M():d?d:l)&&a.l(c+"trackchange")}
|
||||
t.B=t.a.extend({i:function(a,c){t.a.call(this,a,c);this.K=c.id||"vjs_"+c.kind+"_"+c.language+"_"+t.q++;this.Xc=c.src;this.Cd=c["default"]||c.dflt;this.ue=c.title;this.bb=c.srclang;this.Sd=c.label;this.ca=[];this.Ab=[];this.qa=this.sa=0;a.c("dispose",t.bind(this,this.yc,this.K))}});s=t.B.prototype;s.M=n("G");s.src=n("Xc");s.Fb=n("Cd");s.title=n("ue");s.language=n("bb");s.label=n("Sd");s.yd=n("ca");s.rd=n("Ab");s.readyState=n("sa");s.mode=n("qa");
|
||||
s.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-"+this.G+" vjs-text-track"})};s.show=function(){oa(this);this.qa=2;t.a.prototype.show.call(this)};s.Z=function(){oa(this);this.qa=1;t.a.prototype.Z.call(this)};s.disable=function(){2==this.qa&&this.Z();this.yc();this.qa=0};function oa(a){0===a.sa&&a.load();0===a.qa&&(a.d.c("timeupdate",t.bind(a,a.update,a.K)),a.d.c("ended",t.bind(a,a.reset,a.K)),("captions"===a.G||"subtitles"===a.G)&&a.d.na("textTrackDisplay").U(a))}
|
||||
s.yc=function(){this.d.k("timeupdate",t.bind(this,this.update,this.K));this.d.k("ended",t.bind(this,this.reset,this.K));this.reset();this.d.na("textTrackDisplay").removeChild(this)};
|
||||
s.load=function(){0===this.sa&&(this.sa=1,t.ye(this.Xc,t.bind(this,function(a,c,d){if(a)this.error=a,this.sa=3,this.l("error");else{var e,g;a=d.split("\n");c="";d=1;for(var h=a.length;d<h;d++)if(c=t.trim(a[d])){-1==c.indexOf("--\x3e")?(e=c,c=t.trim(a[++d])):e=this.ca.length;e={id:e,index:this.ca.length};g=c.split(/[\t ]+/);e.startTime=pa(g[0]);e.Ca=pa(g[2]);for(g=[];a[++d]&&(c=t.trim(a[d]));)g.push(c);e.text=g.join("<br/>");this.ca.push(e)}this.sa=2;this.l("loaded")}})))};
|
||||
function pa(a){var c=a.split(":");a=0;var d,e,g;3==c.length?(d=c[0],e=c[1],c=c[2]):(d=0,e=c[0],c=c[1]);c=c.split(/\s+/);c=c.splice(0,1)[0];c=c.split(/\.|,/);g=parseFloat(c[1]);c=c[0];a+=3600*parseFloat(d);a+=60*parseFloat(e);a+=parseFloat(c);g&&(a+=g/1E3);return a}
|
||||
s.update=function(){if(0<this.ca.length){var a=this.d.options().trackTimeOffset||0,a=this.d.currentTime()+a;if(this.Ub===b||a<this.Ub||this.cb<=a){var c=this.ca,d=this.d.duration(),e=0,g=l,h=[],j,p,q,w;a>=this.cb||this.cb===b?w=this.Jb!==b?this.Jb:0:(g=f,w=this.Qb!==b?this.Qb:c.length-1);for(;;){q=c[w];if(q.Ca<=a)e=Math.max(e,q.Ca),q.Ua&&(q.Ua=l);else if(a<q.startTime){if(d=Math.min(d,q.startTime),q.Ua&&(q.Ua=l),!g)break}else g?(h.splice(0,0,q),p===b&&(p=w),j=w):(h.push(q),j===b&&(j=w),p=w),d=Math.min(d,
|
||||
q.Ca),e=Math.max(e,q.startTime),q.Ua=f;if(g)if(0===w)break;else w--;else if(w===c.length-1)break;else w++}this.Ab=h;this.cb=d;this.Ub=e;this.Jb=j;this.Qb=p;j=this.Ab;p="";a=0;for(c=j.length;a<c;a++)p+='<span class="vjs-tt-cue">'+j[a].text+"</span>";this.b.innerHTML=p;this.l("cuechange")}}};s.reset=function(){this.cb=0;this.Ub=this.d.duration();this.Qb=this.Jb=0};t.cc=t.B.extend();t.cc.prototype.G="captions";t.lc=t.B.extend();t.lc.prototype.G="subtitles";t.dc=t.B.extend();t.dc.prototype.G="chapters";
|
||||
t.mc=t.a.extend({i:function(a,c,d){t.a.call(this,a,c,d);if(a.m.tracks&&0<a.m.tracks.length){c=this.d;a=a.m.tracks;for(var e=0;e<a.length;e++)d=a[e],na(c,d.kind,d.label,d.language,d)}}});t.mc.prototype.e=function(){return t.a.prototype.e.call(this,"div",{className:"vjs-text-track-display"})};t.aa=t.J.extend({i:function(a,c){var d=this.ha=c.track;c.label=d.label();c.selected=d.Fb();t.J.call(this,a,c);this.c(a,d.M()+"trackchange",this.update)}});
|
||||
t.aa.prototype.s=function(){t.J.prototype.s.call(this);Y(this.d,this.ha.K,this.ha.M())};t.aa.prototype.update=function(){this.selected(2==this.ha.mode())};t.sb=t.aa.extend({i:function(a,c){c.track={M:function(){return c.kind},j:a,label:function(){return c.kind+" off"},Fb:r(l),mode:r(l)};t.aa.call(this,a,c);this.selected(f)}});t.sb.prototype.s=function(){t.aa.prototype.s.call(this);Y(this.d,this.ha.K,this.ha.M())};
|
||||
t.sb.prototype.update=function(){for(var a=this.d.textTracks(),c=0,d=a.length,e,g=f;c<d;c++)e=a[c],e.M()==this.ha.M()&&2==e.mode()&&(g=l);this.selected(g)};t.T=t.L.extend({i:function(a,c){t.L.call(this,a,c);1>=this.P.length&&this.Z()}});t.T.prototype.za=function(){var a=[],c;a.push(new t.sb(this.d,{kind:this.G}));for(var d=0;d<this.d.textTracks().length;d++)c=this.d.textTracks()[d],c.M()===this.G&&a.push(new t.aa(this.d,{track:c}));return a};
|
||||
t.Oa=t.T.extend({i:function(a,c,d){t.T.call(this,a,c,d);this.b.setAttribute("aria-label","Captions Menu")}});t.Oa.prototype.G="captions";t.Oa.prototype.la="Captions";t.Oa.prototype.className="vjs-captions-button";t.Ta=t.T.extend({i:function(a,c,d){t.T.call(this,a,c,d);this.b.setAttribute("aria-label","Subtitles Menu")}});t.Ta.prototype.G="subtitles";t.Ta.prototype.la="Subtitles";t.Ta.prototype.className="vjs-subtitles-button";
|
||||
t.Pa=t.T.extend({i:function(a,c,d){t.T.call(this,a,c,d);this.b.setAttribute("aria-label","Chapters Menu")}});s=t.Pa.prototype;s.G="chapters";s.la="Chapters";s.className="vjs-chapters-button";s.za=function(){for(var a=[],c,d=0;d<this.d.textTracks().length;d++)c=this.d.textTracks()[d],c.M()===this.G&&a.push(new t.aa(this.d,{track:c}));return a};
|
||||
s.Aa=function(){for(var a=this.d.textTracks(),c=0,d=a.length,e,g,h=this.P=[];c<d;c++)if(e=a[c],e.M()==this.G)if(0===e.readyState())e.load(),e.c("loaded",t.bind(this,this.Aa));else{g=e;break}a=this.Fa;a===b&&(a=new t.ja(this.d),a.ma().appendChild(t.e("li",{className:"vjs-menu-title",innerHTML:t.ba(this.G),re:-1})));if(g){e=g.ca;for(var j,c=0,d=e.length;c<d;c++)j=e[c],j=new t.mb(this.d,{track:g,cue:j}),h.push(j),a.U(j);this.U(a)}0<this.P.length&&this.show();return a};
|
||||
t.mb=t.J.extend({i:function(a,c){var d=this.ha=c.track,e=this.cue=c.cue,g=a.currentTime();c.label=e.text;c.selected=e.startTime<=g&&g<e.Ca;t.J.call(this,a,c);d.c("cuechange",t.bind(this,this.update))}});t.mb.prototype.s=function(){t.J.prototype.s.call(this);this.d.currentTime(this.cue.startTime);this.update(this.cue.startTime)};t.mb.prototype.update=function(){var a=this.cue,c=this.d.currentTime();this.selected(a.startTime<=c&&c<a.Ca)};
|
||||
t.h.z(t.Qa.prototype.m.children,{subtitlesButton:{},captionsButton:{},chaptersButton:{}});
|
||||
if("undefined"!==typeof window.JSON&&"function"===typeof window.JSON.parse)t.JSON=window.JSON;else{t.JSON={};var Z=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;t.JSON.parse=function(a,c){function d(a,e){var j,p,q=a[e];if(q&&"object"===typeof q)for(j in q)Object.prototype.hasOwnProperty.call(q,j)&&(p=d(q,j),p!==b?q[j]=p:delete q[j]);return c.call(a,e,q)}var e;a=String(a);Z.lastIndex=0;Z.test(a)&&(a=a.replace(Z,function(a){return"\\u"+("0000"+
|
||||
a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return e=eval("("+a+")"),"function"===typeof c?d({"":e},""):e;throw new SyntaxError("JSON.parse(): invalid or malformed JSON data");}}
|
||||
t.qc=function(){var a,c,d,e;a=document.getElementsByTagName("video");c=document.getElementsByTagName("audio");var g=[];if(a&&0<a.length){d=0;for(e=a.length;d<e;d++)g.push(a[d])}if(c&&0<c.length){d=0;for(e=c.length;d<e;d++)g.push(c[d])}if(g&&0<g.length){d=0;for(e=g.length;d<e;d++)if((c=g[d])&&c.getAttribute)c.player===b&&(a=c.getAttribute("data-setup"),a!==k&&videojs(c));else{t.Bb();break}}else t.dd||t.Bb()};t.Bb=function(){setTimeout(t.qc,1)};
|
||||
"complete"===document.readyState?t.dd=f:t.Q(window,"load",function(){t.dd=f});t.Bb();t.ge=function(a,c){t.Player.prototype[a]=c};var qa=this;function $(a,c){var d=a.split("."),e=qa;!(d[0]in e)&&e.execScript&&e.execScript("var "+d[0]);for(var g;d.length&&(g=d.shift());)!d.length&&c!==b?e[g]=c:e=e[g]?e[g]:e[g]={}};$("videojs",t);$("_V_",t);$("videojs.options",t.options);$("videojs.players",t.Ga);$("videojs.TOUCH_ENABLED",t.wb);$("videojs.cache",t.ya);$("videojs.Component",t.a);t.a.prototype.player=t.a.prototype.j;t.a.prototype.options=t.a.prototype.options;t.a.prototype.init=t.a.prototype.i;t.a.prototype.dispose=t.a.prototype.dispose;t.a.prototype.createEl=t.a.prototype.e;t.a.prototype.contentEl=t.a.prototype.ma;t.a.prototype.el=t.a.prototype.w;t.a.prototype.addChild=t.a.prototype.U;
|
||||
t.a.prototype.getChild=t.a.prototype.na;t.a.prototype.getChildById=t.a.prototype.Kd;t.a.prototype.children=t.a.prototype.children;t.a.prototype.initChildren=t.a.prototype.Gc;t.a.prototype.removeChild=t.a.prototype.removeChild;t.a.prototype.on=t.a.prototype.c;t.a.prototype.off=t.a.prototype.k;t.a.prototype.one=t.a.prototype.Q;t.a.prototype.trigger=t.a.prototype.l;t.a.prototype.triggerReady=t.a.prototype.Na;t.a.prototype.show=t.a.prototype.show;t.a.prototype.hide=t.a.prototype.Z;
|
||||
t.a.prototype.width=t.a.prototype.width;t.a.prototype.height=t.a.prototype.height;t.a.prototype.dimensions=t.a.prototype.Dd;t.a.prototype.ready=t.a.prototype.H;t.a.prototype.addClass=t.a.prototype.n;t.a.prototype.removeClass=t.a.prototype.r;t.a.prototype.buildCSSClass=t.a.prototype.S;t.a.prototype.localize=t.a.prototype.t;t.a.prototype.setInterval=t.a.prototype.setInterval;t.a.prototype.setTimeout=t.a.prototype.setTimeout;t.Player.prototype.ended=t.Player.prototype.ended;
|
||||
t.Player.prototype.enterFullWindow=t.Player.prototype.Bc;t.Player.prototype.exitFullWindow=t.Player.prototype.Hb;t.Player.prototype.preload=t.Player.prototype.Ha;t.Player.prototype.remainingTime=t.Player.prototype.remainingTime;t.Player.prototype.supportsFullScreen=t.Player.prototype.Ka;t.Player.prototype.currentType=t.Player.prototype.zd;t.Player.prototype.requestFullScreen=t.Player.prototype.requestFullScreen;t.Player.prototype.requestFullscreen=t.Player.prototype.requestFullscreen;
|
||||
t.Player.prototype.cancelFullScreen=t.Player.prototype.cancelFullScreen;t.Player.prototype.exitFullscreen=t.Player.prototype.exitFullscreen;t.Player.prototype.isFullScreen=t.Player.prototype.isFullScreen;t.Player.prototype.isFullscreen=t.Player.prototype.isFullscreen;$("videojs.MediaLoader",t.pd);$("videojs.TextTrackDisplay",t.mc);$("videojs.ControlBar",t.Qa);$("videojs.Button",t.u);$("videojs.PlayToggle",t.hc);$("videojs.FullscreenToggle",t.Ra);$("videojs.BigPlayButton",t.lb);
|
||||
$("videojs.LoadingSpinner",t.fc);$("videojs.CurrentTimeDisplay",t.nb);$("videojs.DurationDisplay",t.ob);$("videojs.TimeDivider",t.nc);$("videojs.RemainingTimeDisplay",t.vb);$("videojs.LiveDisplay",t.ec);$("videojs.ErrorDisplay",t.pb);$("videojs.Slider",t.R);$("videojs.ProgressControl",t.ub);$("videojs.SeekBar",t.kc);$("videojs.LoadProgressBar",t.rb);$("videojs.PlayProgressBar",t.gc);$("videojs.SeekHandle",t.Sa);$("videojs.VolumeControl",t.yb);$("videojs.VolumeBar",t.xb);$("videojs.VolumeLevel",t.oc);
|
||||
$("videojs.VolumeMenuButton",t.wa);$("videojs.VolumeHandle",t.zb);$("videojs.MuteToggle",t.ka);$("videojs.PosterImage",t.jc);$("videojs.Menu",t.ja);$("videojs.MenuItem",t.J);$("videojs.MenuButton",t.L);$("videojs.PlaybackRateMenuButton",t.ic);t.L.prototype.createItems=t.L.prototype.za;t.T.prototype.createItems=t.T.prototype.za;t.Pa.prototype.createItems=t.Pa.prototype.za;$("videojs.SubtitlesButton",t.Ta);$("videojs.CaptionsButton",t.Oa);$("videojs.ChaptersButton",t.Pa);
|
||||
$("videojs.MediaTechController",t.p);t.p.withSourceHandlers=t.p.$b;t.p.prototype.featuresVolumeControl=t.p.prototype.Ge;t.p.prototype.featuresFullscreenResize=t.p.prototype.Ce;t.p.prototype.featuresPlaybackRate=t.p.prototype.De;t.p.prototype.featuresProgressEvents=t.p.prototype.Ee;t.p.prototype.featuresTimeupdateEvents=t.p.prototype.Fe;t.p.prototype.setPoster=t.p.prototype.Vc;$("videojs.Html5",t.g);t.g.Events=t.g.qb;t.g.isSupported=t.g.isSupported;t.g.canPlaySource=t.g.rc;t.g.patchCanPlayType=t.g.Nc;
|
||||
t.g.unpatchCanPlayType=t.g.we;t.g.prototype.setCurrentTime=t.g.prototype.Wb;t.g.prototype.setVolume=t.g.prototype.oe;t.g.prototype.setMuted=t.g.prototype.le;t.g.prototype.setPreload=t.g.prototype.ne;t.g.prototype.setAutoplay=t.g.prototype.ie;t.g.prototype.setLoop=t.g.prototype.ke;t.g.prototype.enterFullScreen=t.g.prototype.Ac;t.g.prototype.exitFullScreen=t.g.prototype.Gd;t.g.prototype.playbackRate=t.g.prototype.playbackRate;t.g.prototype.setPlaybackRate=t.g.prototype.me;
|
||||
t.g.registerSourceHandler=t.g.Ia;t.g.selectSourceHandler=t.g.jb;t.g.prototype.setSource=t.g.prototype.Ja;t.g.prototype.disposeSourceHandler=t.g.prototype.Ba;$("videojs.Flash",t.f);t.f.isSupported=t.f.isSupported;t.f.canPlaySource=t.f.rc;t.f.onReady=t.f.onReady;t.f.embed=t.f.zc;t.f.version=t.f.version;t.f.prototype.setSource=t.f.prototype.Ja;t.f.registerSourceHandler=t.f.Ia;t.f.selectSourceHandler=t.f.jb;t.f.prototype.setSource=t.f.prototype.Ja;t.f.prototype.disposeSourceHandler=t.f.prototype.Ba;
|
||||
$("videojs.TextTrack",t.B);t.B.prototype.label=t.B.prototype.label;t.B.prototype.kind=t.B.prototype.M;t.B.prototype.mode=t.B.prototype.mode;t.B.prototype.cues=t.B.prototype.yd;t.B.prototype.activeCues=t.B.prototype.rd;$("videojs.CaptionsTrack",t.cc);$("videojs.SubtitlesTrack",t.lc);$("videojs.ChaptersTrack",t.dc);$("videojs.autoSetup",t.qc);$("videojs.plugin",t.ge);$("videojs.createTimeRange",t.Eb);$("videojs.util",t.W);t.W.mergeOptions=t.W.pa;t.addLanguage=t.sd;})();
|
||||
@@ -0,0 +1,5 @@
|
||||
/*
|
||||
* HTML5 shiv to ensure these elements work in older versions of IE
|
||||
* https://github.com/videojs/video.js/blob/stable/docs/guides/setup.md
|
||||
*/
|
||||
videojs.options.flash.swf = ipsSettings.baseURL + "applications/gallery/interface/videojs/video-js.swf";
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Categories
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\admin\gallery;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Categories
|
||||
*/
|
||||
class _categories extends \IPS\Node\Controller
|
||||
{
|
||||
/**
|
||||
* Node Class
|
||||
*/
|
||||
protected $nodeClass = 'IPS\gallery\Category';
|
||||
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'categories_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
|
||||
protected function form()
|
||||
{
|
||||
parent::form();
|
||||
|
||||
if ( \IPS\Request::i()->id )
|
||||
{
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('edit_category') . ': ' . \IPS\Output::i()->title;
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('add_category');
|
||||
}
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,128 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Settings
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\admin\gallery;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* settings
|
||||
*/
|
||||
class _settings extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'settings_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Manage settings
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'settings_manage' );
|
||||
|
||||
$form = new \IPS\Helpers\Form;
|
||||
|
||||
$form->addHeader( 'gallery_images' );
|
||||
$form->addMessage( \IPS\Member::loggedIn()->language()->addToStack('gallery_dims_explanation'), '', FALSE );
|
||||
$large = ( isset( \IPS\Settings::i()->gallery_large_dims ) ) ? explode( 'x', \IPS\Settings::i()->gallery_large_dims ) : array( 1600, 1200 );
|
||||
$medium = ( isset( \IPS\Settings::i()->gallery_medium_dims ) ) ? explode( 'x', \IPS\Settings::i()->gallery_medium_dims ) : array( 640, 480 );
|
||||
$small = ( isset( \IPS\Settings::i()->gallery_small_dims ) ) ? explode( 'x', \IPS\Settings::i()->gallery_small_dims ) : array( 240, 240 );
|
||||
$thumb = ( isset( \IPS\Settings::i()->gallery_thumb_dims ) ) ? explode( 'x', \IPS\Settings::i()->gallery_thumb_dims ) : array( 100, 100 );
|
||||
$form->add( new \IPS\Helpers\Form\WidthHeight( 'gallery_large_dims', $large, TRUE, array( 'resizableDiv' => FALSE ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\WidthHeight( 'gallery_medium_dims', $medium, TRUE, array( 'resizableDiv' => FALSE ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\WidthHeight( 'gallery_small_dims', $small, TRUE, array( 'resizableDiv' => FALSE ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\WidthHeight( 'gallery_thumb_dims', $thumb, TRUE, array( 'resizableDiv' => FALSE ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'gallery_use_square_thumbnails', \IPS\Settings::i()->gallery_use_square_thumbnails ) );
|
||||
$form->add( new \IPS\Helpers\Form\Upload( 'gallery_watermark_path', \IPS\Settings::i()->gallery_watermark_path ? \IPS\File::get( 'core_Theme', \IPS\Settings::i()->gallery_watermark_path ) : NULL, FALSE, array( 'image' => TRUE, 'storageExtension' => 'core_Theme' ) ) );
|
||||
|
||||
$form->addHeader( 'gallery_bandwidth' );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'gallery_detailed_bandwidth', \IPS\Settings::i()->gallery_detailed_bandwidth ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'gallery_bandwidth_period', \IPS\Settings::i()->gallery_bandwidth_period, FALSE, array( 'unlimited' => -1 ) ) );
|
||||
|
||||
$form->addHeader( 'gallery_options' );
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'gallery_rss_enabled', \IPS\Settings::i()->gallery_rss_enabled ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$form->saveAsSettings( array(
|
||||
'gallery_large_dims' => implode( 'x', $values['gallery_large_dims'] ),
|
||||
'gallery_medium_dims' => implode( 'x', $values['gallery_medium_dims'] ),
|
||||
'gallery_small_dims' => implode( 'x', $values['gallery_small_dims'] ),
|
||||
'gallery_thumb_dims' => implode( 'x', $values['gallery_thumb_dims'] ),
|
||||
'gallery_use_square_thumbnails' => $values['gallery_use_square_thumbnails'],
|
||||
'gallery_watermark_path' => $values['gallery_watermark_path'],
|
||||
'gallery_detailed_bandwidth' => $values['gallery_detailed_bandwidth'],
|
||||
'gallery_bandwidth_period' => $values['gallery_bandwidth_period'],
|
||||
'gallery_rss_enabled' => $values['gallery_rss_enabled'],
|
||||
) );
|
||||
\IPS\Session::i()->log( 'acplogs__gallery_settings' );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('settings');
|
||||
\IPS\Output::i()->output = $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rebuild gallery images
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function rebuildImages()
|
||||
{
|
||||
$perGo = 5;
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('gallery_rebuildimages');
|
||||
\IPS\Output::i()->output = new \IPS\Helpers\MultipleRedirect( \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=settings&do=rebuildImages' ), function( $doneSoFar ) use( $perGo )
|
||||
{
|
||||
$select = \IPS\Db::i()->select( '*', 'gallery_images', array( 'image_media=?', 0 ), 'image_id', array( $doneSoFar, $perGo ), NULL, NULL, \IPS\Db::SELECT_SQL_CALC_FOUND_ROWS );
|
||||
$total = $select->count( TRUE );
|
||||
|
||||
if ( !$select->count() )
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
foreach ( $select as $row )
|
||||
{
|
||||
try
|
||||
{
|
||||
$image = \IPS\gallery\Image::constructFromData( $row );
|
||||
$image->buildThumbnails();
|
||||
$image->save();
|
||||
}
|
||||
catch ( \Exception $e ) {}
|
||||
}
|
||||
|
||||
$doneSoFar += $perGo;
|
||||
return array( $doneSoFar, \IPS\Member::loggedIn()->language()->addToStack('rebuilding'), ( 100 * $doneSoFar ) / $total );
|
||||
|
||||
}, function()
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=settings' ), 'completed' );
|
||||
} );
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Gallery bandwidth statistics
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\admin\stats;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gallery bandwidth statistics
|
||||
*/
|
||||
class _bandwidth extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'bandwidth_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gallery bandwidth statistics
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
$chart = new \IPS\Helpers\Chart\Dynamic( \IPS\Http\Url::internal( "app=gallery&module=stats&controller=bandwidth" ), 'gallery_bandwidth', 'bdate', '', array( 'vAxis' => array( 'title' => '(kB)' ) ), 'LineChart', 'daily', array( 'start' => 0, 'end' => 0 ), array( 'member_id', 'image_id', 'bdate', 'bsize' ) );
|
||||
|
||||
$chart->addSeries( \IPS\Member::loggedIn()->language()->addToStack('bandwidth'), 'number', 'ROUND((SUM(bsize)/1024),2)', FALSE );
|
||||
|
||||
$chart->tableParsers = array(
|
||||
'member_id' => function( $val )
|
||||
{
|
||||
try
|
||||
{
|
||||
$member = \IPS\Member::load( $val );
|
||||
return "<a href='" . \IPS\Http\Url::internal( "app=gallery&module=stats&controller=member&do=images&id={$member->member_id}" ) . "'>{$member->name}</a>";
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->addToStack('deleted_member');
|
||||
}
|
||||
},
|
||||
'image_id' => function( $val )
|
||||
{
|
||||
try
|
||||
{
|
||||
$image = \IPS\gallery\Image::load( $val );
|
||||
return "<a href='{$image->url()}' target='_blank'>{$image->caption}</a>";
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->addToStack('deleted_image');
|
||||
}
|
||||
},
|
||||
'bdate' => function( $val )
|
||||
{
|
||||
return (string) \IPS\DateTime::ts( $val );
|
||||
},
|
||||
'bsize' => function( $val )
|
||||
{
|
||||
return \IPS\Output\Plugin\Filesize::humanReadableFilesize( $val );
|
||||
}
|
||||
);
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('bandwidth_stats');
|
||||
\IPS\Output::i()->output = (string) $chart;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Top uploaders
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\admin\stats;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Top uploaders
|
||||
*/
|
||||
class _diskspace extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
const PER_PAGE = 25;
|
||||
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
\IPS\Dispatcher::i()->checkAcpPermission( 'diskspace_manage' );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show top uploaders
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
$values = NULL;
|
||||
$where = array();
|
||||
|
||||
if ( isset( \IPS\Request::i()->form ) )
|
||||
{
|
||||
$form = new \IPS\Helpers\Form( 'form', 'go' );
|
||||
$form->add( new \IPS\Helpers\Form\DateRange( 'stats_date_range' ) );
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
if ( $values['stats_date_range']['start'] )
|
||||
{
|
||||
$where[] = array( 'image_date>?', $values['stats_date_range']['start']->getTimestamp() );
|
||||
}
|
||||
if ( $values['stats_date_range']['end'] )
|
||||
{
|
||||
$where[] = array( 'image_date<?', $values['stats_date_range']['end']->getTimestamp() );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->output = $form;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$page = isset( \IPS\Request::i()->page ) ? intval( \IPS\Request::i()->page ) : 1;
|
||||
|
||||
if( $page < 1 )
|
||||
{
|
||||
$page = 1;
|
||||
}
|
||||
|
||||
$select = \IPS\Db::i()->select( 'image_member_id, COUNT(*) as images, core_members.*', 'gallery_images', $where, 'images DESC', array( ( $page - 1 ) * static::PER_PAGE, static::PER_PAGE ), 'image_member_id', NULL, \IPS\Db::SELECT_SQL_CALC_FOUND_ROWS )->join( 'core_members', 'core_members.member_id=gallery_images.image_member_id' );
|
||||
|
||||
$pagination = \IPS\Theme::i()->getTemplate( 'global', 'core', 'global' )->pagination(
|
||||
\IPS\Http\Url::internal( 'app=gallery&module=stats&controller=diskspace' )->setQueryString( $values ),
|
||||
ceil( $select->count( TRUE ) / static::PER_PAGE ),
|
||||
$page,
|
||||
static::PER_PAGE,
|
||||
FALSE
|
||||
);
|
||||
|
||||
\IPS\Output::i()->sidebar['actions'] = array(
|
||||
'settings' => array(
|
||||
'title' => 'stats_date_range',
|
||||
'icon' => 'calendar',
|
||||
'link' => \IPS\Http\Url::internal( 'app=gallery&module=stats&controller=diskspace&form=1' )->setQueryString( $values ),
|
||||
'data' => array( 'ipsDialog' => '', 'ipsDialog-title' => \IPS\Member::loggedIn()->language()->addToStack('stats_date_range') )
|
||||
)
|
||||
);
|
||||
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate('stats')->uploadersTable( $select, $pagination );
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('menu__gallery_stats_diskspace');
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
@@ -0,0 +1,109 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Member Stats
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 26 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\admin\stats;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Member Stats
|
||||
*/
|
||||
class _member extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Images
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function images()
|
||||
{
|
||||
/* Get member */
|
||||
try
|
||||
{
|
||||
$member = \IPS\Member::load( \IPS\Request::i()->id );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G192/1', 404, '' );
|
||||
}
|
||||
|
||||
/* Build chart */
|
||||
$tabs = array( 'information' => 'information', 'bandwidth_use' => 'bandwidth_use' );
|
||||
$activeTab = \IPS\Request::i()->tab ?: 'information';
|
||||
switch ( $activeTab )
|
||||
{
|
||||
case 'information':
|
||||
$imageCount = \IPS\Db::i()->select( 'COUNT(*)', 'gallery_images', array( 'image_member_id=?', $member->member_id ) )->first();
|
||||
$diskspaceUsed = \IPS\Db::i()->select( 'SUM(image_file_size)', 'gallery_images', array( 'image_member_id=?', $member->member_id ) )->first();
|
||||
$numberOfViews = \IPS\Db::i()->select( 'COUNT(*)', 'gallery_bandwidth', array( 'member_id=?', $member->member_id ) )->first();
|
||||
$bandwidthUsed = \IPS\Db::i()->select( 'SUM(bsize)', 'gallery_bandwidth', array( 'member_id=?', $member->member_id ) )->first();
|
||||
|
||||
$allImages = \IPS\Db::i()->select( 'COUNT(*)', 'gallery_images' )->first();
|
||||
$totalFilesize = \IPS\Db::i()->select( 'SUM(image_file_size)', 'gallery_images' )->first();
|
||||
$allBandwidth = \IPS\Db::i()->select( 'COUNT(*)', 'gallery_bandwidth' )->first();
|
||||
$totalBandwidth = \IPS\Db::i()->select( 'SUM(bsize)', 'gallery_bandwidth' )->first();
|
||||
|
||||
$activeTabContents = \IPS\Theme::i()->getTemplate( 'stats' )->information( \IPS\Theme::i()->getTemplate( 'global', 'core' )->definitionTable( array(
|
||||
'images_submitted' =>
|
||||
\IPS\Member::loggedIn()->language()->addToStack( 'images_stat_of_total', FALSE, array( 'sprintf' => array(
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( $imageCount ),
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( ( ( $allImages ? ( 100 / $allImages ) : 0 ) * $imageCount ), 2 ) ) )
|
||||
),
|
||||
'gdiskspace_used' =>
|
||||
\IPS\Member::loggedIn()->language()->addToStack( 'images_stat_of_total', FALSE, array( 'sprintf' => array(
|
||||
\IPS\Output\Plugin\Filesize::humanReadableFilesize( $diskspaceUsed ),
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( ( ( $totalFilesize ? ( 100 / $totalFilesize ) : 0 ) * $diskspaceUsed ), 2 ) ) )
|
||||
),
|
||||
'gaverage_filesize' =>
|
||||
\IPS\Member::loggedIn()->language()->addToStack( 'images_stat_average' , FALSE, array( 'sprintf' => array(
|
||||
\IPS\Output\Plugin\Filesize::humanReadableFilesize( \IPS\Db::i()->select( 'AVG(image_file_size)', 'gallery_images', array( 'image_member_id=?', $member->member_id ) )->first() ),
|
||||
\IPS\Output\Plugin\Filesize::humanReadableFilesize( \IPS\Db::i()->select( 'AVG(image_file_size)', 'gallery_images' )->first() ) ) )
|
||||
),
|
||||
'number_of_views' =>
|
||||
\IPS\Member::loggedIn()->language()->addToStack( 'images_stat_of_total', FALSE, array( 'sprintf' => array(
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( $numberOfViews ),
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( ( ( $allBandwidth ? ( 100 / $allBandwidth ) : 0 ) * $imageCount ), 2 ) ))
|
||||
),
|
||||
'gallery_bandwidth_used' =>
|
||||
\IPS\Member::loggedIn()->language()->addToStack( 'images_stat_of_total', FALSE, array( 'sprintf' => array(
|
||||
\IPS\Output\Plugin\Filesize::humanReadableFilesize( $bandwidthUsed ),
|
||||
\IPS\Member::loggedIn()->language()->formatNumber( ( ( $totalBandwidth ? ( 100 / $totalBandwidth ) : 0 ) * $bandwidthUsed ), 2 ) ) )
|
||||
)
|
||||
) ) );
|
||||
break;
|
||||
|
||||
case 'bandwidth_use':
|
||||
$bandwidthChart = new \IPS\Helpers\Chart\Dynamic( \IPS\Http\Url::internal( "app=gallery&module=stats&controller=member&do=images&id={$member->member_id}&tab=bandwidth_use&_graph=1" ), 'gallery_bandwidth', 'bdate', '', array( 'vAxis' => array( 'title' => '(kB)' ) ), 'LineChart', 'daily' );
|
||||
$bandwidthChart->where[] = array( 'member_id=?', $member->member_id );
|
||||
$bandwidthChart->addSeries( \IPS\Member::loggedIn()->language()->addToStack('bandwidth_use'), 'number', 'ROUND((SUM(bsize)/1024),2)', FALSE );
|
||||
$activeTabContents = ( \IPS\Request::i()->isAjax() and isset( \IPS\Request::i()->_graph ) ) ? (string) $bandwidthChart : \IPS\Theme::i()->getTemplate( 'stats' )->graphs( (string) $bandwidthChart );
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('member_images_chart', FALSE, array( 'sprintf' => array( $member->name ) ) );
|
||||
if( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
\IPS\Output::i()->output = $activeTabContents;
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'global', 'core' )->tabs( $tabs, $activeTab, $activeTabContents, \IPS\Http\Url::internal( "app=gallery&module=stats&controller=member&do=images&id={$member->member_id}" ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,569 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Browse the gallery
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Gallery
|
||||
* @since 04 Mar 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\gallery\modules\front\gallery;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Browse the gallery
|
||||
*/
|
||||
class _browse extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* [Content\Controller] Class
|
||||
*/
|
||||
protected static $contentModel = 'IPS\gallery\Category';
|
||||
|
||||
/**
|
||||
* Execute
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function execute()
|
||||
{
|
||||
if( isset( \IPS\Request::i()->album ) )
|
||||
{
|
||||
static::$contentModel = 'IPS\gallery\Album';
|
||||
}
|
||||
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js('front_browse.js', 'gallery' ) );
|
||||
parent::execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine what to show
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
/* Legacy 3.x redirect */
|
||||
if ( isset( \IPS\Request::i()->image ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\Output::i()->redirect( \IPS\gallery\Image::loadAndCheckPerms( \IPS\Request::i()->image )->url(), '', 301 );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/A', 404, '' );
|
||||
}
|
||||
}
|
||||
|
||||
/* Add RSS feed */
|
||||
if ( \IPS\Settings::i()->gallery_rss_enabled )
|
||||
{
|
||||
\IPS\Output::i()->rssFeeds['gallery_rss_title'] = \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse&do=rss', 'front', 'gallery_rss' );
|
||||
}
|
||||
|
||||
/* And load data and display */
|
||||
if ( isset( \IPS\Request::i()->category ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$category = \IPS\gallery\Category::loadAndCheckPerms( \IPS\Request::i()->category, 'view' );
|
||||
|
||||
\IPS\Output::i()->rssFeeds[ \IPS\Member::loggedIn()->language()->addToStack( 'gallery_rss_title_container', FALSE, array( 'sprintf' => array( $category->_title ) ) ) ] = \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse&do=rss&category=' . $category->id, 'front', 'gallery_rss' );
|
||||
|
||||
$this->_category( $category );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/1', 404, '' );
|
||||
}
|
||||
}
|
||||
else if ( isset( \IPS\Request::i()->album ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$album = \IPS\gallery\Album::loadAndCheckPerms( \IPS\Request::i()->album, 'view' );
|
||||
|
||||
\IPS\Output::i()->rssFeeds[ \IPS\Member::loggedIn()->language()->addToStack( 'gallery_rss_title_container', FALSE, array( 'sprintf' => array( $album->_title ) ) ) ] = \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse&do=rss&album=' . $album->id, 'front', 'gallery_rss' );
|
||||
|
||||
$this->_album( $album );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/2', 404, '' );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->_index();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Index
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function _index()
|
||||
{
|
||||
/* Get stuff */
|
||||
$featured = iterator_to_array( \IPS\gallery\Image::featured( 20, '_rand' ) );
|
||||
$new = iterator_to_array( \IPS\gallery\Image::getItemsWithPermission( array(), NULL, 30 ) );
|
||||
|
||||
/* Online User Location */
|
||||
\IPS\Session::i()->setLocation( \IPS\Http\Url::internal( 'app=gallery', 'front', 'gallery' ), array(), 'loc_gallery_browsing' );
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('gallery_title');
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'browse' )->index( $featured, $new );
|
||||
}
|
||||
|
||||
/**
|
||||
* Show a category listing
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function categories()
|
||||
{
|
||||
/* Online User Location */
|
||||
\IPS\Session::i()->setLocation( \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse&do=categories', 'front', 'gallery_categories' ), array(), 'loc_gallery_browsing_categories' );
|
||||
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack('__app_gallery');
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'browse' )->categories();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Category
|
||||
*
|
||||
* @param \IPS\gallery\Category $category The category to show
|
||||
* @return void
|
||||
*/
|
||||
protected function _category( $category )
|
||||
{
|
||||
/* Online User Location */
|
||||
$permissions = $category->permissions();
|
||||
\IPS\Session::i()->setLocation( $category->url(), explode( ",", $permissions['perm_view'] ), 'loc_gallery_viewing_category', array( "gallery_category_{$category->id}" => TRUE ) );
|
||||
|
||||
/* Output */
|
||||
\IPS\Output::i()->title = $category->_title;
|
||||
|
||||
/* Need to show albums too */
|
||||
$albums = NULL;
|
||||
|
||||
if( $category->allow_albums )
|
||||
{
|
||||
$albums = new \IPS\gallery\Album\Table( NULL, $category );
|
||||
$albums->title = 'albums';
|
||||
$albums->classes = array( 'ipsDataList_large' );
|
||||
$albums = ( $category->hasAlbums() ) ? (string) $albums : NULL;
|
||||
}
|
||||
|
||||
if( !count( \IPS\gallery\Image::getItemsWithPermission( array( array( 'image_category_id=? AND image_album_id=?', $category->_id, 0 ) ) ) ) )
|
||||
{
|
||||
$table = ( $category->childrenCount() or $albums ) ? '' : \IPS\Theme::i()->getTemplate( 'browse' )->noImages( $category );
|
||||
|
||||
\IPS\Output::i()->breadcrumb = array();
|
||||
\IPS\Output::i()->breadcrumb['module'] = array( \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse', 'front', 'gallery' ), \IPS\Dispatcher::i()->module->_title );
|
||||
$parents = iterator_to_array( $category->parents() );
|
||||
if ( count( $parents ) )
|
||||
{
|
||||
foreach( $parents AS $parent )
|
||||
{
|
||||
\IPS\Output::i()->breadcrumb[] = array( $parent->url(), $parent->_title );
|
||||
}
|
||||
}
|
||||
\IPS\Output::i()->breadcrumb[] = array( NULL, $category->_title );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Build table */
|
||||
$table = new \IPS\gallery\Image\Table( 'IPS\gallery\Image', $category->url(), array( array( 'image_album_id=?', 0 ) ), $category );
|
||||
$table->limit = 50;
|
||||
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'browse' ), 'imageTable' );
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse' ), $this->getTableRowsTemplate() );
|
||||
$table->title = \IPS\Member::loggedIn()->language()->pluralize( \IPS\Member::loggedIn()->language()->get('num_images'), array( $category->count_imgs ) );
|
||||
|
||||
if( !$category->allow_comments )
|
||||
{
|
||||
unset( $table->sortOptions['num_comments'] );
|
||||
unset( $table->sortOptions['last_comments'] );
|
||||
}
|
||||
|
||||
if( !$category->allow_rating )
|
||||
{
|
||||
unset( $table->sortOptions['rating'] );
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Output::i()->contextualSearchOptions[ \IPS\Member::loggedIn()->language()->addToStack( 'search_contextual_item', FALSE, array( 'sprintf' => array( \IPS\Member::loggedIn()->language()->addToStack( 'category' ) ) ) ) ] = array( 'type' => 'gallery_image', 'nodes' => $category->_id );
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'browse' )->category( $category, $albums, (string) $table );
|
||||
}
|
||||
|
||||
/**
|
||||
* Show Album
|
||||
*
|
||||
* @param \IPS\gallery\Album $album The album to show
|
||||
* @return void
|
||||
*/
|
||||
protected function _album( $album )
|
||||
{
|
||||
if( !count( \IPS\gallery\Image::getItemsWithPermission( array( array( 'image_album_id=?', $album->id ) ) ) ) )
|
||||
{
|
||||
/* Show a 'no images' template if there's nothing to display */
|
||||
$table = \IPS\Theme::i()->getTemplate( 'browse' )->noImages( $album );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Build table */
|
||||
$table = new \IPS\gallery\Image\Table( 'IPS\gallery\Image', $album->url(), array( array( 'image_album_id=?', $album->id ) ), $album->category() );
|
||||
$table->limit = 50;
|
||||
$table->sortBy = \IPS\Request::i()->sortby ? $table->sortBy : $album->_sortBy;
|
||||
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'browse' ), 'imageTable' );
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse' ), $this->getTableRowsTemplate() );
|
||||
$table->title = \IPS\Member::loggedIn()->language()->pluralize( \IPS\Member::loggedIn()->language()->get('num_images'), array( $album->count_imgs ) );
|
||||
|
||||
if( !$album->allow_comments )
|
||||
{
|
||||
unset( $table->sortOptions['num_comments'] );
|
||||
unset( $table->sortOptions['last_comments'] );
|
||||
}
|
||||
|
||||
if( !$album->allow_rating )
|
||||
{
|
||||
unset( $table->sortOptions['rating'] );
|
||||
}
|
||||
}
|
||||
|
||||
/* Online User Location */
|
||||
$permissions = $album->category()->permissions();
|
||||
\IPS\Session::i()->setLocation( $album->url(), explode( ",", $permissions['perm_view'] ), 'loc_gallery_viewing_album', array( $album->_title => FALSE ) );
|
||||
|
||||
/* Output */
|
||||
\IPS\Output::i()->title = $album->_title;
|
||||
\IPS\Output::i()->breadcrumb = array();
|
||||
|
||||
\IPS\Output::i()->breadcrumb['module'] = array( \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse', 'front', 'gallery' ), \IPS\Dispatcher::i()->module->_title );
|
||||
$parents = iterator_to_array( $album->category()->parents() );
|
||||
if ( count( $parents ) )
|
||||
{
|
||||
foreach( $parents AS $parent )
|
||||
{
|
||||
\IPS\Output::i()->breadcrumb[] = array( $parent->url(), $parent->_title );
|
||||
}
|
||||
}
|
||||
|
||||
\IPS\Output::i()->breadcrumb[] = array( $album->category()->url(), $album->category()->_title );
|
||||
\IPS\Output::i()->breadcrumb[] = array( NULL, $album->_title );
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'browse' )->album( $album, (string) $table );
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine which table rows template to use
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function getTableRowsTemplate()
|
||||
{
|
||||
if( isset( \IPS\Request::i()->cookie['thumbnailSize'] ) AND \IPS\Request::i()->cookie['thumbnailSize'] == 'large' AND \IPS\Request::i()->controller != 'search' )
|
||||
{
|
||||
return 'tableRowsLarge';
|
||||
}
|
||||
else if( isset( \IPS\Request::i()->cookie['thumbnailSize'] ) AND \IPS\Request::i()->cookie['thumbnailSize'] == 'rows' AND \IPS\Request::i()->controller != 'search' )
|
||||
{
|
||||
return 'tableRowsRows';
|
||||
}
|
||||
else
|
||||
{
|
||||
return 'tableRowsThumbs';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve some images, used for the slider on the image view page
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function getImages()
|
||||
{
|
||||
$startingPoint = \IPS\gallery\Image::load( \IPS\Request::i()->image );
|
||||
$count = intval( \IPS\Request::i()->count );
|
||||
|
||||
if( \IPS\Request::i()->direction == 'next' )
|
||||
{
|
||||
$results = $startingPoint->nextImages( $count );
|
||||
}
|
||||
else
|
||||
{
|
||||
$results = $startingPoint->previousImages( $count );
|
||||
}
|
||||
|
||||
$toSend = array();
|
||||
|
||||
foreach( $results as $result )
|
||||
{
|
||||
$toSend[] = \IPS\Theme::i()->getTemplate( 'view' )->imageThumbnail( $result );
|
||||
}
|
||||
|
||||
/* Respond or redirect */
|
||||
if ( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
\IPS\Output::i()->json( $toSend );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( $startingPoint->url() );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Latest images RSS
|
||||
*
|
||||
* @return void
|
||||
* @note We use a template so that we can embed image directly into feed while still allowing it to be customized
|
||||
*/
|
||||
protected function rss()
|
||||
{
|
||||
if( !\IPS\Settings::i()->gallery_rss_enabled )
|
||||
{
|
||||
\IPS\Output::i()->error( 'gallery_rss_offline', '2G189/3', 403, 'gallery_rss_offline_admin' );
|
||||
}
|
||||
|
||||
$where = array();
|
||||
|
||||
if( isset( \IPS\Request::i()->category ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$category = \IPS\gallery\Category::loadAndCheckPerms( \IPS\Request::i()->category, 'read' );
|
||||
$where[] = array( 'image_category_id=?', $category->id );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/8', 404, '' );
|
||||
}
|
||||
}
|
||||
else if ( isset( \IPS\Request::i()->album ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$album = \IPS\gallery\Album::loadAndCheckPerms( \IPS\Request::i()->album, 'read' );
|
||||
$where[] = array( 'image_album_id=?', $album->id );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/9', 404, '' );
|
||||
}
|
||||
}
|
||||
|
||||
$document = \IPS\Xml\Rss::newDocument( isset( $category ) ? $category->url() : ( isset( $album ) ? $album->url() : \IPS\Http\Url::internal( 'app=gallery&module=gallery&controller=browse', 'front', 'gallery' ) ), \IPS\Member::loggedIn()->language()->addToStack('gallery_rss_title'), \IPS\Member::loggedIn()->language()->addToStack('gallery_rss_title') );
|
||||
|
||||
foreach ( \IPS\gallery\Image::getItemsWithPermission( $where ) as $image )
|
||||
{
|
||||
$document->addItem( $image->caption, $image->url(), \IPS\Theme::i()->getTemplate( 'view' )->rssContent( $image ), \IPS\DateTime::ts( $image->updated ), $image->id );
|
||||
}
|
||||
|
||||
/* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */
|
||||
\IPS\Output::i()->sendOutput( $document->asXML(), 200, 'text/xml' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Edit album
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function editAlbum()
|
||||
{
|
||||
/* Load album and check permissions */
|
||||
try
|
||||
{
|
||||
$album = \IPS\gallery\Album::loadAndCheckPerms( \IPS\Request::i()->album, 'read' );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/5', 404, '' );
|
||||
}
|
||||
|
||||
if( !$album->canEdit() )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/4', 403, '' );
|
||||
}
|
||||
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
/* Build form */
|
||||
$form = new \IPS\Helpers\Form;
|
||||
$form->class .= 'ipsForm_vertical';
|
||||
|
||||
$album->form( $form, TRUE );
|
||||
|
||||
/* Handle submissions */
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$values['album_owner'] = ( isset( $values['album_owner'] ) ) ? $values['album_owner'] : \IPS\Member::loggedIn();
|
||||
|
||||
if( !$values['album_name'] OR !$values['album_category'] )
|
||||
{
|
||||
if( !$values['album_name'] )
|
||||
{
|
||||
$form->elements['']['album_name']->error = \IPS\Member::loggedIn()->language()->addToStack('form_required');
|
||||
}
|
||||
|
||||
if( !$values['album_category'] )
|
||||
{
|
||||
$form->elements['']['album_category']->error = \IPS\Member::loggedIn()->language()->addToStack('form_required');
|
||||
}
|
||||
|
||||
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
|
||||
return;
|
||||
}
|
||||
|
||||
$album->saveForm( $album->formatFormValues( $values ) );
|
||||
|
||||
\IPS\Output::i()->redirect( $album->url() );
|
||||
}
|
||||
|
||||
/* Display form */
|
||||
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete album
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function deleteAlbum()
|
||||
{
|
||||
/* Load album and check permissions */
|
||||
try
|
||||
{
|
||||
$album = \IPS\gallery\Album::loadAndCheckPerms( \IPS\Request::i()->album, 'read' );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/6', 404, '' );
|
||||
}
|
||||
|
||||
if( !$album->canDelete() )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2G189/7', 403, '' );
|
||||
}
|
||||
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
/* Build form to move or delete images */
|
||||
$form = new \IPS\Helpers\Form;
|
||||
$form->class .= 'ipsForm_vertical';
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( "delete_images", TRUE, FALSE, array( 'togglesOff' => array( 'move_image_category', 'move_image_album' ) ) ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Node( 'move_image_category', NULL, FALSE, array(
|
||||
'class' => 'IPS\gallery\Category',
|
||||
'permissionCheck' => 'add',
|
||||
), NULL, NULL, NULL, 'move_image_category' ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\Node( 'move_image_album', NULL, FALSE, array(
|
||||
'class' => 'IPS\gallery\Album',
|
||||
'permissionCheck' => function( $node ) use ( $album )
|
||||
{
|
||||
/* Do we have permission to add? */
|
||||
if( !$node->can( 'add' ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* This isn't the album we are deleting right? */
|
||||
if ( $node->id == $album->id )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
), NULL, NULL, NULL, 'move_image_album' ) );
|
||||
|
||||
/* Handle submissions */
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$category = $album->category();
|
||||
/* Update the count */
|
||||
if( $album->type == $album::AUTH_TYPE_PUBLIC )
|
||||
{
|
||||
$category->public_albums = $category->public_albums - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
$category->nonpublic_albums = $category->nonpublic_albums - 1;
|
||||
}
|
||||
|
||||
$category->save();
|
||||
|
||||
/* Hide the album */
|
||||
$album->type = 4;
|
||||
$album->save();
|
||||
|
||||
/* Are we moving the images? */
|
||||
if( !$values['delete_images'] )
|
||||
{
|
||||
if( ( !isset( $values['move_image_category'] ) OR !( $values['move_image_category'] instanceof \IPS\Node\Model ) ) AND
|
||||
( !isset( $values['move_image_album'] ) OR !( $values['move_image_album'] instanceof \IPS\Node\Model ) ) )
|
||||
{
|
||||
$form->error = \IPS\Member::loggedIn()->language()->addToStack('gallery_cat_or_album');
|
||||
|
||||
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
|
||||
return;
|
||||
}
|
||||
|
||||
$moveData = array( 'class' => 'IPS\gallery\Album', 'id' => $album->_id, 'deleteWhenDone' => TRUE );
|
||||
if( isset( $values['move_image_category'] ) AND $values['move_image_category'] instanceof \IPS\Node\Model )
|
||||
{
|
||||
$moveData['moveToClass'] = 'IPS\gallery\Category';
|
||||
$moveData['moveTo'] = $values['move_image_category']->_id;
|
||||
}
|
||||
else
|
||||
{
|
||||
$moveData['moveToClass'] = 'IPS\gallery\Album';
|
||||
$moveData['moveTo'] = $values['move_image_album']->_id;
|
||||
}
|
||||
|
||||
\IPS\Task::queue( 'core', 'DeleteOrMoveContent', $moveData );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Task::queue( 'core', 'DeleteOrMoveContent', array( 'class' => 'IPS\gallery\Album', 'id' => $album->_id, 'deleteWhenDone' => TRUE ) );
|
||||
}
|
||||
|
||||
/* And then redirect */
|
||||
if( isset( $moveTo ) )
|
||||
{
|
||||
\IPS\Output::i()->redirect( $moveTo->url() );
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Output::i()->redirect( $album->category()->url() );
|
||||
}
|
||||
}
|
||||
|
||||
/* Display form */
|
||||
\IPS\Output::i()->output = $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'forms', 'core' ) ), 'popupTemplate' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Embed
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function embed()
|
||||
{
|
||||
\IPS\Request::i()->id = \IPS\Request::i()->album;
|
||||
return parent::embed();
|
||||
}
|
||||
}
|
||||
Whitespace-only changes.
Loaded 100 of 7517 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user