From 3a8dbd6af4baebcda062f264df80b41ccd6aeb56 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Tue, 7 Feb 2012 16:16:48 +0800 Subject: [PATCH 1/9] first commit for object auth,will take new_blog for experiment --- .../admin/object_auths_controller.rb | 71 ++++++++++++++ app/models/app_auth.rb | 93 +------------------ app/models/object_auth.rb | 11 +++ app/models/prototype_auth.rb | 93 +++++++++++++++++++ .../components/_user_role_management.html.erb | 34 +++++++ app/views/admin/module_apps/edit.html.erb | 33 +------ .../admin/object_auths/_auth_unit.html.erb | 3 + app/views/admin/object_auths/edit.html.erb | 13 +++ app/views/admin/object_auths/index.html.erb | 39 ++++++++ config/routes.rb | 2 + .../new_blog/app/models/post.rb | 1 + 11 files changed, 271 insertions(+), 122 deletions(-) create mode 100644 app/controllers/admin/object_auths_controller.rb create mode 100644 app/models/object_auth.rb create mode 100644 app/models/prototype_auth.rb create mode 100644 app/views/admin/components/_user_role_management.html.erb create mode 100644 app/views/admin/object_auths/_auth_unit.html.erb create mode 100644 app/views/admin/object_auths/edit.html.erb create mode 100644 app/views/admin/object_auths/index.html.erb diff --git a/app/controllers/admin/object_auths_controller.rb b/app/controllers/admin/object_auths_controller.rb new file mode 100644 index 00000000..2b54cc5e --- /dev/null +++ b/app/controllers/admin/object_auths_controller.rb @@ -0,0 +1,71 @@ +class Admin::ObjectAuthsController < ApplicationController + layout "admin" + before_filter :authenticate_user! +# before_filter :is_admin? ,:only => :index + + def index + # @roles = Role.all.entries + # apps = Purchase.where(:type =>"App") + # @app_auth_data = apps.entries.map do |app| + # app_c = eval(app.app_controller) + # obj = app_c.new + # obj_auth = obj.send "auth" + # [:app_obj => app,:auth_field => obj_auth] + # end + # if current_user.admin? + @object_auths = ObjectAuth.all + # else + # @module_apps = current_user.managing_apps.collect{|t| t.managing_app} + # end + end + + def create + # app_auth = AppAuth.find_or_create_by(module_app_id: params[:module_app_id]) + # params[:new].each do |item| + # field = item[0] + # field_value = item[1] + # if field_value!='' + # case field + # when 'role' + # app_auth.send("add_#{field}",(Role.find field_value)) rescue nil + # when 'sub_role' + # app_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil + # when 'privilege_user' + # app_auth.add_user_to_privilege_list (User.find field_value) rescue nil + # when 'blocked_user' + # app_auth.add_user_to_black_list (User.find field_value) rescue nil + # end + # end + # end + # app = ModuleApp.find params[:module_app_id] rescue nil + # redirect_to edit_admin_module_app_path(app) + end + + def remove + # app_auth = AppAuth.find( params[:id] ) + # type = params[:type] + # field_value = params[:target_id] + # if field_value!='' + # case type + # when 'role' + # app_auth.remove_role(Role.find field_value) rescue nil + # when 'sub_role' + # app_auth.remove_sub_role(SubRole.find field_value) rescue nil + # when 'privilege_user' + # app_auth.remove_user_from_privilege_list (User.find field_value) rescue nil + # when 'blocked_user' + # app_auth.remove_user_from_black_list (User.find field_value) rescue nil + # end + # end + # + # app = ModuleApp.find params[:module_app_id] rescue nil + # redirect_to edit_admin_module_app_path(app) + end + + def edit + @object_auth = ObjectAuth.find(params[:id]) + end + + + +end \ No newline at end of file diff --git a/app/models/app_auth.rb b/app/models/app_auth.rb index b31add3c..5a3de60c 100644 --- a/app/models/app_auth.rb +++ b/app/models/app_auth.rb @@ -1,94 +1,5 @@ -class AppAuth - include Mongoid::Document - include Mongoid::Timestamps - # after_save :update_block_list,:update_privilage_list - - field :title - field :token - field :all ,type: Boolean,default: false +class AppAuth < PrototypeAuth + belongs_to :module_app - belongs_to :users - # belongs_to :users,as: :block_users, :inverse_of => :privilege_apps - has_and_belongs_to_many :blocked_users, :inverse_of => nil, :class_name => "User" - has_and_belongs_to_many :privilege_users, :inverse_of => nil, :class_name => "User" - - - has_and_belongs_to_many :roles - has_and_belongs_to_many :sub_roles - - attr_protected :roles,:sub_roles,:privilege_users,:blocked_users,:users - - def add_role role - add_operation(:roles,role) - end - - def add_sub_role role - add_operation(:sub_roles,role) - end - - def remove_role role - remove_operation(:roles,role) - end - - def remove_sub_role role - remove_operation(:sub_roles,role) - end - - def add_user_to_black_list user - add_operation(:blocked_users,user) - end - - def remove_user_from_black_list user - remove_operation(:blocked_users,user) - end - - def add_user_to_privilege_list user - add_operation(:privilege_users,user) - end - - def remove_user_from_privilege_list user - remove_operation(:privilege_users,user) - end - - def remove_operation(item,obj) - if (self.send item).include? obj - (self.send item).delete obj - self.save! - else - false #should put error message for user not existed in list - end - end - - def add_operation(item,obj) - unless (self.send item).include?(obj) - (self.send item) << obj - self.save! - else - false #should put error message for user existed in list already - end - end - - def auth_users - if self.all? - User.all.entries - else - ary=[] - [:roles,:sub_roles].each do |t_role| - ary += (self.send t_role).collect do |role| - role.users - end - end - ary << self.privilege_users - ary.flatten!.uniq - end - end - - def auth_users_after_block_list - auth_users - self.blocked_users - end - - # protected - - end \ No newline at end of file diff --git a/app/models/object_auth.rb b/app/models/object_auth.rb new file mode 100644 index 00000000..dab7acc7 --- /dev/null +++ b/app/models/object_auth.rb @@ -0,0 +1,11 @@ +class ObjectAuth < PrototypeAuth + + belongs_to :obj_authable, polymorphic: true + # > - Something.find_with_auth(query) + # > - or Something.find(query).auth + def auth_obj + class_obj = eval(self.obj_authable_type) + class_obj.find self.obj_authable_id + end + +end \ No newline at end of file diff --git a/app/models/prototype_auth.rb b/app/models/prototype_auth.rb new file mode 100644 index 00000000..734268c4 --- /dev/null +++ b/app/models/prototype_auth.rb @@ -0,0 +1,93 @@ +class PrototypeAuth + include Mongoid::Document + include Mongoid::Timestamps + # after_save :update_block_list,:update_privilage_list + + field :title + field :token + field :all ,type: Boolean,default: false + + belongs_to :users + # belongs_to :users,as: :block_users, :inverse_of => :privilege_apps + has_and_belongs_to_many :blocked_users, :inverse_of => nil, :class_name => "User" + has_and_belongs_to_many :privilege_users, :inverse_of => nil, :class_name => "User" + + + has_and_belongs_to_many :roles + has_and_belongs_to_many :sub_roles + + attr_protected :roles,:sub_roles,:privilege_users,:blocked_users,:users + + def add_role role + add_operation(:roles,role) + end + + def add_sub_role role + add_operation(:sub_roles,role) + end + + def remove_role role + remove_operation(:roles,role) + end + + def remove_sub_role role + remove_operation(:sub_roles,role) + end + + def add_user_to_black_list user + add_operation(:blocked_users,user) + end + + def remove_user_from_black_list user + remove_operation(:blocked_users,user) + end + + def add_user_to_privilege_list user + add_operation(:privilege_users,user) + end + + def remove_user_from_privilege_list user + remove_operation(:privilege_users,user) + end + + def remove_operation(item,obj) + if (self.send item).include? obj + (self.send item).delete obj + self.save! + else + false #should put error message for user not existed in list + end + end + + def add_operation(item,obj) + unless (self.send item).include?(obj) + (self.send item) << obj + self.save! + else + false #should put error message for user existed in list already + end + end + + def auth_users + if self.all? + User.all.entries + else + ary=[] + [:roles,:sub_roles].each do |t_role| + ary += (self.send t_role).collect do |role| + role.users + end + end + ary << self.privilege_users + ary.flatten!.uniq + end + end + + def auth_users_after_block_list + auth_users - self.blocked_users + end + + # protected + + +end \ No newline at end of file diff --git a/app/views/admin/components/_user_role_management.html.erb b/app/views/admin/components/_user_role_management.html.erb new file mode 100644 index 00000000..7afca0a4 --- /dev/null +++ b/app/views/admin/components/_user_role_management.html.erb @@ -0,0 +1,34 @@ +
+ <%#= debugger %> +

User Role

