diff --git a/app/controllers/box_organizer_controller.rb b/app/controllers/box_organizer_controller.rb
index eb13d5d..c942210 100644
--- a/app/controllers/box_organizer_controller.rb
+++ b/app/controllers/box_organizer_controller.rb
@@ -3,12 +3,11 @@ class BoxOrganizerController < ApplicationController
before_filter :login_required
def index
+ @available_blocks = available_blocks.uniq.sort_by(&:pretty_name)
end
def move_block
- @block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, ''))
-
- @source_box = @block.box
+ @block = params[:id] ? boxes_holder.blocks.find(params[:id].gsub(/^block-/, '')) : nil
target_position = nil
@@ -20,9 +19,12 @@ class BoxOrganizerController < ApplicationController
else
(params[:target] =~ /end-of-box-([0-9]+)/)
- @target_box = boxes_holder.boxes.find($1)
+ @target_box = boxes_holder.boxes.find_by_id($1)
end
+ @block = new_block(params[:type], @target_box) if @block.nil?
+ @source_box = @block.box
+
if (@source_box != @target_box)
@block.remove_from_list
@block.box = @target_box
@@ -58,23 +60,6 @@ class BoxOrganizerController < ApplicationController
redirect_to :action => 'index'
end
- def add_block
- type = params[:type]
- if ! type.blank?
- if available_blocks.map(&:name).include?(type)
- boxes_holder.boxes.find(params[:box_id]).blocks << type.constantize.new
- redirect_to :action => 'index'
- else
- raise ArgumentError.new("Type %s is not allowed. Go away." % type)
- end
- else
- @center_block_types = (Box.acceptable_center_blocks & available_blocks) + plugins.dispatch(:extra_blocks, :type => boxes_holder.class, :position => 1)
- @side_block_types = (Box.acceptable_side_blocks & available_blocks) + plugins.dispatch(:extra_blocks, :type => boxes_holder.class, :position => [2,3])
- @boxes = boxes_holder.boxes.with_position
- render :action => 'add_block', :layout => false
- end
- end
-
def edit
@block = boxes_holder.blocks.find(params[:id])
render :action => 'edit', :layout => false
@@ -121,6 +106,27 @@ class BoxOrganizerController < ApplicationController
redirect_to :action => 'index'
end
+ def show_block_type_info
+ type = params[:type]
+ if type.blank? || !available_blocks.map(&:name).include?(type)
+ raise ArgumentError.new("Type %s is not allowed. Go away." % type)
+ end
+ @block = type.constantize.new
+ @block.box = Box.new(:owner => boxes_holder)
+ render :action => 'show_block_type_info', :layout => false
+ end
+
protected :boxes_editor?
+ protected
+
+ def new_block(type, box)
+ if !available_blocks.map(&:name).include?(type)
+ raise ArgumentError.new("Type %s is not allowed. Go away." % type)
+ end
+ block = type.constantize.new
+ box.blocks << block
+ block
+ end
+
end
diff --git a/app/controllers/my_profile/profile_design_controller.rb b/app/controllers/my_profile/profile_design_controller.rb
index 7a5ee5a..fecb028 100644
--- a/app/controllers/my_profile/profile_design_controller.rb
+++ b/app/controllers/my_profile/profile_design_controller.rb
@@ -15,8 +15,9 @@ class ProfileDesignController < BoxOrganizerController
end
def protect_fixed_block
+ return if params[:id].blank?
block = boxes_holder.blocks.find(params[:id].gsub(/^block-/, ''))
- if !current_person.is_admin? && !block.movable?
+ if block.present? && !current_person.is_admin? && !block.movable?
render_access_denied
end
end
diff --git a/app/helpers/box_organizer_helper.rb b/app/helpers/box_organizer_helper.rb
index ba05552..5003cde 100644
--- a/app/helpers/box_organizer_helper.rb
+++ b/app/helpers/box_organizer_helper.rb
@@ -1,5 +1,47 @@
module BoxOrganizerHelper
+ def display_icon(block)
+ image_path = nil
+ plugin = @plugins.fetch_first_plugin(:has_block?, block)
+
+ theme = Theme.new(environment.theme) # remove this
+ if File.exists?(File.join(theme.filesystem_path, block.icon_path))
+ image_path = File.join(theme.public_path, block.icon_path)
+ elsif plugin && File.exists?(File.join(Rails.root, 'public', plugin.public_path, block.icon_path))
+ image_path = File.join('/', plugin.public_path, block.icon_path)
+ elsif File.exists?(File.join(Rails.root, 'public', block.icon_path))
+ image_path = block.icon_path
+ else
+ image_path = block.default_icon_path
+ end
+
+ image_tag(image_path, height: '48', width: '48', class: 'block-type-icon', alt: '' )
+ end
+
+ def display_previews(block)
+ images_path = nil
+ plugin = @plugins.fetch_first_plugin(:has_block?, block)
+
+ theme = Theme.new(environment.theme) # remove this
+
+ images_path = Dir.glob(File.join(theme.filesystem_path, 'images', block.preview_path, '*'))
+ images_path = images_path.map{|path| path.gsub(theme.filesystem_path, theme.public_path) } unless images_path.empty?
+
+ images_path = Dir.glob(File.join(Rails.root, 'public', plugin.public_path, 'images', block.preview_path, '*')) if plugin && images_path.empty?
+ images_path = images_path.map{|path| path.gsub(File.join(Rails.root, 'public'), '') } unless images_path.empty?
+
+ images_path = Dir.glob(File.join(Rails.root, 'public', 'images', block.preview_path, '*')) if images_path.empty?
+ images_path = images_path.map{|path| path.gsub(File.join(Rails.root, 'public'), '') } unless images_path.empty?
+
+ images_path = 1.upto(3).map{block.default_preview_path} if images_path.empty?
+
+ content_tag(:ul,
+ images_path.map do |preview|
+ content_tag(:li, image_tag(preview, height: '240', alt: ''))
+ end.join("\n")
+ )
+ end
+
def icon_selector(icon = 'no-ico')
render :partial => 'icon_selector', :locals => { :icon => icon }
end
@@ -10,4 +52,4 @@ module BoxOrganizerHelper
end
end
-end
\ No newline at end of file
+end
diff --git a/app/helpers/boxes_helper.rb b/app/helpers/boxes_helper.rb
index 028e1e1..0536bd4 100644
--- a/app/helpers/boxes_helper.rb
+++ b/app/helpers/boxes_helper.rb
@@ -190,8 +190,9 @@ module BoxesHelper
else
"before-block-#{block.id}"
end
- if block.nil? || movable?(block)
- content_tag('div', ' ', :id => id, :class => 'block-target' ) + drop_receiving_element(id, :url => { :action => 'move_block', :target => id }, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover')
+ if block.nil? or movable?(block)
+ url = url_for(:action => 'move_block', :target => id)
+ content_tag('div', _('Drop Here'), :id => id, :class => 'block-target' ) + drop_receiving_element(id, :accept => box.acceptable_blocks, :hoverclass => 'block-target-hover', :activeClass => 'block-target-active', :tolerance => 'pointer', :onDrop => "function(ev, ui) { dropBlock('#{url}', '#{_('loading...')}', ev, ui);}")
else
""
end
@@ -199,7 +200,25 @@ module BoxesHelper
# makes the given block draggable so it can be moved away.
def block_handle(block)
- movable?(block) ? draggable_element("block-#{block.id}", :revert => true) : ""
+ return "" unless movable?(block)
+ icon = "
Display all of your communities.
You could choose the amount of communities will be displayed and you could priorize that profiles with images.
The view all button is always present in the block.
")
+ end
+
+ def self.short_description
_('Communities')
end
+ def self.pretty_name
+ _('Communities Block')
+ end
+
def default_title
n_('{#} community', '{#} communities', profile_count)
end
diff --git a/app/models/featured_products_block.rb b/app/models/featured_products_block.rb
index 426cf3c..ae2b78f 100644
--- a/app/models/featured_products_block.rb
+++ b/app/models/featured_products_block.rb
@@ -20,6 +20,10 @@ class FeaturedProductsBlock < Block
_('Featured Products')
end
+ def self.pretty_name
+ _('Featured Products')
+ end
+
def products
Product.find(self.product_ids) || []
end
diff --git a/app/models/feed_reader_block.rb b/app/models/feed_reader_block.rb
index 555feeb..62cd003 100644
--- a/app/models/feed_reader_block.rb
+++ b/app/models/feed_reader_block.rb
@@ -40,6 +40,10 @@ class FeedReaderBlock < Block
_('Feed reader')
end
+ def self.pretty_name
+ _('Feed Reader')
+ end
+
def help
_('This block can be used to list the latest new from any site you want. You just need to inform the address of a RSS feed.')
end
diff --git a/app/models/highlights_block.rb b/app/models/highlights_block.rb
index 9ee66b7..728a083 100644
--- a/app/models/highlights_block.rb
+++ b/app/models/highlights_block.rb
@@ -25,7 +25,7 @@ class HighlightsBlock < Block
end
def self.description
- _('Highlights')
+ _('Creates image slideshow')
end
def featured_images
diff --git a/app/models/link_list_block.rb b/app/models/link_list_block.rb
index 4068a68..b714521 100644
--- a/app/models/link_list_block.rb
+++ b/app/models/link_list_block.rb
@@ -55,6 +55,10 @@ class LinkListBlock < Block
_('This block can be used to create a menu of links. You can add, remove and update the links as you wish.')
end
+ def self.pretty_name
+ _('Link list')
+ end
+
def content(args={})
block_title(title) +
content_tag('ul',
diff --git a/app/models/profile_info_block.rb b/app/models/profile_info_block.rb
index de75947..153dba4 100644
--- a/app/models/profile_info_block.rb
+++ b/app/models/profile_info_block.rb
@@ -1,7 +1,15 @@
class ProfileInfoBlock < Block
def self.description
- _('Profile information')
+ _('Display profile image and links to access initial homepage, control panel and profile activities.')
+ end
+
+ def self.short_description
+ _('Show profile information')
+ end
+
+ def self.pretty_name
+ _('Profile Information')
end
def help
diff --git a/app/models/raw_html_block.rb b/app/models/raw_html_block.rb
index 652f90c..8a4ac03 100644
--- a/app/models/raw_html_block.rb
+++ b/app/models/raw_html_block.rb
@@ -4,6 +4,10 @@ class RawHTMLBlock < Block
_('Raw HTML')
end
+ def self.pretty_name
+ _('Raw HTML')
+ end
+
settings_items :html, :type => :text
attr_accessible :html
diff --git a/app/models/recent_documents_block.rb b/app/models/recent_documents_block.rb
index 052f0f9..5749e88 100644
--- a/app/models/recent_documents_block.rb
+++ b/app/models/recent_documents_block.rb
@@ -1,7 +1,15 @@
class RecentDocumentsBlock < Block
def self.description
- _('Last updates')
+ _('Display the last content produced in the context where the block is available.')
+ end
+
+ def self.short_description
+ _('Show last updates')
+ end
+
+ def self.pretty_name
+ _('Recent Content')
end
def default_title
diff --git a/app/models/sellers_search_block.rb b/app/models/sellers_search_block.rb
index 6aff8ac..ae98ca6 100644
--- a/app/models/sellers_search_block.rb
+++ b/app/models/sellers_search_block.rb
@@ -10,6 +10,10 @@ class SellersSearchBlock < Block
_('Products/Enterprises search')
end
+ def self.pretty_name
+ _('Sellers Search')
+ end
+
def default_title
_('Search for sellers')
end
diff --git a/app/models/tags_block.rb b/app/models/tags_block.rb
index c734ca0..9a94712 100644
--- a/app/models/tags_block.rb
+++ b/app/models/tags_block.rb
@@ -8,7 +8,15 @@ class TagsBlock < Block
settings_items :limit, :type => :integer, :default => 12
def self.description
- _('Tags')
+ _('Display a tag cloud with the content produced where the block is applied.
The user could limit the number of tags will be displayed.
')
+ end
+
+ def self.short_description
+ _('Display a tag cloud about current content')
+ end
+
+ def self.pretty_name
+ _('Tag Cloud')
end
def default_title
diff --git a/app/models/theme.rb b/app/models/theme.rb
index 6a24801..baedfb3 100644
--- a/app/models/theme.rb
+++ b/app/models/theme.rb
@@ -14,7 +14,11 @@ class Theme
end
def system_themes_dir
- Rails.root.join('public', 'designs', 'themes')
+ Rails.root.join('public', relative_themes_dir)
+ end
+
+ def relative_themes_dir
+ File.join('designs', 'themes')
end
def create(id, attributes = {})
@@ -93,6 +97,14 @@ class Theme
config['public'] = value
end
+ def public_path
+ File.join('/', self.class.relative_themes_dir, self.id)
+ end
+
+ def filesystem_path
+ File.join(self.class.system_themes_dir, self.id)
+ end
+
def ==(other)
other.is_a?(self.class) && (other.id == self.id)
end
diff --git a/app/views/box_organizer/add_block.html.erb b/app/views/box_organizer/add_block.html.erb
deleted file mode 100644
index ed647ea..0000000
--- a/app/views/box_organizer/add_block.html.erb
+++ /dev/null
@@ -1,49 +0,0 @@
-Display a breadcrumb of the current content navigation.
You could choose if the breadcrumb is going to appear in the cms editing or not.
There is either the option of display the profile location in the breadcrumb path.
")
+ end
+
+ def self.short_description
+ _('Breadcrumb')
+ end
+
+ def self.pretty_name
+ _('Breadcrumbs Block')
end
def help
diff --git a/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg
new file mode 100644
index 0000000..3dd1703
--- /dev/null
+++ b/plugins/breadcrumbs/public/images/blocks/content_breadcrumbs_block/breadcrumb.svg
@@ -0,0 +1,961 @@
+
+
- <%= link_to_remote '', :url => { :controller => controller.boxes_holder.kind_of?(Environment) ? 'container_block_plugin_admin' : 'container_block_plugin_myprofile', :action => 'saveWidths', :id => block.id },
- :with => "containerChildrenWidth(#{block.id}, #{block.container_box.id})",
+ <%= link_to_remote '', :url => { :controller => controller.boxes_holder.kind_of?(Environment) ? 'container_block_plugin_admin' : 'container_block_plugin_myprofile', :action => 'saveWidths', :id => block.id },
+ :with => "containerChildrenWidth(#{block.id}, #{block.container_box.id})",
:html => {:class => "button icon-save container_block_save", :id => "container_block_save_#{block.id}", :title => c_('Save') },
:loading => "open_loading(DEFAULT_LOADING_MESSAGE);",
:loaded => "close_loading();",
diff --git a/public/articles/0000/1155/eventos.tar.gz b/public/articles/0000/1155/eventos.tar.gz
new file mode 100644
index 0000000..f810216
Binary files /dev/null and b/public/articles/0000/1155/eventos.tar.gz differ
diff --git a/public/articles/0000/1156/rankings.tar.gz b/public/articles/0000/1156/rankings.tar.gz
new file mode 100644
index 0000000..cd957fb
Binary files /dev/null and b/public/articles/0000/1156/rankings.tar.gz differ
diff --git a/public/articles/0000/1157/propostas.csv b/public/articles/0000/1157/propostas.csv
new file mode 100644
index 0000000..923e781
--- /dev/null
+++ b/public/articles/0000/1157/propostas.csv
@@ -0,0 +1,95 @@
+Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,""
+,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9
,""
+,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category
+,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
+Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
diff --git a/public/articles/0000/1158/propostas.csv b/public/articles/0000/1158/propostas.csv
new file mode 100644
index 0000000..923e781
--- /dev/null
+++ b/public/articles/0000/1158/propostas.csv
@@ -0,0 +1,95 @@
+Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,""
+,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9
,""
+,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category
+,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
+Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
diff --git a/public/articles/0000/1159/rankings.tar.gz b/public/articles/0000/1159/rankings.tar.gz
new file mode 100644
index 0000000..b2b6f53
Binary files /dev/null and b/public/articles/0000/1159/rankings.tar.gz differ
diff --git a/public/articles/0000/1160/eventos.tar.gz b/public/articles/0000/1160/eventos.tar.gz
new file mode 100644
index 0000000..74f9393
Binary files /dev/null and b/public/articles/0000/1160/eventos.tar.gz differ
diff --git a/public/articles/0000/1162/propostas.csv b/public/articles/0000/1162/propostas.csv
new file mode 100644
index 0000000..923e781
--- /dev/null
+++ b/public/articles/0000/1162/propostas.csv
@@ -0,0 +1,95 @@
+Origem,Status,Criada em,Moderado por,Data de Moderado,Validado por,Data de Validado,Autor,Proposta,Categorias
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste1,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste2,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste3,""
+,Rejeitada,30/06/15 10:19,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Aprovada,30/06/15 10:20,"","",adminuser,29/06/15 21:00,ze,test2,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste0,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste4,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste5,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste6,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste7,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste8,""
+,Rejeitada,30/06/15 10:21,"","",adminuser,29/06/15 21:00,ze,teste9
,""
+,Pendente de Moderacao,30/06/15 10:37,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Pendente de Moderacao,06/07/15 14:42,"","","","",ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Discussão,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+Tópico 1,Aprovada,06/07/15 14:42,"","",adminuser,05/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 11:22,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,07/07/15 10:56,adminuser,06/07/15 21:00,ze,teste adadd,""
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:25,ze,teste adadd,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:21,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Pendente de Moderacao,30/07/15 15:22,"","","","",ze,teste nova proposta,""
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:21,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,06/07/15 14:42,adminuser,13/07/15 19:18,adminuser,30/07/15 15:24,ze,teste adadd,category
+,Rejeitada,30/07/15 15:21,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,ze,30/07/15 15:24,adminuser,30/07/15 15:24,ze,teste nova proposta,category
+,Rejeitada,30/07/15 15:22,adminuser,30/07/15 15:22,adminuser,30/07/15 15:25,ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:21,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+,Pre Rejeitada,30/07/15 15:22,ze,30/07/15 15:25,"","",ze,teste nova proposta,category
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Discussão,Pendente de Moderacao,30/07/15 17:41,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Tópico 1,Pendente de Moderacao,30/07/15 17:44,"","","","",ze,teste nova proposta,""
+Discussão,Pre Aprovada,30/07/15 17:41,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
+Tópico 1,Pre Aprovada,30/07/15 17:44,adminuser,30/07/15 17:44,"","",ze,teste nova proposta,category
diff --git a/public/articles/0000/1163/rankings.tar.gz b/public/articles/0000/1163/rankings.tar.gz
new file mode 100644
index 0000000..13ca522
Binary files /dev/null and b/public/articles/0000/1163/rankings.tar.gz differ
diff --git a/public/articles/0000/1164/eventos.tar.gz b/public/articles/0000/1164/eventos.tar.gz
new file mode 100644
index 0000000..67c35c8
Binary files /dev/null and b/public/articles/0000/1164/eventos.tar.gz differ
diff --git a/public/fonts/slick.eot b/public/fonts/slick.eot
new file mode 100644
index 0000000..2cbab9c
Binary files /dev/null and b/public/fonts/slick.eot differ
diff --git a/public/fonts/slick.svg b/public/fonts/slick.svg
new file mode 100644
index 0000000..b36a66a
--- /dev/null
+++ b/public/fonts/slick.svg
@@ -0,0 +1,14 @@
+
+
+
+Generated by Fontastic.me
+
+
+
+
+
+
+
+
+
+
diff --git a/public/fonts/slick.ttf b/public/fonts/slick.ttf
new file mode 100644
index 0000000..9d03461
Binary files /dev/null and b/public/fonts/slick.ttf differ
diff --git a/public/fonts/slick.woff b/public/fonts/slick.woff
new file mode 100644
index 0000000..8ee9972
Binary files /dev/null and b/public/fonts/slick.woff differ
diff --git a/public/images/block_preview.png b/public/images/block_preview.png
new file mode 100644
index 0000000..f8ee80f
Binary files /dev/null and b/public/images/block_preview.png differ
diff --git a/public/images/blocks/blog_archives_block/icon.png b/public/images/blocks/blog_archives_block/icon.png
new file mode 100644
index 0000000..d13cc8b
Binary files /dev/null and b/public/images/blocks/blog_archives_block/icon.png differ
diff --git a/public/images/blocks/blog_archives_block/icon.svg b/public/images/blocks/blog_archives_block/icon.svg
new file mode 100644
index 0000000..0152a69
--- /dev/null
+++ b/public/images/blocks/blog_archives_block/icon.svg
@@ -0,0 +1,556 @@
+
+
+
+
+ Block Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Block Icon
+
+
+ Noosfero Project
+
+
+
+
+
+
+
+ 2008 •April (18) •January (25) 2007 •August (8) •April (21) •January (16)
+
+
+
+
+
+
+
+
+
+
+
+ 2008 2007
+
+
+
+
+
+
diff --git a/public/images/blocks/communities_block/icon.png b/public/images/blocks/communities_block/icon.png
new file mode 100644
index 0000000..984c6fb
Binary files /dev/null and b/public/images/blocks/communities_block/icon.png differ
diff --git a/public/images/blocks/communities_block/icon.svg b/public/images/blocks/communities_block/icon.svg
new file mode 100644
index 0000000..9693463
--- /dev/null
+++ b/public/images/blocks/communities_block/icon.svg
@@ -0,0 +1,851 @@
+
+
+
+
+ Block Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Block Icon
+
+
+ Noosfero Project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/images/blocks/communities_block/previews/edit_block.png b/public/images/blocks/communities_block/previews/edit_block.png
new file mode 100644
index 0000000..c5a5dc6
Binary files /dev/null and b/public/images/blocks/communities_block/previews/edit_block.png differ
diff --git a/public/images/blocks/communities_block/previews/view_block.png b/public/images/blocks/communities_block/previews/view_block.png
new file mode 100644
index 0000000..2838908
Binary files /dev/null and b/public/images/blocks/communities_block/previews/view_block.png differ
diff --git a/public/images/blocks/friends_block b/public/images/blocks/friends_block
new file mode 120000
index 0000000..2ab4da0
--- /dev/null
+++ b/public/images/blocks/friends_block
@@ -0,0 +1 @@
+people_block
\ No newline at end of file
diff --git a/public/images/blocks/highlights_block/icon.png b/public/images/blocks/highlights_block/icon.png
new file mode 100644
index 0000000..3f69472
Binary files /dev/null and b/public/images/blocks/highlights_block/icon.png differ
diff --git a/public/images/blocks/highlights_block/icon.svg b/public/images/blocks/highlights_block/icon.svg
new file mode 100644
index 0000000..d01328b
--- /dev/null
+++ b/public/images/blocks/highlights_block/icon.svg
@@ -0,0 +1,519 @@
+
+
+
+
+ Block Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Block Icon
+
+
+ Noosfero Project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/images/blocks/highlights_block/previews/edit_block.png b/public/images/blocks/highlights_block/previews/edit_block.png
new file mode 100644
index 0000000..d371cf0
Binary files /dev/null and b/public/images/blocks/highlights_block/previews/edit_block.png differ
diff --git a/public/images/blocks/highlights_block/previews/show_block.png b/public/images/blocks/highlights_block/previews/show_block.png
new file mode 100644
index 0000000..9de658d
Binary files /dev/null and b/public/images/blocks/highlights_block/previews/show_block.png differ
diff --git a/public/images/blocks/members_block b/public/images/blocks/members_block
new file mode 120000
index 0000000..2ab4da0
--- /dev/null
+++ b/public/images/blocks/members_block
@@ -0,0 +1 @@
+people_block
\ No newline at end of file
diff --git a/public/images/blocks/people_block/icon.png b/public/images/blocks/people_block/icon.png
new file mode 100644
index 0000000..b5b49bb
Binary files /dev/null and b/public/images/blocks/people_block/icon.png differ
diff --git a/public/images/blocks/people_block/icon.svg b/public/images/blocks/people_block/icon.svg
new file mode 100644
index 0000000..7f7e553
--- /dev/null
+++ b/public/images/blocks/people_block/icon.svg
@@ -0,0 +1,465 @@
+
+
+
+
+ Block Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Block Icon
+
+
+ Noosfero Project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/images/blocks/profile_image_block/icon.png b/public/images/blocks/profile_image_block/icon.png
new file mode 100644
index 0000000..5e7da40
Binary files /dev/null and b/public/images/blocks/profile_image_block/icon.png differ
diff --git a/public/images/blocks/profile_image_block/icon.svg b/public/images/blocks/profile_image_block/icon.svg
new file mode 100644
index 0000000..b28e483
--- /dev/null
+++ b/public/images/blocks/profile_image_block/icon.svg
@@ -0,0 +1,610 @@
+
+
+
+
+ Block Icon
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+ Block Icon
+
+
+ Noosfero Project
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Fulano
+
+
diff --git a/public/images/icon_block.png b/public/images/icon_block.png
new file mode 100644
index 0000000..2f0e243
Binary files /dev/null and b/public/images/icon_block.png differ
diff --git a/public/javascripts/application.js b/public/javascripts/application.js
index c06c77b..1b4f061 100644
--- a/public/javascripts/application.js
+++ b/public/javascripts/application.js
@@ -31,6 +31,8 @@
*= require catalog.js
*= require autogrow.js
*= require require_login.js
+*= require slick.js
+*= require block-store.js
*/
// lodash configuration
diff --git a/public/javascripts/block-store.js b/public/javascripts/block-store.js
new file mode 100644
index 0000000..8dcd0f6
--- /dev/null
+++ b/public/javascripts/block-store.js
@@ -0,0 +1,63 @@
+function filterBlocks() {
+ jQuery('#block-store #block-types').slick('slickFilter', function() {
+ var name = $(this).data('block-name');
+ var filter = $('#block-store #block-store-filter').val();
+ return name.toLowerCase().indexOf(filter.toLowerCase()) > -1;
+ });
+}
+
+function cloneDraggableBlock(el, blockIcon) {
+ el.addClass('ui-draggable-dragging');
+ return blockIcon;
+}
+
+function startDragBlock() {
+ $('#box-organizer').addClass('shadow');
+}
+
+function stopDragBlock() {
+ $('#box-organizer').removeClass('shadow');
+ $('.ui-draggable-dragging').removeClass('ui-draggable-dragging');
+}
+
+function initBlockStore() {
+ jQuery('#block-store').show();
+ var store = jQuery('#block-store #block-types').slick({
+ infinite: false,
+ dots: true,
+ draggable: false,
+ respondTo: 'slider',
+ slidesToShow: 7,
+ slidesToScroll: 6,
+ responsive: [
+ {
+ breakpoint: 2048,
+ settings: {
+ slidesToShow: 10,
+ slidesToScroll: 9,
+ }
+ },
+ {
+ breakpoint: 1024,
+ settings: {
+ slidesToShow: 8,
+ slidesToScroll: 7,
+ }
+ }
+ ]
+ });
+ jQuery('#block-store #block-store-filter').keyup(filterBlocks);
+}
+
+function dropBlock(url, loadingMessage, ev, ui) {
+ var blockType = jQuery(ui.draggable).attr('data-block-type');
+ var blockId = jQuery(ui.draggable).attr('id');
+ open_loading(loadingMessage);
+ jQuery.ajax({
+ data: 'type='+encodeURIComponent(blockType)+'&id=' + encodeURIComponent(blockId),
+ dataType: 'script',
+ type: 'post',
+ url: url,
+ complete: close_loading,
+ })
+}
diff --git a/public/javascripts/slick.js b/public/javascripts/slick.js
new file mode 100644
index 0000000..a89d5e9
--- /dev/null
+++ b/public/javascripts/slick.js
@@ -0,0 +1,2249 @@
+/*
+ _ _ _ _
+ ___| (_) ___| | __ (_)___
+/ __| | |/ __| |/ / | / __|
+\__ \ | | (__| < _ | \__ \
+|___/_|_|\___|_|\_(_)/ |___/
+ |__/
+
+ Version: 1.5.0
+ Author: Ken Wheeler
+ Website: http://kenwheeler.github.io
+ Docs: http://kenwheeler.github.io/slick
+ Repo: http://github.com/kenwheeler/slick
+ Issues: http://github.com/kenwheeler/slick/issues
+
+ */
+/* global window, document, define, jQuery, setInterval, clearInterval */
+(function(factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else if (typeof exports !== 'undefined') {
+ module.exports = factory(require('jquery'));
+ } else {
+ factory(jQuery);
+ }
+
+}(function($) {
+ 'use strict';
+ var Slick = window.Slick || {};
+
+ Slick = (function() {
+
+ var instanceUid = 0;
+
+ function Slick(element, settings) {
+
+ var _ = this,
+ dataSettings, responsiveSettings, breakpoint;
+
+ _.defaults = {
+ accessibility: true,
+ adaptiveHeight: false,
+ appendArrows: $(element),
+ appendDots: $(element),
+ arrows: true,
+ asNavFor: null,
+ prevArrow: '
Previous ',
+ nextArrow: '
Next ',
+ autoplay: false,
+ autoplaySpeed: 3000,
+ centerMode: false,
+ centerPadding: '50px',
+ cssEase: 'ease',
+ customPaging: function(slider, i) {
+ return '
' + (i + 1) + ' ';
+ },
+ dots: false,
+ dotsClass: 'slick-dots',
+ draggable: true,
+ easing: 'linear',
+ edgeFriction: 0.35,
+ fade: false,
+ focusOnSelect: false,
+ infinite: true,
+ initialSlide: 0,
+ lazyLoad: 'ondemand',
+ mobileFirst: false,
+ pauseOnHover: true,
+ pauseOnDotsHover: false,
+ respondTo: 'window',
+ responsive: null,
+ rtl: false,
+ slide: '',
+ slidesToShow: 1,
+ slidesToScroll: 1,
+ speed: 500,
+ swipe: true,
+ swipeToSlide: false,
+ touchMove: true,
+ touchThreshold: 5,
+ useCSS: true,
+ variableWidth: false,
+ vertical: false,
+ waitForAnimate: true
+ };
+
+ _.initials = {
+ animating: false,
+ dragging: false,
+ autoPlayTimer: null,
+ currentDirection: 0,
+ currentLeft: null,
+ currentSlide: 0,
+ direction: 1,
+ $dots: null,
+ listWidth: null,
+ listHeight: null,
+ loadIndex: 0,
+ $nextArrow: null,
+ $prevArrow: null,
+ slideCount: null,
+ slideWidth: null,
+ $slideTrack: null,
+ $slides: null,
+ sliding: false,
+ slideOffset: 0,
+ swipeLeft: null,
+ $list: null,
+ touchObject: {},
+ transformsEnabled: false,
+ verticalScrolling: false
+ };
+
+ $.extend(_, _.initials);
+
+ _.activeBreakpoint = null;
+ _.animType = null;
+ _.animProp = null;
+ _.breakpoints = [];
+ _.breakpointSettings = [];
+ _.cssTransitions = false;
+ _.hidden = 'hidden';
+ _.paused = false;
+ _.positionProp = null;
+ _.respondTo = null;
+ _.shouldClick = true;
+ _.$slider = $(element);
+ _.$slidesCache = null;
+ _.transformType = null;
+ _.transitionType = null;
+ _.visibilityChange = 'visibilitychange';
+ _.windowWidth = 0;
+ _.windowTimer = null;
+
+ dataSettings = $(element).data('slick') || {};
+
+ _.options = $.extend({}, _.defaults, dataSettings, settings);
+
+ _.currentSlide = _.options.initialSlide;
+
+ _.originalSettings = _.options;
+ responsiveSettings = _.options.responsive || null;
+
+ if (responsiveSettings && responsiveSettings.length > -1) {
+ _.respondTo = _.options.respondTo || 'window';
+ for (breakpoint in responsiveSettings) {
+ if (responsiveSettings.hasOwnProperty(breakpoint)) {
+ _.breakpoints.push(responsiveSettings[
+ breakpoint].breakpoint);
+ _.breakpointSettings[responsiveSettings[
+ breakpoint].breakpoint] =
+ responsiveSettings[breakpoint].settings;
+ }
+ }
+ _.breakpoints.sort(function(a, b) {
+ if (_.options.mobileFirst === true) {
+ return a - b;
+ } else {
+ return b - a;
+ }
+ });
+ }
+
+ if (typeof document.mozHidden !== 'undefined') {
+ _.hidden = 'mozHidden';
+ _.visibilityChange = 'mozvisibilitychange';
+ } else if (typeof document.msHidden !== 'undefined') {
+ _.hidden = 'msHidden';
+ _.visibilityChange = 'msvisibilitychange';
+ } else if (typeof document.webkitHidden !== 'undefined') {
+ _.hidden = 'webkitHidden';
+ _.visibilityChange = 'webkitvisibilitychange';
+ }
+
+ _.autoPlay = $.proxy(_.autoPlay, _);
+ _.autoPlayClear = $.proxy(_.autoPlayClear, _);
+ _.changeSlide = $.proxy(_.changeSlide, _);
+ _.clickHandler = $.proxy(_.clickHandler, _);
+ _.selectHandler = $.proxy(_.selectHandler, _);
+ _.setPosition = $.proxy(_.setPosition, _);
+ _.swipeHandler = $.proxy(_.swipeHandler, _);
+ _.dragHandler = $.proxy(_.dragHandler, _);
+ _.keyHandler = $.proxy(_.keyHandler, _);
+ _.autoPlayIterator = $.proxy(_.autoPlayIterator, _);
+
+ _.instanceUid = instanceUid++;
+
+ // A simple way to check for HTML strings
+ // Strict HTML recognition (must start with <)
+ // Extracted from jQuery v1.11 source
+ _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/;
+
+ _.init();
+
+ _.checkResponsive(true);
+
+ }
+
+ return Slick;
+
+ }());
+
+ Slick.prototype.addSlide = Slick.prototype.slickAdd = function(markup, index, addBefore) {
+
+ var _ = this;
+
+ if (typeof(index) === 'boolean') {
+ addBefore = index;
+ index = null;
+ } else if (index < 0 || (index >= _.slideCount)) {
+ return false;
+ }
+
+ _.unload();
+
+ if (typeof(index) === 'number') {
+ if (index === 0 && _.$slides.length === 0) {
+ $(markup).appendTo(_.$slideTrack);
+ } else if (addBefore) {
+ $(markup).insertBefore(_.$slides.eq(index));
+ } else {
+ $(markup).insertAfter(_.$slides.eq(index));
+ }
+ } else {
+ if (addBefore === true) {
+ $(markup).prependTo(_.$slideTrack);
+ } else {
+ $(markup).appendTo(_.$slideTrack);
+ }
+ }
+
+ _.$slides = _.$slideTrack.children(this.options.slide);
+
+ _.$slideTrack.children(this.options.slide).detach();
+
+ _.$slideTrack.append(_.$slides);
+
+ _.$slides.each(function(index, element) {
+ $(element).attr('data-slick-index', index);
+ });
+
+ _.$slidesCache = _.$slides;
+
+ _.reinit();
+
+ };
+
+ Slick.prototype.animateHeight = function() {
+ var _ = this;
+ if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
+ var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
+ _.$list.animate({
+ height: targetHeight
+ }, _.options.speed);
+ }
+ };
+
+ Slick.prototype.animateSlide = function(targetLeft, callback) {
+
+ var animProps = {},
+ _ = this;
+
+ _.animateHeight();
+
+ if (_.options.rtl === true && _.options.vertical === false) {
+ targetLeft = -targetLeft;
+ }
+ if (_.transformsEnabled === false) {
+ if (_.options.vertical === false) {
+ _.$slideTrack.animate({
+ left: targetLeft
+ }, _.options.speed, _.options.easing, callback);
+ } else {
+ _.$slideTrack.animate({
+ top: targetLeft
+ }, _.options.speed, _.options.easing, callback);
+ }
+
+ } else {
+
+ if (_.cssTransitions === false) {
+ if (_.options.rtl === true) {
+ _.currentLeft = -(_.currentLeft);
+ }
+ $({
+ animStart: _.currentLeft
+ }).animate({
+ animStart: targetLeft
+ }, {
+ duration: _.options.speed,
+ easing: _.options.easing,
+ step: function(now) {
+ now = Math.ceil(now);
+ if (_.options.vertical === false) {
+ animProps[_.animType] = 'translate(' +
+ now + 'px, 0px)';
+ _.$slideTrack.css(animProps);
+ } else {
+ animProps[_.animType] = 'translate(0px,' +
+ now + 'px)';
+ _.$slideTrack.css(animProps);
+ }
+ },
+ complete: function() {
+ if (callback) {
+ callback.call();
+ }
+ }
+ });
+
+ } else {
+
+ _.applyTransition();
+ targetLeft = Math.ceil(targetLeft);
+
+ if (_.options.vertical === false) {
+ animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)';
+ } else {
+ animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)';
+ }
+ _.$slideTrack.css(animProps);
+
+ if (callback) {
+ setTimeout(function() {
+
+ _.disableTransition();
+
+ callback.call();
+ }, _.options.speed);
+ }
+
+ }
+
+ }
+
+ };
+
+ Slick.prototype.asNavFor = function(index) {
+ var _ = this,
+ asNavFor = _.options.asNavFor !== null ? $(_.options.asNavFor).slick('getSlick') : null;
+ if (asNavFor !== null) asNavFor.slideHandler(index, true);
+ };
+
+ Slick.prototype.applyTransition = function(slide) {
+
+ var _ = this,
+ transition = {};
+
+ if (_.options.fade === false) {
+ transition[_.transitionType] = _.transformType + ' ' + _.options.speed + 'ms ' + _.options.cssEase;
+ } else {
+ transition[_.transitionType] = 'opacity ' + _.options.speed + 'ms ' + _.options.cssEase;
+ }
+
+ if (_.options.fade === false) {
+ _.$slideTrack.css(transition);
+ } else {
+ _.$slides.eq(slide).css(transition);
+ }
+
+ };
+
+ Slick.prototype.autoPlay = function() {
+
+ var _ = this;
+
+ if (_.autoPlayTimer) {
+ clearInterval(_.autoPlayTimer);
+ }
+
+ if (_.slideCount > _.options.slidesToShow && _.paused !== true) {
+ _.autoPlayTimer = setInterval(_.autoPlayIterator,
+ _.options.autoplaySpeed);
+ }
+
+ };
+
+ Slick.prototype.autoPlayClear = function() {
+
+ var _ = this;
+ if (_.autoPlayTimer) {
+ clearInterval(_.autoPlayTimer);
+ }
+
+ };
+
+ Slick.prototype.autoPlayIterator = function() {
+
+ var _ = this;
+
+ if (_.options.infinite === false) {
+
+ if (_.direction === 1) {
+
+ if ((_.currentSlide + 1) === _.slideCount -
+ 1) {
+ _.direction = 0;
+ }
+
+ _.slideHandler(_.currentSlide + _.options.slidesToScroll);
+
+ } else {
+
+ if ((_.currentSlide - 1 === 0)) {
+
+ _.direction = 1;
+
+ }
+
+ _.slideHandler(_.currentSlide - _.options.slidesToScroll);
+
+ }
+
+ } else {
+
+ _.slideHandler(_.currentSlide + _.options.slidesToScroll);
+
+ }
+
+ };
+
+ Slick.prototype.buildArrows = function() {
+
+ var _ = this;
+
+ if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
+
+ _.$prevArrow = $(_.options.prevArrow);
+ _.$nextArrow = $(_.options.nextArrow);
+
+ if (_.htmlExpr.test(_.options.prevArrow)) {
+ _.$prevArrow.appendTo(_.options.appendArrows);
+ }
+
+ if (_.htmlExpr.test(_.options.nextArrow)) {
+ _.$nextArrow.appendTo(_.options.appendArrows);
+ }
+
+ if (_.options.infinite !== true) {
+ _.$prevArrow.addClass('slick-disabled');
+ }
+
+ }
+
+ };
+
+ Slick.prototype.buildDots = function() {
+
+ var _ = this,
+ i, dotString;
+
+ if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
+
+ dotString = '
';
+
+ for (i = 0; i <= _.getDotCount(); i += 1) {
+ dotString += '' + _.options.customPaging.call(this, _, i) + ' ';
+ }
+
+ dotString += ' ';
+
+ _.$dots = $(dotString).appendTo(
+ _.options.appendDots);
+
+ _.$dots.find('li').first().addClass('slick-active').attr('aria-hidden', 'false');
+
+ }
+
+ };
+
+ Slick.prototype.buildOut = function() {
+
+ var _ = this;
+
+ _.$slides = _.$slider.children(_.options.slide +
+ ':not(.slick-cloned)').addClass(
+ 'slick-slide');
+ _.slideCount = _.$slides.length;
+
+ _.$slides.each(function(index, element) {
+ $(element).attr('data-slick-index', index);
+ });
+
+ _.$slidesCache = _.$slides;
+
+ _.$slider.addClass('slick-slider');
+
+ _.$slideTrack = (_.slideCount === 0) ?
+ $('
').appendTo(_.$slider) :
+ _.$slides.wrapAll('
').parent();
+
+ _.$list = _.$slideTrack.wrap(
+ '
').parent();
+ _.$slideTrack.css('opacity', 0);
+
+ if (_.options.centerMode === true || _.options.swipeToSlide === true) {
+ _.options.slidesToScroll = 1;
+ }
+
+ $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading');
+
+ _.setupInfinite();
+
+ _.buildArrows();
+
+ _.buildDots();
+
+ _.updateDots();
+
+ if (_.options.accessibility === true) {
+ _.$list.prop('tabIndex', 0);
+ }
+
+ _.setSlideClasses(typeof this.currentSlide === 'number' ? this.currentSlide : 0);
+
+ if (_.options.draggable === true) {
+ _.$list.addClass('draggable');
+ }
+
+ };
+
+ Slick.prototype.checkResponsive = function(initial) {
+
+ var _ = this,
+ breakpoint, targetBreakpoint, respondToWidth;
+ var sliderWidth = _.$slider.width();
+ var windowWidth = window.innerWidth || $(window).width();
+ if (_.respondTo === 'window') {
+ respondToWidth = windowWidth;
+ } else if (_.respondTo === 'slider') {
+ respondToWidth = sliderWidth;
+ } else if (_.respondTo === 'min') {
+ respondToWidth = Math.min(windowWidth, sliderWidth);
+ }
+
+ if (_.originalSettings.responsive && _.originalSettings
+ .responsive.length > -1 && _.originalSettings.responsive !== null) {
+
+ targetBreakpoint = null;
+
+ for (breakpoint in _.breakpoints) {
+ if (_.breakpoints.hasOwnProperty(breakpoint)) {
+ if (_.originalSettings.mobileFirst === false) {
+ if (respondToWidth < _.breakpoints[breakpoint]) {
+ targetBreakpoint = _.breakpoints[breakpoint];
+ }
+ } else {
+ if (respondToWidth > _.breakpoints[breakpoint]) {
+ targetBreakpoint = _.breakpoints[breakpoint];
+ }
+ }
+ }
+ }
+
+ if (targetBreakpoint !== null) {
+ if (_.activeBreakpoint !== null) {
+ if (targetBreakpoint !== _.activeBreakpoint) {
+ _.activeBreakpoint =
+ targetBreakpoint;
+ if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
+ _.unslick();
+ } else {
+ _.options = $.extend({}, _.originalSettings,
+ _.breakpointSettings[
+ targetBreakpoint]);
+ if (initial === true)
+ _.currentSlide = _.options.initialSlide;
+ _.refresh();
+ }
+ }
+ } else {
+ _.activeBreakpoint = targetBreakpoint;
+ if (_.breakpointSettings[targetBreakpoint] === 'unslick') {
+ _.unslick();
+ } else {
+ _.options = $.extend({}, _.originalSettings,
+ _.breakpointSettings[
+ targetBreakpoint]);
+ if (initial === true)
+ _.currentSlide = _.options.initialSlide;
+ _.refresh();
+ }
+ }
+ } else {
+ if (_.activeBreakpoint !== null) {
+ _.activeBreakpoint = null;
+ _.options = _.originalSettings;
+ if (initial === true)
+ _.currentSlide = _.options.initialSlide;
+ _.refresh();
+ }
+ }
+
+ }
+
+ };
+
+ Slick.prototype.changeSlide = function(event, dontAnimate) {
+
+ var _ = this,
+ $target = $(event.target),
+ indexOffset, slideOffset, unevenOffset;
+
+ // If target is a link, prevent default action.
+ $target.is('a') && event.preventDefault();
+
+ unevenOffset = (_.slideCount % _.options.slidesToScroll !== 0);
+ indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll;
+
+ switch (event.data.message) {
+
+ case 'previous':
+ slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset;
+ if (_.slideCount > _.options.slidesToShow) {
+ _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate);
+ }
+ break;
+
+ case 'next':
+ slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset;
+ if (_.slideCount > _.options.slidesToShow) {
+ _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate);
+ }
+ break;
+
+ case 'index':
+ var index = event.data.index === 0 ? 0 :
+ event.data.index || $(event.target).parent().index() * _.options.slidesToScroll;
+
+ _.slideHandler(_.checkNavigable(index), false, dontAnimate);
+ break;
+
+ default:
+ return;
+ }
+
+ };
+
+ Slick.prototype.checkNavigable = function(index) {
+
+ var _ = this,
+ navigables, prevNavigable;
+
+ navigables = _.getNavigableIndexes();
+ prevNavigable = 0;
+ if (index > navigables[navigables.length - 1]) {
+ index = navigables[navigables.length - 1];
+ } else {
+ for (var n in navigables) {
+ if (index < navigables[n]) {
+ index = prevNavigable;
+ break;
+ }
+ prevNavigable = navigables[n];
+ }
+ }
+
+ return index;
+ };
+
+ Slick.prototype.cleanUpEvents = function() {
+
+ var _ = this;
+
+ if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
+ $('li', _.$dots).off('click.slick', _.changeSlide);
+ }
+
+ if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.options.autoplay === true) {
+ $('li', _.$dots)
+ .off('mouseenter.slick', _.setPaused.bind(_, true))
+ .off('mouseleave.slick', _.setPaused.bind(_, false));
+ }
+
+ if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
+ _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide);
+ _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide);
+ }
+
+ _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler);
+ _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler);
+ _.$list.off('touchend.slick mouseup.slick', _.swipeHandler);
+ _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler);
+
+ _.$list.off('click.slick', _.clickHandler);
+
+ if (_.options.autoplay === true) {
+ $(document).off(_.visibilityChange, _.visibility);
+ }
+
+ _.$list.off('mouseenter.slick', _.setPaused.bind(_, true));
+ _.$list.off('mouseleave.slick', _.setPaused.bind(_, false));
+
+ if (_.options.accessibility === true) {
+ _.$list.off('keydown.slick', _.keyHandler);
+ }
+
+ if (_.options.focusOnSelect === true) {
+ $(_.$slideTrack).children().off('click.slick', _.selectHandler);
+ }
+
+ $(window).off('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange);
+
+ $(window).off('resize.slick.slick-' + _.instanceUid, _.resize);
+
+ $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault);
+
+ $(window).off('load.slick.slick-' + _.instanceUid, _.setPosition);
+ $(document).off('ready.slick.slick-' + _.instanceUid, _.setPosition);
+ };
+
+ Slick.prototype.clickHandler = function(event) {
+
+ var _ = this;
+
+ if (_.shouldClick === false) {
+ event.stopImmediatePropagation();
+ event.stopPropagation();
+ event.preventDefault();
+ }
+
+ };
+
+ Slick.prototype.destroy = function() {
+
+ var _ = this;
+
+ _.autoPlayClear();
+
+ _.touchObject = {};
+
+ _.cleanUpEvents();
+
+ $('.slick-cloned', _.$slider).remove();
+
+ if (_.$dots) {
+ _.$dots.remove();
+ }
+ if (_.$prevArrow && (typeof _.options.prevArrow !== 'object')) {
+ _.$prevArrow.remove();
+ }
+ if (_.$nextArrow && (typeof _.options.nextArrow !== 'object')) {
+ _.$nextArrow.remove();
+ }
+
+ if (_.$slides) {
+ _.$slides.removeClass('slick-slide slick-active slick-center slick-visible')
+ .attr('aria-hidden', 'true')
+ .removeAttr('data-slick-index')
+ .css({
+ position: '',
+ left: '',
+ top: '',
+ zIndex: '',
+ opacity: '',
+ width: ''
+ });
+
+ _.$slider.html(_.$slides);
+ }
+
+ _.$slider.removeClass('slick-slider');
+ _.$slider.removeClass('slick-initialized');
+
+ };
+
+ Slick.prototype.disableTransition = function(slide) {
+
+ var _ = this,
+ transition = {};
+
+ transition[_.transitionType] = '';
+
+ if (_.options.fade === false) {
+ _.$slideTrack.css(transition);
+ } else {
+ _.$slides.eq(slide).css(transition);
+ }
+
+ };
+
+ Slick.prototype.fadeSlide = function(slideIndex, callback) {
+
+ var _ = this;
+
+ if (_.cssTransitions === false) {
+
+ _.$slides.eq(slideIndex).css({
+ zIndex: 1000
+ });
+
+ _.$slides.eq(slideIndex).animate({
+ opacity: 1
+ }, _.options.speed, _.options.easing, callback);
+
+ } else {
+
+ _.applyTransition(slideIndex);
+
+ _.$slides.eq(slideIndex).css({
+ opacity: 1,
+ zIndex: 1000
+ });
+
+ if (callback) {
+ setTimeout(function() {
+
+ _.disableTransition(slideIndex);
+
+ callback.call();
+ }, _.options.speed);
+ }
+
+ }
+
+ };
+
+ Slick.prototype.filterSlides = Slick.prototype.slickFilter = function(filter) {
+
+ var _ = this;
+
+ if (filter !== null) {
+
+ _.unload();
+
+ _.$slideTrack.children(this.options.slide).detach();
+
+ _.$slidesCache.filter(filter).appendTo(_.$slideTrack);
+
+ _.reinit();
+
+ }
+
+ };
+
+ Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function() {
+
+ var _ = this;
+ return _.currentSlide;
+
+ };
+
+ Slick.prototype.getDotCount = function() {
+
+ var _ = this;
+
+ var breakPoint = 0;
+ var counter = 0;
+ var pagerQty = 0;
+
+ if (_.options.infinite === true) {
+ pagerQty = Math.ceil(_.slideCount / _.options.slidesToScroll);
+ } else if (_.options.centerMode === true) {
+ pagerQty = _.slideCount;
+ } else {
+ while (breakPoint < _.slideCount) {
+ ++pagerQty;
+ breakPoint = counter + _.options.slidesToShow;
+ counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
+ }
+ }
+
+ return pagerQty - 1;
+
+ };
+
+ Slick.prototype.getLeft = function(slideIndex) {
+
+ var _ = this,
+ targetLeft,
+ verticalHeight,
+ verticalOffset = 0,
+ targetSlide;
+
+ _.slideOffset = 0;
+ verticalHeight = _.$slides.first().outerHeight();
+
+ if (_.options.infinite === true) {
+ if (_.slideCount > _.options.slidesToShow) {
+ _.slideOffset = (_.slideWidth * _.options.slidesToShow) * -1;
+ verticalOffset = (verticalHeight * _.options.slidesToShow) * -1;
+ }
+ if (_.slideCount % _.options.slidesToScroll !== 0) {
+ if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) {
+ if (slideIndex > _.slideCount) {
+ _.slideOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth) * -1;
+ verticalOffset = ((_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight) * -1;
+ } else {
+ _.slideOffset = ((_.slideCount % _.options.slidesToScroll) * _.slideWidth) * -1;
+ verticalOffset = ((_.slideCount % _.options.slidesToScroll) * verticalHeight) * -1;
+ }
+ }
+ }
+ } else {
+ if (slideIndex + _.options.slidesToShow > _.slideCount) {
+ _.slideOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * _.slideWidth;
+ verticalOffset = ((slideIndex + _.options.slidesToShow) - _.slideCount) * verticalHeight;
+ }
+ }
+
+ if (_.slideCount <= _.options.slidesToShow) {
+ _.slideOffset = 0;
+ verticalOffset = 0;
+ }
+
+ if (_.options.centerMode === true && _.options.infinite === true) {
+ _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth;
+ } else if (_.options.centerMode === true) {
+ _.slideOffset = 0;
+ _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2);
+ }
+
+ if (_.options.vertical === false) {
+ targetLeft = ((slideIndex * _.slideWidth) * -1) + _.slideOffset;
+ } else {
+ targetLeft = ((slideIndex * verticalHeight) * -1) + verticalOffset;
+ }
+
+ if (_.options.variableWidth === true) {
+
+ if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) {
+ targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
+ } else {
+ targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow);
+ }
+
+ targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
+
+ if (_.options.centerMode === true) {
+ if (_.options.infinite === false) {
+ targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex);
+ } else {
+ targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1);
+ }
+ targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0;
+ targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2;
+ }
+ }
+
+ return targetLeft;
+
+ };
+
+ Slick.prototype.getOption = Slick.prototype.slickGetOption = function(option) {
+
+ var _ = this;
+
+ return _.options[option];
+
+ };
+
+ Slick.prototype.getNavigableIndexes = function() {
+
+ var _ = this,
+ breakPoint = 0,
+ counter = 0,
+ indexes = [],
+ max;
+
+ if (_.options.infinite === false) {
+ max = _.slideCount - _.options.slidesToShow + 1;
+ if (_.options.centerMode === true) max = _.slideCount;
+ } else {
+ breakPoint = _.slideCount * -1;
+ counter = _.slideCount * -1;
+ max = _.slideCount * 2;
+ }
+
+ while (breakPoint < max) {
+ indexes.push(breakPoint);
+ breakPoint = counter + _.options.slidesToScroll;
+ counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow;
+ }
+
+ return indexes;
+
+ };
+
+ Slick.prototype.getSlick = function() {
+
+ return this;
+
+ };
+
+ Slick.prototype.getSlideCount = function() {
+
+ var _ = this,
+ slidesTraversed, swipedSlide, centerOffset;
+
+ centerOffset = _.options.centerMode === true ? _.slideWidth * Math.floor(_.options.slidesToShow / 2) : 0;
+
+ if (_.options.swipeToSlide === true) {
+ _.$slideTrack.find('.slick-slide').each(function(index, slide) {
+ if (slide.offsetLeft - centerOffset + ($(slide).outerWidth() / 2) > (_.swipeLeft * -1)) {
+ swipedSlide = slide;
+ return false;
+ }
+ });
+
+ slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1;
+
+ return slidesTraversed;
+
+ } else {
+ return _.options.slidesToScroll;
+ }
+
+ };
+
+ Slick.prototype.goTo = Slick.prototype.slickGoTo = function(slide, dontAnimate) {
+
+ var _ = this;
+
+ _.changeSlide({
+ data: {
+ message: 'index',
+ index: parseInt(slide)
+ }
+ }, dontAnimate);
+
+ };
+
+ Slick.prototype.init = function() {
+
+ var _ = this;
+
+ if (!$(_.$slider).hasClass('slick-initialized')) {
+
+ $(_.$slider).addClass('slick-initialized');
+ _.buildOut();
+ _.setProps();
+ _.startLoad();
+ _.loadSlider();
+ _.initializeEvents();
+ _.updateArrows();
+ _.updateDots();
+ }
+
+ _.$slider.trigger('init', [_]);
+
+ };
+
+ Slick.prototype.initArrowEvents = function() {
+
+ var _ = this;
+
+ if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
+ _.$prevArrow.on('click.slick', {
+ message: 'previous'
+ }, _.changeSlide);
+ _.$nextArrow.on('click.slick', {
+ message: 'next'
+ }, _.changeSlide);
+ }
+
+ };
+
+ Slick.prototype.initDotEvents = function() {
+
+ var _ = this;
+
+ if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
+ $('li', _.$dots).on('click.slick', {
+ message: 'index'
+ }, _.changeSlide);
+ }
+
+ if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.options.autoplay === true) {
+ $('li', _.$dots)
+ .on('mouseenter.slick', _.setPaused.bind(_, true))
+ .on('mouseleave.slick', _.setPaused.bind(_, false));
+ }
+
+ };
+
+ Slick.prototype.initializeEvents = function() {
+
+ var _ = this;
+
+ _.initArrowEvents();
+
+ _.initDotEvents();
+
+ _.$list.on('touchstart.slick mousedown.slick', {
+ action: 'start'
+ }, _.swipeHandler);
+ _.$list.on('touchmove.slick mousemove.slick', {
+ action: 'move'
+ }, _.swipeHandler);
+ _.$list.on('touchend.slick mouseup.slick', {
+ action: 'end'
+ }, _.swipeHandler);
+ _.$list.on('touchcancel.slick mouseleave.slick', {
+ action: 'end'
+ }, _.swipeHandler);
+
+ _.$list.on('click.slick', _.clickHandler);
+
+ if (_.options.autoplay === true) {
+ $(document).on(_.visibilityChange, _.visibility.bind(_));
+ }
+
+ _.$list.on('mouseenter.slick', _.setPaused.bind(_, true));
+ _.$list.on('mouseleave.slick', _.setPaused.bind(_, false));
+
+ if (_.options.accessibility === true) {
+ _.$list.on('keydown.slick', _.keyHandler);
+ }
+
+ if (_.options.focusOnSelect === true) {
+ $(_.$slideTrack).children().on('click.slick', _.selectHandler);
+ }
+
+ $(window).on('orientationchange.slick.slick-' + _.instanceUid, _.orientationChange.bind(_));
+
+ $(window).on('resize.slick.slick-' + _.instanceUid, _.resize.bind(_));
+
+ //$('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault);
+
+ $(window).on('load.slick.slick-' + _.instanceUid, _.setPosition);
+ $(document).on('ready.slick.slick-' + _.instanceUid, _.setPosition);
+
+ };
+
+ Slick.prototype.initUI = function() {
+
+ var _ = this;
+
+ if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
+
+ _.$prevArrow.show();
+ _.$nextArrow.show();
+
+ }
+
+ if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
+
+ _.$dots.show();
+
+ }
+
+ if (_.options.autoplay === true) {
+
+ _.autoPlay();
+
+ }
+
+ };
+
+ Slick.prototype.keyHandler = function(event) {
+
+ var _ = this;
+
+ if (event.keyCode === 37 && _.options.accessibility === true) {
+ _.changeSlide({
+ data: {
+ message: 'previous'
+ }
+ });
+ } else if (event.keyCode === 39 && _.options.accessibility === true) {
+ _.changeSlide({
+ data: {
+ message: 'next'
+ }
+ });
+ }
+
+ };
+
+ Slick.prototype.lazyLoad = function() {
+
+ var _ = this,
+ loadRange, cloneRange, rangeStart, rangeEnd;
+
+ function loadImages(imagesScope) {
+ $('img[data-lazy]', imagesScope).each(function() {
+ var image = $(this),
+ imageSource = $(this).attr('data-lazy');
+
+ image
+ .load(function() {
+ image.animate({
+ opacity: 1
+ }, 200);
+ })
+ .css({
+ opacity: 0
+ })
+ .attr('src', imageSource)
+ .removeAttr('data-lazy')
+ .removeClass('slick-loading');
+ });
+ }
+
+ if (_.options.centerMode === true) {
+ if (_.options.infinite === true) {
+ rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1);
+ rangeEnd = rangeStart + _.options.slidesToShow + 2;
+ } else {
+ rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1));
+ rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide;
+ }
+ } else {
+ rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide;
+ rangeEnd = rangeStart + _.options.slidesToShow;
+ if (_.options.fade === true) {
+ if (rangeStart > 0) rangeStart--;
+ if (rangeEnd <= _.slideCount) rangeEnd++;
+ }
+ }
+
+ loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd);
+ loadImages(loadRange);
+
+ if (_.slideCount <= _.options.slidesToShow) {
+ cloneRange = _.$slider.find('.slick-slide');
+ loadImages(cloneRange);
+ } else
+ if (_.currentSlide >= _.slideCount - _.options.slidesToShow) {
+ cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow);
+ loadImages(cloneRange);
+ } else if (_.currentSlide === 0) {
+ cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1);
+ loadImages(cloneRange);
+ }
+
+ };
+
+ Slick.prototype.loadSlider = function() {
+
+ var _ = this;
+
+ _.setPosition();
+
+ _.$slideTrack.css({
+ opacity: 1
+ });
+
+ _.$slider.removeClass('slick-loading');
+
+ _.initUI();
+
+ if (_.options.lazyLoad === 'progressive') {
+ _.progressiveLazyLoad();
+ }
+
+ };
+
+ Slick.prototype.next = Slick.prototype.slickNext = function() {
+
+ var _ = this;
+
+ _.changeSlide({
+ data: {
+ message: 'next'
+ }
+ });
+
+ };
+
+ Slick.prototype.orientationChange = function() {
+
+ var _ = this;
+
+ _.checkResponsive();
+ _.setPosition();
+
+ };
+
+ Slick.prototype.pause = Slick.prototype.slickPause = function() {
+
+ var _ = this;
+
+ _.autoPlayClear();
+ _.paused = true;
+
+ };
+
+ Slick.prototype.play = Slick.prototype.slickPlay = function() {
+
+ var _ = this;
+
+ _.paused = false;
+ _.autoPlay();
+
+ };
+
+ Slick.prototype.postSlide = function(index) {
+
+ var _ = this;
+
+ _.$slider.trigger('afterChange', [_, index]);
+
+ _.animating = false;
+
+ _.setPosition();
+
+ _.swipeLeft = null;
+
+ if (_.options.autoplay === true && _.paused === false) {
+ _.autoPlay();
+ }
+
+ };
+
+ Slick.prototype.prev = Slick.prototype.slickPrev = function() {
+
+ var _ = this;
+
+ _.changeSlide({
+ data: {
+ message: 'previous'
+ }
+ });
+
+ };
+
+ Slick.prototype.preventDefault = function(e) {
+ e.preventDefault();
+ };
+
+ Slick.prototype.progressiveLazyLoad = function() {
+
+ var _ = this,
+ imgCount, targetImage;
+
+ imgCount = $('img[data-lazy]', _.$slider).length;
+
+ if (imgCount > 0) {
+ targetImage = $('img[data-lazy]', _.$slider).first();
+ targetImage.attr('src', targetImage.attr('data-lazy')).removeClass('slick-loading').load(function() {
+ targetImage.removeAttr('data-lazy');
+ _.progressiveLazyLoad();
+
+ if (_.options.adaptiveHeight === true) {
+ _.setPosition();
+ }
+ })
+ .error(function() {
+ targetImage.removeAttr('data-lazy');
+ _.progressiveLazyLoad();
+ });
+ }
+
+ };
+
+ Slick.prototype.refresh = function() {
+
+ var _ = this,
+ currentSlide = _.currentSlide;
+
+ _.destroy();
+
+ $.extend(_, _.initials);
+
+ _.init();
+
+ _.changeSlide({
+ data: {
+ message: 'index',
+ index: currentSlide
+ }
+ }, true);
+
+ };
+
+ Slick.prototype.reinit = function() {
+
+ var _ = this;
+
+ _.$slides = _.$slideTrack.children(_.options.slide).addClass(
+ 'slick-slide');
+
+ _.slideCount = _.$slides.length;
+
+ if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) {
+ _.currentSlide = _.currentSlide - _.options.slidesToScroll;
+ }
+
+ if (_.slideCount <= _.options.slidesToShow) {
+ _.currentSlide = 0;
+ }
+
+ _.setProps();
+
+ _.setupInfinite();
+
+ _.buildArrows();
+
+ _.updateArrows();
+
+ _.initArrowEvents();
+
+ _.buildDots();
+
+ _.updateDots();
+
+ _.initDotEvents();
+
+ if (_.options.focusOnSelect === true) {
+ $(_.$slideTrack).children().on('click.slick', _.selectHandler);
+ }
+
+ _.setSlideClasses(0);
+
+ _.setPosition();
+
+ _.$slider.trigger('reInit', [_]);
+
+ };
+
+ Slick.prototype.resize = function() {
+
+ var _ = this;
+
+ if ($(window).width() !== _.windowWidth) {
+ clearTimeout(_.windowDelay);
+ _.windowDelay = window.setTimeout(function() {
+ _.windowWidth = $(window).width();
+ _.checkResponsive();
+ _.setPosition();
+ }, 50);
+ }
+ };
+
+ Slick.prototype.removeSlide = Slick.prototype.slickRemove = function(index, removeBefore, removeAll) {
+
+ var _ = this;
+
+ if (typeof(index) === 'boolean') {
+ removeBefore = index;
+ index = removeBefore === true ? 0 : _.slideCount - 1;
+ } else {
+ index = removeBefore === true ? --index : index;
+ }
+
+ if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) {
+ return false;
+ }
+
+ _.unload();
+
+ if (removeAll === true) {
+ _.$slideTrack.children().remove();
+ } else {
+ _.$slideTrack.children(this.options.slide).eq(index).remove();
+ }
+
+ _.$slides = _.$slideTrack.children(this.options.slide);
+
+ _.$slideTrack.children(this.options.slide).detach();
+
+ _.$slideTrack.append(_.$slides);
+
+ _.$slidesCache = _.$slides;
+
+ _.reinit();
+
+ };
+
+ Slick.prototype.setCSS = function(position) {
+
+ var _ = this,
+ positionProps = {},
+ x, y;
+
+ if (_.options.rtl === true) {
+ position = -position;
+ }
+ x = _.positionProp == 'left' ? Math.ceil(position) + 'px' : '0px';
+ y = _.positionProp == 'top' ? Math.ceil(position) + 'px' : '0px';
+
+ positionProps[_.positionProp] = position;
+
+ if (_.transformsEnabled === false) {
+ _.$slideTrack.css(positionProps);
+ } else {
+ positionProps = {};
+ if (_.cssTransitions === false) {
+ positionProps[_.animType] = 'translate(' + x + ', ' + y + ')';
+ _.$slideTrack.css(positionProps);
+ } else {
+ positionProps[_.animType] = 'translate3d(' + x + ', ' + y + ', 0px)';
+ _.$slideTrack.css(positionProps);
+ }
+ }
+
+ };
+
+ Slick.prototype.setDimensions = function() {
+
+ var _ = this;
+
+ if (_.options.vertical === false) {
+ if (_.options.centerMode === true) {
+ _.$list.css({
+ padding: ('0px ' + _.options.centerPadding)
+ });
+ }
+ } else {
+ _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow);
+ if (_.options.centerMode === true) {
+ _.$list.css({
+ padding: (_.options.centerPadding + ' 0px')
+ });
+ }
+ }
+
+ _.listWidth = _.$list.width();
+ _.listHeight = _.$list.height();
+
+
+ if (_.options.vertical === false && _.options.variableWidth === false) {
+ _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow);
+ _.$slideTrack.width(Math.ceil((_.slideWidth * _.$slideTrack.children('.slick-slide').length)));
+
+ } else if (_.options.variableWidth === true) {
+ _.$slideTrack.width(5000 * _.slideCount);
+ } else {
+ _.slideWidth = Math.ceil(_.listWidth);
+ _.$slideTrack.height(Math.ceil((_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)));
+ }
+
+ var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width();
+ if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset);
+
+ };
+
+ Slick.prototype.setFade = function() {
+
+ var _ = this,
+ targetLeft;
+
+ _.$slides.each(function(index, element) {
+ targetLeft = (_.slideWidth * index) * -1;
+ if (_.options.rtl === true) {
+ $(element).css({
+ position: 'relative',
+ right: targetLeft,
+ top: 0,
+ zIndex: 800,
+ opacity: 0
+ });
+ } else {
+ $(element).css({
+ position: 'relative',
+ left: targetLeft,
+ top: 0,
+ zIndex: 800,
+ opacity: 0
+ });
+ }
+ });
+
+ _.$slides.eq(_.currentSlide).css({
+ zIndex: 900,
+ opacity: 1
+ });
+
+ };
+
+ Slick.prototype.setHeight = function() {
+
+ var _ = this;
+
+ if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) {
+ var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true);
+ _.$list.css('height', targetHeight);
+ }
+
+ };
+
+ Slick.prototype.setOption = Slick.prototype.slickSetOption = function(option, value, refresh) {
+
+ var _ = this;
+ _.options[option] = value;
+
+ if (refresh === true) {
+ _.unload();
+ _.reinit();
+ }
+
+ };
+
+ Slick.prototype.setPosition = function() {
+
+ var _ = this;
+
+ _.setDimensions();
+
+ _.setHeight();
+
+ if (_.options.fade === false) {
+ _.setCSS(_.getLeft(_.currentSlide));
+ } else {
+ _.setFade();
+ }
+
+ _.$slider.trigger('setPosition', [_]);
+
+ };
+
+ Slick.prototype.setProps = function() {
+
+ var _ = this,
+ bodyStyle = document.body.style;
+
+ _.positionProp = _.options.vertical === true ? 'top' : 'left';
+
+ if (_.positionProp === 'top') {
+ _.$slider.addClass('slick-vertical');
+ } else {
+ _.$slider.removeClass('slick-vertical');
+ }
+
+ if (bodyStyle.WebkitTransition !== undefined ||
+ bodyStyle.MozTransition !== undefined ||
+ bodyStyle.msTransition !== undefined) {
+ if (_.options.useCSS === true) {
+ _.cssTransitions = true;
+ }
+ }
+
+ if (bodyStyle.OTransform !== undefined) {
+ _.animType = 'OTransform';
+ _.transformType = '-o-transform';
+ _.transitionType = 'OTransition';
+ if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
+ }
+ if (bodyStyle.MozTransform !== undefined) {
+ _.animType = 'MozTransform';
+ _.transformType = '-moz-transform';
+ _.transitionType = 'MozTransition';
+ if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false;
+ }
+ if (bodyStyle.webkitTransform !== undefined) {
+ _.animType = 'webkitTransform';
+ _.transformType = '-webkit-transform';
+ _.transitionType = 'webkitTransition';
+ if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false;
+ }
+ if (bodyStyle.msTransform !== undefined) {
+ _.animType = 'msTransform';
+ _.transformType = '-ms-transform';
+ _.transitionType = 'msTransition';
+ if (bodyStyle.msTransform === undefined) _.animType = false;
+ }
+ if (bodyStyle.transform !== undefined && _.animType !== false) {
+ _.animType = 'transform';
+ _.transformType = 'transform';
+ _.transitionType = 'transition';
+ }
+ _.transformsEnabled = (_.animType !== null && _.animType !== false);
+
+ };
+
+
+ Slick.prototype.setSlideClasses = function(index) {
+
+ var _ = this,
+ centerOffset, allSlides, indexOffset, remainder;
+
+ _.$slider.find('.slick-slide').removeClass('slick-active').attr('aria-hidden', 'true').removeClass('slick-center');
+ allSlides = _.$slider.find('.slick-slide');
+
+ if (_.options.centerMode === true) {
+
+ centerOffset = Math.floor(_.options.slidesToShow / 2);
+
+ if (_.options.infinite === true) {
+
+ if (index >= centerOffset && index <= (_.slideCount - 1) - centerOffset) {
+ _.$slides.slice(index - centerOffset, index + centerOffset + 1).addClass('slick-active').attr('aria-hidden', 'false');
+ } else {
+ indexOffset = _.options.slidesToShow + index;
+ allSlides.slice(indexOffset - centerOffset + 1, indexOffset + centerOffset + 2).addClass('slick-active').attr('aria-hidden', 'false');
+ }
+
+ if (index === 0) {
+ allSlides.eq(allSlides.length - 1 - _.options.slidesToShow).addClass('slick-center');
+ } else if (index === _.slideCount - 1) {
+ allSlides.eq(_.options.slidesToShow).addClass('slick-center');
+ }
+
+ }
+
+ _.$slides.eq(index).addClass('slick-center');
+
+ } else {
+
+ if (index >= 0 && index <= (_.slideCount - _.options.slidesToShow)) {
+ _.$slides.slice(index, index + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false');
+ } else if (allSlides.length <= _.options.slidesToShow) {
+ allSlides.addClass('slick-active').attr('aria-hidden', 'false');
+ } else {
+ remainder = _.slideCount % _.options.slidesToShow;
+ indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index;
+ if (_.options.slidesToShow == _.options.slidesToScroll && (_.slideCount - index) < _.options.slidesToShow) {
+ allSlides.slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder).addClass('slick-active').attr('aria-hidden', 'false');
+ } else {
+ allSlides.slice(indexOffset, indexOffset + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false');
+ }
+ }
+
+ }
+
+ if (_.options.lazyLoad === 'ondemand') {
+ _.lazyLoad();
+ }
+
+ };
+
+ Slick.prototype.setupInfinite = function() {
+
+ var _ = this,
+ i, slideIndex, infiniteCount;
+
+ if (_.options.fade === true) {
+ _.options.centerMode = false;
+ }
+
+ if (_.options.infinite === true && _.options.fade === false) {
+
+ slideIndex = null;
+
+ if (_.slideCount > _.options.slidesToShow) {
+
+ if (_.options.centerMode === true) {
+ infiniteCount = _.options.slidesToShow + 1;
+ } else {
+ infiniteCount = _.options.slidesToShow;
+ }
+
+ for (i = _.slideCount; i > (_.slideCount -
+ infiniteCount); i -= 1) {
+ slideIndex = i - 1;
+ $(_.$slides[slideIndex]).clone(true).attr('id', '')
+ .attr('data-slick-index', slideIndex - _.slideCount)
+ .prependTo(_.$slideTrack).addClass('slick-cloned');
+ }
+ for (i = 0; i < infiniteCount; i += 1) {
+ slideIndex = i;
+ $(_.$slides[slideIndex]).clone(true).attr('id', '')
+ .attr('data-slick-index', slideIndex + _.slideCount)
+ .appendTo(_.$slideTrack).addClass('slick-cloned');
+ }
+ _.$slideTrack.find('.slick-cloned').find('[id]').each(function() {
+ $(this).attr('id', '');
+ });
+
+ }
+
+ }
+
+ };
+
+ Slick.prototype.setPaused = function(paused) {
+
+ var _ = this;
+
+ if (_.options.autoplay === true && _.options.pauseOnHover === true) {
+ _.paused = paused;
+ _.autoPlayClear();
+ }
+ };
+
+ Slick.prototype.selectHandler = function(event) {
+
+ var _ = this;
+
+ var targetElement = $(event.target).is('.slick-slide') ?
+ $(event.target) :
+ $(event.target).parents('.slick-slide');
+
+ var index = parseInt(targetElement.attr('data-slick-index'));
+
+ if (!index) index = 0;
+
+ if (_.slideCount <= _.options.slidesToShow) {
+ _.$slider.find('.slick-slide').removeClass('slick-active').attr('aria-hidden', 'true');
+ _.$slides.eq(index).addClass('slick-active').attr("aria-hidden", "false");
+ if (_.options.centerMode === true) {
+ _.$slider.find('.slick-slide').removeClass('slick-center');
+ _.$slides.eq(index).addClass('slick-center');
+ }
+ _.asNavFor(index);
+ return;
+ }
+ _.slideHandler(index);
+
+ };
+
+ Slick.prototype.slideHandler = function(index, sync, dontAnimate) {
+
+ var targetSlide, animSlide, oldSlide, slideLeft, targetLeft = null,
+ _ = this;
+
+ sync = sync || false;
+
+ if (_.animating === true && _.options.waitForAnimate === true) {
+ return;
+ }
+
+ if (_.options.fade === true && _.currentSlide === index) {
+ return;
+ }
+
+ if (_.slideCount <= _.options.slidesToShow) {
+ return;
+ }
+
+ if (sync === false) {
+ _.asNavFor(index);
+ }
+
+ targetSlide = index;
+ targetLeft = _.getLeft(targetSlide);
+ slideLeft = _.getLeft(_.currentSlide);
+
+ _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft;
+
+ if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) {
+ if (_.options.fade === false) {
+ targetSlide = _.currentSlide;
+ if (dontAnimate !== true) {
+ _.animateSlide(slideLeft, function() {
+ _.postSlide(targetSlide);
+ });
+ } else {
+ _.postSlide(targetSlide);
+ }
+ }
+ return;
+ } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > (_.slideCount - _.options.slidesToScroll))) {
+ if (_.options.fade === false) {
+ targetSlide = _.currentSlide;
+ if (dontAnimate !== true) {
+ _.animateSlide(slideLeft, function() {
+ _.postSlide(targetSlide);
+ });
+ } else {
+ _.postSlide(targetSlide);
+ }
+ }
+ return;
+ }
+
+ if (_.options.autoplay === true) {
+ clearInterval(_.autoPlayTimer);
+ }
+
+ if (targetSlide < 0) {
+ if (_.slideCount % _.options.slidesToScroll !== 0) {
+ animSlide = _.slideCount - (_.slideCount % _.options.slidesToScroll);
+ } else {
+ animSlide = _.slideCount + targetSlide;
+ }
+ } else if (targetSlide >= _.slideCount) {
+ if (_.slideCount % _.options.slidesToScroll !== 0) {
+ animSlide = 0;
+ } else {
+ animSlide = targetSlide - _.slideCount;
+ }
+ } else {
+ animSlide = targetSlide;
+ }
+
+ _.animating = true;
+
+ _.$slider.trigger("beforeChange", [_, _.currentSlide, animSlide]);
+
+ oldSlide = _.currentSlide;
+ _.currentSlide = animSlide;
+
+ _.setSlideClasses(_.currentSlide);
+
+ _.updateDots();
+ _.updateArrows();
+
+ if (_.options.fade === true) {
+ if (dontAnimate !== true) {
+ _.fadeSlide(animSlide, function() {
+ _.postSlide(animSlide);
+ });
+ } else {
+ _.postSlide(animSlide);
+ }
+ _.animateHeight();
+ return;
+ }
+
+ if (dontAnimate !== true) {
+ _.animateSlide(targetLeft, function() {
+ _.postSlide(animSlide);
+ });
+ } else {
+ _.postSlide(animSlide);
+ }
+
+ };
+
+ Slick.prototype.startLoad = function() {
+
+ var _ = this;
+
+ if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) {
+
+ _.$prevArrow.hide();
+ _.$nextArrow.hide();
+
+ }
+
+ if (_.options.dots === true && _.slideCount > _.options.slidesToShow) {
+
+ _.$dots.hide();
+
+ }
+
+ _.$slider.addClass('slick-loading');
+
+ };
+
+ Slick.prototype.swipeDirection = function() {
+
+ var xDist, yDist, r, swipeAngle, _ = this;
+
+ xDist = _.touchObject.startX - _.touchObject.curX;
+ yDist = _.touchObject.startY - _.touchObject.curY;
+ r = Math.atan2(yDist, xDist);
+
+ swipeAngle = Math.round(r * 180 / Math.PI);
+ if (swipeAngle < 0) {
+ swipeAngle = 360 - Math.abs(swipeAngle);
+ }
+
+ if ((swipeAngle <= 45) && (swipeAngle >= 0)) {
+ return (_.options.rtl === false ? 'left' : 'right');
+ }
+ if ((swipeAngle <= 360) && (swipeAngle >= 315)) {
+ return (_.options.rtl === false ? 'left' : 'right');
+ }
+ if ((swipeAngle >= 135) && (swipeAngle <= 225)) {
+ return (_.options.rtl === false ? 'right' : 'left');
+ }
+ if (_.options.verticalScrolling === true) {
+ if ((swipeAngle >= 35) && (swipeAngle <= 135)) {
+ return 'left';
+ } else {
+ return 'right';
+ }
+ }
+
+ return 'vertical';
+
+ };
+
+ Slick.prototype.swipeEnd = function(event) {
+
+ var _ = this,
+ slideCount;
+
+ _.dragging = false;
+
+ _.shouldClick = (_.touchObject.swipeLength > 10) ? false : true;
+
+ if (_.touchObject.curX === undefined) {
+ return false;
+ }
+
+ if (_.touchObject.edgeHit === true) {
+ _.$slider.trigger("edge", [_, _.swipeDirection()]);
+ }
+
+ if (_.touchObject.swipeLength >= _.touchObject.minSwipe) {
+
+ switch (_.swipeDirection()) {
+ case 'left':
+ slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide + _.getSlideCount()) : _.currentSlide + _.getSlideCount();
+ _.slideHandler(slideCount);
+ _.currentDirection = 0;
+ _.touchObject = {};
+ _.$slider.trigger("swipe", [_, "left"]);
+ break;
+
+ case 'right':
+ slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide - _.getSlideCount()) : _.currentSlide - _.getSlideCount();
+ _.slideHandler(slideCount);
+ _.currentDirection = 1;
+ _.touchObject = {};
+ _.$slider.trigger("swipe", [_, "right"]);
+ break;
+ }
+ } else {
+ if (_.touchObject.startX !== _.touchObject.curX) {
+ _.slideHandler(_.currentSlide);
+ _.touchObject = {};
+ }
+ }
+
+ };
+
+ Slick.prototype.swipeHandler = function(event) {
+
+ var _ = this;
+
+ if ((_.options.swipe === false) || ('ontouchend' in document && _.options.swipe === false)) {
+ return;
+ } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) {
+ return;
+ }
+
+ _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ?
+ event.originalEvent.touches.length : 1;
+
+ _.touchObject.minSwipe = _.listWidth / _.options
+ .touchThreshold;
+
+ if (_.options.verticalScrolling === true) {
+ _.touchObject.minSwipe = _.listHeight / _.options
+ .touchThreshold;
+ }
+
+ switch (event.data.action) {
+
+ case 'start':
+ _.swipeStart(event);
+ break;
+
+ case 'move':
+ _.swipeMove(event);
+ break;
+
+ case 'end':
+ _.swipeEnd(event);
+ break;
+
+ }
+
+ };
+
+ Slick.prototype.swipeMove = function(event) {
+
+ var _ = this,
+ edgeWasHit = false,
+ curLeft, swipeDirection, swipeLength, positionOffset, touches;
+
+ touches = event.originalEvent !== undefined ? event.originalEvent.touches : null;
+
+ if (!_.dragging || touches && touches.length !== 1) {
+ return false;
+ }
+
+ curLeft = _.getLeft(_.currentSlide);
+
+ _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX;
+ _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY;
+
+ _.touchObject.swipeLength = Math.round(Math.sqrt(
+ Math.pow(_.touchObject.curX - _.touchObject.startX, 2)));
+
+ if (_.options.verticalScrolling === true) {
+ _.touchObject.swipeLength = Math.round(Math.sqrt(
+ Math.pow(_.touchObject.curY - _.touchObject.startY, 2)));
+ }
+
+ swipeDirection = _.swipeDirection();
+
+ if (swipeDirection === 'vertical') {
+ return;
+ }
+
+ if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) {
+ event.preventDefault();
+ }
+
+ positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1);
+ if (_.options.verticalScrolling === true) {
+ positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1;
+ }
+
+
+ swipeLength = _.touchObject.swipeLength;
+
+ _.touchObject.edgeHit = false;
+
+ if (_.options.infinite === false) {
+ if ((_.currentSlide === 0 && swipeDirection === "right") || (_.currentSlide >= _.getDotCount() && swipeDirection === "left")) {
+ swipeLength = _.touchObject.swipeLength * _.options.edgeFriction;
+ _.touchObject.edgeHit = true;
+ }
+ }
+
+ if (_.options.vertical === false) {
+ _.swipeLeft = curLeft + swipeLength * positionOffset;
+ } else {
+ _.swipeLeft = curLeft + (swipeLength * (_.$list.height() / _.listWidth)) * positionOffset;
+ }
+ if (_.options.verticalScrolling === true) {
+ _.swipeLeft = curLeft + swipeLength * positionOffset;
+ }
+
+ if (_.options.fade === true || _.options.touchMove === false) {
+ return false;
+ }
+
+ if (_.animating === true) {
+ _.swipeLeft = null;
+ return false;
+ }
+
+ _.setCSS(_.swipeLeft);
+
+ };
+
+ Slick.prototype.swipeStart = function(event) {
+
+ var _ = this,
+ touches;
+
+ if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) {
+ _.touchObject = {};
+ return false;
+ }
+
+ if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) {
+ touches = event.originalEvent.touches[0];
+ }
+
+ _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX;
+ _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY;
+
+ _.dragging = true;
+
+ };
+
+ Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function() {
+
+ var _ = this;
+
+ if (_.$slidesCache !== null) {
+
+ _.unload();
+
+ _.$slideTrack.children(this.options.slide).detach();
+
+ _.$slidesCache.appendTo(_.$slideTrack);
+
+ _.reinit();
+
+ }
+
+ };
+
+ Slick.prototype.unload = function() {
+
+ var _ = this;
+
+ $('.slick-cloned', _.$slider).remove();
+ if (_.$dots) {
+ _.$dots.remove();
+ }
+ if (_.$prevArrow && (typeof _.options.prevArrow !== 'object')) {
+ _.$prevArrow.remove();
+ }
+ if (_.$nextArrow && (typeof _.options.nextArrow !== 'object')) {
+ _.$nextArrow.remove();
+ }
+ _.$slides.removeClass('slick-slide slick-active slick-visible').attr("aria-hidden", "true").css('width', '');
+
+ };
+
+ Slick.prototype.unslick = function() {
+
+ var _ = this;
+ _.destroy();
+
+ };
+
+ Slick.prototype.updateArrows = function() {
+
+ var _ = this,
+ centerOffset;
+
+ centerOffset = Math.floor(_.options.slidesToShow / 2);
+
+ if (_.options.arrows === true && _.options.infinite !==
+ true && _.slideCount > _.options.slidesToShow) {
+ _.$prevArrow.removeClass('slick-disabled');
+ _.$nextArrow.removeClass('slick-disabled');
+ if (_.currentSlide === 0) {
+ _.$prevArrow.addClass('slick-disabled');
+ _.$nextArrow.removeClass('slick-disabled');
+ } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) {
+ _.$nextArrow.addClass('slick-disabled');
+ _.$prevArrow.removeClass('slick-disabled');
+ } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) {
+ _.$nextArrow.addClass('slick-disabled');
+ _.$prevArrow.removeClass('slick-disabled');
+ }
+ }
+
+ };
+
+ Slick.prototype.updateDots = function() {
+
+ var _ = this;
+
+ if (_.$dots !== null) {
+
+ _.$dots.find('li').removeClass('slick-active').attr("aria-hidden", "true");
+ _.$dots.find('li').eq(Math.floor(_.currentSlide / _.options.slidesToScroll)).addClass('slick-active').attr("aria-hidden", "false");
+
+ }
+
+ };
+
+ Slick.prototype.visibility = function() {
+
+ var _ = this;
+
+ if (document[_.hidden]) {
+ _.paused = true;
+ _.autoPlayClear();
+ } else {
+ _.paused = false;
+ _.autoPlay();
+ }
+
+ };
+
+ $.fn.slick = function() {
+ var _ = this,
+ opt = arguments[0],
+ args = Array.prototype.slice.call(arguments, 1),
+ l = _.length,
+ i = 0,
+ ret;
+ for (i; i < l; i++) {
+ if (typeof opt == 'object' || typeof opt == 'undefined')
+ _[i].slick = new Slick(_[i], opt);
+ else
+ ret = _[i].slick[opt].apply(_[i].slick, args);
+ if (typeof ret != 'undefined') return ret;
+ }
+ return _;
+ };
+
+}));
diff --git a/public/proposal-app b/public/proposal-app
new file mode 160000
index 0000000..a86d8e6
--- /dev/null
+++ b/public/proposal-app
@@ -0,0 +1 @@
+Subproject commit a86d8e6f498ef8a93411a287c1e772928fca369b
diff --git a/public/stylesheets/block-store.css b/public/stylesheets/block-store.css
new file mode 100644
index 0000000..40ccbad
--- /dev/null
+++ b/public/stylesheets/block-store.css
@@ -0,0 +1,164 @@
+/************************************************
+ * the handles to where you can drag the blocks *
+ ************************************************/
+
+.block-target {
+ padding: 2px;
+ background: #81FF9B;
+ margin-bottom: 5px;
+ opacity: 0.8;
+ visibility: hidden;
+ height: 0;
+ font-size: 20px;
+ font-weight: bold;
+ color: white;
+ text-align: center;
+}
+.block-target-hover {
+ border: 1px solid #000;
+ box-shadow: 0 0 15px #888 inset;
+ opacity: 1;
+}
+.shadow .block-target-hover, .shadow .block-target-active {
+ visibility: visible;
+ height: 30px;
+}
+
+/************************************************
+ * block store styles
+ ************************************************/
+#block-store #block-store-filter {
+ float: right;
+ margin-bottom: 8px;
+}
+#block-store #block-types {
+ clear: both;
+}
+#block-store {
+ display: none;
+}
+#content #block-store .block-type {
+ position: relative;
+ border: 0px solid #AAA;
+ margin: 4px 0;
+ padding: 0;
+ text-align: center;
+ height: auto;
+ float: none;
+ display: inline-block;
+ overflow: hidden;
+ width: 112px;
+ cursor: move;
+ vertical-align: top;
+}
+#block-store .block-type:hover {
+ box-shadow: 0px 0px 0px 2px #FFF, 0px 0px 0px 2px #FFF, 0px 0px 10px rgba(0,0,0,0.6);
+ outline: none;
+}
+#block-store .block-type:hover .button-bar {
+ display: inline;
+}
+#block-store .button-bar {
+ margin: 0;
+ display: none;
+ position: absolute;
+ right: 0%;
+ border: 0px solid #AAA;
+ margin: 0px;
+ padding: 0px;
+}
+#block-store .button-bar .icon-help {
+ font-size: 0;
+ width: 0;
+}
+
+#block-store .block-type .block-type-icon {
+ margin-right: auto;
+ margin-left: auto;
+}
+#block-store-draggables .block-type, #block-store-draggables .block, #block-store-draggables .block-type-icon, #block-store-draggables .ui-draggable-dragging {
+ display: inline-block;
+ height: auto;
+ z-index: 100;
+}
+#block-store-draggables .block-type .button-bar {
+ visibility: hidden;
+}
+#box-organizer.shadow .block {
+ opacity: 0.2;
+}
+#box-organizer.shadow .ui-draggable-dragging {
+ opacity: 1;
+ border: 5px solid red;
+ box-shadow: 0px 0px 10px 2px red, inset 0px 0px 10px 2px red;
+}
+#box-organizer .block {
+ transition: opacity 0.3s ease-in-out;
+}
+
+/************************************************
+ * block info styles
+ ************************************************/
+#block-info-container {
+ width: 770px;
+ padding: 15px;
+ color: #444;
+}
+
+#block-info-container #block-info-icon {
+ float: left;
+ padding-right: 10px;
+}
+
+#block-info-container #block-info-header {
+ float: left;
+}
+
+#block-info-container #block-info-header .block-type-icon{
+ float: left;
+}
+
+#block-info-container #block-info-header h1 {
+ margin: 0;
+ font-weight: normal;
+ font-family: "Arial Black", Liberation Sans, Arial, sans-serif;
+ margin-left: 5px;
+ white-space: nowrap;
+}
+
+#block-info-container #block-info-header p{
+ margin-left: 55px;
+}
+
+
+#block-info-container h2 {
+ margin: 0;
+ margin-top: 10px;
+ font-weight: normal;
+ font-family: "Arial Black", Liberation Sans, Arial, sans-serif;
+}
+
+#block-info-container p {
+ margin: 0;
+}
+
+#block-info-images {
+ clear: both;
+ overflow-x: auto;
+ padding-top: 15px;
+}
+
+#block-info-images ul{
+ margin: 0px;
+ padding: 0px;
+}
+#block-info-images li{
+ list-style: none;
+ display: inline;
+
+}
+
+
+#block-info-description {
+ margin-top: 20px;
+}
diff --git a/public/stylesheets/slick-theme.css b/public/stylesheets/slick-theme.css
new file mode 100644
index 0000000..01623d3
--- /dev/null
+++ b/public/stylesheets/slick-theme.css
@@ -0,0 +1,201 @@
+@charset 'UTF-8';
+/* Slider */
+.slick-loading .slick-list
+{
+ background: #fff url('/images/loading.gif') center center no-repeat;
+}
+
+/* Icons */
+@font-face
+{
+ font-family: 'slick';
+ font-weight: normal;
+ font-style: normal;
+
+ src: url('/fonts/slick.eot');
+ src: url('/fonts/slick.eot?#iefix') format('embedded-opentype'), url('/fonts/slick.woff') format('woff'), url('/fonts/slick.ttf') format('truetype'), url('/fonts/slick.svg#slick') format('svg');
+}
+/* Arrows */
+.slick-prev,
+.slick-next
+{
+ font-size: 0;
+ line-height: 0;
+
+ position: absolute;
+ top: 50%;
+
+ display: block;
+
+ width: 40px;
+ height: 40px;
+ margin-top: -10px;
+ padding: 0;
+
+ cursor: pointer;
+
+ color: transparent;
+ border: none;
+ outline: none;
+ background: transparent;
+}
+.slick-prev:hover,
+.slick-prev:focus,
+.slick-next:hover,
+.slick-next:focus
+{
+ color: transparent;
+ outline: none;
+ background: transparent;
+}
+.slick-prev:hover:before,
+.slick-prev:focus:before,
+.slick-next:hover:before,
+.slick-next:focus:before
+{
+ opacity: 1;
+}
+.slick-prev.slick-disabled:before,
+.slick-next.slick-disabled:before
+{
+ opacity: .25;
+}
+
+.slick-prev:before,
+.slick-next:before
+{
+ font-family: 'slick';
+ font-size: 30px;
+ line-height: 1;
+
+ opacity: .75;
+ color: rgb(174, 174, 174);
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.slick-prev
+{
+ left: -10px;
+}
+[dir='rtl'] .slick-prev
+{
+ right: -10px;
+ left: auto;
+}
+.slick-prev:before
+{
+ content: '←';
+}
+[dir='rtl'] .slick-prev:before
+{
+ content: '→';
+}
+
+.slick-next
+{
+ right: -10px;
+}
+[dir='rtl'] .slick-next
+{
+ right: auto;
+ left: -10px;
+}
+.slick-next:before
+{
+ content: '→';
+}
+[dir='rtl'] .slick-next:before
+{
+ content: '←';
+}
+
+/* Dots */
+.slick-slider
+{
+ margin-bottom: 40px;
+}
+
+.slick-dots
+{
+ position: absolute;
+ bottom: -40px;
+
+ display: block;
+
+ width: 100%;
+ padding: 0;
+
+ list-style: none;
+
+ text-align: center;
+}
+.slick-dots li
+{
+ position: relative;
+
+ display: inline-block;
+
+ width: 20px;
+ height: 20px;
+ margin: 0 5px;
+ padding: 0;
+
+ cursor: pointer;
+}
+.slick-dots li button
+{
+ font-size: 0;
+ line-height: 0;
+
+ display: block;
+
+ width: 20px;
+ height: 20px;
+ padding: 5px;
+
+ cursor: pointer;
+
+ color: transparent;
+ border: 0;
+ outline: none;
+ background: transparent;
+}
+.slick-dots li button:hover,
+.slick-dots li button:focus
+{
+ outline: none;
+}
+.slick-dots li button:hover:before,
+.slick-dots li button:focus:before
+{
+ opacity: 1;
+}
+.slick-dots li button:before
+{
+ font-family: 'slick';
+ font-size: 6px;
+ line-height: 20px;
+
+ position: absolute;
+ top: 0;
+ left: 0;
+
+ width: 20px;
+ height: 20px;
+
+ content: '•';
+ text-align: center;
+
+ opacity: .25;
+ color: black;
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.slick-dots li.slick-active button:before
+{
+ opacity: .75;
+ color: black;
+}
diff --git a/public/stylesheets/slick.css b/public/stylesheets/slick.css
new file mode 100644
index 0000000..59119f4
--- /dev/null
+++ b/public/stylesheets/slick.css
@@ -0,0 +1,116 @@
+/* Slider */
+.slick-slider
+{
+ position: relative;
+
+ display: block;
+
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+
+ -webkit-touch-callout: none;
+ -khtml-user-select: none;
+ -ms-touch-action: pan-y;
+ touch-action: pan-y;
+ -webkit-tap-highlight-color: transparent;
+}
+
+.slick-list
+{
+ position: relative;
+
+ display: block;
+ overflow: hidden;
+
+ margin: 0;
+ padding: 0;
+}
+.slick-list:focus
+{
+ outline: none;
+}
+.slick-list.dragging
+{
+ cursor: pointer;
+ cursor: hand;
+}
+
+.slick-slider .slick-track,
+.slick-slider .slick-list
+{
+ -webkit-transform: translate3d(0, 0, 0);
+ -moz-transform: translate3d(0, 0, 0);
+ -ms-transform: translate3d(0, 0, 0);
+ -o-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+.slick-track
+{
+ position: relative;
+ top: 0;
+ left: 0;
+
+ display: block;
+}
+.slick-track:before,
+.slick-track:after
+{
+ display: table;
+
+ content: '';
+}
+.slick-track:after
+{
+ clear: both;
+}
+.slick-loading .slick-track
+{
+ visibility: hidden;
+}
+
+.slick-slide
+{
+ display: none;
+ float: left;
+
+ height: 100%;
+ min-height: 1px;
+}
+[dir='rtl'] .slick-slide
+{
+ float: right;
+}
+.slick-slide img
+{
+ display: block;
+}
+.slick-slide.slick-loading img
+{
+ display: none;
+}
+.slick-slide.dragging img
+{
+ pointer-events: none;
+}
+.slick-initialized .slick-slide
+{
+ display: block;
+}
+.slick-loading .slick-slide
+{
+ visibility: hidden;
+}
+.slick-vertical .slick-slide
+{
+ display: block;
+
+ height: auto;
+
+ border: 1px solid transparent;
+}
\ No newline at end of file
diff --git a/test/functional/environment_design_controller_test.rb b/test/functional/environment_design_controller_test.rb
index f4962d7..0bea99e 100644
--- a/test/functional/environment_design_controller_test.rb
+++ b/test/functional/environment_design_controller_test.rb
@@ -165,14 +165,6 @@ class EnvironmentDesignControllerTest < ActionController::TestCase
assert_tag :tag => 'a', :attributes => {:href => '/admin'}, :child => {:tag => 'span', :content => "Back to control panel"}
end
- should 'render add a new block functionality' do
- login_as(create_admin_user(Environment.default))
- get :add_block
-
- assert_response :success
- assert_template 'add_block'
- end
-
should 'a environment block plugin add new blocks for environments' do
class CustomBlock1 < Block; end;
@@ -212,7 +204,7 @@ class EnvironmentDesignControllerTest < ActionController::TestCase
refute @controller.available_blocks.include?(CustomBlock4)
end
- should 'a block plugin with center position add new blocks only in this position' do
+ should 'a block plugin add new blocks' do
class CustomBlock1 < Block; end;
class CustomBlock2 < Block; end;
class CustomBlock3 < Block; end;
@@ -241,61 +233,10 @@ class EnvironmentDesignControllerTest < ActionController::TestCase
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
login_as(create_admin_user(Environment.default))
- get :add_block
-
- assert_response :success
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock5)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock6)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock7)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock8)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock9)
- end
-
- should 'a block plugin with side position add new blocks only in this position' do
- class CustomBlock1 < Block; end;
- class CustomBlock2 < Block; end;
- class CustomBlock3 < Block; end;
- class CustomBlock4 < Block; end;
- class CustomBlock5 < Block; end;
- class CustomBlock6 < Block; end;
- class CustomBlock7 < Block; end;
- class CustomBlock8 < Block; end;
- class CustomBlock9 < Block; end;
-
- class TestBlockPlugin < Noosfero::Plugin
- def self.extra_blocks
- {
- CustomBlock1 => {:type => Environment, :position => [1]},
- CustomBlock2 => {:type => Environment, :position => 1},
- CustomBlock3 => {:type => Environment, :position => '1'},
- CustomBlock4 => {:type => Environment, :position => [2]},
- CustomBlock5 => {:type => Environment, :position => 2},
- CustomBlock6 => {:type => Environment, :position => '2'},
- CustomBlock7 => {:type => Environment, :position => [3]},
- CustomBlock8 => {:type => Environment, :position => 3},
- CustomBlock9 => {:type => Environment, :position => '3'},
- }
- end
- end
-
- Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
- login_as(create_admin_user(Environment.default))
- get :add_block
+ get :index
assert_response :success
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock1)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock2)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock3)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock4)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock9)
+ (1..9).each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }}
end
should 'a block plugin cannot be listed for unspecified types' do
@@ -325,17 +266,11 @@ class EnvironmentDesignControllerTest < ActionController::TestCase
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
login_as(create_admin_user(Environment.default))
- get :add_block
+ get :index
assert_response :success
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
+ [4, 8].each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }}
+ [1, 2, 3, 5, 6, 7].each {|i| assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => "EnvironmentDesignControllerTest::CustomBlock#{i}" }}
end
should 'clone a block' do
diff --git a/test/functional/profile_design_controller_test.rb b/test/functional/profile_design_controller_test.rb
index 2d90e1b..692ce46 100644
--- a/test/functional/profile_design_controller_test.rb
+++ b/test/functional/profile_design_controller_test.rb
@@ -169,7 +169,7 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
end
- should 'a block plugin with center position add new blocks only in this position' do
+ should 'a block plugin add new blocks' do
class CustomBlock1 < Block; end;
class CustomBlock2 < Block; end;
class CustomBlock3 < Block; end;
@@ -197,60 +197,10 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
- get :add_block, :profile => 'designtestuser'
- assert_response :success
-
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock5)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock6)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock7)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock8)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock9)
- end
-
- should 'a block plugin with side position add new blocks only in this position' do
- class CustomBlock1 < Block; end;
- class CustomBlock2 < Block; end;
- class CustomBlock3 < Block; end;
- class CustomBlock4 < Block; end;
- class CustomBlock5 < Block; end;
- class CustomBlock6 < Block; end;
- class CustomBlock7 < Block; end;
- class CustomBlock8 < Block; end;
- class CustomBlock9 < Block; end;
-
- class TestBlockPlugin < Noosfero::Plugin
- def self.extra_blocks
- {
- CustomBlock1 => {:type => Person, :position => [1]},
- CustomBlock2 => {:type => Person, :position => 1},
- CustomBlock3 => {:type => Person, :position => '1'},
- CustomBlock4 => {:type => Person, :position => [2]},
- CustomBlock5 => {:type => Person, :position => 2},
- CustomBlock6 => {:type => Person, :position => '2'},
- CustomBlock7 => {:type => Person, :position => [3]},
- CustomBlock8 => {:type => Person, :position => 3},
- CustomBlock9 => {:type => Person, :position => '3'},
- }
- end
- end
-
- Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
- get :add_block, :profile => 'designtestuser'
+ get :index, :profile => 'designtestuser'
assert_response :success
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock1)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock2)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock3)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock4)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock9)
+ (1..9).each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" } }
end
should 'a block plugin cannot be listed for unspecified types' do
@@ -279,17 +229,11 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
- get :add_block, :profile => 'designtestuser'
+ get :index, :profile => 'designtestuser'
assert_response :success
- assert @controller.instance_variable_get('@center_block_types').include?(CustomBlock1)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock2)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock3)
- refute @controller.instance_variable_get('@center_block_types').include?(CustomBlock4)
- assert @controller.instance_variable_get('@side_block_types').include?(CustomBlock5)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock6)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock7)
- refute @controller.instance_variable_get('@side_block_types').include?(CustomBlock8)
+ [1, 5].each {|i| assert_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" }}
+ [2, 3, 4, 6, 7, 8].each {|i| assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => "ProfileDesignControllerTest::CustomBlock#{i}" }}
end
should 'not edit main block with never option' do
@@ -339,15 +283,9 @@ class ProfileDesignControllerTest < ActionController::TestCase
# BEGIN - tests for ProfileDesignController features
######################################################
- should 'display popup for adding a new block' do
- get :add_block, :profile => 'designtestuser'
- assert_response :success
- assert_no_tag :tag => 'body' # e.g. no layout
- end
-
should 'actually add a new block' do
assert_difference 'Block.count' do
- post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => RecentDocumentsBlock.name
+ post :move_block, :profile => 'designtestuser', :target => "end-of-box-#{@box1.id}", :type => RecentDocumentsBlock.name
assert_redirected_to :action => 'index'
end
end
@@ -355,7 +293,7 @@ class ProfileDesignControllerTest < ActionController::TestCase
should 'not allow to create unknown types' do
assert_no_difference 'Block.count' do
assert_raise ArgumentError do
- post :add_block, :profile => 'designtestuser', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite"
+ post :move_block, :profile => 'designtestuser', :box_id => @box1.id, :type => "PleaseLetMeCrackYourSite"
end
end
end
@@ -424,6 +362,12 @@ class ProfileDesignControllerTest < ActionController::TestCase
assert_tag :tag => 'a', :content => 'Back to control panel'
end
+ should 'display avaliable blocks in alphabetical order' do
+ @controller.stubs(:available_blocks).returns([TagsBlock, ArticleBlock])
+ get :index, :profile => 'designtestuser'
+ assert_equal assigns(:available_blocks), [ArticleBlock, TagsBlock]
+ end
+
should 'not allow products block if environment do not let' do
env = Environment.default
env.disable('products_for_enterprises')
@@ -432,9 +376,9 @@ class ProfileDesignControllerTest < ActionController::TestCase
person = create_user_with_permission('test_user', 'edit_profile_design', ent)
login_as(person.user.login)
- get :add_block, :profile => 'test_ent'
+ get :index, :profile => 'test_ent'
- assert_no_tag :tag => 'input', :attributes => {:type => 'radio', :value => 'ProductsBlock'}
+ assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'ProductsBlock' }
end
should 'create back link to profile control panel' do
@@ -448,18 +392,18 @@ class ProfileDesignControllerTest < ActionController::TestCase
should 'offer to create blog archives block only if has blog' do
holder.articles << Blog.new(:name => 'Blog test', :profile => holder)
- get :add_block, :profile => 'designtestuser'
- assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'BlogArchivesBlock' }
+ get :index, :profile => 'designtestuser'
+ assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'BlogArchivesBlock' }
end
should 'not offer to create blog archives block if user dont have blog' do
- get :add_block, :profile => 'designtestuser'
- assert_no_tag :tag => 'input', :attributes => { :name => 'type', :value => 'BlogArchivesBlock' }
+ get :index, :profile => 'designtestuser'
+ assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'BlogArchivesBlock' }
end
should 'offer to create feed reader block' do
- get :add_block, :profile => 'designtestuser'
- assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'FeedReaderBlock' }
+ get :index, :profile => 'designtestuser'
+ assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'FeedReaderBlock' }
end
should 'be able to edit FeedReaderBlock' do
@@ -569,17 +513,17 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
should 'allow admins to add RawHTMLBlock' do
- profile.stubs(:is_admin?).with(profile.environment).returns(true)
+ profile.stubs(:is_admin?).returns(true)
@controller.stubs(:user).returns(profile)
- get :add_block, :profile => 'designtestuser'
- assert_tag :tag => 'input', :attributes => { :name => 'type', :value => 'RawHTMLBlock' }
+ get :index, :profile => 'designtestuser'
+ assert_tag :tag => 'div', :attributes => { 'data-block-type' => 'RawHTMLBlock' }
end
should 'not allow normal users to add RawHTMLBlock' do
- profile.stubs(:is_admin?).with(profile.environment).returns(false)
+ profile.stubs(:is_admin?).returns(false)
@controller.stubs(:user).returns(profile)
- get :add_block, :profile => 'designtestuser'
- assert_no_tag :tag => 'input', :attributes => { :name => 'type', :value => 'RawHTMLBlock' }
+ get :index, :profile => 'designtestuser'
+ assert_no_tag :tag => 'div', :attributes => { 'data-block-type' => 'RawHTMLBlock' }
end
should 'editing article block displays right selected article' do
@@ -726,7 +670,7 @@ class ProfileDesignControllerTest < ActionController::TestCase
end
Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestBlockPlugin.new])
- refute @controller.available_blocks.include?(CustomBlock1)
+ assert !@controller.available_blocks.include?(CustomBlock1)
end
should 'clone a block' do
@@ -758,8 +702,8 @@ class ProfileDesignControllerTest < ActionController::TestCase
should 'guarantee main block is always visible to everybody' do
get :edit, :profile => 'designtestuser', :id => @b4.id
%w[logged not_logged followers].each do |option|
- assert_no_tag :select, :attributes => {:name => 'block[display_user]'},
- :descendant => {:tag => 'option', :attributes => {:value => option}}
+ assert_no_tag :select, :attributes => {:name => 'block[display_user]'},
+ :descendant => {:tag => 'option', :attributes => {:value => option}}
end
end
diff --git a/test/performance/user_test.rb b/test/performance/user_test.rb
new file mode 100644
index 0000000..0f977fe
--- /dev/null
+++ b/test/performance/user_test.rb
@@ -0,0 +1,28 @@
+require 'test_helper'
+require 'rails/performance_test_help'
+
+class UserTest < ActionDispatch::PerformanceTest
+
+ attr_reader :environment
+
+ def setup
+ @environment = Environment.default
+ @environment.disable('skip_new_user_email_confirmation')
+
+ @environment.person_templates.destroy_all
+ user = User.create!(:login => SecureRandom.uuid, :email => 'test@test.com', :password => 'test', :password_confirmation => 'test')
+ user.person.update_attribute(:is_template, true)
+ user.person.articles.destroy_all
+ user.person.boxes.destroy_all
+
+ @environment.person_default_template = user.person
+ @environment.save!
+ end
+
+ def test_user_creation_without_confirmation
+ User.benchmark("Creating user") do
+ user = User.create!(:login => 'changetest', :password => 'test', :password_confirmation => 'test', :email => 'changetest@example.com', :environment => environment)
+ end
+ end
+
+end
diff --git a/test/unit/box_organizer_helper_test.rb b/test/unit/box_organizer_helper_test.rb
new file mode 100644
index 0000000..d8dc65d
--- /dev/null
+++ b/test/unit/box_organizer_helper_test.rb
@@ -0,0 +1,312 @@
+# encoding: UTF-8
+require File.dirname(__FILE__) + '/../test_helper'
+
+class BoxOrganizerHelperTest < ActionView::TestCase
+
+
+ def setup
+ @environment = Environment.default
+ end
+
+ attr_reader :environment
+
+ should 'display the default icon for block without icon' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+ assert_match '/images/icon_block.png', display_icon(block)
+ end
+
+ should 'display the icon block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true)
+ assert_match 'blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the plugin icon block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true)
+ assert_match 'plugins/some/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the theme icon block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true)
+ assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the theme icon block instead of block icon' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true)
+ assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the theme icon block instead of plugin block icon' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true)
+ assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the theme icon block instead of block icon and plugin icon' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'designs/themes/some_theme/images/blocks/some_block/icon.png')).returns(true)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true)
+ assert_match 'designs/themes/some_theme/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the plugin icon block instead of block icon' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+
+ File.stubs(:exists?).returns(false)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'plugins/some/images/blocks/some_block/icon.png')).returns(true)
+ File.stubs(:exists?).with(File.join(Rails.root, 'public', 'images', '/blocks/some_block/icon.png')).returns(true)
+ assert_match 'plugins/some/images/blocks/some_block/icon.png', display_icon(block)
+ end
+
+ should 'display the default preview for block without previews images' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/images\/block_preview.png.*"/, elements[0].to_s
+ assert_match /img.* src="\/images\/block_preview.png.*"/, elements[1].to_s
+ assert_match /img.* src="\/images\/block_preview.png.*"/, elements[2].to_s
+ end
+ end
+
+ should 'display the previews of block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+ end
+
+ should 'display the plugin preview images of block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+
+ end
+
+ should 'display the theme previews of block' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+
+ end
+
+ should 'display the theme preview images of block instead of block preview images' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(nil)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+ end
+
+ should 'display the theme preview images of block instead of plugin preview images' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+
+ end
+
+ should 'display the theme preview images of block instead of block previews and plugin previews' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+
+ @environment = mock
+ @environment.stubs(:theme).returns('some_theme')
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/designs\/themes\/some_theme\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+
+ end
+
+ should 'display the plugin preview images of block instead of block previews' do
+ class SomeBlock < Block; end
+ block = SomeBlock
+
+ class SomePlugin < Noosfero::Plugin; end
+ SomePlugin.stubs(:name).returns('SomePlugin')
+ @plugins = mock
+ @plugins.stubs(:fetch_first_plugin).with(:has_block?, block).returns(SomePlugin)
+
+ Dir.stubs(:glob).returns([])
+ base_path = File.join(Rails.root, 'public', 'designs/themes/some_theme/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'plugins/some/', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ base_path = File.join(Rails.root, 'public', 'images', '/blocks/some_block/previews/')
+ Dir.stubs(:glob).with(File.join(base_path, '*')).returns([File.join(base_path, 'p1.png'), File.join(base_path, 'p2.png')])
+
+ doc = HTML::Document.new display_previews(block)
+ assert_select doc.root, 'li' do |elements|
+ assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p1.png"/, elements[0].to_s
+ assert_match /img.* src="\/plugins\/some\/images\/blocks\/some_block\/previews\/p2.png"/, elements[1].to_s
+ end
+
+ end
+
+
+end
--
libgit2 0.21.2