From bb5a03735644d03e1d4e3ea7927854cefef1edd0 Mon Sep 17 00:00:00 2001 From: echarp Date: Wed, 5 Nov 2014 21:25:18 +0100 Subject: [PATCH] =?UTF-8?q?Nettoyage=20de=20code=20pour=20suivre=20les=20d?= =?UTF-8?q?erni=C3=A8res=20m=C3=A9triques=20ABC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 1 + Gemfile.lock | 15 +- Guardfile | 2 +- app/admin/dashboard.rb | 2 +- app/controllers/application_controller.rb | 7 + app/controllers/events_controller.rb | 45 +- app/controllers/maps_controller.rb | 10 +- app/controllers/moderations_controller.rb | 33 +- app/controllers/notes_controller.rb | 11 +- app/controllers/regions_controller.rb | 29 - app/controllers/stats_controller.rb | 34 + app/controllers/tags_controller.rb | 12 +- app/helpers/events_helper.rb | 22 +- app/models/event.rb | 2 +- app/views/layouts/application.html.haml | 2 +- .../stats.html.haml => stats/index.html.haml} | 0 config/locales/views/en.yml | 3 +- config/locales/views/fr.yml | 3 +- config/routes.rb | 5 +- deploy/before_restart | 2 +- public/webshims/polyfiller.js | 62 +- public/webshims/shims/canvas-blob.js | 8 +- public/webshims/shims/combos/1.js | 2 + public/webshims/shims/combos/10.js | 97 +- public/webshims/shims/combos/11.js | 70 +- public/webshims/shims/combos/12.js | 16 +- public/webshims/shims/combos/13.js | 16 +- public/webshims/shims/combos/15.js | 52 +- public/webshims/shims/combos/16.js | 52 +- public/webshims/shims/combos/17.js | 70 +- public/webshims/shims/combos/18.js | 984 +++++++--------- public/webshims/shims/combos/2.js | 29 +- public/webshims/shims/combos/21.js | 41 +- public/webshims/shims/combos/22.js | 16 +- public/webshims/shims/combos/25.js | 79 +- public/webshims/shims/combos/27.js | 27 +- public/webshims/shims/combos/28.js | 23 +- public/webshims/shims/combos/3.js | 29 +- public/webshims/shims/combos/30.js | 29 +- public/webshims/shims/combos/31.js | 29 +- public/webshims/shims/combos/34.js | 43 +- public/webshims/shims/combos/4.js | 27 +- public/webshims/shims/combos/5.js | 70 +- public/webshims/shims/combos/6.js | 70 +- public/webshims/shims/combos/7.js | 29 +- public/webshims/shims/combos/8.js | 29 +- public/webshims/shims/combos/9.js | 97 +- public/webshims/shims/dom-extend.js | 27 +- public/webshims/shims/es5.js | 1010 +++++++++-------- public/webshims/shims/filereader-xhr.js | 27 +- public/webshims/shims/form-core.js | 2 + public/webshims/shims/form-number-date-ui.js | 70 +- public/webshims/shims/form-shim-extend.js | 23 +- public/webshims/shims/form-validation.js | 4 +- public/webshims/shims/form-validators.js | 6 - public/webshims/shims/forms-picker.js | 6 +- public/webshims/shims/i18n/formcfg-ca.js | 65 ++ public/webshims/shims/i18n/formcfg-ru.js | 9 +- public/webshims/shims/jme/controls.css | 4 +- .../shims/jpicker/images/AlphaBar.png | Bin 2195 -> 1622 bytes public/webshims/shims/jpicker/images/Bars.png | Bin 1503 -> 1347 bytes public/webshims/shims/jpicker/images/Maps.png | Bin 92014 -> 62011 bytes .../webshims/shims/jpicker/images/NoColor.png | Bin 552 -> 491 bytes .../shims/jpicker/images/bar-opacity.png | Bin 162 -> 96 bytes .../shims/jpicker/images/map-opacity.png | Bin 214 -> 139 bytes .../shims/jpicker/images/preview-opacity.png | Bin 135 -> 79 bytes public/webshims/shims/mediacapture.js | 12 +- public/webshims/shims/mediaelement-jaris.js | 25 + public/webshims/shims/picture.js | 984 +++++++--------- public/webshims/shims/styles/color-picker.png | Bin 475 -> 338 bytes public/webshims/shims/styles/forms-ext.css | 16 +- public/webshims/shims/styles/forms-picker.css | 10 +- public/webshims/shims/styles/progress.png | Bin 542 -> 299 bytes .../webshims/shims/styles/scss/forms-ext.scss | 38 +- public/webshims/shims/styles/scss/shim.scss | 12 +- public/webshims/shims/styles/shim-ext.css | 33 +- public/webshims/shims/styles/shim.css | 17 +- public/webshims/shims/styles/transparent.png | Bin 140 -> 93 bytes public/webshims/shims/styles/widget-font.zip | Bin 0 -> 6115 bytes public/webshims/shims/styles/widget.eot | Bin 1700 -> 2240 bytes public/webshims/shims/styles/widget.svg | 8 +- public/webshims/shims/styles/widget.ttf | Bin 1540 -> 2080 bytes public/webshims/shims/styles/widget.woff | Bin 1740 -> 2284 bytes public/webshims/shims/track.js | 16 +- public/webshims/shims/url.js | 25 +- test/controllers/events_controller_test.rb | 6 +- .../moderations_controller_test.rb | 10 +- test/models/event_test.rb | 8 +- 88 files changed, 2492 insertions(+), 2317 deletions(-) create mode 100644 app/controllers/stats_controller.rb rename app/views/{regions/stats.html.haml => stats/index.html.haml} (100%) create mode 100644 public/webshims/shims/i18n/formcfg-ca.js create mode 100644 public/webshims/shims/styles/widget-font.zip diff --git a/Gemfile b/Gemfile index 05a0a1e5..4c23e50d 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,7 @@ source 'https://rubygems.org' gem 'simple_calendar' gem 'rails' +gem 'has_scope' # Use SCSS for stylesheets gem 'sass-rails', '~> 5.0.0.beta1' diff --git a/Gemfile.lock b/Gemfile.lock index 0c2451ac..99464f9a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,6 +1,6 @@ GIT remote: git://github.com/activeadmin/activeadmin.git - revision: c26ae0b1393311180b5137c6b4a271de3385d069 + revision: 809142efe855e590331cdc41e72dcad76b719a46 specs: activeadmin (1.0.0.pre) arbre (~> 1.0, >= 1.0.2) @@ -150,7 +150,7 @@ GEM actionpack (>= 3.2.13) formtastic_i18n (0.1.1) geocoder (1.2.5) - guard (2.7.1) + guard (2.8.0) formatador (>= 0.2.4) listen (~> 2.7) lumberjack (~> 1.0) @@ -169,7 +169,7 @@ GEM guard-minitest (2.3.2) guard (~> 2.0) minitest (>= 3.0) - guard-rubocop (1.1.0) + guard-rubocop (1.2.0) guard (~> 2.0) rubocop (~> 0.20) haml (4.0.5) @@ -219,7 +219,7 @@ GEM rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) lumberjack (1.0.9) - mail (2.6.1) + mail (2.6.3) mime-types (>= 1.16, < 3) memoizable (0.4.2) thread_safe (~> 0.3, >= 0.3.1) @@ -234,7 +234,7 @@ GEM mysql2 (0.3.16) naught (1.0.0) orm_adapter (0.5.0) - parser (2.2.0.pre.6) + parser (2.2.0.pre.7) ast (>= 1.1, < 3.0) slop (~> 3.4, >= 3.4.5) polyamorous (1.1.0) @@ -290,7 +290,7 @@ GEM powerpack (~> 0.0.6) rainbow (>= 1.99.1, < 3.0) ruby-progressbar (~> 1.4) - ruby-progressbar (1.6.1) + ruby-progressbar (1.7.0) ruby2ruby (2.1.3) ruby_parser (~> 3.1) sexp_processor (~> 4.0) @@ -341,7 +341,7 @@ GEM tilt (1.4.1) timers (4.0.1) hitimes - tinymce-rails (4.1.5) + tinymce-rails (4.1.6) railties (>= 3.1.1) tinymce-rails-langs (4.20140129) tinymce-rails (~> 4.0) @@ -393,6 +393,7 @@ DEPENDENCIES guard-minitest guard-rubocop haml-rails + has_scope http_accept_language i18n-active_record! jbuilder (~> 2.0) diff --git a/Guardfile b/Guardfile index 4baac254..51b3dae4 100644 --- a/Guardfile +++ b/Guardfile @@ -29,7 +29,7 @@ end notification :notifysend -guard 'brakeman', run_on_start: true, quiet: true, min_confidence: 10 do +guard :brakeman, run_on_start: true, quiet: true, min_confidence: 10 do watch(%r{^app/.+\.(erb|haml|rhtml|rb)$}) watch(%r{^config/.+\.rb$}) watch(%r{^lib/.+\.rb$}) diff --git a/app/admin/dashboard.rb b/app/admin/dashboard.rb index 9722ae48..64f86785 100644 --- a/app/admin/dashboard.rb +++ b/app/admin/dashboard.rb @@ -29,7 +29,7 @@ ActiveAdmin.register_page 'Dashboard' do #{link_to(`git rev-parse --short HEAD`, "https://gitorious.org/agenda-du-libre-rails/agenda-du-libre-rails/commit/ #{`git rev-parse HEAD`}")}) - .html_safe + .html_safe end end end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index cc5d1edd..efb4d53a 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,4 +11,11 @@ class ApplicationController < ActionController::Base I18n.locale = http_accept_language .compatible_language_from I18n.available_locales end + + protected + + # Useful to manage absolute url in mails + def set_mailer_host + ActionMailer::Base.default_url_options[:host] = request.host_with_port + end end diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 2b7c0e34..9b458651 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -1,33 +1,33 @@ # Event life cycle # This is a central part to this project class EventsController < ApplicationController + has_scope :region, :locality, :tag, :daylimit + before_action :set_events, only: [:index] - before_action :set_event, only: - [:show, :edit, :preview, :update, :cancel, :destroy] - before_action :check_secret, only: - [:edit, :preview, :update, :cancel, :destroy] + before_action :set_event, except: [:index, :new, :preview_create, :create] + before_action :set_create_event, only: [:preview_create, :create] + before_action :check_secret, only: [:edit, :preview, :update, :destroy] + before_action :set_old_event, only: [:update] before_action :set_mailer_host rescue_from ActiveRecord::StaleObjectError, with: :locked def index respond_to do |format| format.html { render layout: 'iframe' if params[:iframe] } - format.rss { @events = @events.future.in params[:daylimit] } - format.ics { @events = @events.last_year.order :id } - format.xml { @events = @events.includes(:related_region).order :id } + format.rss { @events = @events.future } + format.ics { @events = @events.last_year } + format.xml { @events = @events.includes :related_region } end end # GET /users/new def new - @event = Event.new - @event.start_time ||= Time.now.change(min: 0) + 1.day + 1.hour - @event.end_time ||= Time.now.change(min: 0) + 1.day + 2.hour + @event = Event.new start_time: Time.now.change(min: 0) + 1.day + 1.hour, + end_time: Time.now.change(min: 0) + 1.day + 2.hour end # POST /events/preview def preview_create - @event = Event.new event_params @event.valid? render action: :new end @@ -35,8 +35,6 @@ class EventsController < ApplicationController # POST /events # POST /events.json def create - @event = Event.new event_params - respond_to do |format| if @event.save && send_creation_mails format.html { redirect_to :root, notice: t('.ok') } @@ -60,7 +58,6 @@ class EventsController < ApplicationController # PATCH/PUT /events/1 # PATCH/PUT /events/1.json def update - @older_event = Event.new @event.attributes respond_to do |format| if @event.update(event_params) && send_update_mails format.html { redirect_to :root, notice: t('.ok') } @@ -78,7 +75,7 @@ class EventsController < ApplicationController def destroy @event.destroy respond_to do |format| - format.html { redirect_to events_url, notice: t('.ok') } + format.html { redirect_to :root, notice: t('.ok') } format.json { head :no_content } end end @@ -86,10 +83,7 @@ class EventsController < ApplicationController private def set_events - @events = Event.moderated - @events = @events.region params[:region] if params[:region] - @events = @events.locality params[:locality] if params[:locality] - @events = @events.tag params[:tag] if params[:tag] + @events = apply_scopes Event.moderated end # Use callbacks to share common setup or constraints between actions @@ -102,6 +96,14 @@ class EventsController < ApplicationController @event = @event.find params[:id] end + def set_create_event + @event = Event.new event_params + end + + def set_old_event + @older_event = Event.new @event.attributes + end + # Never trust parameters from the scary internet, only allow the white list # through def event_params @@ -117,11 +119,6 @@ class EventsController < ApplicationController unless params[:secret] == @event.secret end - # Useful to manage absolute url in mails - def set_mailer_host - ActionMailer::Base.default_url_options[:host] = request.host_with_port - end - def send_creation_mails # Send an event creation mail to its author EventMailer.create(@event).deliver diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 474bfac1..84eb53c4 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -2,16 +2,12 @@ # # Access to OSM controls class MapsController < ApplicationController + has_scope :region, :locality, :tag + def index respond_to do |format| format.html - format.json do - @events = Event.moderated.future.geo - @events = @events.region params[:region] if params[:region] - @events = @events.locality params[:locality] if params[:locality] - @events = @events.tag params[:tag] if params[:tag] - render json: @events - end + format.json { render json: apply_scopes(Event.moderated.future.geo) } end end end diff --git a/app/controllers/moderations_controller.rb b/app/controllers/moderations_controller.rb index 2a78bc1d..5ba4d5b2 100644 --- a/app/controllers/moderations_controller.rb +++ b/app/controllers/moderations_controller.rb @@ -3,6 +3,7 @@ class ModerationsController < ApplicationController before_action :authenticate_user! before_action :set_moderation, :set_mailer_host, only: [:show, :edit, :preview, :update, :validate, :accept, :refuse, :destroy] + before_action :set_old_mod, only: [:update] rescue_from ActiveRecord::StaleObjectError, with: :locked def index @@ -18,10 +19,9 @@ class ModerationsController < ApplicationController # PATCH/PUT /moderations/1 # PATCH/PUT /moderations/1.json def update - @older_mod = Event.new @event.attributes respond_to do |format| if @moderation.update_attributes(moderation_params) && send_mails - format.html { redirect_to moderations_url, notice: t('.ok') } + format.html { redirect_to :moderations, notice: t('.ok') } format.json { head :no_content } else format.html { render action: 'edit' } @@ -34,28 +34,20 @@ class ModerationsController < ApplicationController # PATCH/PUT /accept/1 # PATCH/PUT /accept/1.json def accept + @moderation.update moderated: true + send_accept_mails respond_to do |format| - if @moderation.update(moderated: true) && send_accept_mails - tweet - format.html { redirect_to moderations_url, notice: t('.ok') } - format.json { head :no_content } - else - format.html { render action: 'edit' } - # 422 means :unprocessable_entity - format.json { render json: @moderation.errors, status: 422 } - end + format.html { redirect_to :moderations, notice: t('.ok') } + format.json { head :no_content } end end # DELETE /events/1 # DELETE /events/1.json def destroy - if @moderation.destroy && send_destroy_mails - EventMailer.destroy(@moderation, current_user, @reason).deliver - ModerationMailer.destroy(@moderation, current_user, @reason).deliver - end + send_destroy_mails if @moderation.destroy respond_to do |format| - format.html { redirect_to moderations_url, notice: t('.ok') } + format.html { redirect_to :moderations, notice: t('.ok') } format.json { head :no_content } end end @@ -68,6 +60,10 @@ class ModerationsController < ApplicationController @moderation = @event end + def set_old_mod + @older_mod = Event.new @event.attributes + end + # Never trust parameters from the scary internet, only allow the white list # through. def moderation_params @@ -88,6 +84,8 @@ class ModerationsController < ApplicationController end def send_accept_mails + tweet + # Send an acceptation mail to its author EventMailer.accept(@moderation, current_user).deliver @@ -113,6 +111,9 @@ class ModerationsController < ApplicationController else @reason = t "moderations.refuse.reason_#{params[:reason]}_long" end + + EventMailer.destroy(@moderation, current_user, @reason).deliver + ModerationMailer.destroy(@moderation, current_user, @reason).deliver end def locked diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index 28f48a39..a28ce1a6 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -1,6 +1,7 @@ # Events, particulary during moderation, can have notes associated to them class NotesController < ApplicationController - before_action :set_event, :set_mailer_host, only: [:new, :create] + before_action :set_event, only: [:new, :create] + before_action :create_note, :set_mailer_host, only: [:create] # GET /moderations/id/new def new @@ -8,14 +9,12 @@ class NotesController < ApplicationController end def create - @note = @moderation.notes.new note_params.merge author: current_user - respond_to do |format| if @note.save && send_mails format.html { redirect_to moderations_url, notice: t('.ok') } format.json { render action: :show, status: :created, location: @event } else - format.html { render action: 'new' } + format.html { render action: :new } format.json { render json: @note.errors, status: :unprocessable_entity } end end @@ -29,6 +28,10 @@ class NotesController < ApplicationController @moderation = @event end + def create_note + @note = @moderation.notes.new note_params.merge author: current_user + end + # Never trust parameters from the scary internet, only allow the white list # through. def note_params diff --git a/app/controllers/regions_controller.rb b/app/controllers/regions_controller.rb index e18ebae2..8b465953 100644 --- a/app/controllers/regions_controller.rb +++ b/app/controllers/regions_controller.rb @@ -1,32 +1,3 @@ # Manage regions, mostly get stats out of them class RegionsController < InheritedResources::Base - def stats - @region_events = Event.joins(:related_region).group(:name) - .order('count(name) desc').count :name - - @city_events = Event.group(:city).having('count(city) > 3') - .order('count(city) desc').count :city - - @year_events = Event.group(year_grouping).count - - @month_events = Event.group(year_grouping, month_grouping).count - end - - private - - def year_grouping - if %w(Mysql2 MySQL PostgreSQL).include? Event.connection.adapter_name - 'extract(year from start_time)' - elsif Event.connection.adapter_name == 'SQLite' - 'strftime("%Y", start_time)' - end - end - - def month_grouping - if %w(Mysql2 MySQL PostgreSQL).include? Event.connection.adapter_name - 'extract(month from start_time)' - elsif Event.connection.adapter_name == 'SQLite' - 'strftime("%m", start_time)' - end - end end diff --git a/app/controllers/stats_controller.rb b/app/controllers/stats_controller.rb new file mode 100644 index 00000000..84fad600 --- /dev/null +++ b/app/controllers/stats_controller.rb @@ -0,0 +1,34 @@ +# Generate statistics, around events, by date or place +class StatsController < ApplicationController + before_action :set_temporal, :set_local, only: [:index] + + private + + def set_temporal + @year_events = Event.group(year_grouping).count + @month_events = Event.group(year_grouping, month_grouping).count + end + + def set_local + @region_events = Event.joins(:related_region).group(:name) + .order('count(name) desc').count + @city_events = Event.group(:city).having('count(city) > 3') + .order('count(city) desc').count + end + + def year_grouping + if %w(Mysql2 MySQL PostgreSQL).include? Event.connection.adapter_name + 'extract(year from start_time)' + elsif Event.connection.adapter_name == 'SQLite' + 'strftime("%Y", start_time)' + end + end + + def month_grouping + if %w(Mysql2 MySQL PostgreSQL).include? Event.connection.adapter_name + 'extract(month from start_time)' + elsif Event.connection.adapter_name == 'SQLite' + 'strftime("%m", start_time)' + end + end +end diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 1964b2a9..9c310542 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -2,15 +2,15 @@ class TagsController < InheritedResources::Base def index @tags = Event - .pluck(:tags).map(&:split).flatten - .group_by { |i| i } - .map { |k, v| [k, v.size] } - .reject { |_k, v| v <= 3 } - .sort + .pluck(:tags).map(&:split).flatten + .group_by { |i| i } + .map { |k, v| [k, v.size] } + .reject { |_k, v| v <= 3 } + .sort respond_to do |format| format.html - format.json { render json: @tags.to_json } + format.json { render json: @tags } end end diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index da97cb1e..7c9aee9e 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -26,17 +26,25 @@ module EventsHelper def display_date(event = @event) if event.start_time.to_date == event.end_time.to_date - t 'date.formats.same_day', - date: l(event.start_time.to_date, format: :long), - start: l(event.start_time, format: :hours), - end: l(event.end_time, format: :hours) + display_sameday event else - t 'date.formats.period', - start: l(event.start_time, format: :at), - end: l(event.end_time, format: :at) + display_multi_days event end end + def display_sameday(event) + t 'date.formats.same_day', + date: l(event.start_time.to_date, format: :long), + start: l(event.start_time, format: :hours), + end: l(event.end_time, format: :hours) + end + + def display_multi_days(event) + t 'date.formats.period', + start: l(event.start_time, format: :at), + end: l(event.end_time, format: :at) + end + def wrap(s, width = 78) s.gsub(/(.{1,#{width}})(\s+|\Z)/, "\\1\n") end diff --git a/app/models/event.rb b/app/models/event.rb index 321980c2..bc198d21 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -29,7 +29,7 @@ class Event < ActiveRecord::Base scope :last_year, -> { where '? <= end_time', 1.year.ago } scope :past, -> { where 'start_time <= ?', DateTime.now } scope :future, -> { where '? <= end_time', DateTime.now } - scope :in, -> days { where 'end_time <= ?', (days || 30).to_i.days.from_now } + scope :daylimit, -> d { where 'end_time <= ?', (d || 30).to_i.days.from_now } scope :year, (lambda do |year| where '? <= end_time and start_time <= ?', Date.new(year, 1, 1).beginning_of_week, diff --git a/app/views/layouts/application.html.haml b/app/views/layouts/application.html.haml index 3121a981..f934cfde 100644 --- a/app/views/layouts/application.html.haml +++ b/app/views/layouts/application.html.haml @@ -57,7 +57,7 @@ = link_to application_infos_path do %em.fa.fa-info =t '.infos' - = link_to stats_regions_path do + = link_to stats_path do %em.fa.fa-signal =t '.stats' = link_to application_contact_path do diff --git a/app/views/regions/stats.html.haml b/app/views/stats/index.html.haml similarity index 100% rename from app/views/regions/stats.html.haml rename to app/views/stats/index.html.haml diff --git a/config/locales/views/en.yml b/config/locales/views/en.yml index ac3ecacb..90c72653 100644 --- a/config/locales/views/en.yml +++ b/config/locales/views/en.yml @@ -138,7 +138,8 @@ it more readable or agreable. Example: `%{tag}` \n* You can modify the 30 days limit with the parameter `daylimit`. \n Example: `%{daylimit}`" - stats: + stats: + index: title: Statistics all: Validated events allModeration: Events waiting for validation diff --git a/config/locales/views/fr.yml b/config/locales/views/fr.yml index 3768e385..fe925ec3 100644 --- a/config/locales/views/fr.yml +++ b/config/locales/views/fr.yml @@ -136,7 +136,8 @@ fr: * Vous pouvez modifier la limite des 30 prochains jours des flux en utilisant le paramètre `daylimit`. \n Exemple: `%{daylimit}`" - stats: + stats: + index: title: Statistiques all: Événements validés allModeration: Événements en cours de modération diff --git a/config/routes.rb b/config/routes.rb index c282a348..120befa6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,7 @@ Rails.application.routes.draw do get 'application/infos' get 'application/contact' get 'application/rules' + get 'stats', to: 'stats#index' resources :users resources :events do @@ -15,9 +16,7 @@ Rails.application.routes.draw do get :validate, :refuse, on: :member put :accept, on: :member end - resources :regions, only: [:index] do - get 'stats', on: :collection - end + resources :regions, only: [:index] resources :tags, only: [:index, :show] resources :maps, only: [:index] resources :lugs, only: [:index, :show] diff --git a/deploy/before_restart b/deploy/before_restart index 9fe8a96c..32593e3c 100755 --- a/deploy/before_restart +++ b/deploy/before_restart @@ -29,7 +29,7 @@ if File.file? 'Rakefile' # precompile assets changed_assets = `git diff #{oldrev} #{newrev} --name-only -z app/assets` - .split("\0") + .split("\0") tasks << 'assets:precompile' if changed_assets.size > 0 run "#{rake_cmd} #{tasks.join(' ')} RAILS_ENV=#{RAILS_ENV}" if tasks.any? diff --git a/public/webshims/polyfiller.js b/public/webshims/polyfiller.js index 528ace81..fe1c75f8 100644 --- a/public/webshims/polyfiller.js +++ b/public/webshims/polyfiller.js @@ -119,6 +119,7 @@ promise: 'es6', URL: 'url' }; + var supportCapture = 'capture' in create('input'); clearInterval(webshims.timer); support.advancedObjectProperties = support.objectAccessor = support.ES5 = !!('create' in Object && 'seal' in Object); @@ -136,7 +137,7 @@ } $.extend(webshims, { - version: '1.15.3', + version: '1.15.4', cfg: { enhanceAuto: window.Audio && (!window.matchMedia || matchMedia('(min-device-width: 721px)').matches), @@ -212,11 +213,13 @@ })(), _polyfill: function(features){ var toLoadFeatures = []; - var hasFormsExt; + var hasFormsExt, needExtStyles; if(!firstRun.run){ hasFormsExt = $.inArray('forms-ext', features) !== -1; firstRun(); + needExtStyles = (hasFormsExt && !modules["form-number-date-ui"].test()) || (!supportCapture && $.inArray('mediacapture', features) !== -1); + if(hasFormsExt && $.inArray('forms', features) == -1){ features.push('forms'); if(WSDEBUG){ @@ -224,7 +227,7 @@ } } if(webCFG.loadStyles){ - loader.loadCSS('styles/shim'+((hasFormsExt && !modules["form-number-date-ui"].test()) ? '-ext' : '')+'.css'); + loader.loadCSS('styles/shim'+(needExtStyles ? '-ext' : '')+'.css'); } } @@ -922,7 +925,7 @@ // - // - // + // + + // + + // - /* - // - */ - //
= 12){ @@ -2432,6 +2441,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -2453,8 +2463,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -2756,9 +2765,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -2882,36 +2893,34 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/combos/11.js b/public/webshims/shims/combos/11.js index b837903c..53cf8165 100644 --- a/public/webshims/shims/combos/11.js +++ b/public/webshims/shims/combos/11.js @@ -1044,9 +1044,13 @@ }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -1201,6 +1205,7 @@ createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -1222,8 +1227,7 @@ } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -1525,9 +1529,11 @@ }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -1651,36 +1657,34 @@ var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/combos/12.js b/public/webshims/shims/combos/12.js index a497911c..22bcef70 100644 --- a/public/webshims/shims/combos/12.js +++ b/public/webshims/shims/combos/12.js @@ -893,10 +893,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u var copyName = {srclang: 'language'}; var updateMediaTrackList = function(baseData, trackList){ + var i, len; + var callChange = false; var removed = []; var added = []; var newTracks = []; - var i, len; if(!baseData){ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {}); } @@ -931,12 +932,13 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u removed.push(trackList[i]); } } - + if(removed.length || added.length){ trackList.splice(0); for(i = 0, len = newTracks.length; i < len; i++){ trackList.push(newTracks[i]); + } for(i = 0, len = removed.length; i < len; i++){ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]})); @@ -949,6 +951,16 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u $(this).triggerHandler('updatetrackdisplay'); } } + + for(i = 0, len = trackList.length; i < len; i++){ + if(trackList[i].__wsmode != trackList[i].mode){ + trackList[i].__wsmode = trackList[i].mode; + callChange = true; + } + } + if(callChange){ + $([trackList]).triggerHandler('change'); + } }; var refreshTrack = function(track, trackData){ diff --git a/public/webshims/shims/combos/13.js b/public/webshims/shims/combos/13.js index 12cb9955..28fc13ac 100644 --- a/public/webshims/shims/combos/13.js +++ b/public/webshims/shims/combos/13.js @@ -670,10 +670,11 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u var copyName = {srclang: 'language'}; var updateMediaTrackList = function(baseData, trackList){ + var i, len; + var callChange = false; var removed = []; var added = []; var newTracks = []; - var i, len; if(!baseData){ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {}); } @@ -708,12 +709,13 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u removed.push(trackList[i]); } } - + if(removed.length || added.length){ trackList.splice(0); for(i = 0, len = newTracks.length; i < len; i++){ trackList.push(newTracks[i]); + } for(i = 0, len = removed.length; i < len; i++){ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]})); @@ -726,6 +728,16 @@ webshims.register('mediaelement-core', function($, webshims, window, document, u $(this).triggerHandler('updatetrackdisplay'); } } + + for(i = 0, len = trackList.length; i < len; i++){ + if(trackList[i].__wsmode != trackList[i].mode){ + trackList[i].__wsmode = trackList[i].mode; + callChange = true; + } + } + if(callChange){ + $([trackList]).triggerHandler('change'); + } }; var refreshTrack = function(track, trackData){ diff --git a/public/webshims/shims/combos/15.js b/public/webshims/shims/combos/15.js index 4bb2d83d..741a9c8b 100644 --- a/public/webshims/shims/combos/15.js +++ b/public/webshims/shims/combos/15.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1487,6 +1492,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; @@ -2149,22 +2156,25 @@ if(webshims.support.inputtypes.date && /webkit/i.test(navigator.userAgent)){ webshims.addReady(function(context, contextElem){ //start constrain-validation - var focusElem; + $('form', context) .add(contextElem.filter('form')) .on('invalid', $.noop) ; - - try { - if(context == document && !('form' in (document.activeElement || {}))) { - focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; - if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) { - focusElem.focus(); + + setTimeout(function(){ + var focusElem; + try { + if(!('form' in (document.activeElement || {}))) { + focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; + if (focusElem && (focusElem.offsetHeight || focusElem.offsetWidth)) { + focusElem.focus(); + } } } - } - catch (er) {} - + catch (er) {} + }, 9); + }); if(!webshims.support.datalist){ diff --git a/public/webshims/shims/combos/16.js b/public/webshims/shims/combos/16.js index 6d835b00..dcf1e2f8 100644 --- a/public/webshims/shims/combos/16.js +++ b/public/webshims/shims/combos/16.js @@ -325,20 +325,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -759,7 +764,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1710,6 +1715,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; @@ -2372,22 +2379,25 @@ if(webshims.support.inputtypes.date && /webkit/i.test(navigator.userAgent)){ webshims.addReady(function(context, contextElem){ //start constrain-validation - var focusElem; + $('form', context) .add(contextElem.filter('form')) .on('invalid', $.noop) ; - - try { - if(context == document && !('form' in (document.activeElement || {}))) { - focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; - if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) { - focusElem.focus(); + + setTimeout(function(){ + var focusElem; + try { + if(!('form' in (document.activeElement || {}))) { + focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; + if (focusElem && (focusElem.offsetHeight || focusElem.offsetWidth)) { + focusElem.focus(); + } } } - } - catch (er) {} - + catch (er) {} + }, 9); + }); if(!webshims.support.datalist){ diff --git a/public/webshims/shims/combos/17.js b/public/webshims/shims/combos/17.js index cd7e1c39..0f7d0c4e 100644 --- a/public/webshims/shims/combos/17.js +++ b/public/webshims/shims/combos/17.js @@ -1660,9 +1660,13 @@ webshims.register('form-number-date-api', function($, webshims, window, document }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -1817,6 +1821,7 @@ webshims.register('form-number-date-api', function($, webshims, window, document createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -1838,8 +1843,7 @@ webshims.register('form-number-date-api', function($, webshims, window, document } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -2141,9 +2145,11 @@ webshims.register('form-number-date-api', function($, webshims, window, document }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -2267,36 +2273,34 @@ webshims.register('form-number-date-api', function($, webshims, window, document var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/combos/18.js b/public/webshims/shims/combos/18.js index 9f38e644..a6542797 100644 --- a/public/webshims/shims/combos/18.js +++ b/public/webshims/shims/combos/18.js @@ -1,580 +1,440 @@ -webshim.ready('matchMedia', function($, webshim, w, doc, undefined){ - try { - new Image(); - } catch(e){ - window.Image = function(){ - return document.createElement('img'); - }; +/*! respimage - v0.9.5 - 2014-10-22 + Licensed MIT */ +!function(window, document, undefined) { + "use strict"; + function trim(str) { + return str.trim ? str.trim() : str.replace(/^\s+|\s+$/g, ""); } - webshim.isReady('picture', true); -// Enable strict mode + function updateView() { + isVwDirty = !1, ri.vW = window.innerWidth || Math.max(docElem.offsetWidth || 0, docElem.clientWidth || 0), + vH = window.innerHeight || Math.max(docElem.offsetHeight || 0, docElem.clientHeight || 0); + } + function parseDescriptor(descriptor) { + if (!(descriptor in memDescriptor)) { + var descriptorObj = { + val: 1, + type: "x" + }, parsedDescriptor = trim(descriptor || ""); + parsedDescriptor && (parsedDescriptor.match(regDescriptor) ? (descriptorObj.val = 1 * RegExp.$1, + descriptorObj.type = RegExp.$2) : descriptorObj = !1), memDescriptor[descriptor] = descriptorObj; + } + return memDescriptor[descriptor]; + } + function chooseLowRes(lowRes, diff, dpr) { + return lowRes / dpr > .2 && (lowRes += diff * greed, diff > tHigh && (lowRes += tLow)), + lowRes > dpr; + } + function inView(el) { + if (!el.getBoundingClientRect) return !0; + var bottom, right, left, top, rect = el.getBoundingClientRect(); + return !!((bottom = rect.bottom) >= -9 && (top = rect.top) <= vH + 9 && (right = rect.right) >= -9 && (left = rect.left) <= ri.vW + 9 && (bottom || right || left || top)); + } + function applyBestCandidate(img) { + var srcSetCandidates, matchingSet = ri.getSet(img), evaluated = !1; + "pending" != matchingSet && (evaluated = !0, matchingSet && (srcSetCandidates = ri.setRes(matchingSet), + evaluated = ri.applySetCandidate(srcSetCandidates, img))), img[ri.ns].evaled = evaluated; + } + function ascendingSort(a, b) { + return a.res - b.res; + } + function setSrcToCur(img, src, set) { + var candidate; + return !set && src && (set = img[ri.ns].sets, set = set && set[set.length - 1]), + candidate = getCandidateForSrc(src, set), candidate && (src = ri.makeUrl(src), img[ri.ns].curSrc = src, + img[ri.ns].curCan = candidate, currentSrcSupported || (img.currentSrc = src), candidate.res || setResolution(candidate, candidate.set.sizes)), + candidate; + } + function getCandidateForSrc(src, set) { + var i, candidate, candidates; + if (src && set) for (candidates = ri.parseSet(set), src = ri.makeUrl(src), i = 0; i < candidates.length; i++) if (src == ri.makeUrl(candidates[i].url)) { + candidate = candidates[i]; + break; + } + return candidate; + } + function hasOneX(set) { + var i, ret, candidates, desc; + if (set) for (candidates = ri.parseSet(set), i = 0; i < candidates.length; i++) if (desc = candidates[i].desc, + "x" == desc.type && 1 == desc.val) { + ret = !0; + break; + } + return ret; + } + function hasWDescripor(set) { + if (!set) return !1; + var candidates = ri.parseSet(set); + return candidates[0] && "w" == candidates[0].desc.type; + } + function getAllSourceElements(picture, candidates) { + var i, len, source, srcset, sources = picture.getElementsByTagName("source"); + for (i = 0, len = sources.length; len > i; i++) source = sources[i], source[ri.ns] = !0, + srcset = source.getAttribute("srcset"), srcset && candidates.push({ + srcset: srcset, + media: source.getAttribute("media"), + type: source.getAttribute("type"), + sizes: source.getAttribute("sizes") + }); + } + function setResolution(candidate, sizesattr) { + var descriptor = candidate.desc; + return "w" == descriptor.type ? (candidate.cWidth = ri.calcListLength(sizesattr || "100vw"), + candidate.res = descriptor.val / candidate.cWidth) : candidate.res = descriptor.val, + candidate; + } + document.createElement("picture"); + var lengthElInstered, lengthEl, currentSrcSupported, curSrcProp, ri = {}, noop = function() {}, image = document.createElement("img"), getImgAttr = image.getAttribute, setImgAttr = image.setAttribute, removeImgAttr = image.removeAttribute, docElem = document.documentElement, types = {}, cfg = { + addSize: !1, + xQuant: 1, + tLow: .1, + tHigh: .5, + tLazy: .1, + greed: .32 + }, srcAttr = "data-risrc", srcsetAttr = srcAttr + "set"; + ri.ns = ("ri" + new Date().getTime()).substr(0, 9), currentSrcSupported = "currentSrc" in image, + curSrcProp = currentSrcSupported ? "currentSrc" : "src", ri.supSrcset = "srcset" in image, + ri.supSizes = "sizes" in image, ri.selShort = "picture > img, img[srcset]", ri.sel = ri.selShort, + ri.cfg = cfg, ri.supSrcset && (ri.sel += ", img[" + srcsetAttr + "]"); + var anchor = document.createElement("a"); + ri.makeUrl = function(src) { + return anchor.href = src, anchor.href; + }, ri.qsa = function(context, sel) { + return context.querySelectorAll(sel); + }; + { + var on = (window.console && "function" == typeof console.warn ? function(message) { + console.warn(message); + } : noop, function(obj, evt, fn, capture) { + obj.addEventListener ? obj.addEventListener(evt, fn, capture || !1) : obj.attachEvent && obj.attachEvent("on" + evt, fn); + }), off = function(obj, evt, fn, capture) { + obj.removeEventListener ? obj.removeEventListener(evt, fn, capture || !1) : obj.detachEvent && obj.detachEvent("on" + evt, fn); + }; + "https:" == location.protocol; + } + ri.matchesMedia = function() { + return ri.matchesMedia = window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? function(media) { + return !media || matchMedia(media).matches; + } : ri.mMQ, ri.matchesMedia.apply(this, arguments); + }, ri.vW = 0; + var vH, isVwDirty = !0, regex = { + minw: /\(\s*min\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/, + maxw: /\(\s*max\-width\s*:\s*(\s*[0-9\.]+)(px|em)\s*\)/ + }, mediaCache = {}; + ri.mMQ = function(media) { + var min, max, ret = !1; + return media ? (mediaCache[media] || (min = media.match(regex.minw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""), + max = media.match(regex.maxw) && parseFloat(RegExp.$1) + (RegExp.$2 || ""), min && (min = parseFloat(min, 10) * (min.indexOf("em") > 0 ? ri.getEmValue() : 1)), + max && (max = parseFloat(max, 10) * (max.indexOf("em") > 0 ? ri.getEmValue() : 1)), + mediaCache[media] = { + min: min, + max: max + }), min = mediaCache[media].min, max = mediaCache[media].max, (min && ri.vW >= min || max && ri.vW <= max) && (ret = !0), + ret) : !0; + }, ri.DPR = window.devicePixelRatio || 1; + var lengthCache = {}, regLength = /^([\d\.]+)(em|vw|px)$/, baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;"; + ri.calcLength = function(sourceSizeValue) { + var failed, parsedLength, orirgValue = sourceSizeValue, value = !1; + if (!(orirgValue in lengthCache)) { + if (parsedLength = sourceSizeValue.match(regLength)) parsedLength[1] = parseFloat(parsedLength[1], 10), + value = parsedLength[1] ? "vw" == parsedLength[2] ? ri.vW * parsedLength[1] / 100 : "em" == parsedLength[2] ? ri.getEmValue() * parsedLength[1] : parsedLength[1] : !1; else if (sourceSizeValue.indexOf("calc") > -1 || parseInt(sourceSizeValue, 10)) { + sourceSizeValue = sourceSizeValue.replace("vw", "%"), lengthEl || (lengthEl = document.createElement("div"), + lengthEl.style.cssText = baseStyle), lengthElInstered || (lengthElInstered = !0, + docElem.insertBefore(lengthEl, docElem.firstChild)), lengthEl.style.width = "0px"; + try { + lengthEl.style.width = sourceSizeValue; + } catch (e) { + failed = !0; + } + value = lengthEl.offsetWidth, failed && (value = !1); + } + 0 >= value && (value = !1), lengthCache[orirgValue] = value; + } + return lengthCache[orirgValue]; + }, ri.types = types, types["image/jpeg"] = !0, types["image/gif"] = !0, types["image/png"] = !0, + types["image/svg+xml"] = document.implementation.hasFeature("http://wwwindow.w3.org/TR/SVG11/feature#Image", "1.1"), + ri.supportsType = function(type) { + return type ? types[type] : !0; + }; + var regSize = /(\([^)]+\))?\s*(.+)/, memSize = {}; + ri.parseSize = function(sourceSizeStr) { + var match; + return memSize[sourceSizeStr] || (match = (sourceSizeStr || "").match(regSize), + memSize[sourceSizeStr] = { + media: match && match[1], + length: match && match[2] + }), memSize[sourceSizeStr]; + }, ri.parseSet = function(set) { + if (!set.cands) { + var pos, url, descriptor, last, descpos, srcset = set.srcset; + for (set.cands = []; srcset; ) srcset = srcset.replace(/^\s+/g, ""), pos = srcset.search(/\s/g), + descriptor = null, -1 != pos ? (url = srcset.slice(0, pos), last = url.charAt(url.length - 1), + "," != last && url || (url = url.replace(/,+$/, ""), descriptor = ""), srcset = srcset.slice(pos + 1), + null == descriptor && (descpos = srcset.indexOf(","), -1 != descpos ? (descriptor = srcset.slice(0, descpos), + srcset = srcset.slice(descpos + 1)) : (descriptor = srcset, srcset = ""))) : (url = srcset, + srcset = ""), url && (descriptor = parseDescriptor(descriptor)) && set.cands.push({ + url: url.replace(/^,+/, ""), + desc: descriptor, + set: set + }); + } + return set.cands; + }; + var eminpx, memDescriptor = {}, regDescriptor = /^([\+eE\d\.]+)(w|x)$/, fsCss = "font-size:100% !important;"; + ri.getEmValue = function() { + var body; + if (!eminpx && (body = document.body)) { + var div = document.createElement("div"), originalHTMLCSS = docElem.style.cssText, originalBodyCSS = body.style.cssText; + div.style.cssText = baseStyle, docElem.style.cssText = fsCss, body.style.cssText = fsCss, + body.appendChild(div), eminpx = div.offsetWidth, body.removeChild(div), eminpx = parseFloat(eminpx, 10), + docElem.style.cssText = originalHTMLCSS, body.style.cssText = originalBodyCSS; + } + return eminpx || 16; + }; + var sizeLengthCache = {}; + ri.calcListLength = function(sourceSizeListStr) { + if (!(sourceSizeListStr in sizeLengthCache) || cfg.uT) { + var sourceSize, parsedSize, length, media, i, len, sourceSizeList = trim(sourceSizeListStr).split(/\s*,\s*/), winningLength = !1; + for (i = 0, len = sourceSizeList.length; len > i && (sourceSize = sourceSizeList[i], + parsedSize = ri.parseSize(sourceSize), length = parsedSize.length, media = parsedSize.media, + !length || !ri.matchesMedia(media) || (winningLength = ri.calcLength(length)) === !1); i++) ; + sizeLengthCache[sourceSizeListStr] = winningLength ? winningLength : ri.vW; + } + return sizeLengthCache[sourceSizeListStr]; + }, ri.setRes = function(set) { + var candidates, candidate; + if (set) { + candidates = ri.parseSet(set); + for (var i = 0, len = candidates.length; len > i; i++) candidate = candidates[i], + candidate.descriptor || setResolution(candidate, set.sizes); + } + return candidates; + }; + var dprM, tLow, greed, tLazy, tHigh, tMemory, isWinComplete; + ri.applySetCandidate = function(candidates, img) { + if (candidates.length) { + var candidate, dpr, i, j, diff, length, bestCandidate, curSrc, curCan, isSameSet, candidateSrc, imageData = img[ri.ns], evaled = !0; + if (curSrc = imageData.curSrc || img[curSrcProp], curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set), + dpr = ri.getX(candidates, curCan), curSrc && (curCan && (curCan.res += tLazy), isSameSet = !imageData.pic || curCan && curCan.set == candidates[0].set, + curCan && isSameSet && curCan.res >= dpr && tMemory > curCan.res - dpr ? bestCandidate = curCan : img.complete || imageData.src != getImgAttr.call(img, "src") || img.lazyload || (isSameSet || !isWinComplete && !inView(img)) && (bestCandidate = curCan, + candidateSrc = curSrc, evaled = "lazy", isWinComplete && reevaluateAfterLoad(img))), + !bestCandidate) for (candidates.sort(ascendingSort), length = candidates.length, + bestCandidate = candidates[length - 1], i = 0; length > i; i++) if (candidate = candidates[i], + candidate.res >= dpr) { + j = i - 1, bestCandidate = candidates[j] && (diff = candidate.res - dpr) && curSrc != ri.makeUrl(candidate.url) && chooseLowRes(candidates[j].res, diff, dpr) ? candidates[j] : candidate; + break; + } + return curSrc && curCan && (curCan.res -= tLazy), bestCandidate && (candidateSrc = ri.makeUrl(bestCandidate.url), + currentSrcSupported || (img.currentSrc = candidateSrc), imageData.curSrc = candidateSrc, + imageData.curCan = bestCandidate, candidateSrc != curSrc ? ri.setSrc(img, bestCandidate) : ri.setSize(img)), + evaled; + } + }; + ri.getX = function() { + return ri.DPR * cfg.xQuant; + }, ri.setSrc = function(img, bestCandidate) { + var origWidth; + img.src = bestCandidate.url, "image/svg+xml" == bestCandidate.set.type && (origWidth = img.style.width, + img.style.width = img.offsetWidth + 1 + "px", img.offsetWidth + 1 && (img.style.width = origWidth)); + }; + var intrinsicSizeHandler = function() { + off(this, "load", intrinsicSizeHandler), ri.setSize(this); + }; + ri.setSize = function(img) { + var width, curCandidate = img[ri.ns].curCan; + cfg.addSize && curCandidate && !img[ri.ns].dims && (img.complete || (off(img, "load", intrinsicSizeHandler), + on(img, "load", intrinsicSizeHandler)), width = img.naturalWidth, width && ("x" == curCandidate.desc.type ? setImgAttr.call(img, "width", parseInt(width / curCandidate.res / cfg.xQuant, 10)) : "w" == curCandidate.desc.type && setImgAttr.call(img, "width", parseInt(curCandidate.cWidth * (width / curCandidate.desc.val), 10)))); + }, document.addEventListener && "naturalWidth" in image && "complete" in image || (ri.setSize = noop), + ri.getSet = function(img) { + var i, set, supportsType, match = !1, sets = img[ri.ns].sets; + for (i = 0; i < sets.length && !match; i++) if (set = sets[i], set.srcset && ri.matchesMedia(set.media) && (supportsType = ri.supportsType(set.type))) { + "pending" == supportsType && (set = supportsType), match = set; + break; + } + return match; + }; + var alwaysCheckWDescriptor = ri.supSrcset && !ri.supSizes; + ri.parseSets = function(element, parent) { + var srcsetAttribute, fallbackCandidate, isWDescripor, srcsetParsed, hasPicture = "PICTURE" == parent.nodeName.toUpperCase(), imageData = element[ri.ns]; + imageData.src === undefined && (imageData.src = getImgAttr.call(element, "src"), + imageData.src ? setImgAttr.call(element, srcAttr, imageData.src) : removeImgAttr.call(element, srcAttr)), + imageData.srcset === undefined && (srcsetAttribute = getImgAttr.call(element, "srcset"), + imageData.srcset = srcsetAttribute, srcsetParsed = !0), imageData.dims === undefined && (imageData.dims = getImgAttr.call(element, "height") && getImgAttr.call(element, "width")), + imageData.sets = [], hasPicture && (imageData.pic = !0, getAllSourceElements(parent, imageData.sets)), + imageData.srcset ? (fallbackCandidate = { + srcset: imageData.srcset, + sizes: getImgAttr.call(element, "sizes") + }, imageData.sets.push(fallbackCandidate), isWDescripor = alwaysCheckWDescriptor || imageData.src ? hasWDescripor(fallbackCandidate) : !1, + isWDescripor || !imageData.src || getCandidateForSrc(imageData.src, fallbackCandidate) || hasOneX(fallbackCandidate) || (fallbackCandidate.srcset += ", " + imageData.src, + fallbackCandidate.cands = !1)) : imageData.src && imageData.sets.push({ + srcset: imageData.src, + sizes: null + }), imageData.curCan = null, imageData.supported = !(hasPicture || fallbackCandidate && !ri.supSrcset || isWDescripor), + srcsetParsed && ri.supSrcset && !imageData.supported && (srcsetAttribute ? (setImgAttr.call(element, srcsetAttr, srcsetAttribute), + element.srcset = "") : removeImgAttr.call(element, srcsetAttr)), imageData.parsed = !0; + }; + var reevaluateAfterLoad = function() { + var onload = function() { + off(this, "load", onload), ri.fillImgs({ + elements: [ this ] + }); + }; + return function(img) { + off(img, "load", onload), on(img, "load", onload); + }; + }(); + ri.fillImg = function(element, options) { + var parent, imageData, extreme = options.reparse || options.reevaluate; + if (element[ri.ns] || (element[ri.ns] = {}), imageData = element[ri.ns], "lazy" == imageData.evaled && (isWinComplete || element.complete) && (imageData.evaled = !1), + extreme || !imageData.evaled) { + if (!imageData.parsed || options.reparse) { + if (parent = element.parentNode, !parent) return; + ri.parseSets(element, parent, options); + } + imageData.supported ? imageData.evaled = !0 : applyBestCandidate(element); + } + }; + var resizeThrottle; + ri.setupRun = function(options) { + (!alreadyRun || options.reevaluate || isVwDirty) && (cfg.uT || (ri.DPR = window.devicePixelRatio || 1), + dprM = Math.min(Math.max(ri.DPR * cfg.xQuant, 1), 2.5), tLow = cfg.tLow * dprM, + tLazy = cfg.tLazy * dprM, greed = cfg.greed * dprM, tHigh = cfg.tHigh, tMemory = .6 + .4 * dprM + tLazy), + isVwDirty && (lengthCache = {}, sizeLengthCache = {}, updateView(), options.elements || options.context || clearTimeout(resizeThrottle)); + }, ri.teardownRun = function() { + var parent; + lengthElInstered && (lengthElInstered = !1, parent = lengthEl.parentNode, parent && parent.removeChild(lengthEl)); + }; + var alreadyRun = !1, respimage = function(opt) { + var elements, i, plen, options = opt || {}; + if (options.elements && 1 == options.elements.nodeType && ("IMG" == options.elements.nodeName.toUpperCase() ? options.elements = [ options.elements ] : (options.context = options.elements, + options.elements = null)), elements = options.elements || ri.qsa(options.context || document, options.reevaluate || options.reparse ? ri.sel : ri.selShort), + plen = elements.length) { + for (ri.setupRun(options), alreadyRun = !0, i = 0; plen > i; i++) ri.fillImg(elements[i], options); + ri.teardownRun(options); + } + }; + ri.fillImgs = respimage, window.HTMLPictureElement ? (respimage = noop, ri.fillImg = noop) : !function() { + var regWinComplete = /^loade|^c/, run = function() { + clearTimeout(timerId), timerId = setTimeout(run, 3e3), document.body && (regWinComplete.test(document.readyState || "") && (isWinComplete = !0, + clearTimeout(timerId), off(document, "readystatechange", run)), ri.fillImgs()); + }, resizeEval = function() { + ri.fillImgs({ + reevaluate: !0 + }); + }, onResize = function() { + clearTimeout(resizeThrottle), isVwDirty = !0, resizeThrottle = setTimeout(resizeEval, 99); + }, timerId = setTimeout(run, document.body ? 9 : 99); + on(window, "resize", onResize), on(document, "readystatechange", run); + }(), respimage._ = ri, respimage.config = function(name, value, value2) { + if ("addType" == name) { + if (types[value] = value2, "pending" == value2) return; + } else cfg[name] = value; + alreadyRun && ri.fillImgs({ + reevaluate: !0 + }); + }, window.respimage = respimage; +}(window, document); +(function( factory ) { + "use strict"; + var interValId; + var intervalIndex = 0; + var run = function(){ + if ( window.respimage ) { + factory( window.respimage ); + } + if(window.respimage || intervalIndex > 9999){ + clearInterval(interValId); + } + intervalIndex++; + }; + interValId = setInterval(run, 8); + + run(); + +}( function( respimage ) { "use strict"; - // If picture is supported, well, that's awesome. Let's get outta here... - if ( w.HTMLPictureElement ) { - w.picturefill = function() { }; + var ri = respimage._; + var runningTests = 0; + var setTypeValue = function(types, value){ + var i; + for(i = 0; i < types.length; i++){ + ri.types[types[i]] = value; + } + }; + + if(window.HTMLPictureElement && !ri.cfg.uT){ + respimage.testTypeSupport = function(){}; return; } - // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround) - doc.createElement( "picture" ); + ri.types["image/bmp"] = true; + ri.types["image/x-bmp"] = true; - // local object for method references and testing exposure - var pf = {}; - - // namespace - pf.ns = "picturefill"; - - // srcset support test - pf.srcsetSupported = "srcset" in doc.createElement( "img" ); - pf.sizesSupported = w.HTMLImageElement.sizes; - - // just a string trim workaround - pf.trim = function( str ) { - return str.trim ? str.trim() : str.replace( /^\s+|\s+$/g, "" ); - }; - - // just a string endsWith workaround - pf.endsWith = function( str, suffix ) { - return str.endsWith ? str.endsWith( suffix ) : str.indexOf( suffix, str.length - suffix.length ) !== -1; - }; - - /** - * Shortcut method for matchMedia ( for easy overriding in tests ) - */ - pf.matchesMedia = function( media ) { - return w.matchMedia && w.matchMedia( media ).matches; - }; - - /** - * Shortcut method for `devicePixelRatio` ( for easy overriding in tests ) - */ - pf.getDpr = function() { - return ( w.devicePixelRatio || 1 ); - }; - - /** - * Get width in css pixel value from a "length" value - * http://dev.w3.org/csswg/css-values-3/#length-value - */ - pf.getWidthFromLength = function( length ) { - // If no length was specified, or it is 0 or negative, default to `100vw` (per the spec). - length = length && ( parseFloat( length ) > 0 || length.indexOf( "calc(" ) > -1 ) ? length : "100vw"; - - /** - * If length is specified in `vw` units, use `%` instead since the div we’re measuring - * is injected at the top of the document. - * - * TODO: maybe we should put this behind a feature test for `vw`? - */ - length = length.replace( "vw", "%" ); - - // Create a cached element for getting length value widths - if ( !pf.lengthEl ) { - pf.lengthEl = doc.createElement( "div" ); - doc.documentElement.insertBefore( pf.lengthEl, doc.documentElement.firstChild ); + respimage.testTypeSupport = function(types, url, width, useCanvas){ + if(typeof types == "string"){ + types = types.split(/\s*\,*\s+/g); } - - // Positioning styles help prevent padding/margin/width on `html` from throwing calculations off. - pf.lengthEl.style.cssText = "position: absolute; left: 0; width: " + length + ";"; - - if ( pf.lengthEl.offsetWidth <= 0 ) { - // Something has gone wrong. `calc()` is in use and unsupported, most likely. Default to `100vw` (`100%`, for broader support.): - pf.lengthEl.style.cssText = "width: 100%;"; - } - - return pf.lengthEl.offsetWidth; - }; - - // container of supported mime types that one might need to qualify before using - pf.types = {}; - - // Add support for standard mime types. - pf.types["image/jpeg"] = true; - pf.types["image/gif"] = true; - pf.types["image/png"] = true; - - // test svg support - pf.types[ "image/svg+xml" ] = doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"); - - // test webp support, only when the markup calls for it - pf.types[ "image/webp" ] = function() { - // based on Modernizr's lossless img-webp test - // note: asynchronous - var img = new w.Image(), - type = "image/webp"; - - img.onerror = function() { - pf.types[ type ] = false; - picturefill(); + var canvas; + var supports = "pending"; + var img = document.createElement('img'); + var onComplete = function(){ + runningTests--; + setTypeValue(types, supports); + if(runningTests < 1){ + respimage({reevaluate: true}); + } }; - img.onload = function() { - pf.types[ type ] = img.width === 1; - picturefill(); - }; - img.src = "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA="; - }; - /** - * Takes a source element and checks if its type attribute is present and if so, supported - * Note: for type tests that require a async logic, - * you can define them as a function that'll run only if that type needs to be tested. Just make the test function call picturefill again when it is complete. - * see the async webp test above for example - */ - pf.verifyTypeSupport = function( source ) { - var type = source.getAttribute( "type" ); - // if type attribute exists, return test result, otherwise return true - if ( type === null || type === "" ) { - return true; - } else { - // if the type test is a function, run it and return "pending" status. The function will rerun picturefill on pending elements once finished. - if ( typeof( pf.types[ type ] ) === "function" ) { - pf.types[ type ](); - return "pending"; - } else { - return pf.types[ type ]; - } - } - }; - - /** - * Parses an individual `size` and returns the length, and optional media query - */ - pf.parseSize = function( sourceSizeStr ) { - var match = /(\([^)]+\))?\s*(.+)/g.exec( sourceSizeStr ); - return { - media: match && match[1], - length: match && match[2] - }; - }; - - /** - * Takes a string of sizes and returns the width in pixels as a number - */ - pf.findWidthFromSourceSize = function( sourceSizeListStr ) { - // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33% - // or (min-width:30em) calc(30% - 15px) - var sourceSizeList = pf.trim( sourceSizeListStr ).split( /\s*,\s*/ ), - winningLength; - - for ( var i = 0, len = sourceSizeList.length; i < len; i++ ) { - // Match ? length, ie ( min-width: 50em ) 100% - var sourceSize = sourceSizeList[ i ], - // Split "( min-width: 50em ) 100%" into separate strings - parsedSize = pf.parseSize( sourceSize ), - length = parsedSize.length, - media = parsedSize.media; - - if ( !length ) { - continue; - } - if ( !media || pf.matchesMedia( media ) ) { - // if there is no media query or it matches, choose this as our winning length - // and end algorithm - winningLength = length; - break; - } - } - - // pass the length to a method that can properly determine length - // in pixels based on these formats: http://dev.w3.org/csswg/css-values-3/#length-value - return pf.getWidthFromLength( winningLength ); - }; - - pf.parseSrcset = function( srcset ) { - /** - * A lot of this was pulled from Boris Smus’ parser for the now-defunct WHATWG `srcset` - * https://github.com/borismus/srcset-polyfill/blob/master/js/srcset-info.js - * - * 1. Let input (`srcset`) be the value passed to this algorithm. - * 2. Let position be a pointer into input, initially pointing at the start of the string. - * 3. Let raw candidates be an initially empty ordered list of URLs with associated - * unparsed descriptors. The order of entries in the list is the order in which entries - * are added to the list. - */ - var candidates = []; - - while ( srcset !== "" ) { - srcset = srcset.replace(/^\s+/g,""); - - // 5. Collect a sequence of characters that are not space characters, and let that be url. - var pos = srcset.search(/\s/g), - url, descriptor = null; - - if ( pos !== -1 ) { - url = srcset.slice( 0, pos ); - - var last = url[ url.length - 1 ]; - - // 6. If url ends with a U+002C COMMA character (,), remove that character from url - // and let descriptors be the empty string. Otherwise, follow these substeps - // 6.1. If url is empty, then jump to the step labeled descriptor parser. - - if ( last === "," || url === "" ) { - url = url.replace(/,+$/, ""); - descriptor = ""; - } - srcset = srcset.slice( pos + 1 ); - - // 6.2. Collect a sequence of characters that are not U+002C COMMA characters (,), and - // let that be descriptors. - if ( descriptor === null ) { - var descpos = srcset.indexOf(","); - if ( descpos !== -1 ) { - descriptor = srcset.slice( 0, descpos ); - srcset = srcset.slice( descpos + 1 ); - } else { - descriptor = srcset; - srcset = ""; - } - } - } else { - url = srcset; - srcset = ""; - } - - // 7. Add url to raw candidates, associated with descriptors. - if ( url || descriptor ) { - candidates.push({ - url: url, - descriptor: descriptor - }); - } - } - return candidates; - }; - - pf.parseDescriptor = function( descriptor, sizesattr ) { - // 11. Descriptor parser: Let candidates be an initially empty source set. The order of entries in the list - // is the order in which entries are added to the list. - var sizes = sizesattr || "100vw", - sizeDescriptor = descriptor && descriptor.replace(/(^\s+|\s+$)/g, ""), - widthInCssPixels = pf.findWidthFromSourceSize( sizes ), - resCandidate; - - if ( sizeDescriptor ) { - var splitDescriptor = sizeDescriptor.split(" "); - - for (var i = splitDescriptor.length + 1; i >= 0; i--) { - if ( splitDescriptor[ i ] !== undefined ) { - var curr = splitDescriptor[ i ], - lastchar = curr && curr.slice( curr.length - 1 ); - - if ( ( lastchar === "h" || lastchar === "w" ) && !pf.sizesSupported ) { - resCandidate = parseFloat( ( parseInt( curr, 10 ) / widthInCssPixels ) ); - } else if ( lastchar === "x" ) { - var res = curr && parseFloat( curr, 10 ); - resCandidate = res && !isNaN( res ) ? res : 1; - } - } - } - } - return resCandidate || 1; - }; - - /** - * Takes a srcset in the form of url/ - * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or - * "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or - * "images/pic-small.png" - * Get an array of image candidates in the form of - * {url: "/foo/bar.png", resolution: 1} - * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value - * If sizes is specified, resolution is calculated - */ - pf.getCandidatesFromSourceSet = function( srcset, sizes ) { - var candidates = pf.parseSrcset( srcset ), - formattedCandidates = []; - - for ( var i = 0, len = candidates.length; i < len; i++ ) { - var candidate = candidates[ i ]; - - formattedCandidates.push({ - url: candidate.url, - resolution: pf.parseDescriptor( candidate.descriptor, sizes ) - }); - } - return formattedCandidates; - }; - - /* - * if it's an img element and it has a srcset property, - * we need to remove the attribute so we can manipulate src - * (the property's existence infers native srcset support, and a srcset-supporting browser will prioritize srcset's value over our winning picture candidate) - * this moves srcset's value to memory for later use and removes the attr - */ - pf.dodgeSrcset = function( img ) { - if ( img.srcset ) { - img[ pf.ns ].srcset = img.srcset; - img.removeAttribute( "srcset" ); - } - }; - - /* - * Accept a source or img element and process its srcset and sizes attrs - */ - pf.processSourceSet = function( el ) { - var srcset = el.getAttribute( "srcset" ), - sizes = el.getAttribute( "sizes" ), - candidates = []; - - // if it's an img element, use the cached srcset property (defined or not) - if ( el.nodeName.toUpperCase() === "IMG" && el[ pf.ns ] && el[ pf.ns ].srcset ) { - srcset = el[ pf.ns ].srcset; - } - - if ( srcset ) { - candidates = pf.getCandidatesFromSourceSet( srcset, sizes ); - } - return candidates; - }; - - pf.applyBestCandidate = function( candidates, picImg ) { - var candidate, - length, - bestCandidate; - - candidates.sort( pf.ascendingSort ); - - length = candidates.length; - bestCandidate = candidates[ length - 1 ]; - - for ( var i = 0; i < length; i++ ) { - candidate = candidates[ i ]; - if ( candidate.resolution >= pf.getDpr() ) { - bestCandidate = candidate; - break; - } - } - - if ( bestCandidate && !pf.endsWith( picImg.src, bestCandidate.url ) ) { - picImg.src = bestCandidate.url; - // currentSrc attribute and property to match - // http://picture.responsiveimages.org/#the-img-element - picImg.currentSrc = picImg.src; - } - }; - - pf.ascendingSort = function( a, b ) { - return a.resolution - b.resolution; - }; - - /* - * In IE9, elements get removed if they aren't children of - * video elements. Thus, we conditionally wrap source elements - * using - * and must account for that here by moving those source elements - * back into the picture element. - */ - pf.removeVideoShim = function( picture ) { - var videos = picture.getElementsByTagName( "video" ); - if ( videos.length ) { - var video = videos[ 0 ], - vsources = video.getElementsByTagName( "source" ); - while ( vsources.length ) { - picture.insertBefore( vsources[ 0 ], video ); - } - // Remove the video element once we're finished removing its children - video.parentNode.removeChild( video ); - } - }; - - /* - * Find all `img` elements, and add them to the candidate list if they have - * a `picture` parent, a `sizes` attribute in basic `srcset` supporting browsers, - * a `srcset` attribute at all, and they haven’t been evaluated already. - */ - pf.getAllElements = function() { - var elems = [], - imgs = doc.getElementsByTagName( "img" ); - - for ( var h = 0, len = imgs.length; h < len; h++ ) { - var currImg = imgs[ h ]; - - if ( currImg.parentNode.nodeName.toUpperCase() === "PICTURE" || - ( currImg.getAttribute( "srcset" ) !== null ) || currImg[ pf.ns ] && currImg[ pf.ns ].srcset !== null ) { - elems.push( currImg ); - } - } - return elems; - }; - - pf.getMatch = function( img, picture ) { - var sources = picture.childNodes, - match; - - // Go through each child, and if they have media queries, evaluate them - for ( var j = 0, slen = sources.length; j < slen; j++ ) { - var source = sources[ j ]; - - // ignore non-element nodes - if ( source.nodeType !== 1 ) { - continue; - } - - // Hitting the `img` element that started everything stops the search for `sources`. - // If no previous `source` matches, the `img` itself is evaluated later. - if ( source === img ) { - return match; - } - - // ignore non-`source` nodes - if ( source.nodeName.toUpperCase() !== "SOURCE" ) { - continue; - } - // if it's a source element that has the `src` property set, throw a warning in the console - if ( source.getAttribute( "src" ) !== null && typeof console !== undefined ){ - console.warn("The `src` attribute is invalid on `picture` `source` element; instead, use `srcset`."); - } - - var media = source.getAttribute( "media" ); - - // if source does not have a srcset attribute, skip - if ( !source.getAttribute( "srcset" ) ) { - continue; - } - - // if there's no media specified, OR w.matchMedia is supported - if ( ( !media || pf.matchesMedia( media ) ) ) { - var typeSupported = pf.verifyTypeSupport( source ); - - if ( typeSupported === true ) { - match = source; - break; - } else if ( typeSupported === "pending" ) { - return false; - } - } - } - - return match; - }; - - function picturefill( opt ) { - var elements, - element, - parent, - firstMatch, - candidates, - - options = opt || {}; - elements = options.elements || pf.getAllElements(); - - // Loop through all elements - for ( var i = 0, plen = elements.length; i < plen; i++ ) { - element = elements[ i ]; - parent = element.parentNode; - firstMatch = undefined; - candidates = undefined; - - // expando for caching data on the img - if ( !element[ pf.ns ] ) { - element[ pf.ns ] = {}; - } - - // if the element has already been evaluated, skip it - // unless `options.force` is set to true ( this, for example, - // is set to true when running `picturefill` on `resize` ). - if ( !options.reevaluate && element[ pf.ns ].evaluated ) { - continue; - } - - // if `img` is in a `picture` element - if ( parent.nodeName.toUpperCase() === "PICTURE" ) { - - // IE9 video workaround - pf.removeVideoShim( parent ); - - // return the first match which might undefined - // returns false if there is a pending source - // TODO the return type here is brutal, cleanup - firstMatch = pf.getMatch( element, parent ); - - // if any sources are pending in this picture due to async type test(s) - // remove the evaluated attr and skip for now ( the pending test will - // rerun picturefill on this element when complete) - if ( firstMatch === false ) { - continue; - } - } else { - firstMatch = undefined; - } - - // Cache and remove `srcset` if present and we’re going to be doing `picture`/`srcset`/`sizes` polyfilling to it. - if ( parent.nodeName.toUpperCase() === "PICTURE" || - ( element.srcset && !pf.srcsetSupported ) || - ( !pf.sizesSupported && ( element.srcset && element.srcset.indexOf("w") > -1 ) ) ) { - pf.dodgeSrcset( element ); - } - - if ( firstMatch ) { - candidates = pf.processSourceSet( firstMatch ); - pf.applyBestCandidate( candidates, element ); - } else { - // No sources matched, so we’re down to processing the inner `img` as a source. - candidates = pf.processSourceSet( element ); - - if ( element.srcset === undefined || element[ pf.ns ].srcset ) { - // Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality. - pf.applyBestCandidate( candidates, element ); - } // Else, resolution-only `srcset` is supported natively. - } - - // set evaluated to true to avoid unnecessary reparsing - element[ pf.ns ].evaluated = true; - } - } - - /** - * Sets up picture polyfill by polling the document and running - * the polyfill every 250ms until the document is ready. - * Also attaches picturefill on resize - */ - function runPicturefill() { - picturefill(); - var intervalId = setInterval( function() { - // When the document has finished loading, stop checking for new images - // https://github.com/ded/domready/blob/master/ready.js#L15 - picturefill(); - if ( /^loaded|^i|^c/.test( doc.readyState ) ) { - clearInterval( intervalId ); + if(useCanvas){ + canvas = document.createElement('canvas'); + if(!canvas.getContext){ + setTypeValue(types, false); return; } - }, 250 ); - if ( w.addEventListener ) { - var resizeThrottle; - w.addEventListener( "resize", function() { - if (!w._picturefillWorking) { - w._picturefillWorking = true; - w.clearTimeout( resizeThrottle ); - resizeThrottle = w.setTimeout( function() { - picturefill({ reevaluate: true }); - w._picturefillWorking = false; - }, 60 ); - } - }, false ); } - } - runPicturefill(); - - /* expose methods for testing */ - picturefill._ = pf; - - /* expose picturefill */ - w.picturefill = picturefill; - - (function(){ - - webshim.isReady('picture', true); - var sel = 'picture, img[srcset]'; - webshim.addReady(function(context){ - if(context.querySelector(sel)){ - window.picturefill(); + img.onload = function(){ + var ctx; + supports = true; + if(width){ + supports = img.width == width; } - }); - })(); -} ); + + if(useCanvas){ + ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0); + supports = ctx.getImageData(0, 0, 1, 1).data[3] === 0; + } + onComplete(); + }; + + img.onerror = function(){ + supports = false; + onComplete(); + }; + runningTests++; + setTypeValue(types, "pending"); + img.src = url; + }; + + + respimage.testTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA==", 1); + respimage.testTypeSupport("image/jp2 image/jpx image/jpm", "data:image/jp2;base64,AAAADGpQICANCocKAAAAFGZ0eXBqcDIgAAAAAGpwMiAAAABHanAyaAAAABZpaGRyAAAAAQAAAAEAAQAHAAAAAAAPY29scgEAAAAAABEAAAAacmVzIAAAABJyZXNjAGAA/gBgAP4EBAAAAABqcDJj/0//UQApAAAAAAABAAAAAQAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAABAAEB/1wADUAIEBAYEBAYEBAY/1IADAAAAAEAAwQEAAH/ZAAPAAFMV0ZfSlAyXzIxMf+QAAoAAAAAABIAAf+TgICAgP/Z", 1); + respimage.testTypeSupport("image/vnd.ms-photo", "data:image/vnd.ms-photo;base64,SUm8AQgAAAAFAAG8AQAQAAAASgAAAIC8BAABAAAAAQAAAIG8BAABAAAAAQAAAMC8BAABAAAAWgAAAMG8BAABAAAAHwAAAAAAAAAkw91vA07+S7GFPXd2jckNV01QSE9UTwAZAYBxAAAAABP/gAAEb/8AAQAAAQAAAA==", 1); + respimage.testTypeSupport("video/png video/apng video/x-mng video/x-png", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACGFjVEwAAAABAAAAAcMq2TYAAAANSURBVAiZY2BgYPgPAAEEAQB9ssjfAAAAGmZjVEwAAAAAAAAAAQAAAAEAAAAAAAAAAAD6A+gBAbNU+2sAAAARZmRBVAAAAAEImWNgYGBgAAAABQAB6MzFdgAAAABJRU5ErkJggg==", false, true); + +})); + +(function(){ + + webshim.isReady('picture', true); + var sel = 'picture, img[srcset]'; + webshim.addReady(function(context){ + if(context.querySelector(sel)){ + window.respimage(); + } + }); +})(); ;/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */ diff --git a/public/webshims/shims/combos/2.js b/public/webshims/shims/combos/2.js index 258147b9..8eb6f76f 100644 --- a/public/webshims/shims/combos/2.js +++ b/public/webshims/shims/combos/2.js @@ -325,20 +325,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -759,7 +764,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1710,6 +1715,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/21.js b/public/webshims/shims/combos/21.js index fd661965..1bceb39c 100644 --- a/public/webshims/shims/combos/21.js +++ b/public/webshims/shims/combos/21.js @@ -1463,6 +1463,25 @@ VIDEO: 1 }; var tested = {}; + var addToBlob = function(){ + var desc = webshim.defineNodeNameProperty('canvas', 'toBlob', { + prop: { + value: function(){ + var context = $(this).callProp('getContext', ['2d']); + var that = this; + var args = arguments; + var cb = function(){ + return desc.prop._supvalue.apply(that, args); + }; + if(context.wsImageComplete && context._wsIsLoading){ + context.wsImageComplete(cb); + } else { + return cb(); + } + } + } + }); + }; if(!_drawImage){ webshim.error('canvas.drawImage feature is needed. In IE8 flashvanvas pro can be used'); @@ -1537,6 +1556,12 @@ } return _drawImage.apply(this, arguments); }; + + if(!document.createElement('canvas').toBlob){ + webshims.ready('filereader', addToBlob); + } else { + addToBlob(); + } return true; }; @@ -1810,10 +1835,11 @@ var copyName = {srclang: 'language'}; var updateMediaTrackList = function(baseData, trackList){ + var i, len; + var callChange = false; var removed = []; var added = []; var newTracks = []; - var i, len; if(!baseData){ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {}); } @@ -1848,12 +1874,13 @@ removed.push(trackList[i]); } } - + if(removed.length || added.length){ trackList.splice(0); for(i = 0, len = newTracks.length; i < len; i++){ trackList.push(newTracks[i]); + } for(i = 0, len = removed.length; i < len; i++){ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]})); @@ -1866,6 +1893,16 @@ $(this).triggerHandler('updatetrackdisplay'); } } + + for(i = 0, len = trackList.length; i < len; i++){ + if(trackList[i].__wsmode != trackList[i].mode){ + trackList[i].__wsmode = trackList[i].mode; + callChange = true; + } + } + if(callChange){ + $([trackList]).triggerHandler('change'); + } }; var refreshTrack = function(track, trackData){ diff --git a/public/webshims/shims/combos/22.js b/public/webshims/shims/combos/22.js index 824dba25..45649a08 100644 --- a/public/webshims/shims/combos/22.js +++ b/public/webshims/shims/combos/22.js @@ -260,10 +260,11 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio var copyName = {srclang: 'language'}; var updateMediaTrackList = function(baseData, trackList){ + var i, len; + var callChange = false; var removed = []; var added = []; var newTracks = []; - var i, len; if(!baseData){ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {}); } @@ -298,12 +299,13 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio removed.push(trackList[i]); } } - + if(removed.length || added.length){ trackList.splice(0); for(i = 0, len = newTracks.length; i < len; i++){ trackList.push(newTracks[i]); + } for(i = 0, len = removed.length; i < len; i++){ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]})); @@ -316,6 +318,16 @@ webshims.register('details', function($, webshims, window, doc, undefined, optio $(this).triggerHandler('updatetrackdisplay'); } } + + for(i = 0, len = trackList.length; i < len; i++){ + if(trackList[i].__wsmode != trackList[i].mode){ + trackList[i].__wsmode = trackList[i].mode; + callChange = true; + } + } + if(callChange){ + $([trackList]).triggerHandler('change'); + } }; var refreshTrack = function(track, trackData){ diff --git a/public/webshims/shims/combos/25.js b/public/webshims/shims/combos/25.js index 4ca46549..2c50c176 100644 --- a/public/webshims/shims/combos/25.js +++ b/public/webshims/shims/combos/25.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1611,22 +1616,19 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine qualitiy = 0.8; } loadMoxie(); - setTimeout(function(){ + webshim.ready('moxie', function(){ + var img = new mOxie.Image(); dataURL = $canvas.callProp('getAsDataURL', [type, qualitiy]); - webshim.ready('moxie', function(){ - var img = new mOxie.Image(); - - img.onload = function() { - var blob = img.getAsBlob(); - webshim.defineProperty(blob, '_wsDataURL', { - value: dataURL, - enumerable: false - }); - cb(blob); - }; - img.load(dataURL); - }); - }, 9); + img.onload = function() { + var blob = img.getAsBlob(); + webshim.defineProperty(blob, '_wsDataURL', { + value: dataURL, + enumerable: false + }); + cb(blob); + }; + img.load(dataURL); + }); } } }); @@ -2896,6 +2898,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine VIDEO: 1 }; var tested = {}; + var addToBlob = function(){ + var desc = webshim.defineNodeNameProperty('canvas', 'toBlob', { + prop: { + value: function(){ + var context = $(this).callProp('getContext', ['2d']); + var that = this; + var args = arguments; + var cb = function(){ + return desc.prop._supvalue.apply(that, args); + }; + if(context.wsImageComplete && context._wsIsLoading){ + context.wsImageComplete(cb); + } else { + return cb(); + } + } + } + }); + }; if(!_drawImage){ webshim.error('canvas.drawImage feature is needed. In IE8 flashvanvas pro can be used'); @@ -2970,6 +2991,12 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return _drawImage.apply(this, arguments); }; + + if(!document.createElement('canvas').toBlob){ + webshims.ready('filereader', addToBlob); + } else { + addToBlob(); + } return true; }; diff --git a/public/webshims/shims/combos/27.js b/public/webshims/shims/combos/27.js index 880c79cb..643ff70b 100644 --- a/public/webshims/shims/combos/27.js +++ b/public/webshims/shims/combos/27.js @@ -1632,22 +1632,19 @@ webshims.register('form-shim-extend2', function($, webshims, window, document, u qualitiy = 0.8; } loadMoxie(); - setTimeout(function(){ + webshim.ready('moxie', function(){ + var img = new mOxie.Image(); dataURL = $canvas.callProp('getAsDataURL', [type, qualitiy]); - webshim.ready('moxie', function(){ - var img = new mOxie.Image(); - - img.onload = function() { - var blob = img.getAsBlob(); - webshim.defineProperty(blob, '_wsDataURL', { - value: dataURL, - enumerable: false - }); - cb(blob); - }; - img.load(dataURL); - }); - }, 9); + img.onload = function() { + var blob = img.getAsBlob(); + webshim.defineProperty(blob, '_wsDataURL', { + value: dataURL, + enumerable: false + }); + cb(blob); + }; + img.load(dataURL); + }); } } }); diff --git a/public/webshims/shims/combos/28.js b/public/webshims/shims/combos/28.js index 8c626b0a..3c619726 100644 --- a/public/webshims/shims/combos/28.js +++ b/public/webshims/shims/combos/28.js @@ -607,22 +607,25 @@ if(webshims.support.inputtypes.date && /webkit/i.test(navigator.userAgent)){ webshims.addReady(function(context, contextElem){ //start constrain-validation - var focusElem; + $('form', context) .add(contextElem.filter('form')) .on('invalid', $.noop) ; - - try { - if(context == document && !('form' in (document.activeElement || {}))) { - focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; - if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) { - focusElem.focus(); + + setTimeout(function(){ + var focusElem; + try { + if(!('form' in (document.activeElement || {}))) { + focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; + if (focusElem && (focusElem.offsetHeight || focusElem.offsetWidth)) { + focusElem.focus(); + } } } - } - catch (er) {} - + catch (er) {} + }, 9); + }); if(!webshims.support.datalist){ diff --git a/public/webshims/shims/combos/3.js b/public/webshims/shims/combos/3.js index adfb33d3..dffab67c 100644 --- a/public/webshims/shims/combos/3.js +++ b/public/webshims/shims/combos/3.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1487,6 +1492,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/30.js b/public/webshims/shims/combos/30.js index eac80544..5c9cda5d 100644 --- a/public/webshims/shims/combos/30.js +++ b/public/webshims/shims/combos/30.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1487,6 +1492,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/31.js b/public/webshims/shims/combos/31.js index 63d04c5f..54eb2e30 100644 --- a/public/webshims/shims/combos/31.js +++ b/public/webshims/shims/combos/31.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1487,6 +1492,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/34.js b/public/webshims/shims/combos/34.js index 879cc92e..d8a11592 100644 --- a/public/webshims/shims/combos/34.js +++ b/public/webshims/shims/combos/34.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1343,10 +1348,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine var copyName = {srclang: 'language'}; var updateMediaTrackList = function(baseData, trackList){ + var i, len; + var callChange = false; var removed = []; var added = []; var newTracks = []; - var i, len; if(!baseData){ baseData = webshims.data(this, 'mediaelementBase') || webshims.data(this, 'mediaelementBase', {}); } @@ -1381,12 +1387,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine removed.push(trackList[i]); } } - + if(removed.length || added.length){ trackList.splice(0); for(i = 0, len = newTracks.length; i < len; i++){ trackList.push(newTracks[i]); + } for(i = 0, len = removed.length; i < len; i++){ $([trackList]).triggerHandler($.Event({type: 'removetrack', track: removed[i]})); @@ -1399,6 +1406,16 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine $(this).triggerHandler('updatetrackdisplay'); } } + + for(i = 0, len = trackList.length; i < len; i++){ + if(trackList[i].__wsmode != trackList[i].mode){ + trackList[i].__wsmode = trackList[i].mode; + callChange = true; + } + } + if(callChange){ + $([trackList]).triggerHandler('change'); + } }; var refreshTrack = function(track, trackData){ diff --git a/public/webshims/shims/combos/4.js b/public/webshims/shims/combos/4.js index a71f92e4..7d8c8ff0 100644 --- a/public/webshims/shims/combos/4.js +++ b/public/webshims/shims/combos/4.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; diff --git a/public/webshims/shims/combos/5.js b/public/webshims/shims/combos/5.js index 843cbd9e..6258221e 100644 --- a/public/webshims/shims/combos/5.js +++ b/public/webshims/shims/combos/5.js @@ -1871,9 +1871,13 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -2028,6 +2032,7 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -2049,8 +2054,7 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -2352,9 +2356,11 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -2478,36 +2484,34 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/combos/6.js b/public/webshims/shims/combos/6.js index 03a4171c..5fbe93ec 100644 --- a/public/webshims/shims/combos/6.js +++ b/public/webshims/shims/combos/6.js @@ -1871,9 +1871,13 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -2028,6 +2032,7 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -2049,8 +2054,7 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -2352,9 +2356,11 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -2478,36 +2484,34 @@ webshims.register('form-native-extend', function($, webshims, window, doc, undef var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/combos/7.js b/public/webshims/shims/combos/7.js index e70a5838..8f05d1bf 100644 --- a/public/webshims/shims/combos/7.js +++ b/public/webshims/shims/combos/7.js @@ -325,20 +325,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -759,7 +764,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1710,6 +1715,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/8.js b/public/webshims/shims/combos/8.js index 2c5ee658..6a80bdbd 100644 --- a/public/webshims/shims/combos/8.js +++ b/public/webshims/shims/combos/8.js @@ -325,20 +325,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -759,7 +764,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -1710,6 +1715,8 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/combos/9.js b/public/webshims/shims/combos/9.js index 5e544054..5b2e7006 100644 --- a/public/webshims/shims/combos/9.js +++ b/public/webshims/shims/combos/9.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; @@ -2275,9 +2280,13 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -2432,6 +2441,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -2453,8 +2463,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -2756,9 +2765,11 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -2882,36 +2893,34 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/dom-extend.js b/public/webshims/shims/dom-extend.js index bb800076..6b120aec 100644 --- a/public/webshims/shims/dom-extend.js +++ b/public/webshims/shims/dom-extend.js @@ -102,20 +102,25 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine }; //jquery mobile and jquery ui - if(!$.widget){ + if(!$.widget && (!$.pluginFactory || !$.pluginFactory.mixin)){ (function(){ var _cleanData = $.cleanData; - $.cleanData = function( elems ) { - if(!$.widget){ - for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { try { - $( elem ).triggerHandler( "remove" ); - // http://bugs.jquery.com/ticket/8235 - } catch( e ) {} + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} } - } - _cleanData( elems ); - }; + orig( elems ); + }; + })( $.cleanData ); })(); } @@ -536,7 +541,7 @@ webshims.register('dom-extend', function($, webshims, window, document, undefine return id; }; })(), - domPrefixes: ["ws", "webkit", "moz", "ms", "o"], + domPrefixes: ["webkit", "moz", "ms", "o", "ws"], prefixed: function (prop, obj){ var i, testProp; diff --git a/public/webshims/shims/es5.js b/public/webshims/shims/es5.js index 4d51acf4..31228a70 100644 --- a/public/webshims/shims/es5.js +++ b/public/webshims/shims/es5.js @@ -16,40 +16,147 @@ setTimeout(function(){ // Shortcut to an often accessed properties, in order to avoid multiple // dereference that costs universally. - var call = Function.prototype.call; - var prototypeOfArray = Array.prototype; - var prototypeOfObject = Object.prototype; - var _Array_slice_ = prototypeOfArray.slice; - var array_splice = Array.prototype.splice; - var array_push = Array.prototype.push; - var array_unshift = Array.prototype.unshift; + var ArrayPrototype = Array.prototype; + var ObjectPrototype = Object.prototype; + var FunctionPrototype = Function.prototype; + var StringPrototype = String.prototype; + var NumberPrototype = Number.prototype; + var array_slice = ArrayPrototype.slice; + var array_splice = ArrayPrototype.splice; + var array_push = ArrayPrototype.push; + var array_unshift = ArrayPrototype.unshift; + var call = FunctionPrototype.call; // Having a toString local variable name breaks in Opera so use _toString. - var _toString = prototypeOfObject.toString; + var _toString = ObjectPrototype.toString; var isFunction = function (val) { - return prototypeOfObject.toString.call(val) === '[object Function]'; + return ObjectPrototype.toString.call(val) === '[object Function]'; }; var isRegex = function (val) { - return prototypeOfObject.toString.call(val) === '[object RegExp]'; + return ObjectPrototype.toString.call(val) === '[object RegExp]'; }; var isArray = function isArray(obj) { return _toString.call(obj) === "[object Array]"; }; + var isString = function isString(obj) { + return _toString.call(obj) === "[object String]"; + }; var isArguments = function isArguments(value) { var str = _toString.call(value); var isArgs = str === '[object Arguments]'; if (!isArgs) { - isArgs = !isArray(str) - && value !== null - && typeof value === 'object' - && typeof value.length === 'number' - && value.length >= 0 - && isFunction(value.callee); + isArgs = !isArray(value) + && value !== null + && typeof value === 'object' + && typeof value.length === 'number' + && value.length >= 0 + && isFunction(value.callee); } return isArgs; }; + var supportsDescriptors = Object.defineProperty && (function () { + try { + Object.defineProperty({}, 'x', {}); + return true; + } catch (e) { /* this is ES3 */ + return false; + } + }()); + +// Define configurable, writable and non-enumerable props +// if they don't exist. + var defineProperty; + if (supportsDescriptors) { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + Object.defineProperty(object, name, { + configurable: true, + enumerable: false, + writable: true, + value: method + }); + }; + } else { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + object[name] = method; + }; + } + var defineProperties = function (object, map, forceAssign) { + for (var name in map) { + if (ObjectPrototype.hasOwnProperty.call(map, name)) { + defineProperty(object, name, map[name], forceAssign); + } + } + }; + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer + + function toInteger(n) { + n = +n; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; + } + + function isPrimitive(input) { + var type = typeof input; + return ( + input === null || + type === "undefined" || + type === "boolean" || + type === "number" || + type === "string" + ); + } + + function toPrimitive(input) { + var val, valueOf, toStr; + if (isPrimitive(input)) { + return input; + } + valueOf = input.valueOf; + if (isFunction(valueOf)) { + val = valueOf.call(input); + if (isPrimitive(val)) { + return val; + } + } + toStr = input.toString; + if (isFunction(toStr)) { + val = toStr.call(input); + if (isPrimitive(val)) { + return val; + } + } + throw new TypeError(); + } + +// ES5 9.9 +// http://es5.github.com/#x9.9 + var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert " + o + " to object"); + } + return Object(o); + }; + + var ToUint32 = function ToUint32(x) { + return x >>> 0; + }; + // // Function // ======== @@ -60,8 +167,8 @@ setTimeout(function(){ function Empty() {} - if (!Function.prototype.bind) { - Function.prototype.bind = function bind(that) { // .length is 1 + defineProperties(FunctionPrototype, { + bind: function bind(that) { // .length is 1 // 1. Let Target be the this value. var target = this; // 2. If IsCallable(Target) is false, throw a TypeError exception. @@ -69,18 +176,18 @@ setTimeout(function(){ throw new TypeError("Function.prototype.bind called on incompatible " + target); } // 3. Let A be a new (possibly empty) internal list of all of the - // argument values provided after thisArg (arg1, arg2 etc), in order. + // argument values provided after thisArg (arg1, arg2 etc), in order. // XXX slicedArgs will stand in for "A" if used - var args = _Array_slice_.call(arguments, 1); // for normal call + var args = array_slice.call(arguments, 1); // for normal call // 4. Let F be a new native ECMAScript object. // 11. Set the [[Prototype]] internal property of F to the standard - // built-in Function prototype object as specified in 15.3.3.1. + // built-in Function prototype object as specified in 15.3.3.1. // 12. Set the [[Call]] internal property of F as described in - // 15.3.4.5.1. + // 15.3.4.5.1. // 13. Set the [[Construct]] internal property of F as described in - // 15.3.4.5.2. + // 15.3.4.5.2. // 14. Set the [[HasInstance]] internal property of F as described in - // 15.3.4.5.3. + // 15.3.4.5.3. var binder = function () { if (this instanceof bound) { @@ -89,20 +196,20 @@ setTimeout(function(){ // F that was created using the bind function is called with a // list of arguments ExtraArgs, the following steps are taken: // 1. Let target be the value of F's [[TargetFunction]] - // internal property. + // internal property. // 2. If target has no [[Construct]] internal method, a - // TypeError exception is thrown. + // TypeError exception is thrown. // 3. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. + // property. // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. // 5. Return the result of calling the [[Construct]] internal - // method of target providing args as the arguments. + // method of target providing args as the arguments. var result = target.apply( this, - args.concat(_Array_slice_.call(arguments)) + args.concat(array_slice.call(arguments)) ); if (Object(result) === result) { return result; @@ -116,22 +223,22 @@ setTimeout(function(){ // this value and a list of arguments ExtraArgs, the following // steps are taken: // 1. Let boundArgs be the value of F's [[BoundArgs]] internal - // property. + // property. // 2. Let boundThis be the value of F's [[BoundThis]] internal - // property. + // property. // 3. Let target be the value of F's [[TargetFunction]] internal - // property. + // property. // 4. Let args be a new list containing the same values as the - // list boundArgs in the same order followed by the same - // values as the list ExtraArgs in the same order. + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. // 5. Return the result of calling the [[Call]] internal method - // of target providing boundThis as the this value and - // providing args as the arguments. + // of target providing boundThis as the this value and + // providing args as the arguments. // equiv: target.call(this, ...boundArgs, ...args) return target.apply( that, - args.concat(_Array_slice_.call(arguments)) + args.concat(array_slice.call(arguments)) ); } @@ -139,15 +246,15 @@ setTimeout(function(){ }; // 15. If the [[Class]] internal property of Target is "Function", then - // a. Let L be the length property of Target minus the length of A. - // b. Set the length own property of F to either 0 or L, whichever is - // larger. + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. // 16. Else set the length own property of F to 0. var boundLength = Math.max(0, target.length - args.length); // 17. Set the attributes of the length own property of F to the values - // specified in 15.3.5.1. + // specified in 15.3.5.1. var boundArgs = []; for (var i = 0; i < boundLength; i++) { boundArgs.push("$" + i); @@ -174,13 +281,13 @@ setTimeout(function(){ // TODO // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). // 20. Call the [[DefineOwnProperty]] internal method of F with - // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: - // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and - // false. + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. // 21. Call the [[DefineOwnProperty]] internal method of F with - // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, - // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, - // and false. + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. // TODO // NOTE Function objects created using Function.prototype.bind do not @@ -190,12 +297,12 @@ setTimeout(function(){ // 22. Return F. return bound; - }; - } + } + }); // _Please note: Shortcuts are defined after `Function.prototype.bind` as we // us it in defining shortcuts. - var owns = call.bind(prototypeOfObject.hasOwnProperty); + var owns = call.bind(ObjectPrototype.hasOwnProperty); // If JS engine supports accessors creating shortcuts. var defineGetter; @@ -203,11 +310,11 @@ setTimeout(function(){ var lookupGetter; var lookupSetter; var supportsAccessors; - if ((supportsAccessors = owns(prototypeOfObject, "__defineGetter__"))) { - defineGetter = call.bind(prototypeOfObject.__defineGetter__); - defineSetter = call.bind(prototypeOfObject.__defineSetter__); - lookupGetter = call.bind(prototypeOfObject.__lookupGetter__); - lookupSetter = call.bind(prototypeOfObject.__lookupSetter__); + if ((supportsAccessors = owns(ObjectPrototype, "__defineGetter__"))) { + defineGetter = call.bind(ObjectPrototype.__defineGetter__); + defineSetter = call.bind(ObjectPrototype.__defineSetter__); + lookupGetter = call.bind(ObjectPrototype.__lookupGetter__); + lookupSetter = call.bind(ObjectPrototype.__lookupSetter__); } // @@ -217,63 +324,68 @@ setTimeout(function(){ // ES5 15.4.4.12 // http://es5.github.com/#x15.4.4.12 - var spliceWorksWithEmptyObject = (function () { - var obj = {}; - Array.prototype.splice.call(obj, 0, 0, 1); - return obj.length === 1; - }()); - var omittingSecondSpliceArgIsNoop = [1].splice(0).length === 0; var spliceNoopReturnsEmptyArray = (function () { var a = [1, 2]; var result = a.splice(); return a.length === 2 && isArray(result) && result.length === 0; }()); - if (spliceNoopReturnsEmptyArray) { - // Safari 5.0 bug where .split() returns undefined - Array.prototype.splice = function splice(start, deleteCount) { - if (arguments.length === 0) { return []; } - else { return array_splice.apply(this, arguments); } - }; - } - if (!omittingSecondSpliceArgIsNoop || !spliceWorksWithEmptyObject) { - Array.prototype.splice = function splice(start, deleteCount) { + defineProperties(ArrayPrototype, { + // Safari 5.0 bug where .splice() returns undefined + splice: function splice(start, deleteCount) { + if (arguments.length === 0) { + return []; + } else { + return array_splice.apply(this, arguments); + } + } + }, spliceNoopReturnsEmptyArray); + + var spliceWorksWithEmptyObject = (function () { + var obj = {}; + ArrayPrototype.splice.call(obj, 0, 0, 1); + return obj.length === 1; + }()); + defineProperties(ArrayPrototype, { + splice: function splice(start, deleteCount) { if (arguments.length === 0) { return []; } var args = arguments; this.length = Math.max(toInteger(this.length), 0); if (arguments.length > 0 && typeof deleteCount !== 'number') { - args = _Array_slice_.call(arguments); - if (args.length < 2) { args.push(toInteger(deleteCount)); } - else { args[1] = toInteger(deleteCount); } + args = array_slice.call(arguments); + if (args.length < 2) { + args.push(this.length - start); + } else { + args[1] = toInteger(deleteCount); + } } return array_splice.apply(this, args); - }; - } + } + }, !spliceWorksWithEmptyObject); // ES5 15.4.4.12 // http://es5.github.com/#x15.4.4.13 // Return len+argCount. // [bugfix, ielt8] // IE < 8 bug: [].unshift(0) === undefined but should be "1" - if ([].unshift(0) !== 1) { - Array.prototype.unshift = function () { + var hasUnshiftReturnValueBug = [].unshift(0) !== 1; + defineProperties(ArrayPrototype, { + unshift: function () { array_unshift.apply(this, arguments); return this.length; - }; - } + } + }, hasUnshiftReturnValueBug); // ES5 15.4.3.2 // http://es5.github.com/#x15.4.3.2 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray - if (!Array.isArray) { - Array.isArray = isArray; - } + defineProperties(Array, { isArray: isArray }); // The IsCallable() check in the Array functions // has been replaced with a strict check on the // internal class of the object to trap cases where // the provided function was actually a regular // expression literal, which in V8 and -// JavaScriptCore is a typeof "function". Only in +// JavaScriptCore is a typeof "function". Only in // V8 are regular expression literals permitted as // reduce parameters, so it is desirable in the // general case for the shim to match the more @@ -306,12 +418,10 @@ setTimeout(function(){ return !!method && properlyBoxesNonStrict && properlyBoxesStrict; }; - if (!Array.prototype.forEach || !properlyBoxesContext(Array.prototype.forEach)) { - Array.prototype.forEach = function forEach(fun /*, thisp*/) { + defineProperties(ArrayPrototype, { + forEach: function forEach(fun /*, thisp*/) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, thisp = arguments[1], i = -1, length = self.length >>> 0; @@ -329,18 +439,16 @@ setTimeout(function(){ fun.call(thisp, self[i], i, object); } } - }; - } + } + }, !properlyBoxesContext(ArrayPrototype.forEach)); // ES5 15.4.4.19 // http://es5.github.com/#x15.4.4.19 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map - if (!Array.prototype.map || !properlyBoxesContext(Array.prototype.map)) { - Array.prototype.map = function map(fun /*, thisp*/) { + defineProperties(ArrayPrototype, { + map: function map(fun /*, thisp*/) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0, result = Array(length), thisp = arguments[1]; @@ -356,18 +464,16 @@ setTimeout(function(){ } } return result; - }; - } + } + }, !properlyBoxesContext(ArrayPrototype.map)); // ES5 15.4.4.20 // http://es5.github.com/#x15.4.4.20 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter - if (!Array.prototype.filter || !properlyBoxesContext(Array.prototype.filter)) { - Array.prototype.filter = function filter(fun /*, thisp */) { + defineProperties(ArrayPrototype, { + filter: function filter(fun /*, thisp */) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0, result = [], value, @@ -387,18 +493,16 @@ setTimeout(function(){ } } return result; - }; - } + } + }, !properlyBoxesContext(ArrayPrototype.filter)); // ES5 15.4.4.16 // http://es5.github.com/#x15.4.4.16 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every - if (!Array.prototype.every || !properlyBoxesContext(Array.prototype.every)) { - Array.prototype.every = function every(fun /*, thisp */) { + defineProperties(ArrayPrototype, { + every: function every(fun /*, thisp */) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0, thisp = arguments[1]; @@ -413,18 +517,16 @@ setTimeout(function(){ } } return true; - }; - } + } + }, !properlyBoxesContext(ArrayPrototype.every)); // ES5 15.4.4.17 // http://es5.github.com/#x15.4.4.17 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some - if (!Array.prototype.some || !properlyBoxesContext(Array.prototype.some)) { - Array.prototype.some = function some(fun /*, thisp */) { + defineProperties(ArrayPrototype, { + some: function some(fun /*, thisp */) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0, thisp = arguments[1]; @@ -439,22 +541,20 @@ setTimeout(function(){ } } return false; - }; - } + } + }, !properlyBoxesContext(ArrayPrototype.some)); // ES5 15.4.4.21 // http://es5.github.com/#x15.4.4.21 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce var reduceCoercesToObject = false; - if (Array.prototype.reduce) { - reduceCoercesToObject = typeof Array.prototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object'; + if (ArrayPrototype.reduce) { + reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) { return list; }) === 'object'; } - if (!Array.prototype.reduce || !reduceCoercesToObject) { - Array.prototype.reduce = function reduce(fun /*, initial*/) { + defineProperties(ArrayPrototype, { + reduce: function reduce(fun /*, initial*/) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0; // If no callback function or if callback is not a callable function @@ -492,22 +592,20 @@ setTimeout(function(){ } return result; - }; - } + } + }, !reduceCoercesToObject); // ES5 15.4.4.22 // http://es5.github.com/#x15.4.4.22 // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight var reduceRightCoercesToObject = false; - if (Array.prototype.reduceRight) { - reduceRightCoercesToObject = typeof Array.prototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object'; + if (ArrayPrototype.reduceRight) { + reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) { return list; }) === 'object'; } - if (!Array.prototype.reduceRight || !reduceRightCoercesToObject) { - Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) { + defineProperties(ArrayPrototype, { + reduceRight: function reduceRight(fun /*, initial*/) { var object = toObject(this), - self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - object, + self = splitString && isString(this) ? this.split('') : object, length = self.length >>> 0; // If no callback function or if callback is not a callable function @@ -548,17 +646,16 @@ setTimeout(function(){ } while (i--); return result; - }; - } + } + }, !reduceRightCoercesToObject); // ES5 15.4.4.14 // http://es5.github.com/#x15.4.4.14 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf - if (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) !== -1)) { - Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) { - var self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - toObject(this), + var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1; + defineProperties(ArrayPrototype, { + indexOf: function indexOf(sought /*, fromIndex */ ) { + var self = splitString && isString(this) ? this.split('') : toObject(this), length = self.length >>> 0; if (!length) { @@ -578,17 +675,16 @@ setTimeout(function(){ } } return -1; - }; - } + } + }, hasFirefox2IndexOfBug); // ES5 15.4.4.15 // http://es5.github.com/#x15.4.4.15 // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf - if (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) !== -1)) { - Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) { - var self = splitString && _toString.call(this) === "[object String]" ? - this.split("") : - toObject(this), + var hasFirefox2LastIndexOfBug = Array.prototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1; + defineProperties(ArrayPrototype, { + lastIndexOf: function lastIndexOf(sought /*, fromIndex */) { + var self = splitString && isString(this) ? this.split('') : toObject(this), length = self.length >>> 0; if (!length) { @@ -606,8 +702,8 @@ setTimeout(function(){ } } return -1; - }; - } + } + }, hasFirefox2LastIndexOfBug); // // Object @@ -616,29 +712,27 @@ setTimeout(function(){ // ES5 15.2.3.14 // http://es5.github.com/#x15.2.3.14 - var keysWorksWithArguments = Object.keys && (function () { - return Object.keys(arguments).length === 2; - }(1, 2)); - if (!Object.keys) { - // http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation - var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'), - hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'), - dontEnums = [ - "toString", - "toLocaleString", - "valueOf", - "hasOwnProperty", - "isPrototypeOf", - "propertyIsEnumerable", - "constructor" - ], - dontEnumsLength = dontEnums.length; - Object.keys = function keys(object) { +// http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation + var hasDontEnumBug = !({'toString': null}).propertyIsEnumerable('toString'), + hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'), + dontEnums = [ + "toString", + "toLocaleString", + "valueOf", + "hasOwnProperty", + "isPrototypeOf", + "propertyIsEnumerable", + "constructor" + ], + dontEnumsLength = dontEnums.length; + + defineProperties(Object, { + keys: function keys(object) { var isFn = isFunction(object), isArgs = isArguments(object), isObject = object !== null && typeof object === 'object', - isString = isObject && _toString.call(object) === '[object String]'; + isStr = isObject && isString(object); if (!isObject && !isFn && !isArgs) { throw new TypeError("Object.keys called on a non-object"); @@ -646,7 +740,7 @@ setTimeout(function(){ var theKeys = []; var skipProto = hasProtoEnumBug && isFn; - if (isString || isArgs) { + if (isStr || isArgs) { for (var i = 0; i < object.length; ++i) { theKeys.push(String(i)); } @@ -669,18 +763,23 @@ setTimeout(function(){ } } return theKeys; - }; - } else if (!keysWorksWithArguments) { - // Safari 5.0 bug - var originalKeys = Object.keys; - Object.keys = function keys(object) { + } + }); + + var keysWorksWithArguments = Object.keys && (function () { + // Safari 5.0 bug + return Object.keys(arguments).length === 2; + }(1, 2)); + var originalKeys = Object.keys; + defineProperties(Object, { + keys: function keys(object) { if (isArguments(object)) { - return originalKeys(Array.prototype.slice.call(object)); + return originalKeys(ArrayPrototype.slice.call(object)); } else { return originalKeys(object); } - }; - } + } + }, !keysWorksWithArguments); // // Date @@ -694,13 +793,12 @@ setTimeout(function(){ // string format defined in 15.9.1.15. All fields are present in the String. // The time zone is always UTC, denoted by the suffix Z. If the time value of // this object is not a finite Number a RangeError exception is thrown. - var negativeDate = -62198755200000, - negativeYearString = "-000001"; - if ( - !Date.prototype.toISOString || - (new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1) - ) { - Date.prototype.toISOString = function toISOString() { + var negativeDate = -62198755200000; + var negativeYearString = "-000001"; + var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; + + defineProperties(Date.prototype, { + toISOString: function toISOString() { var result, length, value, year, month; if (!isFinite(this)) { throw new RangeError("Date.prototype.toISOString called on non-finite value."); @@ -716,9 +814,9 @@ setTimeout(function(){ // the date time string format is specified in 15.9.1.15. result = [month + 1, this.getUTCDate(), this.getUTCHours(), this.getUTCMinutes(), this.getUTCSeconds()]; year = ( - (year < 0 ? "-" : (year > 9999 ? "+" : "")) + - ("00000" + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6) - ); + (year < 0 ? "-" : (year > 9999 ? "+" : "")) + + ("00000" + Math.abs(year)).slice(0 <= year && year <= 9999 ? -4 : -6) + ); length = result.length; while (length--) { @@ -731,12 +829,12 @@ setTimeout(function(){ } // pad milliseconds to have three digits. return ( - year + "-" + result.slice(0, 2).join("-") + - "T" + result.slice(2).join(":") + "." + - ("000" + this.getUTCMilliseconds()).slice(-3) + "Z" - ); - }; - } + year + "-" + result.slice(0, 2).join("-") + + "T" + result.slice(2).join(":") + "." + + ("000" + this.getUTCMilliseconds()).slice(-3) + "Z" + ); + } + }, hasNegativeDateBug); // ES5 15.9.5.44 @@ -746,15 +844,15 @@ setTimeout(function(){ var dateToJSONIsSupported = false; try { dateToJSONIsSupported = ( - Date.prototype.toJSON && - new Date(NaN).toJSON() === null && - new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && - Date.prototype.toJSON.call({ // generic - toISOString: function () { - return true; - } - }) - ); + Date.prototype.toJSON && + new Date(NaN).toJSON() === null && + new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1 && + Date.prototype.toJSON.call({ // generic + toISOString: function () { + return true; + } + }) + ); } catch (e) { } if (!dateToJSONIsSupported) { @@ -762,7 +860,7 @@ setTimeout(function(){ // When the toJSON method is called with argument key, the following // steps are taken: - // 1. Let O be the result of calling ToObject, giving it the this + // 1. Let O be the result of calling ToObject, giving it the this // value as its argument. // 2. Let tv be toPrimitive(O, hint Number). var o = Object(this), @@ -780,7 +878,7 @@ setTimeout(function(){ throw new TypeError("toISOString property is not callable"); } // 6. Return the result of calling the [[Call]] internal method of - // toISO with O as the this value and an empty argument list. + // toISO with O as the this value and an empty argument list. return toISO.call(o); // NOTE 1 The argument is ignored. @@ -832,26 +930,26 @@ setTimeout(function(){ // 15.9.1.15 Date Time String Format. var isoDateExpression = new RegExp("^" + - "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + - // 6-digit extended year - "(?:-(\\d{2})" + // optional month capture - "(?:-(\\d{2})" + // optional day capture - "(?:" + // capture hours:minutes:seconds.milliseconds - "T(\\d{2})" + // hours capture - ":(\\d{2})" + // minutes capture - "(?:" + // optional :seconds.milliseconds - ":(\\d{2})" + // seconds capture - "(?:(\\.\\d{1,}))?" + // milliseconds capture - ")?" + - "(" + // capture UTC offset component - "Z|" + // UTC capture - "(?:" + // offset specifier +/-hours:minutes - "([-+])" + // sign capture - "(\\d{2})" + // hours offset capture - ":(\\d{2})" + // minutes offset capture - ")" + - ")?)?)?)?" + - "$"); + "(\\d{4}|[\+\-]\\d{6})" + // four-digit year capture or sign + + // 6-digit extended year + "(?:-(\\d{2})" + // optional month capture + "(?:-(\\d{2})" + // optional day capture + "(?:" + // capture hours:minutes:seconds.milliseconds + "T(\\d{2})" + // hours capture + ":(\\d{2})" + // minutes capture + "(?:" + // optional :seconds.milliseconds + ":(\\d{2})" + // seconds capture + "(?:(\\.\\d{1,}))?" + // milliseconds capture + ")?" + + "(" + // capture UTC offset component + "Z|" + // UTC capture + "(?:" + // offset specifier +/-hours:minutes + "([-+])" + // sign capture + "(\\d{2})" + // hours offset capture + ":(\\d{2})" + // minutes offset capture + ")" + + ")?)?)?)?" + + "$"); var months = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 @@ -860,12 +958,12 @@ setTimeout(function(){ function dayFromMonth(year, month) { var t = month > 1 ? 1 : 0; return ( - months[month] + - Math.floor((year - 1969 + t) / 4) - - Math.floor((year - 1901 + t) / 100) + - Math.floor((year - 1601 + t) / 400) + - 365 * (year - 1970) - ); + months[month] + + Math.floor((year - 1969 + t) / 4) - + Math.floor((year - 1901 + t) / 100) + + Math.floor((year - 1601 + t) / 400) + + 365 * (year - 1970) + ); } function toUTC(t) { @@ -909,25 +1007,25 @@ setTimeout(function(){ hour < ( minute > 0 || second > 0 || millisecond > 0 ? 24 : 25 - ) && - minute < 60 && second < 60 && millisecond < 1000 && - month > -1 && month < 12 && hourOffset < 24 && - minuteOffset < 60 && // detect invalid offsets - day > -1 && - day < ( - dayFromMonth(year, month + 1) - - dayFromMonth(year, month) - ) - ) { + ) && + minute < 60 && second < 60 && millisecond < 1000 && + month > -1 && month < 12 && hourOffset < 24 && + minuteOffset < 60 && // detect invalid offsets + day > -1 && + day < ( + dayFromMonth(year, month + 1) - + dayFromMonth(year, month) + ) + ) { result = ( - (dayFromMonth(year, month) + day) * 24 + - hour + - hourOffset * signOffset - ) * 60; + (dayFromMonth(year, month) + day) * 24 + + hour + + hourOffset * signOffset + ) * 60; result = ( - (result + minute + minuteOffset * signOffset) * 60 + - second - ) * 1000 + millisecond; + (result + minute + minuteOffset * signOffset) * 60 + + second + ) * 1000 + millisecond; if (isLocalTime) { result = toUTC(result); } @@ -960,152 +1058,151 @@ setTimeout(function(){ // ES5.1 15.7.4.5 // http://es5.github.com/#x15.7.4.5 - if (!Number.prototype.toFixed || (0.00008).toFixed(3) !== '0.000' || (0.9).toFixed(0) === '0' || (1.255).toFixed(2) !== '1.25' || (1000000000000000128).toFixed(0) !== "1000000000000000128") { - // Hide these variables and functions - (function () { - var base, size, data, i; + var hasToFixedBugs = NumberPrototype.toFixed && ( + (0.00008).toFixed(3) !== '0.000' + || (0.9).toFixed(0) !== '1' + || (1.255).toFixed(2) !== '1.25' + || (1000000000000000128).toFixed(0) !== "1000000000000000128" + ); - base = 1e7; - size = 6; - data = [0, 0, 0, 0, 0, 0]; - - function multiply(n, c) { - var i = -1; - while (++i < size) { - c += n * data[i]; - data[i] = c % base; - c = Math.floor(c / base); - } + var toFixedHelpers = { + base: 1e7, + size: 6, + data: [0, 0, 0, 0, 0, 0], + multiply: function multiply(n, c) { + var i = -1; + while (++i < toFixedHelpers.size) { + c += n * toFixedHelpers.data[i]; + toFixedHelpers.data[i] = c % toFixedHelpers.base; + c = Math.floor(c / toFixedHelpers.base); } - - function divide(n) { - var i = size, c = 0; - while (--i >= 0) { - c += data[i]; - data[i] = Math.floor(c / n); - c = (c % n) * base; - } + }, + divide: function divide(n) { + var i = toFixedHelpers.size, c = 0; + while (--i >= 0) { + c += toFixedHelpers.data[i]; + toFixedHelpers.data[i] = Math.floor(c / n); + c = (c % n) * toFixedHelpers.base; } - - function numToString() { - var i = size; - var s = ''; - while (--i >= 0) { - if (s !== '' || i === 0 || data[i] !== 0) { - var t = String(data[i]); - if (s === '') { - s = t; - } else { - s += '0000000'.slice(0, 7 - t.length) + t; - } - } - } - return s; - } - - function pow(x, n, acc) { - return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); - } - - function log(x) { - var n = 0; - while (x >= 4096) { - n += 12; - x /= 4096; - } - while (x >= 2) { - n += 1; - x /= 2; - } - return n; - } - - Number.prototype.toFixed = function toFixed(fractionDigits) { - var f, x, s, m, e, z, j, k; - - // Test for NaN and round fractionDigits down - f = Number(fractionDigits); - f = f !== f ? 0 : Math.floor(f); - - if (f < 0 || f > 20) { - throw new RangeError("Number.toFixed called with invalid number of decimals"); - } - - x = Number(this); - - // Test for NaN - if (x !== x) { - return "NaN"; - } - - // If it is too big or small, return the string value of the number - if (x <= -1e21 || x >= 1e21) { - return String(x); - } - - s = ""; - - if (x < 0) { - s = "-"; - x = -x; - } - - m = "0"; - - if (x > 1e-21) { - // 1e-21 < x < 1e21 - // -70 < log2(x) < 70 - e = log(x * pow(2, 69, 1)) - 69; - z = (e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1)); - z *= 0x10000000000000; // Math.pow(2, 52); - e = 52 - e; - - // -18 < e < 122 - // x = z / 2 ^ e - if (e > 0) { - multiply(0, z); - j = f; - - while (j >= 7) { - multiply(1e7, 0); - j -= 7; - } - - multiply(pow(10, j, 1), 0); - j = e - 1; - - while (j >= 23) { - divide(1 << 23); - j -= 23; - } - - divide(1 << j); - multiply(1, 1); - divide(2); - m = numToString(); + }, + numToString: function numToString() { + var i = toFixedHelpers.size; + var s = ''; + while (--i >= 0) { + if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) { + var t = String(toFixedHelpers.data[i]); + if (s === '') { + s = t; } else { - multiply(0, z); - multiply(1 << (-e), 0); - m = numToString() + '0.00000000000000000000'.slice(2, 2 + f); + s += '0000000'.slice(0, 7 - t.length) + t; } } + } + return s; + }, + pow: function pow(x, n, acc) { + return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc))); + }, + log: function log(x) { + var n = 0; + while (x >= 4096) { + n += 12; + x /= 4096; + } + while (x >= 2) { + n += 1; + x /= 2; + } + return n; + } + }; - if (f > 0) { - k = m.length; + defineProperties(NumberPrototype, { + toFixed: function toFixed(fractionDigits) { + var f, x, s, m, e, z, j, k; - if (k <= f) { - m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m; - } else { - m = s + m.slice(0, k - f) + '.' + m.slice(k - f); + // Test for NaN and round fractionDigits down + f = Number(fractionDigits); + f = f !== f ? 0 : Math.floor(f); + + if (f < 0 || f > 20) { + throw new RangeError("Number.toFixed called with invalid number of decimals"); + } + + x = Number(this); + + // Test for NaN + if (x !== x) { + return "NaN"; + } + + // If it is too big or small, return the string value of the number + if (x <= -1e21 || x >= 1e21) { + return String(x); + } + + s = ""; + + if (x < 0) { + s = "-"; + x = -x; + } + + m = "0"; + + if (x > 1e-21) { + // 1e-21 < x < 1e21 + // -70 < log2(x) < 70 + e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69; + z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1)); + z *= 0x10000000000000; // Math.pow(2, 52); + e = 52 - e; + + // -18 < e < 122 + // x = z / 2 ^ e + if (e > 0) { + toFixedHelpers.multiply(0, z); + j = f; + + while (j >= 7) { + toFixedHelpers.multiply(1e7, 0); + j -= 7; } + + toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0); + j = e - 1; + + while (j >= 23) { + toFixedHelpers.divide(1 << 23); + j -= 23; + } + + toFixedHelpers.divide(1 << j); + toFixedHelpers.multiply(1, 1); + toFixedHelpers.divide(2); + m = toFixedHelpers.numToString(); } else { - m = s + m; + toFixedHelpers.multiply(0, z); + toFixedHelpers.multiply(1 << (-e), 0); + m = toFixedHelpers.numToString() + '0.00000000000000000000'.slice(2, 2 + f); } + } - return m; - }; - }()); - } + if (f > 0) { + k = m.length; + + if (k <= f) { + m = s + '0.0000000000000000000'.slice(0, f - k + 2) + m; + } else { + m = s + m.slice(0, k - f) + '.' + m.slice(k - f); + } + } else { + m = s + m; + } + + return m; + } + }, hasToFixedBugs); // @@ -1121,26 +1218,26 @@ setTimeout(function(){ // do not perform the split correctly under obscure conditions. // See http://blog.stevenlevithan.com/archives/cross-browser-split // I've tested in many browsers and this seems to cover the deviant ones: -// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] -// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] -// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not -// [undefined, "t", undefined, "e", ...] -// ''.split(/.?/) should be [], not [""] -// '.'.split(/()()/) should be ["."], not ["", "", "."] +// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] +// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] +// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not +// [undefined, "t", undefined, "e", ...] +// ''.split(/.?/) should be [], not [""] +// '.'.split(/()()/) should be ["."], not ["", "", "."] - var string_split = String.prototype.split; + var string_split = StringPrototype.split; if ( 'ab'.split(/(?:ab)*/).length !== 2 || - '.'.split(/(.?)(.?)/).length !== 4 || - 'tesst'.split(/(s)*/)[1] === "t" || - 'test'.split(/(?:)/, -1).length !== 4 || - ''.split(/.?/).length || - '.'.split(/()()/).length > 1 - ) { + '.'.split(/(.?)(.?)/).length !== 4 || + 'tesst'.split(/(s)*/)[1] === "t" || + 'test'.split(/(?:)/, -1).length !== 4 || + ''.split(/.?/).length || + '.'.split(/()()/).length > 1 + ) { (function () { var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group - String.prototype.split = function (separator, limit) { + StringPrototype.split = function (separator, limit) { var string = this; if (separator === void 0 && limit === 0) { return []; @@ -1153,9 +1250,9 @@ setTimeout(function(){ var output = [], flags = (separator.ignoreCase ? "i" : "") + - (separator.multiline ? "m" : "") + - (separator.extended ? "x" : "") + // Proposed for ES6 - (separator.sticky ? "y" : ""), // Firefox 3+ + (separator.multiline ? "m" : "") + + (separator.extended ? "x" : "") + // Proposed for ES6 + (separator.sticky ? "y" : ""), // Firefox 3+ lastLastIndex = 0, // Make `global` and avoid `lastIndex` issues by working with a copy separator2, match, lastIndex, lastLength; @@ -1173,7 +1270,7 @@ setTimeout(function(){ * If other: Type-convert, then use the above rules */ limit = limit === void 0 ? - -1 >>> 0 : // Math.pow(2, 32) - 1 + -1 >>> 0 : // Math.pow(2, 32) - 1 ToUint32(limit); while (match = separator.exec(string)) { // `separator.lastIndex` is not reliable cross-browser @@ -1192,7 +1289,7 @@ setTimeout(function(){ }); } if (match.length > 1 && match.index < string.length) { - Array.prototype.push.apply(output, match.slice(1)); + ArrayPrototype.push.apply(output, match.slice(1)); } lastLength = match[0].length; lastLastIndex = lastIndex; @@ -1222,13 +1319,13 @@ setTimeout(function(){ // elements. // "0".split(undefined, 0) -> [] } else if ("0".split(void 0, 0).length) { - String.prototype.split = function split(separator, limit) { + StringPrototype.split = function split(separator, limit) { if (separator === void 0 && limit === 0) { return []; } return string_split.call(this, separator, limit); }; } - var str_replace = String.prototype.replace; + var str_replace = StringPrototype.replace; var replaceReportsGroupsCorrectly = (function () { var groups = []; 'x'.replace(/x(.)?/g, function (match, group) { @@ -1238,7 +1335,7 @@ setTimeout(function(){ }()); if (!replaceReportsGroupsCorrectly) { - String.prototype.replace = function replace(searchValue, replaceValue) { + StringPrototype.replace = function replace(searchValue, replaceValue) { var isFn = isFunction(replaceValue); var hasCapturingGroups = isRegex(searchValue) && (/\)[*?]/).test(searchValue.source); if (!isFn || !hasCapturingGroups) { @@ -1263,22 +1360,17 @@ setTimeout(function(){ // non-normative section suggesting uniform semantics and it should be // normalized across all browsers // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE - if ("".substr && "0b".substr(-1) !== "b") { - var string_substr = String.prototype.substr; - /** - * Get the substring of a string - * @param {integer} start where to start the substring - * @param {integer} length how many characters to return - * @return {string} - */ - String.prototype.substr = function substr(start, length) { + var string_substr = StringPrototype.substr; + var hasNegativeSubstrBug = "".substr && "0b".substr(-1) !== "b"; + defineProperties(StringPrototype, { + substr: function substr(start, length) { return string_substr.call( this, start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, length ); - }; - } + } + }, hasNegativeSubstrBug); // ES5 15.5.4.20 // whitespace from: http://es5.github.io/#x15.5.4.20 @@ -1286,21 +1378,20 @@ setTimeout(function(){ "\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028" + "\u2029\uFEFF"; var zeroWidth = '\u200b'; - if (!String.prototype.trim || ws.trim() || !zeroWidth.trim()) { + var wsRegexChars = "[" + ws + "]"; + var trimBeginRegexp = new RegExp("^" + wsRegexChars + wsRegexChars + "*"); + var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + "*$"); + var hasTrimWhitespaceBug = StringPrototype.trim && (ws.trim() || !zeroWidth.trim()); + defineProperties(StringPrototype, { // http://blog.stevenlevithan.com/archives/faster-trim-javascript // http://perfectionkills.com/whitespace-deviations/ - ws = "[" + ws + "]"; - var trimBeginRegexp = new RegExp("^" + ws + ws + "*"), - trimEndRegexp = new RegExp(ws + ws + "*$"); - String.prototype.trim = function trim() { + trim: function trim() { if (this === void 0 || this === null) { throw new TypeError("can't convert " + this + " to object"); } - return String(this) - .replace(trimBeginRegexp, "") - .replace(trimEndRegexp, ""); - }; - } + return String(this).replace(trimBeginRegexp, "").replace(trimEndRegexp, ""); + } + }, hasTrimWhitespaceBug); // ES-5 15.1.2.2 if (parseInt(ws + '08') !== 8 || parseInt(ws + '0x16') !== 22) { @@ -1316,71 +1407,6 @@ setTimeout(function(){ }(parseInt)); } -// -// Util -// ====== -// - -// ES5 9.4 -// http://es5.github.com/#x9.4 -// http://jsperf.com/to-integer - - function toInteger(n) { - n = +n; - if (n !== n) { // isNaN - n = 0; - } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { - n = (n > 0 || -1) * Math.floor(Math.abs(n)); - } - return n; - } - - function isPrimitive(input) { - var type = typeof input; - return ( - input === null || - type === "undefined" || - type === "boolean" || - type === "number" || - type === "string" - ); - } - - function toPrimitive(input) { - var val, valueOf, toStr; - if (isPrimitive(input)) { - return input; - } - valueOf = input.valueOf; - if (isFunction(valueOf)) { - val = valueOf.call(input); - if (isPrimitive(val)) { - return val; - } - } - toStr = input.toString; - if (isFunction(toStr)) { - val = toStr.call(input); - if (isPrimitive(val)) { - return val; - } - } - throw new TypeError(); - } - -// ES5 9.9 -// http://es5.github.com/#x9.9 - var toObject = function (o) { - if (o == null) { // this matches both null and undefined - throw new TypeError("can't convert " + o + " to object"); - } - return Object(o); - }; - - var ToUint32 = function ToUint32(x) { - return x >>> 0; - }; - })(); diff --git a/public/webshims/shims/filereader-xhr.js b/public/webshims/shims/filereader-xhr.js index b2f7f2d2..27f54f44 100644 --- a/public/webshims/shims/filereader-xhr.js +++ b/public/webshims/shims/filereader-xhr.js @@ -380,22 +380,19 @@ webshim.register('filereader-xhr', function($, webshim, window, document, undefi qualitiy = 0.8; } loadMoxie(); - setTimeout(function(){ + webshim.ready('moxie', function(){ + var img = new mOxie.Image(); dataURL = $canvas.callProp('getAsDataURL', [type, qualitiy]); - webshim.ready('moxie', function(){ - var img = new mOxie.Image(); - - img.onload = function() { - var blob = img.getAsBlob(); - webshim.defineProperty(blob, '_wsDataURL', { - value: dataURL, - enumerable: false - }); - cb(blob); - }; - img.load(dataURL); - }); - }, 9); + img.onload = function() { + var blob = img.getAsBlob(); + webshim.defineProperty(blob, '_wsDataURL', { + value: dataURL, + enumerable: false + }); + cb(blob); + }; + img.load(dataURL); + }); } } }); diff --git a/public/webshims/shims/form-core.js b/public/webshims/shims/form-core.js index 430ae199..dd4063d9 100644 --- a/public/webshims/shims/form-core.js +++ b/public/webshims/shims/form-core.js @@ -256,6 +256,8 @@ webshims.register('form-core', function($, webshims, window, document, undefined } return message || ''; }; + + webshims.refreshCustomValidityRules = $.noop; $.fn.getErrorMessage = function(key){ var message = ''; diff --git a/public/webshims/shims/form-number-date-ui.js b/public/webshims/shims/form-number-date-ui.js index e13363bf..22b78df1 100644 --- a/public/webshims/shims/form-number-date-ui.js +++ b/public/webshims/shims/form-number-date-ui.js @@ -424,9 +424,13 @@ webshims.register('form-number-date-ui', function($, webshims, window, document, }, time: function(val, o, noCorrect){ var fVal, i; + if(val){ val = val.split(':'); + if(val.length != 2 || isNaN(parseInt(val[0] || '', 10)) || isNaN(parseInt(val[1] || '', 10))){ + return val.join(':'); + } if(curCfg.meridian){ fVal = (val[0] * 1); if(fVal && fVal >= 12){ @@ -581,6 +585,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document, createFormat('d'); var tmp, obj; var ret = ''; + if(opts.splitInput){ obj = {yy: 0, mm: 1, dd: 2}; } else { @@ -602,8 +607,7 @@ webshims.register('form-number-date-ui', function($, webshims, window, document, } ret = ([addZero(val[obj.yy]), addZero(val[obj.mm]), addZero(val[obj.dd])]).join('-'); } - return ret - ; + return ret; }, color: function(val, opts){ var ret = '#000000'; @@ -905,9 +909,11 @@ webshims.register('form-number-date-ui', function($, webshims, window, document, }; ['defaultValue', 'value'].forEach(function(name){ + var formatName = 'format'+name; wsWidgetProto[name] = function(val, force){ - if(!this._init || force || val !== this.options[name]){ - this.element.prop(name, this.formatValue(val)); + if(!this._init || force || val !== this.options[name] || this.options[formatName] != this.element.prop(name)){ + this.options[formatName] = this.formatValue(val); + this.element.prop(name, this.options[formatName]); this.options[name] = val; this._propertyChange(name); this.mirrorValidity(); @@ -1031,36 +1037,34 @@ webshims.register('form-number-date-ui', function($, webshims, window, document, var isValue = name == 'value'; spinBtnProto[name] = function(val, force, isLive){ var selectionEnd; - if(!this._init || force || this.options[name] !== val){ - if(isValue){ - this._beforeValue(val); - } else { - this.elemHelper.prop(name, val); - } - - val = formatVal[this.type](val, this.options); - if(this.options.splitInput){ - $.each(this.splits, function(i, elem){ - var setOption; - if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ - $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); - } else { - $.prop(elem, name, val[i]); - } - }); - } else { - val = this.toFixed(val); - if(isLive && this._getSelectionEnd){ - selectionEnd = this._getSelectionEnd(val); - } - this.element.prop(name, val); - if(selectionEnd != null){ - this.element.prop('selectionEnd', selectionEnd); - } - } - this._propertyChange(name); - this.mirrorValidity(); + if(isValue){ + this._beforeValue(val); + } else { + this.elemHelper.prop(name, val); } + + val = formatVal[this.type](val, this.options); + if(this.options.splitInput){ + $.each(this.splits, function(i, elem){ + var setOption; + if(!(name in elem) && !isValue && $.nodeName(elem, 'select')){ + $('option[value="'+ val[i] +'"]', elem).prop('defaultSelected', true); + } else { + $.prop(elem, name, val[i]); + } + }); + } else { + val = this.toFixed(val); + if(isLive && this._getSelectionEnd){ + selectionEnd = this._getSelectionEnd(val); + } + this.element.prop(name, val); + if(selectionEnd != null){ + this.element.prop('selectionEnd', selectionEnd); + } + } + this._propertyChange(name); + this.mirrorValidity(); }; }); diff --git a/public/webshims/shims/form-shim-extend.js b/public/webshims/shims/form-shim-extend.js index b73c4ec8..0b64432e 100644 --- a/public/webshims/shims/form-shim-extend.js +++ b/public/webshims/shims/form-shim-extend.js @@ -607,22 +607,25 @@ if(webshims.support.inputtypes.date && /webkit/i.test(navigator.userAgent)){ webshims.addReady(function(context, contextElem){ //start constrain-validation - var focusElem; + $('form', context) .add(contextElem.filter('form')) .on('invalid', $.noop) ; - - try { - if(context == document && !('form' in (document.activeElement || {}))) { - focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; - if (focusElem && focusElem.offsetHeight && focusElem.offsetWidth) { - focusElem.focus(); + + setTimeout(function(){ + var focusElem; + try { + if(!('form' in (document.activeElement || {}))) { + focusElem = $(context.querySelector('input[autofocus], select[autofocus], textarea[autofocus]')).eq(0).getShadowFocusElement()[0]; + if (focusElem && (focusElem.offsetHeight || focusElem.offsetWidth)) { + focusElem.focus(); + } } } - } - catch (er) {} - + catch (er) {} + }, 9); + }); if(!webshims.support.datalist){ diff --git a/public/webshims/shims/form-validation.js b/public/webshims/shims/form-validation.js index d31ee479..f82b7ece 100644 --- a/public/webshims/shims/form-validation.js +++ b/public/webshims/shims/form-validation.js @@ -117,7 +117,7 @@ webshims.register('form-validation', function($, webshims, window, document, und ){ return; } - if(webshims.refreshCustomValidityRules && webshims.refreshCustomValidityRules(elem) == 'async'){ + if(webshims.refreshCustomValidityRules(elem) == 'async'){ $(elem).one('updatevalidation.webshims', switchValidityClass); return; } @@ -423,7 +423,7 @@ webshims.register('form-validation', function($, webshims, window, document, und if(!appendElement && !invalidParent.test(parent.nodeName)){ appendElement = parent; } - if(appendElement && $.css(parent, 'overflow') == 'hidden' && $.css(parent, 'position') != 'static'){ + if(appendElement && $.css(parent, 'overflow') != 'visible' && $.css(parent, 'position') != 'static'){ appendElement = false; } } diff --git a/public/webshims/shims/form-validators.js b/public/webshims/shims/form-validators.js index 484c0389..f084fa65 100644 --- a/public/webshims/shims/form-validators.js +++ b/public/webshims/shims/form-validators.js @@ -7,10 +7,6 @@ webshims.ready('form-validation', function(){ }); (function(){ - if(webshims.refreshCustomValidityRules){ - webshims.error("form-validators already included. please remove custom-validity.js"); - } - var customValidityRules = {}; var formReady = false; var blockCustom; @@ -341,8 +337,6 @@ webshims.ready('form-validation', function(){ val = $.inArray(val, data.specialVal) !== -1; } if(data.toggle){ val = !val; - } else { - val = !!val; } $.prop( elem, data.prop, val); if(iValClasses && e){ diff --git a/public/webshims/shims/forms-picker.js b/public/webshims/shims/forms-picker.js index 10ca13f6..5af95a2d 100644 --- a/public/webshims/shims/forms-picker.js +++ b/public/webshims/shims/forms-picker.js @@ -1188,12 +1188,12 @@ webshims.register('forms-picker', function($, webshims, window, document, undefi str.push(''+ dateCfg.weekHeader +''); - for(k = dateCfg.firstDay; k < dateCfg.dayNamesShort.length; k++){ - str.push(''+ dateCfg.dayNamesShort[k] +''); + for(k = dateCfg.firstDay; k < dateCfg.dayNamesMin.length; k++){ + str.push(''+ dateCfg.dayNamesMin[k] +''); } k = dateCfg.firstDay; while(k--){ - str.push(''+ dateCfg.dayNamesShort[k] +''); + str.push(''+ dateCfg.dayNamesMin[k] +''); } str.push(''); diff --git a/public/webshims/shims/i18n/formcfg-ca.js b/public/webshims/shims/i18n/formcfg-ca.js new file mode 100644 index 00000000..e9010587 --- /dev/null +++ b/public/webshims/shims/i18n/formcfg-ca.js @@ -0,0 +1,65 @@ +webshims.validityMessages.es = { + "typeMismatch": { + "email": "Si us plau, introduïu una adreça de correu.", + "url": "Si us plau, introduïu un URL." + }, + "badInput": { + "number": "Valor no válid", + "date": "Valor no válid", + "time": "Valor no válid", + "range": "Valor no válid", + "datetime-local": "Valor no válid" + }, + "tooLong": "Valor no válid", + "patternMismatch": "Si us plau, ajusteu-vos al format sol·licitat: {%title}.", + "valueMissing": { + "defaultMessage": "Si us plau, ompliu aquest camp.", + "checkbox": "Si us plau, marqueu aquesta casella si voleu continuar.", + "select": "Si us plau, seleccioneu un element de la llista.", + "radio": "Si us plau, seleccioneu una de les opcions." + }, + "rangeUnderflow": { + "defaultMessage": "El valor ha de superior o igual a {%min}.", + "date": "El valor ha de superior o igual a {%min}.", + "time": "El valor ha de superior o igual a {%min}.", + "datetime-local": "El valor ha de superior o igual a {%min}." + }, + "rangeOverflow": { + "defaultMessage": "El valor ha de inferior o igual a {%max}.", + "date": "El valor ha de inferior o igual a {%max}.", + "time": "El valor ha de inferior o igual a {%max}.", + "datetime-local": "El valor ha de inferior o igual a {%max}." + }, + "stepMismatch": "Valor no válid" +}; +webshims.formcfg.es = { + numberFormat: { + ".": ".", + ",": "," + }, + numberSigns: '.', + dateSigns: '/', + timeSigns: ":. ", + dFormat: "/", + patterns: { + d: 'dd/mm/yy' + }, + date: { + closeText: 'Tanca', + prevText: '<Ant', + nextText: 'Seg>', + currentText: 'Avui', + monthNames: ['gener','gebrer','març','abril','maig','juny', + 'juliol','agost','setembre','octubre','novembre','desembre'], + monthNamesShort: ['gen','febr','març','abr','maig','juny', + 'jul','ag','set','oct','nov','des'], + dayNames: ['diumenge','dilluns','dimarts','dimecres','dijous','divendres','dissabte'], + dayNamesShort: ['dg','dl','dt','dc','dj','dv','ds'], + dayNamesMin: ['dg','dl','dt','dc','dj','dv','ds'], + weekHeader: 'St', + firstDay: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: '' + } +}; diff --git a/public/webshims/shims/i18n/formcfg-ru.js b/public/webshims/shims/i18n/formcfg-ru.js index 8f7dfbac..03dca4e3 100644 --- a/public/webshims/shims/i18n/formcfg-ru.js +++ b/public/webshims/shims/i18n/formcfg-ru.js @@ -44,8 +44,15 @@ webshims.formcfg.ru = { patterns: { d: 'dd.mm.yy' }, + month: { + currentText: 'Текущий месяц' + }, + time: { + currentText: 'Сейчас' + }, date: { closeText: 'Закрыть', + clear: 'Очистить', prevText: '<Пред', nextText: 'След>', currentText: 'Сегодня', @@ -53,7 +60,7 @@ webshims.formcfg.ru = { 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'], monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', 'Июл','Авг','Сен','Окт','Ноя','Дек'], - dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'], + dayNames: ['Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'], dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'], dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'], weekHeader: 'Нед', diff --git a/public/webshims/shims/jme/controls.css b/public/webshims/shims/jme/controls.css index 10ece81e..262d1dcc 100644 --- a/public/webshims/shims/jme/controls.css +++ b/public/webshims/shims/jme/controls.css @@ -103,7 +103,6 @@ 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } @@ -113,7 +112,6 @@ -webkit-transform: rotate(0deg); transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); @@ -468,7 +466,7 @@ .mediaplayer .mediamenu > div > .media-submenu { margin: 0.3125em 0; padding: 0.3125em 0; - border-top: 0.0625em solid #eeeeee; + border-top: 0.0625em solid #eee; border-top: 0.0625em solid rgba(255, 255, 255, 0.4); } .mediaplayer .mediamenu > div > .media-submenu:first-child { diff --git a/public/webshims/shims/jpicker/images/AlphaBar.png b/public/webshims/shims/jpicker/images/AlphaBar.png index 2950daeb877f9e917f841953f29c64266b691fcc..602ede62d61c926b45fb9e9a014486d0c42bec4f 100644 GIT binary patch delta 1616 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 GLK6TTt9?oU diff --git a/public/webshims/shims/jpicker/images/Maps.png b/public/webshims/shims/jpicker/images/Maps.png index 889849bdf8908eb24f6886fc5f9f0fdba3ad0907..3061d1c3b5b0ae2d9f95c92888cc2be350c394fc 100644 GIT binary patch literal 62011 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�`|n^U#QesMRQ-qR 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 diff --git a/public/webshims/shims/jpicker/images/NoColor.png b/public/webshims/shims/jpicker/images/NoColor.png index 5dc47670ef4eae06eec62292e0b1786594428c9b..1b6469f42021e67edb7c89b09032d44325e20d02 100644 GIT binary patch delta 466 zcmV;@0WJQh1nUEkBYy$1NklO)Gq17{+}J3u{Xs!@^gv6L~2~oQ0P{NAgmL zEEG8*4kgY>C=1C+=B3%p%vsD#%}n#MI5^jZjS&Cm{&${**f?E1)7?D3`?~J?X<);j z_5Y`(h2!HmJHy=_Vlg?jq>RVmdDz=yPY;`#A_j&5%i_uk%710Nz2Wl{A0K#sm-Fij zudj-vY2xSzZEc#dETq$%nvy?mZ}Iqumlu$Dent@RnpXQyTc22^fZ7J@(we=3vV z@-hw&(b^g@Y;IU$BYyxHbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBUz z%1J~)RCwB)lFv&5Q4q(!V=F?Di4d6mxMYXWyp$9MAxIQqdhPG?7C|To8mL4ONLZ(95lN6yi%m1DW<-}7mdEbf`ObXi`yRFN=P+~$1`&^QIDZVc8$@6p{+CaA-rvz^ z(8&oh88n-!;jJzBd~|cei3FymU>NxLP^Dy#jNt7J)hgBNyt%2$X49s{{C+Gi|#tESK4C z*XgCuH<{7TmM~4+-qPVAizV?mdA&S2DR^kNd3RUw27h7AW4VFrYdSb!rxTF~mX<_- zP>44+aDPwx`)IYSblaeh&|h3oKCcWSn4gCr35-yM!-7Yp5~Wf+I?AR=eNCmJrY$U} zr&9h$Y;W`ItX7nRYBc(ND4P}Id36<~($M-ZV}!>vwVNDWt)_ebxYwTo3;=%nzK8xL S_$vSa00{s|MNUMnLSTYsuLE)b diff --git a/public/webshims/shims/jpicker/images/bar-opacity.png b/public/webshims/shims/jpicker/images/bar-opacity.png index 4769813ec36963cd0cf96d3d6e66eb2721d37439..01b3d90c651c0e4fc1f28ad54347998d7859c9a8 100644 GIT binary patch delta 78 zcmZ3)m@q-YgOQnmfq^@2^=Tl*7T^=&`v3p`GiT0Nyjs-^6cP1waSW+oO#acphT|5}cn_Ql40p%HWuipOmWLnVXoN8kCxtQdxL1 z)n=lisJoG;i(^Q|t)v7NCN_ly=4TDE4Dag5@xFVQ|1ra$|Jmb<59H1sUwqJJR=<05 f^#NTr4g-cSD_IxLn9Rrsw1dIZ)z4*}Q$iB}uw*T@ diff --git a/public/webshims/shims/jpicker/images/map-opacity.png b/public/webshims/shims/jpicker/images/map-opacity.png index 9a31e9bf93364c7967d1b17eb8bb7a7be3d68551..4d7dd03269dd8f3f4e4d774134ab3853ecc3e68f 100644 GIT binary patch delta 122 zcmcb{*v&XWqL_)9fq|iH^_*isiZj3`#P$FG|7XseIeq%{MtA>LKtWqi7srqa#$*oO zR0a0Q>k>nfRdjQFS}!!4RRkThlfPvs>1i(=xMSj$P5B|oTE3r@nfUKLkW~6EaktaqG?Xja&@|JS-O~{{O$I7aPN(7^SrSHgBt)o@~%@tF7nm7cnw1 zG4ZjuHLtZacUa8zBgpUl{c8#jY!XZ?lJp)78&qol`;+09_J4s{jB1 diff --git a/public/webshims/shims/jpicker/images/preview-opacity.png b/public/webshims/shims/jpicker/images/preview-opacity.png index 0dd9a2f8b9d2a8ff3f52bf7ca4c772196a5dd8d6..ef9fff49b002efc3e69db400aa10767980e53d4e 100644 GIT binary patch delta 60 zcmZo?^q(MU#sCB>A}1sQDKSqM$B+ufWD91d|BekRYBN|qdnPh5xR^#R@8aI;3{vUo L>gTe~DWM4f&>avz delta 116 zcmeZoXPh9J$Hc(Ez!VVi3P?$oxJHx&=ckpFCl;kLIHu$$r7C#lCZ?wbr6#6S7M@JC z0V>k;ba4!+xRqp6{EUZL$iU3Z?U|9`16Gr%X@CCzw>SF#=H}++qnQkhYz!MMIZA{d SsO<-8V(@hJb6Mw<&;$U8tS8z4 diff --git a/public/webshims/shims/mediacapture.js b/public/webshims/shims/mediacapture.js index a41bef6e..c9476a48 100644 --- a/public/webshims/shims/mediacapture.js +++ b/public/webshims/shims/mediacapture.js @@ -81,6 +81,7 @@ webshim.register('mediacapture', function($, webshim, window, document, undefine resolve(); } })(); + var regImage = /image\/\*|image\/jp/i; var loadPicker = function(){ webshim.ready('WINDOWLOAD', function(){ webshim.loader.loadList(['mediacapture-picker']); @@ -91,10 +92,15 @@ webshim.register('mediacapture', function($, webshim, window, document, undefine var _createPhotoPicker = function(){ if($(this).is('[capture].ws-filereader, .ws-capture') && webshim.implement(this, 'capture')){ - var $wrapper, $customFile; + var $wrapper, $customFile, $button, popover; var $fileinput = $(this); - var $button = $(''); - var popover = webshim.objectCreate(webshim.wsPopover, {}, $.extend({prepareFor: $button})); + var accept = $fileinput.prop('accept') || 'image/*'; + + if(!regImage.test(accept)){return;} + + $button = $('