+ <%= debugger %> + <%= form_tag(polymorphic_path([controller_path.split('/')[0],object,auth.class.name.underscore]),:method => :post) do %> + <%= collection_select(:new,:role, Role.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add Role' %>
+ <%= collection_select(:new,:sub_role, SubRole.all, :id, :key, :prompt => true) %> + <%= submit_tag 'Add SubRole' %>
+ <%= collection_select(:new,:privilege_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add PrivilegeList' %>
+ <%= collection_select(:new,:blocked_user, User.all, :id, :name, :prompt => true) %> + <%= submit_tag 'Add BlockedList' %>
+ <% end %> + + <% unless auth.nil? %> + <% auth.roles.each do |role| %> +
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %> + <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'role',:target_id=>role.id),:method => :delete %>
  • + <% end %> + + <% auth.sub_roles.each do |role| %> +
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
  • <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'sub_role',:target_id=>role.id),:method => :delete %> + <% end %> + + <% auth.privilege_users.each do |user| %> +
  • <%= user.name %> <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'privilege_user',:target_id=>user.id),:method => :delete %>
  • + <% end %> + + <% auth.blocked_users.each do |user| %> +
  • <%= user.name %><%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'blocked_user',:target_id=>user.id),:method => :delete %>
  • + <% end %> +<% end %> +
    \ No newline at end of file diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index 9429e963..5a2d56ec 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -36,34 +36,5 @@ -
    -

    User Role

    - <%= form_tag(admin_module_app_app_auths_path(@module_app),:method => :post) do %> - <%= collection_select(:new,:role, Role.all, :id, :key, :prompt => true) %> - <%= submit_tag 'Add Role' %>
    - <%= collection_select(:new,:sub_role, SubRole.all, :id, :key, :prompt => true) %> - <%= submit_tag 'Add SubRole' %>
    - <%= collection_select(:new,:privilege_user, User.all, :id, :name, :prompt => true) %> - <%= submit_tag 'Add PrivilegeList' %>
    - <%= collection_select(:new,:blocked_user, User.all, :id, :name, :prompt => true) %> - <%= submit_tag 'Add BlockedList' %>
    - <% end %> - - <% unless @module_app.app_auth.nil? %> - <% @module_app.app_auth.roles.each do |role| %> -
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'role',role),:method => :delete %>
  • - <% end %> - - <% @module_app.app_auth.sub_roles.each do |role| %> -
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
  • <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'sub_role',role),:method => :delete %> - <% end %> - - <% @module_app.app_auth.privilege_users.each do |user| %> -
  • <%= user.name %> <%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'privilege_user',user),:method => :delete %>
  • - <% end %> - - <% @module_app.app_auth.blocked_users.each do |user| %> -
  • <%= user.name %><%= link_to '[X]',remove_admin_module_app_app_auth_path(@module_app,@module_app.app_auth,'blocked_user',user),:method => :delete %>
  • - <% end %> -<% end %> -
    +<%= render :partial => "admin/components/user_role_management", :locals => { :object => @module_app ,:auth=> @module_app.app_auth } %> + diff --git a/app/views/admin/object_auths/_auth_unit.html.erb b/app/views/admin/object_auths/_auth_unit.html.erb new file mode 100644 index 00000000..5a246fc3 --- /dev/null +++ b/app/views/admin/object_auths/_auth_unit.html.erb @@ -0,0 +1,3 @@ +
    + <%= unit%> +
    \ No newline at end of file diff --git a/app/views/admin/object_auths/edit.html.erb b/app/views/admin/object_auths/edit.html.erb new file mode 100644 index 00000000..62e9b465 --- /dev/null +++ b/app/views/admin/object_auths/edit.html.erb @@ -0,0 +1,13 @@ +<% content_for :secondary do %> +<% end %> + + +
    +
    +
    + +

    <%= @object_auth.title %>

    + +<%= render :partial => "admin/components/user_role_management", :locals => { :object => @object_auth.auth_obj ,:auth=> @object_auth } %> + + diff --git a/app/views/admin/object_auths/index.html.erb b/app/views/admin/object_auths/index.html.erb new file mode 100644 index 00000000..7db021e5 --- /dev/null +++ b/app/views/admin/object_auths/index.html.erb @@ -0,0 +1,39 @@ +<% content_for :secondary do %> + <% #render 'side_bar' %> +<% end %> + +
    + <%= flash_messages %> +
    + <% #link_to t('admin.new_user'), new_admin_user_path, :class => 'new' %> +
    + + + + + + + + + + <% @object_auths.each do |object_auth| %> + + + + + + + + + + <% end %> + +
    <%= t('admin.object_auth.title') %><%= t('admin.object_auth.obj_type') %>
    <%= object_auth.title %><%= object_auth.obj_authable_type.to_s %> + <%= link_to t(:show), admin_object_auth_path(object_auth), :class => 'show' %> + <%= link_to t(:edit), edit_admin_object_auth_path(object_auth), :class => 'edit' %> + <%= link_to t(:delete), admin_object_auth_path(object_auth), :class => 'delete', :confirm => t('sure?'), :method => :delete %> +
    +
    + <%# link_to t('admin.new_user'), new_admin_user_path, :class => 'new' %> +
    +
    diff --git a/config/routes.rb b/config/routes.rb index 3d483d08..275ef202 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,6 +13,8 @@ PrototypeR4::Application.routes.draw do namespace :admin do resources :assets resources :app_auths + resources :object_auths + resources :ad_banners resources :designs do collection do diff --git a/vendor/built_in_modules/new_blog/app/models/post.rb b/vendor/built_in_modules/new_blog/app/models/post.rb index f60c1c19..2926c305 100644 --- a/vendor/built_in_modules/new_blog/app/models/post.rb +++ b/vendor/built_in_modules/new_blog/app/models/post.rb @@ -5,4 +5,5 @@ class Post field :body, :type => String embeds_many :comments validates_presence_of :title, :body + has_one :object_auth,as: :obj_authable,dependent: :delete end \ No newline at end of file From 31d7cd5b380e65d2e05fe6d7d423515ebc40e7e4 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Thu, 9 Feb 2012 17:48:51 +0800 Subject: [PATCH 2/9] Object Auth. Now object can be included with "include OrbitCoreLib::ObjectAuthable" to use kernel method,such as 1.Object.authed_for_user(user,title_of_object_auth). title_of_object_auth is optional 2.object.authed_users(user,title_of_object_auth) . title_of_object_auth is optional if title_of_object_auth is not given,then it will return calculation across all possiblity. --- .../admin/object_auths_controller.rb | 79 +++++++++---------- .../components/_user_role_management.html.erb | 12 ++- app/views/admin/module_apps/edit.html.erb | 2 +- app/views/admin/object_auths/edit.html.erb | 3 +- config/routes.rb | 7 +- lib/orbit_core_lib.rb | 42 ++++++++++ .../new_blog/app/models/post.rb | 3 +- 7 files changed, 96 insertions(+), 52 deletions(-) create mode 100644 lib/orbit_core_lib.rb diff --git a/app/controllers/admin/object_auths_controller.rb b/app/controllers/admin/object_auths_controller.rb index 2b54cc5e..7c6f60f0 100644 --- a/app/controllers/admin/object_auths_controller.rb +++ b/app/controllers/admin/object_auths_controller.rb @@ -19,53 +19,50 @@ class Admin::ObjectAuthsController < ApplicationController # end end - def create - # app_auth = AppAuth.find_or_create_by(module_app_id: params[:module_app_id]) - # params[:new].each do |item| - # field = item[0] - # field_value = item[1] - # if field_value!='' - # case field - # when 'role' - # app_auth.send("add_#{field}",(Role.find field_value)) rescue nil - # when 'sub_role' - # app_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil - # when 'privilege_user' - # app_auth.add_user_to_privilege_list (User.find field_value) rescue nil - # when 'blocked_user' - # app_auth.add_user_to_black_list (User.find field_value) rescue nil - # end - # end - # end - # app = ModuleApp.find params[:module_app_id] rescue nil - # redirect_to edit_admin_module_app_path(app) - end + def create_role + object_auth = ObjectAuth.find(params[:id]) + params[:new].each do |item| + field = item[0] + field_value = item[1] + if field_value!='' + case field + when 'role' + object_auth.send("add_#{field}",(Role.find field_value)) rescue nil + when 'sub_role' + object_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil + when 'privilege_user' + object_auth.add_user_to_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + object_auth.add_user_to_black_list (User.find field_value) rescue nil + end + end + end + redirect_to edit_admin_object_auth_path(object_auth) + end - def remove - # app_auth = AppAuth.find( params[:id] ) - # type = params[:type] - # field_value = params[:target_id] - # if field_value!='' - # case type - # when 'role' - # app_auth.remove_role(Role.find field_value) rescue nil - # when 'sub_role' - # app_auth.remove_sub_role(SubRole.find field_value) rescue nil - # when 'privilege_user' - # app_auth.remove_user_from_privilege_list (User.find field_value) rescue nil - # when 'blocked_user' - # app_auth.remove_user_from_black_list (User.find field_value) rescue nil - # end - # end - # - # app = ModuleApp.find params[:module_app_id] rescue nil - # redirect_to edit_admin_module_app_path(app) + def remove_role + object_auth = ObjectAuth.find(params[:id]) + type = params[:type] + field_value = params[:target_id] + if field_value!='' + case type + when 'role' + object_auth.remove_role(Role.find field_value) rescue nil + when 'sub_role' + object_auth.remove_sub_role(SubRole.find field_value) rescue nil + when 'privilege_user' + object_auth.remove_user_from_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + object_auth.remove_user_from_black_list (User.find field_value) rescue nil + end + end + redirect_to edit_admin_object_auth_path(object_auth) end def edit @object_auth = ObjectAuth.find(params[:id]) end - + end \ No newline at end of file diff --git a/app/views/admin/components/_user_role_management.html.erb b/app/views/admin/components/_user_role_management.html.erb index 7afca0a4..59307351 100644 --- a/app/views/admin/components/_user_role_management.html.erb +++ b/app/views/admin/components/_user_role_management.html.erb @@ -1,8 +1,6 @@
    - <%#= debugger %>

    User Role

    - <%= debugger %> - <%= form_tag(polymorphic_path([controller_path.split('/')[0],object,auth.class.name.underscore]),:method => :post) do %> + <%= form_tag(submit_url) do %> <%= collection_select(:new,:role, Role.all, :id, :key, :prompt => true) %> <%= submit_tag 'Add Role' %>
    <%= collection_select(:new,:sub_role, SubRole.all, :id, :key, :prompt => true) %> @@ -16,19 +14,19 @@ <% unless auth.nil? %> <% auth.roles.each do |role| %>
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %> - <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'role',:target_id=>role.id),:method => :delete %>
  • + <%= link_to '[X]',polymorphic_path(ploy_route_ary,:type=>'role',:target_id=>role.id),:method => :delete %> <% end %>
      Sub Roles
    <% auth.sub_roles.each do |role| %> -
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
  • <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'sub_role',:target_id=>role.id),:method => :delete %> +
  • <%= role.key %> Build in:<%= role.built_in ? 'Yes' : 'No' %>
  • <%= link_to '[X]',polymorphic_path(ploy_route_ary,:type=>'sub_role',:target_id=>role.id),:method => :delete %> <% end %>
      PrivilegeList
    <% auth.privilege_users.each do |user| %> -
  • <%= user.name %> <%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'privilege_user',:target_id=>user.id),:method => :delete %>
  • +
  • <%= user.name %> <%= link_to '[X]',polymorphic_path(ploy_route_ary,:type=>'privilege_user',:target_id=>user.id),:method => :delete %>
  • <% end %>
      BlockedList
    <% auth.blocked_users.each do |user| %> -
  • <%= user.name %><%= link_to '[X]',polymorphic_path(['remove',:admin,object,auth],:type=>'blocked_user',:target_id=>user.id),:method => :delete %>
  • +
  • <%= user.name %><%= link_to '[X]',polymorphic_path(ploy_route_ary,:type=>'blocked_user',:target_id=>user.id),:method => :delete %>
  • <% end %> <% end %>
    \ No newline at end of file diff --git a/app/views/admin/module_apps/edit.html.erb b/app/views/admin/module_apps/edit.html.erb index 5a2d56ec..23745806 100644 --- a/app/views/admin/module_apps/edit.html.erb +++ b/app/views/admin/module_apps/edit.html.erb @@ -36,5 +36,5 @@
    -<%= render :partial => "admin/components/user_role_management", :locals => { :object => @module_app ,:auth=> @module_app.app_auth } %> +<%= render :partial => "admin/components/user_role_management", :locals => { :object => @module_app ,:auth=> @module_app.app_auth ,:submit_url=> admin_module_app_app_auths_path(@module_app),:ploy_route_ary=>['remove',:admin,@module_app,@module_app.app_auth] } %> diff --git a/app/views/admin/object_auths/edit.html.erb b/app/views/admin/object_auths/edit.html.erb index 62e9b465..67fb026e 100644 --- a/app/views/admin/object_auths/edit.html.erb +++ b/app/views/admin/object_auths/edit.html.erb @@ -8,6 +8,7 @@

    <%= @object_auth.title %>

    -<%= render :partial => "admin/components/user_role_management", :locals => { :object => @object_auth.auth_obj ,:auth=> @object_auth } %> +<%= render :partial => "admin/components/user_role_management", :locals => { + :object => @object_auth.auth_obj ,:auth=>@object_auth,:submit_url=>create_role_admin_object_auth_path(@object_auth),:ploy_route_ary=>['remove',:admin,@object_auth] } %> diff --git a/config/routes.rb b/config/routes.rb index 275ef202..abe29824 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,7 +13,12 @@ PrototypeR4::Application.routes.draw do namespace :admin do resources :assets resources :app_auths - resources :object_auths + resources :object_auths do + member do + match ':id/create_role',:action => 'create_role',:iia => "post",:as => :create_role + match 'remove/:type/:target_id' ,:action=> 'remove_role',:via => "delete",:as =>:remove + end + end resources :ad_banners resources :designs do diff --git a/lib/orbit_core_lib.rb b/lib/orbit_core_lib.rb new file mode 100644 index 00000000..8056f4f9 --- /dev/null +++ b/lib/orbit_core_lib.rb @@ -0,0 +1,42 @@ +module OrbitCoreLib + module ObjectAuthable + def self.included(base) + base.instance_eval("has_many :object_auths,as: :obj_authable,dependent: :delete") + + base.define_singleton_method :authed_for_user do |user,title = nil| + sub_role_ids_ary=user.sub_roles.collect{|t| t.id} + if title.nil? + auth_object_space = ObjectAuth.where(obj_authable_type: self.to_s) + else + auth_object_space = ObjectAuth.where(obj_authable_type: self.to_s,title: title) + end + + query1 = auth_object_space.any_in({sub_role_ids: sub_role_ids_ary}).excludes(blocked_user_ids: user.id) + query2 = auth_object_space.any_of({all: true},{privilege_user_ids: user.id},{role_ids: user.role.id}).excludes(blocked_user_ids: user.id) + result = (query1 + query2).uniq + result.collect{|t| t.obj_authable} + end + + end + + def authed_users(title=nil) + users = [] + unless title.nil? + users = self.object_auths.where(title: title )[0].auth_users_after_block_list rescue [] + else + users = self.object_auths.collect{|t| t.auth_users_after_block_list} rescue [] + users.flatten!.uniq! + end + users + end + + def tell_me_class + self.class.name + end + + def search_object_db + ObjectAuth.where(obj_authable_type: self.class.name) + end + + end +end diff --git a/vendor/built_in_modules/new_blog/app/models/post.rb b/vendor/built_in_modules/new_blog/app/models/post.rb index 2926c305..ef882a6d 100644 --- a/vendor/built_in_modules/new_blog/app/models/post.rb +++ b/vendor/built_in_modules/new_blog/app/models/post.rb @@ -1,9 +1,10 @@ class Post include Mongoid::Document include Mongoid::Timestamps + include OrbitCoreLib::ObjectAuthable + field :title, :type => String field :body, :type => String embeds_many :comments validates_presence_of :title, :body - has_one :object_auth,as: :obj_authable,dependent: :delete end \ No newline at end of file From 32159564cd83a5c64812109e0bf921f57b29d111 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Thu, 9 Feb 2012 19:04:06 +0800 Subject: [PATCH 3/9] build interface to work with object auth. Go to panel/new_blog/back_end/posts/ ,click New Auth link --- .../admin/object_auths_controller.rb | 57 +++++++++++-------- app/views/admin/object_auths/new.html.erb | 23 ++++++++ config/routes.rb | 5 +- lib/orbit_core_lib.rb | 8 --- .../new_blog/back_end/posts/index.html.erb | 1 + .../new_blog/back_end/posts/new.html.erb | 2 +- 6 files changed, 61 insertions(+), 35 deletions(-) create mode 100644 app/views/admin/object_auths/new.html.erb diff --git a/app/controllers/admin/object_auths_controller.rb b/app/controllers/admin/object_auths_controller.rb index 7c6f60f0..ce404e53 100644 --- a/app/controllers/admin/object_auths_controller.rb +++ b/app/controllers/admin/object_auths_controller.rb @@ -4,40 +4,47 @@ class Admin::ObjectAuthsController < ApplicationController # before_filter :is_admin? ,:only => :index def index - # @roles = Role.all.entries - # apps = Purchase.where(:type =>"App") - # @app_auth_data = apps.entries.map do |app| - # app_c = eval(app.app_controller) - # obj = app_c.new - # obj_auth = obj.send "auth" - # [:app_obj => app,:auth_field => obj_auth] - # end # if current_user.admin? @object_auths = ObjectAuth.all # else # @module_apps = current_user.managing_apps.collect{|t| t.managing_app} # end end + + def new + obj = eval(params[:type]).find params[:obj_id] + @object_auth=obj.object_auths.build + respond_to do |format| + format.html # new.html.erb + format.xml { render :xml => @post } + end + end + + def create + obj = eval(params[:object_auth][:type]).find params[:object_auth][:obj_id] + @object_auth=obj.object_auths.create :title=> params[:object_auth][:title] + redirect_to edit_admin_object_auth_path(@object_auth) + end def create_role object_auth = ObjectAuth.find(params[:id]) - params[:new].each do |item| - field = item[0] - field_value = item[1] - if field_value!='' - case field - when 'role' - object_auth.send("add_#{field}",(Role.find field_value)) rescue nil - when 'sub_role' - object_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil - when 'privilege_user' - object_auth.add_user_to_privilege_list (User.find field_value) rescue nil - when 'blocked_user' - object_auth.add_user_to_black_list (User.find field_value) rescue nil - end - end - end - redirect_to edit_admin_object_auth_path(object_auth) + params[:new].each do |item| + field = item[0] + field_value = item[1] + if field_value!='' + case field + when 'role' + object_auth.send("add_#{field}",(Role.find field_value)) rescue nil + when 'sub_role' + object_auth.send("add_#{field}",(SubRole.find field_value)) rescue nil + when 'privilege_user' + object_auth.add_user_to_privilege_list (User.find field_value) rescue nil + when 'blocked_user' + object_auth.add_user_to_black_list (User.find field_value) rescue nil + end + end + end + redirect_to edit_admin_object_auth_path(object_auth) end def remove_role diff --git a/app/views/admin/object_auths/new.html.erb b/app/views/admin/object_auths/new.html.erb new file mode 100644 index 00000000..25fd6fd5 --- /dev/null +++ b/app/views/admin/object_auths/new.html.erb @@ -0,0 +1,23 @@ +<% content_for :secondary do %> +
      +
    +<% end -%> + +
    +
    +
    +
    + +<%= flash_messages %> +

    <%= t('object_auth.new_object_auth') %>

    +<%= form_for @object_auth, :url => admin_object_auths_path do |f| %> + <%= f.label :title %> + <%= f.text_field :title, :class => 'text' %> + <%= f.hidden_field :obj_id, :value => params[:obj_id] %> + <%= f.hidden_field :type, :value => params[:type] %> + + <%= submit_tag 'Add Auth' %>
    + +<% end %> + +<%= link_back %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index abe29824..d2fe14b8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -14,8 +14,11 @@ PrototypeR4::Application.routes.draw do resources :assets resources :app_auths resources :object_auths do + collection do + match 'new/:type/:obj_id',:action => 'new',:via => "get",:as => :init + end member do - match ':id/create_role',:action => 'create_role',:iia => "post",:as => :create_role + match ':id/create_role',:action => 'create_role',:via => "post",:as => :create_role match 'remove/:type/:target_id' ,:action=> 'remove_role',:via => "delete",:as =>:remove end end diff --git a/lib/orbit_core_lib.rb b/lib/orbit_core_lib.rb index 8056f4f9..bf1d66a3 100644 --- a/lib/orbit_core_lib.rb +++ b/lib/orbit_core_lib.rb @@ -30,13 +30,5 @@ module OrbitCoreLib users end - def tell_me_class - self.class.name - end - - def search_object_db - ObjectAuth.where(obj_authable_type: self.class.name) - end - end end diff --git a/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/index.html.erb b/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/index.html.erb index 9473b70b..54ed9f1e 100644 --- a/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/index.html.erb +++ b/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/index.html.erb @@ -21,6 +21,7 @@ <%= post.title %> <%= truncate(post.body,:length=>15) %> + <%= link_to t('blog.new_auth'), init_admin_object_auths_path("Post",post) %> <%= link_to t('blog.show'), panel_new_blog_back_end_post_path(post) %> <%= link_to t('blog.edit'), edit_panel_new_blog_back_end_post_path(post) %> <%= link_to t('blog.delete'), panel_new_blog_back_end_post_path(post), :confirm => t('blog.sure?'), :method => :delete %> diff --git a/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/new.html.erb b/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/new.html.erb index af5aa326..21758da8 100644 --- a/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/new.html.erb +++ b/vendor/built_in_modules/new_blog/app/views/panel/new_blog/back_end/posts/new.html.erb @@ -7,7 +7,7 @@ <%= flash_messages %>

    <%= t('blog.new_post') %>

    <%= form_for @post, :url => panel_new_blog_back_end_posts_path do |f| %> - <%= render :partial => 'form', :locals => {:f => f} %> + <%= f.text_field :title, :class => 'text' %> <% end %> <%= link_back %> From 79ae598c4fc6ae12e8a1a44d1bffcd3ac674cff8 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Fri, 10 Feb 2012 10:50:03 +0800 Subject: [PATCH 4/9] include ad_banner query code. cleaned up parser --- lib/parsers/parser_back_end.rb | 25 +- lib/parsers/parser_front_end.rb | 14 +- public/static/jquery.cycle.all.latest.js | 1331 ++++++++++++++++++++++ public/static/kernel.js | 23 +- 4 files changed, 1372 insertions(+), 21 deletions(-) create mode 100644 public/static/jquery.cycle.all.latest.js diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index 23b40b19..2c91aee7 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -68,6 +68,7 @@ module ParserBackEnd c.define_tag 'javascripts' do |tag| res = '' res << "" + res << "" res << "" page.design.javascripts.each do |js| res << "" @@ -75,23 +76,25 @@ module ParserBackEnd res end c.define_tag 'adbanner' do |tag| - ret = '' + res = '' ad_banner = AdBanner.first(conditions:{title: tag.attr["name"]}) - ret << "" - ret << "" + res << "" + - ret << "
    " - ret << "' + res << "
    " + res << "' #================================== - ret << "
    " + res << "
    " ad_banner.ad_images.each do |ad_image| - ret << "" + res << "" end - ret << "
    " + res << "
    " #================================== - ret << "
    " + res << "
    " end c.define_tag 'layout_part' do |tag| part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index be288612..d8fee9da 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -76,6 +76,7 @@ module ParserFrontEnd c.define_tag 'javascripts' do |tag| res = '' res << "" + res << "" res << "" page.design.javascripts.each do |js| res << "" @@ -86,16 +87,11 @@ module ParserFrontEnd res = '' ad_banner = AdBanner.first(conditions:{title: tag.attr["name"]}) if ad_banner.display? - res << "" - res << "" - } $(document).ready(function() { $('.slideshow').cycle({after: onAfter,timeout:1 ,fx: '#{ad_banner.ad_fx.nil?? 'fade': ad_banner.ad_fx}' }).children('img').click(function(){if($(this).attr('link_open')=='new_window'){window.open($(this).attr('link_url'));} else{document.location.href=$(this).attr('link_url');}});; }); " - - res << "
    " + res << "
    " ad_banner.ad_images.each do |ad_image| res << "= options.elements.length) { + log('invalid slide index: ' + num); + return false; + } + options.nextSlide = num; + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + if (typeof arg2 == 'string') + options.oneTimeFx = arg2; + go(options.elements, options, 1, num >= options.currSlide); + return false; + } + return options; + + function checkInstantResume(isPaused, arg2, cont) { + if (!isPaused && arg2 === true) { // resume now! + var options = $(cont).data('cycle.opts'); + if (!options) { + log('options not found, can not resume'); + return false; + } + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + go(options.elements, options, 1, (!opts.rev && !opts.backwards)); + } + } +}; + +function removeFilter(el, opts) { + if (!$.support.opacity && opts.cleartype && el.style.filter) { + try { el.style.removeAttribute('filter'); } + catch(smother) {} // handle old opera versions + } +}; + +// unbind event handlers +function destroy(opts) { + if (opts.next) + $(opts.next).unbind(opts.prevNextEvent); + if (opts.prev) + $(opts.prev).unbind(opts.prevNextEvent); + + if (opts.pager || opts.pagerAnchorBuilder) + $.each(opts.pagerAnchors || [], function() { + this.unbind().remove(); + }); + opts.pagerAnchors = null; + if (opts.destroy) // callback + opts.destroy(opts); +}; + +// one-time initialization +function buildOptions($cont, $slides, els, options, o) { + // support metadata plugin (v1.0 and v2.0) + var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {}); + if (opts.autostop) + opts.countdown = opts.autostopCount || els.length; + + var cont = $cont[0]; + $cont.data('cycle.opts', opts); + opts.$cont = $cont; + opts.stopCount = cont.cycleStop; + opts.elements = els; + opts.before = opts.before ? [opts.before] : []; + opts.after = opts.after ? [opts.after] : []; + opts.after.unshift(function(){ opts.busy=0; }); + + // push some after callbacks + if (!$.support.opacity && opts.cleartype) + opts.after.push(function() { removeFilter(this, opts); }); + if (opts.continuous) + opts.after.push(function() { go(els,opts,0,(!opts.rev && !opts.backwards)); }); + + saveOriginalOpts(opts); + + // clearType corrections + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($slides); + + // container requires non-static position so that slides can be position within + if ($cont.css('position') == 'static') + $cont.css('position', 'relative'); + if (opts.width) + $cont.width(opts.width); + if (opts.height && opts.height != 'auto') + $cont.height(opts.height); + + if (opts.startingSlide) + opts.startingSlide = parseInt(opts.startingSlide); + else if (opts.backwards) + opts.startingSlide = els.length - 1; + + // if random, mix up the slide array + if (opts.random) { + opts.randomMap = []; + for (var i = 0; i < els.length; i++) + opts.randomMap.push(i); + opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); + opts.randomIndex = 1; + opts.startingSlide = opts.randomMap[1]; + } + else if (opts.startingSlide >= els.length) + opts.startingSlide = 0; // catch bogus input + opts.currSlide = opts.startingSlide || 0; + var first = opts.startingSlide; + + // set position and zIndex on all the slides + $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) { + var z; + if (opts.backwards) + z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i; + else + z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i; + $(this).css('z-index', z) + }); + + // make sure first slide is visible + $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case + removeFilter(els[first], opts); + + // stretch slides + if (opts.fit && opts.width) + $slides.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + + // stretch container + var reshape = opts.containerResize && !$cont.innerHeight(); + if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9 + var maxw = 0, maxh = 0; + for(var j=0; j < els.length; j++) { + var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight(); + if (!w) w = e.offsetWidth || e.width || $e.attr('width') + if (!h) h = e.offsetHeight || e.height || $e.attr('height'); + maxw = w > maxw ? w : maxw; + maxh = h > maxh ? h : maxh; + } + if (maxw > 0 && maxh > 0) + $cont.css({width:maxw+'px',height:maxh+'px'}); + } + + if (opts.pause) + $cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;}); + + if (supportMultiTransitions(opts) === false) + return false; + + // apparently a lot of people use image slideshows without height/width attributes on the images. + // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that. + var requeue = false; + options.requeueAttempts = options.requeueAttempts || 0; + $slides.each(function() { + // try to get height/width of each slide + var $el = $(this); + this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0); + this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0); + + if ( $el.is('img') ) { + // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when + // an image is being downloaded and the markup did not include sizing info (height/width attributes); + // there seems to be some "default" sizes used in this situation + var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete); + var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete); + var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete); + var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete); + // don't requeue for images that are still loading but have a valid size + if (loadingIE || loadingFF || loadingOp || loadingOther) { + if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever + log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH); + setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout); + requeue = true; + return false; // break each loop + } + else { + log('could not determine size of image: '+this.src, this.cycleW, this.cycleH); + } + } + } + return true; + }); + + if (requeue) + return false; + + opts.cssBefore = opts.cssBefore || {}; + opts.animIn = opts.animIn || {}; + opts.animOut = opts.animOut || {}; + + $slides.not(':eq('+first+')').css(opts.cssBefore); + if (opts.cssFirst) + $($slides[first]).css(opts.cssFirst); + + if (opts.timeout) { + opts.timeout = parseInt(opts.timeout); + // ensure that timeout and speed settings are sane + if (opts.speed.constructor == String) + opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed); + if (!opts.sync) + opts.speed = opts.speed / 2; + + var buffer = opts.fx == 'shuffle' ? 500 : 250; + while((opts.timeout - opts.speed) < buffer) // sanitize timeout + opts.timeout += opts.speed; + } + if (opts.easing) + opts.easeIn = opts.easeOut = opts.easing; + if (!opts.speedIn) + opts.speedIn = opts.speed; + if (!opts.speedOut) + opts.speedOut = opts.speed; + + opts.slideCount = els.length; + opts.currSlide = opts.lastSlide = first; + if (opts.random) { + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else if (opts.backwards) + opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1; + else + opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1; + + // run transition init fn + if (!opts.multiFx) { + var init = $.fn.cycle.transitions[opts.fx]; + if ($.isFunction(init)) + init($cont, $slides, opts); + else if (opts.fx != 'custom' && !opts.multiFx) { + log('unknown transition: ' + opts.fx,'; slideshow terminating'); + return false; + } + } + + // fire artificial events + var e0 = $slides[first]; + if (opts.before.length) + opts.before[0].apply(e0, [e0, e0, opts, true]); + if (opts.after.length > 1) + opts.after[1].apply(e0, [e0, e0, opts, true]); + + if (opts.next) + $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)}); + if (opts.prev) + $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)}); + if (opts.pager || opts.pagerAnchorBuilder) + buildPager(els,opts); + + exposeAddSlide(opts, els); + + return opts; +}; + +// save off original opts so we can restore after clearing state +function saveOriginalOpts(opts) { + opts.original = { before: [], after: [] }; + opts.original.cssBefore = $.extend({}, opts.cssBefore); + opts.original.cssAfter = $.extend({}, opts.cssAfter); + opts.original.animIn = $.extend({}, opts.animIn); + opts.original.animOut = $.extend({}, opts.animOut); + $.each(opts.before, function() { opts.original.before.push(this); }); + $.each(opts.after, function() { opts.original.after.push(this); }); +}; + +function supportMultiTransitions(opts) { + var i, tx, txs = $.fn.cycle.transitions; + // look for multiple effects + if (opts.fx.indexOf(',') > 0) { + opts.multiFx = true; + opts.fxs = opts.fx.replace(/\s*/g,'').split(','); + // discard any bogus effect names + for (i=0; i < opts.fxs.length; i++) { + var fx = opts.fxs[i]; + tx = txs[fx]; + if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) { + log('discarding unknown transition: ',fx); + opts.fxs.splice(i,1); + i--; + } + } + // if we have an empty list then we threw everything away! + if (!opts.fxs.length) { + log('No valid transitions named; slideshow terminating.'); + return false; + } + } + else if (opts.fx == 'all') { // auto-gen the list of transitions + opts.multiFx = true; + opts.fxs = []; + for (p in txs) { + tx = txs[p]; + if (txs.hasOwnProperty(p) && $.isFunction(tx)) + opts.fxs.push(p); + } + } + if (opts.multiFx && opts.randomizeEffects) { + // munge the fxs array to make effect selection random + var r1 = Math.floor(Math.random() * 20) + 30; + for (i = 0; i < r1; i++) { + var r2 = Math.floor(Math.random() * opts.fxs.length); + opts.fxs.push(opts.fxs.splice(r2,1)[0]); + } + debug('randomized fx sequence: ',opts.fxs); + } + return true; +}; + +// provide a mechanism for adding slides after the slideshow has started +function exposeAddSlide(opts, els) { + opts.addSlide = function(newSlide, prepend) { + var $s = $(newSlide), s = $s[0]; + if (!opts.autostopCount) + opts.countdown++; + els[prepend?'unshift':'push'](s); + if (opts.els) + opts.els[prepend?'unshift':'push'](s); // shuffle needs this + opts.slideCount = els.length; + + $s.css('position','absolute'); + $s[prepend?'prependTo':'appendTo'](opts.$cont); + + if (prepend) { + opts.currSlide++; + opts.nextSlide++; + } + + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($s); + + if (opts.fit && opts.width) + $s.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height(); + s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width(); + + $s.css(opts.cssBefore); + + if (opts.pager || opts.pagerAnchorBuilder) + $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts); + + if ($.isFunction(opts.onAddSlide)) + opts.onAddSlide($s); + else + $s.hide(); // default behavior + }; +} + +// reset internal state; we do this on every pass in order to support multiple effects +$.fn.cycle.resetState = function(opts, fx) { + fx = fx || opts.fx; + opts.before = []; opts.after = []; + opts.cssBefore = $.extend({}, opts.original.cssBefore); + opts.cssAfter = $.extend({}, opts.original.cssAfter); + opts.animIn = $.extend({}, opts.original.animIn); + opts.animOut = $.extend({}, opts.original.animOut); + opts.fxFn = null; + $.each(opts.original.before, function() { opts.before.push(this); }); + $.each(opts.original.after, function() { opts.after.push(this); }); + + // re-init + var init = $.fn.cycle.transitions[fx]; + if ($.isFunction(init)) + init(opts.$cont, $(opts.elements), opts); +}; + +// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt +function go(els, opts, manual, fwd) { + // opts.busy is true if we're in the middle of an animation + if (manual && opts.busy && opts.manualTrump) { + // let manual transitions requests trump active ones + debug('manualTrump in go(), stopping active transition'); + $(els).stop(true,true); + opts.busy = false; + } + // don't begin another timeout-based transition if there is one active + if (opts.busy) { + debug('transition active, ignoring new tx request'); + return; + } + + var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; + + // stop cycling if we have an outstanding stop request + if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) + return; + + // check to see if we should stop cycling based on autostop options + if (!manual && !p.cyclePause && !opts.bounce && + ((opts.autostop && (--opts.countdown <= 0)) || + (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { + if (opts.end) + opts.end(opts); + return; + } + + // if slideshow is paused, only transition on a manual trigger + var changed = false; + if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) { + changed = true; + var fx = opts.fx; + // keep trying to get the slide size if we don't have it yet + curr.cycleH = curr.cycleH || $(curr).height(); + curr.cycleW = curr.cycleW || $(curr).width(); + next.cycleH = next.cycleH || $(next).height(); + next.cycleW = next.cycleW || $(next).width(); + + // support multiple transition types + if (opts.multiFx) { + if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) + opts.lastFx = 0; + fx = opts.fxs[opts.lastFx]; + opts.currFx = fx; + } + + // one-time fx overrides apply to: $('div').cycle(3,'zoom'); + if (opts.oneTimeFx) { + fx = opts.oneTimeFx; + opts.oneTimeFx = null; + } + + $.fn.cycle.resetState(opts, fx); + + // run the before callbacks + if (opts.before.length) + $.each(opts.before, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + + // stage the after callacks + var after = function() { + $.each(opts.after, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + }; + + debug('tx firing; currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide); + + // get ready to perform the transition + opts.busy = 1; + if (opts.fxFn) // fx function provided? + opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ? + $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent); + else + $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + } + + if (changed || opts.nextSlide == opts.currSlide) { + // calculate the next slide + opts.lastSlide = opts.currSlide; + if (opts.random) { + opts.currSlide = opts.nextSlide; + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + if (opts.nextSlide == opts.currSlide) + opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1; + } + else if (opts.backwards) { + var roll = (opts.nextSlide - 1) < 0; + if (roll && opts.bounce) { + opts.backwards = !opts.backwards; + opts.nextSlide = 1; + opts.currSlide = 0; + } + else { + opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1; + opts.currSlide = roll ? 0 : opts.nextSlide+1; + } + } + else { // sequence + var roll = (opts.nextSlide + 1) == els.length; + if (roll && opts.bounce) { + opts.backwards = !opts.backwards; + opts.nextSlide = els.length-2; + opts.currSlide = els.length-1; + } + else { + opts.nextSlide = roll ? 0 : opts.nextSlide+1; + opts.currSlide = roll ? els.length-1 : opts.nextSlide-1; + } + } + } + if (changed && opts.pager) + opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass); + + // stage the next transition + var ms = 0; + if (opts.timeout && !opts.continuous) + ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd); + else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic + ms = 10; + if (ms > 0) + p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, (!opts.rev && !opts.backwards)) }, ms); +}; + +// invoked after transition +$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) { + $(pager).each(function() { + $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName); + }); +}; + +// calculate timeout value for current transition +function getTimeout(curr, next, opts, fwd) { + if (opts.timeoutFn) { + // call user provided calc fn + var t = opts.timeoutFn.call(curr,curr,next,opts,fwd); + while ((t - opts.speed) < 250) // sanitize timeout + t += opts.speed; + debug('calculated timeout: ' + t + '; speed: ' + opts.speed); + if (t !== false) + return t; + } + return opts.timeout; +}; + +// expose next/prev function, caller must pass in state +$.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); }; +$.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);}; + +// advance slide forward or back +function advance(opts, val) { + var els = opts.elements; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + if (opts.random && val < 0) { + // move back to the previously display slide + opts.randomIndex--; + if (--opts.randomIndex == -2) + opts.randomIndex = els.length-2; + else if (opts.randomIndex == -1) + opts.randomIndex = els.length-1; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else if (opts.random) { + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else { + opts.nextSlide = opts.currSlide + val; + if (opts.nextSlide < 0) { + if (opts.nowrap) return false; + opts.nextSlide = els.length - 1; + } + else if (opts.nextSlide >= els.length) { + if (opts.nowrap) return false; + opts.nextSlide = 0; + } + } + + var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated + if ($.isFunction(cb)) + cb(val > 0, opts.nextSlide, els[opts.nextSlide]); + go(els, opts, 1, val>=0); + return false; +}; + +function buildPager(els, opts) { + var $p = $(opts.pager); + $.each(els, function(i,o) { + $.fn.cycle.createPagerAnchor(i,o,$p,els,opts); + }); + opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass); +}; + +$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { + var a; + if ($.isFunction(opts.pagerAnchorBuilder)) { + a = opts.pagerAnchorBuilder(i,el); + debug('pagerAnchorBuilder('+i+', el) returned: ' + a); + } + else + a = ''+(i+1)+''; + + if (!a) + return; + var $a = $(a); + // don't reparent if anchor is in the dom + if ($a.parents('body').length === 0) { + var arr = []; + if ($p.length > 1) { + $p.each(function() { + var $clone = $a.clone(true); + $(this).append($clone); + arr.push($clone[0]); + }); + $a = $(arr); + } + else { + $a.appendTo($p); + } + } + + opts.pagerAnchors = opts.pagerAnchors || []; + opts.pagerAnchors.push($a); + $a.bind(opts.pagerEvent, function(e) { + e.preventDefault(); + opts.nextSlide = i; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated + if ($.isFunction(cb)) + cb(opts.nextSlide, els[opts.nextSlide]); + go(els,opts,1,opts.currSlide < i); // trigger the trans +// return false; // <== allow bubble + }); + + if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble) + $a.bind('click.cycle', function(){return false;}); // suppress click + + if (opts.pauseOnPagerHover) + $a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } ); +}; + +// helper fn to calculate the number of slides between the current and the next +$.fn.cycle.hopsFromLast = function(opts, fwd) { + var hops, l = opts.lastSlide, c = opts.currSlide; + if (fwd) + hops = c > l ? c - l : opts.slideCount - l; + else + hops = c < l ? l - c : l + opts.slideCount - c; + return hops; +}; + +// fix clearType problems in ie6 by setting an explicit bg color +// (otherwise text slides look horrible during a fade transition) +function clearTypeFix($slides) { + debug('applying clearType background-color hack'); + function hex(s) { + s = parseInt(s).toString(16); + return s.length < 2 ? '0'+s : s; + }; + function getBg(e) { + for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) { + var v = $.css(e,'background-color'); + if (v.indexOf('rgb') >= 0 ) { + var rgb = v.match(/\d+/g); + return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); + } + if (v && v != 'transparent') + return v; + } + return '#ffffff'; + }; + $slides.each(function() { $(this).css('background-color', getBg(this)); }); +}; + +// reset common props before the next transition +$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) { + $(opts.elements).not(curr).hide(); + opts.cssBefore.opacity = 1; + opts.cssBefore.display = 'block'; + if (w !== false && next.cycleW > 0) + opts.cssBefore.width = next.cycleW; + if (h !== false && next.cycleH > 0) + opts.cssBefore.height = next.cycleH; + opts.cssAfter = opts.cssAfter || {}; + opts.cssAfter.display = 'none'; + $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0)); + $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1)); +}; + +// the actual fn for effecting a transition +$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) { + var $l = $(curr), $n = $(next); + var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; + $n.css(opts.cssBefore); + if (speedOverride) { + if (typeof speedOverride == 'number') + speedIn = speedOut = speedOverride; + else + speedIn = speedOut = 1; + easeIn = easeOut = null; + } + var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)}; + $l.animate(opts.animOut, speedOut, easeOut, function() { + if (opts.cssAfter) $l.css(opts.cssAfter); + if (!opts.sync) fn(); + }); + if (opts.sync) fn(); +}; + +// transition definitions - only fade is defined here, transition pack defines the rest +$.fn.cycle.transitions = { + fade: function($cont, $slides, opts) { + $slides.not(':eq('+opts.currSlide+')').css('opacity',0); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.opacity = 0; + }); + opts.animIn = { opacity: 1 }; + opts.animOut = { opacity: 0 }; + opts.cssBefore = { top: 0, left: 0 }; + } +}; + +$.fn.cycle.ver = function() { return ver; }; + +// override these globally if you like (they are all optional) +$.fn.cycle.defaults = { + fx: 'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle') + timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) + timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) + continuous: 0, // true to start next transition immediately after current one completes + speed: 1000, // speed of the transition (any valid fx speed value) + speedIn: null, // speed of the 'in' transition + speedOut: null, // speed of the 'out' transition + next: null, // selector for element to use as event trigger for next slide + prev: null, // selector for element to use as event trigger for previous slide +// prevNextClick: null, // @deprecated; please use onPrevNextEvent instead + onPrevNextEvent: null, // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement) + prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide + pager: null, // selector for element to use as pager container + //pagerClick null, // @deprecated; please use onPagerEvent instead + onPagerEvent: null, // callback fn for pager events: function(zeroBasedSlideIndex, slideElement) + pagerEvent: 'click.cycle', // name of event which drives the pager navigation + allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling + pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) + before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) + easing: null, // easing method for both in and out transitions + easeIn: null, // easing for "in" transition + easeOut: null, // easing for "out" transition + shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } + animIn: null, // properties that define how the slide animates in + animOut: null, // properties that define how the slide animates out + cssBefore: null, // properties that define the initial state of the slide before transitioning in + cssAfter: null, // properties that defined the state of the slide after transitioning out + fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) + height: 'auto', // container height + startingSlide: 0, // zero-based index of the first slide to be displayed + sync: 1, // true if in/out transitions should occur simultaneously + random: 0, // true for random, false for sequence (not applicable to shuffle fx) + fit: 0, // force slides to fit container + containerResize: 1, // resize container to fit largest slide + pause: 0, // true to enable "pause on hover" + pauseOnPagerHover: 0, // true to pause when hovering over pager link + autostop: 0, // true to end slideshow after X transitions (where X == slide count) + autostopCount: 0, // number of transitions (optionally used with autostop to define X) + delay: 0, // additional delay (in ms) for first transition (hint: can be negative) + slideExpr: null, // expression for selecting slides (if something other than all children is required) + cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) + cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) + nowrap: 0, // true to prevent slideshow from wrapping + fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms + randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random + rev: 0, // causes animations to transition in reverse + manualTrump: true, // causes manual transition to stop an active transition instead of being ignored + requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded + requeueTimeout: 250, // ms delay for requeue + activePagerClass: 'activeSlide', // class name used for the active pager link + updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style) + backwards: false // true to start slideshow at last slide and move backwards through the stack +}; + +})(jQuery); + + +/*! + * jQuery Cycle Plugin Transition Definitions + * This script is a plugin for the jQuery Cycle Plugin + * Examples and documentation at: http://malsup.com/jquery/cycle/ + * Copyright (c) 2007-2010 M. Alsup + * Version: 2.72 + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function($) { + +// +// These functions define one-time slide initialization for the named +// transitions. To save file size feel free to remove any of these that you +// don't need. +// +$.fn.cycle.transitions.none = function($cont, $slides, opts) { + opts.fxFn = function(curr,next,opts,after){ + $(next).show(); + $(curr).hide(); + after(); + }; +} + +// scrollUp/Down/Left/Right +$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssBefore ={ top: h, left: 0 }; + opts.cssFirst = { top: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: -h }; +}; +$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { top: -h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0-w }; +}; +$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: -w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) { + $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW); + opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW; + }); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { top: 0 }; +}; +$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1); + opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { left: 0 }; +}; + +// slideX/slideY +$.fn.cycle.transitions.slideX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { left: 0, top: 0, width: 0 }; + opts.animIn = { width: 'show' }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.slideY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + }); + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animIn = { height: 'show' }; + opts.animOut = { height: 0 }; +}; + +// shuffle +$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { + var i, w = $cont.css('overflow', 'visible').width(); + $slides.css({left: 0, top: 0}); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + }); + // only adjust speed once! + if (!opts.speedAdjusted) { + opts.speed = opts.speed / 2; // shuffle has 2 transitions + opts.speedAdjusted = true; + } + opts.random = 0; + opts.shuffle = opts.shuffle || {left:-w, top:15}; + opts.els = []; + for (i=0; i < $slides.length; i++) + opts.els.push($slides[i]); + + for (i=0; i < opts.currSlide; i++) + opts.els.push(opts.els.shift()); + + // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!) + opts.fxFn = function(curr, next, opts, cb, fwd) { + var $el = fwd ? $(curr) : $(next); + $(next).css(opts.cssBefore); + var count = opts.slideCount; + $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() { + var hops = $.fn.cycle.hopsFromLast(opts, fwd); + for (var k=0; k < hops; k++) + fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop()); + if (fwd) { + for (var i=0, len=opts.els.length; i < len; i++) + $(opts.els[i]).css('z-index', len-i+count); + } + else { + var z = $(curr).css('z-index'); + $el.css('z-index', parseInt(z)+1+count); + } + $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { + $(fwd ? this : curr).hide(); + if (cb) cb(); + }); + }); + }; + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; +}; + +// turnUp/Down/Left/Right +$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = next.cycleH; + opts.animIn.height = next.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, height: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = next.cycleW; + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { top: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { top: 0, left: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; + +// zoom +$.fn.cycle.transitions.zoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + opts.animOut = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 }; + }); + opts.cssFirst = { top:0, left: 0 }; + opts.cssBefore = { width: 0, height: 0 }; +}; + +// fadeZoom +$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false); + opts.cssBefore.left = next.cycleW/2; + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + }); + opts.cssBefore = { width: 0, height: 0 }; + opts.animOut = { opacity: 0 }; +}; + +// blindX +$.fn.cycle.transitions.blindX = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +// blindY +$.fn.cycle.transitions.blindY = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +// blindZ +$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + var w = $cont.width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: w }; + opts.animIn = { top: 0, left: 0 }; + opts.animOut = { top: h, left: w }; +}; + +// growX - grow horizontally from centered 0 width +$.fn.cycle.transitions.growX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = this.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: 0 }; + }); + opts.cssBefore = { width: 0, top: 0 }; +}; +// growY - grow vertically from centered 0 height +$.fn.cycle.transitions.growY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = this.cycleH/2; + opts.animIn = { top: 0, height: this.cycleH }; + opts.animOut = { top: 0 }; + }); + opts.cssBefore = { height: 0, left: 0 }; +}; + +// curtainX - squeeze in both edges horizontally +$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true,true); + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: curr.cycleW/2, width: 0 }; + }); + opts.cssBefore = { top: 0, width: 0 }; +}; +// curtainY - squeeze in both edges vertically +$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, height: next.cycleH }; + opts.animOut = { top: curr.cycleH/2, height: 0 }; + }); + opts.cssBefore = { left: 0, height: 0 }; +}; + +// cover - curr slide covered by next slide +$.fn.cycle.transitions.cover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + if (d == 'right') + opts.cssBefore.left = -w; + else if (d == 'up') + opts.cssBefore.top = h; + else if (d == 'down') + opts.cssBefore.top = -h; + else + opts.cssBefore.left = w; + }); + opts.animIn = { left: 0, top: 0}; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// uncover - curr slide moves off next slide +$.fn.cycle.transitions.uncover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + if (d == 'right') + opts.animOut.left = w; + else if (d == 'up') + opts.animOut.top = -h; + else if (d == 'down') + opts.animOut.top = h; + else + opts.animOut.left = -w; + }); + opts.animIn = { left: 0, top: 0 }; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// toss - move top slide and fade away +$.fn.cycle.transitions.toss = function($cont, $slides, opts) { + var w = $cont.css('overflow','visible').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + // provide default toss settings if animOut not provided + if (!opts.animOut.left && !opts.animOut.top) + opts.animOut = { left: w*2, top: -h/2, opacity: 0 }; + else + opts.animOut.opacity = 0; + }); + opts.cssBefore = { left: 0, top: 0 }; + opts.animIn = { left: 0 }; +}; + +// wipe - clip animation +$.fn.cycle.transitions.wipe = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.cssBefore = opts.cssBefore || {}; + var clip; + if (opts.clip) { + if (/l2r/.test(opts.clip)) + clip = 'rect(0px 0px '+h+'px 0px)'; + else if (/r2l/.test(opts.clip)) + clip = 'rect(0px '+w+'px '+h+'px '+w+'px)'; + else if (/t2b/.test(opts.clip)) + clip = 'rect(0px '+w+'px 0px 0px)'; + else if (/b2t/.test(opts.clip)) + clip = 'rect('+h+'px '+w+'px '+h+'px 0px)'; + else if (/zoom/.test(opts.clip)) { + var top = parseInt(h/2); + var left = parseInt(w/2); + clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)'; + } + } + + opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)'; + + var d = opts.cssBefore.clip.match(/(\d+)/g); + var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]); + + opts.before.push(function(curr, next, opts) { + if (curr == next) return; + var $curr = $(curr), $next = $(next); + $.fn.cycle.commonReset(curr,next,opts,true,true,false); + opts.cssAfter.display = 'block'; + + var step = 1, count = parseInt((opts.speedIn / 13)) - 1; + (function f() { + var tt = t ? t - parseInt(step * (t/count)) : 0; + var ll = l ? l - parseInt(step * (l/count)) : 0; + var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h; + var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w; + $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' }); + (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none'); + })(); + }); + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0 }; +}; + +})(jQuery); diff --git a/public/static/kernel.js b/public/static/kernel.js index fcc06681..d1afb180 100644 --- a/public/static/kernel.js +++ b/public/static/kernel.js @@ -17,4 +17,25 @@ function ajax_load_proc(wapper,url){ if(textSta == 'error') wapper.html("Loading Failed"); }); -} \ No newline at end of file +} +// Ad Banner FX code [start] +function onAfter(e) { + var parent = $(this).parent(); + var time_to_next = $(this).attr('time_to_next'); + parent.cycle('pause'); + setTimeout(function(){parent.cycle('resume')},time_to_next); +} +$(document).ready(function() { + $('.slideshow').children('img').click(function() + { + if($(this).attr('link_open')=='new_window') + { + window.open($(this).attr('link_url')); + } + else + { + document.location.href=$(this).attr('link_url') + } + }) +}); +// Ad Banner FX code [end] \ No newline at end of file From 50d3aba1a0ffac5bd67ead7494374b69275ab9e7 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Fri, 10 Feb 2012 16:43:58 +0800 Subject: [PATCH 5/9] brief starting for dashboard,adds i18n vars --- app/views/admin/assets/index.html.erb | 4 ++++ app/views/layouts/_drop_down_menu.html.erb | 14 ++++++++++++++ config/locales/en.yml | 13 +++++++++++++ config/locales/zh_tw.yml | 22 +++++++++++++++++----- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/views/admin/assets/index.html.erb b/app/views/admin/assets/index.html.erb index 7f3a0407..c31db0c7 100644 --- a/app/views/admin/assets/index.html.erb +++ b/app/views/admin/assets/index.html.erb @@ -2,6 +2,10 @@
    • <%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.file'), '', :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.album'), '', :remote => true, :class => 'button positive'%>
    • +
    • <%= link_to t('admin.assets.video'), '', :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.book'), '', :remote => true, :class => 'button positive' %>
    <% end -%> diff --git a/app/views/layouts/_drop_down_menu.html.erb b/app/views/layouts/_drop_down_menu.html.erb index 89285ebb..900437a6 100644 --- a/app/views/layouts/_drop_down_menu.html.erb +++ b/app/views/layouts/_drop_down_menu.html.erb @@ -7,4 +7,18 @@
  • <%= link_to t('admin.member'), admin_users_path, :class => 'orblink' %>
  • <%= link_to t('admin.translation'), admin_translations_path, :class => 'orblink' %>
  • <%= link_to t('admin.site'), admin_sites_path, :class => 'orblink' %>
  • + + \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 07f5ec73..a82bdefc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -27,13 +27,21 @@ en: admin: action: Action + ad_banner: AD Banner add_language: Add language + add_drop_down_item: +Add Menu Item admin: Admin action: Action announcement: Announcement asset: Asset + assets: + file: File + album: Album + video: Video + book: Book attributes: Attributes author: Author + calendar: Calendar cant_delete_self: You can not delete yourself. cant_revoke_self_admin: You can not revoke your admin role yourself. choose_file: Choose a file... @@ -48,6 +56,7 @@ en: create_success_snippet: Snippet was successfully created. create_success_user: User was successfully created. data: Data + dashbroad: Dashbroad delete_language: Delete language description: Description design: Design @@ -74,6 +83,7 @@ en: language: Language layout: Layout layout_name: Layout name + links: Links list_assets: Assets list list_designs: Designs list list_items: Items list @@ -90,6 +100,7 @@ en: no_home_page: You don't have a homepage no_layout: You don't have a layout name: Name + nccu: NCCU Custom new_asset: New asset new_component: New component new_design: New design @@ -114,6 +125,8 @@ en: setup_translations: Translations setup setup_designs: Designs setup site: Site + site_setting: Site Setting + super_pages: Super pages title: Title translation: Translation type: Type diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 7555c3a5..270dbd10 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -21,14 +21,21 @@ zh_tw: yes_: "Yes" admin: - action: 行動 + action: 操作 + ad_banner: 廣告輪播 add_language: 新增語言 + add_drop_down_item: +增加Orbit選單 admin: 管理 - action: 行動 - announcement: 公告 + announcement: 公告系統 asset: 資產 + assets: + file: 檔案 + album: 相簿 + video: 影片 + book: 書籍 attributes: 屬性 author: 作者 + calendar: 行事曆 cant_delete_self: 您不可以刪除自己。 cant_revoke_self_admin: 您不可以撤銷自己的管理作用。 choose_file: 選擇一個文件... @@ -42,10 +49,11 @@ zh_tw: create_success_page: 頁面已成功創建。 create_success_snippet: 片段已成功創建。 create_success_user: 用戶已成功創建。。 + dashbroad: 儀表板 data: 數據 delete_language: 刪除語言 description: 描述 - design: 設計 + design: 網站版型 disable_language: 禁用語言 editing_home: 編輯首頁 editing_layout: 編輯樣板 @@ -64,11 +72,12 @@ zh_tw: info: 資料 intro: 簡介 is_published: 被出版 - item: 項目 + item: 網站架構 key: 關鍵 language: 語言 layout: 佈局 layout_name: 佈局名字 + links: 網路資源 list_assets: 資產列表 list_designs: 設計列表 list_items: 項目列表 @@ -85,6 +94,7 @@ zh_tw: no_home_page: 您沒有首頁 no_layout: 您沒有佈局 name: 名稱 + nccu: 政大客制 new_asset: 新增資產 new_component: 新增元件 new_design: 新設計 @@ -108,6 +118,8 @@ zh_tw: setup_translations: 語系設定 setup_designs: 版型設定 site: 網站 + site_setting: 網站設定 + super_pages: 可編頁面 title: 標題 translation: 翻譯 type: 類型 From ad34d5b8a6b1203196cb42912734d30be4c1b426 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Fri, 10 Feb 2012 10:50:03 +0800 Subject: [PATCH 6/9] include ad_banner query code. cleaned up parser --- lib/parsers/parser_back_end.rb | 25 +- lib/parsers/parser_front_end.rb | 14 +- public/static/jquery.cycle.all.latest.js | 1331 ++++++++++++++++++++++ public/static/kernel.js | 23 +- 4 files changed, 1372 insertions(+), 21 deletions(-) create mode 100644 public/static/jquery.cycle.all.latest.js diff --git a/lib/parsers/parser_back_end.rb b/lib/parsers/parser_back_end.rb index 6d953a53..288cbf22 100644 --- a/lib/parsers/parser_back_end.rb +++ b/lib/parsers/parser_back_end.rb @@ -68,6 +68,7 @@ module ParserBackEnd c.define_tag 'javascripts' do |tag| res = '' res << "" + res << "" res << "" page.design.javascripts.each do |js| res << "" @@ -75,23 +76,25 @@ module ParserBackEnd res end c.define_tag 'adbanner' do |tag| - ret = '' + res = '' ad_banner = AdBanner.first(conditions:{title: tag.attr["name"]}) - ret << "" - ret << "" + res << "" + - ret << "
    " - ret << "' + res << "
    " + res << "' #================================== - ret << "
    " + res << "
    " ad_banner.ad_images.each do |ad_image| - ret << "" + res << "" end - ret << "
    " + res << "
    " #================================== - ret << "
    " + res << "
    " end c.define_tag 'layout_part' do |tag| part = page.page_parts.detect{ |p| p.name.to_s == tag.attr['name'].to_s } diff --git a/lib/parsers/parser_front_end.rb b/lib/parsers/parser_front_end.rb index 66b933f7..629aed46 100644 --- a/lib/parsers/parser_front_end.rb +++ b/lib/parsers/parser_front_end.rb @@ -76,6 +76,7 @@ module ParserFrontEnd c.define_tag 'javascripts' do |tag| res = '' res << "" + res << "" res << "" page.design.javascripts.each do |js| res << "" @@ -86,16 +87,11 @@ module ParserFrontEnd res = '' ad_banner = AdBanner.first(conditions:{title: tag.attr["name"]}) if ad_banner.display? - res << "" - res << "" - } $(document).ready(function() { $('.slideshow').cycle({after: onAfter,timeout:1 ,fx: '#{ad_banner.ad_fx.nil?? 'fade': ad_banner.ad_fx}' }).children('img').click(function(){if($(this).attr('link_open')=='new_window'){window.open($(this).attr('link_url'));} else{document.location.href=$(this).attr('link_url');}});; }); " - - res << "
    " + res << "
    " ad_banner.ad_images.each do |ad_image| res << "= options.elements.length) { + log('invalid slide index: ' + num); + return false; + } + options.nextSlide = num; + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + if (typeof arg2 == 'string') + options.oneTimeFx = arg2; + go(options.elements, options, 1, num >= options.currSlide); + return false; + } + return options; + + function checkInstantResume(isPaused, arg2, cont) { + if (!isPaused && arg2 === true) { // resume now! + var options = $(cont).data('cycle.opts'); + if (!options) { + log('options not found, can not resume'); + return false; + } + if (cont.cycleTimeout) { + clearTimeout(cont.cycleTimeout); + cont.cycleTimeout = 0; + } + go(options.elements, options, 1, (!opts.rev && !opts.backwards)); + } + } +}; + +function removeFilter(el, opts) { + if (!$.support.opacity && opts.cleartype && el.style.filter) { + try { el.style.removeAttribute('filter'); } + catch(smother) {} // handle old opera versions + } +}; + +// unbind event handlers +function destroy(opts) { + if (opts.next) + $(opts.next).unbind(opts.prevNextEvent); + if (opts.prev) + $(opts.prev).unbind(opts.prevNextEvent); + + if (opts.pager || opts.pagerAnchorBuilder) + $.each(opts.pagerAnchors || [], function() { + this.unbind().remove(); + }); + opts.pagerAnchors = null; + if (opts.destroy) // callback + opts.destroy(opts); +}; + +// one-time initialization +function buildOptions($cont, $slides, els, options, o) { + // support metadata plugin (v1.0 and v2.0) + var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {}); + if (opts.autostop) + opts.countdown = opts.autostopCount || els.length; + + var cont = $cont[0]; + $cont.data('cycle.opts', opts); + opts.$cont = $cont; + opts.stopCount = cont.cycleStop; + opts.elements = els; + opts.before = opts.before ? [opts.before] : []; + opts.after = opts.after ? [opts.after] : []; + opts.after.unshift(function(){ opts.busy=0; }); + + // push some after callbacks + if (!$.support.opacity && opts.cleartype) + opts.after.push(function() { removeFilter(this, opts); }); + if (opts.continuous) + opts.after.push(function() { go(els,opts,0,(!opts.rev && !opts.backwards)); }); + + saveOriginalOpts(opts); + + // clearType corrections + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($slides); + + // container requires non-static position so that slides can be position within + if ($cont.css('position') == 'static') + $cont.css('position', 'relative'); + if (opts.width) + $cont.width(opts.width); + if (opts.height && opts.height != 'auto') + $cont.height(opts.height); + + if (opts.startingSlide) + opts.startingSlide = parseInt(opts.startingSlide); + else if (opts.backwards) + opts.startingSlide = els.length - 1; + + // if random, mix up the slide array + if (opts.random) { + opts.randomMap = []; + for (var i = 0; i < els.length; i++) + opts.randomMap.push(i); + opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); + opts.randomIndex = 1; + opts.startingSlide = opts.randomMap[1]; + } + else if (opts.startingSlide >= els.length) + opts.startingSlide = 0; // catch bogus input + opts.currSlide = opts.startingSlide || 0; + var first = opts.startingSlide; + + // set position and zIndex on all the slides + $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) { + var z; + if (opts.backwards) + z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i; + else + z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i; + $(this).css('z-index', z) + }); + + // make sure first slide is visible + $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case + removeFilter(els[first], opts); + + // stretch slides + if (opts.fit && opts.width) + $slides.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + + // stretch container + var reshape = opts.containerResize && !$cont.innerHeight(); + if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9 + var maxw = 0, maxh = 0; + for(var j=0; j < els.length; j++) { + var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight(); + if (!w) w = e.offsetWidth || e.width || $e.attr('width') + if (!h) h = e.offsetHeight || e.height || $e.attr('height'); + maxw = w > maxw ? w : maxw; + maxh = h > maxh ? h : maxh; + } + if (maxw > 0 && maxh > 0) + $cont.css({width:maxw+'px',height:maxh+'px'}); + } + + if (opts.pause) + $cont.hover(function(){this.cyclePause++;},function(){this.cyclePause--;}); + + if (supportMultiTransitions(opts) === false) + return false; + + // apparently a lot of people use image slideshows without height/width attributes on the images. + // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that. + var requeue = false; + options.requeueAttempts = options.requeueAttempts || 0; + $slides.each(function() { + // try to get height/width of each slide + var $el = $(this); + this.cycleH = (opts.fit && opts.height) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0); + this.cycleW = (opts.fit && opts.width) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0); + + if ( $el.is('img') ) { + // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when + // an image is being downloaded and the markup did not include sizing info (height/width attributes); + // there seems to be some "default" sizes used in this situation + var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete); + var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete); + var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete); + var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete); + // don't requeue for images that are still loading but have a valid size + if (loadingIE || loadingFF || loadingOp || loadingOther) { + if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever + log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH); + setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout); + requeue = true; + return false; // break each loop + } + else { + log('could not determine size of image: '+this.src, this.cycleW, this.cycleH); + } + } + } + return true; + }); + + if (requeue) + return false; + + opts.cssBefore = opts.cssBefore || {}; + opts.animIn = opts.animIn || {}; + opts.animOut = opts.animOut || {}; + + $slides.not(':eq('+first+')').css(opts.cssBefore); + if (opts.cssFirst) + $($slides[first]).css(opts.cssFirst); + + if (opts.timeout) { + opts.timeout = parseInt(opts.timeout); + // ensure that timeout and speed settings are sane + if (opts.speed.constructor == String) + opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed); + if (!opts.sync) + opts.speed = opts.speed / 2; + + var buffer = opts.fx == 'shuffle' ? 500 : 250; + while((opts.timeout - opts.speed) < buffer) // sanitize timeout + opts.timeout += opts.speed; + } + if (opts.easing) + opts.easeIn = opts.easeOut = opts.easing; + if (!opts.speedIn) + opts.speedIn = opts.speed; + if (!opts.speedOut) + opts.speedOut = opts.speed; + + opts.slideCount = els.length; + opts.currSlide = opts.lastSlide = first; + if (opts.random) { + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else if (opts.backwards) + opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1; + else + opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1; + + // run transition init fn + if (!opts.multiFx) { + var init = $.fn.cycle.transitions[opts.fx]; + if ($.isFunction(init)) + init($cont, $slides, opts); + else if (opts.fx != 'custom' && !opts.multiFx) { + log('unknown transition: ' + opts.fx,'; slideshow terminating'); + return false; + } + } + + // fire artificial events + var e0 = $slides[first]; + if (opts.before.length) + opts.before[0].apply(e0, [e0, e0, opts, true]); + if (opts.after.length > 1) + opts.after[1].apply(e0, [e0, e0, opts, true]); + + if (opts.next) + $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?-1:1)}); + if (opts.prev) + $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,opts.rev?1:-1)}); + if (opts.pager || opts.pagerAnchorBuilder) + buildPager(els,opts); + + exposeAddSlide(opts, els); + + return opts; +}; + +// save off original opts so we can restore after clearing state +function saveOriginalOpts(opts) { + opts.original = { before: [], after: [] }; + opts.original.cssBefore = $.extend({}, opts.cssBefore); + opts.original.cssAfter = $.extend({}, opts.cssAfter); + opts.original.animIn = $.extend({}, opts.animIn); + opts.original.animOut = $.extend({}, opts.animOut); + $.each(opts.before, function() { opts.original.before.push(this); }); + $.each(opts.after, function() { opts.original.after.push(this); }); +}; + +function supportMultiTransitions(opts) { + var i, tx, txs = $.fn.cycle.transitions; + // look for multiple effects + if (opts.fx.indexOf(',') > 0) { + opts.multiFx = true; + opts.fxs = opts.fx.replace(/\s*/g,'').split(','); + // discard any bogus effect names + for (i=0; i < opts.fxs.length; i++) { + var fx = opts.fxs[i]; + tx = txs[fx]; + if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) { + log('discarding unknown transition: ',fx); + opts.fxs.splice(i,1); + i--; + } + } + // if we have an empty list then we threw everything away! + if (!opts.fxs.length) { + log('No valid transitions named; slideshow terminating.'); + return false; + } + } + else if (opts.fx == 'all') { // auto-gen the list of transitions + opts.multiFx = true; + opts.fxs = []; + for (p in txs) { + tx = txs[p]; + if (txs.hasOwnProperty(p) && $.isFunction(tx)) + opts.fxs.push(p); + } + } + if (opts.multiFx && opts.randomizeEffects) { + // munge the fxs array to make effect selection random + var r1 = Math.floor(Math.random() * 20) + 30; + for (i = 0; i < r1; i++) { + var r2 = Math.floor(Math.random() * opts.fxs.length); + opts.fxs.push(opts.fxs.splice(r2,1)[0]); + } + debug('randomized fx sequence: ',opts.fxs); + } + return true; +}; + +// provide a mechanism for adding slides after the slideshow has started +function exposeAddSlide(opts, els) { + opts.addSlide = function(newSlide, prepend) { + var $s = $(newSlide), s = $s[0]; + if (!opts.autostopCount) + opts.countdown++; + els[prepend?'unshift':'push'](s); + if (opts.els) + opts.els[prepend?'unshift':'push'](s); // shuffle needs this + opts.slideCount = els.length; + + $s.css('position','absolute'); + $s[prepend?'prependTo':'appendTo'](opts.$cont); + + if (prepend) { + opts.currSlide++; + opts.nextSlide++; + } + + if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + clearTypeFix($s); + + if (opts.fit && opts.width) + $s.width(opts.width); + if (opts.fit && opts.height && opts.height != 'auto') + $slides.height(opts.height); + s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height(); + s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width(); + + $s.css(opts.cssBefore); + + if (opts.pager || opts.pagerAnchorBuilder) + $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts); + + if ($.isFunction(opts.onAddSlide)) + opts.onAddSlide($s); + else + $s.hide(); // default behavior + }; +} + +// reset internal state; we do this on every pass in order to support multiple effects +$.fn.cycle.resetState = function(opts, fx) { + fx = fx || opts.fx; + opts.before = []; opts.after = []; + opts.cssBefore = $.extend({}, opts.original.cssBefore); + opts.cssAfter = $.extend({}, opts.original.cssAfter); + opts.animIn = $.extend({}, opts.original.animIn); + opts.animOut = $.extend({}, opts.original.animOut); + opts.fxFn = null; + $.each(opts.original.before, function() { opts.before.push(this); }); + $.each(opts.original.after, function() { opts.after.push(this); }); + + // re-init + var init = $.fn.cycle.transitions[fx]; + if ($.isFunction(init)) + init(opts.$cont, $(opts.elements), opts); +}; + +// this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt +function go(els, opts, manual, fwd) { + // opts.busy is true if we're in the middle of an animation + if (manual && opts.busy && opts.manualTrump) { + // let manual transitions requests trump active ones + debug('manualTrump in go(), stopping active transition'); + $(els).stop(true,true); + opts.busy = false; + } + // don't begin another timeout-based transition if there is one active + if (opts.busy) { + debug('transition active, ignoring new tx request'); + return; + } + + var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; + + // stop cycling if we have an outstanding stop request + if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) + return; + + // check to see if we should stop cycling based on autostop options + if (!manual && !p.cyclePause && !opts.bounce && + ((opts.autostop && (--opts.countdown <= 0)) || + (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { + if (opts.end) + opts.end(opts); + return; + } + + // if slideshow is paused, only transition on a manual trigger + var changed = false; + if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) { + changed = true; + var fx = opts.fx; + // keep trying to get the slide size if we don't have it yet + curr.cycleH = curr.cycleH || $(curr).height(); + curr.cycleW = curr.cycleW || $(curr).width(); + next.cycleH = next.cycleH || $(next).height(); + next.cycleW = next.cycleW || $(next).width(); + + // support multiple transition types + if (opts.multiFx) { + if (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length) + opts.lastFx = 0; + fx = opts.fxs[opts.lastFx]; + opts.currFx = fx; + } + + // one-time fx overrides apply to: $('div').cycle(3,'zoom'); + if (opts.oneTimeFx) { + fx = opts.oneTimeFx; + opts.oneTimeFx = null; + } + + $.fn.cycle.resetState(opts, fx); + + // run the before callbacks + if (opts.before.length) + $.each(opts.before, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + + // stage the after callacks + var after = function() { + $.each(opts.after, function(i,o) { + if (p.cycleStop != opts.stopCount) return; + o.apply(next, [curr, next, opts, fwd]); + }); + }; + + debug('tx firing; currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide); + + // get ready to perform the transition + opts.busy = 1; + if (opts.fxFn) // fx function provided? + opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ? + $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent); + else + $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + } + + if (changed || opts.nextSlide == opts.currSlide) { + // calculate the next slide + opts.lastSlide = opts.currSlide; + if (opts.random) { + opts.currSlide = opts.nextSlide; + if (++opts.randomIndex == els.length) + opts.randomIndex = 0; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + if (opts.nextSlide == opts.currSlide) + opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1; + } + else if (opts.backwards) { + var roll = (opts.nextSlide - 1) < 0; + if (roll && opts.bounce) { + opts.backwards = !opts.backwards; + opts.nextSlide = 1; + opts.currSlide = 0; + } + else { + opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1; + opts.currSlide = roll ? 0 : opts.nextSlide+1; + } + } + else { // sequence + var roll = (opts.nextSlide + 1) == els.length; + if (roll && opts.bounce) { + opts.backwards = !opts.backwards; + opts.nextSlide = els.length-2; + opts.currSlide = els.length-1; + } + else { + opts.nextSlide = roll ? 0 : opts.nextSlide+1; + opts.currSlide = roll ? els.length-1 : opts.nextSlide-1; + } + } + } + if (changed && opts.pager) + opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass); + + // stage the next transition + var ms = 0; + if (opts.timeout && !opts.continuous) + ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd); + else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic + ms = 10; + if (ms > 0) + p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, (!opts.rev && !opts.backwards)) }, ms); +}; + +// invoked after transition +$.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) { + $(pager).each(function() { + $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName); + }); +}; + +// calculate timeout value for current transition +function getTimeout(curr, next, opts, fwd) { + if (opts.timeoutFn) { + // call user provided calc fn + var t = opts.timeoutFn.call(curr,curr,next,opts,fwd); + while ((t - opts.speed) < 250) // sanitize timeout + t += opts.speed; + debug('calculated timeout: ' + t + '; speed: ' + opts.speed); + if (t !== false) + return t; + } + return opts.timeout; +}; + +// expose next/prev function, caller must pass in state +$.fn.cycle.next = function(opts) { advance(opts, opts.rev?-1:1); }; +$.fn.cycle.prev = function(opts) { advance(opts, opts.rev?1:-1);}; + +// advance slide forward or back +function advance(opts, val) { + var els = opts.elements; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + if (opts.random && val < 0) { + // move back to the previously display slide + opts.randomIndex--; + if (--opts.randomIndex == -2) + opts.randomIndex = els.length-2; + else if (opts.randomIndex == -1) + opts.randomIndex = els.length-1; + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else if (opts.random) { + opts.nextSlide = opts.randomMap[opts.randomIndex]; + } + else { + opts.nextSlide = opts.currSlide + val; + if (opts.nextSlide < 0) { + if (opts.nowrap) return false; + opts.nextSlide = els.length - 1; + } + else if (opts.nextSlide >= els.length) { + if (opts.nowrap) return false; + opts.nextSlide = 0; + } + } + + var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated + if ($.isFunction(cb)) + cb(val > 0, opts.nextSlide, els[opts.nextSlide]); + go(els, opts, 1, val>=0); + return false; +}; + +function buildPager(els, opts) { + var $p = $(opts.pager); + $.each(els, function(i,o) { + $.fn.cycle.createPagerAnchor(i,o,$p,els,opts); + }); + opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass); +}; + +$.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { + var a; + if ($.isFunction(opts.pagerAnchorBuilder)) { + a = opts.pagerAnchorBuilder(i,el); + debug('pagerAnchorBuilder('+i+', el) returned: ' + a); + } + else + a = ''+(i+1)+''; + + if (!a) + return; + var $a = $(a); + // don't reparent if anchor is in the dom + if ($a.parents('body').length === 0) { + var arr = []; + if ($p.length > 1) { + $p.each(function() { + var $clone = $a.clone(true); + $(this).append($clone); + arr.push($clone[0]); + }); + $a = $(arr); + } + else { + $a.appendTo($p); + } + } + + opts.pagerAnchors = opts.pagerAnchors || []; + opts.pagerAnchors.push($a); + $a.bind(opts.pagerEvent, function(e) { + e.preventDefault(); + opts.nextSlide = i; + var p = opts.$cont[0], timeout = p.cycleTimeout; + if (timeout) { + clearTimeout(timeout); + p.cycleTimeout = 0; + } + var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated + if ($.isFunction(cb)) + cb(opts.nextSlide, els[opts.nextSlide]); + go(els,opts,1,opts.currSlide < i); // trigger the trans +// return false; // <== allow bubble + }); + + if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble) + $a.bind('click.cycle', function(){return false;}); // suppress click + + if (opts.pauseOnPagerHover) + $a.hover(function() { opts.$cont[0].cyclePause++; }, function() { opts.$cont[0].cyclePause--; } ); +}; + +// helper fn to calculate the number of slides between the current and the next +$.fn.cycle.hopsFromLast = function(opts, fwd) { + var hops, l = opts.lastSlide, c = opts.currSlide; + if (fwd) + hops = c > l ? c - l : opts.slideCount - l; + else + hops = c < l ? l - c : l + opts.slideCount - c; + return hops; +}; + +// fix clearType problems in ie6 by setting an explicit bg color +// (otherwise text slides look horrible during a fade transition) +function clearTypeFix($slides) { + debug('applying clearType background-color hack'); + function hex(s) { + s = parseInt(s).toString(16); + return s.length < 2 ? '0'+s : s; + }; + function getBg(e) { + for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) { + var v = $.css(e,'background-color'); + if (v.indexOf('rgb') >= 0 ) { + var rgb = v.match(/\d+/g); + return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); + } + if (v && v != 'transparent') + return v; + } + return '#ffffff'; + }; + $slides.each(function() { $(this).css('background-color', getBg(this)); }); +}; + +// reset common props before the next transition +$.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) { + $(opts.elements).not(curr).hide(); + opts.cssBefore.opacity = 1; + opts.cssBefore.display = 'block'; + if (w !== false && next.cycleW > 0) + opts.cssBefore.width = next.cycleW; + if (h !== false && next.cycleH > 0) + opts.cssBefore.height = next.cycleH; + opts.cssAfter = opts.cssAfter || {}; + opts.cssAfter.display = 'none'; + $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0)); + $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1)); +}; + +// the actual fn for effecting a transition +$.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) { + var $l = $(curr), $n = $(next); + var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; + $n.css(opts.cssBefore); + if (speedOverride) { + if (typeof speedOverride == 'number') + speedIn = speedOut = speedOverride; + else + speedIn = speedOut = 1; + easeIn = easeOut = null; + } + var fn = function() {$n.animate(opts.animIn, speedIn, easeIn, cb)}; + $l.animate(opts.animOut, speedOut, easeOut, function() { + if (opts.cssAfter) $l.css(opts.cssAfter); + if (!opts.sync) fn(); + }); + if (opts.sync) fn(); +}; + +// transition definitions - only fade is defined here, transition pack defines the rest +$.fn.cycle.transitions = { + fade: function($cont, $slides, opts) { + $slides.not(':eq('+opts.currSlide+')').css('opacity',0); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.opacity = 0; + }); + opts.animIn = { opacity: 1 }; + opts.animOut = { opacity: 0 }; + opts.cssBefore = { top: 0, left: 0 }; + } +}; + +$.fn.cycle.ver = function() { return ver; }; + +// override these globally if you like (they are all optional) +$.fn.cycle.defaults = { + fx: 'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle') + timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) + timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) + continuous: 0, // true to start next transition immediately after current one completes + speed: 1000, // speed of the transition (any valid fx speed value) + speedIn: null, // speed of the 'in' transition + speedOut: null, // speed of the 'out' transition + next: null, // selector for element to use as event trigger for next slide + prev: null, // selector for element to use as event trigger for previous slide +// prevNextClick: null, // @deprecated; please use onPrevNextEvent instead + onPrevNextEvent: null, // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement) + prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide + pager: null, // selector for element to use as pager container + //pagerClick null, // @deprecated; please use onPagerEvent instead + onPagerEvent: null, // callback fn for pager events: function(zeroBasedSlideIndex, slideElement) + pagerEvent: 'click.cycle', // name of event which drives the pager navigation + allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling + pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) + before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) + easing: null, // easing method for both in and out transitions + easeIn: null, // easing for "in" transition + easeOut: null, // easing for "out" transition + shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } + animIn: null, // properties that define how the slide animates in + animOut: null, // properties that define how the slide animates out + cssBefore: null, // properties that define the initial state of the slide before transitioning in + cssAfter: null, // properties that defined the state of the slide after transitioning out + fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) + height: 'auto', // container height + startingSlide: 0, // zero-based index of the first slide to be displayed + sync: 1, // true if in/out transitions should occur simultaneously + random: 0, // true for random, false for sequence (not applicable to shuffle fx) + fit: 0, // force slides to fit container + containerResize: 1, // resize container to fit largest slide + pause: 0, // true to enable "pause on hover" + pauseOnPagerHover: 0, // true to pause when hovering over pager link + autostop: 0, // true to end slideshow after X transitions (where X == slide count) + autostopCount: 0, // number of transitions (optionally used with autostop to define X) + delay: 0, // additional delay (in ms) for first transition (hint: can be negative) + slideExpr: null, // expression for selecting slides (if something other than all children is required) + cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) + cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) + nowrap: 0, // true to prevent slideshow from wrapping + fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms + randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random + rev: 0, // causes animations to transition in reverse + manualTrump: true, // causes manual transition to stop an active transition instead of being ignored + requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded + requeueTimeout: 250, // ms delay for requeue + activePagerClass: 'activeSlide', // class name used for the active pager link + updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style) + backwards: false // true to start slideshow at last slide and move backwards through the stack +}; + +})(jQuery); + + +/*! + * jQuery Cycle Plugin Transition Definitions + * This script is a plugin for the jQuery Cycle Plugin + * Examples and documentation at: http://malsup.com/jquery/cycle/ + * Copyright (c) 2007-2010 M. Alsup + * Version: 2.72 + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ +(function($) { + +// +// These functions define one-time slide initialization for the named +// transitions. To save file size feel free to remove any of these that you +// don't need. +// +$.fn.cycle.transitions.none = function($cont, $slides, opts) { + opts.fxFn = function(curr,next,opts,after){ + $(next).show(); + $(curr).hide(); + after(); + }; +} + +// scrollUp/Down/Left/Right +$.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssBefore ={ top: h, left: 0 }; + opts.cssFirst = { top: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: -h }; +}; +$.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var h = $cont.height(); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { top: -h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +$.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0-w }; +}; +$.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push($.fn.cycle.commonReset); + var w = $cont.width(); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { left: -w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +$.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) { + $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW); + opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW; + }); + opts.cssFirst = { left: 0 }; + opts.cssBefore= { top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { top: 0 }; +}; +$.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) { + $cont.css('overflow','hidden'); + opts.before.push(function(curr, next, opts, fwd) { + $.fn.cycle.commonReset(curr,next,opts); + opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1); + opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore= { left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { left: 0 }; +}; + +// slideX/slideY +$.fn.cycle.transitions.slideX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { left: 0, top: 0, width: 0 }; + opts.animIn = { width: 'show' }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.slideY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $(opts.elements).not(curr).hide(); + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + }); + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animIn = { height: 'show' }; + opts.animOut = { height: 0 }; +}; + +// shuffle +$.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { + var i, w = $cont.css('overflow', 'visible').width(); + $slides.css({left: 0, top: 0}); + opts.before.push(function(curr,next,opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + }); + // only adjust speed once! + if (!opts.speedAdjusted) { + opts.speed = opts.speed / 2; // shuffle has 2 transitions + opts.speedAdjusted = true; + } + opts.random = 0; + opts.shuffle = opts.shuffle || {left:-w, top:15}; + opts.els = []; + for (i=0; i < $slides.length; i++) + opts.els.push($slides[i]); + + for (i=0; i < opts.currSlide; i++) + opts.els.push(opts.els.shift()); + + // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!) + opts.fxFn = function(curr, next, opts, cb, fwd) { + var $el = fwd ? $(curr) : $(next); + $(next).css(opts.cssBefore); + var count = opts.slideCount; + $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() { + var hops = $.fn.cycle.hopsFromLast(opts, fwd); + for (var k=0; k < hops; k++) + fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop()); + if (fwd) { + for (var i=0, len=opts.els.length; i < len; i++) + $(opts.els[i]).css('z-index', len-i+count); + } + else { + var z = $(curr).css('z-index'); + $el.css('z-index', parseInt(z)+1+count); + } + $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { + $(fwd ? this : curr).hide(); + if (cb) cb(); + }); + }); + }; + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; +}; + +// turnUp/Down/Left/Right +$.fn.cycle.transitions.turnUp = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = next.cycleH; + opts.animIn.height = next.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, height: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnDown = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssFirst = { top: 0 }; + opts.cssBefore = { left: 0, top: 0, height: 0 }; + opts.animOut = { height: 0 }; +}; +$.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = next.cycleW; + opts.animIn.width = next.cycleW; + }); + opts.cssBefore = { top: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; +$.fn.cycle.transitions.turnRight = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { top: 0, left: 0, width: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { width: 0 }; +}; + +// zoom +$.fn.cycle.transitions.zoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + opts.animOut = { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 }; + }); + opts.cssFirst = { top:0, left: 0 }; + opts.cssBefore = { width: 0, height: 0 }; +}; + +// fadeZoom +$.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,false); + opts.cssBefore.left = next.cycleW/2; + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, left: 0, width: next.cycleW, height: next.cycleH }; + }); + opts.cssBefore = { width: 0, height: 0 }; + opts.animOut = { opacity: 0 }; +}; + +// blindX +$.fn.cycle.transitions.blindX = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.width = next.cycleW; + opts.animOut.left = curr.cycleW; + }); + opts.cssBefore = { left: w, top: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: w }; +}; +// blindY +$.fn.cycle.transitions.blindY = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: 0 }; + opts.animIn = { top: 0 }; + opts.animOut = { top: h }; +}; +// blindZ +$.fn.cycle.transitions.blindZ = function($cont, $slides, opts) { + var h = $cont.css('overflow','hidden').height(); + var w = $cont.width(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + opts.animIn.height = next.cycleH; + opts.animOut.top = curr.cycleH; + }); + opts.cssBefore = { top: h, left: w }; + opts.animIn = { top: 0, left: 0 }; + opts.animOut = { top: h, left: w }; +}; + +// growX - grow horizontally from centered 0 width +$.fn.cycle.transitions.growX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true); + opts.cssBefore.left = this.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: 0 }; + }); + opts.cssBefore = { width: 0, top: 0 }; +}; +// growY - grow vertically from centered 0 height +$.fn.cycle.transitions.growY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false); + opts.cssBefore.top = this.cycleH/2; + opts.animIn = { top: 0, height: this.cycleH }; + opts.animOut = { top: 0 }; + }); + opts.cssBefore = { height: 0, left: 0 }; +}; + +// curtainX - squeeze in both edges horizontally +$.fn.cycle.transitions.curtainX = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,false,true,true); + opts.cssBefore.left = next.cycleW/2; + opts.animIn = { left: 0, width: this.cycleW }; + opts.animOut = { left: curr.cycleW/2, width: 0 }; + }); + opts.cssBefore = { top: 0, width: 0 }; +}; +// curtainY - squeeze in both edges vertically +$.fn.cycle.transitions.curtainY = function($cont, $slides, opts) { + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,false,true); + opts.cssBefore.top = next.cycleH/2; + opts.animIn = { top: 0, height: next.cycleH }; + opts.animOut = { top: curr.cycleH/2, height: 0 }; + }); + opts.cssBefore = { left: 0, height: 0 }; +}; + +// cover - curr slide covered by next slide +$.fn.cycle.transitions.cover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts); + if (d == 'right') + opts.cssBefore.left = -w; + else if (d == 'up') + opts.cssBefore.top = h; + else if (d == 'down') + opts.cssBefore.top = -h; + else + opts.cssBefore.left = w; + }); + opts.animIn = { left: 0, top: 0}; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// uncover - curr slide moves off next slide +$.fn.cycle.transitions.uncover = function($cont, $slides, opts) { + var d = opts.direction || 'left'; + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + if (d == 'right') + opts.animOut.left = w; + else if (d == 'up') + opts.animOut.top = -h; + else if (d == 'down') + opts.animOut.top = h; + else + opts.animOut.left = -w; + }); + opts.animIn = { left: 0, top: 0 }; + opts.animOut = { opacity: 1 }; + opts.cssBefore = { top: 0, left: 0 }; +}; + +// toss - move top slide and fade away +$.fn.cycle.transitions.toss = function($cont, $slides, opts) { + var w = $cont.css('overflow','visible').width(); + var h = $cont.height(); + opts.before.push(function(curr, next, opts) { + $.fn.cycle.commonReset(curr,next,opts,true,true,true); + // provide default toss settings if animOut not provided + if (!opts.animOut.left && !opts.animOut.top) + opts.animOut = { left: w*2, top: -h/2, opacity: 0 }; + else + opts.animOut.opacity = 0; + }); + opts.cssBefore = { left: 0, top: 0 }; + opts.animIn = { left: 0 }; +}; + +// wipe - clip animation +$.fn.cycle.transitions.wipe = function($cont, $slides, opts) { + var w = $cont.css('overflow','hidden').width(); + var h = $cont.height(); + opts.cssBefore = opts.cssBefore || {}; + var clip; + if (opts.clip) { + if (/l2r/.test(opts.clip)) + clip = 'rect(0px 0px '+h+'px 0px)'; + else if (/r2l/.test(opts.clip)) + clip = 'rect(0px '+w+'px '+h+'px '+w+'px)'; + else if (/t2b/.test(opts.clip)) + clip = 'rect(0px '+w+'px 0px 0px)'; + else if (/b2t/.test(opts.clip)) + clip = 'rect('+h+'px '+w+'px '+h+'px 0px)'; + else if (/zoom/.test(opts.clip)) { + var top = parseInt(h/2); + var left = parseInt(w/2); + clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)'; + } + } + + opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)'; + + var d = opts.cssBefore.clip.match(/(\d+)/g); + var t = parseInt(d[0]), r = parseInt(d[1]), b = parseInt(d[2]), l = parseInt(d[3]); + + opts.before.push(function(curr, next, opts) { + if (curr == next) return; + var $curr = $(curr), $next = $(next); + $.fn.cycle.commonReset(curr,next,opts,true,true,false); + opts.cssAfter.display = 'block'; + + var step = 1, count = parseInt((opts.speedIn / 13)) - 1; + (function f() { + var tt = t ? t - parseInt(step * (t/count)) : 0; + var ll = l ? l - parseInt(step * (l/count)) : 0; + var bb = b < h ? b + parseInt(step * ((h-b)/count || 1)) : h; + var rr = r < w ? r + parseInt(step * ((w-r)/count || 1)) : w; + $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' }); + (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none'); + })(); + }); + opts.cssBefore = { display: 'block', opacity: 1, top: 0, left: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0 }; +}; + +})(jQuery); diff --git a/public/static/kernel.js b/public/static/kernel.js index fcc06681..d1afb180 100644 --- a/public/static/kernel.js +++ b/public/static/kernel.js @@ -17,4 +17,25 @@ function ajax_load_proc(wapper,url){ if(textSta == 'error') wapper.html("Loading Failed"); }); -} \ No newline at end of file +} +// Ad Banner FX code [start] +function onAfter(e) { + var parent = $(this).parent(); + var time_to_next = $(this).attr('time_to_next'); + parent.cycle('pause'); + setTimeout(function(){parent.cycle('resume')},time_to_next); +} +$(document).ready(function() { + $('.slideshow').children('img').click(function() + { + if($(this).attr('link_open')=='new_window') + { + window.open($(this).attr('link_url')); + } + else + { + document.location.href=$(this).attr('link_url') + } + }) +}); +// Ad Banner FX code [end] \ No newline at end of file From 98b74e5cf4a575a570b4cbd840585c4e03bc2da7 Mon Sep 17 00:00:00 2001 From: Matthew Kaito Juyuan Fu Date: Fri, 10 Feb 2012 16:43:58 +0800 Subject: [PATCH 7/9] brief starting for dashboard,adds i18n vars --- app/views/admin/assets/index.html.erb | 4 ++++ app/views/layouts/_drop_down_menu.html.erb | 14 ++++++++++++++ config/locales/en.yml | 13 +++++++++++++ config/locales/zh_tw.yml | 22 +++++++++++++++++----- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/app/views/admin/assets/index.html.erb b/app/views/admin/assets/index.html.erb index 7f3a0407..c31db0c7 100644 --- a/app/views/admin/assets/index.html.erb +++ b/app/views/admin/assets/index.html.erb @@ -2,6 +2,10 @@
    • <%= link_to t(:new_asset, :scope => :admin), new_admin_asset_path, :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.file'), '', :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.album'), '', :remote => true, :class => 'button positive'%>
    • +
    • <%= link_to t('admin.assets.video'), '', :remote => true, :class => 'button positive' %>
    • +
    • <%= link_to t('admin.assets.book'), '', :remote => true, :class => 'button positive' %>
    <% end -%> diff --git a/app/views/layouts/_drop_down_menu.html.erb b/app/views/layouts/_drop_down_menu.html.erb index 89285ebb..900437a6 100644 --- a/app/views/layouts/_drop_down_menu.html.erb +++ b/app/views/layouts/_drop_down_menu.html.erb @@ -7,4 +7,18 @@
  • <%= link_to t('admin.member'), admin_users_path, :class => 'orblink' %>
  • <%= link_to t('admin.translation'), admin_translations_path, :class => 'orblink' %>
  • <%= link_to t('admin.site'), admin_sites_path, :class => 'orblink' %>
  • + + \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 07f5ec73..a82bdefc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -27,13 +27,21 @@ en: admin: action: Action + ad_banner: AD Banner add_language: Add language + add_drop_down_item: +Add Menu Item admin: Admin action: Action announcement: Announcement asset: Asset + assets: + file: File + album: Album + video: Video + book: Book attributes: Attributes author: Author + calendar: Calendar cant_delete_self: You can not delete yourself. cant_revoke_self_admin: You can not revoke your admin role yourself. choose_file: Choose a file... @@ -48,6 +56,7 @@ en: create_success_snippet: Snippet was successfully created. create_success_user: User was successfully created. data: Data + dashbroad: Dashbroad delete_language: Delete language description: Description design: Design @@ -74,6 +83,7 @@ en: language: Language layout: Layout layout_name: Layout name + links: Links list_assets: Assets list list_designs: Designs list list_items: Items list @@ -90,6 +100,7 @@ en: no_home_page: You don't have a homepage no_layout: You don't have a layout name: Name + nccu: NCCU Custom new_asset: New asset new_component: New component new_design: New design @@ -114,6 +125,8 @@ en: setup_translations: Translations setup setup_designs: Designs setup site: Site + site_setting: Site Setting + super_pages: Super pages title: Title translation: Translation type: Type diff --git a/config/locales/zh_tw.yml b/config/locales/zh_tw.yml index 7555c3a5..270dbd10 100644 --- a/config/locales/zh_tw.yml +++ b/config/locales/zh_tw.yml @@ -21,14 +21,21 @@ zh_tw: yes_: "Yes" admin: - action: 行動 + action: 操作 + ad_banner: 廣告輪播 add_language: 新增語言 + add_drop_down_item: +增加Orbit選單 admin: 管理 - action: 行動 - announcement: 公告 + announcement: 公告系統 asset: 資產 + assets: + file: 檔案 + album: 相簿 + video: 影片 + book: 書籍 attributes: 屬性 author: 作者 + calendar: 行事曆 cant_delete_self: 您不可以刪除自己。 cant_revoke_self_admin: 您不可以撤銷自己的管理作用。 choose_file: 選擇一個文件... @@ -42,10 +49,11 @@ zh_tw: create_success_page: 頁面已成功創建。 create_success_snippet: 片段已成功創建。 create_success_user: 用戶已成功創建。。 + dashbroad: 儀表板 data: 數據 delete_language: 刪除語言 description: 描述 - design: 設計 + design: 網站版型 disable_language: 禁用語言 editing_home: 編輯首頁 editing_layout: 編輯樣板 @@ -64,11 +72,12 @@ zh_tw: info: 資料 intro: 簡介 is_published: 被出版 - item: 項目 + item: 網站架構 key: 關鍵 language: 語言 layout: 佈局 layout_name: 佈局名字 + links: 網路資源 list_assets: 資產列表 list_designs: 設計列表 list_items: 項目列表 @@ -85,6 +94,7 @@ zh_tw: no_home_page: 您沒有首頁 no_layout: 您沒有佈局 name: 名稱 + nccu: 政大客制 new_asset: 新增資產 new_component: 新增元件 new_design: 新設計 @@ -108,6 +118,8 @@ zh_tw: setup_translations: 語系設定 setup_designs: 版型設定 site: 網站 + site_setting: 網站設定 + super_pages: 可編頁面 title: 標題 translation: 翻譯 type: 類型 From 60556c5be9a80d5b8887d244a92f02a03bbc5c06 Mon Sep 17 00:00:00 2001 From: Christophe Vilayphiou Date: Mon, 13 Feb 2012 13:02:52 +0800 Subject: [PATCH 8/9] Orbit-bar in front-end and back-end, side-bar and drop-down menu --- .../fonts/websymbols-regular-webfont.eot | Bin 0 -> 12596 bytes .../fonts/websymbols-regular-webfont.svg | 108 + .../fonts/websymbols-regular-webfont.ttf | Bin 0 -> 12344 bytes .../fonts/websymbols-regular-webfont.woff | Bin 0 -> 7864 bytes app/assets/fonts/widget.css | 79 + app/assets/images/default-img.png | Bin 0 -> 778 bytes .../images/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes app/assets/images/glyphicons-halflings.png | Bin 0 -> 4352 bytes app/assets/images/icons_pack.png | Bin 0 -> 37024 bytes app/assets/images/icons_pack_white.png | Bin 0 -> 36045 bytes app/assets/images/orbit-bar.png | Bin 0 -> 2778 bytes app/assets/javascripts/bootstrap.js | 1741 ++++ .../javascripts/jquery.tinyscrollbar.min.js | 1 + app/assets/javascripts/new_admin.js | 11 + app/assets/javascripts/orbit-1.0.js | 48 + app/assets/stylesheets/bootstrap-orbit.css | 108 + app/assets/stylesheets/bootstrap.css.erb | 3365 ++++++ app/assets/stylesheets/list.css | 88 + app/assets/stylesheets/new_admin.css.erb | 14 + app/assets/stylesheets/reset.css | 35 +- app/assets/stylesheets/scroll_style.css | 59 + app/assets/stylesheets/style.css.erb | 434 + app/assets/stylesheets/widget.css | 82 + .../admin/dashboards_controller.rb | 10 + app/controllers/admin/designs_controller.rb | 2 +- app/controllers/pages_controller.rb | 4 + app/views/admin/dashboards/index.html.erb | 1 + app/views/admin/designs/index.html.erb | 66 +- app/views/admin/designs/new.html.erb | 22 +- app/views/layouts/_orbit_bar.html.erb | 44 + app/views/layouts/_side_bar.html.erb | 7 + app/views/layouts/new_admin.html.erb | 37 + config/locales/en.yml | 3 + config/routes.rb | 3 + public/static/jquery.js | 9270 ++++++++++++++++- public/static/kernel.js | 2 + .../back_end/announcements_controller.rb | 79 - .../back_end/bulletins_controller.rb | 2 +- .../back_end/bulletins/index.html.erb | 73 +- 39 files changed, 15632 insertions(+), 166 deletions(-) create mode 100644 app/assets/fonts/websymbols-regular-webfont.eot create mode 100644 app/assets/fonts/websymbols-regular-webfont.svg create mode 100644 app/assets/fonts/websymbols-regular-webfont.ttf create mode 100644 app/assets/fonts/websymbols-regular-webfont.woff create mode 100644 app/assets/fonts/widget.css create mode 100644 app/assets/images/default-img.png create mode 100644 app/assets/images/glyphicons-halflings-white.png create mode 100644 app/assets/images/glyphicons-halflings.png create mode 100644 app/assets/images/icons_pack.png create mode 100644 app/assets/images/icons_pack_white.png create mode 100644 app/assets/images/orbit-bar.png create mode 100644 app/assets/javascripts/bootstrap.js create mode 100644 app/assets/javascripts/jquery.tinyscrollbar.min.js create mode 100644 app/assets/javascripts/new_admin.js create mode 100644 app/assets/javascripts/orbit-1.0.js create mode 100644 app/assets/stylesheets/bootstrap-orbit.css create mode 100644 app/assets/stylesheets/bootstrap.css.erb create mode 100644 app/assets/stylesheets/list.css create mode 100644 app/assets/stylesheets/new_admin.css.erb create mode 100644 app/assets/stylesheets/scroll_style.css create mode 100644 app/assets/stylesheets/style.css.erb create mode 100644 app/assets/stylesheets/widget.css create mode 100644 app/controllers/admin/dashboards_controller.rb create mode 100644 app/views/admin/dashboards/index.html.erb create mode 100644 app/views/layouts/_orbit_bar.html.erb create mode 100644 app/views/layouts/_side_bar.html.erb create mode 100644 app/views/layouts/new_admin.html.erb delete mode 100644 vendor/built_in_modules/announcement/app/controllers/panel/announcement/back_end/announcements_controller.rb diff --git a/app/assets/fonts/websymbols-regular-webfont.eot b/app/assets/fonts/websymbols-regular-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..4bf9c07a4319669f95fc8e505d1b7c8022e618c0 GIT binary patch literal 12596 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 XTeYmJsxg#)htuy`_MT8xRrS9BXhLbS literal 0 HcmV?d00001 diff --git a/app/assets/fonts/websymbols-regular-webfont.svg b/app/assets/fonts/websymbols-regular-webfont.svg new file mode 100644 index 00000000..ecf0e309 --- /dev/null +++ b/app/assets/fonts/websymbols-regular-webfont.svg @@ -0,0 +1,108 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 by Just Be Nice studio All rights reserved +Designer : Igor Kiselev +Foundry : Just Be Nice studio +Foundry URL : httpwwwjustbenicestudiocom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/assets/fonts/websymbols-regular-webfont.ttf b/app/assets/fonts/websymbols-regular-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e7da1ba15cecd51a1f4165dfcbb6856ff3a6c810 GIT binary patch literal 12344 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 label { + width: 50px; +} +.widget-box .form-horizontal .controls { + margin-left: 60px; +} +.widget-action { + position:absolute; + right:1px; + top:6px; +} +.action { + float: left; + display:inline-block; + margin-right: 5px; + opacity: 0.8; + filter: alpha(opacity=80); +} +.action:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: pointer; +} +.select-role { + display:none; + overflow:hidden; +} +.file-upload { + position:relative; +} +.file-upload .file-name { + display: inline-block; + margin: 0 0 5px 5px; + white-space: nowrap; + width: 140px; +} +.file-upload .upload { + margin:0; + padding:0; + position:absolute; + top:0; + left:0; + opacity:.0; + filter: alpha(opacity=100); +} +.file-upload .upload:focus { + position:absolute; +} +.upload-picture { + margin-right: 5px; +} +#widget-link table { + margin-bottom:0 +} \ No newline at end of file diff --git a/app/assets/images/default-img.png b/app/assets/images/default-img.png new file mode 100644 index 0000000000000000000000000000000000000000..01487586423a970772b98b7d5775d11d0bbb6ddc GIT binary patch literal 778 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/icons_pack.png b/app/assets/images/icons_pack.png new file mode 100644 index 0000000000000000000000000000000000000000..5c29b80fe83998654ade9b69f13e883a24efec8c GIT binary patch literal 37024 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
      R&jB}9H7_Pjp^VLwYj5bC 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

      eOjg$4tg|6DIiTO8PtZRFGi+OE3V!AIO`pOBE4 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 LlZRui10v-gnRzg-4k2~AKYPrPS6Q5 z%q8#lz4gAk*1hlkb$hMWTGd@u-F41B`|OT*r>=;HOMwdj0PvKR{;A+^)%D#JNd8r=*yb0eT!%fF zD4@Cd&chz0!bJ)I*!mPO{lLl7KoKN{8RYno&vg34#^hPEAopNd@51HZ z*vRL_w=FI0?d~qV?Uyk!8`blF0RJ-W)k8Ym1c2@lSDW42jKO@y!HQ4*ZvGm-R4t-{ ze8&kjU)_&Wyl;7ix~HB6_A8sW>9fDw(Ij$>l}nGl;41<~$b4rTV46W$Zf|hjVMuHU z0&49f(0miPN{uZru2onF^gs1(BLIN&4(Fe9tk@VqHX&OOPZV4dshGaW{04un!9D31Y(lzAyLRIu&`7 zg6lQK=bksowv`G~gev4eo3i}Gn;u7+n=$3qNFg3Aln0xtu)$xBlaL*H-TV6$7Jt9P zYwp25nYuTeIEfZxb->E!6@wJDx|J9m5my$FI?pFW!ScO0LQgzp=*(!OmGo8h)fbgY z>8Kb52$yk$aWFzPf3W})OH~?~+X-*_UzzjqhUqJDGAt0q5%UoEhRgN~GZIC}^0BnV zqbt`HYR?eOD9kv$XE@+2%MehaU`QNUwzRLu5=r8u;~4(Bo3-1w%fCyxOMh;Jn`JKL zTKHFMoAv#u-COcKf<1vfOsiBrX`O=f_iLqj+Ju5}hB8%o&F^b8!%B$-KBtRJgpew$ z6jkN_n5D2Gvq9L_{QlHVxb}laJ!ML7X6!)mcgk;!OV8(c-$+7+!ojTM8LzNjfyq5z z)ugHxlg~zx4{5&^<~>S*%vLv-^=GjN<-y`-AxhB|DFHS$T2!digV*3!O3T zxH1zh|7ryteyyD{oVnx*o${=AM_QCx;4-n&uySyzv$kYmfB`ZB)1XhaPeZm)Gq=uk zr*n|*nFV=+7bm?vUd6Z1!GitFbrVZ|9_$^dNa~I#@$#}f5n2AX{CW-VFOsY!v362j z|7Lzt$APhyq+A3dmgNJBA~V1_s^ zln<5x%YbHVw0t!5GURM7ZEm$vuHQ8*HaKnWboy#2Vo;>7V`$uWZ$XPiCG<`VU+tAMk+nAq0>`{+(vxF}8l&EUk=LMKBq-%{}BIJSsxv z%NTcx1a}7I;M#E4?%PjSuEtwFGgny|4H>^qN>^%5g-&fx!&Y;~1#;N34fx%s`i5mU zHTR|^pXK~`ZNE_&pdqUf3~quk@L2F9=v6^$TZ%l(5oT~QiE9bBoE?cBknlR+x`FAq zaBs_S%a}%=bGGT%4cR~jlqJdsH4P{UVnPFBLF*_3@+ciIo&xvAV8bI+2df zZIdREj{8#eW$$Mdz0L4(d=)(cmO7a*Y5U^qyMW&dQ&?vEW>I|s&sn~PebxIW8S4_R zPchA#BIr52D(k)>cPp1Hx1Is!)ex!SdMn5-QO<1#S{7~>XqO!1wl)}_*U!>dc2J=b z;byNEa&qY2xIeiF+s@j4w&P2d$}?>2;+;47>+)*}X&E;Wr)aX2YPkBFq(9OG?4_j9 zOy|U&OtHA$zo>tKfjrYf)8UJ zh-Q|r|hS^aKc+!Zp7QrZ9KWUmS5pXnP6S%2x*pWE9e2Wc3PE;OiqYNY8Pr> zYTs%LozAQ^nL+WK1#zsYxw z##QQ$t|vnnGZ;uLh8NAywz+xg8FB6RaSI$riZ6y}yC1UPo?LiBcsenegWC))a^AZK z2%HTB4W8(-N3?I{7S=4S2Q`?Q$4(~wJY69}EB(&M+^Ah+Tw;3RaNXx#afKE?QvhV( z{q{n8#CG}M%WNX}91@-NBg;R4`)2jyN`A91%wlrG4&NExPVi}KMjjOf6YCV4{BYj- z>AZerk65o&FTF<8)ba4sA?P7-R%56mvm?E_?Sp;WsZUpvuQlR;GFy0Z?Xt`Jj1;vn zpDiN3)^*|Ij2J*%ZIG@7xUnE7$2yigSx&1uH9Ac%rB0-mWY@yxC5;|d7vZaccDLmu3h$U-b3%-LiQ`43~&WTZR+ zf9H>&lhdiwc`4^9i9L>fMaaY6Bl4P+!C!+k-6LN7ye5~rcPBqRS3RlW1snJpyMAabVRe@-Y3IT)hVUZ?g@lyqF%bU7?K06@zb9ri6nO-qdC!%}BZj5r z0^}N(NE1v+N_^RY7;1O=a_b!7vZivPz;k1|Cu)QTBG3SZ#vbK59$-C5LJz}SRqz!` zTFwM0;fZjf1>_RM5TVzz0qsxp2T7vBz79&u6%vkE>&>EoKvVm8C&C1)r>^8>#)JuN z;rC+}yE<)sOt2Ef_rHBt&1wot`-i{RdzJcsTZ1%uu8pyFMTwifK zzN%WCuF4(-0Hh6hqN+)n8dmey!%+ zA9=;k*Tc{L$2-T&Y{^8ferfKqgOmMj%Y;BsRWq-3(FV%WI8O6H&0>7;_94c^p2Ff* zH$L2owoiTKRfFefQ<^x)*@YWLC0gFg@YANxRbj0a}lr7w^GZFZ`U_Bmqrq3P6M&<=ayTQokjEE_3Vr)UO_+~G^M!B)!gH>lu5VMRq9Gh8;=1vM& z%zls-HTTXI*1aWF7kA%jLagSAi*Dr1T`3OTA@-M^+4-VqAmKw@3_||<{u|0W zZP4z+hX%oSZ0Q;j7d_S2#zuL^WLLP$K)3X5rXJnO;-(Vj9fQ=F$0uKr#M^H39yAhZ zSVkX&cF%hA0Hfvwwi?43X=oWD6^#m2`9UUm13SaYroscn2m2$kxqP(7UJ${(P98d% zj^M9yG9A748|zSD{w9~A&0T$tJWAn&j4+M?jO$(WQ;+hmuDK9Q8D4_HLcspQ)Q$8L z{8L~5>he?3gdOhPSgN=S>^90vvHJXRO?Jg+B+6{?PHv2HGczO+ibA`vP-W z#C)X$si3eZ-<OV+ z7&5<+{~ECde=h8kLRX;D^kAi1d_l7_&BjWTvCy?bX%k{n=`$tC-}?6ap5?kAe5f#% z$?-vd1HlHQjD6>{y9%uh<%G$iYpac#pR#}_c38IwaZlSjUfJU%UP+wZHdi-Y@C<&- zD{ER2zGh}}9bH@RKhLaZKIi>q2&rVSzs-h9T~qryFHAFWa3D{T+7EWTe~aF?@1asD0f&qX(aP{f_=E zw#|Fenm_dnx>1>xT7es@?9+%z@C^2f)>k$Rz6P0yws5Z(t?h0o>w{v_cw%|XE(KGb zzshU*g27@m9JZ*c^CRdJ7OV4uLX7`UpJ3#lZQk9@G~>l5zgS4(IaC-OIqB=-7UK&~ z0%AY!FI|wI{e8LkFihyc>zM@`7+AmQtm~}T@s@NzYr~~8*HvFL5`oV27s1g~7d~3; zda;dVHdBt<&6sddojG#P9XW*D*ny=1bN!q@HYkc8a;fvCO*oz@NV ziV29%gP7rv$?hlIp?4Ba`(^pYPXL}~^|(r&iYszr=gOgBf=fuyC(&c&CugbH#UV^I zp3C9ga`lowb}+M3ZMkPs5xb4Stc5npM^b^=-hrH3ai7Y+bT9l=AH1`#V#piK8=qV# z7vf#~0_Gapv8<&H*d&eG)vt=>Pc@7j7H)S4^1&Id&h*%J;({nvhBZ~h$V2Lp{B9DA zCRLA)$S7Dpqx7SHmFAif$eee8fyz66Bd#ezQ&J)%=%q+D;mUL{l;gUqQTjsZMM(Ws z!rB5rkTiZ5eHZ7b>b2FAN6(F|^tb`ECh=IJ{X3we`+s(5IR8%mQzj*a{_g~x=-(Fb zzbzqnB%vO?e$c<00{*``o7cAApFUo`UsaX2EXoUHu??u7$qb#&^4Lb=ie6a9oZtN{ z$Iy!Nt_#0RQ~4b^+z{@7Uf6*h2jr`$?M4XVm)kk3Dd-P7Za4EXzc-zQj2tz-#`_pp ze$|zA9$>VQ<1>lxZuLja!B=l^A(c@zhL;2HnZ@|z%p zG{VWX&*<&a?FvTKR~)qwgqPm7SJ)kAL^jQ8uZ z{qJsk=R9uNX6U?&uG5oKedg}Nb>Mm=SCUAo6$oLd(i%JCG_Rv@morL|ZhwSdSN~v%!Uno&CwNhjl)BT; zNX$G`I`6qBdp#2gcOvtu*3DkY{h`&ZW-lZ#0tb)n1B*0dq;y&7?#L{cjh;A90f#Ow zsq&;Jh+~xpoHFhR;!YcXF~4I;pVw4p@X4Cl<{v$@HrWp=oNg+YGhA2-)M59e72E}VE)l#2OeaS;Abx6gi-Sun7u$LV(ZwICfUYS^?C zW#+KNPEKD2tnBc^afb)e$a4x`2vtegSrNqlcsA@FlN%(L2T4Lic;}-(2hL2}qYh3tBf^K$;K;f=eYv^G*1|m)8Ql4~PlLe{bZV?Pv+0Oe_D;nB`eaXF-oLum9vaCc%Zw3O0OWv%>H9>L$d)hu_V15}tH(T{QR;c7V>a&~PdNyKYKY)>z)MKayHG^bJ_BbUu+e z>RUaGN_?;;C|xr+@MIA((el`3DItuO-|c`k!`}O~NDtcXta{YYf8HLyjq{(J`vKQX z?Ft5-fljLuPJj70#_7ta=?oZhp2pVFx}V?iT2V+g!p<@k880b1rV6^-E895Uzo;vz zwy2Vv$jDdA7*xZqi!L4(FogCayuO_eUsZKBnzm>y-zeH2`cU*fLy(G`oD!v}DIk4^ z^(l|~o;mp5jL!YAmEtMXZ*Ww82=#kdA$MFAuxP()%fF_@FC;#8r|U5)=m{ymmz3Xi zrjCf?!talY#bl;wI_B%UcvGi9ZA499Q}xDJWdXas$hGt+Eey;43FXQ~Y7(>uUE;>h zJI&ZHww>n;6cF>VL96$|dShpW`1`)MYG(`{9?C2Gv+^rz&<+pz&1Qxt?DJ5X?c1@y zjeDy-cLpX68EBvEXj9eliII21XKUu_EmJl7w6wzPWg3O?DA_{TdNrKCB+$rb-1ARw zN|HKz8Rte8=3a+HC+c_OfN&h1?KYq1z|M!A`newBu7&f}yh(TV>-Vu*s|;1+aiV)$ z9gqG*+3_I6-Gyegs9SjcpuqC&Rytdf^-s2jDJ>8=YP z({1#N{EzY7Rv>zjce(Al;Q^I>5AiJl(o?b1dGAv^lHPnR1i0IJQIfEl`-q!zk5rA~ zGUYondY>(p?0*Wny&TtG7@U2%+_u(??9H%A2Pd=j8%||6&!XzSupJA76|F1Tj-B3u zR5uTn-LKB-&@=GK_ZnPJDbs3a7em4{2GgKW|y0* z6XDLx$7!Jj;TbjxPt{3Y8Dvm22;CWXXz$j2lq5NC^K(gd7Jq~6*V=5ZIl5GPHny)d z`5vRVmSgqn32vk?F+4RLeDssrAZAV=-wTAOV7)`PC-Q$dl-}qU2bPwGN7ucWBz<>+ z`(#%FEbLHe;YOn-2+sDX>VzveMGKMJ$IULtIiv4)xh|j$J{0A2iBMBo)FiscfzG-X zuGCJL%|*$3#r3aTw!)X=Kkssx`))KIF1Y{nIG?ys-wh)|=dsMF<)w`~s~gMpSFpTe zh3f=Mo9NiXPabYWa)TOIkTLF6*XT3VZySwoOX0H5NdX+SrsEJLUK{~L>eA3 zukdsu!?WSCov)r^h#{qI-m_Lgj?zF6EHhtd&iGJ4rJu7?l<|W6a%$O#+|$;_++fAqm!@Zl?3O5*=9!zm{-LjX=!5jwjNXopqBQ614F3bZcwER{gt2 z&t5ah1Q5T8TW7a}ld(BYu@|XPJ>^DK|G+<;`SPl#ePMi&P?GNXHl(hKs*Y=5JzF!VQWU?^W->ipuds^H9Bqv{85gz>mp;IMR=GLWBKUiYq z>a9l|)(IPzOV@?#vQil*BnuM%q4F|Zo4f<7aDoh=Iq0z2((P*r=aCtSTG@ds&ShW` zrM{F$)#n~(5y#Dp8)S-)pKsO%9~JH_0KNOU7MNU(|DELD)E%3OJ?U)&MzISSTK&~I zV-IS3mg^3ZFjEK5$hU5}cS75fLws26LQcI--yv}AmN~yP{f_2%b zoUZ#f2;EYs7`s0SL~4+V_@BzydEAbO{0A=n3I4wYFCVeye}Ly7ktdc~a=Jisxm`86 zWs-psHlQyaUHudQaCTsCqfk4)0QRpraWPyx5|>y3yIZv;YvLFcNcm45e)&`bntz56 zD*?__Np}URD_=BplZ8|lJ#80|zbZ6~CL~-6SAw)l5GJ75iQ>Z;ojgBqs}XwFjaqU5 zWeL6UZ7x25Ye^EMH{Z;~6!zVk1Ut5XPH()!jrWO5#8nSbpm)ZPu+~t{@F`sKcf((b ztv1P(FfTi}#iEKuk+(OFJ>d<@y9Z}^OJ<-XyNhA8prZ=m(!o`%3GHw9KhB$84w(;d zIK|b3{Yg&Gny6I-;`}5tKpj*6UUBmURB!utn`rrlsRCE81w0s}k9y!%-U#u>ur|%RixzpF+3(*mn z;|S!oxCCg$bY}e|N1HKL=M`-wNaS}@-HY06^ue8<-k82VRdzJm?+^m`r`eAH#POvU zL4qWM@Vb>ke#>EuGKf&@=J$z;f;e?tc35MAOF^%aH%ALRLbbnOLVw!_XyHYdVF)#R zdK$CF+;5#oPc{4JfKVAE5%vYrd{Xrxa#&B}s*>=)9d_t_+`RGTi;I1eqrb{jSgeNL zNwn7CmUKAR5$acp~V_S3ALp-7C8QgyCWE>Ne zOb|E1zsYeTixlH|^V)CT_XP5Vc7c6iz0t45?Xq1BxESzbr@pR7C$%yQ3}Xm~HHcnJ$ZL^V){^`&wKqY%)Xk_$&x`TM=0MQG)r+ieh#A#cv7k%yqu= zUTK&jI#O_EWz!>819Y$vExB7>p&u-xmVk zXJ^85+|s!v-k`J3X`fErK0LwzLvQhBe*kbW`X5cyhYptbbA}^%(u;a zyFSN`mE-Eg@i=LMXR@yRa_sT5R#N~S-qP#{T}$dR|{lc}Xpv#cE)QGK{4C^mHMGVsSS+htAgjA;^q$>MH* zaB`+c0JE)XEZnQHlQ&{0*FwA@C#~=4tQiLE@xXP&mj!LdJg0rC;c$ELT&|j7cS!xn zZ)O3%vfj!2G;rq7oJ8PRGZ*z)N5qNC{?f{pH3%N8+DXwo>a4pP94&Ybp+qZ=5l|#w zr#HPGi?+^2kL{K9XXfE@CX3b00WCTomIkD6Z7Hk3v?XVsr#{F>Vlm3y)(nIprn7ER zMImxCLgH_%tjA#pDQ-^4d&0Q#lLW(52t4>xk8|GV{Iu_{M(AS(f0mLVl|%>9fAEuQ0;V;*4$U^1Abuj+R(IpTR6k3p z^b#sBwVbuLLyl&v;dzrf>Dx`W)}2hySS4E9QjC?sb|dil)G=d)C_ajxx*ccrp&g>D zH?}oV7MCIAKh0Vs?ltam?f_cxNSXe`zl@NViG{UetpzFdtj+4+ zRbRXQ3iZHwd%BecPjTD3`j+FXs>Ys!J4iNE_A}3iC>EL%IRB`Sns$;gzrXSg3*_FY zu-VIXD`*gWOALpNo<+uG-U{K(kuim6dB(3#5*QfonD)lFEiiP8+)N`<_iaZ!SVQR! zbL!4EpKtcl(FJz2D%)0)f>)1PHiK0uk*8|6+Yj=+FZ}kjwG$akoTt0F@^3}7^dyeK zIAKFczO)R_T3;RXeA*Pc0(}LwOT9T3_sq50evLczs%64fHfxQ!sA<5FIAHVPL%q88 zmeL<%)E%2l{>gKucWak)?E8+K zZlS?@lm>Y*mmN=isW0op3t=wz+)4;PeN5&H9Ip0UUu)!*cl_zhl2Uwg?{W-`YpEyH z{useeIzZd#glarh5%T$49i>x@N{3ZfUG+jC-k((*_C;;H@6S6K?+?bAV?shDr$nk$ zo9%@A@v&PenV}>_OY6h$KP3+9S4-+IJED>&F$em;xeC3m5*H8T0BdP0#tzxH-Av6K z#VzdDHGM#7McP7oCzthqJF%u6T?Jw+AlN@i8G4V0=5UPj1ieH{d;Q}A)~VLN;cUIq z!%6EmCdrmL_2aOTPms(W`ThzGG|eWYD2|dRmPrXSI(I0t>yL^64n$q7 zw)ya z!cfuysJ!UZFYJRFZNGlpyY3@R*@;*Ty+xCSwbZfDgMz~$oPNH&-`@L;Bxh*I#$9pWsQdQTHkf$wNo*v&rrD-7 z#P`+BiWbSOz3Q#Hx)JUZ!DsB{(!#=L1OR$VcJS)~r>WEhMvtuC`DXAxUN7jqAN{j` z{NDeG2K--9hyN2n_~h{skIR2ZML(S3vhY{PjhEO3fV0-PSw?5CCmG93ojkS^5H2}UnV2;1=|Omb)#$qKCnYJb)w<&Czq zUhMip|Iu=c%}Q1TxqN-b{`^?F>&V?WxCtMCJ>0PwgzRVvY@NOZS3j3X8=D?uzx8zL zLeMEfj@jc|Gv1&e?5w8ldv`f&5`fkCpbz%LcBdRkr@7K*Y`*+4mCWLVRS(6Q}lCMJnxw5nit1Jcl0(oADF8mcRV21MuMee zI)n5}t+Ssoz3PPCJ?DFHE-n<8Gud^Ve0JbpW!MSz{{sLBGCC7aNXtFU4f?_a7O%UY zLd*tuuG#)#FX$;6z{&_A55`I6Z(j>*Jo^H?9*0xhgX$Q}y41-}ngC~#q}*=veT29X zN~Qrh5v&wL^*8ZN2K`B|{+gJ#aIxUqE5>Raaw#K3d79K5yto5}t77b&veD+2Khq|2`P+AcLvax8^*=kJMAo~+`tn^~pdv^(c z1c9Dqq!cg;r%55dh67KWs9peP68{`IZ|pWESaJ**k6cUf4!+#y-a!>#tVbzk>=41j zK!F}vGlQIaJMEA{2?q@5*KZ8Tl-XIB0GB>=H&&pj{H}2yG>BT?&;mq|5Xi8kVUd); zGNE)$`@Zw}qNGouY|TK0=!pl_3%B(5>f3W92_*obl=JDaCU?w8`mQ*9x6E#J;`nD1 zs5YiutnEM+4~8A*b#V#rc_GMtN@iz`tUcWwO)0eylL07gm>g- z>;6p?aw#;X_=3ua@Wv>XMY6H-{4d2vKn8TZXkI1f#+frAbFP7f>+T;J#|xib-r%b_ zQ$VMq;~|QdQ0z|edG04*u67dr$oaJ_C?ExMkyYOs5gtBBu>3)sZ6Mv!kcgm!>oR1( ztPEbYwEMum-!v_fBjYZT9;`SOl znUj#IAy|OF{U6-pTWb!Y%PI5HK3qSe_0BJTp7`vom_@)GAc=oIDDzqa+?*Vw30)TsgW#FO{wutM{!*mm- z*a9pH+{9)kUV6|Vaq2FqjY{@6{pBU~*ladM_^hbBwu5-2lGY!?1cVIHdzXE0x`tC6 z!CVp%pSBFQTi&l^Xn48v1$;8`%p{KM36yPQ^uNptqQ+<7g^ZSmG)r_e=c03Ztge}cPE>Cm>2xpXIa|-z!S@^;XB(J-$>c# z9to13F)m8J{`UDykboaF?^;fwd*09GjpUfwFp5&QUD*$gXyt1pXTPEW(ChWXMqXYc zah2+xgxry#J?&nKR8kz+Zbm<2b-N5|=374+IZNgFcmIh2`{lcq8O_0aD!)@0@Ca3& zqq5Ps+xoyun4p5B)N1Uim}vaDEcJ`_5+CsHtyDTXJ)_QYPl~O5hU_ln>uvVbwJc6) z{k1G^Y57qP8==gyhrFdq?9kQt-kU0FjuQrw1lf}8Xu>$ayEZ-gy;nK)CTKZ$Hagd8 z^0uTR52S8KGFz_Cup&$;Aqw)Ytwnn;i?`3KR~k0L^{-(w5|2*H?N+2O;^Fb(l>ecb zTu2xGd#>`o&jY}J0LOo&H~;q~|2@6=KiB!Ml3|UQX@ILuz z>K>En>t8$dNhbjg_44qW8)%lWP;P_E?ef5~g)2B8Juh*BX>fMP*8tSUElObrp;K;F z++|%mkckML_%XWDXB#?DIx?g=-$E#f<0)BUltqo$YEJHN#Cjj8EzBs%%=RT5RznERaPWSgp*oELEqc8(&Ok^e zXsw0~V>$1IwGm0PY_}sRNi4Q9;BPNk3H_P@kc*Iu7{*`K>*_P}7zyyVZn@cv+8*-d zu?&^<$(2qD;5RQc?c)_mR(19iCHelog}OLo-)$&jWi!*j+|qw#9|^Vugr>gFv=#e^ zuO6WPg`UxoBnm?Qxx*?#af1=)pT8x&Gd1Uz{brl+vD<7z@(1=6u9+2{J1OD!;FyQR zSdMEAZ>J$s;Bx* zU}AyiNeNS7BG{!Qha77-B<}^)+5}}*&^DKCNV8k|+x4<=mF>&z@UDozY2E67wH$kX zH(cj?ytu7I>CL+3ctu3PylBNU(D>HrX z$PvkS{>W}VRq>_CXE=E$od({^YThV=i@@F8pBX~}6f9lx)i>iAF&ABwTsw_Nd86KD zd!7lX7?u_MTc5yU6OAjHX~^H|i~@AX+Hk`}^L%xutP9x2!R-d-Hx1N=Kl9oyE4iy7AQ;$+O<;$yHclT{66O69t`V1lf%UJcz;` zns&-wZ24chY8ceOrN){{Oa^ETTTD5f3x8jslrul4_6Wpz5;?DdbtzxgBfY1tc|_{V z3ijf?7#-sZhF$rg>f5v&PXU5EQJJLQ$WD@8==MDvmSMCt@_+Cpirc{*%RSk3q^LP} z6}=<9F`@GpE1vi=JqPyTJWw1Kxa`XNYwWvHzntU=?rl%H#FJ}L-BJCcrlOv4VW=yX zh&__sy*_rJ9c@I}iQfAa{oFYAh{{-Vwnau*{_;jtVPA)`R(S-1waa}aux~xs z8M@}rS62n&o8wnUh6I@Ny8yoLuzmwrpdsF@Nk-4}0iHaHqt{1Y=KMT0RVRAVgj;Bd`H`I#D(P{_FM%b2A)>CA&Y#C(CcZ^IaxJPZI6)lKx36$0 zl~8v0Zg#2iF-(23%VN!Z0J|5gQs{YuLF$KQ00}q_6c6GnXxsep$73K}6DzV2`&qmoU z-OmylVx5V_fF3n20zTh+?lHQ-jy8JBQg7Zw$TyjyvrJ+7=GC`L}noA*h(DGP5|J0Vwq;@ zx%AXVX;v;@&f(1w9i4pa>;k_C5*VHZL-PHL%ab7Y|Ih)Ooc~_qpnj z-`217LZ?2v76jj70-9dN^K)oR&tIw9u97O`G-DQ8}@*TzJa8U3W&6Zsm2H?pp+QTLRC);Rwtxwbi&vI zbermd2P-b?EW;~YT0?`w@1GNtB;b~Y>`%O}@s!(z#w^Hdh1?4-cuE}R?rV^oKf+*0 zIZw-bQmD@ih4A+Wg`dsa;1NiY6GbP>D~kPj3>!~I_O-bY-4MCmj4(fE z?LSM806Ip8*6-Oc-&L<-8wS9OI9`p!QpcOl;ZA;M`urnGnmgw^Rpc;!+}?C!XdTDP zM^W;lZrWL2sv3fQ8~lv`y}nGwmG!_RH!E_ijfF7qfFE{o<1VjB-qHP}5NEadFHwA+ zcsu}*^G&i63U@Q~)Jn=4YF)gJ3UD3^SzG^+bHzqyDxlW)GWeXmq|1nVc#qTvq(cO9q0iYKTd${m| zo1wHBtzTB7FE7Z;uPvDGHQDab2X#tNdAb6IWJqy){bxBxo^AJc^3<975ZwgmKdi6V ztM(RGVgsG8u1Cz>nI{OzZeu(xa`*C&v4{^9rN}SRUz%8361CZVX?~a0J#XM)R8nmi z1?(lQvLRT604D`0U8av8?!-r~Wtu_DaP7;bPy~nQZt_s4Dek&rsjl3fnrT?}c6N&2 z331~0K|T})Kn|u7naaj6>IawdIDzwh(YVujrj%hY0+lG1O6+TR6uDbaegB|{mPiuW z8OTvt^>bV`mU5h?QnV%cwMk&dIZP z5`1Al#%I5ENPk6T0G;ewUpMnt3uwarh26^Dm7}9!p%KdF00@eDx~r=WM&W6l=8W3n z-myvfl{cG`M7;W7_^*z4z5idiZC9?A171P0Z$@>di~$DuWB@?wa*&i!D8Wdb#f`B&ld6#LdvA=Zj|@XGL`EVg zN{H2|ywtBIZ=T=_+DEgrDgB?QWB2?k=RdRcf6;Cc#HY-VCj9sofVVw6@AV4V13&Z4 zxpJn#_c0B>PhDV)gA=-2mCi`~6LQ)sDn8mH0z%vJDO-hD6;rupARiPZ46Ns-yN%?V zg9na!p_JuJF1sHm{AFf$L@}&vFeIYv8+RPnV;|7@%or7G24zsr2Jj|rf$A!P#2la- zK|=Pj`a?6w4^a`$$wiMy1!gnf-pb2$V=8U*-x>)MioBl&%}Ng(#YjZOe9wD(2LQOh z9)HoWrM}izH|Ys&!p(vQZ`ap5oN99}QgQx#j0_|h_O-q%tB|-j>)!i)DpgZSr4gVd z%DZG`fxryq9$Y0ZT1o`C8&~B|P?ge12Rmb%GOvdXJc*FOa>ZgPf4+q-iNg)14GYkM zKLGGIbdhGbnX1G(g>9RckmO&?M8~ai^qFPP-w5;q2%DAqI5J; zgBi}0*!j8{)}&&qoBI7Iz&g)0uX>?1AUkq>{_Q-;qbauI2q{E(UTB8XSSc8mC!fLg z=W#+2#G`mazDKFQ5@EivaC;n<+m z=q^)glHZMD$OoUhQmnC{47UA@F$kC3p>bVLUO5JrxmMvo|krbj4sOjZf5?IZ;c2wL@|B&O6@M7WDxUUuzvckvHn zGyOLAd7xO>FvV5@0EUlWNAog}*kEx~QoDY~P9v+>Ikiy?I7uJ26kRB?_-w8w;w?WA z0hOdVH)Fb)-R2kZ!Lm629X>>+qI4pl-h;jjH{9ck|C^zwFxmUliWMjciV&d9KQg?F zL3g#wyvfABE8euHZAJrZCZ3073aLlyq&n;&nm+U2wEoO5`7#(5G@cK}DKr@r7t?4? z7D0DoSu&B@_+o2=)8EJ!&bCdYv1=%+N|?q%(~?dm(O-ZMw-d{aclIJ`gJO^Mb3CRf zTn=-`Z7HvHXM{^D_kQoKRJ1M~Zp13`$kiviaMMD~)GLp;RHl%729?h_gF#xZpp-bR zHY}W$XMdIJOA3h3Jl+M1Otp3?mNQhd)E8J0yj3lZ7^+&n&f4dMBbb12!@OjeF{fJ` z&z;w!Vmh}r$Zr}I#)f#lix7+xL#~{yMzqd08$=J}z-BG6zX-Sz=Jy?!OTA?v9IGy+ zP+GO{a3Eaz?xJZ75qwNfXy+wZeR)N=%U{BsHRTOT7_ zmoXzErABj;=8@AJt%XWu6UTQ|!vDNXDP{r=vQvF;t=el`xz!w)!;iaptwtCFEHUk= zI|&;kZKyWZvstowi2+sd`$GquE&gK>G1Oii{QRb^5?%&80Ra9e-!QaWx?$-QoVn}2@c$Lbu9AV?#%IGOCcN^7+gcltLi}5 zmUtBRW_i@sM}qLAu75|!BL00+A6_Gx7vbZ}_Jbvehv2!8eP|%|BnF9?c0Ys)8T z)%^1SF$un)*$fdpMA9q<6nv?#DL@u`lo}Cw$LOQRUVQY&UF?Mawvzyr>g~&;@TY@y z=;;v2;1W(O!W-f{>E!}4e@y5tLi{5t<=Xgv(Ds#4QN8WnG#JE?(m05Ogmi}jg3>K5 z&5+UzjevBCbP7sHcS)$k00Pp@APvJXtl0r zWtcHu$-3yuHEjqn&P|fE{}<_8O0o0v3Q%`_Prz};dcfs6(pq|SQ9?!BS#ic5)o{k2-b7^ot$Vu z*|B)WX!?}qPBVQ~RFcXA$Lrg>Z)PaZ;XZTC>kZ*=$}V!F&RUCoc){>T%ane`>Ule+ zFMcu=;%anye8q9$?b2AfYLKnjy&b3HCSDf{M0$HZEdKoqfAoe&!@_`vh1BR4u*1pN z#f5w`#GWf%sRy9{bv0kCJ+Zy@^*_61ulK|YD~o>cd=BAW$T)8>KB-21%eU_wS#P)+ zqy9iRe08RbbM$hpVaks`j+-Sr&3Es$mtgqKd)BO!#-u=TD1*Eglb&ngGr7&!{%~#( zt%{s?Zm1LvIjQx=^+U~j4^d?T<|^aQx?nrpHD7Kqh3_ow@4$XT-OGG71?#3rb|cwV zFkXY3(r+2E+>f5J<3{F%oBGVb?0?N9EU9;k)#TO4w1lOG>%Yn+dX@zc5Ij$44U*Vn zyS@DU$FbiUI1w37br1*2{$Wg%R&enxvBQ2S=%fUhIyY8L|4aJ!p0Un z==O6xc5_G_b-{Tkm9*t~M`xA@_6mQ!G2WNxDq3?Wa3whMwwv0R`~O95A}ZLj)5dExPI0H%uiw^trV*=EWFx zCYWGUqy{dpD*LS1OHxRJU^~{~dGm;EMB3Ac_z(rTX>GZfn4Z=g@7u>k-HqW(3Oafh zGn^>d*c)T2B-2V1qobVg$Lp{uP|_`ux#GK1=}~o9h}4$F-r$aBNM+10nb#O~s+IV# z)bQkOHCEH5yOF@!U4?e07Mx?2IYi3PrgS!7%gArTtt^iMm_WikxnAohnp>uuG!Fw3 zx5j&P=HD>*%scb1( z#JW#%$cE*6J0|7-xaKU~ukV$xxv2j;x1 zVn8cP^*;AQ{!%o|T=XN28c5vwb2TT}m_3m$bT5soD`Y3p2I$(bWN3pYSx7dGKnxsa zjHGV&QmJ*cr0yr)2i|&w;|>PEc-k0cjk=CxNpZhbvvv1sLsKXp$GWOqyVpzEzi0b+ zfU-%;twleyWw@oQ#G(K^5qUOBN#-mg>x1;sw-NPZhzW4zXb1lF;3fXLV!o0bm_>T7 zqV3kAiw4(`14wm|Wo?ED+I=GDJcixnNyo zv1dZRXeje&2jj=S6Zm26{!bG^kkw5vH@I4g8VhUXE-bo+fV{wM3ytx*#k@=fuK6TM z`3pxD#P1z}h(K$e!;+eEF8{q?v+qC!EDVgrTHJE&Uz5)imc}2`;W7LzDr7Q40#b&i z1?uz#l|`j>tFu_2a<2Csjc zp-N8cynU(v*Q6+y7m^bL`_($#GA8xZAgD7m@bBFO;K=C_j0y;{i#W@=BO~$l4Hob! zS#pDLlIca@pdTmL3N#lDTZ`XRWL@J!*E0V^vjLx0KsRO`R~xYw%P=E-3)px;JJB$G zgMxF>( za$OHodS)Lv*wdhkxcPn?xIn{LF$_rqZeTqTj7A*ULJgv|w*xv~6xRdO?d{dyA15v+ z9-N@Ws)1OOfjghJcjS1Wx4;QHJYiv8FY@8vflYIfU(J7N^<3X>4X;rZ>LE{b6!*(1 zfAi%N7q$VR(a4(w;Y2JfP03r$+HCL9mPH3>AjL(c6;+!Y19hLv_&37c&#Ds zmz{oz@lmRYpytOYG%5X`5G-gO@c=E}M+l7P+z`qO z-##m96)JHnarN4fjTUuM?4AA~m0m0G@?K-o07ggF3Qtv_eplK>n&P*MO^*mH$PTXLOW#TIQAo9lauqToy2hJ-@t9V9E|yv0-X zzr7Oj`SGwqMkg$cWNk7ISeSh*Tou=qy2TE3yl4A^ywJc{`bGrv$Hfi{#A5)y?w?Bj z`Qd*Q8oJGIijs-~@N59b7HVMav-pa=+nX{S(Ja{*j1t0amP`a6RUk)R4YiwVNn}%P zow805v*f<#e{XW0n;ONSV9gCiCDZ?^eGhcp0CLM$BW52BlT(oJb7luS4yOdOZuY91 z`+(Dbwq9pO!Ss)}=Y3O=8UA2_=6nkcbTIXGFi_sY!A4IUSgo%($9kj#O~>CnF7{Q&j-rh*!J+I(=SjQ5zMt>~ea5PhO)|j`SZt zazVhA)UM1XkjBbhjl{~khHwY?3x}&YI^7FuHx0Ih{0E~}6Lm8crBxk<>J)gmp-B%} z;0#)`o(l0ivu*mUt53k?_rCGP5)r4D$z@R5P%2C9=VC`7ofiO$aBS2@-~g5#s#fQT zQGZ_Ub<|SXJQ~imJ4q9|s{l?A75`DX)1Xs?)s&6j0WXS~XI^L}yM!{}J0W6Zjzvg` z2yp&bofkR|OSE;e89E-hR36WZJ9d~Ut}D(AoJv;;(wZE!x)m7S46qvpzCE}O6m-nh znZFzg?PL#~dDbL2=*{gWN;c=npKb(C2{@}o^E(ckif&x$D!f;3?ecFhoWA|`uJJp4 ziJ6nMOu2{S5~@0{vqt)|)wigJ*xRzI!us+M#P4%BL3G>w75+o&ZjOkl*kKjUUT zO}DjKWRA-eFA=_NzP5;tkbm`4B{3HM5tP%qJsiv(=o zTr4alw9Zq(Oh>_hoz<)_P##bweGF;u$$H`6{zjtQ_z$H^)XoM3Kl?SW8pf)db1w)m zquso;HQvIL|Z zt8Y}(c%}TaemENqfnw%e2up+eIK$#6s6S7UnmcQ@_Yg2OGc`!78+4i0kTi@6Jq{I4 zDj{q!KL|Z*t!aUN3OVYiX*IN@X+RMx*w76}%#+p|9+6COt7@T$Sqvqu` zeGdsvPo$uhM69PNzx6z+S!qxG>P z?#l{-A+$_IgVquuHOMe;wnDv%nWY2m)1GZBf_)6nIPNcN`7z)-a#n{9+zb}AdYeHV z=@N3?-1|nh*EZ|*5gSXkepVa4v#c*KW;io|X`>;uQ~K@J{GY(^VeYNVLi``0a_1Z@ z&K4~k2X8N^$&nv$Mw;0zjkKj)z@nB{QK^=6FB|d^FiU9ug!gL{D^WT(|EwxVbLpOs zOEAIJmcpxTfw%aEMkaYWX$Ra=O@TH}d{Q%*lDMsMsIB)S-RzSGZgV4S06Ek2n5@Ed z7Hzpw$@|#+Gk3ZPV5d6l!o4&YU`+iPBU-zM6O1viD^fu8`CP|8^4~gRv09sgr63I& z-D-~7HYOW0x}G0aiI9ehA}0rKee8n{m;z@jM@2Z;Y^|T0PCaTl@ zgluiEL+erY6T3EBko}Ftd}xPaNsW9(XkaO9&B9&kVeE(eLu7Qcv}tqH$+wa@FFRps zTI5pwR$Ka})~~vo2lkwbb7<6Xxbe7~iwMg!Ig>x_sLbjfMd$%%31EN6W08@M z?hCDUpf_~&kmy?O1#%dg4e{HGn_Zb;XZYhV4{0bOl!vli-*6TeA+ieGPq7GR4GZFm z`WZio)bVJcR5Xvx{APjMr5Q!P^OFy``O}^k5+8;`)inauGPOzhBRosTwBK2Cc_BW_ z3f+A8en#mc%f<`ERO8NcS?`KWAK$u6AuD-jb{w;3($@?ljB`5~22bsn+nV50eItf4 zlj&>XIWJAmoEJ<*1jUb~cyZ5gaUG*4F%{n~@*4xV)`h$Uq@`2VKJ8Rbla~iq*ifrl z;YKO{e2{V$ta;R- z;d=Gm^Q$|L=x!9;^`+7jP-v~MJI#%CR&`~JX&!Z2N z?)W3rWeDM+TgK^Oz1Xkv=y2@-DmP6@>^aZyFnV-ygs!nd8hAV=hmQ{|P;<+?-RS>@ z2TTFVbZjHM^aF#lmEC4PPj)0V_0t5{(m$2y5CrH^EZsq7;Y9O(kX!8o%5UC0YM{AP zG8llx3BGA7$=bpNK^v>h`j(^15@NTU1_2x$?{T z$>x`9gM-di25Flj`qE&vRu?~S>Vo?tQyrL-iwE}Nzzt<#Y1A>dB})HIZ$IyT_C{7fqWXfE6Pf*HDT8HX#2&luxmP4r}(kxqrM4gfQngb$+jO+V~%C;`PoSj zGis*3+^;@(Wh~Ap=s^~oExt%hIp9ODB306Xs-JLCK2)O&6j!UgLf>~5LSa-nvjKXN zQMrLqt;^q)X!P~`X0blrcjJx6S#>|i5&;(p&QX}}cJ9S5k&r0ZZUaD0L7M0jLZtBO zOhvIX1AOLr7s{nmao-q3Ne&!me4*U;c z6Qp($#}#L1RK5NmD5@RBU+;MM{OLS~E%tW{umV?wLGtdY+`LW;Bj_U44f9GJK_-cf zrzj9%s=I9>8K2|J#D`=E^tBxHTk&?!TF!r&A>Uz@hZ{vGuwbh{Z`Bj#0T4VaDLuHY zA15|bz>yDuMqKN$NF|*i|F-3@jo3*9 z%a*zOZN>MneSnvQ)PsWd~M%;_-YbJSJQ0!Z22+-BN1CV7>KynN6 zWwm+aVxEtmkTUjLqg5n6N0u}VFy=O$3VT9zS;(Zfs-s}b(EYj}%Q_5;-`_f28SddO zxW1^t#uDZID~B3aoL$zsy)yx3g)YTLhm@6C~{dmfDT+qdiNp>`>IcM~;h8a;0fse^fBo8aD!@GAz zV}I()s0-3rECI3J-Amv3W#$?-ib~kfLi^f^Cp~S`v2T1yTuGP7O2;F@fV*B-9CwN;@^Ur~ z4J<45poO^&2H8i?ddc}mD?#!=iIuu2Xn7c+fNtkZFYbedpwWvbUo&E1fY3W}HVGM;#VZHC9wRf2I|Me*Wk{W$ziPS8U6 zq&D^qm|6P6OC|Hvtx6ImSklGvdH7*#nlpZwd^TYvLT}DBaP@Xgu%8jjMN^JMCw%-F z{l!_7Ta7aY$dU+3Njc*KCG+#I95V?6O1Q0i-f)u9y9+lvLZr(L#MrU zPXdcQ(|mcvsfyYW8|`VNEqKoET|zJB1>Hy}H*dY$oM{!)r{i|L5Q{ zZKtxHXI1%q&btK=%RmFwD`-w^eog7W?ZuIh38L3Q*Sbr~jY-Hsn`EZX>PbnF#aF*g077$G%daO8pw8Emdm|f{gdH`Y zOZZFr`vd{jLD@e_z5wt!r#$eO{(ph1$)XHpa@ci-&<(3c5FJHqta1Ex zaU*aY2?v;h4qu+A4=lj-7OspU9)rY2-Op`E5Zo`1$(xRN4Xzs;kxWCr=tHQWj&JTi z9#!H7%~2+2Qhc?12yVZNcOreH8@g6--xLJZi5!et#lc&@7%8GLRL~!|R=sTV)7Tc9 z)t!U3d0ALS!@elht_V!MpSRy~KEXW5D-~!8jM{FRc$oDBb?>Dr$dHhF8f$-f+$_R3 zXHqQ46p4|Tr%7O)l(uS=#cE`oi*O$C72X@!WdQ>v&nYG08c~{NzIcDO2#K*8+&|{^ z>vG@u9k|cv4j=2@Be`3eS}UKgDxizqPoJ){KJ*(}rzVmY{ZO`^Knu=AnJA*7VUs6XupI@{*zz++^i+56sN25wyF81Op|=tr zNjMR@zN>jwH_uE_ySx$IpXP;BRJf&qnd#(1v!A`n#VY-%A~M!+V$ml2VWg0K$E>fF zjkgaQPgPInOp(r8G9WeO%x#YoPBEImvtriplWrSMQy%bqva7C%CbWaBGHxdIzR;7> zFt~u30VmVa0qbUX&YdOlGiu_^cPJt3)rWlC=Wxs(5xd<(k zk9OnfX$IlMhbGayakx<5-tfkr^yfg2h?|J5wg*L>`S)VqLGt~YB)tY35e@BEAx*sx zCVa+4$1g9odk_!b8kRI7^(Mm_0yOe&Y~QrI(q4>Jv5*pl|I(bsz3^M}^RrZA{N;55 z78+G=@b{X|Q2u?=a30r!QTGSw4NLddA#oRml5l#1&4tFe&x@DSb!X{^ z-NYMbJ3oaa@|;8zt=UR;E`fqkVOtNl44BNIzO5Hcp=9RZ;dXO?`{|^z<3rKaniagA|b+KKJY6 zG)GU~t6=ft+i?#4%%gGa0C(FM~Y^vhSIhj1b!iKup#B%0X z#{0dPkFIFM-5G#P{4%0XdfhK-E!_~EVH%66=a?82L6>?2y z;mN1JnAbZ+>U%8NOLnd@R{1Ms5_PK7IKbz>aE_=m2gW8cgs6u;`ftvUIh}qFiXp4! zK1B0cB#@U`I)HiNgEymo)=vGt+7sGCd0%{SYfFdZfOYgeG@5Qdq(lb4Ub$_JDaj2# z8|gG+^yYYYH~~r?ifh^!a7g$5QOo-&hsd!!H<6Pm8y^v@aXlg>Ty;MrgnJ_ub}8!( zgpf3OlfNwb*7yQV;fN=eG$Dk3IIjE@eez77cE;w?(ptDqB@vz-Fr>qIo=?SM6c5 zf0b!sG-|NSFHCwV)g+aM`9)r{KOSv8_uT&BAyLf(5{IQVQ1=uUv*=SNDUj~<}BSTvIqX`wkc%0G&hV* z+lPGSp0EKwf5UuQXOj{ixht!AYKyb>c397nhb-Xdb&DEE36P3j?fUpV1=(<}ge8+4 z@==b|!xYbYT#m01d*?N=myUYZeSwCaqNPufWJy~=Y>z*N+&A4!AD_C;SIICh%(Q2W zf|^X31(_RXPKQ!;@F|$a@!Kmed`s$kc702pW_rtabmb=UQ zJ(`T~nQ%HLSFT}G!RGzM`X@M>?gzxKoCM4@IJSKE2R2?*d`qi)MIZ?(fT2HN%>-&GMO-51<3A9)iPFK5>`L!Rz?8p zA<*MDEHpbw>*Wx7eGLW%gq4Z~xuM-t$1vgEE4 z6wpGY%c1MVw&8hwd`;{}S_x*Yk=?6q#&S}RFKVVn&#lXBvY%2XtMy!0Io^c%O4-wn zdevlv*G|W$E{>`yq~gv+FxYi0($;w6T_rlWI!9DWkY56U{`A8LHGHptG9*Hd@IbGj zIuHa+8x@(bu7e8pRmAaU=lJXQJ!lmWis!%jh+596#jJd9VvLOMEAro5R%*noj|C;S z%w3GfSsM%G8}wy(hkk1na?;*i78e0jxyrQ@3A%k=6~TIuLHJ%WX9$4Jc~9=Z5YkJtRI8dmdm_Gh2$7wrfZEFu%S5P z>M(FYNDj3<2MsOGjKK@39UpH&i9MI-D_1Rr`HgkS;i8Xqxeh-&zLxR_{(@3J5C3*4 z^okSl;MCP24q8<}p+Q0JMW+5xBEI6;i7vj)wA?OdVSy3EHz5PVifGM#Q8%aW9~ za@rACV7EF($?n;8TyVj3JO}?smP|jY9?nf%r(A~1+eyf$c$xjVY9GPP5*ww=jB`}E zV($;ye&&z|`8aX60U|77x!+H5QE{(YKAI2bxqZt=HJbi z9Cvv^9j6C{?m*t7xll-EJsIb1}l z5W%*(q2|^rizJI(HdD>sEc_iDEMOq&&YBi9M`{gE=r2@Weib_Ckk~?vE%A0?go{mT zgYu}TzpThRbnNZSAr2DvPHCZ&>a|vX{TAU&4k&3$VmyP5r{NLND_R!2**WZ`BphtS7RH3fA`67bc#Y!^;Zw)4i82=Q`?=W?d5W!~u1w zYY8r*vyxR^4pJ0GOnZ;%MT2&5rpqWK=$fq~^=AgF0TS2i&wis@*Zbt+va;&zw$}mH zJbNhPd*5c<=PRX-l5WA@5F;%KI=AG$-%rZ}7D2gARfo~0m>wfoZg_&;%#40swe%E5 zpuwTWsXbkr&?PzArF6$(>0D{yVeRfqq7POLdrzz02*TT^F{a@{>|Xxq$8qd4-k`j& z)|9R#ETlTMtd~x-7*c&EMrG6rvzB(zUADz9ni%9Y?vfr@5ieYwMHu<hicT>6+MeQjLVho;;?tKfcOun&_=6I@B56c`e&OC6G zeIcIB6HxKepL^x5+2@ML2Z|ZbhqKjB8%egbj`=emt51u`*nX3(tCG%I$o-MfNHAU* zJdtB(VWYMcUKOmu$30*xT9r7osH=ozpLT-ccN^>4%K(3gR`c3G&bASD4XH~Y z>gir@QFX-nlAxt$@|c@6eV62SKtDWFF|(Wf7SZ*$uYLW7F$p!Y_T30&%eM&E)x~5{ zO;raG_gZaR1uzLn^hU7*ObvZVppnPCte3E5kqp|}VT|st5@)PF zw*LXWj4MMw$QN?elzh9qIn|~2O2TToYxdI)(RM#wRR65qnDfZwO(Z>aqFzMP#m$5K z;$uIHAB<}gqP?>Qngp?T@pZGJ;#xDEv}!|CDclmN7Eoz(5c?6;vI{A~>RXC~=bCELrzDbBxXbwTZ8&OWCG_V)TN!93UMq9HRM*|bg?%RTsRg!UNRZ&GD@phKO zNN5GuBgT#FvQ3slE$qYD_#EbaRb?t1F4WvM;r7~~<`j7o7ZL>o77SI06A7m_)JSCy z=cq0!1SJ^=A4tg<$G?P)1#3O`#b$bv$6M)m!`efYY=~SjwjN#Uc;B=EX;{dPi1w)Q z7PVnP_`N6>o0Uupng2M+5|}ueR~8!LY4>LDX{DxIam?&{{yvjhW4p?JmGjkS>Rq@w zjZfUD-?C4q><3A{Zcibl%m4IVew|Tkz-8yFw}gi9Xn)(4D5dif1nN?{RlzXP-A*$ZVca59FOq0te&CTO)-|rB_#B^C-iaX>c87vN>p6R{!dbaU*7pWZay_ z#Nv0sOB~?1Co{{URJjkW>nF~FbnO8pnJn&HkoJOMcoSSNd2*=LuFNgq%&DCd?4f2( zZ5)U>C73{MMm%{#3O*v&>ISo5W7BT`QKw5bwmK34y0Efuv5*7@C38g+z> z-z%4cP__7!<7{=j`z8w;lfOECKkjU$+v0C@Xk*s?A)Gj1!h{V zts-Q-R-R6_&3_&UX}b%nN~qhU>M47*07YkChIApq7AcaothE*@S@>d1+Sx9J>lUgx zn1$U5gnjH2Drzoj_e)bkoQ!g(itd)GD_H2JA_dTrmmwM(Ed+L)7YHw2q-tDL zMGk_LuG;yt6vUCCDb3zK7FO>uEb6a@x&76c^bX1ccFo%2kGM2Sn8>(^S*x2C@OIwE zneKY|ih+do&|UJD42={T^|;N)uaVYr6A<&L+}aU$vTd+ZaXvl@-~AnSWARGz>cesH zkJs0}f5ykVQWGco4Nrr&%WhAFNvy=XItAU{oKx3;yEKf={YV$@^*!M4+fx%E7t5(% z67G|l?zz=P(OCVG54qk!_*8K(lt*ohO$yCRz1~sZCalX(8_DphMa>#RXnUI4YjzFx zT3SRFMoxc2G@Krt-l`ox*UpOwWV!OMJXQ;Y-@r?5MEkvEzi?mDZU~;f!8|NN);kwB z%6IO{PoJF%yDnmunm83M4W|8F_07(3PZLMeh6^p+zT3ro>}_?A9wVWUd3kQBc1O2Y zd_nq-WUgu7?R*=COiW$F-Kc^wtY=7ES{2Y79nyJ2 z4`FCnzG0hduQJBo>w@(|dMd3oo?OUN~Ok`MJ^FIix;x=`Znj zuJdD>GAi`GEtEX@cCUnI-EH{I=E2MHb2WwAdr3jrl?*e_=x(y#-vmW{lYCt`>HX+e z#rNq@F4Fv$axPDHyT|tyNXdTe-indYp!Ni+WL0v^yK9i7C&B*ChQ>c!(iWx)0;QEi z?UJCwZUWGJ?m*Sz2V7#@R5pFq*=dIGhvTt4v~pV)TJ4LFm>a2wPeu$46uMi* z(JpO2rt|svOWL&%GGkAnCVBKY%X%#ek2kEDvfY()2aY$Z@WB?|n0?wsdbM;OmVDvIDpNcmA|n_pKJ7tb0_`p2ZC=_`k& z-n@)mR~hlI$018qtSoFcqHp3(nkxw!oWESnwR$_^)Hx!rkxCV=rsZq91`ISs8;c_x z*<>QjykunlDvLqhR~j_4DF2}4GdARvQ@#Psdf?UjaXy;6u-9QPd&nOOALzW_DBCT$ zpDht_OgCmL+G{5Ih5;?1=b5y|$7gMN?`2nE*{)E#UhkK?BR3=sDx)6K72`pf`9~Cg zO70V4&lgBsfBf@&$eR;v&gTm!ByF>{;b7KafQ}u=V^RM7VU8%vk)64Q;1#TbL|Bj%xgHOYVG1k%6K?t@1hK})rO zP4b@^Eg$AfX6LQ}$N5RfHT^kKiN+;RrH}f%()CCiCRkX zX{3-;*z5lK`Rg^xVaWj^ZBqXBudWecqOx}2S|BC`nJ1--r0G~5yMD0iA13GZ=h?(e zZFtd*)QF-rwWe|#x)*c^=*XyBZq*v^8*!qLCmqb9IYEH@GnD^D9KW;GujQOsdMiM~ zSoS{RA~!W?TIs37+Ca|MK+#gg?@3P-Z0oN}~Rk2%9HS%m; zKU2!ktJjBtTK_Uj{BY6Uq&;-6Iu2NE3!3yfkfOWET51jAgfsQCIH!t~5~DY?k=U;|1S{PR8dhcXq@2Q;utu8ew_6i1 z-+$%60HzbwT~l~%^NeF5&hqD|3dbK|L0d&0H{u(96XeNiqflA3*4vK{8v+Y6c9bte zzp=QgvrjcjpcLga6lN~=JE=;N*^J;go^JyCkH=L9(g{man1P_+&&T`4J$6>9{mXvA z8&Is{v_D$GBVSNNnMS?AncY$jQQLWByuZ?)cxY z_oqohdqV2vtQ`FxJ%_T;;NvZOgxt@Rz}d-3|82)!$F;Ilqj+6phkcR8x_m5Q$h_*D zY$3?$VW2GiIcmfae^FjNFvC_AdP!Cr%iy{x56D2N0?hbw+k$G+svm6}WYkssFt}MT z=U|};9mhC*2~M@}*C2e(Lbh)zx6emu&6>#6B9QwNR!`XAtTwfO&s+80=*0Ojj#;Y9 zE5c2Gu6Dy8D(jASMKvm#E59w51dK#REP*g^u)Mp+Jgb2}FZRjJSmHo{!_a{dl zehJ!_D#n=P&J$Eb@|2h$8D|V3s=LagDK`~TnTB408SaUsS7Cyqw#(9$ay#aOhhp^} zCwN#Z>K8wE8Q`)O*9+qB$~j~=d`)5(o>le2`4yq64Mpk_f<=re{;I!7skEbK&-*=O zI$!5P^xGocB~pI(YjG*=F6!g=_`h#C5RQVaktu&`@aV)uPRFZvhw5IbcBl@X^IN?g zyL;{A32tCE^p2f%xr5c6d!(pNcq)^-qv<5VW0I@(@C z|IAQ5FIyW6%Ck3v(1w%ON|q&<=Zo!QVF3%jm~$~bo@e15AsSex0S9=k+)<;d-P+Ft zGP=4dP-@{SW?KU2+0bvsO%#9THCji}I6TtDH!p+oWBij(@(&!pBAs6_@KIH--S=;2 z_|Er1=F~W?@i@2Y#_N@-avI}#X_(~8{6eHr;WE_;DbqxLdcV#i%EWeANbaO= z_oWl&zXa``w6D-vMa8UUwt1^#X%p3|-0nR?ChE&sty|yDH6+6;*ELKN*Vp;8p$#3A zCmOmBDjIO}2gfEPn|q2z%~!?5pwOg5rh$fQAh%l9z_|Wn=%BVd9HdWic$V@Gb!nPH z`Kf8L?zPyAo%^L;j-%n%2gu@e6~3Y>_OK2E4Rn3ag51%J@?{Msi*?nArtfC{r0ex+ zK(1S2^$9LkfVwux;ZpXAxiPJ{By}M3rs>qP>3#LBDleyjA2C0}Jl3^Je}?C?VsMlg zk1(7z243#yf{q2L$!GKEKPyWg>wMMcQm@v>yfcL^WRyEHYbnGL=S&m_EI#R4eRuF= zG_aLbg1fra4+*_3$bm;)wvT-WKoGaCE4Arn74bki5mAGZVsm&>3Q}sY$9BJ^CASWj zRyAmCZ$6sq$S;IrIJ>HZll-)^)u>1Zp6!;)0n2FiEirsLri2B_D#@v{PKB0yz^S8u zdgEV?RB^=QZA%g1;ou0|$U#y(_UElulure}y&VOOnmRi4U!;KG zCH8Gs+H0DnGLco+or2y7D3Vc*+SKl5Nq?rWSHj_I8QOok?YCFBu&bIWT+Dkq^D#nuD|GGc z$gS#iZa`8qlV34XW602><)j7OSOpk{&MB?$03M$7YoZI%w83J* zGA)n4$#NV0;gD`VAb?f+L5Or+7k^C^V_qI*w0j!a?dISh->QQR{VjIV;1)R1Cqk*A zf9dZKT-qcW>bwAbI$oEti+DUmwNl(`rLyo%@x3ntLK>lrBm-<6zQ zo!D{+o5~71^bT(SW_-w_|M)CI5Pk8*^_8P(#%F2nM+%RTb;gAL;G@{DI9Pi3V1!i4 z(PDc>;IcB}MLu!A9$T)@0itFa4wxJ{|LMMZ_S@pg60YAPb7qkF!1<=$wWD9spL*JP zip>}fGip+bMA5<_!}4=&{_^N0Kd~XGtn*tR6*Njs&i0N%?fkonv(E7dY&k}}^=yWY zU~`^_^}1S(X^DBFS7z{BUr^{r-#FW&_L2kb1;842+xf-QGCrhf3FVyIiYl-HS@Jln zV(%Nib1U1BA=j}<<%Fku%Y08*y~u2-9vm>#-| zeIP#9#tHiHecsxK0CNy(zMY}Nx^wmE?~~ytH9Y!e&36}PxW>jl+E_;SE64@uXh9b8 z54U^h*Oz=RRbRB6$e5#J34rX3<9gC4C9KlikiBiVfr_Rx&-WxD6O7T1!VPg=Mx|0~ z;n^E3w{3_YoN?j9A!Z(ABvW$?O#-Ejbac|Dwh6fl1 z2l7Nf0r<<;m2B3#zs{;3=zogQ@oa6u1W`Z56OFe8vFYuqdL>e7l8+=dp;7U7j{q$v zU~^jpx`;I(?~JJlFj=dSx}QAv#v!W8WlgH<8J{MX>|Cu$U2AaCNifUkK})dmNupnyQy)*3VDUMPFnswYp}omc3H26N4Gl;H##FTCrE@J zN#i>2E*0s<(r@}373#!J?-eu%$u-wW*wRQ44ky!uf1VdS-#l`2=q&R3PCZ6wLF27# zYtRWKWW(tPMvH;Oi|P*@wYD7Bydqe-QCBKL;F6ueu$Zz+h7LeRt9JbUTFw57#+Ce8 zb4rTnTXqYQdUYqh)2n8Ot2bYQOAaq-TTDK{u{FXMjMk{u4A{SlDVu!G16Jfg$_GIg z-GdfnZR}%}=oeI=WI?3#SPmR4NUcLT`bGsnHqozS)1{L;RQQ1{R6n|4MxDQPWZI!$&Q}z$6U`piF=c z*)SSbuU|!WqS!-uUr+OkGbouIWT^1Uiu`Dg2j}CEvH}`B&U2Vq6=d7PdLNWQ;Dn1^ zhqvUhayw(o4o1AQP&y0&1mzj3#5Lr}p`A=ouu(Z2cT=G%z^(b!>2K@Q$pi!}bVDc` z&$vHPLui`PuN!ktFCC$BBUdjO|r1D z-MwTqXQ?lGLZolRqxHBhgrW0uR9fH&M*tfbsc9*~c7MOYWFB1CaGS3pPP+8v{>bbO z0Y^%xND_~;P`*x&5x6j)@$f-;P(Wjk)FRsB>@zY4VS|FX?Yhvx_UoIvw)TxFTSy0q z-^7l*lU9rxg@F<+8{^NOt{v$XN}+Y(mqf5+?+=xNxi=yoGF}#Op7E!id>9Ym#x1_- z1-UH=7Oes%%G2E_n8iqk{Kb+n?GWqR@~}(^zK79sRZ;_ELt^4O(}GkPGWor=)5wiX z>`QG_?r$$>k>2WZbd(f9+)z=P+Y{Ejp>A}!tx=szb7|)(*g2-!#G5@C@AdbgoXz?zlm5!u%GfgSxPx2uy9huJp4{A5$630f-KM4-)fA26 zH}$XtT-(G?5Ps&>!twn69Zhxn9YQBO^foBCeL#=AZ_T)kxhU-n`jWO4bmeVtx9+F| zPm#RGI*f9WqhE?U(zw^>5im06wCgcLda!6pZUDDA)Mb$_UJ0CeZ->Z4Nw}%DGkxu} zJACjdjz%0UKiQ!&=bxZr_<1$pz-DHevY6mPjsw&Q>#xrrf$A@B2t|kzl{(fZoEZ`x zD98ZOl#vib=b|IeO9JwFyMVxD)%*GWGnG}d0yt}?ddtgyLm2uMzJgvKyT)wkD5+3TImwarGt@t36Y z`7b_OTIA?-`DwchJJ9|)FUGOuz96LM>qQB?FAjpwLnwlQSP0HP)89LXcJSWiF^E$A zs`U0@DkF)@^}c1IQ6ZuNQrN6TlU+bABIq38Q6tO5h#mAfQZF%84G z`;B2ief@OZUyNH;f%ZQmWTyWG-jB&PqDKR;Nb@7zb7d2gvT&Iju z$KSw|zT*VB0?ACW`FcHU7N5?Lk8(tBBlXT~)1sJ^C^beRLNdciG(j@UG@aE zH`+F9bIg7234gJOgBTYLe_?y|Azwt|HKU#m%K2rje95Q<^P^=Bw=TXz`-!O&jI*hV zq;fz}>ax$4X=9+V95UzH*(fhl^GC09+|uO=ZHcAR zvxU*=*js7)OrHjx2Lv$x5ybRd$4z zZC-VSBG+%;$V)0#TwRAosw9-&9h1?8CixuWfVL(&+v7^U`pWGXWp`L?F5+xyg{uke zU){iB&&$n9>3`mWZCLx4=blb@FC!diop794p4w4EWeH8>IumQO9=Zy~C;IcwDb#b+ zy!}EmaGj@1tvD7&E}UriEIj42UyqA8MzrqoCl}RjFJtHu| zwPjuZv1-l4YtyeqI>c3<*S&Dv%4|xKG*|7W>5qad*gyW4{t$X=eUQU6&+jpZe4k%` zx_yPbN^SZV$G+2Ubu4v!ZyIAn&ojnoD16rH*VSm3b3eMxVa;QY!yy^B{?2Yp3caaYFtV7p3`bb~d zf8u1}mdkbjr!H!;0p9i!H1WdZ%O>Z%8@O5;Z0x17JtOjGL^E!iwAV&4H|y`MJ(4d^ z)CDZ6Q&lPw3W#7nA||-E>3d$Qa&F$*H|4EQOiwI?gyt~>;4am)rzsP4G_CI9B@=}Dg+g+H1n z@QwTF!t~$0lRjnz^a5KY3Ti%yzzsqS4w;OV8~*Ko_BH)!z{T|1CvO|IK*wcl%=}~5 zEIW7Aa^Thj;0kOOxZ=pKdT*Q?U$;-1ugkm}Ea?@{9(yD7uwD*OVS|uCD=&~{Sjzh3 z;IIF)u1^p8>iDR=%kH&uK7U9eP@;nuqHBQ&ijk`l#m#`S4xB%9bIQODo6-b4z7YsC ufal~~`+t4Uz9|rEzb4v$L2~EM{frD*7jC})bf#f1NV%u0pUXO@geCyFsW=+| literal 0 HcmV?d00001 diff --git a/app/assets/images/orbit-bar.png b/app/assets/images/orbit-bar.png new file mode 100644 index 0000000000000000000000000000000000000000..d8e36223c786b4825bf999e394ce3998e4878f63 GIT binary patch literal 2778 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') + .appendTo(document.body) + + if (this.options.backdrop != 'static') { + this.$backdrop.click($.proxy(this.hide, this)) + } + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + doAnimate ? + this.$backdrop.one($.support.transition.end, callback) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + $.support.transition && this.$element.hasClass('fade')? + this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) : + removeBackdrop.call(this) + + } else if (callback) { + callback() + } + } + + function removeBackdrop() { + this.$backdrop.remove() + this.$backdrop = null + } + + function escape() { + var that = this + if (this.isShown && this.options.keyboard) { + $(document).on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + $(document).off('keyup.dismiss.modal') + } + } + + + /* MODAL PLUGIN DEFINITION + * ======================= */ + + $.fn.modal = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('modal') + , options = $.extend({}, $.fn.modal.defaults, typeof option == 'object' && option) + if (!data) $this.data('modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option]() + else if (options.show) data.show() + }) + } + + $.fn.modal.defaults = { + backdrop: true + , keyboard: true + , show: true + } + + $.fn.modal.Constructor = Modal + + + /* MODAL DATA-API + * ============== */ + + $(function () { + $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data()) + + e.preventDefault() + $target.modal(option) + }) + }) + +}( window.jQuery ) + +/* ============================================================ + * bootstrap-dropdown.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function( $ ){ + + "use strict" + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle="dropdown"]' + , Dropdown = function ( element ) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + , isActive + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + isActive = $parent.hasClass('open') + + clearMenus() + !isActive && $parent.toggleClass('open') + + return false + } + + } + + function clearMenus() { + $(toggle).parent().removeClass('open') + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + $.fn.dropdown = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(function () { + $('html').on('click.dropdown.data-api', clearMenus) + $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) + }) + +}( window.jQuery ) + +/* ============================================================= + * bootstrap-scrollspy.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#scrollspy + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================== */ + +!function ( $ ) { + + "use strict" + + /* SCROLLSPY CLASS DEFINITION + * ========================== */ + + function ScrollSpy( element, options) { + var process = $.proxy(this.process, this) + , $element = $(element).is('body') ? $(window) : $(element) + , href + this.options = $.extend({}, $.fn.scrollspy.defaults, options) + this.$scrollElement = $element.on('scroll.scroll.data-api', process) + this.selector = (this.options.target + || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + || '') + ' .nav li > a' + this.$body = $('body').on('click.scroll.data-api', this.selector, process) + this.refresh() + this.process() + } + + ScrollSpy.prototype = { + + constructor: ScrollSpy + + , refresh: function () { + this.targets = this.$body + .find(this.selector) + .map(function () { + var href = $(this).attr('href') + return /^#\w/.test(href) && $(href).length ? href : null + }) + + this.offsets = $.map(this.targets, function (id) { + return $(id).position().top + }) + } + + , process: function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + , offsets = this.offsets + , targets = this.targets + , activeTarget = this.activeTarget + , i + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) + && this.activate( targets[i] ) + } + } + + , activate: function (target) { + var active + + this.activeTarget = target + + this.$body + .find(this.selector).parent('.active') + .removeClass('active') + + active = this.$body + .find(this.selector + '[href="' + target + '"]') + .parent('li') + .addClass('active') + + if ( active.parent('.dropdown-menu') ) { + active.closest('li.dropdown').addClass('active') + } + } + + } + + + /* SCROLLSPY PLUGIN DEFINITION + * =========================== */ + + $.fn.scrollspy = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('scrollspy') + , options = typeof option == 'object' && option + if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.scrollspy.Constructor = ScrollSpy + + $.fn.scrollspy.defaults = { + offset: 10 + } + + + /* SCROLLSPY DATA-API + * ================== */ + + $(function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + $spy.scrollspy($spy.data()) + }) + }) + +}( window.jQuery ) + +/* ======================================================== + * bootstrap-tab.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#tabs + * ======================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ======================================================== */ + + +!function( $ ){ + + "use strict" + + /* TAB CLASS DEFINITION + * ==================== */ + + var Tab = function ( element ) { + this.element = $(element) + } + + Tab.prototype = { + + constructor: Tab + + , show: function () { + var $this = this.element + , $ul = $this.closest('ul:not(.dropdown-menu)') + , selector = $this.attr('data-target') + , previous + , $target + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + if ( $this.parent('li').hasClass('active') ) return + + previous = $ul.find('.active a').last()[0] + + $this.trigger({ + type: 'show' + , relatedTarget: previous + }) + + $target = $(selector) + + this.activate($this.parent('li'), $ul) + this.activate($target, $target.parent(), function () { + $this.trigger({ + type: 'shown' + , relatedTarget: previous + }) + }) + } + + , activate: function ( element, container, callback) { + var $active = container.find('> .active') + , transition = callback + && $.support.transition + && $active.hasClass('fade') + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + + element.addClass('active') + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if ( element.parent('.dropdown-menu') ) { + element.closest('li.dropdown').addClass('active') + } + + callback && callback() + } + + transition ? + $active.one($.support.transition.end, next) : + next() + + $active.removeClass('in') + } + } + + + /* TAB PLUGIN DEFINITION + * ===================== */ + + $.fn.tab = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tab') + if (!data) $this.data('tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tab.Constructor = Tab + + + /* TAB DATA-API + * ============ */ + + $(function () { + $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { + e.preventDefault() + $(this).tab('show') + }) + }) + +}( window.jQuery ) + +/* =========================================================== + * bootstrap-tooltip.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#tooltips + * Inspired by the original jQuery.tipsy by Jason Frame + * =========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + +!function( $ ) { + + "use strict" + + /* TOOLTIP PUBLIC CLASS DEFINITION + * =============================== */ + + var Tooltip = function ( element, options ) { + this.init('tooltip', element, options) + } + + Tooltip.prototype = { + + constructor: Tooltip + + , init: function ( type, element, options ) { + var eventIn + , eventOut + + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.enabled = true + + if (this.options.trigger != 'manual') { + eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' + eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' + this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + , getOptions: function ( options ) { + options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay + , hide: options.delay + } + } + + return options + } + + , enter: function ( e ) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (!self.options.delay || !self.options.delay.show) { + self.show() + } else { + self.hoverState = 'in' + setTimeout(function() { + if (self.hoverState == 'in') { + self.show() + } + }, self.options.delay.show) + } + } + + , leave: function ( e ) { + var self = $(e.currentTarget)[this.type](this._options).data(this.type) + + if (!self.options.delay || !self.options.delay.hide) { + self.hide() + } else { + self.hoverState = 'out' + setTimeout(function() { + if (self.hoverState == 'out') { + self.hide() + } + }, self.options.delay.hide) + } + } + + , show: function () { + var $tip + , inside + , pos + , actualWidth + , actualHeight + , placement + , tp + + if (this.hasContent() && this.enabled) { + $tip = this.tip() + this.setContent() + + if (this.options.animation) { + $tip.addClass('fade') + } + + placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + inside = /in/.test(placement) + + $tip + .remove() + .css({ top: 0, left: 0, display: 'block' }) + .appendTo(inside ? this.$element : document.body) + + pos = this.getPosition(inside) + + actualWidth = $tip[0].offsetWidth + actualHeight = $tip[0].offsetHeight + + switch (inside ? placement.split(' ')[1] : placement) { + case 'bottom': + tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'top': + tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} + break + case 'left': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} + break + case 'right': + tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} + break + } + + $tip + .css(tp) + .addClass(placement) + .addClass('in') + } + } + + , setContent: function () { + var $tip = this.tip() + $tip.find('.tooltip-inner').html(this.getTitle()) + $tip.removeClass('fade in top bottom left right') + } + + , hide: function () { + var that = this + , $tip = this.tip() + + $tip.removeClass('in') + + function removeWithAnimation() { + var timeout = setTimeout(function () { + $tip.off($.support.transition.end).remove() + }, 500) + + $tip.one($.support.transition.end, function () { + clearTimeout(timeout) + $tip.remove() + }) + } + + $.support.transition && this.$tip.hasClass('fade') ? + removeWithAnimation() : + $tip.remove() + } + + , fixTitle: function () { + var $e = this.$element + if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') + } + } + + , hasContent: function () { + return this.getTitle() + } + + , getPosition: function (inside) { + return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { + width: this.$element[0].offsetWidth + , height: this.$element[0].offsetHeight + }) + } + + , getTitle: function () { + var title + , $e = this.$element + , o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + title = title.toString().replace(/(^\s*|\s*$)/, "") + + return title + } + + , tip: function () { + return this.$tip = this.$tip || $(this.options.template) + } + + , validate: function () { + if (!this.$element[0].parentNode) { + this.hide() + this.$element = null + this.options = null + } + } + + , enable: function () { + this.enabled = true + } + + , disable: function () { + this.enabled = false + } + + , toggleEnabled: function () { + this.enabled = !this.enabled + } + + , toggle: function () { + this[this.tip().hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* TOOLTIP PLUGIN DEFINITION + * ========================= */ + + $.fn.tooltip = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('tooltip') + , options = typeof option == 'object' && option + if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.tooltip.Constructor = Tooltip + + $.fn.tooltip.defaults = { + animation: true + , delay: 0 + , selector: false + , placement: 'top' + , trigger: 'hover' + , title: '' + , template: '

      ' + } + +}( window.jQuery ) + +/* =========================================================== + * bootstrap-popover.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#popovers + * =========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * =========================================================== */ + + +!function( $ ) { + + "use strict" + + var Popover = function ( element, options ) { + this.init('popover', element, options) + } + + /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js + ========================================== */ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { + + constructor: Popover + + , setContent: function () { + var $tip = this.tip() + , title = this.getTitle() + , content = this.getContent() + + $tip.find('.popover-title')[ $.type(title) == 'object' ? 'append' : 'html' ](title) + $tip.find('.popover-content > *')[ $.type(content) == 'object' ? 'append' : 'html' ](content) + + $tip.removeClass('fade top bottom left right in') + } + + , hasContent: function () { + return this.getTitle() || this.getContent() + } + + , getContent: function () { + var content + , $e = this.$element + , o = this.options + + content = $e.attr('data-content') + || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) + + content = content.toString().replace(/(^\s*|\s*$)/, "") + + return content + } + + , tip: function() { + if (!this.$tip) { + this.$tip = $(this.options.template) + } + return this.$tip + } + + }) + + + /* POPOVER PLUGIN DEFINITION + * ======================= */ + + $.fn.popover = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('popover') + , options = typeof option == 'object' && option + if (!data) $this.data('popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.popover.Constructor = Popover + + $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { + placement: 'right' + , content: '' + , template: '

      ' + }) + +}( window.jQuery ) + +/* ========================================================== + * bootstrap-alert.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function( $ ){ + + "use strict" + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function ( el ) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype = { + + constructor: Alert + + , close: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.trigger('close') + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.removeClass('in') + + function removeElement() { + $parent.remove() + $parent.trigger('closed') + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + $.fn.alert = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT DATA-API + * ============== */ + + $(function () { + $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) + }) + +}( window.jQuery ) + +/* ============================================================ + * bootstrap-button.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ){ + + "use strict" + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function ( element, options ) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype = { + + constructor: Button + + , setState: function ( state ) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + , toggle: function () { + var $parent = this.$element.parent('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + $.fn.button = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON DATA-API + * =============== */ + + $(function () { + $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { + $(e.target).button('toggle') + }) + }) + +}( window.jQuery ) + +/* ============================================================= + * bootstrap-collapse.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ){ + + "use strict" + + var Collapse = function ( element, options ) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options["parent"]) { + this.$parent = $(this.options["parent"]) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension = this.dimension() + , scroll = $.camelCase(['scroll', dimension].join('-')) + , actives = this.$parent && this.$parent.find('.in') + , hasData + + if (actives && actives.length) { + hasData = actives.data('collapse') + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + this.$element[dimension](0) + this.transition('addClass', 'show', 'shown') + this.$element[dimension](this.$element[0][scroll]) + + } + + , hide: function () { + var dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', 'hide', 'hidden') + this.$element[dimension](0) + } + + , reset: function ( size ) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element.addClass('collapse') + } + + , transition: function ( method, startEvent, completeEvent ) { + var that = this + , complete = function () { + if (startEvent == 'show') that.reset() + that.$element.trigger(completeEvent) + } + + this.$element + .trigger(startEvent) + [method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + /* COLLAPSIBLE PLUGIN DEFINITION + * ============================== */ + + $.fn.collapse = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = typeof option == 'object' && option + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSIBLE DATA-API + * ==================== */ + + $(function () { + $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this.parents('li').siblings().removeClass('active'); + $this.parents('li').toggleClass('active'); + $(target).collapse(option) + }) + }) + + + + + + + +}( window.jQuery ) + +/* ========================================================== + * bootstrap-carousel.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function( $ ){ + + "use strict" + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.carousel.defaults, options) + this.options.slide && this.slide(this.options.slide) + } + + Carousel.prototype = { + + cycle: function () { + this.interval = setInterval($.proxy(this.next, this), this.options.interval) + return this + } + + , to: function (pos) { + var $active = this.$element.find('.active') + , children = $active.parent().children() + , activePos = children.index($active) + , that = this + + if (pos > (children.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activePos == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) + } + + , pause: function () { + clearInterval(this.interval) + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + if (!$.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger('slide') + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } else { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.trigger('slide') + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + $.fn.carousel = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = typeof option == 'object' && option + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (typeof option == 'string' || (option = options.slide)) data[option]() + else data.cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL DATA-API + * ================= */ + + $(function () { + $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) + $target.carousel(options) + e.preventDefault() + }) + }) + +}( window.jQuery ) + +/* ============================================================= + * bootstrap-typeahead.js v2.0.0 + * http://twitter.github.com/bootstrap/javascript.html#typeahead + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + +!function( $ ){ + + "use strict" + + var Typeahead = function ( element, options ) { + this.$element = $(element) + this.options = $.extend({}, $.fn.typeahead.defaults, options) + this.matcher = this.options.matcher || this.matcher + this.sorter = this.options.sorter || this.sorter + this.highlighter = this.options.highlighter || this.highlighter + this.$menu = $(this.options.menu).appendTo('body') + this.source = this.options.source + this.shown = false + this.listen() + } + + Typeahead.prototype = { + + constructor: Typeahead + + , select: function () { + var val = this.$menu.find('.active').attr('data-value') + this.$element.val(val) + return this.hide() + } + + , show: function () { + var pos = $.extend({}, this.$element.offset(), { + height: this.$element[0].offsetHeight + }) + + this.$menu.css({ + top: pos.top + pos.height + , left: pos.left + }) + + this.$menu.show() + this.shown = true + return this + } + + , hide: function () { + this.$menu.hide() + this.shown = false + return this + } + + , lookup: function (event) { + var that = this + , items + , q + + this.query = this.$element.val() + + if (!this.query) { + return this.shown ? this.hide() : this + } + + items = $.grep(this.source, function (item) { + if (that.matcher(item)) return item + }) + + items = this.sorter(items) + + if (!items.length) { + return this.shown ? this.hide() : this + } + + return this.render(items.slice(0, this.options.items)).show() + } + + , matcher: function (item) { + return ~item.toLowerCase().indexOf(this.query.toLowerCase()) + } + + , sorter: function (items) { + var beginswith = [] + , caseSensitive = [] + , caseInsensitive = [] + , item + + while (item = items.shift()) { + if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) + else if (~item.indexOf(this.query)) caseSensitive.push(item) + else caseInsensitive.push(item) + } + + return beginswith.concat(caseSensitive, caseInsensitive) + } + + , highlighter: function (item) { + return item.replace(new RegExp('(' + this.query + ')', 'ig'), function ($1, match) { + return '' + match + '' + }) + } + + , render: function (items) { + var that = this + + items = $(items).map(function (i, item) { + i = $(that.options.item).attr('data-value', item) + i.find('a').html(that.highlighter(item)) + return i[0] + }) + + items.first().addClass('active') + this.$menu.html(items) + return this + } + + , next: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , next = active.next() + + if (!next.length) { + next = $(this.$menu.find('li')[0]) + } + + next.addClass('active') + } + + , prev: function (event) { + var active = this.$menu.find('.active').removeClass('active') + , prev = active.prev() + + if (!prev.length) { + prev = this.$menu.find('li').last() + } + + prev.addClass('active') + } + + , listen: function () { + this.$element + .on('blur', $.proxy(this.blur, this)) + .on('keypress', $.proxy(this.keypress, this)) + .on('keyup', $.proxy(this.keyup, this)) + + if ($.browser.webkit || $.browser.msie) { + this.$element.on('keydown', $.proxy(this.keypress, this)) + } + + this.$menu + .on('click', $.proxy(this.click, this)) + .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) + } + + , keyup: function (e) { + e.stopPropagation() + e.preventDefault() + + switch(e.keyCode) { + case 40: // down arrow + case 38: // up arrow + break + + case 9: // tab + case 13: // enter + if (!this.shown) return + this.select() + break + + case 27: // escape + this.hide() + break + + default: + this.lookup() + } + + } + + , keypress: function (e) { + e.stopPropagation() + if (!this.shown) return + + switch(e.keyCode) { + case 9: // tab + case 13: // enter + case 27: // escape + e.preventDefault() + break + + case 38: // up arrow + e.preventDefault() + this.prev() + break + + case 40: // down arrow + e.preventDefault() + this.next() + break + } + } + + , blur: function (e) { + var that = this + e.stopPropagation() + e.preventDefault() + setTimeout(function () { that.hide() }, 150) + } + + , click: function (e) { + e.stopPropagation() + e.preventDefault() + this.select() + } + + , mouseenter: function (e) { + this.$menu.find('.active').removeClass('active') + $(e.currentTarget).addClass('active') + } + + } + + + /* TYPEAHEAD PLUGIN DEFINITION + * =========================== */ + + $.fn.typeahead = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('typeahead') + , options = typeof option == 'object' && option + if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.typeahead.defaults = { + source: [] + , items: 8 + , menu: '' + , item: '
    1. ' + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(function () { + $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + e.preventDefault() + $this.typeahead($this.data()) + }) + }) + +}( window.jQuery ) diff --git a/app/assets/javascripts/jquery.tinyscrollbar.min.js b/app/assets/javascripts/jquery.tinyscrollbar.min.js new file mode 100644 index 00000000..98786a77 --- /dev/null +++ b/app/assets/javascripts/jquery.tinyscrollbar.min.js @@ -0,0 +1 @@ +(function(a){function b(b,c){function w(a){if(!(g.ratio>=1)){o.now=Math.min(i[c.axis]-j[c.axis],Math.max(0,o.start+((k?a.pageX:a.pageY)-p.start)));n=o.now*h.ratio;g.obj.css(l,-n);j.obj.css(l,o.now)}return false}function v(b){a(document).unbind("mousemove",w);a(document).unbind("mouseup",v);j.obj.unbind("mouseup",v);document.ontouchmove=j.obj[0].ontouchend=document.ontouchend=null;return false}function u(b){if(!(g.ratio>=1)){var b=b||window.event;var d=b.wheelDelta?b.wheelDelta/120:-b.detail/3;n-=d*c.wheel;n=Math.min(g[c.axis]-f[c.axis],Math.max(0,n));j.obj.css(l,n/h.ratio);g.obj.css(l,-n);b=a.event.fix(b);b.preventDefault()}}function t(b){p.start=k?b.pageX:b.pageY;var c=parseInt(j.obj.css(l));o.start=c=="auto"?0:c;a(document).bind("mousemove",w);document.ontouchmove=function(b){a(document).unbind("mousemove");w(b.touches[0])};a(document).bind("mouseup",v);j.obj.bind("mouseup",v);j.obj[0].ontouchend=document.ontouchend=function(b){a(document).unbind("mouseup");j.obj.unbind("mouseup");v(b.touches[0])};return false}function s(){j.obj.bind("mousedown",t);j.obj[0].ontouchstart=function(a){a.preventDefault();j.obj.unbind("mousedown");t(a.touches[0]);return false};i.obj.bind("mouseup",w);if(c.scroll&&this.addEventListener){e[0].addEventListener("DOMMouseScroll",u,false);e[0].addEventListener("mousewheel",u,false)}else if(c.scroll){e[0].onmousewheel=u}}function r(){j.obj.css(l,n/h.ratio);g.obj.css(l,-n);p["start"]=j.obj.offset()[l];var a=m.toLowerCase();h.obj.css(a,i[c.axis]);i.obj.css(a,i[c.axis]);j.obj.css(a,j[c.axis])}function q(){d.update();s();return d}var d=this;var e=b;var f={obj:a(".viewport",b)};var g={obj:a(".overview",b)};var h={obj:a(".scrollbar",b)};var i={obj:a(".track",h.obj)};var j={obj:a(".thumb",h.obj)};var k=c.axis=="x",l=k?"left":"top",m=k?"Width":"Height";var n,o={start:0,now:0},p={};this.update=function(a){f[c.axis]=f.obj[0]["offset"+m];g[c.axis]=g.obj[0]["scroll"+m];g.ratio=f[c.axis]/g[c.axis];h.obj.toggleClass("disable",g.ratio>=1);i[c.axis]=c.size=="auto"?f[c.axis]:c.size;j[c.axis]=Math.min(i[c.axis],Math.max(0,c.sizethumb=="auto"?i[c.axis]*g.ratio:c.sizethumb));h.ratio=c.sizethumb=="auto"?g[c.axis]/i[c.axis]:(g[c.axis]-f[c.axis])/(i[c.axis]-j[c.axis]);n=a=="relative"&&g.ratio<=1?Math.min(g[c.axis]-f[c.axis],Math.max(0,n)):0;n=a=="bottom"&&g.ratio<=1?g[c.axis]-f[c.axis]:isNaN(parseInt(a))?n:parseInt(a);r()};return q()}a.tiny=a.tiny||{};a.tiny.scrollbar={options:{axis:"y",wheel:40,scroll:true,size:"auto",sizethumb:"auto"}};a.fn.tinyscrollbar=function(c){var c=a.extend({},a.tiny.scrollbar.options,c);this.each(function(){a(this).data("tsb",new b(a(this),c))});return this};a.fn.tinyscrollbar_update=function(b){return a(this).data("tsb").update(b)};})(jQuery) \ No newline at end of file diff --git a/app/assets/javascripts/new_admin.js b/app/assets/javascripts/new_admin.js new file mode 100644 index 00000000..ae43c4b6 --- /dev/null +++ b/app/assets/javascripts/new_admin.js @@ -0,0 +1,11 @@ +// This is a manifest file that'll be compiled into including all the files listed below. +// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically +// be included in the compiled file accessible from http://example.com/assets/application.js +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// the compiled file. +// +//= require jquery +//= require jquery_ujs +//= require bootstrap +//= require jquery.tinyscrollbar.min +//= require orbit-1.0 \ No newline at end of file diff --git a/app/assets/javascripts/orbit-1.0.js b/app/assets/javascripts/orbit-1.0.js new file mode 100644 index 00000000..5167c3cd --- /dev/null +++ b/app/assets/javascripts/orbit-1.0.js @@ -0,0 +1,48 @@ +var viewportwidth; +var viewportheight; +function resize(){ + viewportheight=$(window).height(); + viewportwidth=$(window).width(); + if(window.navigator.userAgent.indexOf("MSIE")>0){ + windH=document.clientHeight; + windW=document.clientWidht; + } +} +$(document).ready(function(){ + + $('.tip').tooltip({ + placement: "left" + }); + + $(function() { + var $role = $('.select-role'); + $('[name="privacy"]').each(function($i) { + $(this).click(function() { + switch ($i) { + case 0: + $role.slideUp(300); + break; + case 1: + $role.slideDown(300); + break; + } + }); + }); + }); + /*tinyscrollbar&windows-Size*/ + resize(); + $('#main-sidebar').css("height", viewportheight-40); + //$('#content-wrap .viewport').css("height", viewportheight-44); + //$('#content-wrap').css("width", viewportwidth-186); + $('#main-sidebar .viewport').css("height", viewportheight-40); + $('#main-sidebar').tinyscrollbar(); + $('#main-sidebar').tinyscrollbar({ size:(viewportheight-44)}); + + +}); +$(window).resize(function(){ + resize(); + $('#main-sidebar').css("height", viewportheight-40); + $('#main-sidebar .viewport').css("height", viewportheight-40); + $('#main-sidebar').tinyscrollbar({ size:(viewportheight-44)}); +}); \ No newline at end of file diff --git a/app/assets/stylesheets/bootstrap-orbit.css b/app/assets/stylesheets/bootstrap-orbit.css new file mode 100644 index 00000000..fa08eb24 --- /dev/null +++ b/app/assets/stylesheets/bootstrap-orbit.css @@ -0,0 +1,108 @@ +h1, h2, h3, h4, h5, h6 { + font-weight:normal ; +} +.tooltip { + font-size: 12px; +} +.tooltip-inner { + text-align: left; +} +.control-group { + margin-bottom: 0px; +} +.well { + margin-top:10px; + margin-bottom: 10px; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5) inset; + padding:9px; +} +hr { + margin: 5px 0; +} +.label-tags { + background-color: #FF5B00; +} +.modal-body .control-group > label { + width: 140px; +} +.modal-body .controls { + margin-left: 160px; +} +.dropdown-menu { + min-width: 90px; +} +.form-horizontal .form-actions { + text-align:right; +} + +.subhead { + padding-bottom: 0; + margin-bottom: 9px; +} +.subhead h1 { + font-size: 54px; +} +/* Subnav */ +.subnav { + width: 100%; + height: 36px; + background-color: #eeeeee; /* Old browsers */ + background-repeat: repeat-x; /* Repeat the gradient */ + background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */ + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #f5f5f5), color-stop(100%, #eeeeee)); /* Chrome,Safari4+ */ + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* Chrome 10+,Safari 5.1+ */ + background-image: -ms-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* IE10+ */ + background-image: -o-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* Opera 11.10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee', GradientType=0 ); /* IE6-9 */ + background-image: linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* W3C */ + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.subnav .nav { + margin-bottom: 0; +} +.subnav .nav > li > a { + margin: 0; + padding-top: 11px; + padding-bottom: 11px; + border-left: 1px solid #f5f5f5; + border-right: 1px solid #e5e5e5; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.subnav .nav > .active > a, .subnav .nav > .active > a:hover { + padding-left: 13px; + color: #777; + background-color: #e9e9e9; + border-right-color: #ddd; + border-left: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); + box-shadow: inset 0 3px 5px rgba(0,0,0,.05); +} +.subnav .nav > .active > a .caret, .subnav .nav > .active > a:hover .caret { + border-top-color: #777; +} +.subnav .nav > li:first-child > a, .subnav .nav > li:first-child > a:hover { + border-left: 0; + padding-left: 12px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.subnav .nav > li:last-child > a { + border-right: 0; +} +.subnav .dropdown-menu { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +table .span1-2 { + width: 94px; + float: none; + margin-left: 0; +} \ No newline at end of file diff --git a/app/assets/stylesheets/bootstrap.css.erb b/app/assets/stylesheets/bootstrap.css.erb new file mode 100644 index 00000000..54201520 --- /dev/null +++ b/app/assets/stylesheets/bootstrap.css.erb @@ -0,0 +1,3365 @@ +/*! + * Bootstrap v2.0.0 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, canvas, video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, a:active { + outline: 0; +} +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + max-width: 100%; + height: auto; + border: 0; + -ms-interpolation-mode: bicubic; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} +input[type="search"] { + -webkit-appearance: textfield; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover { + color: #005580; + text-decoration: underline; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, .row:after { + display: table; + content: ""; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + margin-left: 20px; +} +.span1 { + width: 60px; +} +.span2 { + width: 140px; +} +.span3 { + width: 220px; +} +.span4 { + width: 300px; +} +.span5 { + width: 380px; +} +.span6 { + width: 460px; +} +.span7 { + width: 540px; +} +.span8 { + width: 620px; +} +.span9 { + width: 700px; +} +.span10 { + width: 780px; +} +.span11 { + width: 860px; +} +.span12, .container { + width: 940px; +} +.offset1 { + margin-left: 100px; +} +.offset2 { + margin-left: 180px; +} +.offset3 { + margin-left: 260px; +} +.offset4 { + margin-left: 340px; +} +.offset5 { + margin-left: 420px; +} +.offset6 { + margin-left: 500px; +} +.offset7 { + margin-left: 580px; +} +.offset8 { + margin-left: 660px; +} +.offset9 { + margin-left: 740px; +} +.offset10 { + margin-left: 820px; +} +.offset11 { + margin-left: 900px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, .row-fluid:after { + display: table; + content: ""; +} +.row-fluid:after { + clear: both; +} +.row-fluid > [class*="span"] { + float: left; + margin-left: 2.127659574%; +} +.row-fluid > [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .span1 { + width: 6.382978723%; +} +.row-fluid .span2 { + width: 14.89361702%; +} +.row-fluid .span3 { + width: 23.404255317%; +} +.row-fluid .span4 { + width: 31.914893614%; +} +.row-fluid .span5 { + width: 40.425531911%; +} +.row-fluid .span6 { + width: 48.93617020799999%; +} +.row-fluid .span7 { + width: 57.446808505%; +} +.row-fluid .span8 { + width: 65.95744680199999%; +} +.row-fluid .span9 { + width: 74.468085099%; +} +.row-fluid .span10 { + width: 82.97872339599999%; +} +.row-fluid .span11 { + width: 91.489361693%; +} +.row-fluid .span12 { + width: 99.99999998999999%; +} +.container { + width: 940px; + margin-left: auto; + margin-right: auto; + *zoom: 1; +} +.container:before, .container:after { + display: table; + content: ""; +} +.container:after { + clear: both; +} +.container-fluid { + padding-left: 20px; + padding-right: 20px; + *zoom: 1; +} +.container-fluid:before, .container-fluid:after { + display: table; + content: ""; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; +} +p small { + font-size: 11px; + color: #999999; +} +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-weight: bold; + color: #333333; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} +h1 { + font-size: 30px; + line-height: 36px; +} +h1 small { + font-size: 18px; +} +h2 { + font-size: 24px; + line-height: 36px; +} +h2 small { + font-size: 18px; +} +h3 { + line-height: 27px; + font-size: 18px; +} +h3 small { + font-size: 14px; +} +h4, h5, h6 { + line-height: 18px; +} +h4 { + font-size: 14px; +} +h4 small { + font-size: 12px; +} +h5 { + font-size: 12px; +} +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} +.page-header h1 { + line-height: 1; +} +ul, ol { + padding: 0; + margin: 0 0 9px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +ul { + list-style: disc; +} +ol { + list-style: decimal; +} +li { + line-height: 18px; +} +ul.unstyled { + margin-left: 0; + list-style: none; +} +dl { + margin-bottom: 18px; +} +dt, dd { + line-height: 18px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 9px; +} +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #e5e5e5; + border-bottom: 1px solid #ffffff; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +.muted { + color: #999999; +} +abbr { + font-size: 90%; + text-transform: uppercase; + border-bottom: 1px dotted #ddd; + cursor: help; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-left: 0; + padding-right: 15px; + border-left: 0; + border-right: 5px solid #eeeeee; +} +blockquote.pull-right p, blockquote.pull-right small { + text-align: right; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 18px; + line-height: 18px; + font-style: normal; +} +small { + font-size: 100%; +} +cite { + font-style: normal; +} +code, pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 3px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12px; + line-height: 18px; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + white-space: pre; + white-space: pre-wrap; + word-break: break-all; +} +pre.prettyprint { + margin-bottom: 18px; +} +pre code { + padding: 0; + background-color: transparent; +} +form { + margin: 0 0 18px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #eee; +} +label, +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 18px; +} +label { + display: block; + margin-bottom: 5px; + color: #333333; +} +input, +textarea, +select, +.uneditable-input { + display: inline-block; + width: 210px; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; + border: 1px solid #ccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.uneditable-textarea { + width: auto; + height: auto; +} +label input, label textarea, label select { + display: block; +} +input[type="image"], input[type="checkbox"], input[type="radio"] { + width: auto; + height: auto; + padding: 0; + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + border: 0; + cursor: pointer; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +input[type="file"] { + padding: initial; + line-height: initial; + border: initial; + background-color: #ffffff; + background-color: initial; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +input[type="button"], input[type="reset"], input[type="submit"] { + width: auto; + height: auto; +} +select, input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} +select { + width: 220px; + background-color: #ffffff; +} +select[multiple], select[size] { + height: auto; +} +input[type="image"] { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +textarea { + height: auto; +} +input[type="hidden"] { + display: none; +} +.radio, .checkbox { + padding-left: 18px; +} +.radio input[type="radio"], .checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} +.controls > .radio:first-child, .controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, .checkbox.inline { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.controls > .radio.inline:first-child, .controls > .checkbox.inline:first-child { + padding-top: 0; +} +input, textarea { + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} +input:focus, textarea:focus { + border-color: rgba(82, 168, 236, 0.8); + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + outline: 0; + outline: thin dotted \9; + /* IE6-8 */ + +} +input[type="file"]:focus, input[type="checkbox"]:focus, select:focus { + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input { + float: none; + margin-left: 0; +} +input.span1, textarea.span1, .uneditable-input.span1 { + width: 50px; +} +input.span2, textarea.span2, .uneditable-input.span2 { + width: 130px; +} +input.span3, textarea.span3, .uneditable-input.span3 { + width: 210px; +} +input.span4, textarea.span4, .uneditable-input.span4 { + width: 290px; +} +input.span5, textarea.span5, .uneditable-input.span5 { + width: 370px; +} +input.span6, textarea.span6, .uneditable-input.span6 { + width: 450px; +} +input.span7, textarea.span7, .uneditable-input.span7 { + width: 530px; +} +input.span8, textarea.span8, .uneditable-input.span8 { + width: 610px; +} +input.span9, textarea.span9, .uneditable-input.span9 { + width: 690px; +} +input.span10, textarea.span10, .uneditable-input.span10 { + width: 770px; +} +input.span11, textarea.span11, .uneditable-input.span11 { + width: 850px; +} +input.span12, textarea.span12, .uneditable-input.span12 { + width: 930px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + background-color: #f5f5f5; + border-color: #ddd; + cursor: not-allowed; +} +.control-group.warning > label, .control-group.warning .help-block, .control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning input, .control-group.warning select, .control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} +.control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error > label, .control-group.error .help-block, .control-group.error .help-inline { + color: #b94a48; +} +.control-group.error input, .control-group.error select, .control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} +.control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success > label, .control-group.success .help-block, .control-group.success .help-inline { + color: #468847; +} +.control-group.success input, .control-group.success select, .control-group.success textarea { + color: #468847; + border-color: #468847; +} +.control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +input:focus:required:invalid, textarea:focus:required:invalid, select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:required:invalid:focus, textarea:focus:required:invalid:focus, select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; +} +.uneditable-input { + display: block; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +:-moz-placeholder { + color: #999999; +} +::-webkit-input-placeholder { + color: #999999; +} +.help-block { + margin-top: 5px; + margin-bottom: 0; + color: #999999; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 9px; + vertical-align: middle; + padding-left: 5px; +} +.input-prepend, .input-append { + margin-bottom: 5px; + *zoom: 1; +} +.input-prepend:before, +.input-append:before, +.input-prepend:after, +.input-append:after { + display: table; + content: ""; +} +.input-prepend:after, .input-append:after { + clear: both; +} +.input-prepend input, +.input-append input, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-prepend input:focus, +.input-append input:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + position: relative; + z-index: 2; +} +.input-prepend .uneditable-input, .input-append .uneditable-input { + border-left-color: #ccc; +} +.input-prepend .add-on, .input-append .add-on { + float: left; + display: block; + width: auto; + min-width: 16px; + height: 18px; + margin-right: -1px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + color: #999999; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #f5f5f5; + border: 1px solid #ccc; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-prepend .active, .input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on { + *margin-top: 1px; + /* IE6-7 */ + +} +.input-append input, .input-append .uneditable-input { + float: left; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.input-append .uneditable-input { + border-right-color: #ccc; +} +.input-append .add-on { + margin-right: 0; + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.input-append input:first-child { + *margin-left: -160px; +} +.input-append input:first-child + .add-on { + *margin-left: -21px; +} +.search-query { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input { + display: inline-block; + margin-bottom: 0; +} +.form-search label, +.form-inline label, +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + display: inline-block; +} +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on, +.form-search .input-append .add-on, +.form-inline .input-prepend .add-on { + vertical-align: middle; +} +.control-group { + margin-bottom: 9px; +} +.form-horizontal legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} +.form-horizontal .control-group:before, .form-horizontal .control-group:after { + display: table; + content: ""; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-group > label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + margin-left: 160px; +} +.form-horizontal .form-actions { + padding-left: 160px; +} +table { + max-width: 100%; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 18px; +} +.table th, .table td { + padding: 8px; + line-height: 18px; + text-align: left; + border-top: 1px solid #ddd; +} +.table th { + font-weight: bold; + vertical-align: bottom; +} +.table td { + vertical-align: top; +} +.table thead:first-child tr th, .table thead:first-child tr td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #ddd; +} +.table-condensed th, .table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #ddd; + border-collapse: separate; + *border-collapse: collapsed; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th + th, +.table-bordered td + td, +.table-bordered th + td, +.table-bordered td + th { + border-left: 1px solid #ddd; +} +.table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-radius: 4px 0 0 0; + -moz-border-radius: 4px 0 0 0; + border-radius: 4px 0 0 0; +} +.table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-radius: 0 4px 0 0; + -moz-border-radius: 0 4px 0 0; + border-radius: 0 4px 0 0; +} +.table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; +} +.table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-radius: 0 0 4px 0; + -moz-border-radius: 0 0 4px 0; + border-radius: 0 0 4px 0; +} +.table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} +[class^="icon-"] { + display: inline-block; + width: 14px; + height: 14px; + vertical-align: text-top; + background-image: url(<%= asset_path "glyphicons-halflings.png" %>); + background-position: 14px 14px; + background-repeat: no-repeat; + *margin-right: .3em; +} +[class^="icon-"]:last-child { + *margin-left: 0; +} +.icon-white { + background-image: url(<%= asset_path "glyphicons-halflings-white.png" %>); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; +} +.icon-folder-open { + background-position: -408px -120px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, .open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + text-indent: -99999px; + *text-indent: 0; + vertical-align: top; + border-left: 4px solid transparent; + border-right: 4px solid transparent; + border-top: 4px solid #000000; + opacity: 0.3; + filter: alpha(opacity=30); + content: "\2193"; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown:hover .caret, .open.dropdown .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + float: left; + display: none; + min-width: 160px; + max-width: 220px; + _width: 160px; + padding: 4px 0; + margin: 0; + list-style: none; + background-color: #ffffff; + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.2); + border-style: solid; + border-width: 1px; + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + *border-right-width: 2px; + *border-bottom-width: 2px; +} +.dropdown-menu.bottom-up { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +.dropdown-menu .divider { + height: 1px; + margin: 5px 1px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; + *width: 100%; + *margin: -5px 0 5px; +} +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #555555; + white-space: nowrap; +} +.dropdown-menu li > a:hover, .dropdown-menu .active > a, .dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} +.dropdown.open { + *z-index: 1000; +} +.dropdown.open .dropdown-toggle { + color: #ffffff; + background: #ccc; + background: rgba(0, 0, 0, 0.3); +} +.dropdown.open .dropdown-menu { + display: block; +} +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.fade { + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + opacity: 0; +} +.fade.in { + opacity: 1; +} +.collapse { + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; + position: relative; + overflow: hidden; + height: 0; +} +.collapse.in { + height: auto; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover { + color: #000000; + text-decoration: none; + opacity: 0.4; + filter: alpha(opacity=40); + cursor: pointer; +} +.btn { + display: inline-block; + padding: 4px 10px 4px; + font-size: 13px; + line-height: 18px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #fafafa; + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6); + background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6); + background-repeat: no-repeat; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + border: 1px solid #ccc; + border-bottom-color: #bbb; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + cursor: pointer; + *margin-left: .3em; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, .btn:active { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + color: rgba(0, 0, 0, 0.5); + outline: 0; +} +.btn.disabled, .btn[disabled] { + cursor: default; + background-image: none; + background-color: #e6e6e6; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-large .icon { + margin-top: 1px; +} +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} +.btn-small .icon { + margin-top: -1px; +} +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover { + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + color: #ffffff; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -ms-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(top, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0044cc; +} +.btn-primary:active, .btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; +} +.btn-warning:active, .btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; +} +.btn-danger:active, .btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; +} +.btn-success:active, .btn-success.active { + background-color: #408140 \9; +} +.btn-info { + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; +} +.btn-info:active, .btn-info.active { + background-color: #24748c \9; +} +button.btn, input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} +button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.large, input[type="submit"].btn.large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.small, input[type="submit"].btn.small { + *padding-top: 3px; + *padding-bottom: 3px; +} +.btn-group { + position: relative; + *zoom: 1; + *margin-left: .3em; +} +.btn-group:before, .btn-group:after { + display: table; + content: ""; +} +.btn-group:after { + clear: both; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group .btn:last-child, .btn-group .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group .btn.large:last-child, .btn-group .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group .btn:hover, +.btn-group .btn:focus, +.btn-group .btn:active, +.btn-group .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group.open { + *z-index: 1000; +} +.btn-group.open .dropdown-menu { + display: block; + margin-top: 1px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} +.btn .caret { + margin-top: 7px; + margin-left: 0; +} +.btn:hover .caret, .open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.btn-primary .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret { + border-top-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} +.btn-small .caret { + margin-top: 4px; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, .alert-heading { + color: #c09853; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success, .alert-success .alert-heading { + color: #468847; +} +.alert-danger, .alert-error { + background-color: #f2dede; + border-color: #eed3d7; +} +.alert-danger, +.alert-error, +.alert-danger .alert-heading, +.alert-error .alert-heading { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info, .alert-info .alert-heading { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, .alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +.nav { + margin-left: 0; + margin-bottom: 18px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} +.nav-list { + padding-left: 14px; + padding-right: 14px; + margin-bottom: 0; +} +.nav-list > li > a, .nav-list .nav-header { + display: block; + padding: 3px 15px; + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list .nav-header { + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-transform: uppercase; +} +.nav-list > li + .nav-header { + margin-top: 9px; +} +.nav-list .active > a, .nav-list .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"] { + margin-right: 2px; +} +.nav-tabs, .nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} +.nav-tabs:after, .nav-pills:after { + clear: both; +} +.nav-tabs > li, .nav-pills > li { + float: left; +} +.nav-tabs > li > a, .nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 9px; + padding-bottom: 9px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, .nav-tabs > .active > a:hover { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills .active > a, .nav-pills .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.nav-tabs.nav-stacked > li > a:hover { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu, .nav-pills .dropdown-menu { + margin-top: 1px; + border-width: 1px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.nav-tabs .dropdown-toggle .caret, .nav-pills .dropdown-toggle .caret { + border-top-color: #0088cc; + margin-top: 6px; +} +.nav-tabs .dropdown-toggle:hover .caret, .nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; +} +.nav-tabs .active .dropdown-toggle .caret, .nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; +} +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > .open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav .open .caret, .nav .open.active .caret, .nav .open a:hover .caret { + border-top-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, .tabbable:after { + display: table; + content: ""; +} +.tabbable:after { + clear: both; +} +.tabs-below .nav-tabs, .tabs-right .nav-tabs, .tabs-left .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, .pill-content > .pill-pane { + display: none; +} +.tab-content > .active, .pill-content > .active { + display: block; +} +.tabs-below .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below .nav-tabs > li > a:hover { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below .nav-tabs .active > a, .tabs-below .nav-tabs .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left .nav-tabs > li, .tabs-right .nav-tabs > li { + float: none; +} +.tabs-left .nav-tabs > li > a, .tabs-right .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left .nav-tabs .active > a, .tabs-left .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right .nav-tabs .active > a, .tabs-right .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.navbar { + overflow: visible; + margin-bottom: 18px; +} +.navbar-inner { + padding-left: 20px; + padding-right: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} +.btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} +.btn-navbar:hover, +.btn-navbar:active, +.btn-navbar.active, +.btn-navbar.disabled, +.btn-navbar[disabled] { + background-color: #222222; +} +.btn-navbar:active, .btn-navbar.active { + background-color: #080808 \9; +} +.btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.nav-collapse.collapse { + height: auto; +} +.navbar .brand:hover { + text-decoration: none; +} +.navbar .brand { + float: left; + display: block; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #ffffff; +} +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #999999; +} +.navbar .navbar-text a:hover { + color: #ffffff; + background-color: transparent; +} +.navbar .btn, .navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, .navbar-form:after { + display: table; + content: ""; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, .navbar-form select { + display: inline-block; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-form .radio, .navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + color: rgba(255, 255, 255, 0.75); + background: #666; + background: rgba(255, 255, 255, 0.3); + border: 1px solid #111; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} +.navbar-search .search-query :-moz-placeholder { + color: #eeeeee; +} +.navbar-search .search-query::-webkit-input-placeholder { + color: #eeeeee; +} +.navbar-search .search-query:hover { + color: #ffffff; + background-color: #999999; + background-color: rgba(255, 255, 255, 0.5); +} +.navbar-search .search-query:focus, .navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.navbar-fixed-top .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; +} +.navbar .nav > li { + display: block; + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar .nav > li > a:hover { + background-color: transparent; + color: #ffffff; + text-decoration: none; +} +.navbar .nav .active > a, .navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; + background-color: rgba(0, 0, 0, 0.5); +} +.navbar .divider-vertical { + height: 40px; + width: 1px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} +.navbar .nav.pull-right { + margin-left: 10px; + margin-right: 0; +} +.navbar .dropdown-menu { + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.navbar .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar .nav .dropdown-toggle .caret, .navbar .nav .open.dropdown .caret { + border-top-color: #ffffff; +} +.navbar .nav .active .caret { + opacity: 1; + filter: alpha(opacity=100); +} +.navbar .nav .open > .dropdown-toggle, .navbar .nav .active > .dropdown-toggle, .navbar .nav .open.active > .dropdown-toggle { + background-color: transparent; +} +.navbar .nav .active > .dropdown-toggle:hover { + color: #ffffff; +} +.navbar .nav.pull-right .dropdown-menu { + left: auto; + right: 0; +} +.navbar .nav.pull-right .dropdown-menu:before { + left: auto; + right: 12px; +} +.navbar .nav.pull-right .dropdown-menu:after { + left: auto; + right: 13px; +} +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} +.breadcrumb li { + display: inline; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} +.breadcrumb .active a { + color: #333333; +} +.pagination { + height: 36px; + margin: 18px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination li { + display: inline; +} +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} +.pagination a:hover, .pagination .active a { + background-color: #f5f5f5; +} +.pagination .active a { + color: #999999; + cursor: default; +} +.pagination .disabled a, .pagination .disabled a:hover { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pager { + margin-left: 0; + margin-bottom: 18px; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, .pager:after { + display: table; + content: ""; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next a { + float: right; +} +.pager .previous a { + float: left; +} +.modal-open .dropdown-menu { + z-index: 2050; +} +.modal-open .dropdown.open { + *z-index: 2050; +} +.modal-open .popover { + z-index: 2060; +} +.modal-open .tooltip { + z-index: 2070; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, .modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + max-height: 500px; + overflow: auto; + width: 560px; + margin: -250px 0 0 -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -ms-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 50%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-body { + padding: 15px; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, .modal-footer:after { + display: table; + content: ""; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn { + float: right; + margin-left: 5px; + margin-bottom: 0; +} +.tooltip { + position: absolute; + z-index: 1020; + display: block; + visibility: visible; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -2px; +} +.tooltip.right { + margin-left: 2px; +} +.tooltip.bottom { + margin-top: 2px; +} +.tooltip.left { + margin-left: -2px; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} +.popover.top { + margin-top: -5px; +} +.popover.right { + margin-left: 5px; +} +.popover.bottom { + margin-top: 5px; +} +.popover.left { + margin-left: -5px; +} +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid #000000; +} +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-right: 5px solid #000000; +} +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; +} +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} +.popover-inner { + padding: 3px; + width: 280px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} +.popover-content p, .popover-content ul, .popover-content ol { + margin-bottom: 0; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, .thumbnails:after { + display: table; + content: ""; +} +.thumbnails:after { + clear: both; +} +.thumbnails > li { + float: left; + margin: 0 0 18px 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; +} +.label { + padding: 1px 3px 2px; + font-size: 9.75px; + font-weight: bold; + color: #ffffff; + text-transform: uppercase; + background-color: #999999; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.label-important { + background-color: #b94a48; +} +.label-warning { + background-color: #f89406; +} +.label-success { + background-color: #468847; +} +.label-info { + background-color: #3a87ad; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +.progress { + overflow: hidden; + height: 18px; + margin-bottom: 18px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 18px; + color: #ffffff; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.accordion { + margin-bottom: 18px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel .item > img { + display: block; + line-height: 1; +} +.carousel .active, .carousel .next, .carousel .prev { + display: block; +} +.carousel .active { + left: 0; +} +.carousel .next, .carousel .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel .next { + left: 100%; +} +.carousel .prev { + left: -100%; +} +.carousel .next.left, .carousel .prev.right { + left: 0; +} +.carousel .active.left { + left: -100%; +} +.carousel .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, .carousel-caption p { + color: #ffffff; +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #f5f5f5; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; +} +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} diff --git a/app/assets/stylesheets/list.css b/app/assets/stylesheets/list.css new file mode 100644 index 00000000..19b82081 --- /dev/null +++ b/app/assets/stylesheets/list.css @@ -0,0 +1,88 @@ +.list-remove { + position: relative; + top: 2px; + left: 2px; +} +.table th.select { + border-bottom:2px solid #0088CC; +} +.main-list { + margin-bottom: 0; +} +.main-list thead th { + background-color: rgba(0,0,0,0.05); +} +.main-list .span1 { + min-width: 32px; +} +.main-list .span7 { + min-width: 300px; +} +.main-list .nav-pills > li > a { + border-radius: 5px 5px 5px 5px; + margin: 2px; + padding:5px +} +.main-list tbody .quick-edit { + position:relative; + height:40px; +} +.main-list tbody .quick-edit .nav { + left: -55px; + position: absolute; + top: -3px; + width: 350px; +} +.main-list td { + /*height:80px;*/ +} +.main-list .nav { + margin-top: 15px; + margin-bottom: 3px; +} +.main-list tr:hover .hide { + display:block !important; +} +.qe-block td { + height:auto; +} +legend { + font-size: 15px; + line-height: 30px; + margin-bottom: 15px; + padding-bottom: 5px; +} +.upload-picture { + margin-left: 20px; +} +.subnav { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + border-left: none; + border-right: none; +} +.subnav .nav > li:first-child > a, .subnav .nav > li:first-child > a:hover { + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +.dropdown-menu.tags { + max-width: none; +} +.dropdown-menu.tags .tags-cloud { + width: 300px; + padding:10px; +} +.dropdown-menu.tags .tags-cloud .active { + background-color: #0088CC; + color: #FFFFFF; +} +.dropdown-menu.tags .tags-cloud a { + display: inline-block; + margin-bottom: 3px; +} +.dropdown-menu.tags li:last-child a { + display: block; + text-align:center; +} \ No newline at end of file diff --git a/app/assets/stylesheets/new_admin.css.erb b/app/assets/stylesheets/new_admin.css.erb new file mode 100644 index 00000000..589b95b9 --- /dev/null +++ b/app/assets/stylesheets/new_admin.css.erb @@ -0,0 +1,14 @@ +/* + *This is a manifest file that'll automatically include all the stylesheets available in this directory + *and any sub-directories. You're free to add application-wide styles to this file and they'll appear at + *the top of the compiled file, but it's generally better to create a new file per style scope. + *= require reset + *= require_self + *= require message + *= require bootstrap + *= require bootstrap-orbit + *= require list + *= require widget + *= require style + *= require scroll_style +*/ \ No newline at end of file diff --git a/app/assets/stylesheets/reset.css b/app/assets/stylesheets/reset.css index 612cab19..5a193676 100644 --- a/app/assets/stylesheets/reset.css +++ b/app/assets/stylesheets/reset.css @@ -1,34 +1,5 @@ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline; -} -/* HTML5 display-role reset for older browsers */ -article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { - display: block; -} -a { - text-decoration:none; -} -body { - line-height: 1; -} -ol, ul { - list-style: none; -} -blockquote, q { - quotes: none; -} -blockquote:before, blockquote:after, q:before, q:after { - content: ''; - content: none; -} -table { - border-collapse: collapse; - border-spacing: 0; + -webkit-text-size-adjust:none; } /*自定*/ input:focus, select:focus, textarea:focus { @@ -41,8 +12,4 @@ input:focus, select:focus, textarea:focus { display:block; height:0; visibility:hidden; -} -.fixed { - position: fixed; - z-index: 100; } \ No newline at end of file diff --git a/app/assets/stylesheets/scroll_style.css b/app/assets/stylesheets/scroll_style.css new file mode 100644 index 00000000..2f79f62b --- /dev/null +++ b/app/assets/stylesheets/scroll_style.css @@ -0,0 +1,59 @@ +@charset "UTF-8"; +/* CSS Document */ +.my_scroll { + width: 100%; + clear: both; +} +.my_scroll .viewport { + width: 1005; + overflow: hidden; + position: relative; +} +.my_scroll .overview { + list-style: none; + position: absolute; + left: 0; + top: 0; + width: 100%; +} +.my_scroll .thumb .end, .my_scroll .thumb { + background-color: #000000; +} +.my_scroll .scrollbar { + position: relative; + float: right; + width: 8px; + top:2px; + right:-2px; +} +.my_scroll .track { + background-color: #CFCFCF; + height: 100%; + width:7px; + position: relative; + padding: 0 1px; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; + opacity: 0.3; +} +.my_scroll .thumb { + height: 20px; + width:7px; + cursor: pointer; + overflow: hidden; + position: absolute; + top: 0; + border-radius: 7px; + -webkit-border-radius: 7px; + -moz-border-radius: 7px; +} +.my_scroll .thumb .end { + display:none; + overflow: hidden; + height: 5px; + width: 13px; +} +.my_scroll .disable { + display: none; +} diff --git a/app/assets/stylesheets/style.css.erb b/app/assets/stylesheets/style.css.erb new file mode 100644 index 00000000..5a7253c5 --- /dev/null +++ b/app/assets/stylesheets/style.css.erb @@ -0,0 +1,434 @@ +@font-face{ + font-family: 'WebSymbolsRegular'; + src: url(<%= asset_path "websymbols-regular-webfont.eot" %>); + src: url(<%= asset_path "websymbols-regular-webfont.eot?#iefix" %>) format('embedded-opentype'), + url(<%= asset_path "websymbols-regular-webfont.woff" %>) format('woff'), + url(<%= asset_path "websymbols-regular-webfont.ttf" %>) format('truetype'), + url(<%= asset_path "websymbols-regular-webfont.svg#WebSymbolsRegular" %>) format('svg'); +} + +#orbit-bar { + margin-bottom: 0; + position:fixed; + width:100%; + z-index: 99; +} +#orbit-bar .navbar-inner { + -moz-border-radius: 0px; + -webkit-border-radius: 0px; + border-radius: 0px; +} +#orbit-bar .container { + width:100%; +} +#orbit-bar .orbit-logo .brand { + background: url(<%= asset_path "orbit-bar.png" %>) no-repeat -162px top; + text-indent:-9999px; +} +#orbit-bar .orbit-logo .brand:hover { + background-color: rgba(0,157,220,1); +} +#orbit-bar .orbit-logo.open .brand { + background-color: rgba(0,157,220,1); +} +#orbit-bar .orbit-logo .dropdown-menu { + left: -15px; +} +#orbit-bar .nav > li > a:hover { + background-color: rgba(0,157,220,1); +} +#orbit-bar .nav > li > a { + background-image: url(<%= asset_path "orbit-bar.png" %>); + background-repeat:no-repeat; + display: inline-block; + width: 16px; + height: 16px; + text-indent: -9999px; + padding:12px; +} +#orbit-bar .nav > li > a.orbit-bar-home { + background-position: -4px -4px; +} +#orbit-bar .nav > li > a.orbit-bar-desktop { + background-position: -100px -4px; +} +#orbit-bar .nav > li > a.orbit-bar-logout { + background-position: -38px -4px; + margin: 0 10px 0 0; +} +#orbit-bar .nav > li > a.orbit-bar-search { + background-position: -68px -4px; +} +#orbit-bar .log { + margin: 0 10px 0 0; +} +#orbit-bar .log input { + margin: 5px 0 0; +} + +#main-sidebar { + background-color: #FFFFFF; + width: 155px; + padding-right: 4px; + border-right: 1px solid rgba(0,0,0,.3); + position:fixed; + top:40px; + z-index: 88; +} + +#main-wrap { + margin-left:160px; + padding-top: 40px; + position: relative; +} +#main-wrap > .form-actions { + text-align: center; + padding: 17px 20px 27px; + margin: 0; +} + +#main-wrap .subnav { + height: auto; + min-height: 36px; +} +.filter .accordion-heading > a:hover { + text-decoration: none; +} +.filter .accordion-group { + border-bottom: none; + border-top: none; + border-left: 1px solid rgba(0,0,0,0.07); + border-right: none; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; + margin-bottom: -1px; + position: relative; + left: 0; + top: 0; +} +.filter .accordion-group:last-child { + border-right: 1px solid rgba(0,0,0,0.07); +} +.filter .accordion-heading .accordion-toggle { + padding: 9px 15px; +} +.accordion-group .accordion-toggle .caret { + border-top-color: #0088CC; + margin-top: 6px; +} +.accordion-group .web-symbol:after { + font-family: 'WebSymbolsRegular'; + content: "{"; + margin-left: 2px; + margin-top: 8px; +} +.filter .active { + background-color: #0088CC; +} +.filter .active a { + color: #FFF; +} +.filter .active .web-symbol:after { + content: "}"; +} +.filters { + background-color: rgba(0,0,0,0.025); + -webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.2); + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.2); +} +.filters .btn { + margin-bottom: 5px; +} +.filters .accordion-inner { + border-top: none; + padding: 9px 15px 4px; +} +.filters .filter-clear { + padding: 5px 5px 0; + border-top: 1px solid rgba(0,0,0,0.1); + background-color: rgba(0,0,0,0.025); + text-align: right; +} +.filters .in { + border-bottom: 1px solid rgba(0,0,0,0.07) +} +/*icons*/ +.the-icons i:after { + content: attr(class); + display: block; + font-style: normal; + margin-left: 20px; + width: 140px; +} +.the-icons i { + display: block; + margin-bottom: 5px; +} +[class^="icons-"] { + display: inline-block; + width: 16px; + height: 16px; + vertical-align: text-top; + background-image: url(<%= asset_path "icons_pack.png" %>); + background-position: 16px 16px; + background-repeat: no-repeat; + *margin-right: .3em; + margin-right:10px; +} +[class^="icons-"]:last-child { + *margin-left: 0; +} +.icons-white { + background-image: url(<%= asset_path "icons_pack_white.png" %>); +} +/*1*/ +.icons-pencil { + background-position: 0 0; +} +.icons-brush { + background-position: -32px 0; +} +.icons-pen { + background-position: -64px 0; +} +.icons-brush-large { + background-position: -128px 0; +} +.icons-pen-small { + background-position: -96px 0; +} +.icons-bucket { + background-position: -160px 0; +} +.icons-eye { + background-position: -192px 0; +} +.icons-ban { + background-position: -224px 0; +} +.icons-trash { + background-position: -256px 0; +} +.icons-zoom { + background-position: -288px 0; +} +.icons-zoom-out { + background-position: -320px 0; +} +.icons-zoom-in { + background-position: -352px 0; +} +.icons-magic { + background-position: -384px 0; +} +.icons-aim { + background-position: -416px 0; +} +/*2*/ +.icons-flag { + background-position: 0 -32px; +} +.icons-paperclip { + background-position: -32px -32px; +} +.icons-share { + background-position: -64px -32px; +} +.icons-link { + background-position: -96px -32px; +} +.icons-tag { + background-position: -128px -32px; +} +.icons-lock { + background-position: -160px -32px; +} +.icons-unlock { + background-position: -192px -32px; +} +/*3*/ +.icons-content { + background-position: -160px -66px; +} +.icons-announcement { + background-position: -576px -64px; +} +/*4*/ +.icons-contact { + background-position: 0 -96px; +} +.icons-roll { + background-position: -32px -96px; +} +.icons-member { + background-position: -288px -96px; +} +.icons-member-user { + background-position: -64px -96px; +} +.icons-member-admin { + background-position: -96px -96px; +} +.icons-member-manager{ + background-position: -128px -96px; +} +.icons-member-plus{ + background-position: -160px -96px; +} +.icons-member-minus{ + background-position: -192px -96px; +} +.icons-member-blockade{ + background-position: -224px -96px; +} +.icons-carte { + background-position: -256px -96px; +} +.icons-building { + background-position: -320px -96px; +} +.icons-calendar { + background-position: -352px -96px; +} +.icons-calendars { + background-position: -384px -96px; +} +/*5*/ +.icons-page-blank { + background-position: 0px -128px; +} +.icons-page { + background-position: -32px -128px; +} +.icons-page-copy { + background-position: -64px -128px; +} +.icons- { + background-position: -0px -128px; +} +/*6*/ +.icons-structure { + background-position: -352px -160px; +} +/*7*/ +.icons-purchase { + background-position: -64px -192px; +} +/*8*/ +.icons-dashboard { + background-position: 0 -224px; +} +.icons-cog { + background-position: -32px -224px; +} +.icons-cogs { + background-position: -64px -224px; +} +.icons-tool { + background-position: -96px -224px; +} +.icons-screwdriver { + background-position: -128px -224px; +} +.icons-wrench { + background-position: -160px -224px; +} +.icons-toolbox { + background-position: -192px -224px; +} +.icons-switch { + background-position: -224px -224px; +} +.icons-valve { + background-position: -256px -224px; +} +/*9*/ +.icons-picture { + background-position: -256px -256px; +} +.icons-asset { + background-position: -384px -256px; +} +.icons-asset-upload { + background-position: -448px -256px; +} +.icons-asset-download { + background-position: -416px -256px; +} +/*10*/ +.icons- { + background-position: -0px -288px; +} +/*11*/ +.icons-pie { + background-position: 0px -320px; +} +.icons-histogram { + background-position: -32px -320px; +} +.icons-window { + background-position: -64px -320px; +} +.icons-window-line{ + background-position: -96px -320px; +} +.icons-window-command{ + background-position: -128px -320px; +} +.icons-window-list{ + background-position: -160px -320px; +} +.icons-window-block{ + background-position: -192px -320px; +} +.icons-terminal{ + background-position: -224px -320px; +} +/*12*/ +.icons-star-thin { + background-position: -416px -352px; +} +.icons- { + background-position: -0px -352px; +} +/*13*/ +.icons- { + background-position: -0px -384px; +} +/*14*/ +.icons- { + background-position: -0px -416px; +} +/*15*/ +.icons- { + background-position: -0px -448px; +} +/*16*/ +.icons- { + background-position: -0px -480px; +} +/*17*/ +.icons- { + background-position: -0px -512px; +} +/*18*/ +.icons- { + background-position: -0px -544px; +} +/*19*/ +.icons-plus-cube { + background-position: -192px -576px; +} +.icons-plus { + background-position: -288px -576px; +} +/*20*/ +.icons- { + background-position: -0px -608px; +} +/*21*/ +.icons- { + background-position: -0px -640px; +} \ No newline at end of file diff --git a/app/assets/stylesheets/widget.css b/app/assets/stylesheets/widget.css new file mode 100644 index 00000000..7dcc7fd3 --- /dev/null +++ b/app/assets/stylesheets/widget.css @@ -0,0 +1,82 @@ +.widget-size-300 { + width:298px; +} +.widget-box { + background-color: #FFF; + overflow: hidden; + min-width: 300px; + border: 1px solid #DDD; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + margin: 0 0 5px 5px; + position:relative; +} +.widget-box .widget-title { + background: #999; + color: #FFF; + padding-left: 5px; + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + -webkit-border-radius: 5px 5px 0 0; +} +.widget-box .widget-title [class^="icons-"] { + margin: 3px 5px 0 2px; +} +.widget-box .widget-content { + padding: 10px; +} +.widget-box .form-horizontal .control-group > label { + width: 50px; +} +.widget-box .form-horizontal .controls { + margin-left: 60px; +} +.widget-action { + position:absolute; + right:1px; + top:6px; +} +.action { + float: left; + display:inline-block; + margin-right: 5px; + opacity: 0.8; + filter: alpha(opacity=80); +} +.action:hover { + opacity: 1; + filter: alpha(opacity=100); + cursor: pointer; +} +.select-role { + display:none; + overflow:hidden; +} +.file-upload { + position:relative; +} +.file-upload .file-name { + display: inline-block; + margin: 0 0 5px 5px; + white-space: nowrap; + width: 140px; +} +.file-upload .upload { + margin:0; + padding:0; + position:absolute; + top:0; + left:0; + opacity:.0; + filter: alpha(opacity=100); +} +.file-upload .upload:focus { + position:absolute; +} +.upload-picture { + margin-right: 5px; +} +#widget-link table { + margin-bottom:0 +} \ No newline at end of file diff --git a/app/controllers/admin/dashboards_controller.rb b/app/controllers/admin/dashboards_controller.rb new file mode 100644 index 00000000..7b761361 --- /dev/null +++ b/app/controllers/admin/dashboards_controller.rb @@ -0,0 +1,10 @@ +class Admin::DashboardsController < ApplicationController + + layout "new_admin" + before_filter :authenticate_user! + before_filter :is_admin? + + def index + end + +end diff --git a/app/controllers/admin/designs_controller.rb b/app/controllers/admin/designs_controller.rb index d4f54328..519b36a5 100644 --- a/app/controllers/admin/designs_controller.rb +++ b/app/controllers/admin/designs_controller.rb @@ -3,7 +3,7 @@ class Admin::DesignsController < ApplicationController require "uri" require 'zip/zip' - layout "admin" + layout "new_admin" before_filter :authenticate_user! before_filter :is_admin? diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 485f182c..4af02e9e 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb @@ -34,6 +34,10 @@ class PagesController < ApplicationController redirect_to "/#{@item.full_name}?id=#{params[:id]}" end + def load_orbit_bar + render :partial => 'layouts/orbit_bar' + end + protected def get_item diff --git a/app/views/admin/dashboards/index.html.erb b/app/views/admin/dashboards/index.html.erb new file mode 100644 index 00000000..f690d262 --- /dev/null +++ b/app/views/admin/dashboards/index.html.erb @@ -0,0 +1 @@ +Dashboard \ No newline at end of file diff --git a/app/views/admin/designs/index.html.erb b/app/views/admin/designs/index.html.erb index d9c34437..fa5748ef 100644 --- a/app/views/admin/designs/index.html.erb +++ b/app/views/admin/designs/index.html.erb @@ -1,37 +1,35 @@ -<% content_for :secondary do %> -
      -

      <%= t('admin.setup_designs') %>

      -
        -
      • <%= link_to content_tag(:span, t('admin.new_design')), new_admin_design_path, :class => 'seclink1' %>
      • -
      • <%= link_to content_tag(:span, t('admin.upload_design')), upload_package_admin_designs_path, :class => 'seclink2' %>
      • -
      -
      -<% end -%> - <%= flash_messages %> -
      -

      <%= t('admin.list_designs') %>

      - - - - - - - - - - -<% @designs.each do |design| %> - - - - - - - -<% end %> +
      <%= t('admin.title') %><%= t('admin.author') %><%= t('admin.intro') %><%= t('admin.action') %>
      <%= design.title %><%= design.author %><%= design.intro %> - <%= link_to t(:edit), edit_admin_design_path(design), :class => 'edit' %> - <%= link_to t(:delete), admin_design_path(design), :confirm => t('sure?'), :method => :delete, :class => 'delete' %> -
      + + + + + + + + + + <% @designs.each do |design| %> + + + + + + + <% end %> +
      + + + <%= t('admin.title') %><%= t('admin.author') %><%= t('admin.intro') %>
      + <%= design.title %> +
      + +
      +
      <%= design.author %><%= design.intro %>
      +
      + <%= link_to content_tag(:i, nil, :class => 'icon-plus icon-white') + t('admin.add'), new_admin_design_path, :class => 'btn btn-primary' %>
      \ No newline at end of file diff --git a/app/views/admin/designs/new.html.erb b/app/views/admin/designs/new.html.erb index 7ada8829..2b67b2e9 100644 --- a/app/views/admin/designs/new.html.erb +++ b/app/views/admin/designs/new.html.erb @@ -1,13 +1,11 @@ -
      -

      <%= t('admin.new_design') %>

      +

      <%= t('admin.new_design') %>

      - <%= form_for :design, :url => admin_designs_path, :html => {:multipart => true} do |f| %> - <%= f.error_messages %> - <%= render :partial => "form", :locals => { :f => f } %> - -
      - <%= link_back %> - <%= f.submit t('create') %> -
      - <% end %> -
      +<%= form_for :design, :url => admin_designs_path, :html => {:multipart => true} do |f| %> + <%= f.error_messages %> + <%= render :partial => "form", :locals => { :f => f } %> + +
      + <%= link_back %> + <%= f.submit t('create') %> +
      +<% end %> \ No newline at end of file diff --git a/app/views/layouts/_orbit_bar.html.erb b/app/views/layouts/_orbit_bar.html.erb new file mode 100644 index 00000000..d42ab819 --- /dev/null +++ b/app/views/layouts/_orbit_bar.html.erb @@ -0,0 +1,44 @@ + + + + + \ No newline at end of file diff --git a/app/views/layouts/_side_bar.html.erb b/app/views/layouts/_side_bar.html.erb new file mode 100644 index 00000000..fcd76205 --- /dev/null +++ b/app/views/layouts/_side_bar.html.erb @@ -0,0 +1,7 @@ +
    2. <%= link_to content_tag(:i, nil, :class => 'icons-purchase') + t('admin.purchase'), admin_purchases_path %>
    3. +
    4. <%= link_to content_tag(:i, nil, :class => 'icons-announcement') + t('admin.announcement'), panel_announcement_back_end_bulletins_path %>
    5. +
    6. <%= link_to content_tag(:i, nil, :class => 'icons-member') + t('admin.member'), admin_users_path %>
    7. +
    8. <%= link_to content_tag(:i, nil, :class => 'icons-page') + t('admin.page'), admin_items_path %>
    9. +
    10. <%= link_to content_tag(:i, nil, :class => 'icons-window-block') + t('admin.design'), admin_designs_path %>
    11. +
    12. <%= link_to content_tag(:i, nil, :class => 'icons-link') + t('admin.link'), nil %>
    13. +
    14. <%= link_to content_tag(:i, nil, :class => 'icons-cog') + t('admin.site_settings'), nil %>
    15. \ No newline at end of file diff --git a/app/views/layouts/new_admin.html.erb b/app/views/layouts/new_admin.html.erb new file mode 100644 index 00000000..3ae7a2a2 --- /dev/null +++ b/app/views/layouts/new_admin.html.erb @@ -0,0 +1,37 @@ + + + + + <%= @title || APP_CONFIG['orbit'] %> + + <%= stylesheet_link_tag "new_admin" %> + <%= javascript_include_tag "new_admin" %> + <%= yield :page_specific_css %> + <%= yield :page_specific_javascript %> + <%= csrf_meta_tag %> + + + <%= render 'layouts/orbit_bar' %> + +
      + <%= yield %> +
      + + diff --git a/config/locales/en.yml b/config/locales/en.yml index a82bdefc..189ead08 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -15,11 +15,14 @@ en: downloaded: Downloaded download: Download edit: Edit + email: Email enable: Enable hide: Hide homepage: Homepage + login: Login no_: "No" nothing: Nothing + password: Password show: Show sure?: Are you sure? update: Update diff --git a/config/routes.rb b/config/routes.rb index 9b653d7f..b4512ae8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -8,6 +8,8 @@ PrototypeR4::Application.routes.draw do match '/site/update', :to => GithubApp match '/purchase/:type', :to => CentralServerExchangeApp + match 'load_orbit_bar' => 'pages#load_orbit_bar' + # routes for admin namespace :admin do resources :assets @@ -23,6 +25,7 @@ PrototypeR4::Application.routes.draw do end resources :ad_banners + resources :dashboards resources :designs do collection do get 'upload_package' diff --git a/public/static/jquery.js b/public/static/jquery.js index 628ed9b3..8ccd0ea7 100644 --- a/public/static/jquery.js +++ b/public/static/jquery.js @@ -1,4 +1,9266 @@ -/*! jQuery v1.6.4 http://jquery.com/ | http://jquery.org/license */ -(function(a,b){function cu(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cr(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"":"")+""),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cq(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cp(){cn=b}function co(){setTimeout(cp,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bv(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bl(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bd,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bk(a){f.nodeName(a,"input")?bj(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bj)}function bj(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bi(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bh(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bg(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i=0===c})}function U(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function M(a,b){return(a&&a!=="*"?a+".":"")+b.replace(y,"`").replace(z,"&")}function L(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;ic)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function J(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function D(){return!0}function C(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function K(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(K,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z]|[0-9])/ig,x=/^-ms-/,y=function(a,b){return(b+"").toUpperCase()},z=d.userAgent,A,B,C,D=Object.prototype.toString,E=Object.prototype.hasOwnProperty,F=Array.prototype.push,G=Array.prototype.slice,H=String.prototype.trim,I=Array.prototype.indexOf,J={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.4",length:0,size:function(){return this.length},toArray:function(){return G.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?F.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),B.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(G.apply(this,arguments),"slice",G.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:F,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;B.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!B){B=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",C,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",C),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&K()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):J[D.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!E.call(a,"constructor")&&!E.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||E.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(x,"ms-").replace(w,y)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c
      a",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},m&&f.extend(p,{position:"absolute",left:"-1000px",top:"-1000px"});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
      ",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
      t
      ",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i=f.expando,j=typeof c=="string",k=a.nodeType,l=k?f.cache:a,m=k?a[f.expando]:a[f.expando]&&f.expando;if((!m||e&&m&&l[m]&&!l[m][i])&&j&&d===b)return;m||(k?a[f.expando]=m=++f.uuid:m=f.expando),l[m]||(l[m]={},k||(l[m].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?l[m][i]=f.extend(l[m][i],c):l[m]=f.extend(l[m],c);g=l[m],e&&(g[i]||(g[i]={}),g=g[i]),d!==b&&(g[f.camelCase(c)]=d);if(c==="events"&&!g[c])return g[i]&&g[i].events;j?(h=g[c],h==null&&(h=g[f.camelCase(c)])):h=g;return h}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e=f.expando,g=a.nodeType,h=g?f.cache:a,i=g?a[f.expando]:f.expando;if(!h[i])return;if(b){d=c?h[i][e]:h[i];if(d){d[b]||(b=f.camelCase(b)),delete d[b];if(!l(d))return}}if(c){delete h[i][e];if(!l(h[i]))return}var j=h[i][e];f.support.deleteExpando||!h.setInterval?delete h[i]:h[i]=null,j?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=j):g&&(f.support.deleteExpando?delete a[f.expando]:a.removeAttribute?a.removeAttribute(f.expando):a[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=v:u&&(i=u)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.attr(a,b,""),a.removeAttribute(b),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(u&&f.nodeName(a,"button"))return u.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(u&&f.nodeName(a,"button"))return u.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==null?g:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabIndex=f.propHooks.tabIndex,v={get:function(a,c){var d;return f.prop(a,c)===!0||(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(u=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var w=/\.(.*)$/,x=/^(?:textarea|input|select)$/i,y=/\./g,z=/ /g,A=/[^\w\s.|`]/g,B=function(a){return a.replace(A,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=C;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=C);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),B).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},I=function(c){var d=c.target,e,g;if(!!x.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=H(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:I,beforedeactivate:I,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&I.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&I.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",H(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in G)f.event.add(this,c+".specialChange",G[c]);return x.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return x.test(this.nodeName)}},G=f.event.special.change.filters,G.focus=G.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

      ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
      ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(h=g;h0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=S.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(U(c[0])||U(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=R.call(arguments);N.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!T[a]?f.unique(e):e,(this.length>1||P.test(d))&&O.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]};be.optgroup=be.option,be.tbody=be.tfoot=be.colgroup=be.caption=be.thead,be.th=be.td,f.support.htmlSerialize||(be._default=[1,"div
      ","
      "]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!be[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bh(a,d),e=bi(a),g=bi(d);for(h=0;e[h];++h)g[h]&&bh(e[h],g[h])}if(b){bg(a,d);if(c){e=bi(a),g=bi(d);for(h=0;e[h];++h)bg(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=be[l]||be._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bn.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bm,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bm.test(g)?g.replace(bm,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bv(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bw=function(a,c){var d,e,g;c=c.replace(bo,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bx=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bp.test(d)&&bq.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bv=bw||bx,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bz=/%20/g,bA=/\[\]$/,bB=/\r?\n/g,bC=/#.*$/,bD=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bE=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bF=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bG=/^(?:GET|HEAD)$/,bH=/^\/\//,bI=/\?/,bJ=/)<[^<]*)*<\/script>/gi,bK=/^(?:select|textarea)/i,bL=/\s+/,bM=/([?&])_=[^&]*/,bN=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bO=f.fn.load,bP={},bQ={},bR,bS,bT=["*/"]+["*"];try{bR=e.href}catch(bU){bR=c.createElement("a"),bR.href="",bR=bR.href}bS=bN.exec(bR.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bO)return bO.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
      ").append(c.replace(bJ,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bK.test(this.nodeName)||bE.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bB,"\r\n")}}):{name:b.name,value:c.replace(bB,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?bX(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),bX(a,b);return a},ajaxSettings:{url:bR,isLocal:bF.test(bS[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bT},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bV(bP),ajaxTransport:bV(bQ),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?bZ(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=b$(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bD.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bC,"").replace(bH,bS[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bL),d.crossDomain==null&&(r=bN.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bS[1]&&r[2]==bS[2]&&(r[3]||(r[1]==="http:"?80:443))==(bS[3]||(bS[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bW(bP,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bG.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bI.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bM,"$1_="+x);d.url=y+(y===d.url?(bI.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bT+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bW(bQ,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){s<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bz,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cq("show",3),a,b,c);for(var g=0,h=this.length;g=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b
      ";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=ct.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!ct.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cu(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cu(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNaN(j)?i:j}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window); \ No newline at end of file +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
      a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
      " + + "" + + "
      "; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
      t
      "; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
      "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

      "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
      "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
      ", "
      " ], + thead: [ 1, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + col: [ 2, "", "
      " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and +<% if controller.controller_name.eql?('pages') %> + + + +<% end %>