From bffda356866bff550a8b83064ba2b65e694b7f36 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 14 Jun 2014 18:21:54 -0400 Subject: [PATCH 001/600] updated cheatsheet to be tabbed --- .../javascripts/jquery/AllMappingPages.js | 4 + .../jquery/AuthCanEditMappingPages.js | 4 - app/assets/stylesheets/application.css | 41 ++--- app/views/layouts/_cheatsheet.html.erb | 155 ++++++++++++++---- 4 files changed, 152 insertions(+), 52 deletions(-) diff --git a/app/assets/javascripts/jquery/AllMappingPages.js b/app/assets/javascripts/jquery/AllMappingPages.js index c3f519d3..3848b068 100644 --- a/app/assets/javascripts/jquery/AllMappingPages.js +++ b/app/assets/javascripts/jquery/AllMappingPages.js @@ -91,4 +91,8 @@ $(document).ready(function () { $('#center-container').bind('contextmenu', function (e) { return false; }); + + // tab the cheatsheet + $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); }); // end document.ready \ No newline at end of file diff --git a/app/assets/javascripts/jquery/AuthCanEditMappingPages.js b/app/assets/javascripts/jquery/AuthCanEditMappingPages.js index ba9794a9..4ec0f72d 100644 --- a/app/assets/javascripts/jquery/AuthCanEditMappingPages.js +++ b/app/assets/javascripts/jquery/AuthCanEditMappingPages.js @@ -158,10 +158,6 @@ $(document).ready(function () { selected: MetamapsModel.selectedMetacodeSetIndex }).addClass("ui-tabs-vertical ui-helper-clearfix"); $("#metacodeSwitchTabs .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); - $("#metacodeSwitchTabs .ui-tabs-nav li a").click(function(){ - // recenter the lightbox when you switch tabs - $('#lightbox_main').css('margin-top', '-' + ($('#lightbox_main').height() / 2) + 'px'); - }); $('.customMetacodeList li').click(function () { if ($(this).attr('class') != 'toggledOff') { $(this).addClass('toggledOff'); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 788f5284..8ae1e33d 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2032,29 +2032,32 @@ div.mapInfoStat { box-shadow: none; } /* Cheatsheet */ +#cheatSheet { + width: 100%; + font-family: LatoLight, Arial, Sans-Serif; + font-size: 17px; + line-height: 21px; + border: none; +} -.cheatsheetColumn { - float: left; - width: 245px; - line-height: 17px; - font-size: 12px; - font-family: arial; +#cheatSheet .sectionTitle { + font-family: Lato, Arial, sans-serif; + font-weight:bold; } -.cheatsheetColumn.cOne { - margin-right: 10px; -} -#cheatsheet h4 { - text-decoration: underline; - font-size: 20px; - font-family: 'vinyl'; - margin-top: 15px; - font-style: italic; -} -#cheatsheet .csItem { +#cheatSheet .csItem { margin: 5px 0; + font-size:15px; + line-height:18px; } -#cheatsheet .csTitle { - font-weight: bold; +#cheatSheet .csItem img { + display: inline-block; + margin: 0 2px; +} +#cheatSheet .csTitle { + font-family: Lato, Arial, sans-serif; +} +#cheatSheet .indented { + margin-left:15px; } /* Admin Pages */ diff --git a/app/views/layouts/_cheatsheet.html.erb b/app/views/layouts/_cheatsheet.html.erb index b7e1f18e..f3a08039 100644 --- a/app/views/layouts/_cheatsheet.html.erb +++ b/app/views/layouts/_cheatsheet.html.erb @@ -4,37 +4,134 @@ #%>

Quick Reference Guide

- -
-

Topics

-
Add New Topic: Double-click on canvas
-
Select Metacode: Scroll on spinner, or Tab / Shift+Tab
-
Creating New Topic: Hit Enter after typing topic name
-
Get Existing Topic: Click on (or use Up/Down->Enter) to pick from auto-suggestions
-
Open Topic Card: Double-click on topic icon
-
Edit Topic Type: Click on metacode in open topic card
-
Open Topic View: Click on 'leave page' icon in topic card (opens in new tab)
-

Navigation

-
Move (Pan) Across Canvas: Click on canvas and drag
-
Zoom In/Out Scroll mouse on canvas
-
Back to Center: Refresh page
-
+
+ -
-

Synapses

-
Create Synapse: Right-click/Alt+Click on topic and drag to other topic, enter synapse name or choose suggested
-
Create Topic with Synapse: Right-click/Alt+Click on topic and drag to empty part of canvas
-
View Synapse Description: Hover over synapse
-
Open Synapse Card: Double-click synapse
-
Edit Synapse Description: Click synapse description in synapse card
-
Change Synapse Direction: Check/Uncheck directional arrow boxes
-

Selection

-
Select Topic or Synapse: Click on one
-
Select Multiple: Shift+Click on canvas and drag around topics, or use Shift+Click to add/remove individually
-
Move Multiple: Select desired, Click and drag on a selected topic
-
Hide/Remove/Delete: Right-click/Alt+Click on selection
-
Deselect All: Hit Esc, or click any topic
+ <% if controller_name == "topics" && action_name == "show" %> +
+

Topic View

+
Alt + click on topic icon: recenter topics around chosen topic
+
Right-click + 'center this topic': recenter topics around chosen topic
+
+ <% end %> + + <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %> +
+

Creating Topics

+
Double-click on canvas: Bring up the metacode spinner on the canvas.
+
Scroll: change metacode spinner selection
+
Tab: rotate spinner counter-clockwise
+
Shift + tab: rotate spinner clockwise
+
Esc: Hides auto-suggestion results
+
Enter: create a new topic
+
Gear Icon: open up metacode settings
+
+ +
+

Editing Topics

+
+ Open topic card: double-click on topic icon +
+
+ Move topic card: click + drag on topic card metacode +
+
+ Change/edit metacode: mouse over metacode icon, then click on solid colored bar +
+
+ Edit topic title, description, link: click on text in respective area +
+
+ Save topic title, description, link: hit enter +
+
+ Change topic permission: click on 'permission' icon (only for topic creator) +
+
+ Open topic view: click on icon within topic card bar +
+
+ Close topic card: click on canvas +
+
+ Open context menu: right-click on topic icon +
+
*Hide/Remove/Delete topic within context menu
+
+ +
+

Creating Synapses

+
Right-click & drag from one topic to another: open create synapse prompt
+
Enter: Create synapse
+
*You do not have to add a description
+
Right-click + drag from topic to open canvas: create new topic with synapse
+
Enter: Create topic
+
Enter: Create synapse
+
+ +
+

Editing Synapses

+
Double-click on synapse: open synapse card
+
Edit synapse description: click on current description text
+
Save synapse description: hit enter
+
Edit directionality: select appropriate arrow boxes
+
Change synapse permission: click on 'permission' icon (only for synapse creator)
+
Right-click on synapse: open context menu
+
*Hide/Remove/Delete synapse within context menu
+
+ <% end %> + + <% if (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %> +
+

Navigation

+
Click + drag: move around canvas
+
Scroll: zoom in/out
+
Refresh page: center map
+
+ +
+

Selection

+
Click on topic icon: select/deselect topic
+
Click on synapse: select/deselect synapse
+
Shift + click: select multiple topics / synapses
+
Shift + click + drag on canvas: make selection box, select multiple topics
+
Click + drag on selected topic(s): move all selected topics & synapses
+
Right-click on selected topic(s): open context menu
+
*Hide/Remove/Delete/Change permissions of multiple topics & synapses within context menu
+
Click on background: deselect all topics & synapses
+
Esc: deselect all topics & synapses
+
+ <% end %> + +
+

Search

+
Ctrl + /: open search prompt
+
Esc: close search prompt
+
Type into the search prompt: search for topics, maps, & mappers
+
Click on search result: open in new tab
+ <% if controller_name == "maps" && action_name == "show" %> +
Click "+" on a topic result: add to current map
+ <% end %> +
Search by metacode: type "[name of metacode]:", then your search query. i.e. idea:create...
+
Search for map: type "map:", then your search query. i.e. map:exploring...
+
Search for mapper: type "mapper:", then your search query. i.e. mapper:Robert
+
\ No newline at end of file From 0982916e108f2520fb8449b37622e9707e5c62de Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 14 Jun 2014 18:25:37 -0400 Subject: [PATCH 002/600] hid topic view tab which was mistakenly showing --- app/views/layouts/_cheatsheet.html.erb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/views/layouts/_cheatsheet.html.erb b/app/views/layouts/_cheatsheet.html.erb index f3a08039..2c48addc 100644 --- a/app/views/layouts/_cheatsheet.html.erb +++ b/app/views/layouts/_cheatsheet.html.erb @@ -7,7 +7,9 @@
    + <% if controller_name == "topics" && action_name == "show" %>
  • Topic View
  • + <% end %> <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>
  • Creating Topics
  • Editing Topics
  • @@ -19,8 +21,7 @@
  • Selection
  • <% end %>
  • Search
  • - <% if controller_name == "topics" && action_name == "show" %> - <% end %> +
<% if controller_name == "topics" && action_name == "show" %> From a0cdad21387aef93db3adb60129057cce9f33f0a Mon Sep 17 00:00:00 2001 From: poietic Date: Sun, 15 Jun 2014 10:52:38 -0400 Subject: [PATCH 003/600] Update _cheatsheet.html.erb a couple of small switches --- app/views/layouts/_cheatsheet.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_cheatsheet.html.erb b/app/views/layouts/_cheatsheet.html.erb index 2c48addc..a854aac5 100644 --- a/app/views/layouts/_cheatsheet.html.erb +++ b/app/views/layouts/_cheatsheet.html.erb @@ -35,7 +35,7 @@ <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>

Creating Topics

-
Double-click on canvas: Bring up the metacode spinner on the canvas.
+
Double-click on canvas: Bring up the metacode spinner
Scroll: change metacode spinner selection
Tab: rotate spinner counter-clockwise
Shift + tab: rotate spinner clockwise
@@ -88,7 +88,7 @@

Editing Synapses

-
Double-click on synapse: open synapse card
+
Open synapse card:double-click on synapse
Edit synapse description: click on current description text
Save synapse description: hit enter
Edit directionality: select appropriate arrow boxes
@@ -135,4 +135,4 @@
-
\ No newline at end of file +
From 9027cd6d2eef754dee16a623d695c44f80689daf Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 15 Jun 2014 14:39:42 -0400 Subject: [PATCH 004/600] closes #352 size of cheatsheet window, closes #351 remove topic and synapse create from cheatsheet on topic pages, closes #348 enter key creating undesirable line break --- app/assets/javascripts/bip.js | 17 ++++++++++++++++- app/assets/stylesheets/application.css | 1 + app/views/layouts/_cheatsheet.html.erb | 18 +++++++++++++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/bip.js b/app/assets/javascripts/bip.js index 2c270e1d..ee804884 100644 --- a/app/assets/javascripts/bip.js +++ b/app/assets/javascripts/bip.js @@ -531,6 +531,9 @@ BestInPlaceEditor.forms = { this.element.find("input[type='button']").bind('click', {editor: this}, BestInPlaceEditor.forms.textarea.cancelButtonHandler); } this.element.find("textarea").bind('blur', {editor: this}, BestInPlaceEditor.forms.textarea.blurHandler); + // START METAMAPS CODE + this.element.find("textarea").bind('keydown', {editor: this}, BestInPlaceEditor.forms.textarea.keydownHandler); + // END METAMAPS CODE this.element.find("textarea").bind('keyup', {editor: this}, BestInPlaceEditor.forms.textarea.keyupHandler); this.blurTimer = null; this.userClicked = false; @@ -573,14 +576,26 @@ BestInPlaceEditor.forms = { event.data.editor.abortIfConfirm(); event.stopPropagation(); // Without this, click isn't handled }, - + + // START METAMAPS CODE + keydownHandler : function(event) { + if (event.keyCode == 13 && !event.shiftKey) { + event.preventDefault(); + event.stopPropagation(); + return false; + } + }, + // END METAMAPS CODE + keyupHandler : function(event) { if (event.keyCode == 27) { event.data.editor.abortIfConfirm(); } + // START METAMAPS CODE else if (event.keyCode == 13 && !event.shiftKey) { event.data.editor.update(); } + // END METAMAPS CODE } } }; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8ae1e33d..136d86fe 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2034,6 +2034,7 @@ div.mapInfoStat { /* Cheatsheet */ #cheatSheet { width: 100%; + height: 350px; font-family: LatoLight, Arial, Sans-Serif; font-size: 17px; line-height: 21px; diff --git a/app/views/layouts/_cheatsheet.html.erb b/app/views/layouts/_cheatsheet.html.erb index 2c48addc..7c400857 100644 --- a/app/views/layouts/_cheatsheet.html.erb +++ b/app/views/layouts/_cheatsheet.html.erb @@ -10,10 +10,16 @@ <% if controller_name == "topics" && action_name == "show" %>
  • Topic View
  • <% end %> - <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %> + <% if authenticated? && controller_name == "maps" && action_name == "show" %>
  • Creating Topics
  • + <% end %> + <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>
  • Editing Topics
  • + <% end %> + <% if authenticated? && controller_name == "maps" && action_name == "show" %>
  • Creating Synapses
  • + <% end %> + <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>
  • Editing Synapses
  • <% end %> <% if (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %> @@ -32,7 +38,7 @@
    <% end %> - <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %> + <% if authenticated? && controller_name == "maps" && action_name == "show" %>

    Creating Topics

    Double-click on canvas: Bring up the metacode spinner on the canvas.
    @@ -43,7 +49,9 @@
    Enter: create a new topic
    Gear Icon: open up metacode settings
    - + <% end %> + + <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>

    Editing Topics

    @@ -75,7 +83,9 @@
    *Hide/Remove/Delete topic within context menu
    + <% end %> + <% if authenticated? && controller_name == "maps" && action_name == "show" %>

    Creating Synapses

    Right-click & drag from one topic to another: open create synapse prompt
    @@ -85,7 +95,9 @@
    Enter: Create topic
    Enter: Create synapse
    + <% end %> + <% if authenticated? && (controller_name == "maps" || controller_name == "topics" ) && action_name == "show" %>

    Editing Synapses

    Double-click on synapse: open synapse card
    From 24280e82fa0e558f2baa74e87a958ff25f044378 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 25 Jun 2014 10:24:24 -0400 Subject: [PATCH 005/600] removed alert('failure') using alerts (especially with no information beyond just 'it failed') is terrible user experience --- app/assets/javascripts/application.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index f07ea1d8..05f0f857 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -128,7 +128,7 @@ function fetchRelatives(node) { } }, error: function () { - alert('failure'); + console.log('failed to recenter'); } }); } @@ -392,4 +392,4 @@ function cancelMapCreate(id) { form.find('.mapCommonsIcon').addClass('selected'); return false; -} \ No newline at end of file +} From 3018186c3f16df38990d81b264c3b57f59d93b9d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 25 Jun 2014 10:26:35 -0400 Subject: [PATCH 006/600] removed other alerts --- app/assets/javascripts/application.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 05f0f857..93cc4596 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -160,7 +160,7 @@ function updateMetacode(node, metacode) { }, 500); }, error: function () { - alert('failed to update metacode'); + console.log('failed to update metacode'); } }); } @@ -182,7 +182,7 @@ function updateTopicPermission(node, permission) { node.setData("permission", permission); }, error: function () { - alert('failed to update permission'); + console.log('failed to update permission'); } }); } @@ -204,7 +204,7 @@ function updateSynapsePermission(edge, permission) { edge.setData("permission", permission); }, error: function () { - alert('failed to update permission'); + console.log('failed to update permission'); } }); } @@ -225,7 +225,7 @@ function updateMapPermission(mapid, permission) { $('.mapPermission .permissionSelect').remove(); }, error: function () { - alert('failed to update permission'); + console.log('failed to update permission'); } }); } From 96197130e15b832d9c40afde72185266f2f6bc5e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 7 Jul 2014 21:02:43 -0400 Subject: [PATCH 007/600] added rmagick and ruby number for heroku --- Gemfile | 9 ++++++++ Gemfile.lock | 19 +++++++++++++++++ app/controllers/maps_controller.rb | 4 ++-- app/controllers/topics_controller.rb | 2 +- app/controllers/users_controller.rb | 3 --- app/models/topic.rb | 17 +++++++++++++++ app/models/user.rb | 21 ++++++++++++++++++- app/views/maps/show.html.erb | 4 ++-- app/views/users/edit.html.erb | 3 +++ config/environments/development.rb | 11 +++++++++- config/environments/production.rb | 11 ++++++++++ config/initializers/paperclip.rb | 2 ++ ...625212637_add_image_and_audio_to_topics.rb | 11 ++++++++++ .../20140707161810_add_image_to_users.rb | 9 ++++++++ db/schema.rb | 18 +++++++++++++--- 15 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 config/initializers/paperclip.rb create mode 100644 db/migrate/20140625212637_add_image_and_audio_to_topics.rb create mode 100644 db/migrate/20140707161810_add_image_to_users.rb diff --git a/Gemfile b/Gemfile index 65988ca4..f5358f47 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,5 @@ source 'https://rubygems.org' +ruby '1.9.3' gem 'rails', '3.2.17' @@ -14,6 +15,10 @@ gem 'formtastic' gem 'json' gem 'rails3-jquery-autocomplete' gem 'best_in_place' + +gem 'paperclip' +gem 'aws-sdk' + #gem 'therubyracer' #optional #gem 'rb-readline' @@ -29,6 +34,10 @@ group :assets do gem 'uglifier', '>= 1.0.3' end +group :production do #this is used on heroku + gem 'rmagick' +end + gem 'jquery-rails', '2.1.2' # To use ActiveModel has_secure_password diff --git a/Gemfile.lock b/Gemfile.lock index 3346fa26..e4bbb146 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,6 +29,9 @@ GEM i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) arel (3.0.3) + aws-sdk (1.44.0) + json (~> 1.4) + nokogiri (>= 1.4.4) bcrypt (3.1.7) bcrypt (3.1.7-x86-mingw32) best_in_place (2.1.0) @@ -36,6 +39,10 @@ GEM rails (~> 3.1) builder (3.0.4) cancan (1.6.10) + climate_control (0.0.3) + activesupport (>= 3.0) + cocaine (0.5.4) + climate_control (>= 0.0.3, < 1.0) coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -68,8 +75,18 @@ GEM mime-types (~> 1.16) treetop (~> 1.4.8) mime-types (1.25.1) + mini_portile (0.6.0) multi_json (1.10.0) + nokogiri (1.6.2.1) + mini_portile (= 0.6.0) + nokogiri (1.6.2.1-x86-mingw32) + mini_portile (= 0.6.0) orm_adapter (0.5.0) + paperclip (4.1.1) + activemodel (>= 3.0.0) + activesupport (>= 3.0.0) + cocaine (~> 0.5.3) + mime-types pg (0.17.1) pg (0.17.1-x86-mingw32) polyglot (0.3.4) @@ -129,6 +146,7 @@ PLATFORMS x86-mingw32 DEPENDENCIES + aws-sdk best_in_place cancan coffee-rails (~> 3.2.1) @@ -138,6 +156,7 @@ DEPENDENCIES jbuilder (= 0.8.2) jquery-rails (= 2.1.2) json + paperclip pg rails (= 3.2.17) rails3-jquery-autocomplete diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index a5ef3c6b..40107e72 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -62,8 +62,8 @@ class MapsController < ApplicationController # GET maps/:id def show - - @current = current_user + + @current = current_user @map = Map.find(params[:id]).authorize_to_show(@current) if not @map diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index d16a8f80..d824b72b 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -69,7 +69,7 @@ class TopicsController < ApplicationController @topic.permission = 'commons' @topic.metacode = Metacode.find_by_name(params[:topic][:metacode]) @topic.user = @user - + #if being created on a map, set topic by default to whatever permissions the map is if params[:topic][:map] @map = Map.find(params[:topic][:map]) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ac97d22e..bfbc1ffc 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -16,9 +16,6 @@ class UsersController < ApplicationController @user = current_user @user.attributes = params[:user] - #@m = params[:metacodes][:value] - #@user.settings.metacodes=@m.split(',') - @user.save sign_in(@user, :bypass => true) diff --git a/app/models/topic.rb b/app/models/topic.rb index 149321c9..668c94fe 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -11,7 +11,24 @@ has_many :topics2, :through => :synapses1, :source => :topic2 has_many :mappings has_many :maps, :through => :mappings + + # This method associates the attribute ":image" with a file attachment + has_attached_file :image + + #, styles: { + # thumb: '100x100>', + # square: '200x200#', + # medium: '300x300>' + #} + + # Validate the attached image is image/jpg, image/png, etc + validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ + # This method associates the attribute ":image" with a file attachment + has_attached_file :audio + # Validate the attached audio is audio/wav, audio/mp3, etc + validates_attachment_content_type :audio, :content_type => /\Aaudio\/.*\Z/ + def synapses synapses1 + synapses2 end diff --git a/app/models/user.rb b/app/models/user.rb index ae03c659..1be8144a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -11,13 +11,32 @@ has_many :mappings devise :database_authenticatable, :recoverable, :rememberable, :trackable, :registerable - attr_accessible :name, :email, :password, :password_confirmation, :code, :joinedwithcode, :remember_me + attr_accessible :name, :email, :image, :password, :password_confirmation, :code, :joinedwithcode, :remember_me serialize :settings, UserPreference validates_uniqueness_of :name # done by devise validates_uniqueness_of :email # done by devise + # This method associates the attribute ":image" with a file attachment + has_attached_file :image, :styles => { + :thumb => ['100x100>', :png], + :square => ['200x200#', :png], + :round => ['200x200#', :png] + }, :convert_options => {:round => Proc.new{self.convert_options}} + + # Validate the attached image is image/jpg, image/png, etc + validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ + + def self.convert_options + trans = '' + trans << ' ( +clone -alpha extract ' + trans << '-draw "fill black polygon 0,0 0,100 100,0 fill white circle 100,100 100,0" ' + trans << '( +clone -flip ) -compose multiply -composite ' + trans << '( +clone -flop ) -compose multiply -composite ' + trans << ') -alpha off -compose copy_opacity -composite ' + end + if ActiveRecord::Base.connection.table_exists? 'users' codes = ActiveRecord::Base.connection.execute("SELECT code FROM users").map {|user| user["code"] } else diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 474a6c1a..8a325a73 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -116,13 +116,13 @@ if (json.length > 0) { <% if authenticated? && (@map.permission == "commons" || @map.user == user) %> // this is for the heroku staging environment -window.realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); +//window.realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); // this is for metamaps.cc //window.realtime.socket = io.connect('http://metamaps.cc:5001'); // this is for localhost development -//window.realtime.socket = io.connect('http://localhost:5001'); +window.realtime.socket = io.connect('http://localhost:5001'); window.realtime.socket.on('connect', function () { console.log('socket connected'); diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 732b0f03..1bb64d46 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -8,6 +8,9 @@

    Your Settings

    <%= formula_form_for @user, url: user_url do |form| %>

    Edit Account

    + + <% if @user.image %><%= image_tag @user.image.url(:round), :size => "48x48" %><% end %> + <%= form.file_field :image %> <%= form.input :name, label: "Name", class: "name" %> <%= form.input :email, label: "Email", class: "email" %> <%= form.input :password, label: "Password", class: "password", :autocomplete => :off %> diff --git a/config/environments/development.rb b/config/environments/development.rb index 7f1b0375..d3a8b0b7 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -13,7 +13,16 @@ ISSAD::Application.configure do config.consider_all_requests_local = true config.action_controller.perform_caching = false - + # S3 file storage + config.paperclip_defaults = { + :storage => :s3, + :s3_credentials => { + :bucket => ENV['S3_BUCKET_NAME'], + :access_key_id => ENV['AWS_ACCESS_KEY_ID'], + :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] + } + } + config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: 'mail.metamaps.cc', diff --git a/config/environments/production.rb b/config/environments/production.rb index 8b1bf0f9..962b0dd2 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -13,6 +13,17 @@ ISSAD::Application.configure do # Compress JavaScripts and CSS config.assets.compress = true + + + # S3 file storage + config.paperclip_defaults = { + :storage => :s3, + :s3_credentials => { + :bucket => ENV['S3_BUCKET_NAME'], + :access_key_id => ENV['AWS_ACCESS_KEY_ID'], + :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] + } + } config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb new file mode 100644 index 00000000..1447988b --- /dev/null +++ b/config/initializers/paperclip.rb @@ -0,0 +1,2 @@ +Paperclip::Attachment.default_options[:url] = ':s3_domain_url' +Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename' \ No newline at end of file diff --git a/db/migrate/20140625212637_add_image_and_audio_to_topics.rb b/db/migrate/20140625212637_add_image_and_audio_to_topics.rb new file mode 100644 index 00000000..46bead64 --- /dev/null +++ b/db/migrate/20140625212637_add_image_and_audio_to_topics.rb @@ -0,0 +1,11 @@ +class AddImageAndAudioToTopics < ActiveRecord::Migration + def self.up + add_attachment :topics, :image + add_attachment :topics, :audio + end + + def self.down + remove_attachment :topics, :image + remove_attachment :topics, :audio + end +end diff --git a/db/migrate/20140707161810_add_image_to_users.rb b/db/migrate/20140707161810_add_image_to_users.rb new file mode 100644 index 00000000..0a479fda --- /dev/null +++ b/db/migrate/20140707161810_add_image_to_users.rb @@ -0,0 +1,9 @@ +class AddImageToUsers < ActiveRecord::Migration + def self.up + add_attachment :users, :image + end + + def self.down + remove_attachment :users, :image + end +end diff --git a/db/schema.rb b/db/schema.rb index 0a8292d7..c3fce2b2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20140517115841) do +ActiveRecord::Schema.define(:version => 20140707161810) do create_table "in_metacode_sets", :force => true do |t| t.integer "metacode_id" @@ -83,8 +83,16 @@ ActiveRecord::Schema.define(:version => 20140517115841) do t.text "permission" t.integer "user_id" t.integer "metacode_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + t.string "audio_file_name" + t.string "audio_content_type" + t.integer "audio_file_size" + t.datetime "audio_updated_at" end create_table "users", :force => true do |t| @@ -110,6 +118,10 @@ ActiveRecord::Schema.define(:version => 20140517115841) do t.string "current_sign_in_ip" t.datetime "reset_password_sent_at" t.boolean "admin" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" end add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true From aa5e3d522b6c02cecfdd15c34a41814106bfce90 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 7 Jul 2014 21:08:14 -0400 Subject: [PATCH 008/600] set proper socket for heroku --- app/views/maps/show.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 8a325a73..474a6c1a 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -116,13 +116,13 @@ if (json.length > 0) { <% if authenticated? && (@map.permission == "commons" || @map.user == user) %> // this is for the heroku staging environment -//window.realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); +window.realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); // this is for metamaps.cc //window.realtime.socket = io.connect('http://metamaps.cc:5001'); // this is for localhost development -window.realtime.socket = io.connect('http://localhost:5001'); +//window.realtime.socket = io.connect('http://localhost:5001'); window.realtime.socket.on('connect', function () { console.log('socket connected'); From eceb1174c3d0d4df485af9c7e1ff15bf2ef248d7 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 8 Jul 2014 00:21:43 -0400 Subject: [PATCH 009/600] removed ccircular image processor to test --- app/models/user.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/models/user.rb b/app/models/user.rb index 1be8144a..b5921fa2 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,7 +23,9 @@ has_many :mappings :thumb => ['100x100>', :png], :square => ['200x200#', :png], :round => ['200x200#', :png] - }, :convert_options => {:round => Proc.new{self.convert_options}} + } + + #, :convert_options => {:round => Proc.new{self.convert_options}} # Validate the attached image is image/jpg, image/png, etc validates_attachment_content_type :image, :content_type => /\Aimage\/.*\Z/ From b06f5cae3522d3c0420470cc7e6c899461115c61 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 27 Jul 2014 15:57:35 -0400 Subject: [PATCH 010/600] huge refactor 75% done --- Gemfile | 4 +- .../Jit/graphsettings-event-handlers.js | 43 - app/assets/javascripts/Jit/jit2.0.0.js | 2 +- app/assets/javascripts/application.js | 91 +- app/assets/javascripts/backbone.js | 1571 +++ .../carousel/cloud-carousel.1.0.5.js | 4 +- .../javascripts/jquery/AllMappingPages.js | 2 +- .../javascripts/jquery/AuthCanEditMapPage.js | 4 +- .../jquery/AuthCanEditMappingPages.js | 128 +- app/assets/javascripts/jquery/EveryPage.js | 18 +- app/assets/javascripts/map.js | 14 + app/assets/javascripts/metamaps/metamaps.js | 3589 +++++ .../javascripts/metamaps/metamapsJIT.js | 11149 ++++++++++++++++ app/assets/javascripts/underscore.js | 1227 ++ app/assets/stylesheets/application.css | 7 +- app/controllers/mappings_controller.rb | 84 +- app/controllers/maps_controller.rb | 14 +- app/controllers/metacodes_controller.rb | 11 +- app/controllers/synapses_controller.rb | 119 +- app/controllers/topics_controller.rb | 155 +- app/controllers/users_controller.rb | 9 +- app/models/map.rb | 21 +- app/models/metacode.rb | 2 +- app/views/layouts/_switchmetacodes.html.erb | 4 +- app/views/layouts/application.html.erb | 8 +- app/views/maps/show.html.erb | 43 +- config/environments/production.rb | 2 +- config/routes.rb | 2 +- 28 files changed, 17715 insertions(+), 612 deletions(-) create mode 100644 app/assets/javascripts/backbone.js create mode 100644 app/assets/javascripts/map.js create mode 100644 app/assets/javascripts/metamaps/metamaps.js create mode 100644 app/assets/javascripts/metamaps/metamapsJIT.js create mode 100644 app/assets/javascripts/underscore.js diff --git a/Gemfile b/Gemfile index f5358f47..51ddc1db 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '1.9.3' +#ruby '1.9.3' gem 'rails', '3.2.17' @@ -35,7 +35,7 @@ group :assets do end group :production do #this is used on heroku - gem 'rmagick' + #gem 'rmagick' end gem 'jquery-rails', '2.1.2' diff --git a/app/assets/javascripts/Jit/graphsettings-event-handlers.js b/app/assets/javascripts/Jit/graphsettings-event-handlers.js index 6b9c25fb..ba18d621 100644 --- a/app/assets/javascripts/Jit/graphsettings-event-handlers.js +++ b/app/assets/javascripts/Jit/graphsettings-event-handlers.js @@ -585,47 +585,4 @@ function touchPanZoomHandler(eventInfo, e) { lastDist = dist; } -} - -function updateSelectedPermissions(permission) { - - - if ($('.notice.metamaps').length == 0) { - $('body').prepend('
    '); - } - $('.notice.metamaps').hide().html('Working...').fadeIn('fast'); - - // variables to keep track of how many nodes and synapses you had the ability to change the permission of - var nCount = 0, - sCount = 0; - - // change the permission of the selected synapses, if logged in user is the original creator - var l = MetamapsModel.selectedEdges.length; - for (var i = l - 1; i >= 0; i -= 1) { - var edge = MetamapsModel.selectedEdges[i]; - - if (edge.getData('userid') == userid) { - updateSynapsePermission(edge, permission); - sCount++; - } - } - - // change the permission of the selected topics, if logged in user is the original creator - var l = MetamapsModel.selectedNodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - var node = MetamapsModel.selectedNodes[i]; - - if (node.getData('userid') == userid) { - updateTopicPermission(node, permission); - nCount++; - } - } - - var nString = nCount == 1 ? (nCount.toString() + ' topic and ') : (nCount.toString() + ' topics and '); - var sString = sCount == 1 ? (sCount.toString() + ' synapse') : (sCount.toString() + ' synapses'); - - $('.notice.metamaps').html(nString + sString + ' you created updated to ' + permission) - setTimeout(function () { - $('.notice.metamaps').fadeOut('fast'); - }, 8000); } \ No newline at end of file diff --git a/app/assets/javascripts/Jit/jit2.0.0.js b/app/assets/javascripts/Jit/jit2.0.0.js index 60cdb91c..b8fc1bbe 100644 --- a/app/assets/javascripts/Jit/jit2.0.0.js +++ b/app/assets/javascripts/Jit/jit2.0.0.js @@ -7238,7 +7238,7 @@ Graph.Label.Native = new Class({ function splitLine(st,n) {var b = ''; var s = st;while (s.length > n) {var c = s.substring(0,n);var d = c.lastIndexOf(' ');var e =c.lastIndexOf('\n');if (e != -1) d = e; if (d == -1) d = n; b += c.substring(0,d) + '\n';s = s.substring(d+1);}return b+s;} var arrayOfLabelLines = splitLine(node.name,30).split('\n'); //render background - ctx.fillStyle = 'rgba(24,32,46, 1)'; + ctx.fillStyle = 'rgba(24, 32, 46, 1)'; ctx.strokeStyle = node.getData('whiteCircle') ? '#FFF' : 'rgba(24,32,46, 1)'; ctx.lineWidth = 2; var height = 25 * arrayOfLabelLines.length; //font size + margin diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index f07ea1d8..c47c793f 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -20,7 +20,17 @@ //= require jquery.roundabout.min //= require bip //= require jquery_ujs -//= require_tree . +//= require hogan-2.0.0 +//= require socket.io +//= require typeahead +//= require underscore +//= require backbone +//= require_directory ./carousel +// require_directory ./Jit +//= require_directory ./jquery +//= require_directory ./realtime +//= require_directory ./scroll +//= require_directory ./typing // other options are 'graph' var viewMode = "list"; @@ -165,70 +175,6 @@ function updateMetacode(node, metacode) { }); } -function updateTopicPermission(node, permission) { - var mdata = { - "topic": { - "permission": permission - } - }; - $.ajax({ - type: "PUT", - dataType: 'json', - url: "/topics/" + node.id, - data: mdata, - success: function (data) { - $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('.permissionSelect').remove(); - node.setData("permission", permission); - }, - error: function () { - alert('failed to update permission'); - } - }); -} - -function updateSynapsePermission(edge, permission) { - var mdata = { - "synapse": { - "permission": permission - } - }; - $.ajax({ - type: "PUT", - dataType: 'json', - url: "/synapses/" + edge.data.$id, - data: mdata, - success: function (data) { - $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('#edit_synapse .permissionSelect').remove(); - edge.setData("permission", permission); - }, - error: function () { - alert('failed to update permission'); - } - }); -} - -function updateMapPermission(mapid, permission) { - var mdata = { - "map": { - "permission": permission - } - }; - $.ajax({ - type: "PUT", - dataType: 'json', - url: "/maps/" + mapid, - data: mdata, - success: function (data) { - $('.mapPermission').removeClass('commons public private minimize').addClass(permission); - $('.mapPermission .permissionSelect').remove(); - }, - error: function () { - alert('failed to update permission'); - } - }); -} function updateMetacodeSet(set, index, custom) { @@ -330,21 +276,6 @@ function MconsoleReset() { Mconsole.canvas.scale((1 / mX), (1 / mY)); } -function openNodeShowcard(node) { - //populate the card that's about to show with the right topics data - populateShowCard(node); - - $('.showcard').fadeIn('fast'); - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - MetamapsModel.showcardInUse = node.id; -} - function openLightbox(which) { $('.lightboxContent').hide(); $('#' + which).show(); diff --git a/app/assets/javascripts/backbone.js b/app/assets/javascripts/backbone.js new file mode 100644 index 00000000..a0726ee4 --- /dev/null +++ b/app/assets/javascripts/backbone.js @@ -0,0 +1,1571 @@ +// Backbone.js 1.0.0 + +// (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. +// Backbone may be freely distributed under the MIT license. +// For all details and documentation: +// http://backbonejs.org + +(function(){ + + // Initial Setup + // ------------- + + // Save a reference to the global object (`window` in the browser, `exports` + // on the server). + var root = this; + + // Save the previous value of the `Backbone` variable, so that it can be + // restored later on, if `noConflict` is used. + var previousBackbone = root.Backbone; + + // Create local references to array methods we'll want to use later. + var array = []; + var push = array.push; + var slice = array.slice; + var splice = array.splice; + + // The top-level namespace. All public Backbone classes and modules will + // be attached to this. Exported for both the browser and the server. + var Backbone; + if (typeof exports !== 'undefined') { + Backbone = exports; + } else { + Backbone = root.Backbone = {}; + } + + // Current version of the library. Keep in sync with `package.json`. + Backbone.VERSION = '1.0.0'; + + // Require Underscore, if we're on the server, and it's not already present. + var _ = root._; + if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); + + // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns + // the `$` variable. + Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$; + + // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable + // to its previous owner. Returns a reference to this Backbone object. + Backbone.noConflict = function() { + root.Backbone = previousBackbone; + return this; + }; + + // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option + // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and + // set a `X-Http-Method-Override` header. + Backbone.emulateHTTP = false; + + // Turn on `emulateJSON` to support legacy servers that can't deal with direct + // `application/json` requests ... will encode the body as + // `application/x-www-form-urlencoded` instead and will send the model in a + // form param named `model`. + Backbone.emulateJSON = false; + + // Backbone.Events + // --------------- + + // A module that can be mixed in to *any object* in order to provide it with + // custom events. You may bind with `on` or remove with `off` callback + // functions to an event; `trigger`-ing an event fires all callbacks in + // succession. + // + // var object = {}; + // _.extend(object, Backbone.Events); + // object.on('expand', function(){ alert('expanded'); }); + // object.trigger('expand'); + // + var Events = Backbone.Events = { + + // Bind an event to a `callback` function. Passing `"all"` will bind + // the callback to all events fired. + on: function(name, callback, context) { + if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this; + this._events || (this._events = {}); + var events = this._events[name] || (this._events[name] = []); + events.push({callback: callback, context: context, ctx: context || this}); + return this; + }, + + // Bind an event to only be triggered a single time. After the first time + // the callback is invoked, it will be removed. + once: function(name, callback, context) { + if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this; + var self = this; + var once = _.once(function() { + self.off(name, once); + callback.apply(this, arguments); + }); + once._callback = callback; + return this.on(name, once, context); + }, + + // Remove one or many callbacks. If `context` is null, removes all + // callbacks with that function. If `callback` is null, removes all + // callbacks for the event. If `name` is null, removes all bound + // callbacks for all events. + off: function(name, callback, context) { + var retain, ev, events, names, i, l, j, k; + if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this; + if (!name && !callback && !context) { + this._events = {}; + return this; + } + + names = name ? [name] : _.keys(this._events); + for (i = 0, l = names.length; i < l; i++) { + name = names[i]; + if (events = this._events[name]) { + this._events[name] = retain = []; + if (callback || context) { + for (j = 0, k = events.length; j < k; j++) { + ev = events[j]; + if ((callback && callback !== ev.callback && callback !== ev.callback._callback) || + (context && context !== ev.context)) { + retain.push(ev); + } + } + } + if (!retain.length) delete this._events[name]; + } + } + + return this; + }, + + // Trigger one or many events, firing all bound callbacks. Callbacks are + // passed the same arguments as `trigger` is, apart from the event name + // (unless you're listening on `"all"`, which will cause your callback to + // receive the true name of the event as the first argument). + trigger: function(name) { + if (!this._events) return this; + var args = slice.call(arguments, 1); + if (!eventsApi(this, 'trigger', name, args)) return this; + var events = this._events[name]; + var allEvents = this._events.all; + if (events) triggerEvents(events, args); + if (allEvents) triggerEvents(allEvents, arguments); + return this; + }, + + // Tell this object to stop listening to either specific events ... or + // to every object it's currently listening to. + stopListening: function(obj, name, callback) { + var listeners = this._listeners; + if (!listeners) return this; + var deleteListener = !name && !callback; + if (typeof name === 'object') callback = this; + if (obj) (listeners = {})[obj._listenerId] = obj; + for (var id in listeners) { + listeners[id].off(name, callback, this); + if (deleteListener) delete this._listeners[id]; + } + return this; + } + + }; + + // Regular expression used to split event strings. + var eventSplitter = /\s+/; + + // Implement fancy features of the Events API such as multiple event + // names `"change blur"` and jQuery-style event maps `{change: action}` + // in terms of the existing API. + var eventsApi = function(obj, action, name, rest) { + if (!name) return true; + + // Handle event maps. + if (typeof name === 'object') { + for (var key in name) { + obj[action].apply(obj, [key, name[key]].concat(rest)); + } + return false; + } + + // Handle space separated event names. + if (eventSplitter.test(name)) { + var names = name.split(eventSplitter); + for (var i = 0, l = names.length; i < l; i++) { + obj[action].apply(obj, [names[i]].concat(rest)); + } + return false; + } + + return true; + }; + + // A difficult-to-believe, but optimized internal dispatch function for + // triggering events. Tries to keep the usual cases speedy (most internal + // Backbone events have 3 arguments). + var triggerEvents = function(events, args) { + var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; + switch (args.length) { + case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; + case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; + case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; + case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; + default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); + } + }; + + var listenMethods = {listenTo: 'on', listenToOnce: 'once'}; + + // Inversion-of-control versions of `on` and `once`. Tell *this* object to + // listen to an event in another object ... keeping track of what it's + // listening to. + _.each(listenMethods, function(implementation, method) { + Events[method] = function(obj, name, callback) { + var listeners = this._listeners || (this._listeners = {}); + var id = obj._listenerId || (obj._listenerId = _.uniqueId('l')); + listeners[id] = obj; + if (typeof name === 'object') callback = this; + obj[implementation](name, callback, this); + return this; + }; + }); + + // Aliases for backwards compatibility. + Events.bind = Events.on; + Events.unbind = Events.off; + + // Allow the `Backbone` object to serve as a global event bus, for folks who + // want global "pubsub" in a convenient place. + _.extend(Backbone, Events); + + // Backbone.Model + // -------------- + + // Backbone **Models** are the basic data object in the framework -- + // frequently representing a row in a table in a database on your server. + // A discrete chunk of data and a bunch of useful, related methods for + // performing computations and transformations on that data. + + // Create a new model with the specified attributes. A client id (`cid`) + // is automatically generated and assigned for you. + var Model = Backbone.Model = function(attributes, options) { + var defaults; + var attrs = attributes || {}; + options || (options = {}); + this.cid = _.uniqueId('c'); + this.attributes = {}; + _.extend(this, _.pick(options, modelOptions)); + if (options.parse) attrs = this.parse(attrs, options) || {}; + if (defaults = _.result(this, 'defaults')) { + attrs = _.defaults({}, attrs, defaults); + } + this.set(attrs, options); + this.changed = {}; + this.initialize.apply(this, arguments); + }; + + // A list of options to be attached directly to the model, if provided. + var modelOptions = ['url', 'urlRoot', 'collection']; + + // Attach all inheritable methods to the Model prototype. + _.extend(Model.prototype, Events, { + + // A hash of attributes whose current and previous value differ. + changed: null, + + // The value returned during the last failed validation. + validationError: null, + + // The default name for the JSON `id` attribute is `"id"`. MongoDB and + // CouchDB users may want to set this to `"_id"`. + idAttribute: 'id', + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Return a copy of the model's `attributes` object. + toJSON: function(options) { + return _.clone(this.attributes); + }, + + // Proxy `Backbone.sync` by default -- but override this if you need + // custom syncing semantics for *this* particular model. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Get the value of an attribute. + get: function(attr) { + return this.attributes[attr]; + }, + + // Get the HTML-escaped value of an attribute. + escape: function(attr) { + return _.escape(this.get(attr)); + }, + + // Returns `true` if the attribute contains a value that is not null + // or undefined. + has: function(attr) { + return this.get(attr) != null; + }, + + // Set a hash of model attributes on the object, firing `"change"`. This is + // the core primitive operation of a model, updating the data and notifying + // anyone who needs to know about the change in state. The heart of the beast. + set: function(key, val, options) { + var attr, attrs, unset, changes, silent, changing, prev, current; + if (key == null) return this; + + // Handle both `"key", value` and `{key: value}` -style arguments. + if (typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + options || (options = {}); + + // Run validation. + if (!this._validate(attrs, options)) return false; + + // Extract attributes and options. + unset = options.unset; + silent = options.silent; + changes = []; + changing = this._changing; + this._changing = true; + + if (!changing) { + this._previousAttributes = _.clone(this.attributes); + this.changed = {}; + } + current = this.attributes, prev = this._previousAttributes; + + // Check for changes of `id`. + if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; + + // For each `set` attribute, update or delete the current value. + for (attr in attrs) { + val = attrs[attr]; + if (!_.isEqual(current[attr], val)) changes.push(attr); + if (!_.isEqual(prev[attr], val)) { + this.changed[attr] = val; + } else { + delete this.changed[attr]; + } + unset ? delete current[attr] : current[attr] = val; + } + + // Trigger all relevant attribute changes. + if (!silent) { + if (changes.length) this._pending = true; + for (var i = 0, l = changes.length; i < l; i++) { + this.trigger('change:' + changes[i], this, current[changes[i]], options); + } + } + + // You might be wondering why there's a `while` loop here. Changes can + // be recursively nested within `"change"` events. + if (changing) return this; + if (!silent) { + while (this._pending) { + this._pending = false; + this.trigger('change', this, options); + } + } + this._pending = false; + this._changing = false; + return this; + }, + + // Remove an attribute from the model, firing `"change"`. `unset` is a noop + // if the attribute doesn't exist. + unset: function(attr, options) { + return this.set(attr, void 0, _.extend({}, options, {unset: true})); + }, + + // Clear all attributes on the model, firing `"change"`. + clear: function(options) { + var attrs = {}; + for (var key in this.attributes) attrs[key] = void 0; + return this.set(attrs, _.extend({}, options, {unset: true})); + }, + + // Determine if the model has changed since the last `"change"` event. + // If you specify an attribute name, determine if that attribute has changed. + hasChanged: function(attr) { + if (attr == null) return !_.isEmpty(this.changed); + return _.has(this.changed, attr); + }, + + // Return an object containing all the attributes that have changed, or + // false if there are no changed attributes. Useful for determining what + // parts of a view need to be updated and/or what attributes need to be + // persisted to the server. Unset attributes will be set to undefined. + // You can also pass an attributes object to diff against the model, + // determining if there *would be* a change. + changedAttributes: function(diff) { + if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; + var val, changed = false; + var old = this._changing ? this._previousAttributes : this.attributes; + for (var attr in diff) { + if (_.isEqual(old[attr], (val = diff[attr]))) continue; + (changed || (changed = {}))[attr] = val; + } + return changed; + }, + + // Get the previous value of an attribute, recorded at the time the last + // `"change"` event was fired. + previous: function(attr) { + if (attr == null || !this._previousAttributes) return null; + return this._previousAttributes[attr]; + }, + + // Get all of the attributes of the model at the time of the previous + // `"change"` event. + previousAttributes: function() { + return _.clone(this._previousAttributes); + }, + + // Fetch the model from the server. If the server's representation of the + // model differs from its current attributes, they will be overridden, + // triggering a `"change"` event. + fetch: function(options) { + options = options ? _.clone(options) : {}; + if (options.parse === void 0) options.parse = true; + var model = this; + var success = options.success; + options.success = function(resp) { + if (!model.set(model.parse(resp, options), options)) return false; + if (success) success(model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Set a hash of model attributes, and sync the model to the server. + // If the server returns an attributes hash that differs, the model's + // state will be `set` again. + save: function(key, val, options) { + var attrs, method, xhr, attributes = this.attributes; + + // Handle both `"key", value` and `{key: value}` -style arguments. + if (key == null || typeof key === 'object') { + attrs = key; + options = val; + } else { + (attrs = {})[key] = val; + } + + // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`. + if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false; + + options = _.extend({validate: true}, options); + + // Do not persist invalid models. + if (!this._validate(attrs, options)) return false; + + // Set temporary attributes if `{wait: true}`. + if (attrs && options.wait) { + this.attributes = _.extend({}, attributes, attrs); + } + + // After a successful server-side save, the client is (optionally) + // updated with the server-side state. + if (options.parse === void 0) options.parse = true; + var model = this; + var success = options.success; + options.success = function(resp) { + // Ensure attributes are restored during synchronous saves. + model.attributes = attributes; + var serverAttrs = model.parse(resp, options); + if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); + if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { + return false; + } + if (success) success(model, resp, options); + model.trigger('sync', model, resp, options); + }; + wrapError(this, options); + + method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); + if (method === 'patch') options.attrs = attrs; + xhr = this.sync(method, this, options); + + // Restore attributes. + if (attrs && options.wait) this.attributes = attributes; + + return xhr; + }, + + // Destroy this model on the server if it was already persisted. + // Optimistically removes the model from its collection, if it has one. + // If `wait: true` is passed, waits for the server to respond before removal. + destroy: function(options) { + options = options ? _.clone(options) : {}; + var model = this; + var success = options.success; + + var destroy = function() { + model.trigger('destroy', model, model.collection, options); + }; + + options.success = function(resp) { + if (options.wait || model.isNew()) destroy(); + if (success) success(model, resp, options); + if (!model.isNew()) model.trigger('sync', model, resp, options); + }; + + if (this.isNew()) { + options.success(); + return false; + } + wrapError(this, options); + + var xhr = this.sync('delete', this, options); + if (!options.wait) destroy(); + return xhr; + }, + + // Default URL for the model's representation on the server -- if you're + // using Backbone's restful methods, override this to change the endpoint + // that will be called. + url: function() { + var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); + if (this.isNew()) return base; + return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); + }, + + // **parse** converts a response into the hash of attributes to be `set` on + // the model. The default implementation is just to pass the response along. + parse: function(resp, options) { + return resp; + }, + + // Create a new model with identical attributes to this one. + clone: function() { + return new this.constructor(this.attributes); + }, + + // A model is new if it has never been saved to the server, and lacks an id. + isNew: function() { + return this.id == null; + }, + + // Check if the model is currently in a valid state. + isValid: function(options) { + return this._validate({}, _.extend(options || {}, { validate: true })); + }, + + // Run validation against the next complete set of model attributes, + // returning `true` if all is well. Otherwise, fire an `"invalid"` event. + _validate: function(attrs, options) { + if (!options.validate || !this.validate) return true; + attrs = _.extend({}, this.attributes, attrs); + var error = this.validationError = this.validate(attrs, options) || null; + if (!error) return true; + this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error})); + return false; + } + + }); + + // Underscore methods that we want to implement on the Model. + var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit']; + + // Mix in each Underscore method as a proxy to `Model#attributes`. + _.each(modelMethods, function(method) { + Model.prototype[method] = function() { + var args = slice.call(arguments); + args.unshift(this.attributes); + return _[method].apply(_, args); + }; + }); + + // Backbone.Collection + // ------------------- + + // If models tend to represent a single row of data, a Backbone Collection is + // more analagous to a table full of data ... or a small slice or page of that + // table, or a collection of rows that belong together for a particular reason + // -- all of the messages in this particular folder, all of the documents + // belonging to this particular author, and so on. Collections maintain + // indexes of their models, both in order, and for lookup by `id`. + + // Create a new **Collection**, perhaps to contain a specific type of `model`. + // If a `comparator` is specified, the Collection will maintain + // its models in sort order, as they're added and removed. + var Collection = Backbone.Collection = function(models, options) { + options || (options = {}); + if (options.url) this.url = options.url; + if (options.model) this.model = options.model; + if (options.comparator !== void 0) this.comparator = options.comparator; + this._reset(); + this.initialize.apply(this, arguments); + if (models) this.reset(models, _.extend({silent: true}, options)); + }; + + // Default options for `Collection#set`. + var setOptions = {add: true, remove: true, merge: true}; + var addOptions = {add: true, merge: false, remove: false}; + + // Define the Collection's inheritable methods. + _.extend(Collection.prototype, Events, { + + // The default model for a collection is just a **Backbone.Model**. + // This should be overridden in most cases. + model: Model, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // The JSON representation of a Collection is an array of the + // models' attributes. + toJSON: function(options) { + return this.map(function(model){ return model.toJSON(options); }); + }, + + // Proxy `Backbone.sync` by default. + sync: function() { + return Backbone.sync.apply(this, arguments); + }, + + // Add a model, or list of models to the set. + add: function(models, options) { + return this.set(models, _.defaults(options || {}, addOptions)); + }, + + // Remove a model, or a list of models from the set. + remove: function(models, options) { + models = _.isArray(models) ? models.slice() : [models]; + options || (options = {}); + var i, l, index, model; + for (i = 0, l = models.length; i < l; i++) { + model = this.get(models[i]); + if (!model) continue; + delete this._byId[model.id]; + delete this._byId[model.cid]; + index = this.indexOf(model); + this.models.splice(index, 1); + this.length--; + if (!options.silent) { + options.index = index; + model.trigger('remove', model, this, options); + } + this._removeReference(model); + } + return this; + }, + + // Update a collection by `set`-ing a new list of models, adding new ones, + // removing models that are no longer present, and merging models that + // already exist in the collection, as necessary. Similar to **Model#set**, + // the core operation for updating the data contained by the collection. + set: function(models, options) { + options = _.defaults(options || {}, setOptions); + if (options.parse) models = this.parse(models, options); + if (!_.isArray(models)) models = models ? [models] : []; + var i, l, model, attrs, existing, sort; + var at = options.at; + var sortable = this.comparator && (at == null) && options.sort !== false; + var sortAttr = _.isString(this.comparator) ? this.comparator : null; + var toAdd = [], toRemove = [], modelMap = {}; + + // Turn bare objects into model references, and prevent invalid models + // from being added. + for (i = 0, l = models.length; i < l; i++) { + if (!(model = this._prepareModel(models[i], options))) continue; + + // If a duplicate is found, prevent it from being added and + // optionally merge it into the existing model. + if (existing = this.get(model)) { + if (options.remove) modelMap[existing.cid] = true; + if (options.merge) { + existing.set(model.attributes, options); + if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true; + } + + // This is a new model, push it to the `toAdd` list. + } else if (options.add) { + toAdd.push(model); + + // Listen to added models' events, and index models for lookup by + // `id` and by `cid`. + model.on('all', this._onModelEvent, this); + this._byId[model.cid] = model; + if (model.id != null) this._byId[model.id] = model; + } + } + + // Remove nonexistent models if appropriate. + if (options.remove) { + for (i = 0, l = this.length; i < l; ++i) { + if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model); + } + if (toRemove.length) this.remove(toRemove, options); + } + + // See if sorting is needed, update `length` and splice in new models. + if (toAdd.length) { + if (sortable) sort = true; + this.length += toAdd.length; + if (at != null) { + splice.apply(this.models, [at, 0].concat(toAdd)); + } else { + push.apply(this.models, toAdd); + } + } + + // Silently sort the collection if appropriate. + if (sort) this.sort({silent: true}); + + if (options.silent) return this; + + // Trigger `add` events. + for (i = 0, l = toAdd.length; i < l; i++) { + (model = toAdd[i]).trigger('add', model, this, options); + } + + // Trigger `sort` if the collection was sorted. + if (sort) this.trigger('sort', this, options); + return this; + }, + + // When you have more items than you want to add or remove individually, + // you can reset the entire set with a new list of models, without firing + // any granular `add` or `remove` events. Fires `reset` when finished. + // Useful for bulk operations and optimizations. + reset: function(models, options) { + options || (options = {}); + for (var i = 0, l = this.models.length; i < l; i++) { + this._removeReference(this.models[i]); + } + options.previousModels = this.models; + this._reset(); + this.add(models, _.extend({silent: true}, options)); + if (!options.silent) this.trigger('reset', this, options); + return this; + }, + + // Add a model to the end of the collection. + push: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, _.extend({at: this.length}, options)); + return model; + }, + + // Remove a model from the end of the collection. + pop: function(options) { + var model = this.at(this.length - 1); + this.remove(model, options); + return model; + }, + + // Add a model to the beginning of the collection. + unshift: function(model, options) { + model = this._prepareModel(model, options); + this.add(model, _.extend({at: 0}, options)); + return model; + }, + + // Remove a model from the beginning of the collection. + shift: function(options) { + var model = this.at(0); + this.remove(model, options); + return model; + }, + + // Slice out a sub-array of models from the collection. + slice: function(begin, end) { + return this.models.slice(begin, end); + }, + + // Get a model from the set by id. + get: function(obj) { + if (obj == null) return void 0; + return this._byId[obj.id != null ? obj.id : obj.cid || obj]; + }, + + // Get the model at the given index. + at: function(index) { + return this.models[index]; + }, + + // Return models with matching attributes. Useful for simple cases of + // `filter`. + where: function(attrs, first) { + if (_.isEmpty(attrs)) return first ? void 0 : []; + return this[first ? 'find' : 'filter'](function(model) { + for (var key in attrs) { + if (attrs[key] !== model.get(key)) return false; + } + return true; + }); + }, + + // Return the first model with matching attributes. Useful for simple cases + // of `find`. + findWhere: function(attrs) { + return this.where(attrs, true); + }, + + // Force the collection to re-sort itself. You don't need to call this under + // normal circumstances, as the set will maintain sort order as each item + // is added. + sort: function(options) { + if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); + options || (options = {}); + + // Run sort based on type of `comparator`. + if (_.isString(this.comparator) || this.comparator.length === 1) { + this.models = this.sortBy(this.comparator, this); + } else { + this.models.sort(_.bind(this.comparator, this)); + } + + if (!options.silent) this.trigger('sort', this, options); + return this; + }, + + // Figure out the smallest index at which a model should be inserted so as + // to maintain order. + sortedIndex: function(model, value, context) { + value || (value = this.comparator); + var iterator = _.isFunction(value) ? value : function(model) { + return model.get(value); + }; + return _.sortedIndex(this.models, model, iterator, context); + }, + + // Pluck an attribute from each model in the collection. + pluck: function(attr) { + return _.invoke(this.models, 'get', attr); + }, + + // Fetch the default set of models for this collection, resetting the + // collection when they arrive. If `reset: true` is passed, the response + // data will be passed through the `reset` method instead of `set`. + fetch: function(options) { + options = options ? _.clone(options) : {}; + if (options.parse === void 0) options.parse = true; + var success = options.success; + var collection = this; + options.success = function(resp) { + var method = options.reset ? 'reset' : 'set'; + collection[method](resp, options); + if (success) success(collection, resp, options); + collection.trigger('sync', collection, resp, options); + }; + wrapError(this, options); + return this.sync('read', this, options); + }, + + // Create a new instance of a model in this collection. Add the model to the + // collection immediately, unless `wait: true` is passed, in which case we + // wait for the server to agree. + create: function(model, options) { + options = options ? _.clone(options) : {}; + if (!(model = this._prepareModel(model, options))) return false; + if (!options.wait) this.add(model, options); + var collection = this; + var success = options.success; + options.success = function(resp) { + if (options.wait) collection.add(model, options); + if (success) success(model, resp, options); + }; + model.save(null, options); + return model; + }, + + // **parse** converts a response into a list of models to be added to the + // collection. The default implementation is just to pass it through. + parse: function(resp, options) { + return resp; + }, + + // Create a new collection with an identical list of models as this one. + clone: function() { + return new this.constructor(this.models); + }, + + // Private method to reset all internal state. Called when the collection + // is first initialized or reset. + _reset: function() { + this.length = 0; + this.models = []; + this._byId = {}; + }, + + // Prepare a hash of attributes (or other model) to be added to this + // collection. + _prepareModel: function(attrs, options) { + if (attrs instanceof Model) { + if (!attrs.collection) attrs.collection = this; + return attrs; + } + options || (options = {}); + options.collection = this; + var model = new this.model(attrs, options); + if (!model._validate(attrs, options)) { + this.trigger('invalid', this, attrs, options); + return false; + } + return model; + }, + + // Internal method to sever a model's ties to a collection. + _removeReference: function(model) { + if (this === model.collection) delete model.collection; + model.off('all', this._onModelEvent, this); + }, + + // Internal method called every time a model in the set fires an event. + // Sets need to update their indexes when models change ids. All other + // events simply proxy through. "add" and "remove" events that originate + // in other collections are ignored. + _onModelEvent: function(event, model, collection, options) { + if ((event === 'add' || event === 'remove') && collection !== this) return; + if (event === 'destroy') this.remove(model, options); + if (model && event === 'change:' + model.idAttribute) { + delete this._byId[model.previous(model.idAttribute)]; + if (model.id != null) this._byId[model.id] = model; + } + this.trigger.apply(this, arguments); + } + + }); + + // Underscore methods that we want to implement on the Collection. + // 90% of the core usefulness of Backbone Collections is actually implemented + // right here: + var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', + 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', + 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', + 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', + 'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf', + 'isEmpty', 'chain']; + + // Mix in each Underscore method as a proxy to `Collection#models`. + _.each(methods, function(method) { + Collection.prototype[method] = function() { + var args = slice.call(arguments); + args.unshift(this.models); + return _[method].apply(_, args); + }; + }); + + // Underscore methods that take a property name as an argument. + var attributeMethods = ['groupBy', 'countBy', 'sortBy']; + + // Use attributes instead of properties. + _.each(attributeMethods, function(method) { + Collection.prototype[method] = function(value, context) { + var iterator = _.isFunction(value) ? value : function(model) { + return model.get(value); + }; + return _[method](this.models, iterator, context); + }; + }); + + // Backbone.View + // ------------- + + // Backbone Views are almost more convention than they are actual code. A View + // is simply a JavaScript object that represents a logical chunk of UI in the + // DOM. This might be a single item, an entire list, a sidebar or panel, or + // even the surrounding frame which wraps your whole app. Defining a chunk of + // UI as a **View** allows you to define your DOM events declaratively, without + // having to worry about render order ... and makes it easy for the view to + // react to specific changes in the state of your models. + + // Creating a Backbone.View creates its initial element outside of the DOM, + // if an existing element is not provided... + var View = Backbone.View = function(options) { + this.cid = _.uniqueId('view'); + this._configure(options || {}); + this._ensureElement(); + this.initialize.apply(this, arguments); + this.delegateEvents(); + }; + + // Cached regex to split keys for `delegate`. + var delegateEventSplitter = /^(\S+)\s*(.*)$/; + + // List of view options to be merged as properties. + var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; + + // Set up all inheritable **Backbone.View** properties and methods. + _.extend(View.prototype, Events, { + + // The default `tagName` of a View's element is `"div"`. + tagName: 'div', + + // jQuery delegate for element lookup, scoped to DOM elements within the + // current view. This should be prefered to global lookups where possible. + $: function(selector) { + return this.$el.find(selector); + }, + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // **render** is the core function that your view should override, in order + // to populate its element (`this.el`), with the appropriate HTML. The + // convention is for **render** to always return `this`. + render: function() { + return this; + }, + + // Remove this view by taking the element out of the DOM, and removing any + // applicable Backbone.Events listeners. + remove: function() { + this.$el.remove(); + this.stopListening(); + return this; + }, + + // Change the view's element (`this.el` property), including event + // re-delegation. + setElement: function(element, delegate) { + if (this.$el) this.undelegateEvents(); + this.$el = element instanceof Backbone.$ ? element : Backbone.$(element); + this.el = this.$el[0]; + if (delegate !== false) this.delegateEvents(); + return this; + }, + + // Set callbacks, where `this.events` is a hash of + // + // *{"event selector": "callback"}* + // + // { + // 'mousedown .title': 'edit', + // 'click .button': 'save' + // 'click .open': function(e) { ... } + // } + // + // pairs. Callbacks will be bound to the view, with `this` set properly. + // Uses event delegation for efficiency. + // Omitting the selector binds the event to `this.el`. + // This only works for delegate-able events: not `focus`, `blur`, and + // not `change`, `submit`, and `reset` in Internet Explorer. + delegateEvents: function(events) { + if (!(events || (events = _.result(this, 'events')))) return this; + this.undelegateEvents(); + for (var key in events) { + var method = events[key]; + if (!_.isFunction(method)) method = this[events[key]]; + if (!method) continue; + + var match = key.match(delegateEventSplitter); + var eventName = match[1], selector = match[2]; + method = _.bind(method, this); + eventName += '.delegateEvents' + this.cid; + if (selector === '') { + this.$el.on(eventName, method); + } else { + this.$el.on(eventName, selector, method); + } + } + return this; + }, + + // Clears all callbacks previously bound to the view with `delegateEvents`. + // You usually don't need to use this, but may wish to if you have multiple + // Backbone views attached to the same DOM element. + undelegateEvents: function() { + this.$el.off('.delegateEvents' + this.cid); + return this; + }, + + // Performs the initial configuration of a View with a set of options. + // Keys with special meaning *(e.g. model, collection, id, className)* are + // attached directly to the view. See `viewOptions` for an exhaustive + // list. + _configure: function(options) { + if (this.options) options = _.extend({}, _.result(this, 'options'), options); + _.extend(this, _.pick(options, viewOptions)); + this.options = options; + }, + + // Ensure that the View has a DOM element to render into. + // If `this.el` is a string, pass it through `$()`, take the first + // matching element, and re-assign it to `el`. Otherwise, create + // an element from the `id`, `className` and `tagName` properties. + _ensureElement: function() { + if (!this.el) { + var attrs = _.extend({}, _.result(this, 'attributes')); + if (this.id) attrs.id = _.result(this, 'id'); + if (this.className) attrs['class'] = _.result(this, 'className'); + var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs); + this.setElement($el, false); + } else { + this.setElement(_.result(this, 'el'), false); + } + } + + }); + + // Backbone.sync + // ------------- + + // Override this function to change the manner in which Backbone persists + // models to the server. You will be passed the type of request, and the + // model in question. By default, makes a RESTful Ajax request + // to the model's `url()`. Some possible customizations could be: + // + // * Use `setTimeout` to batch rapid-fire updates into a single request. + // * Send up the models as XML instead of JSON. + // * Persist models via WebSockets instead of Ajax. + // + // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests + // as `POST`, with a `_method` parameter containing the true HTTP method, + // as well as all requests with the body as `application/x-www-form-urlencoded` + // instead of `application/json` with the model in a param named `model`. + // Useful when interfacing with server-side languages like **PHP** that make + // it difficult to read the body of `PUT` requests. + Backbone.sync = function(method, model, options) { + var type = methodMap[method]; + + // Default options, unless specified. + _.defaults(options || (options = {}), { + emulateHTTP: Backbone.emulateHTTP, + emulateJSON: Backbone.emulateJSON + }); + + // Default JSON-request options. + var params = {type: type, dataType: 'json'}; + + // Ensure that we have a URL. + if (!options.url) { + params.url = _.result(model, 'url') || urlError(); + } + + // Ensure that we have the appropriate request data. + if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { + params.contentType = 'application/json'; + params.data = JSON.stringify(options.attrs || model.toJSON(options)); + } + + // For older servers, emulate JSON by encoding the request into an HTML-form. + if (options.emulateJSON) { + params.contentType = 'application/x-www-form-urlencoded'; + params.data = params.data ? {model: params.data} : {}; + } + + // For older servers, emulate HTTP by mimicking the HTTP method with `_method` + // And an `X-HTTP-Method-Override` header. + if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { + params.type = 'POST'; + if (options.emulateJSON) params.data._method = type; + var beforeSend = options.beforeSend; + options.beforeSend = function(xhr) { + xhr.setRequestHeader('X-HTTP-Method-Override', type); + if (beforeSend) return beforeSend.apply(this, arguments); + }; + } + + // Don't process data on a non-GET request. + if (params.type !== 'GET' && !options.emulateJSON) { + params.processData = false; + } + + // If we're sending a `PATCH` request, and we're in an old Internet Explorer + // that still has ActiveX enabled by default, override jQuery to use that + // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8. + if (params.type === 'PATCH' && window.ActiveXObject && + !(window.external && window.external.msActiveXFilteringEnabled)) { + params.xhr = function() { + return new ActiveXObject("Microsoft.XMLHTTP"); + }; + } + + // Make the request, allowing the user to override any Ajax options. + var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); + model.trigger('request', model, xhr, options); + return xhr; + }; + + // Map from CRUD to HTTP for our default `Backbone.sync` implementation. + var methodMap = { + 'create': 'POST', + 'update': 'PUT', + 'patch': 'PATCH', + 'delete': 'DELETE', + 'read': 'GET' + }; + + // Set the default implementation of `Backbone.ajax` to proxy through to `$`. + // Override this if you'd like to use a different library. + Backbone.ajax = function() { + return Backbone.$.ajax.apply(Backbone.$, arguments); + }; + + // Backbone.Router + // --------------- + + // Routers map faux-URLs to actions, and fire events when routes are + // matched. Creating a new one sets its `routes` hash, if not set statically. + var Router = Backbone.Router = function(options) { + options || (options = {}); + if (options.routes) this.routes = options.routes; + this._bindRoutes(); + this.initialize.apply(this, arguments); + }; + + // Cached regular expressions for matching named param parts and splatted + // parts of route strings. + var optionalParam = /\((.*?)\)/g; + var namedParam = /(\(\?)?:\w+/g; + var splatParam = /\*\w+/g; + var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; + + // Set up all inheritable **Backbone.Router** properties and methods. + _.extend(Router.prototype, Events, { + + // Initialize is an empty function by default. Override it with your own + // initialization logic. + initialize: function(){}, + + // Manually bind a single named route to a callback. For example: + // + // this.route('search/:query/p:num', 'search', function(query, num) { + // ... + // }); + // + route: function(route, name, callback) { + if (!_.isRegExp(route)) route = this._routeToRegExp(route); + if (_.isFunction(name)) { + callback = name; + name = ''; + } + if (!callback) callback = this[name]; + var router = this; + Backbone.history.route(route, function(fragment) { + var args = router._extractParameters(route, fragment); + callback && callback.apply(router, args); + router.trigger.apply(router, ['route:' + name].concat(args)); + router.trigger('route', name, args); + Backbone.history.trigger('route', router, name, args); + }); + return this; + }, + + // Simple proxy to `Backbone.history` to save a fragment into the history. + navigate: function(fragment, options) { + Backbone.history.navigate(fragment, options); + return this; + }, + + // Bind all defined routes to `Backbone.history`. We have to reverse the + // order of the routes here to support behavior where the most general + // routes can be defined at the bottom of the route map. + _bindRoutes: function() { + if (!this.routes) return; + this.routes = _.result(this, 'routes'); + var route, routes = _.keys(this.routes); + while ((route = routes.pop()) != null) { + this.route(route, this.routes[route]); + } + }, + + // Convert a route string into a regular expression, suitable for matching + // against the current location hash. + _routeToRegExp: function(route) { + route = route.replace(escapeRegExp, '\\$&') + .replace(optionalParam, '(?:$1)?') + .replace(namedParam, function(match, optional){ + return optional ? match : '([^\/]+)'; + }) + .replace(splatParam, '(.*?)'); + return new RegExp('^' + route + '$'); + }, + + // Given a route, and a URL fragment that it matches, return the array of + // extracted decoded parameters. Empty or unmatched parameters will be + // treated as `null` to normalize cross-browser behavior. + _extractParameters: function(route, fragment) { + var params = route.exec(fragment).slice(1); + return _.map(params, function(param) { + return param ? decodeURIComponent(param) : null; + }); + } + + }); + + // Backbone.History + // ---------------- + + // Handles cross-browser history management, based on either + // [pushState](http://diveintohtml5.info/history.html) and real URLs, or + // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) + // and URL fragments. If the browser supports neither (old IE, natch), + // falls back to polling. + var History = Backbone.History = function() { + this.handlers = []; + _.bindAll(this, 'checkUrl'); + + // Ensure that `History` can be used outside of the browser. + if (typeof window !== 'undefined') { + this.location = window.location; + this.history = window.history; + } + }; + + // Cached regex for stripping a leading hash/slash and trailing space. + var routeStripper = /^[#\/]|\s+$/g; + + // Cached regex for stripping leading and trailing slashes. + var rootStripper = /^\/+|\/+$/g; + + // Cached regex for detecting MSIE. + var isExplorer = /msie [\w.]+/; + + // Cached regex for removing a trailing slash. + var trailingSlash = /\/$/; + + // Has the history handling already been started? + History.started = false; + + // Set up all inheritable **Backbone.History** properties and methods. + _.extend(History.prototype, Events, { + + // The default interval to poll for hash changes, if necessary, is + // twenty times a second. + interval: 50, + + // Gets the true hash value. Cannot use location.hash directly due to bug + // in Firefox where location.hash will always be decoded. + getHash: function(window) { + var match = (window || this).location.href.match(/#(.*)$/); + return match ? match[1] : ''; + }, + + // Get the cross-browser normalized URL fragment, either from the URL, + // the hash, or the override. + getFragment: function(fragment, forcePushState) { + if (fragment == null) { + if (this._hasPushState || !this._wantsHashChange || forcePushState) { + fragment = this.location.pathname; + var root = this.root.replace(trailingSlash, ''); + if (!fragment.indexOf(root)) fragment = fragment.substr(root.length); + } else { + fragment = this.getHash(); + } + } + return fragment.replace(routeStripper, ''); + }, + + // Start the hash change handling, returning `true` if the current URL matches + // an existing route, and `false` otherwise. + start: function(options) { + if (History.started) throw new Error("Backbone.history has already been started"); + History.started = true; + + // Figure out the initial configuration. Do we need an iframe? + // Is pushState desired ... is it available? + this.options = _.extend({}, {root: '/'}, this.options, options); + this.root = this.options.root; + this._wantsHashChange = this.options.hashChange !== false; + this._wantsPushState = !!this.options.pushState; + this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); + var fragment = this.getFragment(); + var docMode = document.documentMode; + var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); + + // Normalize root to always include a leading and trailing slash. + this.root = ('/' + this.root + '/').replace(rootStripper, '/'); + + if (oldIE && this._wantsHashChange) { + this.iframe = Backbone.$(' -

    - Request Invite -

    - From 0a29bed8563c3a6f6e5e4347d768fffa8ccefb5d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 2 Aug 2014 13:48:41 -0400 Subject: [PATCH 018/600] fixed topics and synapses placing on map issue --- .../javascripts/metamaps/Metamaps.Router.js | 4 ++-- app/assets/javascripts/metamaps/metamaps.js | 24 ++++--------------- app/views/main/home.html.erb | 3 +-- 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 812b9108..7ecb49b3 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -14,7 +14,7 @@ }); Metamaps.Router = new Router(); Metamaps.Router.init = function () { - Backbone.history.start({ + /*Backbone.history.start({ pushState: true, root: '' }); @@ -30,6 +30,6 @@ evt.preventDefault(); Backbone.history.navigate(href.attr, true); } - }); + });*/ } })(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/metamaps.js b/app/assets/javascripts/metamaps/metamaps.js index cc796c14..ea0addf8 100644 --- a/app/assets/javascripts/metamaps/metamaps.js +++ b/app/assets/javascripts/metamaps/metamaps.js @@ -132,13 +132,6 @@ Metamaps.Backbone.init = function () { topic_id: this.isNew() ? this.cid : this.id }); }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('topic_id', this.id); - } - }, createNode: function () { var mapping; var node = { @@ -229,13 +222,6 @@ Metamaps.Backbone.init = function () { synapse_id: this.isNew() ? this.cid : this.id }); }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('synapse_id', this.id); - } - }, createEdge: function () { var mapping, mappingID; var synapseID = this.isNew() ? this.cid : this.id; @@ -2261,8 +2247,8 @@ Metamaps.Topic = { } else { Metamaps.Visualize.mGraph.loadJSON(newnode); nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - mapping.set('node', nodeOnViz); - mapping.updateNode(); // links the topic and the mapping to the node + topic.set('node', nodeOnViz); + topic.updateNode(); // links the topic and the mapping to the node nodeOnViz.setData("dim", 1, "start"); nodeOnViz.setData("dim", 25, "end"); @@ -2283,9 +2269,8 @@ Metamaps.Topic = { if (topic.isNew()) { topic.save(null, { success: function (topicModel, response) { - topicModel.updateMapping(); if (Metamaps.Active.Map) { - mapping.save(); + mapping.save({ topic_id: topicModel.id }); } }, error: function (model, response) { @@ -2401,9 +2386,8 @@ Metamaps.Synapse = { if (synapse.isNew()) { synapse.save(null, { success: function (synapseModel, response) { - synapseModel.updateMapping(); if (Metamaps.Active.Map) { - mapping.save(); + mapping.save({ synapse_id: synapseModel.id }); } }, error: function (model, response) { diff --git a/app/views/main/home.html.erb b/app/views/main/home.html.erb index 501a75ff..dc485e1a 100644 --- a/app/views/main/home.html.erb +++ b/app/views/main/home.html.erb @@ -101,11 +101,10 @@ $(document).ready(function() {
    Displaying:
    From 2b267ea0c66f45d8ed2346bc27f1087beff61dbd Mon Sep 17 00:00:00 2001 From: Tadasu85 Date: Sat, 2 Aug 2014 13:49:51 -0400 Subject: [PATCH 019/600] filterbox progress --- app/assets/images/icons/synapsevisualize.png | Bin 0 -> 909 bytes .../javascripts/metamaps/Metamaps.Router.js | 6 +- .../javascripts/metamaps/Metamaps.Router.js~ | 35 + app/assets/javascripts/metamaps/Metamaps.js | 2713 +++++++++++++++++ app/assets/javascripts/metamaps/Metamaps.js~ | 2711 ++++++++++++++++ app/views/maps/show.html.erb | 6 +- app/views/maps/show.html.erb~ | 82 + app/views/shared/_filterBox.html.erb | 44 + app/views/shared/_filterBox.html.erb~ | 42 + db/schema.rb | 258 +- 10 files changed, 5761 insertions(+), 136 deletions(-) create mode 100644 app/assets/images/icons/synapsevisualize.png create mode 100644 app/assets/javascripts/metamaps/Metamaps.Router.js~ create mode 100644 app/assets/javascripts/metamaps/Metamaps.js create mode 100644 app/assets/javascripts/metamaps/Metamaps.js~ create mode 100644 app/views/maps/show.html.erb~ create mode 100644 app/views/shared/_filterBox.html.erb create mode 100644 app/views/shared/_filterBox.html.erb~ diff --git a/app/assets/images/icons/synapsevisualize.png b/app/assets/images/icons/synapsevisualize.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f85f59c5d5d7d3486ef38e256193de8f143a30 GIT binary patch literal 909 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPq2a}+pk-F*4i3|+PQl2i3Ar-gY-Zu2P?I6PTV1KCf zgPTH!J>6yoJaf?z?a_#on6&oH)V+~s-}r1i@@(BUiHW;5mSi50=wwyhd{vVxsEs2n zJ>g|Qvqyo@{M=cG|J`Q;bxhGYhIhHs2-m~Jo{ zup2OcU_Zdypsjeslsh2i(SGJ1YzwqLZWTDNQ{WLh_XOLI@r*kdv@CZ?G8eQ6*hez# zeDa&&4AX9&76CEt4VEA0GyY+^P|^DCH-le`0KeAXbMm6n0<9|cT}l=6w*M(pekZSU z;MHxvcTfD)gl}x?t=c>9OQCY#VI~!ug0o7K-tW>g@jZO;;>A^IX)^t+701rrKA2$8 z@OoFrB96CZzpp-?x{TqY&HhQ|KOF@Wx|Ck*+L!mme$|n}$cBoEQ*RzU%G#t*QFS-R z?7#P&AQ6RoaVygP?tB0H#rNO->&@@{o*w%6NA%as(;xdc`x)2XKb~O{HRq9u)CCh? zvwvT!^$s{rd-A=?_RhU~dVAJq&N}l}z4*^2(S-PAAMf6kwK-os@lVgPid|ij%^5BR+o5T{-eHR<>JgmHT>Irki4lSO;4VklAkLnjQK4aKo zQv7EN&tZq{w|%RvXYK#abmp4wA+^bzY|V_TuD&`{{NUd|yN$JL!f0ADOMXdDk}lYmt1kB7!v}$Bs(YW_7k4t*KC?M@eM^3d6o32SBTu$Rt<^a>y)XV4 zQ;a9?_4L*E+?Qo8yIG^HQumTeV169O<#R35md{+4c`CLG->FVdQ&MBb@0Lf{TSO5S3 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 812b9108..6fd212c4 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -14,7 +14,7 @@ }); Metamaps.Router = new Router(); Metamaps.Router.init = function () { - Backbone.history.start({ + /*Backbone.history.start({ pushState: true, root: '' }); @@ -30,6 +30,6 @@ evt.preventDefault(); Backbone.history.navigate(href.attr, true); } - }); + });*/ } -})(); \ No newline at end of file +})(); diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js~ b/app/assets/javascripts/metamaps/Metamaps.Router.js~ new file mode 100644 index 00000000..812b9108 --- /dev/null +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js~ @@ -0,0 +1,35 @@ +(function () { + var Router = Backbone.Router.extend({ + routes: { + "": "home", // #home + "explore/:section": "explore", // #explore/active + "maps/:id": "maps" // #maps/7 + }, + explore: function (section) { + console.log(section); + }, + maps: function (id) { + console.log(id); + } + }); + Metamaps.Router = new Router(); + Metamaps.Router.init = function () { + Backbone.history.start({ + pushState: true, + root: '' + }); + console.log('router started'); + $(document).on("click", "a:not([data-bypass])", function (evt) { + var href = { + prop: $(this).prop("href"), + attr: $(this).attr("href") + }; + var root = location.protocol + "//" + location.host + Backbone.history.options.root; + + if (href.prop && href.prop.slice(0, root.length) === root) { + evt.preventDefault(); + Backbone.history.navigate(href.attr, true); + } + }); + } +})(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js new file mode 100644 index 00000000..d84b47a9 --- /dev/null +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -0,0 +1,2713 @@ +var labelType, useGradients, nativeTextSupport, animate; + +(function () { + var ua = navigator.userAgent, + iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i), + typeOfCanvas = typeof HTMLCanvasElement, + nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'), + textSupport = nativeCanvasSupport && (typeof document.createElement('canvas').getContext('2d').fillText == 'function'); + //I'm setting this based on the fact that ExCanvas provides text support for IE + //and that as of today iPhone/iPad current text support is lame + labelType = (!nativeCanvasSupport || (textSupport && !iStuff)) ? 'Native' : 'HTML'; + nativeTextSupport = labelType == 'Native'; + useGradients = nativeCanvasSupport; + animate = !(iStuff || !nativeCanvasSupport); +})(); + +// TODO eliminate these 4 global variables +var panningInt; // this variable is used to store a 'setInterval' for the Metamaps.JIT.SmoothPanning() function, so that it can be cleared with window.clearInterval +var tempNode = null, + tempInit = false, + tempNode2 = null; + +Metamaps.Settings = { + embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages + sandbox: false, // puts the app into a mode (when true) where it only creates data locally, and isn't writing it to the database + colors: { + background: '#344A58', + synapses: { + normal: '#222222', + hover: '#222222', + selected: '#FFFFFF' + }, + topics: { + selected: '#FFFFFF' + }, + labels: { + background: '#18202E', + text: '#DDD' + } + } +}; + +Metamaps.Touch = { + touchPos: null, // this stores the x and y values of a current touch event + touchDragNode: null // this stores a reference to a JIT node that is being dragged +}; + +Metamaps.Mouse = { + didPan: false, + changeInX: 0, + changeInY: 0, + edgeHoveringOver: false, + boxStartCoordinates: false, + boxEndCoordinates: false, + synapseStartCoordinates: [], + synapseEndCoordinates: null, + lastNodeClick: 0, + lastCanvasClick: 0, + DOUBLE_CLICK_TOLERANCE: 300 +}; + +Metamaps.Selected = { + Nodes: [], + Edges: [] +}; + +Metamaps.Metacodes = {}; // will be initialized in Metamaps.Backbone.init as a MetacodeCollection +Metamaps.Topics = {}; // will be initialized in Metamaps.Backbone.init as a TopicCollection +Metamaps.Synapses = {}; // will be initialized in Metamaps.Backbone.init as a SynapseCollection +Metamaps.Mappings = {}; // will be initialized in Metamaps.Backbone.init as a MappingCollection + + +/* + * + * BACKBONE + * + */ +Metamaps.Backbone.init = function () { + var self = Metamaps.Backbone; + + self.Metacode = Backbone.Model.extend({ + initialize: function () { + var image = new Image(); + image.src = this.get('icon'); + this.set('image',image); + } + }); + self.MetacodeCollection = Backbone.Collection.extend({ + model: this.Metacode, + url: '/metacodes', + }); + + self.Topic = Backbone.Model.extend({ + urlRoot: '/topics', + blacklist: ['node', 'created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "desc": '', + "link": '', + "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons' + }); + } + }, + authorizeToEdit: function (mapper) { + if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; + else return false; + }, + authorizePermissionChange: function (mapper) { + if (mapper && this.get('user_id') === mapper.get('id')) return true; + else return false; + }, + getDate: function () { + + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getMetacode: function () { + return Metamaps.Metacodes.get(this.get('metacode_id')); + }, + getMapping: function () { + + if (!Metamaps.Active.Map) return false; + + return Metamaps.Mappings.findWhere({ + map_id: Metamaps.Active.Map.id, + topic_id: this.isNew() ? this.cid : this.id + }); + }, + updateMapping: function () { + var mapping = this.getMapping(); + + if (mapping) { + mapping.set('topic_id', this.id); + } + }, + createNode: function () { + var mapping; + var node = { + adjacencies: [], + id: this.isNew() ? this.cid : this.id, + name: this.get('name') + }; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + node.data = { + $mapping: null, + $mappingID: mapping.id + }; + } + + return node; + }, + updateNode: function () { + var mapping; + var node = this.get('node'); + node.setData('topic', this); + node.id = this.isNew() ? this.cid : this.id; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + node.setData('mapping', mapping); + } + + return node; + }, + }); + + self.TopicCollection = Backbone.Collection.extend({ + model: self.Topic, + url: '/topics', + comparator: function (a, b) { + a = a.get('name').toLowerCase(); + b = b.get('name').toLowerCase(); + return a > b ? 1 : a < b ? -1 : 0; + } + }); + + self.Synapse = Backbone.Model.extend({ + urlRoot: '/synapses', + blacklist: ['edge', 'created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons', + "category": "from-to" + }); + } + }, + authorizeToEdit: function (mapper) { + if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; + else return false; + }, + authorizePermissionChange: function (mapper) { + if (mapper && this.get('user_id') === mapper.get('id')) return true; + else return false; + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getTopic1: function () { + return Metamaps.Topic.get(this.get('node1_id')); + }, + getTopic2: function () { + return Metamaps.Topic.get(this.get('node2_id')); + }, + getDirection: function () { + return [ + this.get('node1_id'), + this.get('node2_id') + ]; + }, + getMapping: function () { + + if (!Metamaps.Active.Map) return false; + + return Metamaps.Mappings.findWhere({ + map_id: Metamaps.Active.Map.id, + synapse_id: this.isNew() ? this.cid : this.id + }); + }, + updateMapping: function () { + var mapping = this.getMapping(); + + if (mapping) { + mapping.set('synapse_id', this.id); + } + }, + createEdge: function () { + var mapping, mappingID; + var synapseID = this.isNew() ? this.cid : this.id; + + var edge = { + nodeFrom: this.get('node1_id'), + nodeTo: this.get('node2_id'), + data: { + $synapses: [], + $synapseIDs: [synapseID], + } + }; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + mappingID = mapping.isNew() ? mapping.cid : mapping.id; + edge.data.$mappings = []; + edge.data.$mappingIDs = [mappingID]; + } + + return edge; + }, + updateEdge: function () { + var mapping; + var edge = this.get('edge'); + edge.getData('synapses').push(this); + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + edge.getData('mappings').push(mapping); + } + + return edge; + }, + }); + + self.SynapseCollection = Backbone.Collection.extend({ + model: self.Synapse, + url: '/synapses' + }); + + self.Mapping = Backbone.Model.extend({ + urlRoot: '/mappings', + blacklist: ['created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "map_id": Metamaps.Active.Map ? Metamaps.Active.Map.id : null + }); + } + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getMap: function () { + return Metamaps.Map.get(this.get('map_id')); + }, + getTopic: function () { + if (this.get('category') === 'Topic') return Metamaps.Topic.get(this.get('topic_id')); + else return false; + }, + getSynapse: function () { + if (this.get('category') === 'Synapse') return Metamaps.Synapse.get(this.get('synapse_id')); + else return false; + } + }); + + self.MappingCollection = Backbone.Collection.extend({ + model: self.Mapping, + url: '/mappings' + }); + + Metamaps.Metacodes = new self.MetacodeCollection(Metamaps.Metacodes); + + Metamaps.Topics = new self.TopicCollection(Metamaps.Topics); + + Metamaps.Synapses = new self.SynapseCollection(Metamaps.Synapses); + + Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); + + if (Metamaps.Active.Map) { + Metamaps.Active.Map = new self.Map(Metamaps.Active.Map); + Metamaps.Maps.add(Metamaps.Active.Map); + } + + if (Metamaps.Active.Topic) Metamaps.Active.Topic = new self.Topic(Metamaps.Active.Topic); +}; // end Metamaps.Backbone.init + + +/* + * + * CREATE + * + */ +Metamaps.Create = { + isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open + metacodeScrollerInit: false, // indicates whether the scrollbar in the custom metacode set space has been init + selectedMetacodeSet: null, + selectedMetacodeSetIndex: null, + selectedMetacodeNames: [], + newSelectedMetacodeNames: [], + selectedMetacodes: [], + newSelectedMetacodes: [], + init: function () { + var self = Metamaps.Create; + self.newTopic.init(); + self.newSynapse.init(); + + ////// + ////// + //// SWITCHING METACODE SETS + + $('#metacodeSwitchTabs').tabs({ + selected: self.selectedMetacodeSetIndex + }).addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#metacodeSwitchTabs .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + $('.customMetacodeList li').click(self.toggleMetacodeSelected); // within the custom metacode set tab + }, + toggleMetacodeSelected: function () { + var self = Metamaps.Create; + + if ($(this).attr('class') != 'toggledOff') { + $(this).addClass('toggledOff'); + var value_to_remove = $(this).attr('id'); + var name_to_remove = $(this).attr('data-name'); + self.newSelectedMetacodes.splice(self.newSelectedMetacodes.indexOf(value_to_remove), 1); + self.newSelectedMetacodeNames.splice(self.newSelectedMetacodeNames.indexOf(name_to_remove), 1); + } else if ($(this).attr('class') == 'toggledOff') { + $(this).removeClass('toggledOff'); + self.newSelectedMetacodes.push($(this).attr('id')); + self.newSelectedMetacodeNames.push($(this).attr('data-name')); + } + }, + updateMetacodeSet: function (set, index, custom) { + + if (custom && Metamaps.Create.newSelectedMetacodes.length == 0) { + alert('Please select at least one metacode to use!'); + return false; + } + + var codesToSwitchTo; + Metamaps.Create.selectedMetacodeSetIndex = index; + Metamaps.Create.selectedMetacodeSet = "metacodeset-" + set; + + if (!custom) { + codesToSwitchTo = $('#metacodeSwitchTabs' + set).attr('data-metacodes').split(','); + $('.customMetacodeList li').addClass('toggledOff'); + Metamaps.Create.selectedMetacodes = []; + Metamaps.Create.selectedMetacodeNames = []; + Metamaps.Create.newSelectedMetacodes = []; + Metamaps.Create.newSelectedMetacodeNames = []; + } + if (custom) { + // uses .slice to avoid setting the two arrays to the same actual array + Metamaps.Create.selectedMetacodes = Metamaps.Create.newSelectedMetacodes.slice(0); + Metamaps.Create.selectedMetacodeNames = Metamaps.Create.newSelectedMetacodeNames.slice(0); + codesToSwitchTo = Metamaps.Create.selectedMetacodeNames.slice(0); + } + + // sort by name + codesToSwitchTo.sort(); + codesToSwitchTo.reverse(); + + $('#metacodeImg, #metacodeImgTitle').empty(); + $('#metacodeImg').removeData('cloudcarousel'); + var newMetacodes = ""; + var metacode; + for (var i = 0; i < codesToSwitchTo.length; i++) { + metacode = Metamaps.Metacodes.findWhere({ name: codesToSwitchTo[i] }); + newMetacodes += '' + metacode.get('name') + ''; + }; + $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({ + titleBox: $('#metacodeImgTitle'), + yRadius: 40, + xPos: 150, + yPos: 40, + speed: 0.3, + mouseWheel: true, + bringToFront: true + }); + + Metamaps.GlobalUI.closeLightbox(); + $('#topic_name').focus(); + + var mdata = { + "metacodes": { + "value": custom ? Metamaps.Create.selectedMetacodes.toString() : Metamaps.Create.selectedMetacodeSet + } + }; + $.ajax({ + type: "POST", + dataType: 'json', + url: "/user/updatemetacodes", + data: mdata, + success: function (data) { + console.log('selected metacodes saved'); + }, + error: function () { + console.log('failed to save selected metacodes'); + } + }); + }, + + cancelMetacodeSetSwitch: function () { + var self = Metamaps.Create; + self.isSwitchingSet = false; + + if (self.selectedMetacodeSet != "metacodeset-custom") { + $('.customMetacodeList li').addClass('toggledOff'); + self.selectedMetacodes = []; + self.selectedMetacodeNames = []; + self.newSelectedMetacodes = []; + self.newSelectedMetacodeNames = []; + } else { // custom set is selected + // reset it to the current actual selection + $('.customMetacodeList li').addClass('toggledOff'); + for (var i = 0; i < self.selectedMetacodes.length; i++) { + $('#' + self.selectedMetacodes[i]).removeClass('toggledOff'); + }; + // uses .slice to avoid setting the two arrays to the same actual array + self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0); + self.newSelectedMetacodes = self.selectedMetacodes.slice(0); + } + $('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex); + $('#topic_name').focus(); + }, + newTopic: { + init: function () { + $('#new_topic').bind('contextmenu', function (e) { + return false; + }); + + $('#topic_name').keyup(function () { + Metamaps.Create.newTopic.name = $(this).val(); + }); + + // initialize the autocomplete results for the metacode spinner + $('#topic_name').typeahead([ + { + name: 'topic_autocomplete', + limit: 8, + template: $('#topicAutocompleteTemplate').html(), + remote: { + url: '/topics/autocomplete_topic?term=%QUERY' + }, + engine: Hogan + } + ]); + + // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete + $('#topic_name').bind('typeahead:selected', function (event, datum, dataset) { + Metamaps.Topic.getTopicFromAutocomplete(datum.id); + }); + + // initialize metacode spinner and then hide it + $("#metacodeImg").CloudCarousel({ + titleBox: $('#metacodeImgTitle'), + yRadius: 40, + xPos: 150, + yPos: 40, + speed: 0.3, + mouseWheel: true, + bringToFront: true + }); + $('.new_topic').hide(); + }, + name: null, + newId: 1, + beingCreated: false, + metacode: null, + x: null, + y: null, + addSynapse: false, + open: function () { + $('#new_topic').fadeIn('fast', function () { + $('#topic_name').focus(); + }); + Metamaps.Create.newTopic.beingCreated = true; + }, + hide: function () { + $('#new_topic').fadeOut('fast'); + $("#topic_name").typeahead('setQuery', ''); + Metamaps.Create.newTopic.beingCreated = false; + } + }, + newSynapse: { + init: function () { + var self = Metamaps.Create.newSynapse; + + // keep the right click menu from opening + $('#new_synapse').bind('contextmenu', function (e) { + return false; + }); + + $('#synapse_desc').keyup(function () { + Metamaps.Create.newSynapse.description = $(this).val(); + }); + + // initialize the autocomplete results for synapse creation + $('#synapse_desc').typeahead([ + { + name: 'synapse_autocomplete', + template: "
    {{label}}
    ", + remote: { + url: '/search/synapses?term=%QUERY' + }, + engine: Hogan + }, + { + name: 'existing_synapses', + limit: 50, + template: $('#synapseAutocompleteTemplate').html(), + remote: { + url: '/search/synapses', + replace: function () { + return self.getSearchQuery(); + } + }, + engine: Hogan, + header: "

    Existing Synapses

    " + } + ]); + + $('#synapse_desc').bind('typeahead:selected', function (event, datum, dataset) { + if (datum.id) { // if they clicked on an existing synapse get it + Metamaps.Synapse.getSynapseFromAutocomplete(datum.id); + } + }); + }, + beingCreated: false, + description: null, + topic1id: null, + topic2id: null, + newSynapseId: null, + open: function () { + $('#new_synapse').fadeIn('fast', function () { + $('#synapse_desc').focus(); + }); + Metamaps.Create.newSynapse.beingCreated = true; + }, + hide: function () { + $('#new_synapse').fadeOut('fast'); + $("#synapse_desc").typeahead('setQuery', ''); + Metamaps.Create.newSynapse.beingCreated = false; + Metamaps.Create.newTopic.addSynapse = false; + Metamaps.Create.newSynapse.topic1id = 0; + Metamaps.Create.newSynapse.topic2id = 0; + }, + getSearchQuery: function () { + var self = Metamaps.Create.newSynapse; + + if (Metamaps.Selected.Nodes.length < 2) { + return '/search/synapses?topic1id=' + self.topic1id + '&topic2id=' + self.topic2id; + } else return ''; + } + } +}; // end Metamaps.Create + + +////////////////// TOPIC AND SYNAPSE CARDS ////////////////////////// + + +/* + * + * TOPICCARD + * + */ +Metamaps.TopicCard = { + openTopicCard: null, //stores the JIT local ID of the topic with the topic card open + init: function () { + + // initialize best_in_place editing + $('.authenticated div.permission.canEdit .best_in_place').best_in_place(); + + Metamaps.TopicCard.generateShowcardHTML = Hogan.compile($('#topicCardTemplate').html()); + + // initialize topic card draggability and resizability + $('.showcard').draggable({ + handle: ".metacodeImage" + }); + $('#showcard').resizable({ + maxHeight: 500, + maxWidth: 500, + minHeight: 320, + minWidth: 226, + resize: function (event, ui) { + var p = $('#showcard').find('.scroll'); + p.height(p.height()).mCustomScrollbar('update'); + } + }).css({ + display: 'none', + top: '300px', + left: '100px' + }); + }, + fadeInShowCard: function (topic) { + $('.showcard').fadeIn('fast'); + Metamaps.TopicCard.openTopicCard = topic.isNew() ? topic.cid : topic.id; + }, + /** + * Will open the Topic Card for the node that it's passed + * @param {$jit.Graph.Node} node + */ + showCard: function (node) { + + var topic = node.getData('topic'); + + //populate the card that's about to show with the right topics data + Metamaps.TopicCard.populateShowCard(topic); + Metamaps.TopicCard.fadeInShowCard(topic); + }, + hideCard: function () { + $('.showcard').fadeOut('fast'); + Metamaps.TopicCard.openTopicCard = null; + }, + bindShowCardListeners: function (topic) { + var self = Metamaps.TopicCard; + var showCard = document.getElementById('showcard'); + + var selectingMetacode = false; + // attach the listener that shows the metacode title when you hover over the image + $('.showcard .metacodeImage').mouseenter(function () { + $('.showcard .icon').css('z-index', '4'); + $('.showcard .metacodeTitle').show(); + }); + $('.showcard .linkItem.icon').mouseleave(function () { + if (!selectingMetacode) { + $('.showcard .metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + } + }); + + $('.showcard .metacodeTitle').click(function () { + if (!selectingMetacode) { + selectingMetacode = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + $('.metacodeSelect').show(); + // add the scroll bar to the list of metacode select options if it isn't already there + if (!$('.metacodeSelect ul').hasClass('mCustomScrollbar')) { + $('.metacodeSelect ul').mCustomScrollbar({ + mouseWheelPixels: 200, + advanced: { + updateOnContentResize: true + } + }); + + $('.metacodeSelect li').click(function () { + selectingMetacode = false; + var metacodeName = $(this).find('.mSelectName').text(); + var metacode = Metamaps.Metacodes.findWhere({ + name: metacodeName + }); + $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) + .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); + $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); + topic.save({ + metacode_id: metacode.id + }); + Metamaps.Visualize.mGraph.plot(); + $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.metacodeSelect').hide(); + setTimeout(function () { + $('.metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + }, 500); + }); + } + } else { + selectingMetacode = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.metacodeSelect').hide(); + } + }); + + + // ability to change permission + var selectingPermission = false; + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('.showcard .yourTopic .mapPerm').click(function () { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('.permissionSelect li').click(function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + topic.save({ + permission: permission + }); + $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('.permissionSelect').remove(); + event.stopPropagation(); + }); + } else { + selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.permissionSelect').remove(); + } + }); + } + + // when you're typing a description, resize the scroll box to have space + $('.best_in_place_desc textarea').bind('keyup', function () { + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + }); + + //bind best_in_place ajax callbacks + $(showCard).find('.best_in_place_name').bind("ajax:success", function () { + + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + + var name = $(this).html(); + topic.set("name", Metamaps.Util.decodeEntities(name)); + Metamaps.Visualize.mGraph.plot(); + }); + + $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { + this.innerHTML = this.innerHTML.replace(/\r/g, '') + + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + + var desc = $(this).html(); + topic.set("desc", desc); + }); + + $(showCard).find('.best_in_place_link').bind("ajax:success", function () { + var link = $(this).html(); + $(showCard).find('.go-link').attr('href', link); + topic.set("link", link); + }); + }, + populateShowCard: function (topic) { + var self = Metamaps.TopicCard; + + var showCard = document.getElementById('showcard'); + + $(showCard).find('.permission').remove(); + + var html = self.generateShowcardHTML.render(self.buildObject(topic)); + + if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { + var perm = document.createElement('div'); + + var string = 'permission canEdit'; + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) string += ' yourTopic'; + perm.className = string; + perm.innerHTML = html; + showCard.appendChild(perm); + } else { + var perm = document.createElement('div'); + perm.className = 'permission cannotEdit'; + perm.innerHTML = html; + showCard.appendChild(perm); + } + + Metamaps.TopicCard.bindShowCardListeners(topic); + }, + generateShowcardHTML: null, // will be initialized into a Hogan template within init function + //generateShowcardHTML + buildObject: function (topic) { + var nodeValues = {}; + var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); + + //link is rendered differently if user is logged out or in + var go_link, a_tag, close_a_tag; + if (!authorized) { + go_link = ''; + if (topic.get("link") != "") { + a_tag = ''; + close_a_tag = ''; + } else { + a_tag = ''; + close_a_tag = ''; + } + } else { + go_link = ''; + a_tag = ''; + close_a_tag = ''; + } + + var desc_nil = "Click to add description..."; + var link_nil = "Click to add link..."; + + nodeValues.permission = topic.get("permission"); + nodeValues.mk_permission = topic.get("permission").substring(0, 2); + //nodeValues.map_count = topic.get("inmaps").length; + //nodeValues.synapse_count = topic.get("synapseCount"); + nodeValues.id = topic.isNew() ? topic.cid : topic.id; + nodeValues.metacode = topic.getMetacode().get("name"); + nodeValues.metacode_class = 'mbg' + topic.getMetacode().get("name").replace(/\s/g, ''); + nodeValues.imgsrc = topic.getMetacode().get("icon"); + nodeValues.name = topic.get("name"); + nodeValues.userid = topic.get("user_id"); + nodeValues.username = topic.getUser().get("name"); + nodeValues.date = topic.getDate(); + + // the code for this is stored in /views/main/_metacodeOptions.html.erb + nodeValues.metacode_select = $('#metacodeOptions').html(); + nodeValues.go_link = go_link; + nodeValues.a_tag = a_tag; + nodeValues.close_a_tag = close_a_tag; + nodeValues.link_nil = link_nil; + nodeValues.link = (topic.get("link") == "" && authorized) ? link_nil : topic.get("link"); + nodeValues.desc_nil = desc_nil; + nodeValues.desc = (topic.get("desc") == "" && authorized) ? desc_nil : topic.get("desc"); + return nodeValues; + } +}; // end Metamaps.TopicCard + + +/* + * + * SYNAPSECARD + * + */ +Metamaps.SynapseCard = { + openSynapseCard: null, + showCard: function (edge, e) { + var self = Metamaps.SynapseCard; + + //reset so we don't interfere with other edges, but first, save its x and y + var myX = $('#edit_synapse').css('left'); + var myY = $('#edit_synapse').css('top'); + $('#edit_synapse').remove(); + + //so label is missing while editing + Metamaps.Control.deselectEdge(edge); + + var synapse = edge.getData('synapses')[0]; // for now, just get the first synapse + + //create the wrapper around the form elements, including permissions + //classes to make best_in_place happy + var edit_div = document.createElement('div'); + edit_div.setAttribute('id', 'edit_synapse'); + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + edit_div.className = 'permission canEdit'; + edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : ''; + } else { + edit_div.className = 'permission cannotEdit'; + } + $('.main .wrapper').append(edit_div); + + self.populateShowCard(synapse); + + //drop it in the right spot, activate it + $('#edit_synapse').css('position', 'absolute'); + if (e) { + $('#edit_synapse').css('left', e.clientX); + $('#edit_synapse').css('top', e.clientY); + } else { + $('#edit_synapse').css('left', myX); + $('#edit_synapse').css('top', myY); + } + //$('#edit_synapse_name').click(); //required in case name is empty + //$('#edit_synapse_name input').focus(); + $('#edit_synapse').show(); + + self.openSynapseCard = synapse.isNew() ? synapse.cid : synapse.id; + }, + + hideCard: function () { + $('#edit_synapse').remove(); + Metamaps.SynapseCard.openSynapseCard = null; + }, + + populateShowCard: function (synapse) { + var self = Metamaps.SynapseCard; + + self.add_name_form(synapse); + self.add_user_info(synapse); + self.add_perms_form(synapse); + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + self.add_direction_form(synapse); + } + }, + + add_name_form: function (synapse) { + var data_nil = 'Click to add description.'; + + // TODO make it so that this would work even in sandbox mode, + // currently with Best_in_place it won't + + //name editing form + $('#edit_synapse').append('
    '); + $('#edit_synapse_name').attr('class', 'best_in_place best_in_place_desc'); + $('#edit_synapse_name').attr('data-object', 'synapse'); + $('#edit_synapse_name').attr('data-attribute', 'desc'); + $('#edit_synapse_name').attr('data-type', 'textarea'); + $('#edit_synapse_name').attr('data-nil', data_nil); + $('#edit_synapse_name').attr('data-url', '/synapses/' + synapse.id); + $('#edit_synapse_name').html(synapse.get("desc")); + + //if edge data is blank or just whitespace, populate it with data_nil + if ($('#edit_synapse_name').html().trim() == '') { + $('#edit_synapse_name').html(data_nil); + } + + $('#edit_synapse_name').bind("ajax:success", function () { + var desc = $(this).html(); + if (desc == data_nil) { + synapse.set("desc", ''); + } else { + synapse.set("desc", desc); + } + Metamaps.Control.selectEdge(synapse.get('edge')); + Metamaps.Visualize.mGraph.plot(); + }); + }, + + add_user_info: function (synapse) { + var u = '
    '; + u += '
    Created by ' + synapse.getUser().get("name") + '
    '; + $('#edit_synapse').append(u); + }, + + add_perms_form: function (synapse) { + //permissions - if owner, also allow permission editing + $('#edit_synapse').append('
    '); + + // ability to change permission + var selectingPermission = false; + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('#edit_synapse.yourEdge .mapPerm').click(function () { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('#edit_synapse .permissionSelect li').click(function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + synapse.save({ + permission: permission, + }); + $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('#edit_synapse .permissionSelect').remove(); + event.stopPropagation(); + }); + } else { + selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('#edit_synapse .permissionSelect').remove(); + } + }); + } + }, //add_perms_form + + add_direction_form: function (synapse) { + //directionality checkboxes + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + + var edge = synapse.get('edge'); + + //determine which node is to the left and the right + //if directly in a line, top is left + if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || + edge.nodeFrom.pos.x == edge.nodeTo.pos.x && + edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { + var left = edge.nodeTo; + var right = edge.nodeFrom; + } else { + var left = edge.nodeFrom; + var right = edge.nodeTo; + } + + /* + * One node is actually on the left onscreen. Call it left, & the other right. + * If category is from-to, and that node is first, check the 'right' checkbox. + * Else check the 'left' checkbox since the arrow is incoming. + */ + + var directionCat = synapse.get('category'); //both, none, from-to + if (directionCat == 'from-to') { + var from_to = synapse.getDirection(); + if (from_to[0] == left.id) { + //check left checkbox + $('#edit_synapse_left').prop('checked', true); + } else { + //check right checkbox + $('#edit_synapse_right').prop('checked', true); + } + } else if (directionCat == 'both') { + //check both checkboxes + $('#edit_synapse_left').prop('checked', true); + $('#edit_synapse_right').prop('checked', true); + } + $('#edit_synapse_left, #edit_synapse_right').click(function () { + var leftChecked = $('#edit_synapse_left').is(':checked'); + var rightChecked = $('#edit_synapse_right').is(':checked'); + + var dir = synapse.getDirection(); + var dirCat = 'none'; + if (leftChecked && rightChecked) { + dirCat = 'both'; + } else if (!leftChecked && rightChecked) { + dirCat = 'from-to'; + dir = [right.id, left.id]; + } else if (leftChecked && !rightChecked) { + dirCat = 'from-to'; + dir = [left.id, right.id]; + } + + synapse.save({ + category: dirCat, + node1_id: dir[0], + node2_id: dir[1] + }); + Metamaps.Visualize.mGraph.plot(); + }); + } //add_direction_form +}; // end Metamaps.SynapseCard + + +////////////////////// END TOPIC AND SYNAPSE CARDS ////////////////////////////////// + + + + +/* + * + * VISUALIZE + * + */ +Metamaps.Visualize = { + mGraph: {}, // a reference to the graph object. + cameraPosition: null, // stores the camera position when using a 3D visualization + type: "ForceDirected", // the type of graph we're building, could be "RGraph", "ForceDirected", or "ForceDirected3D" + savedLayout: true, // indicates whether the map has a saved layout or not + loadLater: false, // indicates whether there is JSON that should be loaded right in the offset, or whether to wait till the first topic is created + target: null, // the selector representing the location to render the graph + init: function () { + var self = Metamaps.Visualize; + // disable awkward dragging of the canvas element that would sometimes happen + $('#infovis-canvas').on('dragstart', function (event) { + event.preventDefault(); + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchstart', function (event) { + event.preventDefault(); + self.mGraph.events.touched = true; + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchmove', function (event) { + //Metamaps.JIT.touchPanZoomHandler(event); + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchend touchcancel', function (event) { + lastDist = 0; + if (!self.mGraph.events.touchMoved && !Metamaps.Touch.touchDragNode) Metamaps.TopicCard.hideCurrentCard(); + self.mGraph.events.touched = self.mGraph.events.touchMoved = false; + Metamaps.Touch.touchDragNode = false; + }); + }, + render: function (targetID, vizData) { + var self = Metamaps.Visualize; + self.mGraph = {}; + self.target = targetID; + self.__buildGraph(vizData); + }, + computePositions: function () { + var self = Metamaps.Visualize, + mapping; + + if (self.type == "RGraph") { + self.mGraph.graph.eachNode(function (n) { + topic = Metamaps.Topics.get(n.id); + topic.set('node', n); + topic.updateNode(); + + n.eachAdjacency(function (edge) { + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } + }); + + var pos = n.getPos(); + pos.setc(-200, -200); + }); + self.mGraph.compute('end'); + } else if (self.type == "ForceDirected" && self.savedLayout) { + var i, l, startPos, endPos, topic, synapse; + + self.mGraph.graph.eachNode(function (n) { + topic = Metamaps.Topics.get(n.id); + topic.set('node', n); + topic.updateNode(); + mapping = topic.getMapping(); + + n.eachAdjacency(function (edge) { + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } + }); + + startPos = new $jit.Complex(0, 0); + endPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); + n.setPos(startPos, 'start'); + n.setPos(endPos, 'end'); + }); + } else if (self.type == "ForceDirected3D" || !self.savedLayout) { + self.mGraph.compute(); + } + }, + /** + * __buildGraph does the heavy lifting of creating the engine that renders the graph with the properties we desire + * + * @param vizData a json structure containing the data to be rendered. + */ + __buildGraph: function (vizData) { + var self = Metamaps.Visualize + RGraphSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); + + if (self.type == "RGraph") { + $jit.RGraph.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); + $jit.RGraph.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); + + RGraphSettings.background = Metamaps.JIT.RGraph.background; + RGraphSettings.levelDistance = Metamaps.JIT.RGraph.levelDistance; + + self.mGraph = new $jit.RGraph(RGraphSettings); + } else if (self.type == "ForceDirected") { + $jit.ForceDirected.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); + $jit.ForceDirected.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); + self.mGraph = new $jit.ForceDirected(Metamaps.JIT.ForceDirected.graphSettings); + } else if (self.type == "ForceDirected3D") { + // init ForceDirected3D + self.mGraph = new $jit.ForceDirected3D(Metamaps.JIT.ForceDirected3D.graphSettings); + self.cameraPosition = self.mGraph.canvas.canvases[0].camera.position; + } + + // load JSON data, if it's not empty + if (!self.loadLater) { + //load JSON data. + self.mGraph.loadJSON(vizData); + //compute positions and plot. + self.computePositions(); + if (self.type == "RGraph") { + self.mGraph.fx.animate(Metamaps.JIT.RGraph.animate); + } else if (self.type == "ForceDirected" && self.savedLayout) { + Metamaps.Organize.loadSavedLayout(); + } else if (self.type == "ForceDirected3D" || !self.savedLayout) { + self.mGraph.animate(Metamaps.JIT.ForceDirected.animateFDLayout); + } + } + } +}; // end Metamaps.Visualize + + +/* + * + * UTIL + * + */ +Metamaps.Util = { + // helper function to determine how many lines are needed + // Line Splitter Function + // copyright Stephen Chapman, 19th April 2006 + // you may copy this code but please keep the copyright notice as well + splitLine: function (st, n) { + var b = ''; + var s = st; + while (s.length > n) { + var c = s.substring(0, n); + var d = c.lastIndexOf(' '); + var e = c.lastIndexOf('\n'); + if (e != -1) d = e; + if (d == -1) d = n; + b += c.substring(0, d) + '\n'; + s = s.substring(d + 1); + } + return b + s; + }, + decodeEntities: function (desc) { + var str, temp = document.createElement('p'); + temp.innerHTML = desc; //browser handles the topics + str = temp.textContent || temp.innerText; + temp = null; //delete the element; + return str; + }, //decodeEntities + getDistance: function (p1, p2) { + return Math.sqrt(Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)); + }, + generateOptionsList: function (data) { + var newlist = ""; + for (var i = 0; i < data.length; i++) { + newlist = newlist + ''; + } + return newlist; + }, + checkURLisImage: function (url) { + // when the page reloads the following regular expression will be screwed up + // please replace it with this one before you save: /*backslashhere*.(jpeg|jpg|gif|png)$/ + return (url.match(/\.(jpeg|jpg|gif|png)$/) != null); + }, + checkURLisYoutubeVideo: function (url) { + return (url.match(/^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null); + } +}; // end Metamaps.Util + +/* + * + * REALTIME + * + */ +Metamaps.Realtime = { + // this is for the heroku staging environment + //Metamaps.Realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + // this is for metamaps.cc + //Metamaps.Realtime.socket = io.connect('http://metamaps.cc:5001'); + // this is for localhost development + //Metamaps.Realtime.socket = io.connect('http://localhost:5001'); + socket: null, + isOpen: false, + timeOut: null, + changing: false, + mappersOnMap: {}, + status: true, // stores whether realtime is True/On or False/Off + init: function () { + var self = Metamaps.Realtime; + + $(".realtimeOnOff").click(self.toggle); + + $(".sidebarCollaborate").hover(self.open, self.close); + + var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + + if (mapperm) { + self.socket = io.connect('http://localhost:5001'); + self.socket.on('connect', function () { + console.log('socket connected'); + self.setupSocket(); + }); + } + }, + toggle: function () { + var self = Metamaps.Realtime; + + if (!self.status) { + self.sendRealtimeOn(); + $(this).html('ON').removeClass('rtOff').addClass('rtOn'); + $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); + } else { + self.sendRealtimeOff(); + $(this).html('OFF').removeClass('rtOn').addClass('rtOff'); + $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); + } + self.status = !self.status; + $(".sidebarCollaborateIcon").toggleClass("blue"); + }, + open: function () { + var self = Metamaps.Realtime; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing) { + self.changing = true; + $('.sidebarCollaborateBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.Realtime; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + $('.sidebarCollaborateBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + setupSocket: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + var myId = Metamaps.Active.Mapper.id; + + socket.emit('newMapperNotify', { + userid: myId, + username: Metamaps.Active.Mapper.get("name"), + mapid: Metamaps.Active.Map.id + }); + + // if you're the 'new guy' update your list with who's already online + socket.on(myId + '-' + Metamaps.Active.Map.id + '-UpdateMapperList', self.updateMapperList); + + // receive word that there's a new mapper on the map + socket.on('maps-' + Metamaps.Active.Map.id + '-newmapper', self.newPeerOnMap); + + // receive word that a mapper left the map + socket.on('maps-' + Metamaps.Active.Map.id + '-lostmapper', self.lostPeerOnMap); + + // receive word that there's a mapper turned on realtime + socket.on('maps-' + Metamaps.Active.Map.id + '-newrealtime', self.newCollaborator); + + // receive word that there's a mapper turned on realtime + socket.on('maps-' + Metamaps.Active.Map.id + '-lostrealtime', self.lostCollaborator); + + socket.on('maps-' + Metamaps.Active.Map.id, self.contentUpdate); + }, + sendRealtimeOn: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // send this new mapper back your details, and the awareness that you're online + var update = { + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + mapid: Metamaps.Active.Map.id + }; + socket.emit('notifyStartRealtime', update); + }, + sendRealtimeOff: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // send this new mapper back your details, and the awareness that you're online + var update = { + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + mapid: Metamaps.Active.Map.id + }; + socket.emit('notifyStopRealtime', update); + }, + updateMapperList: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + // data.userrealtime + + self.mappersOnMap[data.userid] = { + name: data.username, + realtime: data.userrealtime + }; + + var onOff = data.userrealtime ? "On" : "Off"; + var mapperListItem = '
  • ' + data.username + '
  • '; + + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); + }, + newPeerOnMap: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid] = { + name: data.username, + realtime: true + }; + + var mapperListItem = '
  • ' + data.username + '
  • '; + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); + + Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); + + // send this new mapper back your details, and the awareness that you've loaded the map + var update = { + userToNotify: data.userid, + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + userrealtime: self.status, + mapid: Metamaps.Active.Map.id + }; + socket.emit('updateNewMapperList', update); + }, + lostPeerOnMap: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + delete self.mappersOnMap[data.userid]; + + $('#mapper' + data.userid).remove(); + + Metamaps.GlobalUI.notifyUser(data.username + ' just left the map'); + }, + newCollaborator: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid].realtime = true; + + $('#mapper' + data.userid).removeClass('littleRtOff').addClass('littleRtOn'); + + Metamaps.GlobalUI.notifyUser(data.username + ' just turned on realtime'); + }, + lostCollaborator: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid].realtime = false; + + $('#mapper' + data.userid).removeClass('littleRtOn').addClass('littleRtOff'); + + Metamaps.GlobalUI.notifyUser(data.username + ' just turned off realtime'); + }, + contentUpdate: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + var graph = Metamaps.Visualize.mGraph.graph; + + //as long as you weren't the origin of the changes, update your map + if (data.origin != Metamaps.Active.Mapper.id && self.status) { + if (data.resource == 'Topic') { + topic = $.parseJSON(data.obj); + + if (data.action == 'create') { + self.addTopicToMap(topic); + } else if (data.action == 'update' && graph.getNode(topic.id) != 'undefined') { + self.updateTopicOnMap(topic); + } else if (data.action == 'destroy' && graph.getNode(topic.id) != 'undefined') { + Metamaps.Control.hideNode(topic.id) + } + + return; + } else if (data.resource == 'Synapse') { + synapse = $.parseJSON(data.obj); + + if (data.action == 'create') { + self.addSynapseToMap(synapse); + } else if (data.action == 'update' && + graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { + self.updateSynapseOnMap(synapse); + } else if (data.action == 'destroy' && + graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { + var edge = graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']); + Metamaps.Control.hideEdge(edge); + } + + return; + } + } + }, + addTopicToMap: function (topic) { + + // TODO + var newPos, tempForT; + Metamaps.Visualize.mGraph.graph.addNode(topic); + tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); + tempForT.setData('dim', 1, 'start'); + tempForT.setData('dim', 25, 'end'); + newPos = new $jit.Complex(); + newPos.x = tempForT.data.$xloc; + newPos.y = tempForT.data.$yloc; + tempForT.setPos(newPos, 'start'); + tempForT.setPos(newPos, 'current'); + tempForT.setPos(newPos, 'end'); + Metamaps.Visualize.mGraph.fx.plotNode(tempForT, Metamaps.Visualize.mGraph.canvas); + }, + updateTopicOnMap: function (topic) { + + // TODO + var newPos, tempForT; + tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); + tempForT.data = topic.data; + tempForT.name = topic.name; + if (MetamapsModel.showcardInUse === topic.id) { + populateShowCard(tempForT); + } + newPos = new $jit.Complex(); + newPos.x = tempForT.data.$xloc; + newPos.y = tempForT.data.$yloc; + tempForT.setPos(newPos, 'start'); + tempForT.setPos(newPos, 'current'); + tempForT.setPos(newPos, 'end'); + return Metamaps.Visualize.mGraph.fx.animate({ + modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], + transition: $jit.Trans.Quad.easeInOut, + duration: 500 + }); + }, + addSynapseToMap: function (synapse) { + + // TODO + var Node1, Node2, tempForS; + Node1 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[0]); + Node2 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[1]); + Metamaps.Visualize.mGraph.graph.addAdjacence(Node1, Node2, {}); + tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(Node1.id, Node2.id); + tempForS.setDataset('start', { + lineWidth: 0.4 + }); + tempForS.setDataset('end', { + lineWidth: 2 + }); + tempForS.data = synapse.data; + Metamaps.Visualize.mGraph.fx.plotLine(tempForS, Metamaps.Visualize.mGraph.canvas); + return Metamaps.Visualize.mGraph.fx.animate({ + modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], + transition: $jit.Trans.Quad.easeInOut, + duration: 500 + }); + }, + updateSynapseOnMap: function (synapse) { + + // TODO + var k, tempForS, v, wasShowDesc, _ref; + tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(synapse.data.$direction[0], synapse.data.$direction[1]); + wasShowDesc = tempForS.data.$showDesc; + _ref = synapse.data; + for (k in _ref) { + v = _ref[k]; + tempForS.data[k] = v; + } + tempForS.data.$showDesc = wasShowDesc; + if (MetamapsModel.edgecardInUse === synapse.data.$id) { // TODO + editEdge(tempForS, false); + } + return Metamaps.Visualize.mGraph.plot(); + } +}; // end Metamaps.Realtime + + +/* + * + * CONTROL + * + */ +Metamaps.Control = { + init: function () { + + }, + selectNode: function (node) { + if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; + node.selected = true; + node.setData('dim', 30, 'current'); + node.eachAdjacency(function (adj) { + Metamaps.Control.selectEdge(adj); + }); + Metamaps.Selected.Nodes.push(node); + }, + deselectAllNodes: function () { + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + var node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.deselectNode(node); + } + Metamaps.Visualize.mGraph.plot(); + }, + deselectNode: function (node) { + delete node.selected; + node.eachAdjacency(function (adj) { + Metamaps.Control.deselectEdge(adj); + }); + node.setData('dim', 25, 'current'); + + //remove the node + Metamaps.Selected.Nodes.splice( + Metamaps.Selected.Nodes.indexOf(node), 1); + }, + deleteSelectedNodes: function () { // refers to deleting topics permanently + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + var node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.deleteNode(node.id); + } + }, + deleteNode: function (nodeid) { // refers to deleting topics permanently + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + var id = node.getData('id'); + Metamaps.Control.deselectNode(node); + Metamaps.Topics.get(id).destroy(); + Metamaps.Control.hideNode(nodeid); + }, + removeSelectedNodes: function () { // refers to removing topics permanently from a map + var l = Metamaps.Selected.Nodes.length, + i, + node, + mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + + if (mapperm) { + for (i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.removeNode(node.id); + } + } + }, + removeNode: function (nodeid) { // refers to removing topics permanently from a map + var mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + var mappingid = node.getData("mapping").id; + + if (mapperm) { + Metamaps.Control.deselectNode(node); + Metamaps.Mappings.get(mappingid).destroy(); + Metamaps.Control.hideNode(nodeid); + } + }, + hideSelectedNodes: function () { + var l = Metamaps.Selected.Nodes.length, + i, + node; + + for (i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.hideNode(node.id); + } + }, + hideNode: function (nodeid) { + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + if (nodeid == Metamaps.Visualize.mGraph.root) { // && Metamaps.Visualize.type === "RGraph" + alert("You can't hide this topic, it is the root of your graph."); + return; + } + + Metamaps.Control.deselectNode(node); + + node.setData('alpha', 0, 'end'); + node.eachAdjacency(function (adj) { + adj.setData('alpha', 0, 'end'); + }); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['node-property:alpha', + 'edge-property:alpha' + ], + duration: 500 + }); + setTimeout(function () { + Metamaps.Visualize.mGraph.graph.removeNode(nodeid); + }, 500); + }, + selectEdge: function (edge) { + if (Metamaps.Selected.Edges.indexOf(edge) != -1) return; + edge.setData('showDesc', true, 'current'); + if (!Metamaps.Settings.embed) { + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.selected, + alpha: 1 + }); + } else if (Metamaps.Settings.embed) { + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.selected, + alpha: 1 + }); + } + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:lineWidth:color:alpha'], + duration: 100 + }); + Metamaps.Selected.Edges.push(edge); + }, + deselectAllEdges: function () { + var l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + var edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.deselectEdge(edge); + } + Metamaps.Visualize.mGraph.plot(); + }, + deselectEdge: function (edge) { + edge.setData('showDesc', false, 'current'); + edge.setDataset('end', { + lineWidth: 2, + color: Metamaps.Settings.colors.synapses.normal, + alpha: 0.4 + }); + + if (Metamaps.Mouse.edgeHoveringOver == edge) { + edge.setData('showDesc', true, 'current'); + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.hover, + alpha: 1 + }); + } + + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:lineWidth:color:alpha'], + duration: 100 + }); + + //remove the edge + Metamaps.Selected.Edges.splice( + Metamaps.Selected.Edges.indexOf(edge), 1); + }, + deleteSelectedEdges: function () { // refers to deleting topics permanently + var edge, + l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.deleteEdge(edge); + } + }, + deleteEdge: function (edge) { + + // TODO make it so that you select which one, of multiple possible synapses you want to delete + + //var id = edge.getData("id"); + //Metamaps.Synapses.get(id).destroy(); + //Metamaps.Control.hideEdge(edge); + }, + removeSelectedEdges: function () { + var l = Metamaps.Selected.Edges.length, + i, + edge; + + if (Metamaps.Active.Map) { + for (i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.removeEdge(edge); + } + Metamaps.Selected.Edges = new Array(); + } + }, + removeEdge: function (edge) { + + // TODO make it so that you select which one, of multiple possible synapses you want + + //var mappingid = edge.getData("mappingid"); + //Metamaps.Mappings.get(mappingid).destroy(); + //Metamaps.Control.hideEdge(edge); + }, + hideSelectedEdges: function () { + var edge, + l = Metamaps.Selected.Edges.length, + i; + for (i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.hideEdge(edge); + } + Metamaps.Selected.Edges = new Array(); + }, + hideEdge: function (edge) { + var from = edge.nodeFrom.id; + var to = edge.nodeTo.id; + edge.setData('alpha', 0, 'end'); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:alpha'], + duration: 500 + }); + setTimeout(function () { + Metamaps.Visualize.mGraph.graph.removeAdjacence(from, to); + }, 500); + }, + updateSelectedPermissions: function (permission) { + + var edge, synapse, node, topic; + + Metamaps.GlobalUI.notifyUser('Working...'); + + // variables to keep track of how many nodes and synapses you had the ability to change the permission of + var nCount = 0, + sCount = 0; + + // change the permission of the selected synapses, if logged in user is the original creator + var l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + synapse = edge.getData('synapses')[0]; + + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + synapse.save({ + permission: permission + }); + sCount++; + } + } + + // change the permission of the selected topics, if logged in user is the original creator + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + topic = node.getData('topic'); + + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { + topic.save({ + permission: permission + }); + nCount++; + } + } + + var nString = nCount == 1 ? (nCount.toString() + ' topic and ') : (nCount.toString() + ' topics and '); + var sString = sCount == 1 ? (sCount.toString() + ' synapse') : (sCount.toString() + ' synapses'); + + var message = nString + sString + ' you created updated to ' + permission; + Metamaps.GlobalUI.notifyUser(message); + }, +}; // end Metamaps.Control + + +/* + * + * FILTER + * + */ +Metamaps.Filter = { + filters: { + name: "", + metacode: [], + mappers: [], + synapseTypes: [] + }, + isOpen: false, + timeOut: null, + changing: false, + init: function () { + var self = Metamaps.Filter; + + $(".sidebarFilter").hover(self.open, self.close); + + // initialize scroll bar for filter by metacode, then hide it and position it correctly again + $("#filter_by_metacode").mCustomScrollbar({ + mouseWheelPixels: 200, + advanced: { + updateOnContentResize: true + } + }); + $('.sidebarFilterBox').hide().css({ + position: 'absolute', + top: '45px', + right: '-36px' + }); + + $('.sidebarFilterBox .showAll').click(self.filterNoMetacodes); + $('.sidebarFilterBox .hideAll').click(self.filterAllMetacodes); + + // toggle visibility of topics with metacodes based on status in the filters list + $('#filter_by_metacode ul li').click(self.toggleMetacode); + }, + open: function () { + var self = Metamaps.Filter; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing) { + self.changing = true; + + $('.sidebarFilterBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.Filter; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + + $('.sidebarFilterBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + filterNoMetacodes: function (e) { + + $('#filter_by_metacode ul li').removeClass('toggledOff'); + + // TODO + /* + showAll(); + + for (var catVis in categoryVisible) { + categoryVisible[catVis] = true; + } + */ + }, + filterAllMetacodes: function (e) { + + $('#filter_by_metacode ul li').addClass('toggledOff'); + + // TODO + /* + hideAll(); + for (var catVis in categoryVisible) { + categoryVisible[catVis] = false; + } + */ + }, + toggleMetacode: function () { + + var category = $(this).children('img').attr('alt'); + + // TODO + /*switchVisible(category); + + // toggle the image and the boolean array value + if (categoryVisible[category] == true) { + $(this).addClass('toggledOff'); + categoryVisible[category] = false; + } else if (categoryVisible[category] == false) { + $(this).removeClass('toggledOff'); + categoryVisible[category] = true; + }*/ + }, + passFilters: function (topic) { + var self = Metamaps.Find; + var filters = self.filters; + + var passesName = filters.name == "" ? true : false, + passesType = filters.type == [] ? true : false; + + //filter by name + if (topic.get('1')[1][0].toLowerCase().indexOf(filters.name) !== -1) { + passesName = true; + } + // filter by type + if (!filters.type == []) { + // get the array of types that your topic 'is' + var metacodes = topic.get('2') ? topic.get('2')[1] : []; + if (_.intersection(filters.type, metacodes).length == 0) passesType = true; + } + + if (passesName && passesType) { + return true; + } else { + return false; + } + + + } +}; // end Metamaps.Filter + + +/* + * + * LISTENERS + * + */ +Metamaps.Listeners = { + + init: function () { + + $(document).on('keydown', function (e) { + switch (e.which) { + case 13: + Metamaps.JIT.enterKeyHandler(); + e.preventDefault(); + break; + case 27: + Metamaps.JIT.escKeyHandler(); + break; + default: + break; //alert(e.which); + } + }); + + //$(window).resize(function () { + // Metamaps.Visualize.mGraph.canvas.resize($(window).width(), $(window).height()); + //}); + } +}; // end Metamaps.Listeners + + +/* + * + * ORGANIZE + * + */ +Metamaps.Organize = { + init: function () { + + }, + arrange: function (layout, centerNode) { + + + // first option for layout to implement is 'grid', will do an evenly spaced grid with its center at the 0,0 origin + if (layout == 'grid') { + var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); // this will always be an integer, the # of nodes on your graph visualization + var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid + var GRIDSPACE = 400; + var row = 0; + var column = 0; + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (column == numColumns) { + column = 0; + row += 1; + } + var newPos = new $jit.Complex(); + newPos.x = column * GRIDSPACE; + newPos.y = row * GRIDSPACE; + n.setPos(newPos, 'end'); + column += 1; + }); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + } else if (layout == 'grid_full') { + + // this will always be an integer, the # of nodes on your graph visualization + var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); + //var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid + //var GRIDSPACE = 400; + var height = Metamaps.Visualize.mGraph.canvas.getSize(0).height; + var width = Metamaps.Visualize.mGraph.canvas.getSize(0).width; + var totalArea = height * width; + var cellArea = totalArea / numNodes; + var ratio = height / width; + var cellWidth = sqrt(cellArea / ratio); + var cellHeight = cellArea / cellWidth; + var row = floor(height / cellHeight); + var column = floor(width / cellWidth); + var totalCells = row * column; + + if (totalCells) + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (column == numColumns) { + column = 0; + row += 1; + } + var newPos = new $jit.Complex(); + newPos.x = column * GRIDSPACE; + newPos.y = row * GRIDSPACE; + n.setPos(newPos, 'end'); + column += 1; + }); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + } else if (layout == 'radial') { + + var centerX = centerNode.getPos().x; + var centerY = centerNode.getPos().y; + centerNode.setPos(centerNode.getPos(), 'end'); + + console.log(centerNode.adjacencies); + var lineLength = 200; + var usedNodes = {}; + usedNodes[centerNode.id] = centerNode; + var radial = function (node, level, degree) { + if (level == 1) { + var numLinksTemp = _.size(node.adjacencies); + var angleTemp = 2 * Math.PI / numLinksTemp; + } else { + angleTemp = 2 * Math.PI / 20 + }; + node.eachAdjacency(function (a) { + var isSecondLevelNode = (centerNode.adjacencies[a.nodeTo.id] != undefined && level > 1); + if (usedNodes[a.nodeTo.id] == undefined && !isSecondLevelNode) { + var newPos = new $jit.Complex(); + newPos.x = level * lineLength * Math.sin(degree) + centerX; + newPos.y = level * lineLength * Math.cos(degree) + centerY; + a.nodeTo.setPos(newPos, 'end'); + usedNodes[a.nodeTo.id] = a.nodeTo; + + radial(a.nodeTo, level + 1, degree); + degree += angleTemp; + }; + }); + }; + radial(centerNode, 1, 0); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + + } else if (layout == 'center_viewport') { + + var lowX = 0, + lowY = 0, + highX = 0, + highY = 0; + var oldOriginX = Metamaps.Visualize.mGraph.canvas.translateOffsetX; + var oldOriginY = Metamaps.Visualize.mGraph.canvas.translateOffsetY; + + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (n.id === 1) { + lowX = n.getPos().x; + lowY = n.getPos().y; + highX = n.getPos().x; + highY = n.getPos().y; + }; + if (n.getPos().x < lowX) lowX = n.getPos().x; + if (n.getPos().y < lowY) lowY = n.getPos().y; + if (n.getPos().x > highX) highX = n.getPos().x; + if (n.getPos().y > highY) highY = n.getPos().y; + }); + console.log(lowX, lowY, highX, highY); + var newOriginX = (lowX + highX) / 2; + var newOriginY = (lowY + highY) / 2; + + } else alert('please call function with a valid layout dammit!'); + }, + loadSavedLayout: function (id) { + Metamaps.Visualize.computePositions(); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + }, +}; // end Metamaps.Organize + + +/* + * + * TOPIC + * + */ +Metamaps.Topic = { + // this function is to retrieve a topic JSON object from the database + // @param id = the id of the topic to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Topics.get(id) == undefined) { + //console.log("Ajax call!"); + if (!callback) { + var e = $.ajax({ + url: "/topics/" + id + ".json", + async: false + }); + Metamaps.Topics.add($.parseJSON(e.responseText)); + return Metamaps.Topics.get(id); + } else { + return $.ajax({ + url: "/topics/" + id + ".json", + success: function (data) { + Metamaps.Topics.add(data); + callback(Metamaps.Topics.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Topics.get(id); + } else { + return callback(Metamaps.Topics.get(id)); + } + } + }, + + /* + * + * + */ + renderTopic: function (mapping, topic, createNewInDB) { + var self = Metamaps.Topic; + + var nodeOnViz, tempPos; + + var newnode = topic.createNode(); + + if (!$.isEmptyObject(Metamaps.Visualize.mGraph.graph.nodes)) { + Metamaps.Visualize.mGraph.graph.addNode(newnode); + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + n.setData("dim", 25, "start"); + n.setData("dim", 25, "end"); + }); + nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); + topic.set('node', nodeOnViz); + topic.updateNode(); // links the topic and the mapping to the node + + + nodeOnViz.setData("dim", 1, "start"); + nodeOnViz.setData("dim", 25, "end"); + if (Metamaps.Visualize.type === "RGraph") { + tempPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); + tempPos = tempPos.toPolar(); + nodeOnViz.setPos(tempPos, "current"); + nodeOnViz.setPos(tempPos, "start"); + nodeOnViz.setPos(tempPos, "end"); + } else if (Metamaps.Visualize.type === "ForceDirected") { + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); + } + if (Metamaps.Create.newTopic.addSynapse) { + Metamaps.Create.newSynapse.topic1id = tempNode.id; + Metamaps.Create.newSynapse.topic2id = nodeOnViz.id; + Metamaps.Create.newSynapse.open(); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + tempNode = null; + tempNode2 = null; + tempInit = false; + } + }); + } else { + Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + + } + }); + } + } else { + Metamaps.Visualize.mGraph.loadJSON(newnode); + nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); + topic.set('node', nodeOnViz); + topic.updateNode(); // links the topic and the mapping to the node + + nodeOnViz.setData("dim", 1, "start"); + nodeOnViz.setData("dim", 25, "end"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); + Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + + } + }); + } + + if (!Metamaps.Settings.sandbox && createNewInDB) { + if (topic.isNew()) { + topic.save(null, { + success: function (topicModel, response) { + topicModel.updateMapping(); + if (Metamaps.Active.Map) { + mapping.save(); + } + }, + error: function (model, response) { + console.log('error saving topic to database'); + } + }); + } else if (!topic.isNew() && Metamaps.Active.Map) { + mapping.save(); + } + } + }, + createTopicLocally: function () { + var self = Metamaps.Topic; + + var metacode = Metamaps.Metacodes.findWhere({ + name: Metamaps.Create.newTopic.metacode + }); + + var topic = new Metamaps.Backbone.Topic({ + name: Metamaps.Create.newTopic.name, + metacode_id: metacode.id + }); + Metamaps.Topics.add(topic); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Topic", + xloc: Metamaps.Create.newTopic.x, + yloc: Metamaps.Create.newTopic.y, + topic_id: topic.cid + }); + Metamaps.Mappings.add(mapping); + + //these can't happen until the value is retrieved, which happens in the line above + Metamaps.Create.newTopic.hide(); + + self.renderTopic(mapping, topic, true); // this function also includes the creation of the topic in the database + }, + getTopicFromAutocomplete: function (id) { + var self = Metamaps.Topic; + + Metamaps.Create.newTopic.hide(); + + var topic = self.get(id); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Topic", + xloc: Metamaps.Create.newTopic.x, + yloc: Metamaps.Create.newTopic.y, + topic_id: topic.id + }); + Metamaps.Mappings.add(mapping); + + self.renderTopic(mapping, topic, false); + } +}; // end Metamaps.Topic + + +/* + * + * SYNAPSE + * + */ +Metamaps.Synapse = { + // this function is to retrieve a synapse JSON object from the database + // @param id = the id of the synapse to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Synapses.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/synapses/" + id + ".json", + async: false + }); + Metamaps.Synapses.add($.parseJSON(e.responseText)); + return Metamaps.Synapses.get(id); + } else { + return $.ajax({ + url: "/synapses/" + id + ".json", + success: function (data) { + Metamaps.Synapses.add(data); + callback(Metamaps.Synapses.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Synapses.get(id); + } else { + return callback(Metamaps.Synapses.get(id)); + } + } + }, + /* + * + * + */ + renderSynapse: function (mapping, synapse, node1, node2, createNewInDB) { + var self = Metamaps.Synapse; + + var edgeOnViz; + + var newedge = synapse.createEdge(); + + Metamaps.Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data); + edgeOnViz = Metamaps.Visualize.mGraph.graph.getAdjacence(node1.id, node2.id); + synapse.set('edge', edgeOnViz); + synapse.updateEdge(); // links the topic and the mapping to the node + + Metamaps.Visualize.mGraph.fx.plotLine(edgeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Control.selectEdge(edgeOnViz); + + if (!Metamaps.Settings.sandbox && createNewInDB) { + if (synapse.isNew()) { + synapse.save(null, { + success: function (synapseModel, response) { + synapseModel.updateMapping(); + if (Metamaps.Active.Map) { + mapping.save(); + } + }, + error: function (model, response) { + console.log('error saving synapse to database'); + } + }); + } else if (!synapse.isNew() && Metamaps.Active.Map) { + mapping.save(); + } + } + }, + createSynapseLocally: function () { + var self = Metamaps.Synapse, + topic1, + topic2, + node1, + node2, + synapse, + mapping; + + //for each node in this array we will create a synapse going to the position2 node. + var synapsesToCreate = []; + + node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + topic2 = node2.getData('topic'); + + var len = Metamaps.Selected.Nodes.length; + if (len == 0) { + synapsesToCreate[0] = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); + } else if (len > 0) { + synapsesToCreate = Metamaps.Selected.Nodes; + } + + for (var i = 0; i < synapsesToCreate.length; i++) { + node1 = synapsesToCreate[i]; + topic1 = node1.getData('topic'); + synapse = new Metamaps.Backbone.Synapse({ + desc: Metamaps.Create.newSynapse.description, + node1_id: topic1.isNew() ? topic1.cid : topic1.id, + node2_id: topic2.isNew() ? topic2.cid : topic2.id, + }); + Metamaps.Synapses.add(synapse); + + mapping = new Metamaps.Backbone.Mapping({ + category: "Synapse", + synapse_id: synapse.cid + }); + Metamaps.Mappings.add(mapping); + + // this function also includes the creation of the synapse in the database + self.renderSynapse(mapping, synapse, node1, node2, true); + } // for each in synapsesToCreate + + Metamaps.Create.newSynapse.hide(); + }, + getSynapseFromAutocomplete: function (id) { + var self = Metamaps.Synapse, + node1, + node2; + + Metamaps.Create.newSynapse.hide(); + + var synapse = self.get(id); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Synapse", + synapse_id: synapse.id + }); + Metamaps.Mappings.add(mapping); + + node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); + node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + + self.renderSynapse(mapping, synapse, node1, node2, false); + } +}; // end Metamaps.Synapse + + +/* + * + * MAP + * + */ +Metamaps.Map = { + init: function () { + var self = Metamaps.Map; + + // prevent right clicks on the main canvas, so as to not get in the way of our right clicks + $('#center-container').bind('contextmenu', function (e) { + return false; + }); + + $('.sidebarFork').click(function () { + self.fork(); + }); + + Metamaps.GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html(); + + self.InfoBox.init(); + self.CheatSheet.init(); + }, + // this function is to retrieve a map JSON object from the database + // @param id = the id of the map to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Maps.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/maps/" + id + ".json", + async: false + }); + Metamaps.Maps.add($.parseJSON(e.responseText)); + return Metamaps.Maps.get(id); + } else { + return $.ajax({ + url: "/users/" + id + ".json", + success: function (data) { + Metamaps.Maps.add(data); + callback(Metamaps.Maps.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Maps.get(id); + } else { + return callback(Metamaps.Maps.get(id)); + } + } + }, + fork: function () { + Metamaps.GlobalUI.openLightbox('forkmap'); + + var nodes_data = "", + synapses_data = ""; + var synapses_array = new Array(); + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + //don't add to the map if it was filtered out + // TODO + //if (categoryVisible[n.getData('metacode')] == false) { + // return; + //} + + var x, y; + if (n.pos.x && n.pos.y) { + x = n.pos.x; + y = n.pos.y; + } else { + var x = Math.cos(n.pos.theta) * n.pos.rho; + var y = Math.sin(n.pos.theta) * n.pos.rho; + } + nodes_data += n.id + '/' + x + '/' + y + ','; + n.eachAdjacency(function (adj) { + synapses_array.push(adj.getData("synapses")[0].id); // TODO + }); + }); + + //get unique values only + synapses_array = $.grep(synapses_array, function (value, key) { + return $.inArray(value, synapses_array) === key; + }); + + synapses_data = synapses_array.join(); + nodes_data = nodes_data.slice(0, -1); + + Metamaps.GlobalUI.CreateMap.topicsToMap = nodes_data; + Metamaps.GlobalUI.CreateMap.synapsesToMap = synapses_data; + } +}; + + +/* + * + * CHEATSHEET + * + */ +Metamaps.Map.CheatSheet = { + init: function () { + // tab the cheatsheet + $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + } +}; // end Metamaps.Map.CheatSheet + + +/* + * + * INFOBOX + * + */ +Metamaps.Map.InfoBox = { + isOpen: false, + timeOut: null, + changing: false, + selectingPermission: false, + init: function () { + var self = Metamaps.Map.InfoBox; + + // because anyone who can edit the map can change the map title + $('.mapInfoName .best_in_place_name').bind("ajax:success", function () { + var name = $(this).html(); + $('.mapName').html(name); + Metamaps.Active.Map.set('name', name); + }); + + $('.yourMap .mapPermission').click(self.onPermissionClick); + + $("div.index").hover(self.open, self.close); + }, + open: function (event) { + var self = Metamaps.GlobalUI.Account; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing && event.target.className != "openCheatsheet openLightbox") { + self.changing = true; + $('.mapInfoBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.GlobalUI.Account; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + $('.mapInfoBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + onPermissionClick: function () { + var self = Metamaps.Map.InfoBox; + + if (!self.selectingPermission) { + self.selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('commons')) { + $(this).append('
    '); + } else if ($(this).hasClass('public')) { + $(this).append('
    '); + } else if ($(this).hasClass('private')) { + $(this).append('
    '); + } + $('.mapPermission .permissionSelect li').click(self.selectPermission); + } else { + self.selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.mapPermission .permissionSelect').remove(); + } + }, + selectPermission: function () { + var self = Metamaps.Map.InfoBox; + + self.selectingPermission = false; + var permission = $(this).attr('class'); + Metamaps.Active.Map.save({ + permission: permission + }); + $('.mapPermission').removeClass('commons public private minimize').addClass(permission); + $('.mapPermission .permissionSelect').remove(); + event.stopPropagation(); + } +}; // end Metamaps.Map.InfoBox + + +/* + * + * MAPPER + * + */ +Metamaps.Mapper = { + // this function is to retrieve a mapper JSON object from the database + // @param id = the id of the mapper to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Mappers.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/users/" + id + ".json", + async: false + }); + Metamaps.Mappers.add($.parseJSON(e.responseText)); + return Metamaps.Mappers.get(id); + } else { + return $.ajax({ + url: "/users/" + id + ".json", + success: function (data) { + Metamaps.Mappers.add(data); + callback(Metamaps.Mappers.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Mappers.get(id); + } else { + return callback(Metamaps.Mappers.get(id)); + } + } + }, +}; // end Metamaps.Mapper diff --git a/app/assets/javascripts/metamaps/Metamaps.js~ b/app/assets/javascripts/metamaps/Metamaps.js~ new file mode 100644 index 00000000..cc796c14 --- /dev/null +++ b/app/assets/javascripts/metamaps/Metamaps.js~ @@ -0,0 +1,2711 @@ +var labelType, useGradients, nativeTextSupport, animate; + +(function () { + var ua = navigator.userAgent, + iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i), + typeOfCanvas = typeof HTMLCanvasElement, + nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'), + textSupport = nativeCanvasSupport && (typeof document.createElement('canvas').getContext('2d').fillText == 'function'); + //I'm setting this based on the fact that ExCanvas provides text support for IE + //and that as of today iPhone/iPad current text support is lame + labelType = (!nativeCanvasSupport || (textSupport && !iStuff)) ? 'Native' : 'HTML'; + nativeTextSupport = labelType == 'Native'; + useGradients = nativeCanvasSupport; + animate = !(iStuff || !nativeCanvasSupport); +})(); + +// TODO eliminate these 4 global variables +var panningInt; // this variable is used to store a 'setInterval' for the Metamaps.JIT.SmoothPanning() function, so that it can be cleared with window.clearInterval +var tempNode = null, + tempInit = false, + tempNode2 = null; + +Metamaps.Settings = { + embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages + sandbox: false, // puts the app into a mode (when true) where it only creates data locally, and isn't writing it to the database + colors: { + background: '#344A58', + synapses: { + normal: '#222222', + hover: '#222222', + selected: '#FFFFFF' + }, + topics: { + selected: '#FFFFFF' + }, + labels: { + background: '#18202E', + text: '#DDD' + } + } +}; + +Metamaps.Touch = { + touchPos: null, // this stores the x and y values of a current touch event + touchDragNode: null // this stores a reference to a JIT node that is being dragged +}; + +Metamaps.Mouse = { + didPan: false, + changeInX: 0, + changeInY: 0, + edgeHoveringOver: false, + boxStartCoordinates: false, + boxEndCoordinates: false, + synapseStartCoordinates: [], + synapseEndCoordinates: null, + lastNodeClick: 0, + lastCanvasClick: 0, + DOUBLE_CLICK_TOLERANCE: 300 +}; + +Metamaps.Selected = { + Nodes: [], + Edges: [] +}; + +Metamaps.Metacodes = {}; // will be initialized in Metamaps.Backbone.init as a MetacodeCollection +Metamaps.Topics = {}; // will be initialized in Metamaps.Backbone.init as a TopicCollection +Metamaps.Synapses = {}; // will be initialized in Metamaps.Backbone.init as a SynapseCollection +Metamaps.Mappings = {}; // will be initialized in Metamaps.Backbone.init as a MappingCollection + + +/* + * + * BACKBONE + * + */ +Metamaps.Backbone.init = function () { + var self = Metamaps.Backbone; + + self.Metacode = Backbone.Model.extend({ + initialize: function () { + var image = new Image(); + image.src = this.get('icon'); + this.set('image',image); + } + }); + self.MetacodeCollection = Backbone.Collection.extend({ + model: this.Metacode, + url: '/metacodes', + }); + + self.Topic = Backbone.Model.extend({ + urlRoot: '/topics', + blacklist: ['node', 'created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "desc": '', + "link": '', + "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons' + }); + } + }, + authorizeToEdit: function (mapper) { + if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; + else return false; + }, + authorizePermissionChange: function (mapper) { + if (mapper && this.get('user_id') === mapper.get('id')) return true; + else return false; + }, + getDate: function () { + + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getMetacode: function () { + return Metamaps.Metacodes.get(this.get('metacode_id')); + }, + getMapping: function () { + + if (!Metamaps.Active.Map) return false; + + return Metamaps.Mappings.findWhere({ + map_id: Metamaps.Active.Map.id, + topic_id: this.isNew() ? this.cid : this.id + }); + }, + updateMapping: function () { + var mapping = this.getMapping(); + + if (mapping) { + mapping.set('topic_id', this.id); + } + }, + createNode: function () { + var mapping; + var node = { + adjacencies: [], + id: this.isNew() ? this.cid : this.id, + name: this.get('name') + }; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + node.data = { + $mapping: null, + $mappingID: mapping.id + }; + } + + return node; + }, + updateNode: function () { + var mapping; + var node = this.get('node'); + node.setData('topic', this); + node.id = this.isNew() ? this.cid : this.id; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + node.setData('mapping', mapping); + } + + return node; + }, + }); + + self.TopicCollection = Backbone.Collection.extend({ + model: self.Topic, + url: '/topics', + comparator: function (a, b) { + a = a.get('name').toLowerCase(); + b = b.get('name').toLowerCase(); + return a > b ? 1 : a < b ? -1 : 0; + } + }); + + self.Synapse = Backbone.Model.extend({ + urlRoot: '/synapses', + blacklist: ['edge', 'created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons', + "category": "from-to" + }); + } + }, + authorizeToEdit: function (mapper) { + if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; + else return false; + }, + authorizePermissionChange: function (mapper) { + if (mapper && this.get('user_id') === mapper.get('id')) return true; + else return false; + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getTopic1: function () { + return Metamaps.Topic.get(this.get('node1_id')); + }, + getTopic2: function () { + return Metamaps.Topic.get(this.get('node2_id')); + }, + getDirection: function () { + return [ + this.get('node1_id'), + this.get('node2_id') + ]; + }, + getMapping: function () { + + if (!Metamaps.Active.Map) return false; + + return Metamaps.Mappings.findWhere({ + map_id: Metamaps.Active.Map.id, + synapse_id: this.isNew() ? this.cid : this.id + }); + }, + updateMapping: function () { + var mapping = this.getMapping(); + + if (mapping) { + mapping.set('synapse_id', this.id); + } + }, + createEdge: function () { + var mapping, mappingID; + var synapseID = this.isNew() ? this.cid : this.id; + + var edge = { + nodeFrom: this.get('node1_id'), + nodeTo: this.get('node2_id'), + data: { + $synapses: [], + $synapseIDs: [synapseID], + } + }; + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + mappingID = mapping.isNew() ? mapping.cid : mapping.id; + edge.data.$mappings = []; + edge.data.$mappingIDs = [mappingID]; + } + + return edge; + }, + updateEdge: function () { + var mapping; + var edge = this.get('edge'); + edge.getData('synapses').push(this); + + if (Metamaps.Active.Map) { + mapping = this.getMapping(); + edge.getData('mappings').push(mapping); + } + + return edge; + }, + }); + + self.SynapseCollection = Backbone.Collection.extend({ + model: self.Synapse, + url: '/synapses' + }); + + self.Mapping = Backbone.Model.extend({ + urlRoot: '/mappings', + blacklist: ['created_at', 'updated_at'], + toJSON: function (options) { + return _.omit(this.attributes, this.blacklist); + }, + initialize: function () { + if (this.isNew()) { + this.set({ + "user_id": Metamaps.Active.Mapper.id, + "map_id": Metamaps.Active.Map ? Metamaps.Active.Map.id : null + }); + } + }, + getUser: function () { + return Metamaps.Mapper.get(this.get('user_id')); + }, + getMap: function () { + return Metamaps.Map.get(this.get('map_id')); + }, + getTopic: function () { + if (this.get('category') === 'Topic') return Metamaps.Topic.get(this.get('topic_id')); + else return false; + }, + getSynapse: function () { + if (this.get('category') === 'Synapse') return Metamaps.Synapse.get(this.get('synapse_id')); + else return false; + } + }); + + self.MappingCollection = Backbone.Collection.extend({ + model: self.Mapping, + url: '/mappings' + }); + + Metamaps.Metacodes = new self.MetacodeCollection(Metamaps.Metacodes); + + Metamaps.Topics = new self.TopicCollection(Metamaps.Topics); + + Metamaps.Synapses = new self.SynapseCollection(Metamaps.Synapses); + + Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); + + if (Metamaps.Active.Map) { + Metamaps.Active.Map = new self.Map(Metamaps.Active.Map); + Metamaps.Maps.add(Metamaps.Active.Map); + } + + if (Metamaps.Active.Topic) Metamaps.Active.Topic = new self.Topic(Metamaps.Active.Topic); +}; // end Metamaps.Backbone.init + + +/* + * + * CREATE + * + */ +Metamaps.Create = { + isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open + metacodeScrollerInit: false, // indicates whether the scrollbar in the custom metacode set space has been init + selectedMetacodeSet: null, + selectedMetacodeSetIndex: null, + selectedMetacodeNames: [], + newSelectedMetacodeNames: [], + selectedMetacodes: [], + newSelectedMetacodes: [], + init: function () { + var self = Metamaps.Create; + self.newTopic.init(); + self.newSynapse.init(); + + ////// + ////// + //// SWITCHING METACODE SETS + + $('#metacodeSwitchTabs').tabs({ + selected: self.selectedMetacodeSetIndex + }).addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#metacodeSwitchTabs .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + $('.customMetacodeList li').click(self.toggleMetacodeSelected); // within the custom metacode set tab + }, + toggleMetacodeSelected: function () { + var self = Metamaps.Create; + + if ($(this).attr('class') != 'toggledOff') { + $(this).addClass('toggledOff'); + var value_to_remove = $(this).attr('id'); + var name_to_remove = $(this).attr('data-name'); + self.newSelectedMetacodes.splice(self.newSelectedMetacodes.indexOf(value_to_remove), 1); + self.newSelectedMetacodeNames.splice(self.newSelectedMetacodeNames.indexOf(name_to_remove), 1); + } else if ($(this).attr('class') == 'toggledOff') { + $(this).removeClass('toggledOff'); + self.newSelectedMetacodes.push($(this).attr('id')); + self.newSelectedMetacodeNames.push($(this).attr('data-name')); + } + }, + updateMetacodeSet: function (set, index, custom) { + + if (custom && Metamaps.Create.newSelectedMetacodes.length == 0) { + alert('Please select at least one metacode to use!'); + return false; + } + + var codesToSwitchTo; + Metamaps.Create.selectedMetacodeSetIndex = index; + Metamaps.Create.selectedMetacodeSet = "metacodeset-" + set; + + if (!custom) { + codesToSwitchTo = $('#metacodeSwitchTabs' + set).attr('data-metacodes').split(','); + $('.customMetacodeList li').addClass('toggledOff'); + Metamaps.Create.selectedMetacodes = []; + Metamaps.Create.selectedMetacodeNames = []; + Metamaps.Create.newSelectedMetacodes = []; + Metamaps.Create.newSelectedMetacodeNames = []; + } + if (custom) { + // uses .slice to avoid setting the two arrays to the same actual array + Metamaps.Create.selectedMetacodes = Metamaps.Create.newSelectedMetacodes.slice(0); + Metamaps.Create.selectedMetacodeNames = Metamaps.Create.newSelectedMetacodeNames.slice(0); + codesToSwitchTo = Metamaps.Create.selectedMetacodeNames.slice(0); + } + + // sort by name + codesToSwitchTo.sort(); + codesToSwitchTo.reverse(); + + $('#metacodeImg, #metacodeImgTitle').empty(); + $('#metacodeImg').removeData('cloudcarousel'); + var newMetacodes = ""; + var metacode; + for (var i = 0; i < codesToSwitchTo.length; i++) { + metacode = Metamaps.Metacodes.findWhere({ name: codesToSwitchTo[i] }); + newMetacodes += '' + metacode.get('name') + ''; + }; + $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({ + titleBox: $('#metacodeImgTitle'), + yRadius: 40, + xPos: 150, + yPos: 40, + speed: 0.3, + mouseWheel: true, + bringToFront: true + }); + + Metamaps.GlobalUI.closeLightbox(); + $('#topic_name').focus(); + + var mdata = { + "metacodes": { + "value": custom ? Metamaps.Create.selectedMetacodes.toString() : Metamaps.Create.selectedMetacodeSet + } + }; + $.ajax({ + type: "POST", + dataType: 'json', + url: "/user/updatemetacodes", + data: mdata, + success: function (data) { + console.log('selected metacodes saved'); + }, + error: function () { + console.log('failed to save selected metacodes'); + } + }); + }, + + cancelMetacodeSetSwitch: function () { + var self = Metamaps.Create; + self.isSwitchingSet = false; + + if (self.selectedMetacodeSet != "metacodeset-custom") { + $('.customMetacodeList li').addClass('toggledOff'); + self.selectedMetacodes = []; + self.selectedMetacodeNames = []; + self.newSelectedMetacodes = []; + self.newSelectedMetacodeNames = []; + } else { // custom set is selected + // reset it to the current actual selection + $('.customMetacodeList li').addClass('toggledOff'); + for (var i = 0; i < self.selectedMetacodes.length; i++) { + $('#' + self.selectedMetacodes[i]).removeClass('toggledOff'); + }; + // uses .slice to avoid setting the two arrays to the same actual array + self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0); + self.newSelectedMetacodes = self.selectedMetacodes.slice(0); + } + $('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex); + $('#topic_name').focus(); + }, + newTopic: { + init: function () { + $('#new_topic').bind('contextmenu', function (e) { + return false; + }); + + $('#topic_name').keyup(function () { + Metamaps.Create.newTopic.name = $(this).val(); + }); + + // initialize the autocomplete results for the metacode spinner + $('#topic_name').typeahead([ + { + name: 'topic_autocomplete', + limit: 8, + template: $('#topicAutocompleteTemplate').html(), + remote: { + url: '/topics/autocomplete_topic?term=%QUERY' + }, + engine: Hogan + } + ]); + + // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete + $('#topic_name').bind('typeahead:selected', function (event, datum, dataset) { + Metamaps.Topic.getTopicFromAutocomplete(datum.id); + }); + + // initialize metacode spinner and then hide it + $("#metacodeImg").CloudCarousel({ + titleBox: $('#metacodeImgTitle'), + yRadius: 40, + xPos: 150, + yPos: 40, + speed: 0.3, + mouseWheel: true, + bringToFront: true + }); + $('.new_topic').hide(); + }, + name: null, + newId: 1, + beingCreated: false, + metacode: null, + x: null, + y: null, + addSynapse: false, + open: function () { + $('#new_topic').fadeIn('fast', function () { + $('#topic_name').focus(); + }); + Metamaps.Create.newTopic.beingCreated = true; + }, + hide: function () { + $('#new_topic').fadeOut('fast'); + $("#topic_name").typeahead('setQuery', ''); + Metamaps.Create.newTopic.beingCreated = false; + } + }, + newSynapse: { + init: function () { + var self = Metamaps.Create.newSynapse; + + // keep the right click menu from opening + $('#new_synapse').bind('contextmenu', function (e) { + return false; + }); + + $('#synapse_desc').keyup(function () { + Metamaps.Create.newSynapse.description = $(this).val(); + }); + + // initialize the autocomplete results for synapse creation + $('#synapse_desc').typeahead([ + { + name: 'synapse_autocomplete', + template: "
    {{label}}
    ", + remote: { + url: '/search/synapses?term=%QUERY' + }, + engine: Hogan + }, + { + name: 'existing_synapses', + limit: 50, + template: $('#synapseAutocompleteTemplate').html(), + remote: { + url: '/search/synapses', + replace: function () { + return self.getSearchQuery(); + } + }, + engine: Hogan, + header: "

    Existing Synapses

    " + } + ]); + + $('#synapse_desc').bind('typeahead:selected', function (event, datum, dataset) { + if (datum.id) { // if they clicked on an existing synapse get it + Metamaps.Synapse.getSynapseFromAutocomplete(datum.id); + } + }); + }, + beingCreated: false, + description: null, + topic1id: null, + topic2id: null, + newSynapseId: null, + open: function () { + $('#new_synapse').fadeIn('fast', function () { + $('#synapse_desc').focus(); + }); + Metamaps.Create.newSynapse.beingCreated = true; + }, + hide: function () { + $('#new_synapse').fadeOut('fast'); + $("#synapse_desc").typeahead('setQuery', ''); + Metamaps.Create.newSynapse.beingCreated = false; + Metamaps.Create.newTopic.addSynapse = false; + Metamaps.Create.newSynapse.topic1id = 0; + Metamaps.Create.newSynapse.topic2id = 0; + }, + getSearchQuery: function () { + var self = Metamaps.Create.newSynapse; + + if (Metamaps.Selected.Nodes.length < 2) { + return '/search/synapses?topic1id=' + self.topic1id + '&topic2id=' + self.topic2id; + } else return ''; + } + } +}; // end Metamaps.Create + + +////////////////// TOPIC AND SYNAPSE CARDS ////////////////////////// + + +/* + * + * TOPICCARD + * + */ +Metamaps.TopicCard = { + openTopicCard: null, //stores the JIT local ID of the topic with the topic card open + init: function () { + + // initialize best_in_place editing + $('.authenticated div.permission.canEdit .best_in_place').best_in_place(); + + Metamaps.TopicCard.generateShowcardHTML = Hogan.compile($('#topicCardTemplate').html()); + + // initialize topic card draggability and resizability + $('.showcard').draggable({ + handle: ".metacodeImage" + }); + $('#showcard').resizable({ + maxHeight: 500, + maxWidth: 500, + minHeight: 320, + minWidth: 226, + resize: function (event, ui) { + var p = $('#showcard').find('.scroll'); + p.height(p.height()).mCustomScrollbar('update'); + } + }).css({ + display: 'none', + top: '300px', + left: '100px' + }); + }, + fadeInShowCard: function (topic) { + $('.showcard').fadeIn('fast'); + Metamaps.TopicCard.openTopicCard = topic.isNew() ? topic.cid : topic.id; + }, + /** + * Will open the Topic Card for the node that it's passed + * @param {$jit.Graph.Node} node + */ + showCard: function (node) { + + var topic = node.getData('topic'); + + //populate the card that's about to show with the right topics data + Metamaps.TopicCard.populateShowCard(topic); + Metamaps.TopicCard.fadeInShowCard(topic); + }, + hideCard: function () { + $('.showcard').fadeOut('fast'); + Metamaps.TopicCard.openTopicCard = null; + }, + bindShowCardListeners: function (topic) { + var self = Metamaps.TopicCard; + var showCard = document.getElementById('showcard'); + + var selectingMetacode = false; + // attach the listener that shows the metacode title when you hover over the image + $('.showcard .metacodeImage').mouseenter(function () { + $('.showcard .icon').css('z-index', '4'); + $('.showcard .metacodeTitle').show(); + }); + $('.showcard .linkItem.icon').mouseleave(function () { + if (!selectingMetacode) { + $('.showcard .metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + } + }); + + $('.showcard .metacodeTitle').click(function () { + if (!selectingMetacode) { + selectingMetacode = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + $('.metacodeSelect').show(); + // add the scroll bar to the list of metacode select options if it isn't already there + if (!$('.metacodeSelect ul').hasClass('mCustomScrollbar')) { + $('.metacodeSelect ul').mCustomScrollbar({ + mouseWheelPixels: 200, + advanced: { + updateOnContentResize: true + } + }); + + $('.metacodeSelect li').click(function () { + selectingMetacode = false; + var metacodeName = $(this).find('.mSelectName').text(); + var metacode = Metamaps.Metacodes.findWhere({ + name: metacodeName + }); + $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) + .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); + $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); + topic.save({ + metacode_id: metacode.id + }); + Metamaps.Visualize.mGraph.plot(); + $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.metacodeSelect').hide(); + setTimeout(function () { + $('.metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + }, 500); + }); + } + } else { + selectingMetacode = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.metacodeSelect').hide(); + } + }); + + + // ability to change permission + var selectingPermission = false; + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('.showcard .yourTopic .mapPerm').click(function () { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('.permissionSelect li').click(function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + topic.save({ + permission: permission + }); + $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('.permissionSelect').remove(); + event.stopPropagation(); + }); + } else { + selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.permissionSelect').remove(); + } + }); + } + + // when you're typing a description, resize the scroll box to have space + $('.best_in_place_desc textarea').bind('keyup', function () { + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + }); + + //bind best_in_place ajax callbacks + $(showCard).find('.best_in_place_name').bind("ajax:success", function () { + + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + + var name = $(this).html(); + topic.set("name", Metamaps.Util.decodeEntities(name)); + Metamaps.Visualize.mGraph.plot(); + }); + + $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { + this.innerHTML = this.innerHTML.replace(/\r/g, '') + + var s = $('.showcard').find('.scroll'); + s.height(s.height()).mCustomScrollbar('update'); + + var desc = $(this).html(); + topic.set("desc", desc); + }); + + $(showCard).find('.best_in_place_link').bind("ajax:success", function () { + var link = $(this).html(); + $(showCard).find('.go-link').attr('href', link); + topic.set("link", link); + }); + }, + populateShowCard: function (topic) { + var self = Metamaps.TopicCard; + + var showCard = document.getElementById('showcard'); + + $(showCard).find('.permission').remove(); + + var html = self.generateShowcardHTML.render(self.buildObject(topic)); + + if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { + var perm = document.createElement('div'); + + var string = 'permission canEdit'; + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) string += ' yourTopic'; + perm.className = string; + perm.innerHTML = html; + showCard.appendChild(perm); + } else { + var perm = document.createElement('div'); + perm.className = 'permission cannotEdit'; + perm.innerHTML = html; + showCard.appendChild(perm); + } + + Metamaps.TopicCard.bindShowCardListeners(topic); + }, + generateShowcardHTML: null, // will be initialized into a Hogan template within init function + //generateShowcardHTML + buildObject: function (topic) { + var nodeValues = {}; + var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); + + //link is rendered differently if user is logged out or in + var go_link, a_tag, close_a_tag; + if (!authorized) { + go_link = ''; + if (topic.get("link") != "") { + a_tag = ''; + close_a_tag = ''; + } else { + a_tag = ''; + close_a_tag = ''; + } + } else { + go_link = ''; + a_tag = ''; + close_a_tag = ''; + } + + var desc_nil = "Click to add description..."; + var link_nil = "Click to add link..."; + + nodeValues.permission = topic.get("permission"); + nodeValues.mk_permission = topic.get("permission").substring(0, 2); + //nodeValues.map_count = topic.get("inmaps").length; + //nodeValues.synapse_count = topic.get("synapseCount"); + nodeValues.id = topic.isNew() ? topic.cid : topic.id; + nodeValues.metacode = topic.getMetacode().get("name"); + nodeValues.metacode_class = 'mbg' + topic.getMetacode().get("name").replace(/\s/g, ''); + nodeValues.imgsrc = topic.getMetacode().get("icon"); + nodeValues.name = topic.get("name"); + nodeValues.userid = topic.get("user_id"); + nodeValues.username = topic.getUser().get("name"); + nodeValues.date = topic.getDate(); + + // the code for this is stored in /views/main/_metacodeOptions.html.erb + nodeValues.metacode_select = $('#metacodeOptions').html(); + nodeValues.go_link = go_link; + nodeValues.a_tag = a_tag; + nodeValues.close_a_tag = close_a_tag; + nodeValues.link_nil = link_nil; + nodeValues.link = (topic.get("link") == "" && authorized) ? link_nil : topic.get("link"); + nodeValues.desc_nil = desc_nil; + nodeValues.desc = (topic.get("desc") == "" && authorized) ? desc_nil : topic.get("desc"); + return nodeValues; + } +}; // end Metamaps.TopicCard + + +/* + * + * SYNAPSECARD + * + */ +Metamaps.SynapseCard = { + openSynapseCard: null, + showCard: function (edge, e) { + var self = Metamaps.SynapseCard; + + //reset so we don't interfere with other edges, but first, save its x and y + var myX = $('#edit_synapse').css('left'); + var myY = $('#edit_synapse').css('top'); + $('#edit_synapse').remove(); + + //so label is missing while editing + Metamaps.Control.deselectEdge(edge); + + var synapse = edge.getData('synapses')[0]; // for now, just get the first synapse + + //create the wrapper around the form elements, including permissions + //classes to make best_in_place happy + var edit_div = document.createElement('div'); + edit_div.setAttribute('id', 'edit_synapse'); + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + edit_div.className = 'permission canEdit'; + edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : ''; + } else { + edit_div.className = 'permission cannotEdit'; + } + $('.main .wrapper').append(edit_div); + + self.populateShowCard(synapse); + + //drop it in the right spot, activate it + $('#edit_synapse').css('position', 'absolute'); + if (e) { + $('#edit_synapse').css('left', e.clientX); + $('#edit_synapse').css('top', e.clientY); + } else { + $('#edit_synapse').css('left', myX); + $('#edit_synapse').css('top', myY); + } + //$('#edit_synapse_name').click(); //required in case name is empty + //$('#edit_synapse_name input').focus(); + $('#edit_synapse').show(); + + self.openSynapseCard = synapse.isNew() ? synapse.cid : synapse.id; + }, + + hideCard: function () { + $('#edit_synapse').remove(); + Metamaps.SynapseCard.openSynapseCard = null; + }, + + populateShowCard: function (synapse) { + var self = Metamaps.SynapseCard; + + self.add_name_form(synapse); + self.add_user_info(synapse); + self.add_perms_form(synapse); + if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { + self.add_direction_form(synapse); + } + }, + + add_name_form: function (synapse) { + var data_nil = 'Click to add description.'; + + // TODO make it so that this would work even in sandbox mode, + // currently with Best_in_place it won't + + //name editing form + $('#edit_synapse').append('
    '); + $('#edit_synapse_name').attr('class', 'best_in_place best_in_place_desc'); + $('#edit_synapse_name').attr('data-object', 'synapse'); + $('#edit_synapse_name').attr('data-attribute', 'desc'); + $('#edit_synapse_name').attr('data-type', 'textarea'); + $('#edit_synapse_name').attr('data-nil', data_nil); + $('#edit_synapse_name').attr('data-url', '/synapses/' + synapse.id); + $('#edit_synapse_name').html(synapse.get("desc")); + + //if edge data is blank or just whitespace, populate it with data_nil + if ($('#edit_synapse_name').html().trim() == '') { + $('#edit_synapse_name').html(data_nil); + } + + $('#edit_synapse_name').bind("ajax:success", function () { + var desc = $(this).html(); + if (desc == data_nil) { + synapse.set("desc", ''); + } else { + synapse.set("desc", desc); + } + Metamaps.Control.selectEdge(synapse.get('edge')); + Metamaps.Visualize.mGraph.plot(); + }); + }, + + add_user_info: function (synapse) { + var u = '
    '; + u += '
    Created by ' + synapse.getUser().get("name") + '
    '; + $('#edit_synapse').append(u); + }, + + add_perms_form: function (synapse) { + //permissions - if owner, also allow permission editing + $('#edit_synapse').append('
    '); + + // ability to change permission + var selectingPermission = false; + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('#edit_synapse.yourEdge .mapPerm').click(function () { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('#edit_synapse .permissionSelect li').click(function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + synapse.save({ + permission: permission, + }); + $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('#edit_synapse .permissionSelect').remove(); + event.stopPropagation(); + }); + } else { + selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('#edit_synapse .permissionSelect').remove(); + } + }); + } + }, //add_perms_form + + add_direction_form: function (synapse) { + //directionality checkboxes + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + $('#edit_synapse').append(''); + + var edge = synapse.get('edge'); + + //determine which node is to the left and the right + //if directly in a line, top is left + if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || + edge.nodeFrom.pos.x == edge.nodeTo.pos.x && + edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { + var left = edge.nodeTo; + var right = edge.nodeFrom; + } else { + var left = edge.nodeFrom; + var right = edge.nodeTo; + } + + /* + * One node is actually on the left onscreen. Call it left, & the other right. + * If category is from-to, and that node is first, check the 'right' checkbox. + * Else check the 'left' checkbox since the arrow is incoming. + */ + + var directionCat = synapse.get('category'); //both, none, from-to + if (directionCat == 'from-to') { + var from_to = synapse.getDirection(); + if (from_to[0] == left.id) { + //check left checkbox + $('#edit_synapse_left').prop('checked', true); + } else { + //check right checkbox + $('#edit_synapse_right').prop('checked', true); + } + } else if (directionCat == 'both') { + //check both checkboxes + $('#edit_synapse_left').prop('checked', true); + $('#edit_synapse_right').prop('checked', true); + } + $('#edit_synapse_left, #edit_synapse_right').click(function () { + var leftChecked = $('#edit_synapse_left').is(':checked'); + var rightChecked = $('#edit_synapse_right').is(':checked'); + + var dir = synapse.getDirection(); + var dirCat = 'none'; + if (leftChecked && rightChecked) { + dirCat = 'both'; + } else if (!leftChecked && rightChecked) { + dirCat = 'from-to'; + dir = [right.id, left.id]; + } else if (leftChecked && !rightChecked) { + dirCat = 'from-to'; + dir = [left.id, right.id]; + } + + synapse.save({ + category: dirCat, + node1_id: dir[0], + node2_id: dir[1] + }); + Metamaps.Visualize.mGraph.plot(); + }); + } //add_direction_form +}; // end Metamaps.SynapseCard + + +////////////////////// END TOPIC AND SYNAPSE CARDS ////////////////////////////////// + + + + +/* + * + * VISUALIZE + * + */ +Metamaps.Visualize = { + mGraph: {}, // a reference to the graph object. + cameraPosition: null, // stores the camera position when using a 3D visualization + type: "ForceDirected", // the type of graph we're building, could be "RGraph", "ForceDirected", or "ForceDirected3D" + savedLayout: true, // indicates whether the map has a saved layout or not + loadLater: false, // indicates whether there is JSON that should be loaded right in the offset, or whether to wait till the first topic is created + target: null, // the selector representing the location to render the graph + init: function () { + var self = Metamaps.Visualize; + // disable awkward dragging of the canvas element that would sometimes happen + $('#infovis-canvas').on('dragstart', function (event) { + event.preventDefault(); + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchstart', function (event) { + event.preventDefault(); + self.mGraph.events.touched = true; + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchmove', function (event) { + //Metamaps.JIT.touchPanZoomHandler(event); + }); + + // prevent touch events on the canvas from default behaviour + $("#infovis-canvas").bind('touchend touchcancel', function (event) { + lastDist = 0; + if (!self.mGraph.events.touchMoved && !Metamaps.Touch.touchDragNode) Metamaps.TopicCard.hideCurrentCard(); + self.mGraph.events.touched = self.mGraph.events.touchMoved = false; + Metamaps.Touch.touchDragNode = false; + }); + }, + render: function (targetID, vizData) { + var self = Metamaps.Visualize; + self.mGraph = {}; + self.target = targetID; + self.__buildGraph(vizData); + }, + computePositions: function () { + var self = Metamaps.Visualize, + mapping; + + if (self.type == "RGraph") { + self.mGraph.graph.eachNode(function (n) { + topic = Metamaps.Topics.get(n.id); + topic.set('node', n); + topic.updateNode(); + + n.eachAdjacency(function (edge) { + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } + }); + + var pos = n.getPos(); + pos.setc(-200, -200); + }); + self.mGraph.compute('end'); + } else if (self.type == "ForceDirected" && self.savedLayout) { + var i, l, startPos, endPos, topic, synapse; + + self.mGraph.graph.eachNode(function (n) { + topic = Metamaps.Topics.get(n.id); + topic.set('node', n); + topic.updateNode(); + mapping = topic.getMapping(); + + n.eachAdjacency(function (edge) { + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } + }); + + startPos = new $jit.Complex(0, 0); + endPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); + n.setPos(startPos, 'start'); + n.setPos(endPos, 'end'); + }); + } else if (self.type == "ForceDirected3D" || !self.savedLayout) { + self.mGraph.compute(); + } + }, + /** + * __buildGraph does the heavy lifting of creating the engine that renders the graph with the properties we desire + * + * @param vizData a json structure containing the data to be rendered. + */ + __buildGraph: function (vizData) { + var self = Metamaps.Visualize + RGraphSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); + + if (self.type == "RGraph") { + $jit.RGraph.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); + $jit.RGraph.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); + + RGraphSettings.background = Metamaps.JIT.RGraph.background; + RGraphSettings.levelDistance = Metamaps.JIT.RGraph.levelDistance; + + self.mGraph = new $jit.RGraph(RGraphSettings); + } else if (self.type == "ForceDirected") { + $jit.ForceDirected.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); + $jit.ForceDirected.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); + self.mGraph = new $jit.ForceDirected(Metamaps.JIT.ForceDirected.graphSettings); + } else if (self.type == "ForceDirected3D") { + // init ForceDirected3D + self.mGraph = new $jit.ForceDirected3D(Metamaps.JIT.ForceDirected3D.graphSettings); + self.cameraPosition = self.mGraph.canvas.canvases[0].camera.position; + } + + // load JSON data, if it's not empty + if (!self.loadLater) { + //load JSON data. + self.mGraph.loadJSON(vizData); + //compute positions and plot. + self.computePositions(); + if (self.type == "RGraph") { + self.mGraph.fx.animate(Metamaps.JIT.RGraph.animate); + } else if (self.type == "ForceDirected" && self.savedLayout) { + Metamaps.Organize.loadSavedLayout(); + } else if (self.type == "ForceDirected3D" || !self.savedLayout) { + self.mGraph.animate(Metamaps.JIT.ForceDirected.animateFDLayout); + } + } + } +}; // end Metamaps.Visualize + + +/* + * + * UTIL + * + */ +Metamaps.Util = { + // helper function to determine how many lines are needed + // Line Splitter Function + // copyright Stephen Chapman, 19th April 2006 + // you may copy this code but please keep the copyright notice as well + splitLine: function (st, n) { + var b = ''; + var s = st; + while (s.length > n) { + var c = s.substring(0, n); + var d = c.lastIndexOf(' '); + var e = c.lastIndexOf('\n'); + if (e != -1) d = e; + if (d == -1) d = n; + b += c.substring(0, d) + '\n'; + s = s.substring(d + 1); + } + return b + s; + }, + decodeEntities: function (desc) { + var str, temp = document.createElement('p'); + temp.innerHTML = desc; //browser handles the topics + str = temp.textContent || temp.innerText; + temp = null; //delete the element; + return str; + }, //decodeEntities + getDistance: function (p1, p2) { + return Math.sqrt(Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)); + }, + generateOptionsList: function (data) { + var newlist = ""; + for (var i = 0; i < data.length; i++) { + newlist = newlist + ''; + } + return newlist; + }, + checkURLisImage: function (url) { + // when the page reloads the following regular expression will be screwed up + // please replace it with this one before you save: /*backslashhere*.(jpeg|jpg|gif|png)$/ + return (url.match(/\.(jpeg|jpg|gif|png)$/) != null); + }, + checkURLisYoutubeVideo: function (url) { + return (url.match(/^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null); + } +}; // end Metamaps.Util + +/* + * + * REALTIME + * + */ +Metamaps.Realtime = { + // this is for the heroku staging environment + //Metamaps.Realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + // this is for metamaps.cc + //Metamaps.Realtime.socket = io.connect('http://metamaps.cc:5001'); + // this is for localhost development + //Metamaps.Realtime.socket = io.connect('http://localhost:5001'); + socket: null, + isOpen: false, + timeOut: null, + changing: false, + mappersOnMap: {}, + status: true, // stores whether realtime is True/On or False/Off + init: function () { + var self = Metamaps.Realtime; + + $(".realtimeOnOff").click(self.toggle); + + $(".sidebarCollaborate").hover(self.open, self.close); + + var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + + if (mapperm) { + self.socket = io.connect('http://localhost:5001'); + self.socket.on('connect', function () { + console.log('socket connected'); + self.setupSocket(); + }); + } + }, + toggle: function () { + var self = Metamaps.Realtime; + + if (!self.status) { + self.sendRealtimeOn(); + $(this).html('ON').removeClass('rtOff').addClass('rtOn'); + $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); + } else { + self.sendRealtimeOff(); + $(this).html('OFF').removeClass('rtOn').addClass('rtOff'); + $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); + } + self.status = !self.status; + $(".sidebarCollaborateIcon").toggleClass("blue"); + }, + open: function () { + var self = Metamaps.Realtime; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing) { + self.changing = true; + $('.sidebarCollaborateBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.Realtime; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + $('.sidebarCollaborateBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + setupSocket: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + var myId = Metamaps.Active.Mapper.id; + + socket.emit('newMapperNotify', { + userid: myId, + username: Metamaps.Active.Mapper.get("name"), + mapid: Metamaps.Active.Map.id + }); + + // if you're the 'new guy' update your list with who's already online + socket.on(myId + '-' + Metamaps.Active.Map.id + '-UpdateMapperList', self.updateMapperList); + + // receive word that there's a new mapper on the map + socket.on('maps-' + Metamaps.Active.Map.id + '-newmapper', self.newPeerOnMap); + + // receive word that a mapper left the map + socket.on('maps-' + Metamaps.Active.Map.id + '-lostmapper', self.lostPeerOnMap); + + // receive word that there's a mapper turned on realtime + socket.on('maps-' + Metamaps.Active.Map.id + '-newrealtime', self.newCollaborator); + + // receive word that there's a mapper turned on realtime + socket.on('maps-' + Metamaps.Active.Map.id + '-lostrealtime', self.lostCollaborator); + + socket.on('maps-' + Metamaps.Active.Map.id, self.contentUpdate); + }, + sendRealtimeOn: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // send this new mapper back your details, and the awareness that you're online + var update = { + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + mapid: Metamaps.Active.Map.id + }; + socket.emit('notifyStartRealtime', update); + }, + sendRealtimeOff: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // send this new mapper back your details, and the awareness that you're online + var update = { + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + mapid: Metamaps.Active.Map.id + }; + socket.emit('notifyStopRealtime', update); + }, + updateMapperList: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + // data.userrealtime + + self.mappersOnMap[data.userid] = { + name: data.username, + realtime: data.userrealtime + }; + + var onOff = data.userrealtime ? "On" : "Off"; + var mapperListItem = '
  • ' + data.username + '
  • '; + + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); + }, + newPeerOnMap: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid] = { + name: data.username, + realtime: true + }; + + var mapperListItem = '
  • ' + data.username + '
  • '; + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); + + Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); + + // send this new mapper back your details, and the awareness that you've loaded the map + var update = { + userToNotify: data.userid, + username: Metamaps.Active.Mapper.get("name"), + userid: Metamaps.Active.Mapper.id, + userrealtime: self.status, + mapid: Metamaps.Active.Map.id + }; + socket.emit('updateNewMapperList', update); + }, + lostPeerOnMap: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + delete self.mappersOnMap[data.userid]; + + $('#mapper' + data.userid).remove(); + + Metamaps.GlobalUI.notifyUser(data.username + ' just left the map'); + }, + newCollaborator: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid].realtime = true; + + $('#mapper' + data.userid).removeClass('littleRtOff').addClass('littleRtOn'); + + Metamaps.GlobalUI.notifyUser(data.username + ' just turned on realtime'); + }, + lostCollaborator: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + // data.userid + // data.username + + self.mappersOnMap[data.userid].realtime = false; + + $('#mapper' + data.userid).removeClass('littleRtOn').addClass('littleRtOff'); + + Metamaps.GlobalUI.notifyUser(data.username + ' just turned off realtime'); + }, + contentUpdate: function (data) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + var graph = Metamaps.Visualize.mGraph.graph; + + //as long as you weren't the origin of the changes, update your map + if (data.origin != Metamaps.Active.Mapper.id && self.status) { + if (data.resource == 'Topic') { + topic = $.parseJSON(data.obj); + + if (data.action == 'create') { + self.addTopicToMap(topic); + } else if (data.action == 'update' && graph.getNode(topic.id) != 'undefined') { + self.updateTopicOnMap(topic); + } else if (data.action == 'destroy' && graph.getNode(topic.id) != 'undefined') { + Metamaps.Control.hideNode(topic.id) + } + + return; + } else if (data.resource == 'Synapse') { + synapse = $.parseJSON(data.obj); + + if (data.action == 'create') { + self.addSynapseToMap(synapse); + } else if (data.action == 'update' && + graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { + self.updateSynapseOnMap(synapse); + } else if (data.action == 'destroy' && + graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { + var edge = graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']); + Metamaps.Control.hideEdge(edge); + } + + return; + } + } + }, + addTopicToMap: function (topic) { + + // TODO + var newPos, tempForT; + Metamaps.Visualize.mGraph.graph.addNode(topic); + tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); + tempForT.setData('dim', 1, 'start'); + tempForT.setData('dim', 25, 'end'); + newPos = new $jit.Complex(); + newPos.x = tempForT.data.$xloc; + newPos.y = tempForT.data.$yloc; + tempForT.setPos(newPos, 'start'); + tempForT.setPos(newPos, 'current'); + tempForT.setPos(newPos, 'end'); + Metamaps.Visualize.mGraph.fx.plotNode(tempForT, Metamaps.Visualize.mGraph.canvas); + }, + updateTopicOnMap: function (topic) { + + // TODO + var newPos, tempForT; + tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); + tempForT.data = topic.data; + tempForT.name = topic.name; + if (MetamapsModel.showcardInUse === topic.id) { + populateShowCard(tempForT); + } + newPos = new $jit.Complex(); + newPos.x = tempForT.data.$xloc; + newPos.y = tempForT.data.$yloc; + tempForT.setPos(newPos, 'start'); + tempForT.setPos(newPos, 'current'); + tempForT.setPos(newPos, 'end'); + return Metamaps.Visualize.mGraph.fx.animate({ + modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], + transition: $jit.Trans.Quad.easeInOut, + duration: 500 + }); + }, + addSynapseToMap: function (synapse) { + + // TODO + var Node1, Node2, tempForS; + Node1 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[0]); + Node2 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[1]); + Metamaps.Visualize.mGraph.graph.addAdjacence(Node1, Node2, {}); + tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(Node1.id, Node2.id); + tempForS.setDataset('start', { + lineWidth: 0.4 + }); + tempForS.setDataset('end', { + lineWidth: 2 + }); + tempForS.data = synapse.data; + Metamaps.Visualize.mGraph.fx.plotLine(tempForS, Metamaps.Visualize.mGraph.canvas); + return Metamaps.Visualize.mGraph.fx.animate({ + modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], + transition: $jit.Trans.Quad.easeInOut, + duration: 500 + }); + }, + updateSynapseOnMap: function (synapse) { + + // TODO + var k, tempForS, v, wasShowDesc, _ref; + tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(synapse.data.$direction[0], synapse.data.$direction[1]); + wasShowDesc = tempForS.data.$showDesc; + _ref = synapse.data; + for (k in _ref) { + v = _ref[k]; + tempForS.data[k] = v; + } + tempForS.data.$showDesc = wasShowDesc; + if (MetamapsModel.edgecardInUse === synapse.data.$id) { // TODO + editEdge(tempForS, false); + } + return Metamaps.Visualize.mGraph.plot(); + } +}; // end Metamaps.Realtime + + +/* + * + * CONTROL + * + */ +Metamaps.Control = { + init: function () { + + }, + selectNode: function (node) { + if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; + node.selected = true; + node.setData('dim', 30, 'current'); + node.eachAdjacency(function (adj) { + Metamaps.Control.selectEdge(adj); + }); + Metamaps.Selected.Nodes.push(node); + }, + deselectAllNodes: function () { + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + var node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.deselectNode(node); + } + Metamaps.Visualize.mGraph.plot(); + }, + deselectNode: function (node) { + delete node.selected; + node.eachAdjacency(function (adj) { + Metamaps.Control.deselectEdge(adj); + }); + node.setData('dim', 25, 'current'); + + //remove the node + Metamaps.Selected.Nodes.splice( + Metamaps.Selected.Nodes.indexOf(node), 1); + }, + deleteSelectedNodes: function () { // refers to deleting topics permanently + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + var node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.deleteNode(node.id); + } + }, + deleteNode: function (nodeid) { // refers to deleting topics permanently + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + var id = node.getData('id'); + Metamaps.Control.deselectNode(node); + Metamaps.Topics.get(id).destroy(); + Metamaps.Control.hideNode(nodeid); + }, + removeSelectedNodes: function () { // refers to removing topics permanently from a map + var l = Metamaps.Selected.Nodes.length, + i, + node, + mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + + if (mapperm) { + for (i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.removeNode(node.id); + } + } + }, + removeNode: function (nodeid) { // refers to removing topics permanently from a map + var mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + var mappingid = node.getData("mapping").id; + + if (mapperm) { + Metamaps.Control.deselectNode(node); + Metamaps.Mappings.get(mappingid).destroy(); + Metamaps.Control.hideNode(nodeid); + } + }, + hideSelectedNodes: function () { + var l = Metamaps.Selected.Nodes.length, + i, + node; + + for (i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + Metamaps.Control.hideNode(node.id); + } + }, + hideNode: function (nodeid) { + var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); + if (nodeid == Metamaps.Visualize.mGraph.root) { // && Metamaps.Visualize.type === "RGraph" + alert("You can't hide this topic, it is the root of your graph."); + return; + } + + Metamaps.Control.deselectNode(node); + + node.setData('alpha', 0, 'end'); + node.eachAdjacency(function (adj) { + adj.setData('alpha', 0, 'end'); + }); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['node-property:alpha', + 'edge-property:alpha' + ], + duration: 500 + }); + setTimeout(function () { + Metamaps.Visualize.mGraph.graph.removeNode(nodeid); + }, 500); + }, + selectEdge: function (edge) { + if (Metamaps.Selected.Edges.indexOf(edge) != -1) return; + edge.setData('showDesc', true, 'current'); + if (!Metamaps.Settings.embed) { + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.selected, + alpha: 1 + }); + } else if (Metamaps.Settings.embed) { + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.selected, + alpha: 1 + }); + } + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:lineWidth:color:alpha'], + duration: 100 + }); + Metamaps.Selected.Edges.push(edge); + }, + deselectAllEdges: function () { + var l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + var edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.deselectEdge(edge); + } + Metamaps.Visualize.mGraph.plot(); + }, + deselectEdge: function (edge) { + edge.setData('showDesc', false, 'current'); + edge.setDataset('end', { + lineWidth: 2, + color: Metamaps.Settings.colors.synapses.normal, + alpha: 0.4 + }); + + if (Metamaps.Mouse.edgeHoveringOver == edge) { + edge.setData('showDesc', true, 'current'); + edge.setDataset('end', { + lineWidth: 4, + color: Metamaps.Settings.colors.synapses.hover, + alpha: 1 + }); + } + + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:lineWidth:color:alpha'], + duration: 100 + }); + + //remove the edge + Metamaps.Selected.Edges.splice( + Metamaps.Selected.Edges.indexOf(edge), 1); + }, + deleteSelectedEdges: function () { // refers to deleting topics permanently + var edge, + l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.deleteEdge(edge); + } + }, + deleteEdge: function (edge) { + + // TODO make it so that you select which one, of multiple possible synapses you want to delete + + //var id = edge.getData("id"); + //Metamaps.Synapses.get(id).destroy(); + //Metamaps.Control.hideEdge(edge); + }, + removeSelectedEdges: function () { + var l = Metamaps.Selected.Edges.length, + i, + edge; + + if (Metamaps.Active.Map) { + for (i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.removeEdge(edge); + } + Metamaps.Selected.Edges = new Array(); + } + }, + removeEdge: function (edge) { + + // TODO make it so that you select which one, of multiple possible synapses you want + + //var mappingid = edge.getData("mappingid"); + //Metamaps.Mappings.get(mappingid).destroy(); + //Metamaps.Control.hideEdge(edge); + }, + hideSelectedEdges: function () { + var edge, + l = Metamaps.Selected.Edges.length, + i; + for (i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + Metamaps.Control.hideEdge(edge); + } + Metamaps.Selected.Edges = new Array(); + }, + hideEdge: function (edge) { + var from = edge.nodeFrom.id; + var to = edge.nodeTo.id; + edge.setData('alpha', 0, 'end'); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['edge-property:alpha'], + duration: 500 + }); + setTimeout(function () { + Metamaps.Visualize.mGraph.graph.removeAdjacence(from, to); + }, 500); + }, + updateSelectedPermissions: function (permission) { + + var edge, synapse, node, topic; + + Metamaps.GlobalUI.notifyUser('Working...'); + + // variables to keep track of how many nodes and synapses you had the ability to change the permission of + var nCount = 0, + sCount = 0; + + // change the permission of the selected synapses, if logged in user is the original creator + var l = Metamaps.Selected.Edges.length; + for (var i = l - 1; i >= 0; i -= 1) { + edge = Metamaps.Selected.Edges[i]; + synapse = edge.getData('synapses')[0]; + + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + synapse.save({ + permission: permission + }); + sCount++; + } + } + + // change the permission of the selected topics, if logged in user is the original creator + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + node = Metamaps.Selected.Nodes[i]; + topic = node.getData('topic'); + + if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { + topic.save({ + permission: permission + }); + nCount++; + } + } + + var nString = nCount == 1 ? (nCount.toString() + ' topic and ') : (nCount.toString() + ' topics and '); + var sString = sCount == 1 ? (sCount.toString() + ' synapse') : (sCount.toString() + ' synapses'); + + var message = nString + sString + ' you created updated to ' + permission; + Metamaps.GlobalUI.notifyUser(message); + }, +}; // end Metamaps.Control + + +/* + * + * FILTER + * + */ +Metamaps.Filter = { + filters: { + name: "", + metacode: [], + mappers: [], + synapseTypes: [] + }, + isOpen: false, + timeOut: null, + changing: false, + init: function () { + var self = Metamaps.Filter; + + $(".sidebarFilter").hover(self.open, self.close); + + // initialize scroll bar for filter by metacode, then hide it and position it correctly again + $("#filter_by_metacode").mCustomScrollbar({ + mouseWheelPixels: 200, + advanced: { + updateOnContentResize: true + } + }); + $('.sidebarFilterBox').hide().css({ + position: 'absolute', + top: '45px', + right: '-36px' + }); + + $('.sidebarFilterBox .showAll').click(self.filterNoMetacodes); + $('.sidebarFilterBox .hideAll').click(self.filterAllMetacodes); + + // toggle visibility of topics with metacodes based on status in the filters list + $('#filter_by_metacode ul li').click(self.toggleMetacode); + }, + open: function () { + var self = Metamaps.Filter; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing) { + self.changing = true; + + $('.sidebarFilterBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.Filter; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + + $('.sidebarFilterBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + filterNoMetacodes: function (e) { + + $('#filter_by_metacode ul li').removeClass('toggledOff'); + + // TODO + /* + showAll(); + + for (var catVis in categoryVisible) { + categoryVisible[catVis] = true; + } + */ + }, + filterAllMetacodes: function (e) { + + $('#filter_by_metacode ul li').addClass('toggledOff'); + + // TODO + /* + hideAll(); + for (var catVis in categoryVisible) { + categoryVisible[catVis] = false; + } + */ + }, + toggleMetacode: function () { + + var category = $(this).children('img').attr('alt'); + + // TODO + /*switchVisible(category); + + // toggle the image and the boolean array value + if (categoryVisible[category] == true) { + $(this).addClass('toggledOff'); + categoryVisible[category] = false; + } else if (categoryVisible[category] == false) { + $(this).removeClass('toggledOff'); + categoryVisible[category] = true; + }*/ + }, + passFilters: function (topic) { + var self = Metamaps.Find; + var filters = self.filters; + + var passesName = filters.name == "" ? true : false, + passesType = filters.type == [] ? true : false; + + //filter by name + if (topic.get('1')[1][0].toLowerCase().indexOf(filters.name) !== -1) { + passesName = true; + } + // filter by type + if (!filters.type == []) { + // get the array of types that your topic 'is' + var metacodes = topic.get('2') ? topic.get('2')[1] : []; + if (_.intersection(filters.type, metacodes).length == 0) passesType = true; + } + + if (passesName && passesType) { + return true; + } else { + return false; + } + } +}; // end Metamaps.Filter + + +/* + * + * LISTENERS + * + */ +Metamaps.Listeners = { + + init: function () { + + $(document).on('keydown', function (e) { + switch (e.which) { + case 13: + Metamaps.JIT.enterKeyHandler(); + e.preventDefault(); + break; + case 27: + Metamaps.JIT.escKeyHandler(); + break; + default: + break; //alert(e.which); + } + }); + + //$(window).resize(function () { + // Metamaps.Visualize.mGraph.canvas.resize($(window).width(), $(window).height()); + //}); + } +}; // end Metamaps.Listeners + + +/* + * + * ORGANIZE + * + */ +Metamaps.Organize = { + init: function () { + + }, + arrange: function (layout, centerNode) { + + + // first option for layout to implement is 'grid', will do an evenly spaced grid with its center at the 0,0 origin + if (layout == 'grid') { + var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); // this will always be an integer, the # of nodes on your graph visualization + var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid + var GRIDSPACE = 400; + var row = 0; + var column = 0; + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (column == numColumns) { + column = 0; + row += 1; + } + var newPos = new $jit.Complex(); + newPos.x = column * GRIDSPACE; + newPos.y = row * GRIDSPACE; + n.setPos(newPos, 'end'); + column += 1; + }); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + } else if (layout == 'grid_full') { + + // this will always be an integer, the # of nodes on your graph visualization + var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); + //var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid + //var GRIDSPACE = 400; + var height = Metamaps.Visualize.mGraph.canvas.getSize(0).height; + var width = Metamaps.Visualize.mGraph.canvas.getSize(0).width; + var totalArea = height * width; + var cellArea = totalArea / numNodes; + var ratio = height / width; + var cellWidth = sqrt(cellArea / ratio); + var cellHeight = cellArea / cellWidth; + var row = floor(height / cellHeight); + var column = floor(width / cellWidth); + var totalCells = row * column; + + if (totalCells) + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (column == numColumns) { + column = 0; + row += 1; + } + var newPos = new $jit.Complex(); + newPos.x = column * GRIDSPACE; + newPos.y = row * GRIDSPACE; + n.setPos(newPos, 'end'); + column += 1; + }); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + } else if (layout == 'radial') { + + var centerX = centerNode.getPos().x; + var centerY = centerNode.getPos().y; + centerNode.setPos(centerNode.getPos(), 'end'); + + console.log(centerNode.adjacencies); + var lineLength = 200; + var usedNodes = {}; + usedNodes[centerNode.id] = centerNode; + var radial = function (node, level, degree) { + if (level == 1) { + var numLinksTemp = _.size(node.adjacencies); + var angleTemp = 2 * Math.PI / numLinksTemp; + } else { + angleTemp = 2 * Math.PI / 20 + }; + node.eachAdjacency(function (a) { + var isSecondLevelNode = (centerNode.adjacencies[a.nodeTo.id] != undefined && level > 1); + if (usedNodes[a.nodeTo.id] == undefined && !isSecondLevelNode) { + var newPos = new $jit.Complex(); + newPos.x = level * lineLength * Math.sin(degree) + centerX; + newPos.y = level * lineLength * Math.cos(degree) + centerY; + a.nodeTo.setPos(newPos, 'end'); + usedNodes[a.nodeTo.id] = a.nodeTo; + + radial(a.nodeTo, level + 1, degree); + degree += angleTemp; + }; + }); + }; + radial(centerNode, 1, 0); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + + } else if (layout == 'center_viewport') { + + var lowX = 0, + lowY = 0, + highX = 0, + highY = 0; + var oldOriginX = Metamaps.Visualize.mGraph.canvas.translateOffsetX; + var oldOriginY = Metamaps.Visualize.mGraph.canvas.translateOffsetY; + + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + if (n.id === 1) { + lowX = n.getPos().x; + lowY = n.getPos().y; + highX = n.getPos().x; + highY = n.getPos().y; + }; + if (n.getPos().x < lowX) lowX = n.getPos().x; + if (n.getPos().y < lowY) lowY = n.getPos().y; + if (n.getPos().x > highX) highX = n.getPos().x; + if (n.getPos().y > highY) highY = n.getPos().y; + }); + console.log(lowX, lowY, highX, highY); + var newOriginX = (lowX + highX) / 2; + var newOriginY = (lowY + highY) / 2; + + } else alert('please call function with a valid layout dammit!'); + }, + loadSavedLayout: function (id) { + Metamaps.Visualize.computePositions(); + Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); + }, +}; // end Metamaps.Organize + + +/* + * + * TOPIC + * + */ +Metamaps.Topic = { + // this function is to retrieve a topic JSON object from the database + // @param id = the id of the topic to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Topics.get(id) == undefined) { + //console.log("Ajax call!"); + if (!callback) { + var e = $.ajax({ + url: "/topics/" + id + ".json", + async: false + }); + Metamaps.Topics.add($.parseJSON(e.responseText)); + return Metamaps.Topics.get(id); + } else { + return $.ajax({ + url: "/topics/" + id + ".json", + success: function (data) { + Metamaps.Topics.add(data); + callback(Metamaps.Topics.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Topics.get(id); + } else { + return callback(Metamaps.Topics.get(id)); + } + } + }, + + /* + * + * + */ + renderTopic: function (mapping, topic, createNewInDB) { + var self = Metamaps.Topic; + + var nodeOnViz, tempPos; + + var newnode = topic.createNode(); + + if (!$.isEmptyObject(Metamaps.Visualize.mGraph.graph.nodes)) { + Metamaps.Visualize.mGraph.graph.addNode(newnode); + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + n.setData("dim", 25, "start"); + n.setData("dim", 25, "end"); + }); + nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); + topic.set('node', nodeOnViz); + topic.updateNode(); // links the topic and the mapping to the node + + + nodeOnViz.setData("dim", 1, "start"); + nodeOnViz.setData("dim", 25, "end"); + if (Metamaps.Visualize.type === "RGraph") { + tempPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); + tempPos = tempPos.toPolar(); + nodeOnViz.setPos(tempPos, "current"); + nodeOnViz.setPos(tempPos, "start"); + nodeOnViz.setPos(tempPos, "end"); + } else if (Metamaps.Visualize.type === "ForceDirected") { + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); + } + if (Metamaps.Create.newTopic.addSynapse) { + Metamaps.Create.newSynapse.topic1id = tempNode.id; + Metamaps.Create.newSynapse.topic2id = nodeOnViz.id; + Metamaps.Create.newSynapse.open(); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + tempNode = null; + tempNode2 = null; + tempInit = false; + } + }); + } else { + Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + + } + }); + } + } else { + Metamaps.Visualize.mGraph.loadJSON(newnode); + nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); + mapping.set('node', nodeOnViz); + mapping.updateNode(); // links the topic and the mapping to the node + + nodeOnViz.setData("dim", 1, "start"); + nodeOnViz.setData("dim", 25, "end"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); + nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); + Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Visualize.mGraph.fx.animate({ + modes: ["node-property:dim"], + duration: 500, + onComplete: function () { + + } + }); + } + + if (!Metamaps.Settings.sandbox && createNewInDB) { + if (topic.isNew()) { + topic.save(null, { + success: function (topicModel, response) { + topicModel.updateMapping(); + if (Metamaps.Active.Map) { + mapping.save(); + } + }, + error: function (model, response) { + console.log('error saving topic to database'); + } + }); + } else if (!topic.isNew() && Metamaps.Active.Map) { + mapping.save(); + } + } + }, + createTopicLocally: function () { + var self = Metamaps.Topic; + + var metacode = Metamaps.Metacodes.findWhere({ + name: Metamaps.Create.newTopic.metacode + }); + + var topic = new Metamaps.Backbone.Topic({ + name: Metamaps.Create.newTopic.name, + metacode_id: metacode.id + }); + Metamaps.Topics.add(topic); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Topic", + xloc: Metamaps.Create.newTopic.x, + yloc: Metamaps.Create.newTopic.y, + topic_id: topic.cid + }); + Metamaps.Mappings.add(mapping); + + //these can't happen until the value is retrieved, which happens in the line above + Metamaps.Create.newTopic.hide(); + + self.renderTopic(mapping, topic, true); // this function also includes the creation of the topic in the database + }, + getTopicFromAutocomplete: function (id) { + var self = Metamaps.Topic; + + Metamaps.Create.newTopic.hide(); + + var topic = self.get(id); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Topic", + xloc: Metamaps.Create.newTopic.x, + yloc: Metamaps.Create.newTopic.y, + topic_id: topic.id + }); + Metamaps.Mappings.add(mapping); + + self.renderTopic(mapping, topic, false); + } +}; // end Metamaps.Topic + + +/* + * + * SYNAPSE + * + */ +Metamaps.Synapse = { + // this function is to retrieve a synapse JSON object from the database + // @param id = the id of the synapse to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Synapses.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/synapses/" + id + ".json", + async: false + }); + Metamaps.Synapses.add($.parseJSON(e.responseText)); + return Metamaps.Synapses.get(id); + } else { + return $.ajax({ + url: "/synapses/" + id + ".json", + success: function (data) { + Metamaps.Synapses.add(data); + callback(Metamaps.Synapses.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Synapses.get(id); + } else { + return callback(Metamaps.Synapses.get(id)); + } + } + }, + /* + * + * + */ + renderSynapse: function (mapping, synapse, node1, node2, createNewInDB) { + var self = Metamaps.Synapse; + + var edgeOnViz; + + var newedge = synapse.createEdge(); + + Metamaps.Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data); + edgeOnViz = Metamaps.Visualize.mGraph.graph.getAdjacence(node1.id, node2.id); + synapse.set('edge', edgeOnViz); + synapse.updateEdge(); // links the topic and the mapping to the node + + Metamaps.Visualize.mGraph.fx.plotLine(edgeOnViz, Metamaps.Visualize.mGraph.canvas); + Metamaps.Control.selectEdge(edgeOnViz); + + if (!Metamaps.Settings.sandbox && createNewInDB) { + if (synapse.isNew()) { + synapse.save(null, { + success: function (synapseModel, response) { + synapseModel.updateMapping(); + if (Metamaps.Active.Map) { + mapping.save(); + } + }, + error: function (model, response) { + console.log('error saving synapse to database'); + } + }); + } else if (!synapse.isNew() && Metamaps.Active.Map) { + mapping.save(); + } + } + }, + createSynapseLocally: function () { + var self = Metamaps.Synapse, + topic1, + topic2, + node1, + node2, + synapse, + mapping; + + //for each node in this array we will create a synapse going to the position2 node. + var synapsesToCreate = []; + + node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + topic2 = node2.getData('topic'); + + var len = Metamaps.Selected.Nodes.length; + if (len == 0) { + synapsesToCreate[0] = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); + } else if (len > 0) { + synapsesToCreate = Metamaps.Selected.Nodes; + } + + for (var i = 0; i < synapsesToCreate.length; i++) { + node1 = synapsesToCreate[i]; + topic1 = node1.getData('topic'); + synapse = new Metamaps.Backbone.Synapse({ + desc: Metamaps.Create.newSynapse.description, + node1_id: topic1.isNew() ? topic1.cid : topic1.id, + node2_id: topic2.isNew() ? topic2.cid : topic2.id, + }); + Metamaps.Synapses.add(synapse); + + mapping = new Metamaps.Backbone.Mapping({ + category: "Synapse", + synapse_id: synapse.cid + }); + Metamaps.Mappings.add(mapping); + + // this function also includes the creation of the synapse in the database + self.renderSynapse(mapping, synapse, node1, node2, true); + } // for each in synapsesToCreate + + Metamaps.Create.newSynapse.hide(); + }, + getSynapseFromAutocomplete: function (id) { + var self = Metamaps.Synapse, + node1, + node2; + + Metamaps.Create.newSynapse.hide(); + + var synapse = self.get(id); + + var mapping = new Metamaps.Backbone.Mapping({ + category: "Synapse", + synapse_id: synapse.id + }); + Metamaps.Mappings.add(mapping); + + node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); + node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + + self.renderSynapse(mapping, synapse, node1, node2, false); + } +}; // end Metamaps.Synapse + + +/* + * + * MAP + * + */ +Metamaps.Map = { + init: function () { + var self = Metamaps.Map; + + // prevent right clicks on the main canvas, so as to not get in the way of our right clicks + $('#center-container').bind('contextmenu', function (e) { + return false; + }); + + $('.sidebarFork').click(function () { + self.fork(); + }); + + Metamaps.GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html(); + + self.InfoBox.init(); + self.CheatSheet.init(); + }, + // this function is to retrieve a map JSON object from the database + // @param id = the id of the map to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Maps.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/maps/" + id + ".json", + async: false + }); + Metamaps.Maps.add($.parseJSON(e.responseText)); + return Metamaps.Maps.get(id); + } else { + return $.ajax({ + url: "/users/" + id + ".json", + success: function (data) { + Metamaps.Maps.add(data); + callback(Metamaps.Maps.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Maps.get(id); + } else { + return callback(Metamaps.Maps.get(id)); + } + } + }, + fork: function () { + Metamaps.GlobalUI.openLightbox('forkmap'); + + var nodes_data = "", + synapses_data = ""; + var synapses_array = new Array(); + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + //don't add to the map if it was filtered out + // TODO + //if (categoryVisible[n.getData('metacode')] == false) { + // return; + //} + + var x, y; + if (n.pos.x && n.pos.y) { + x = n.pos.x; + y = n.pos.y; + } else { + var x = Math.cos(n.pos.theta) * n.pos.rho; + var y = Math.sin(n.pos.theta) * n.pos.rho; + } + nodes_data += n.id + '/' + x + '/' + y + ','; + n.eachAdjacency(function (adj) { + synapses_array.push(adj.getData("synapses")[0].id); // TODO + }); + }); + + //get unique values only + synapses_array = $.grep(synapses_array, function (value, key) { + return $.inArray(value, synapses_array) === key; + }); + + synapses_data = synapses_array.join(); + nodes_data = nodes_data.slice(0, -1); + + Metamaps.GlobalUI.CreateMap.topicsToMap = nodes_data; + Metamaps.GlobalUI.CreateMap.synapsesToMap = synapses_data; + } +}; + + +/* + * + * CHEATSHEET + * + */ +Metamaps.Map.CheatSheet = { + init: function () { + // tab the cheatsheet + $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + } +}; // end Metamaps.Map.CheatSheet + + +/* + * + * INFOBOX + * + */ +Metamaps.Map.InfoBox = { + isOpen: false, + timeOut: null, + changing: false, + selectingPermission: false, + init: function () { + var self = Metamaps.Map.InfoBox; + + // because anyone who can edit the map can change the map title + $('.mapInfoName .best_in_place_name').bind("ajax:success", function () { + var name = $(this).html(); + $('.mapName').html(name); + Metamaps.Active.Map.set('name', name); + }); + + $('.yourMap .mapPermission').click(self.onPermissionClick); + + $("div.index").hover(self.open, self.close); + }, + open: function (event) { + var self = Metamaps.GlobalUI.Account; + + clearTimeout(self.timeOut); + if (!self.isOpen && !self.changing && event.target.className != "openCheatsheet openLightbox") { + self.changing = true; + $('.mapInfoBox').fadeIn(200, function () { + self.changing = false; + self.isOpen = true; + }); + } + }, + close: function () { + var self = Metamaps.GlobalUI.Account; + + self.timeOut = setTimeout(function () { + if (!self.changing) { + self.changing = true; + $('.mapInfoBox').fadeOut(200, function () { + self.changing = false; + self.isOpen = false; + }); + } + }, 500); + }, + onPermissionClick: function () { + var self = Metamaps.Map.InfoBox; + + if (!self.selectingPermission) { + self.selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('commons')) { + $(this).append('
    '); + } else if ($(this).hasClass('public')) { + $(this).append('
    '); + } else if ($(this).hasClass('private')) { + $(this).append('
    '); + } + $('.mapPermission .permissionSelect li').click(self.selectPermission); + } else { + self.selectingPermission = false; + $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.mapPermission .permissionSelect').remove(); + } + }, + selectPermission: function () { + var self = Metamaps.Map.InfoBox; + + self.selectingPermission = false; + var permission = $(this).attr('class'); + Metamaps.Active.Map.save({ + permission: permission + }); + $('.mapPermission').removeClass('commons public private minimize').addClass(permission); + $('.mapPermission .permissionSelect').remove(); + event.stopPropagation(); + } +}; // end Metamaps.Map.InfoBox + + +/* + * + * MAPPER + * + */ +Metamaps.Mapper = { + // this function is to retrieve a mapper JSON object from the database + // @param id = the id of the mapper to retrieve + get: function (id, callback) { + // if the desired topic is not yet in the local topic repository, fetch it + if (Metamaps.Mappers.get(id) == undefined) { + if (!callback) { + var e = $.ajax({ + url: "/users/" + id + ".json", + async: false + }); + Metamaps.Mappers.add($.parseJSON(e.responseText)); + return Metamaps.Mappers.get(id); + } else { + return $.ajax({ + url: "/users/" + id + ".json", + success: function (data) { + Metamaps.Mappers.add(data); + callback(Metamaps.Mappers.get(id)); + } + }); + } + } else { + if (!callback) { + return Metamaps.Mappers.get(id); + } else { + return callback(Metamaps.Mappers.get(id)); + } + } + }, +}; // end Metamaps.Mapper \ No newline at end of file diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 8b1d85d8..82d5cf52 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -38,9 +38,7 @@
    -

    Filter By Metacode

    allnone -
    - <%= render :partial => 'shared/filterbymetacode' %> + <%= render :partial => 'shared/filterBox' %>
    @@ -79,4 +77,4 @@ Metamaps.Topics = <%= @alltopics.to_json.html_safe %>; Metamaps.Synapses = <%= @allsynapses.to_json.html_safe %>; Metamaps.Mappings = <%= @allmappings.to_json.html_safe %>; - \ No newline at end of file + diff --git a/app/views/maps/show.html.erb~ b/app/views/maps/show.html.erb~ new file mode 100644 index 00000000..1a7a2081 --- /dev/null +++ b/app/views/maps/show.html.erb~ @@ -0,0 +1,82 @@ +<%# +# @file +# Code to display a map +# /maps/:id +#%> + +<% content_for :title, @map.name + " | Metamaps" %> + +
    + +
    + + +<% if authenticated? %> +
    +
    +
    +
    +
    +<% if @map.permission == "commons" || @map.user == user %> +
    +
    +
    +

    Realtime:

    + ON +
    +
    +
      +
    • + <%= user.name %> (me) +
    • +
    +
    +
    +
    +<% end %> +<% end %> +
    +
    +
    +

    Filter By Metacode

    allnone +
    + <%= render :partial => 'shared/filterBox' %> +
    +
    + +
    +
    + +
    + <%= render :partial => 'maps/mapinfobox' %> +
    + +
    +
    +
    +
    +
    +
    +
    + +<% if authenticated? %> + +<% # add these if you have edit permissions on the map %> +<% if @map.permission == "commons" || @map.user == user %> +<% # for creating and pulling in topics and synapses %> +<%= render :partial => 'newtopic' %> +<%= render :partial => 'newsynapse' %> +<% end %> + +<% # for populating the change metacode list on the topic card %> +<%= render :partial => 'shared/metacodeoptions' %> +<% end %> + + + diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb new file mode 100644 index 00000000..f74d3c4a --- /dev/null +++ b/app/views/shared/_filterBox.html.erb @@ -0,0 +1,44 @@ +<%# + # @file + # this code generates the list of icons in the filter by metacode box in the upper right menu area + #%> + +<% + @mappers = [] + @synapses = [] + @metacodes = [] + @metacodelist = '' + @mapperlist = '' + @synapselist = '' + @map.topics.each_with_index do |topic, index| + if @metacodes.index(topic.metacode_id) == nil + @metacodes.push(topic.metacode_id) + @metacodelist += '
  • ' + topic.metacode.id.to_s + '

    ' + topic.metacode.name.downcase + '

  • ' + end + end + + @map.synapses.each_with_index do |synapses, index| + if @synapses.index(synapses.synapse_id) == nil + @synapses.push(synapses.synapse_id) + @synapselist += '
  • ' + synapse.id.to_s + '

    ' + synapse.name.downcase + '

  • ' + end + + end +%> + +

    Filter By Metacode

    allnone +
    +
    +
      + <%= @metacodelist.html_safe %> +
    +
    + +
    +
      + <%= @synapselist.html_safe %> +
    +
    + +
    +
    diff --git a/app/views/shared/_filterBox.html.erb~ b/app/views/shared/_filterBox.html.erb~ new file mode 100644 index 00000000..e909651a --- /dev/null +++ b/app/views/shared/_filterBox.html.erb~ @@ -0,0 +1,42 @@ +<%# + # @file + # this code generates the list of icons in the filter by metacode box in the upper right menu area + #%> + +<% + @mappers = [] + @synapses = [] + @metacodes = [] + @metacodelist = '' + @mapperlist = '' + @synapselist = '' + @map.topics.each_with_index do |topic, index| + if @metacodes.index(topic.metacode_id) == nil + @metacodes.push(topic.metacode_id) + @metacodelist += '
  • ' + topic.metacode.id.to_s + '

    ' + topic.metacode.name.downcase + '

  • ' + end + end + + @map.synapses.each_with_index do |synapses, index| + if @synapses.index(synapses.synapse_id) == nil + @synapses.push(synapses.synapse_id) + @synapselist += '
  • ' + synapse.id.to_s + '

    ' + synapse.name.downcase + '

  • ' + end + + end +%> + +

    Filter By Metacode

    allnone +
    +
    +
      + <%= @metacodelist.html_safe %> +
    +
    + +
    +
      + <%= @synapselist.html_safe %> +
    +
    +
    diff --git a/db/schema.rb b/db/schema.rb index c3fce2b2..ec86b421 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,129 +1,129 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140707161810) do - - create_table "in_metacode_sets", :force => true do |t| - t.integer "metacode_id" - t.integer "metacode_set_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" - add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" - - create_table "mappings", :force => true do |t| - t.text "category" - t.integer "xloc" - t.integer "yloc" - t.integer "topic_id" - t.integer "synapse_id" - t.integer "map_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "maps", :force => true do |t| - t.text "name" - t.boolean "arranged" - t.text "desc" - t.text "permission" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "featured" - end - - create_table "metacode_sets", :force => true do |t| - t.string "name" - t.text "desc" - t.integer "user_id" - t.boolean "mapperContributed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" - - create_table "metacodes", :force => true do |t| - t.text "name" - t.string "icon" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "synapses", :force => true do |t| - t.text "desc" - t.text "category" - t.text "weight" - t.text "permission" - t.integer "node1_id" - t.integer "node2_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "topics", :force => true do |t| - t.text "name" - t.text "desc" - t.text "link" - t.text "permission" - t.integer "user_id" - t.integer "metacode_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - t.string "audio_file_name" - t.string "audio_content_type" - t.integer "audio_file_size" - t.datetime "audio_updated_at" - end - - create_table "users", :force => true do |t| - t.string "name" - t.string "email" - t.text "settings" - t.string "code", :limit => 8 - t.string "joinedwithcode", :limit => 8 - t.string "crypted_password" - t.string "password_salt" - t.string "persistence_token" - t.string "perishable_token" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "encrypted_password", :limit => 128, :default => "" - t.string "remember_token" - t.datetime "remember_created_at" - t.string "reset_password_token" - t.datetime "last_sign_in_at" - t.string "last_sign_in_ip" - t.integer "sign_in_count", :default => 0 - t.datetime "current_sign_in_at" - t.string "current_sign_in_ip" - t.datetime "reset_password_sent_at" - t.boolean "admin" - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - end - - add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true - -end +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140707161810) do + + create_table "in_metacode_sets", :force => true do |t| + t.integer "metacode_id" + t.integer "metacode_set_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" + add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" + + create_table "mappings", :force => true do |t| + t.text "category" + t.integer "xloc" + t.integer "yloc" + t.integer "topic_id" + t.integer "synapse_id" + t.integer "map_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "maps", :force => true do |t| + t.text "name" + t.boolean "arranged" + t.text "desc" + t.text "permission" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "featured" + end + + create_table "metacode_sets", :force => true do |t| + t.string "name" + t.text "desc" + t.integer "user_id" + t.boolean "mapperContributed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" + + create_table "metacodes", :force => true do |t| + t.text "name" + t.string "icon" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "synapses", :force => true do |t| + t.text "desc" + t.text "category" + t.text "weight" + t.text "permission" + t.integer "node1_id" + t.integer "node2_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "topics", :force => true do |t| + t.text "name" + t.text "desc" + t.text "link" + t.text "permission" + t.integer "user_id" + t.integer "metacode_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + t.string "audio_file_name" + t.string "audio_content_type" + t.integer "audio_file_size" + t.datetime "audio_updated_at" + end + + create_table "users", :force => true do |t| + t.string "name" + t.string "email" + t.text "settings" + t.string "code", :limit => 8 + t.string "joinedwithcode", :limit => 8 + t.string "crypted_password" + t.string "password_salt" + t.string "persistence_token" + t.string "perishable_token" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "encrypted_password", :limit => 128, :default => "" + t.string "remember_token" + t.datetime "remember_created_at" + t.string "reset_password_token" + t.datetime "last_sign_in_at" + t.string "last_sign_in_ip" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.string "current_sign_in_ip" + t.datetime "reset_password_sent_at" + t.boolean "admin" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + end + + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + +end From b09eed715b1fa05a0e6d2f12593b4afe5a7b50d1 Mon Sep 17 00:00:00 2001 From: Robert Best Date: Sat, 2 Aug 2014 14:32:07 -0400 Subject: [PATCH 020/600] specify redis gem version number --- Gemfile | 2 +- Gemfile.lock | 4 ++-- app/assets/javascripts/metamaps/Metamaps.Router.js | 4 ++-- app/assets/javascripts/metamaps/metamaps.js | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 51ddc1db..8fd03a16 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ gem 'rails', '3.2.17' # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'devise' -gem 'redis' +gem 'redis', '2.2.2' gem 'pg' gem 'cancan' gem 'formula' diff --git a/Gemfile.lock b/Gemfile.lock index e4bbb146..b4efab8d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -117,7 +117,7 @@ GEM rake (10.3.2) rdoc (3.12.2) json (~> 1.4) - redis (3.0.7) + redis (2.2.2) sass (3.3.7) sass-rails (3.2.6) railties (~> 3.2.0) @@ -160,6 +160,6 @@ DEPENDENCIES pg rails (= 3.2.17) rails3-jquery-autocomplete - redis + redis (= 2.2.2) sass-rails uglifier (>= 1.0.3) diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 812b9108..7ecb49b3 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -14,7 +14,7 @@ }); Metamaps.Router = new Router(); Metamaps.Router.init = function () { - Backbone.history.start({ + /*Backbone.history.start({ pushState: true, root: '' }); @@ -30,6 +30,6 @@ evt.preventDefault(); Backbone.history.navigate(href.attr, true); } - }); + });*/ } })(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/metamaps.js b/app/assets/javascripts/metamaps/metamaps.js index cc796c14..fdc97cfa 100644 --- a/app/assets/javascripts/metamaps/metamaps.js +++ b/app/assets/javascripts/metamaps/metamaps.js @@ -2261,8 +2261,8 @@ Metamaps.Topic = { } else { Metamaps.Visualize.mGraph.loadJSON(newnode); nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - mapping.set('node', nodeOnViz); - mapping.updateNode(); // links the topic and the mapping to the node + topic.set('node', nodeOnViz); + topic.updateNode(); // links the topic and the mapping to the node nodeOnViz.setData("dim", 1, "start"); nodeOnViz.setData("dim", 25, "end"); From c7b768d7f498297a6ee7dedf06b8cec2f99f64e0 Mon Sep 17 00:00:00 2001 From: Robert Best Date: Sun, 3 Aug 2014 18:34:22 -0400 Subject: [PATCH 021/600] Finished selectWithBox using right click and made Ctrl and Shift work in the 'typical' way... Also, holdig alt now selects only nodes --- .../javascripts/metamaps/Metamaps.JIT.js | 128 ++++++++++++++++-- app/assets/javascripts/metamaps/metamaps.js | 13 +- 2 files changed, 125 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.JIT.js b/app/assets/javascripts/metamaps/Metamaps.JIT.js index c05677b6..8c6cb11e 100644 --- a/app/assets/javascripts/metamaps/Metamaps.JIT.js +++ b/app/assets/javascripts/metamaps/Metamaps.JIT.js @@ -307,7 +307,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.selectNodesWithBox(); + Metamaps.JIT.selectNodesWithBox(e); return; } @@ -331,7 +331,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.selectNodesWithBox(); + Metamaps.JIT.selectNodesWithBox(e); return; } @@ -885,12 +885,11 @@ Metamaps.JIT = { // 4 this node and others were selected, so drag them (just return false) //return value: deselect node again after? if (Metamaps.Selected.Nodes.length == 0) { - Metamaps.Control.selectNode(node); - return 'deselect'; + return 'only-drag-this-one'; } if (Metamaps.Selected.Nodes.indexOf(node) == -1) { if (e.shiftKey) { - Metamaps.Control.selectNode(node); + Metamaps.Control.selectNode(node,e); return 'nothing'; } else { return 'only-drag-this-one'; @@ -898,26 +897,131 @@ Metamaps.JIT = { } return 'nothing'; //case 4? }, // handleSelectionBeforeDragging - selectNodesWithBox: function () { + selectNodesWithBox: function (e) { var sX = Metamaps.Mouse.boxStartCoordinates.x, sY = Metamaps.Mouse.boxStartCoordinates.y, eX = Metamaps.Mouse.boxEndCoordinates.x, eY = Metamaps.Mouse.boxEndCoordinates.y; + + if(!(e.shiftKey) && !(e.ctrlKey)){ + Metamaps.Control.deselectAllNodes(); + Metamaps.Control.deselectAllEdges(); + } - + //select all nodes, and their edges, that are within the box Metamaps.Visualize.mGraph.graph.eachNode(function (n) { var x = n.pos.x, y = n.pos.y; if ((sX < x && x < eX && sY < y && y < eY) || (sX > x && x > eX && sY > y && y > eY) || (sX > x && x > eX && sY < y && y < eY) || (sX < x && x < eX && sY > y && y > eY)) { - var nodeIsSelected = Metamaps.Selected.Nodes.indexOf(n); - if (nodeIsSelected == -1) Metamaps.Control.selectNode(n); // the node is not selected, so select it - else if (nodeIsSelected != -1) Metamaps.Control.deselectNode(n); // the node is selected, so deselect it - + if(e.ctrlKey){ + if(n.selected){ + Metamaps.Control.deselectNode(n); + } + else{ + Metamaps.Control.selectNode(n,e); + } + } + else{ + Metamaps.Control.selectNode(n,e); + } } }); + //Convert selection box coordinates to traditional coordinates (+,+) in upper right + sY = -1 * sY; + eY = -1 * eY + + Metamaps.Synapses.each(function(synapse) { + var fromNodeX = synapse.get('edge').nodeFrom.pos.x; + var fromNodeY = -1 * synapse.get('edge').nodeFrom.pos.y; + var toNodeX = synapse.get('edge').nodeTo.pos.x; + var toNodeY = -1 * synapse.get('edge').nodeTo.pos.y; + + var maxX = fromNodeX; + var maxY = fromNodeY; + var minX = fromNodeX; + var minY = fromNodeY; + + //Correct maxX, MaxY values + (toNodeX > maxX) ? (maxX = toNodeX):(minX = toNodeX); + (toNodeY > maxY) ? (maxY = toNodeY):(minY = toNodeY); + + var maxBoxX = sX; + var maxBoxY = sY; + var minBoxX = sX; + var minBoxY = sY; + + //Correct maxBoxX, maxBoxY values + (eX > maxBoxX) ? (maxBoxX = eX):(minBoxX = eX); + (eY > maxBoxY) ? (maxBoxY = eY):(minBoxY = eY); + + //Fins the slopes from the synapse fromNode to the 4 corners of the selection box + var slopes = []; + slopes.push( (sY - fromNodeY) / (sX - fromNodeX) ); + slopes.push( (sY - fromNodeY) / (eX - fromNodeX) ); + slopes.push( (eY - fromNodeY) / (eX - fromNodeX) ); + slopes.push( (eY - fromNodeY) / (sX - fromNodeX) ); + + var minSlope = slopes[0]; + var maxSlope = slopes[0]; + slopes.forEach(function(entry){ + if(entry > maxSlope) maxSlope = entry; + if(entry < minSlope) minSlope = entry; + }); + + //Find synapse-in-question's slope + var synSlope = (toNodeY - fromNodeY) / (toNodeX - fromNodeX); + var b = fromNodeY - synSlope * fromNodeX; + + var selectTest = false; + + //if the synapse slope is within a range that would intersect with the selection box + if (synSlope <= maxSlope && synSlope >= minSlope){ + var testX = sX; + var testY = synSlope * testX + b; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ + selectTest = true; + } + + testX = eX; + testY = synSlope * testX + b; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ + selectTest = true; + } + + testY = sY; + testX = (testY - b)/synSlope; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){ + selectTest = true; + } + + testY = eY; + testX = (testY - b)/synSlope; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){ + selectTest = true; + } + } + //The test synapse was selected! + if(selectTest){ + if(e.ctrlKey){ + if(Metamaps.Selected.Edges.indexOf(synapse.get('edge')) != -1 ){ + Metamaps.Control.deselectEdge(synapse.get('edge')); + } + else{ + Metamaps.Control.selectEdge(synapse.get('edge')); + } + } + else{ + Metamaps.Control.selectEdge(synapse.get('edge')); + } + } + }); Metamaps.Mouse.boxStartCoordinates = false; Metamaps.Mouse.boxEndCoordinates = false; Metamaps.Visualize.mGraph.plot(); @@ -974,7 +1078,7 @@ Metamaps.JIT = { if (node.selected) { Metamaps.Control.deselectNode(node); } else { - Metamaps.Control.selectNode(node); + Metamaps.Control.selectNode(node,e); } //trigger animation to final styles Metamaps.Visualize.mGraph.fx.animate({ diff --git a/app/assets/javascripts/metamaps/metamaps.js b/app/assets/javascripts/metamaps/metamaps.js index ea0addf8..8c7ef841 100644 --- a/app/assets/javascripts/metamaps/metamaps.js +++ b/app/assets/javascripts/metamaps/metamaps.js @@ -1595,13 +1595,16 @@ Metamaps.Control = { init: function () { }, - selectNode: function (node) { + selectNode: function (node,e) { if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; node.selected = true; node.setData('dim', 30, 'current'); - node.eachAdjacency(function (adj) { - Metamaps.Control.selectEdge(adj); - }); + if(!(e.ctrlKey) && !(e.altKey)){ + node.eachAdjacency(function (adj) { + Metamaps.Control.selectEdge(adj); + }); + } + Metamaps.Selected.Nodes.push(node); }, deselectAllNodes: function () { @@ -1614,9 +1617,11 @@ Metamaps.Control = { }, deselectNode: function (node) { delete node.selected; + /* node.eachAdjacency(function (adj) { Metamaps.Control.deselectEdge(adj); }); + */ node.setData('dim', 25, 'current'); //remove the node From e76d780335b112c782494bd6d4b4adea4cb3766c Mon Sep 17 00:00:00 2001 From: Tadasu85 Date: Mon, 4 Aug 2014 12:20:16 -0400 Subject: [PATCH 022/600] Filter box coding changes, Full implementgit add . --- Gemfile~ | 47 - .../images/{icons => }/synapsevisualize.png | Bin .../soundmanagerv297a-20131201/README.rdoc | 71 + .../demo/360-player/360 button - large.psd | Bin 0 -> 31168 bytes .../demo/360-player/360 button.psd | Bin 0 -> 38695 bytes .../360-player/360-button-pause-light.gif | Bin 0 -> 329 bytes .../360-player/360-button-pause-light.png | Bin 0 -> 422 bytes .../demo/360-player/360-button-pause.gif | Bin 0 -> 329 bytes .../demo/360-player/360-button-pause.png | Bin 0 -> 339 bytes .../demo/360-player/360-button-play-light.gif | Bin 0 -> 441 bytes .../demo/360-player/360-button-play-light.png | Bin 0 -> 477 bytes .../demo/360-player/360-button-play.gif | Bin 0 -> 441 bytes .../demo/360-player/360-button-play.png | Bin 0 -> 368 bytes .../360-player/360-button-vis-pause-light.gif | Bin 0 -> 889 bytes .../360-player/360-button-vis-pause-light.png | Bin 0 -> 1304 bytes .../demo/360-player/360-button-vis-pause.gif | Bin 0 -> 881 bytes .../demo/360-player/360-button-vis-pause.png | Bin 0 -> 1293 bytes .../360-player/360-button-vis-play-light.gif | Bin 0 -> 1009 bytes .../360-player/360-button-vis-play-light.png | Bin 0 -> 1441 bytes .../demo/360-player/360-button-vis-play.gif | Bin 0 -> 1001 bytes .../demo/360-player/360-button-vis-play.png | Bin 0 -> 1380 bytes .../360-player/360player-visualization.css | 156 + .../demo/360-player/360player.css | 271 + .../canvas-visualization-basic.html | 132 + .../demo/360-player/canvas-visualization.html | 359 + .../demo/360-player/demo-slider-controls.css | 179 + .../demo/360-player/demo-slider-controls.js | 750 + .../demo/360-player/demo.css | 64 + .../demo/360-player/icon_loading_dots.gif | Bin 0 -> 1379 bytes .../demo/360-player/icon_loading_spinner.gif | Bin 0 -> 493 bytes .../icon_loading_spinner_bigger.gif | Bin 0 -> 2506 bytes .../demo/360-player/index.html | 173 + .../demo/360-player/script/360player.js | 1410 ++ .../360-player/script/berniecode-animator.js | 674 + .../demo/360-player/script/excanvas.js | 17 + .../demo/_image/360ui-screenshot1.png | Bin 0 -> 11385 bytes .../demo/_image/360ui-screenshot2.png | Bin 0 -> 12003 bytes .../demo/_image/360ui-screenshot3.png | Bin 0 -> 8983 bytes .../demo/_image/360ui-screenshot4.png | Bin 0 -> 20034 bytes .../demo/_image/armor-alley-screenshot.png | Bin 0 -> 64663 bytes .../_image/cassette-tape-ui-screenshot.jpg | Bin 0 -> 49436 bytes .../_image/cassette-tape-ui-screenshot.png | Bin 0 -> 119618 bytes .../demo/_image/christmas-lights.jpg | Bin 0 -> 23588 bytes .../demo/_image/christmas-lights.png | Bin 0 -> 119590 bytes .../demo/_image/chunk-webfont.svg | 127 + .../demo/_image/chunk-webfont.ttf | Bin 0 -> 20496 bytes .../demo/_image/chunk-webfont.woff | Bin 0 -> 13660 bytes .../demo/_image/dejavusansmono-webfont.eot | Bin 0 -> 19626 bytes .../demo/_image/dejavusansmono-webfont.woff | Bin 0 -> 23040 bytes .../demo/_image/fitter-happier-waveform.jpg | Bin 0 -> 12510 bytes .../demo/_image/fitter-happier-waveform.png | Bin 0 -> 25212 bytes .../demo/_image/flash9-dark.png | Bin 0 -> 201 bytes .../demo/_image/flash9.png | Bin 0 -> 233 bytes .../demo/_image/getsatisfaction-icon.gif | Bin 0 -> 89 bytes ...phish-dot-com-icons-and-android-sprite.png | Bin 0 -> 1895 bytes .../demo/_image/hue_thumb.png | Bin 0 -> 102 bytes .../demo/_image/logo-sprite.png | Bin 0 -> 33987 bytes .../demo/_image/mpc-screenshot.png | Bin 0 -> 2781 bytes .../demo/_image/muxtape-logo.png | Bin 0 -> 3224 bytes .../demo/_image/new-bw.png | Bin 0 -> 180 bytes .../demo/_image/new-dark.png | Bin 0 -> 168 bytes .../demo/_image/new.png | Bin 0 -> 205 bytes .../demo/_image/noise-dark.png | Bin 0 -> 7659 bytes .../demo/_image/noise.png | Bin 0 -> 7613 bytes .../demo/_image/picker_thumb.png | Bin 0 -> 107 bytes .../demo/_image/slider-1.png | Bin 0 -> 855 bytes .../demo/_image/slider-bar.gif | Bin 0 -> 101 bytes .../demo/_image/slider.png | Bin 0 -> 549 bytes .../demo/_image/soundmanager2-speaker.png | Bin 0 -> 34378 bytes .../demo/_image/speaker.png | Bin 0 -> 5913 bytes .../demo/_image/survivor-screenshot.png | Bin 0 -> 4433 bytes .../demo/_image/tiny_grid.png | Bin 0 -> 168 bytes .../demo/_image/wedge.png | Bin 0 -> 832 bytes .../demo/_image/wheelsofsteel-full-ui.jpg | Bin 0 -> 13063 bytes .../demo/_image/wheelsofsteel-full-ui.png | Bin 0 -> 53650 bytes .../_image/wheelsofsteel-single-deck-256.jpg | Bin 0 -> 14946 bytes .../demo/_mp3/1hz-10khz-sweep.mp3 | Bin 0 -> 157987 bytes .../demo/_mp3/440hz.mp3 | Bin 0 -> 40541 bytes .../demo/_mp3/880hz.mp3 | Bin 0 -> 40541 bytes .../demo/_mp3/background0.mp3 | Bin 0 -> 2160 bytes .../demo/_mp3/background1.mp3 | Bin 0 -> 2592 bytes .../demo/_mp3/background2.mp3 | Bin 0 -> 2592 bytes .../demo/_mp3/bass.mp3 | Bin 0 -> 106161 bytes .../demo/_mp3/button-0.mp3 | Bin 0 -> 10240 bytes .../demo/_mp3/button-1.mp3 | Bin 0 -> 10240 bytes .../demo/_mp3/click-high.mp3 | Bin 0 -> 4224 bytes .../demo/_mp3/click-low.mp3 | Bin 0 -> 4224 bytes .../demo/_mp3/coins.mp3 | Bin 0 -> 59349 bytes .../demo/_mp3/fancy-beer-bottle-pop.mp3 | Bin 0 -> 113266 bytes .../demo/_mp3/going_outside.mp3 | Bin 0 -> 225416 bytes .../demo/_mp3/mak.mp3 | Bin 0 -> 34271 bytes .../demo/_mp3/mouseover.mp3 | Bin 0 -> 1353 bytes .../demo/_mp3/mouseover2.mp3 | Bin 0 -> 2991 bytes .../demo/_mp3/mouseover3.mp3 | Bin 0 -> 1274 bytes .../demo/_mp3/office_lobby.mp3 | Bin 0 -> 158958 bytes .../demo/_mp3/rain.mp3 | Bin 0 -> 131357 bytes .../demo/_mp3/select.mp3 | Bin 0 -> 10557 bytes .../_mp3/sine, square, sawtooth, rando.mp3 | Bin 0 -> 105742 bytes .../demo/_mp3/walking.mp3 | Bin 0 -> 64072 bytes .../demo/animation-1/css/animation.css | 74 + .../demo/animation-1/image/ball.gif | Bin 0 -> 348 bytes .../demo/animation-1/index.html | 46 + .../demo/animation-1/script/animation.js | 190 + .../demo/animation-2a/bg-land.png | Bin 0 -> 326 bytes .../demo/animation-2a/bg-sky.png | Bin 0 -> 492 bytes .../demo/animation-2a/cursor-10.cur | Bin 0 -> 2238 bytes .../demo/animation-2a/cursor-11.cur | Bin 0 -> 2998 bytes .../demo/animation-2a/cursor-3.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-4.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-5.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-6.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-7.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-8.cur | Bin 0 -> 4286 bytes .../demo/animation-2a/cursor-9.cur | Bin 0 -> 2238 bytes .../demo/animation-2a/cursor-shadow.png | Bin 0 -> 404 bytes .../demo/animation-2a/dot.png | Bin 0 -> 420 bytes .../demo/animation-2a/index.html | 361 + .../demo/animation-2b/audio/bonk.mp3 | Bin 0 -> 3342 bytes .../demo/animation-2b/audio/fingerplop.mp3 | Bin 0 -> 3760 bytes .../demo/animation-2b/audio/fingerplop2.mp3 | Bin 0 -> 2088 bytes .../demo/animation-2b/css/animation.css | 36 + .../demo/animation-2b/image/ball.gif | Bin 0 -> 348 bytes .../demo/animation-2b/image/point.png | Bin 0 -> 625 bytes .../demo/animation-2b/index.html | 21 + .../demo/animation-2b/script/animation.js | 97 + .../demo/animation/audio/bonk.mp3 | Bin 0 -> 3342 bytes .../demo/animation/audio/fingerplop.mp3 | Bin 0 -> 2507 bytes .../demo/animation/audio/fingerplop2.mp3 | Bin 0 -> 1253 bytes .../demo/animation/index.html | 55 + .../demo/api/index.html | 993 ++ .../css/cassette-tape-ui-blur-nojs.css | 30 + .../css/cassette-tape-ui-blur.css | 395 + .../cassette-tape/css/cassette-tape-ui.css | 832 ++ .../demo/cassette-tape/css/demo.css | 368 + .../font/JustAnotherHand_ttf_font_LICENSE.txt | 202 + .../font/justanotherhand-webfont.eot | Bin 0 -> 30204 bytes .../font/justanotherhand-webfont.ttf | Bin 0 -> 57652 bytes .../font/justanotherhand-webfont.woff | Bin 0 -> 31064 bytes .../font/ostrich-rounded-webfont.eot | Bin 0 -> 9430 bytes .../font/ostrich-rounded-webfont.svg | 141 + .../font/ostrich-rounded-webfont.ttf | Bin 0 -> 21428 bytes .../font/ostrich-rounded-webfont.woff | Bin 0 -> 10692 bytes .../image/_src/MA-R90 metal pattern.png | Bin 0 -> 2296 bytes .../image/_src/TDK MA-R90 body.psd | Bin 0 -> 2044227 bytes .../cassette-tape/image/_src/Tape Mask.psd | Bin 0 -> 696404 bytes .../cassette-tape/image/_src/metalspool.psd | Bin 0 -> 39322 bytes .../image/_src/metalspoolblack.psd | Bin 0 -> 39399 bytes .../image/_src/rail-middle-outline-edited.psd | Bin 0 -> 45427 bytes .../image/_src/tape-screw-dark.psd | Bin 0 -> 5980 bytes .../cassette-tape/image/_src/tape-screw.psd | Bin 0 -> 5179 bytes .../demo/cassette-tape/image/black-micro.png | Bin 0 -> 91 bytes .../image/body-texture-strips.png | Bin 0 -> 79 bytes .../image/demo_backgrounds/sfatnight_1600.jpg | Bin 0 -> 801553 bytes .../demo/cassette-tape/image/gradient.png | Bin 0 -> 799 bytes .../cassette-tape/image/ma-r90-body-skin.png | Bin 0 -> 25615 bytes .../demo/cassette-tape/image/ma-r90-mask.png | Bin 0 -> 3988 bytes .../image/ma-r90-metal-pattern-v2.png | Bin 0 -> 785 bytes .../image/rail-middle-outline.png | Bin 0 -> 2938 bytes .../cassette-tape/image/spool-metal-black.png | Bin 0 -> 5196 bytes .../demo/cassette-tape/image/spool-metal.png | Bin 0 -> 5384 bytes .../demo/cassette-tape/image/spool-spokes.png | Bin 0 -> 7524 bytes .../demo/cassette-tape/image/tape-guide.png | Bin 0 -> 1017 bytes .../cassette-tape/image/tape-screw-dark.png | Bin 0 -> 405 bytes .../demo/cassette-tape/image/tape-screw.png | Bin 0 -> 315 bytes .../demo/cassette-tape/image/tape-texture.png | Bin 0 -> 37292 bytes .../demo/cassette-tape/index.html | 143 + .../demo/cassette-tape/more.html | 414 + .../cassette-tape/script/cassette-tape-ui.js | 1198 ++ .../demo/cassette-tape/script/demo.js | 145 + .../demo/christmas-lights/christmaslights.css | 147 + .../demo/christmas-lights/christmaslights.js | 785 ++ .../christmas-lights/image/bg-strip-dark.png | Bin 0 -> 201 bytes .../demo/christmas-lights/image/blank.png | Bin 0 -> 88 bytes .../image/bulbs-32x32-bottom.png | Bin 0 -> 8956 bytes .../image/bulbs-32x32-left.png | Bin 0 -> 8377 bytes .../image/bulbs-32x32-right.png | Bin 0 -> 8203 bytes .../image/bulbs-32x32-top.png | Bin 0 -> 8910 bytes .../image/bulbs-50x50-bottom.png | Bin 0 -> 23406 bytes .../image/bulbs-50x50-fragments.png | Bin 0 -> 9582 bytes .../image/bulbs-50x50-left.png | Bin 0 -> 25841 bytes .../image/bulbs-50x50-right.png | Bin 0 -> 25209 bytes .../image/bulbs-50x50-top.png | Bin 0 -> 23903 bytes .../christmas-lights/image/bulbs-50x50.png | Bin 0 -> 5993 bytes .../image/bulbs-64x64-bottom.png | Bin 0 -> 25457 bytes .../image/bulbs-64x64-left.png | Bin 0 -> 21886 bytes .../image/bulbs-64x64-right.png | Bin 0 -> 21570 bytes .../image/bulbs-64x64-top.png | Bin 0 -> 25882 bytes .../image/bulbs-72x72-bottom.png | Bin 0 -> 30470 bytes .../image/bulbs-72x72-left.png | Bin 0 -> 26189 bytes .../image/bulbs-72x72-right.png | Bin 0 -> 25582 bytes .../image/bulbs-72x72-top.png | Bin 0 -> 30512 bytes .../image/bulbs-96x96-bottom.png | Bin 0 -> 41029 bytes .../image/bulbs-96x96-left.png | Bin 0 -> 34443 bytes .../image/bulbs-96x96-right.png | Bin 0 -> 34280 bytes .../image/bulbs-96x96-top.png | Bin 0 -> 41276 bytes .../christmas-lights/image/noise-pattern.png | Bin 0 -> 2416 bytes .../demo/christmas-lights/index.html | 37 + .../demo/christmas-lights/sound/glass0.mp3 | Bin 0 -> 8149 bytes .../demo/christmas-lights/sound/glass1.mp3 | Bin 0 -> 8985 bytes .../demo/christmas-lights/sound/glass2.mp3 | Bin 0 -> 16416 bytes .../demo/christmas-lights/sound/glass3.mp3 | Bin 0 -> 23730 bytes .../demo/christmas-lights/sound/glass4.mp3 | Bin 0 -> 46111 bytes .../demo/christmas-lights/sound/glass5.mp3 | Bin 0 -> 19008 bytes .../soundmanagerv297a-20131201/demo/debug.css | 23 + .../demo/flashblock/basic.html | 37 + .../demo/flashblock/flashblock.css | 130 + .../demo/flashblock/index.html | 134 + .../demo/flashblock/method1/flashblock.css | 61 + .../demo/flashblock/method1/flashblock.js | 90 + .../demo/flashblock/method1/index.html | 85 + .../demo/index-rollup.css | 39 + .../demo/index-rollup.js | 200 + .../soundmanagerv297a-20131201/demo/index.css | 2926 ++++ .../demo/index.html | 28 + .../soundmanagerv297a-20131201/demo/index.js | 621 + .../demo/mp3-player-button/basic.html | 56 + .../css/mp3-player-button.css | 117 + .../image/arrow-right-black.gif | Bin 0 -> 66 bytes .../image/arrow-right-black.png | Bin 0 -> 147 bytes .../image/arrow-right-white.gif | Bin 0 -> 60 bytes .../image/arrow-right-white.png | Bin 0 -> 146 bytes .../demo/mp3-player-button/index.html | 195 + .../script/mp3-player-button.js | 260 + .../demo/mpc/acoustic-drumkit.xml | 33 + .../demo/mpc/audio/AMB_BD_1.mp3 | Bin 0 -> 12416 bytes .../demo/mpc/audio/AMB_FTM2.mp3 | Bin 0 -> 15174 bytes .../demo/mpc/audio/AMB_HHCL.mp3 | Bin 0 -> 5642 bytes .../demo/mpc/audio/AMB_HHOP.mp3 | Bin 0 -> 45139 bytes .../demo/mpc/audio/AMB_HHPD.mp3 | Bin 0 -> 7523 bytes .../demo/mpc/audio/AMB_HTM.mp3 | Bin 0 -> 15986 bytes .../demo/mpc/audio/AMB_LTM2.mp3 | Bin 0 -> 20062 bytes .../demo/mpc/audio/AMB_MTM.mp3 | Bin 0 -> 18808 bytes .../demo/mpc/audio/AMB_RIM1.mp3 | Bin 0 -> 5955 bytes .../demo/mpc/audio/AMB_SN13.mp3 | Bin 0 -> 17554 bytes .../demo/mpc/audio/AMB_SN_5.mp3 | Bin 0 -> 15046 bytes .../demo/mpc/audio/CHINA_1.mp3 | Bin 0 -> 46393 bytes .../demo/mpc/audio/CRASH_1.mp3 | Bin 0 -> 61440 bytes .../demo/mpc/audio/CRASH_5.mp3 | Bin 0 -> 53603 bytes .../demo/mpc/audio/CRASH_6.mp3 | Bin 0 -> 44512 bytes .../demo/mpc/audio/RIDE_1.mp3 | Bin 0 -> 49841 bytes .../demo/mpc/audio/RIDE_3.mp3 | Bin 0 -> 38243 bytes .../demo/mpc/audio/SPLASH_1.mp3 | Bin 0 -> 24764 bytes .../demo/mpc/css/mpc.css | 158 + .../demo/mpc/image/progress.png | Bin 0 -> 1452 bytes .../demo/mpc/index.html | 72 + .../demo/mpc/script/mpc.js | 134 + .../demo/page-player/basic.html | 82 + .../demo/page-player/css/demo.css | 124 + .../page-player/css/optional-annotations.css | 162 + .../demo/page-player/css/optional-themes.css | 200 + .../demo/page-player/css/page-player.css | 307 + .../demo/page-player/image/divot-bottom.png | Bin 0 -> 153 bytes .../demo/page-player/image/divot.png | Bin 0 -> 159 bytes .../demo/page-player/image/top-highlight.png | Bin 0 -> 153 bytes .../demo/page-player/index.html | 379 + .../script/optional-page-player-metadata.js | 142 + .../demo/page-player/script/page-player.js | 1078 ++ .../demo/page-player/xbm-test.html | 23 + .../demo/play-mp3-links/basic.html | 61 + .../demo/play-mp3-links/css/inlineplayer.css | 210 + .../demo/play-mp3-links/image/icon_pause.gif | Bin 0 -> 189 bytes .../demo/play-mp3-links/image/icon_pause.png | Bin 0 -> 182 bytes .../demo/play-mp3-links/image/icon_play.gif | Bin 0 -> 193 bytes .../demo/play-mp3-links/image/icon_play.png | Bin 0 -> 220 bytes .../demo/play-mp3-links/image/test.gif | Bin 0 -> 213 bytes .../demo/play-mp3-links/index.html | 227 + .../play-mp3-links/script/inlineplayer.js | 256 + .../demo/template/deferred-example.html | 243 + .../demo/template/html5-dtd-test.html | 87 + .../demo/template/index.html | 206 + .../demo/template/sm2_defer-example.html | 128 + .../demo/template/template.css | 162 + .../demo/template/xhtml-test.xhtml | 143 + .../doc/download/archive.html | 2041 +++ .../doc/download/index.html | 1452 ++ .../doc/generated/SoundManager2_AS.html | 938 ++ .../doc/generated/SoundManager2_AS3.html | 2026 +++ .../generated/SoundManager2_SMSound_AS3.html | 1302 ++ .../doc/generated/docco.css | 508 + .../doc/generated/public/fonts/aller-bold.eot | Bin 0 -> 29804 bytes .../doc/generated/public/fonts/aller-bold.ttf | Bin 0 -> 66836 bytes .../generated/public/fonts/aller-bold.woff | Bin 0 -> 33244 bytes .../generated/public/fonts/aller-light.eot | Bin 0 -> 29509 bytes .../generated/public/fonts/aller-light.ttf | Bin 0 -> 68620 bytes .../generated/public/fonts/aller-light.woff | Bin 0 -> 33124 bytes .../generated/public/fonts/novecento-bold.eot | Bin 0 -> 18190 bytes .../generated/public/fonts/novecento-bold.ttf | Bin 0 -> 48136 bytes .../public/fonts/novecento-bold.woff | Bin 0 -> 20576 bytes .../public/stylesheets/normalize.css | 375 + .../doc/generated/soundmanager2.html | 11613 ++++++++++++++++ .../doc/getstarted/index.html | 563 + .../soundmanagerv297a-20131201/doc/index.html | 1934 +++ .../doc/resources/index.html | 243 + .../doc/technotes/index.html | 508 + .../soundmanagerv297a-20131201/index.html | 691 + .../soundmanagerv297a-20131201/license.txt | 29 + .../script/soundmanager2-jsmin.js | 110 + .../script/soundmanager2-nodebug-jsmin.js | 81 + .../script/soundmanager2-nodebug.js | 2660 ++++ .../script/soundmanager2.js | 5989 ++++++++ .../src/SoundManager2.as | 421 + .../src/SoundManager2_AS3.as | 925 ++ .../src/SoundManager2_SMSound_AS3.as | 585 + .../src/make-flash8.bat | 5 + .../src/make-flash8.sh | 2 + .../src/make-flash9.bat | 4 + .../src/make-flash9.sh | 2 + .../swf/soundmanager2.swf | Bin 0 -> 2908 bytes .../swf/soundmanager2_debug.swf | Bin 0 -> 3282 bytes .../swf/soundmanager2_flash9.swf | Bin 0 -> 8758 bytes .../swf/soundmanager2_flash9_debug.swf | Bin 0 -> 17258 bytes .../swf/soundmanager2_flash_xdomain.zip | Bin 0 -> 33064 bytes .../troubleshoot/debug.css | 119 + .../troubleshoot/debug.js | 187 + .../troubleshoot/fpgss-add-location.png | Bin 0 -> 21317 bytes .../troubleshoot/fpgss-added-location.png | Bin 0 -> 20131 bytes .../troubleshoot/index.html | 154 + .../javascripts/metamaps/Metamaps.Backbone.js | 8 + .../javascripts/metamaps/Metamaps.GlobalUI.js | 1 - .../javascripts/metamaps/Metamaps.Router.js~ | 35 - app/assets/javascripts/metamaps/Metamaps.js | 412 +- app/assets/javascripts/metamaps/Metamaps.js~ | 2711 ---- app/assets/javascripts/metamaps/codeleft.js | 140 +- app/assets/javascripts/metamaps/metamaps.js | 2695 ---- app/assets/stylesheets/application.css | 50 +- app/controllers/maps_controller.rb | 3 +- app/views/maps/show.html.erb | 1 + app/views/maps/show.html.erb~ | 82 - app/views/shared/_filterBox.html.erb | 81 +- app/views/shared/_filterBox.html.erb~ | 42 - app/views/shared/_filterbymetacode.html.erb | 23 - 331 files changed, 56608 insertions(+), 5902 deletions(-) delete mode 100644 Gemfile~ rename app/assets/images/{icons => }/synapsevisualize.png (100%) create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause-light.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause-light.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause-light.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause-light.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_dots.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner_bigger.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/berniecode-animator.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot4.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/armor-alley-screenshot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9-dark.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/getsatisfaction-icon.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/mpc-screenshot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/noise-dark.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/noise.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider-1.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider-bar.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/soundmanager2-speaker.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/speaker.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/survivor-screenshot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/1hz-10khz-sweep.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/440hz.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/button-0.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/button-1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/click-high.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/click-low.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/coins.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/fancy-beer-bottle-pop.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/going_outside.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mak.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover3.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/office_lobby.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/rain.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/select.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/sine, square, sawtooth, rando.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/walking.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/css/animation.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/image/ball.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/script/animation.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/bg-land.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/bg-sky.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-10.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-11.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-3.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-4.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-5.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-6.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-7.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-8.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-9.cur create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-shadow.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/dot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/bonk.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/fingerplop.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/fingerplop2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/css/animation.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/image/ball.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/image/point.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/script/animation.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/bonk.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/fingerplop.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/fingerplop2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/api/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui-blur-nojs.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui-blur.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/demo.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/JustAnotherHand_ttf_font_LICENSE.txt create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.svg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/MA-R90 metal pattern.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/TDK MA-R90 body.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/Tape Mask.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/metalspool.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/metalspoolblack.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/rail-middle-outline-edited.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/tape-screw-dark.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/tape-screw.psd create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/black-micro.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/body-texture-strips.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/demo_backgrounds/sfatnight_1600.jpg create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/gradient.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-body-skin.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-mask.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-metal-pattern-v2.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/rail-middle-outline.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-metal-black.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-metal.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-spokes.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-guide.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-screw-dark.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-screw.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-texture.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/more.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/script/cassette-tape-ui.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/script/demo.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/christmaslights.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/christmaslights.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bg-strip-dark.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/blank.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-left.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-right.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-top.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-fragments.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-left.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-right.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-top.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-left.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-right.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-top.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-left.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-right.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-top.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-left.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-right.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-top.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/noise-pattern.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass0.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass3.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass4.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass5.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/debug.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/basic.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/flashblock.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/flashblock.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/flashblock.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index-rollup.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index-rollup.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_FTM2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_6.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/SPLASH_1.mp3 create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/basic.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/top-highlight.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/page-player.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/test.gif create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.ttf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.woff create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash_xdomain.zip create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png create mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/index.html delete mode 100644 app/assets/javascripts/metamaps/Metamaps.Router.js~ delete mode 100644 app/assets/javascripts/metamaps/Metamaps.js~ delete mode 100644 app/assets/javascripts/metamaps/metamaps.js delete mode 100644 app/views/maps/show.html.erb~ delete mode 100644 app/views/shared/_filterBox.html.erb~ delete mode 100644 app/views/shared/_filterbymetacode.html.erb diff --git a/Gemfile~ b/Gemfile~ deleted file mode 100644 index 9e2acc35..00000000 --- a/Gemfile~ +++ /dev/null @@ -1,47 +0,0 @@ -source 'https://rubygems.org' - -gem 'rails', '3.2.17' - -# Bundle edge Rails instead: -# gem 'rails', :git => 'git://github.com/rails/rails.git' - -gem 'devise' -gem 'redis' -gem 'pg' -gem 'cancan' -gem 'formula' -gem 'formtastic' -gem 'json' -gem 'rails3-jquery-autocomplete' -gem 'best_in_place' -gem 'therubyracer' #optional -#gem 'rb-readline' - -# Gems used only for assets and not required -# in production environments by default. -group :assets do - gem 'sass-rails' - gem 'coffee-rails', '~> 3.2.1' - - # See https://github.com/sstephenson/execjs#readme for more supported runtimes - # gem 'therubyracer' - - gem 'uglifier', '>= 1.0.3' -end - -gem 'jquery-rails', '2.1.2' - -# To use ActiveModel has_secure_password -# gem 'bcrypt-ruby', '~> 3.0.0' - -# To use Jbuilder templates for JSON - gem 'jbuilder', '0.8.2' - -# Use unicorn as the web server -# gem 'unicorn' - -# Deploy with Capistrano -# gem 'capistrano' - -# To use debugger -# gem 'ruby-debug19', :require => 'ruby-debug' diff --git a/app/assets/images/icons/synapsevisualize.png b/app/assets/images/synapsevisualize.png similarity index 100% rename from app/assets/images/icons/synapsevisualize.png rename to app/assets/images/synapsevisualize.png diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc new file mode 100755 index 00000000..60f1529d --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc @@ -0,0 +1,71 @@ +== SoundManager 2: JavaScript Sound for the Web + +By wrapping and extending HTML5 and Flash Audio APIs, SoundManager 2 brings reliable cross-platform audio to JavaScript. + +== HTML5 Audio() Support + + * 100% Flash-free MP3 + MP4/AAC where supported + * Compatible with Apple iPad 3.2, iPhone/iOS 4 and newer + * Fallback to Flash for MP3/MP4 support, as needed + * SM2 API is transparent; HTML5/flash switching handled internally + * HTML5 API support approximates Flash 8 API features + * Some other formats (WAV/OGG) supported via HTML5, depending on browser + * See "useHTML5Audio" property for implementation details + +== Basic API Features (Flash 8) + + * Load, stop, play, pause, mute, seek, pan and volume control of sounds from Javascript + * Events: onload, whileloading, whileplaying, onfinish and more + * ID3V1 and ID3V2 tag support for MP3s (title, artist, genre etc.) + +== Shiny Flash 9 Features + + * RTMP / Flash Media Server streaming support (new, experimental) + * MPEG-4 (AAC, HE-AAC, H.264) audio support + * "MultiShot" play (layered/chorusing effects) + * Waveform/frequency spectrum data + * Peak (L/R channel volume) data + * Audio buffering state/event handling + +== General Tech Stuff + + * Full API Documentation with examples and notes + * console.log()-style debug output and troubleshooting tools + * Community-based discussion/support + +== As Heard On The Internets + +A few nifty sites that have implemented SM2 for driving audio: + + * SoundCloud / The Cloud Player + * last.fm + * Opera (media player component) + * 8tracks + * Discogs + * The Hype Machine + * nyan.cat + * turntable.fm + * AudioGalaxy + +== Project home, documentation, live demos etc.: + +http://www.schillmania.com/projects/soundmanager2/ + +== Compiling JS builds (-nodebug, -jsmin) and Flash components, AS2/AS3 to SWF + +An Ant build file defines the tasks for compiling JS and SWF components, useful if you make changes to the SM2 source and want to recompile. +Google's Closure Compiler is used for the JS. AS2 compilation is done by MTASC, and AS3 is handled by Adobe's Open Source Flex SDK (mxmlc) compiler. +Refer to the build.xml file for compiler downloads and path definitions. + +== Versioning / Development Notes + +Releases are versioned by date, e.g., V2.97a.20110424 and are tagged as such.* +The latest official release is always on trunk/master. +Post-release development builds may be available on the appropriate +DEV branch, eg., V2.97a.20110801+DEV + +== Forks and Pull Requests + +Firstly, thank you for wanting to contribute! Bug fixes and tweaks are welcomed, particularly if they follow the general coding style of the project. +If making a pull request, use the project's current +DEV development branch as the merge target instead of "master", if possible (please and thank-you.) + +* SoundManager 2 has been at "version" 2.97 for a long time, because 2.97 was arguably the best llama-ass-whipping version of WinAmp. (WinAmp 3 was not as good, and WinAmp 5 was "the best of 2 and 3 combined.") This MP3 player was my favourite Windows app during the 90's, and is missed as there's nothing quite like it on OS X where I spend most of my time these days. diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd new file mode 100755 index 0000000000000000000000000000000000000000..930b41e016d6612c10e1f929221fd940e52a1c7f GIT binary patch literal 31168 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 Cn)0Cl literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd new file mode 100755 index 0000000000000000000000000000000000000000..afd049802bfbec740516eb1df5cca5cfa3c7cac2 GIT binary patch literal 38695 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 aD1QMQ^cUopsrZvP-+hwbC8*DjHXkcit zVy)K-qZyDe2N{BcgoFo9CKwbGjE#&Gh+L9eGZB`TmMU5t6%+<)7@-($1{4(>C5i!T ztQ-N5Bo%gddUz`hS#uE-M;ZtSN58!c5q>Bc63G$@3dzjM5*alk0uu)o*xB0H2NQB6 b8xIQvvB}G3^Y- z-9)XLs|D_#KWk)Tfa@pjb!RYf9EVw!b;V-!Q6n2Sz$+_-ZWspJY&KWiJ-pY*#trbw z4o@>pvliR}yt3=2*tY!!!EU#k1U&Fco099g3tp@5cKwEc2j1R(vET2XeBb}_Jdg43 zUZ8;%o>3j{a5&75$Kxx1vp$4oKDp5cL9jZX&-&?fA{;6pn8VuSM*pXuAAxo0DbHau Q+5i9m07*qoM6N<$g7a*}nE(I) literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif new file mode 100755 index 0000000000000000000000000000000000000000..5317ded4d391b067b842361991de53d3dcb633db GIT binary patch literal 329 zcmV-P0k-}}Nk%w1VHN-u0Q4OI-QC^e`1tel^FBU4L_|b6IXUFy zEGYq?d|RE?(WXc&gkgq@bK{Q@$uN$*hWT1`T6C5i)V ztQ-T7Bo%gddUz`hS#uE-M;ZtSN58!c5q>Bc63G$?3CYaL5*alk1QQDu*xB0H3lnlA b8x9HqG=V5s(dUecQ8&N7N7GJ5oG!YkAK``P z*CGB<|MQ@PGSXzoF~e6GZ(kFm9oC-W1kye>^{;UaGCp=k z)Y14VC%aZmu)Gp4%ujIu1+ghGZ#=X16h&|wdW^Tm6KhW~4nAO(^CB(}zPe;F%JCkN zV=?kS3M;$CY>vl@S=lX>P-UYUtfos;ca~U9t3jo{G()UAAFpeKc+**{Z~XKq+4OdL lYqpM=o!<1~fBv|?#Gmi$dodS~>(u}N002ovPDHLkV1fYhn|A;J literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif new file mode 100755 index 0000000000000000000000000000000000000000..22be94f866c4d384a0a1bad0f20b8efef42edac4 GIT binary patch literal 441 zcmZ?wbhEHb6k`x$_^Qcp_wL<)|NcFG{P^3qZ(qND{qf_6SL7Lw@Kc{Ze}3}h$<3QL zor8{i`t<4h_wO%XzI^-kt-asD`}glB`U>d{1<*W z-l}TyE~;EAix&$CFImBrit?Nr`szR!ovpOig8f@-&r4ZoY?#`rEex0@C8|-l_yUGb(T?|M~mx m50`_BlG6c4CPofnC7%Zm;ubQgIoVVQtUKTkEz!)tU=09hue758 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png new file mode 100755 index 0000000000000000000000000000000000000000..fc30c5f42fc3c9f1b0739227ac7cdfc5f65371fd GIT binary patch literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6>jHd2T!HjEFnICe#e)YAfXr8~ zUIEF+j~@fcw{PD9$(Ju*-n(}X$awSS4Ul~L^y&Tk_aWR5A3l8k{Q1k5FWyL9Q& zuV24Defs1Tc?KwZ^XAPTKYslD`Sbnz_fMWYvG+Up{rmU3ckcrAe*E|mXkAj?(cH?b z&Ot}wvW_I?o?5%%+}^{lj-PpZ_Tsy9=gxVApSp45Mq$mh;`-}LSDpg8XT{p9?F;`k z09`Cv666=mz~$=Z5f&a9GkyB%HS5owy?X8X$B&$UUi|_pIO*x)7*Y{8_e}WaLka?I zi2;EVJ32jl``>;ckh|L^itH+ zP3Og@-;dF{To#u-<;-LIwDilnR+y%Xed{#QOH^s}F>P6Y{f24l8U6{YUwvl%)aWe6 zRrU0)t@ZUx!6MzQ-}$!ay`J#%rNyrAa`k@;xs;3k-J>Np7)kn&DSM4T8XNAY5 zpC@KqlW4s8ZN`mr0b6w1=4WV3dyzEjuFFjk)ekjWZ@x8KZRr;NgPAo&KGHhW<~-0- N44$rjF6*2UngBu_6tMsR literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif new file mode 100755 index 0000000000000000000000000000000000000000..d150c0d61f0f1b855f35f9fb9b5ed80def9ba2b4 GIT binary patch literal 441 zcmZ?wbhEHb6k`x$_^Qcp_wL<)|NedZ_U--q_g}w${qf_6y}iAyt?lQ}pPxK=a`Wa* zb93`gpFVy6{{8LSxA*VgfBEvIiHXUnQ>T_JSrQQuk&==U6%}>l$dN^h7G-2)WM^lu zTD5BD&YfXlVej6(d;IwEix)3GeE9J3F3X%U%q@fckbM;U%&qU|Ia`% zQ2fcl%D|w>paU`qZ%h>}rnxi=Fee%* zN-S(#ks@NdrTa&d(LpgPVhspjWl~aWac1V=4PcwjCMx5t zs>bZ1%B8Y+v6%Fd6_7&UA?tRLrrei?pBovKGwdpQ)9G+fs* zbzjh6+U%kFg%P~$fV|EQ6RAHfJ3xIGXsM)0P}9D?*IS* literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png new file mode 100755 index 0000000000000000000000000000000000000000..8fd7c4c6672eb898091338d60d436c2a8b91169b GIT binary patch literal 368 zcmV-$0gwKPP)9j8h4ppr~PVF!2L*H%?;0?CxZ84kUmbpiK%%CGgVHhJVZBdsw); zhAs~ByMgz)hsyyK|MMb;Jn~6W#w5SN1Wldnt$e8f$gBr^|j}Y(Cb O0000FDU_@bK{S^YiNJ>h$#V@9*#I?CkaR_5A$&{r&y-_xJkx`uO64nr!Qu=yh>)P0Q=6 zx7e&{osBS)5pFs^&IPk;dU_nqh7b`%CKHPVTa6Gl8YR=of(EOT4DvRMb}|#|QA{TF zq*X%49V8NuYaIk~8cTIg932({7D#=5kdQ|}i;Wy(O*0)65nykTprA+_S9=#t7>NQC zMxm~eMsa(XJgO5NpRc-pxU!cnJ)5^i#Kp$PM#3G2EEgIUok7Uc)MpljWgHsB^MoDxasQa?CtGT%O~30?)CQV;p4Q<5f*^=0PAglhD}7OZE6B4beE4D1`Pym z{g_B`Vu6bVC}PZ5vEwEJ8piMg*|FnBjTlS+cBE3!Tql(kPg+a~b0VpD2XEQfX~Td| z13iE89J)#0!D~Z#{sdZMY0{m~jA}#rw5d?5KC9Ml^59RHeOBbt<2sg{r)>6cbpshi?4*DNtS52+FLx`YHs;qhKWDc(_rCh~-p}*>@&0^X@7Isd^Zjyz=>E3WE3FX( zu??X52E%jfe;39a?#v#n7(vYPgJ=xDg@pxJ`QOs%bY5Ow2?+^oHoLH}aBOUBVq!w2 zQVkCeOC%Bsh2r7i5f~WQ_oeiDJ?wUMb+K41p-?E5N;Miyd3m`)p^(XBWHOo0=L3&Y zshpgg6pO_pBO@Ih9a^mxrqpURaQ652gCewCE*IDUKp+rAA`x&73=9kn4FR~gxL7Wi zgEWAFc64-fe0;pSyBqKg4Gqw?w6xUJ)G(RMoSYoMKrR@st*r%qc!ybleWil7v$GRS z78MnN$;QS;umR(+($>}n_~z#3!NEa@(A(P!D(&s&4 zGcynkkialEHwVbs+1aV7DF_12!6E1Z5=?$QN&5Xc1W_Z13PFYt8%<1+0Xd*G7z|*; zbWO4u{3Wo0=^=<23Tfw44NSYhm2M|j0s(3aN6<4o-g8#{6-KKd{gXC3otg^;M| zh`*Dot*{+4VhCZJ(Vit?7->*-_jCQK7nzY5mmchWhRLQRR422}t=#;YE%h~SZ#Q!S3DLVJtEVYAKkR;&47B6_1aWwC<3+qZVLk9|D71kM1%yapEdm zZ>ZLVxbbfAp1S-|l0@b&i#Fob$x*$S_SlSoHLMHj{F5ZhCaZgI#Mj+U4Q#>fT>RZ7 zubQ=%jVEQx^PQy!o&Fq@KKh$xa1!!M1`cO8qnX|j5By%o7@4Q5R2WSU0!rU z(AOuL1%`(q{>qCFcT+lB&9_GhB9!EloEPy!Ww~hY@H`9B`^{V5va^K(PI4vMYURrN zNoUP=5qBcm=ah3c+k+ADj=UwlxJdb;=6Zir)}qJ1g$hx)J+$TnOx|i|L0SiV*MrLs*P6XAQg0--JjDOV_nf&tBgoRB z9q}no6^=^krud5aZ<)FFH*b=>Xc6&s^~*u%!_Tbrk5rdWd6W0_OY!~G*gMuvw;V&3 zIlAiS<2P|WPXldL9|3}}LRo4CE!!RnjOZIj>v2bT)K0fZM z;hw$h>&A@4dXsH4X42Eso@~ICUoB13jUTz|@QBYhKFHvmIrFUP#F5y~Q?B$^S@t+y RlO6m?NPr*Rw{$-+9>r#>V#c_PDsXadC0f)YKdt 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png new file mode 100755 index 0000000000000000000000000000000000000000..599b0c67b3b67888b07833908b2f9faeaf4010ee GIT binary patch literal 1441 zcmZvbdo+}J7{^~@XqW~~HYy#L)K)6Fv^AAXMX?8sODNH#?XohPHtVu0(P3&NMF~mD z8Zou#qOjx^oidUk#>^Oo8FSOPjd@Kt_SyY=pL5>d?>*1&`~CdB&wI|xp!ggj7_Krz z5QO0A;pPYXwtpX-F0536K^21N$SGa{?u(0y(D~mQA0Kyea$+)>VzF4MR3;@Q(P*@< zU%w6y4^K=?kVqsD$Ye4GgCUhlg+if9rRweN<@5Ql78e)85sSqFJ(Nf!YHMp#C=>u0 z8XB6MoGdIX1WQj(54ftUs|N-KBoYai%Z0lD3qTM@M@P4`wDk4$0RcMi-@gYjpsK2> zAOK_rJ&(te%jI@LGBTMwI5_C-?G47Uu`x&mdZ2Z5bc~FQ zz$ukV1ypx;Hze%r?1brH*rukY=H_OI3YLtF4Ct4Xlyr4pM_Nw6uUF-xVR{_5(v!->#XQ1g{vr41$-5hUExR+$Vs} z=(JkX&y&8XlZZqTxdPQ_&|42B8Lv@$X(JEP)1v)+{1F`tR(FXWPG76HEcY{Ri9B`A zK=n6)by`3P^ff9ccK2kieqk6sZ*pq;pxv#AfU>!JZ}Ij=YRY|j1?EbF{O4MIoK@hs zVx{E-uGWyl;}>(hYOpxG-;uN&UPwTy%J#(8FvHA~q&dzrN*V3rD1uWLfTQK)X|3lu+2OI_bEHqIG3{-(pyuq>blS!iqtwTQ z4PJCR#!ra3E<(%-*-J3bSRQ;&5-~7c!-Yq71Y+`NJ=-k-X^|tr*vFm?aM6R9ZAGZ5w43mA69ivGv=xY}n& z=q2fd_zTb0IuOn+(9JIVX#e>$uJu)8n|?i3@BaM|%I`W=&O3BA`BJA$Os^nu=ZHCt zm_DI3YlZL%WsS*h9?1qN5ApkJOqDn{&~&?&M8-b0JZb$)_>yVV^&&o)yntD8j=pBu zNMHg&58AwRdz2K#^PHWwkL0CvV?6e(k`^U<^st4(hR#1@Y?5W944iZ9&&@x)d+Msb z!pAMo*?AwwR(p{Ra^uaS$OddLr(i3Wf(GV1^5)Z}#yI!G0^j*2=h^Jt-=_zej>~&q zlxRb{UP=5hTAXZMd8lzj;qk7keHED)tYd4o_m;7=*YWO!WP2U%bG|6|L00gr#vISK z45BwAP>h&vd*kx@Ry(c?GH$p2ka;^{mbJYwGVSCoi|lo>BwI_DX2-@vY}ZnL|8EZ1 zOoDkW_sa)IpKBIFvv=w*6N%ndWfiDxC+T4wmx|S>@?JU^*hE@mncRM-*rUl7sC z^5x4NJ9fNy@uIo8SxiiQLUcG<+{_EGTZ{EE5^XJdszkk1f|NiUOuiw9a|M>Ca=g*)2 z|NjSCM+s2;$->CMpv9mAG6du&2DbkWQwuzF#5_-^Tso0s)qCRN3zxM)OHVJ~<~eJY zkLHveAwr9T?qBZMlDm4Bx^UM8$r77+0UYt~1p?Hva`Jo%5=-S&Gs1%lHC5%x(wkab zVv9;yH2V@$QqsFMSthAvPt8}?RAg4nm^*L7hV+EhYt@@`gEi%38~QgMIFO-HK3h3g zWhJv*+QD-h(e>$(#+fterc9# zH=o0=DQX)#)YnJeJhinUe7%@gfoyc@^kb91pXmF0%IvV(*06hXuTB?RC%Uadm}Qgp z_pnVuEK4}#d?L7-4tEGEI|S}9VBF~8H-*EYp<&+X8OHKA&g}f$$TrhBoR8t>k`4wL zhZS*WXKih|z9BLD$Aw*H?F>rK7X6sO(9m)JKr_3!!=4?C9D*&{|9KS-vft&dyOWHq27CCV!6(qQ`$CSN%Iz6E+lAT?tCE$s`y8?y-MipCLKAT-|tn)YnLr8^> zqVj?Xv)HG#K6^fY#!(g~_MSlHKu*pAfkS3JRYFYcoDR#5#y9Kz;&VvB89E=}=yB6k2Z1QKQJF`jL zzqsVWYn3;1j96rfE+n$cReeZ2F5hVK`i)>*!$lwaV?mqV3J01T5*0hp=gqcG$g@Y9 Hg~1vCNyN$s literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png new file mode 100755 index 0000000000000000000000000000000000000000..a36478d84a3ecb49aea79559e0051b9a42e6d461 GIT binary patch literal 1380 zcmZvbdsLEl7{^~x6GZV+=VXl~o#V_#rVg93EU7fL07*sbxG9p&U20aM zbaR%nY0gV!L6%N5JzWe%lMofJc>%#2I(0kl+5dabc`wiN`~JS)&-0%5&0^4f%uP3& zA_!vc=j#;!cjy03v>{wseV94~F%UDTLEdX?YtZ@ML#NY~m6fU0>ZGKk(a}*7i8MVu z9TgQdK0eN3v3h!XXf#?(ObnS!o|&1cuC5*!7|6=XqEIMGrE+3of=DD*R8&k&O^HMz zl}ZKu*49=i!R^zhPav+VtDBsh?C$Q?YPFCuHZ}(S#l^+o-`w0hG&BSN(2+-A8A26Dl9ad8n)fe^L;7>o~-f-~6icszwdv9z=V7yyIA;UErz z_mX;O(05ITZv)TUrl|$eX6%#-YL<~?yh9<`7b<0*A z=py4ulL|D$6pL9UaLkQ@>(^N~Y>GgC@z^xzxJ~IURqyF;OTJUSRvdJsr&6s$F9)Yr zP2tGlvYB3SE&K0)@@z)vPFuUaDkbI)brqY(?CUbkmleLC%e3iXOycTO#3%$oP}6>1 z`-0-b3izCxN{IdQv25pS*tLH9E$mUd~^9Uj~ISt5~#yk3g9wU@XY{ZYRi!57ZPa>SQv z#qNdd*Sjl-*_T|YkqYNX0W0da-ygha4v=h7F~Ssq!Kue^fjRqJNatzC{5jlIWlMWu zaE?EfEs<<-AX4eqLJHQI<)+TA2<#8lESeN`2n8$d3!Ct^w$raNU4&a}=3WhSx=Xq9 zW$CeTm=ZE!H2R0F2}C!G(9J&R+@x!+&qQZlH|cYN@s5K%Ik6LHyhU%e1My&zi{oiS zkMT-I#Ok;C^OR>w?AA7g`FHg-cQ^KZJoS8#we%*?u8~5&r^)#K*}ia3ejcLL9d|4u zn3=uJ$Sb~WmEz$}IEvbkQ9g8%w}xce#2iiH6LPHV@t5P@`98_sXn)-$3*$iv{D%0K zaVzg_1j02n7_dH(^DArK$=p>Co5oe3O>wHLZcb8ViVX>+sgHcAFZvOCcsoblw!6^q zc||Gztic}~nK18_D)Hx$av|x=2eVLN)yhw4P9_Z%(a~fHhDl4DVPicTRSJlq@kl9krJ`8Vis=w^+Lsp? zmj1wbHR?5Gc`rCB? literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css new file mode 100755 index 00000000..6bef9969 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css @@ -0,0 +1,156 @@ +/* larger canvas, spectrum + EQ visualization and other items */ + +.ui360-vis, +.ui360-vis .sm2-360ui, +.sm2-inline-list .ui360-vis { + /* size of the container for the circle, etc. */ + width:256px; + height:256px; +} + +.ui360-vis { + position:relative; + /* a little extra spacing */ + padding-top:1px; + padding-bottom:1px; + margin-bottom:-18px; /* approximate "line height" we want */ + padding-left:248px; + margin-left:0px; + background-position:22.6% 50%; /* (~109px) initial play button position */ +} + +.sm2-inline-list .ui360-vis { + cursor:pointer +} + +.ui360-vis a { + font:14px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; + white-space:nowrap; + text-indent:0px; /* undo inline style */ + top:46%; /* ehh. */ +} + +.sm2-inline-list .ui360-vis a { + line-height:256px; + top:auto; +} + +.ui360-vis .sm2-360ui { + margin-left:-256px; +} + +.ui360-vis .sm2-timing { + font:bold 24px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; + color:#333; + text-align:center; + line-height:256px; + text-indent:0px; +} + +.sm2-inline-list .ui360-vis, +.sm2-inline-list .ui360-vis .sm2-360ui { + margin-left:0px; +} + +.sm2-inline-list .ui360-vis { + margin:8px 13px 7px 0px; + padding-left:0px; + background-position:50% 50%; /* initial play button position */ +} + +.sm2-inline-list .ui360-vis .sm2-360ui { + border:1px solid #eee; + /* offset the border */ + margin-left:-1px; + margin-top:-1px; +} + +.sm2-inline-list .ui360-vis a { + position:absolute; + display:inline; + left:0px; + bottom:0px; + top:1px; + width:100%; /* 2px padding in box */ + height:99%; /* dumb vertical hack */ + *height:256px; /* IE is dumb. */ + overflow:hidden; + font-size:small; + font-weight:300; + color:#333; + margin:0px; + padding:0px; + line-height:488px; /* bottom vertical alignment for text */ + *line-height:480px; /* IE again */ + text-align:center; + border-radius:0px; +} + +.sm2-inline-list .ui360 a:hover { + background-color:transparent; /* reset */ +} + +.sm2-inline-list .ui360-vis:hover .sm2-360ui, +.sm2-inline-list .ui360-vis a.sm2_link:hover, +.sm2-inline-list .ui360-vis a.sm2_link:active, +.sm2-inline-list .ui360-vis a.sm2_link:focus { + background-color:transparent; +} + +.sm2-inline-list .ui360-vis:hover a.sm2_link { + background-color:#fafafa; + *background-color:transparent; /* eh, screw IE. */ +} + +/* Use a bigger loading image for this layout */ + +.ui360-vis .sm2-360btn, +.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn, +.ui360-vis .sm2-360ui.sm2_playing .sm2-360btn { + width:48px; + height:48px; + margin-left:-24px; + margin-top:-24px; + border-radius: none; +} + +.ui360-vis, +.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn, +.ui360-vis .sm2-360btn-default { + background:transparent url(360-button-vis-play.png) no-repeat 50% 50%; + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABuVBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7++lpaXr6+uAgIDk5OQzMzPt7e1tbW3n5+dgYGDW1tZNTU10dHQ5OTnw8PCvr6/e3t6JiYlAQEDb29vo6OgrKyuqqqrq6uq4uLjf399AQEDGxsbq6uqAgIDY2Nje3t61tbXp6enU1NTu7u7r6+vl5eXt7e2fn5/n5+fDw8Ph4eHv7+/t7e3CwsLW1tbu7u7b29vw8PDm5uYgICDp6enY2Nji4uLo6Ojm5uakpKTS0tLPz8/h4eHw8PDs7Ozj4+Pa2trg4ODx8fHT09Pk5OTPz8/S0tLBwcGmpqawsLCOjo7h4eHn5+fo6OgAAADY2NjNzc3n5+cAAADd3d3Gxsbu7u7t7e0AAADX19fl5eXi4uLf39/Hx8fn5+fs7Ozg4ODR0dHX19e4uLjv7+/z8/P09PTy8vL19fXv7+/n5+fx8fH29vbs7Ozq6urm5ubo6Ojw8PDu7u7p6enr6+sAAAB/f3/Z2dn39/fh4eGOjo4ODg7t7e3l5eWWlpba2tqjo6NVVVXk5OTe3t65ubnMzMzExMTf39/GxsampqZiYmJNcTiZAAAAbXRSTlMAAQIEAwcFCAb5EdAImAXpB6oIUAoLCfsgZQ0EVrsGEr4ZYQgbsgpUYxikNd/aatQQli+R7rlUUdas6+8I+VaFruoOOV/S8Nq5sWL8UqmKUFsuHyTcrtsJm0z7C49V3NMKkdKXuk7S7oVeVSv7tAAEVwAAAu5JREFUeF6llmVz3DwURmNLsr1pmJmZmZmxzMwsybS8gXJfhl9cKXbHEK+TmZ4P/nDnOXN1NbalHD8CQ7QRGDmhnIQhBDYQnkhheRECSVIQQrLMHookAciUkHhBw1zVwuLShcJIpPDC0uJC1VxDQTaFx1srSvM3DUxU1TRVlWBjM7+0opUrQaupLSnrLK7ELIepwaCYmbiyuLOspJY38eeLykdGxzDhYQfKCmOjI+VFPkMQYF7NZD0l2DgFJrR+siYPegxBzBvqeoQxpgGw8qOuoTz3HGw9udUPCaFZIORhdS5blZOHjXWDBIdABusanb0S4MpqEw4XcNPqCrQFQQTN+XwPQ8CY5jcDUbB3KLdlg6hnQDZacqEgWA3a2rF6Jri9zWohwI6dXXK2QHZ3OqBw0qC7B6vnAPd0sxZMkHr7VNPD34YZgNrXK3EBSgPU9HJ4eIQDDDogQS4ow4QJxy4+MmKs4oYJZFhhggjQuMoKHoHzn3bsQx1HQOTClOkXLP6lviZTtjCjmn7B5g/izqszliBHTB+HDhl3PSJbwnxSS3n45HDkVLXkvCWg5Uws7eHgJ98/uKqxzLI9w3o6oXuwhd+OPNVEet0WtnU9/sWNJfz1u6cY1/VtLghQuRgk/PmBmT7hogJPXo3L8YQed3Nw8PWfuB89Eb8scUGUrl33DfH/N93BGeH6NUnkArh1O5FOuNETp2GR27cAE/iaJu6mz8HdCQnan+i96XQmdgaZ9PQ9+xMVoPJgNhrNhBKNzj5Q+E/AavH4SSz6OZRo7Mlj3oDDp7jyPJoKJfr8CpvAOUrQi6eppJaVZOrpCwTdP1cgr93UjKxoN9dka2KX8ealZtBADO3lG2+e7xRAd7Y0igOg2tYdBKD/CBIBenf/lYGJD2y8uv8OgaBDDkry3v57SlQXhL7f35OlwJOXGUBBl571JykmzCIE02T/s0tIASyf/R6Arr59fcM62G+8fnsVhdwFwq4Ov345Of/15wd0RYY81HHUTQAAAABJRU5ErkJggg==); + *background-image:url(360-button-vis-play.png); + _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; + cursor:pointer; +} + +.ui360-vis:hover .sm2-360btn, +.ui360-vis .sm2-360btn-default:hover, +.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn:hover { + background:transparent url(360-button-vis-play-light.png) no-repeat 50% 50%; + _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; + cursor:pointer; +} + + +.ui360-vis .sm2-360ui.sm2_playing .sm2-360btn:hover, +.ui360-vis .sm2-360btn-playing:hover { + background:transparent url(360-button-vis-pause-light.png) no-repeat 50% 50%; + _background:transparent url(360-button-vis-pause-light.gif) no-repeat 50% 50%; + cursor:pointer; +} + +.ui360-vis { + /* non-JS / before-loaded state */ + background-position: 21% 50%; + _background:transparent url(360-button-vis-play.gif) no-repeat 21% 50%; /* IE 6-only: special crap GIF */ +} + +.ui360-vis .sm2-360btn-default { + /* real button, post-loaded state */ + _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; /* IE 6-only: special crap GIF */ +} + +.ui360-vis .sm2-360ui.sm2_dragging .sm2-360btn { + visibility: hidden; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css new file mode 100755 index 00000000..b74df11c --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css @@ -0,0 +1,271 @@ +/* General warning: Beta-ish. Code could be a bit cleaner. */ + +.ui360, /* entire UI */ +.sm2-360ui { /* canvas container */ + position:relative; +} + +.ui360, +.sm2-360ui { + min-width:50px; /* should always be at least this. */ + min-height:50px; +} + +.sm2-360ui { + width:50px; + height:50px; +} + +.ui360, +.ui360 * { + vertical-align:middle; +} + +.sm2-360ui { + position:relative; + display:inline-block; /* firefox 3 et al */ + float:left; /* IE 6+7, firefox 2 needs this, inline-block would work with fx3 and others */ + *display:inline; +/* + clear:left; +*/ +} + +.sm2-360ui.sm2_playing, +.sm2-360ui.sm2_paused { + /* bump on top when active */ + z-index:10; +} + +.ui360 a { /* .sm2_link class added to playable links by SM2 */ + float:left; + display:inline; + position:relative; + color:#000; + text-decoration:none; + left:3px; /* slight spacing on left UI */ + top:18px; /* vertical align */ + text-indent:50px; /* make room for UI at left */ +} + +.ui360 a.sm2_link { /* SM2 has now started */ + text-indent:0px; /* UI now in place. */ +} + +.ui360 a, +.ui360 a:hover, +.ui360 a:focus { + padding:2px; + margin-left:-2px; + margin-top:-2px; +} + +.ui360 a:hover, +.ui360 a:focus { + background:#eee; + border-radius:3px; + outline:none; +} + +.ui360 .sm2-canvas { + position:absolute; + left:0px; + top:0px; +} + +.ui360 .sm2-timing { + position:absolute; + display:block; + left:0px; + top:0px; + width:100%; + height:100%; + margin:0px; + font:11px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; + color:#666; + text-align:center; + line-height:50px; +} + +.ui360 .sm2-timing.alignTweak { + text-indent:1px; /* devious center-alignment tweak for Safari (might break things for others.) */ +} + +.ui360 .sm2-cover { + position:absolute; + left:0px; + top:0px; + width:100%; + height:100%; + z-index:2; + display:none; + background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); /* old-skool bug: IE 9 won't catch mouse events otherwise. /smash */ +} + +.ui360 .sm2-360btn { + position:absolute; + display:block; + top:50%; + left:50%; +/* + width:22px; + height:22px; + margin-left:-11px; + margin-top:-11px; +*/ + /* by default, cover whole space. make smaller when playing. */ + width:50px; + height:50px; + margin-left:-25px; + margin-top:-25px; + border-radius: 25px; + cursor:pointer; + z-index:3; +} + +.ui360 .sm2-360data { + display:inline-block; + font-family:helvetica; +} + +.sm2-inline-block .ui360 .sm2-360btn, +.ui360 .sm2-360ui.sm2_playing .sm2-360btn, +.ui360 .sm2-360ui.sm2_paused .sm2-360btn { + /* smaller clickable button, in center */ + width:22px; + height:22px; + margin-left:-11px; + margin-top:-11px; +} + +.ui360 .sm2-360ui.sm2_playing .sm2-cover, +.ui360 .sm2-360ui.sm2_paused .sm2-cover { + display:block; +} + +/* this could be optimized a fair bit. */ + +.ui360, +.ui360 .sm2-360btn-default, +.ui360 .sm2-360ui.sm2_paused .sm2-360btn { + background:transparent url(360-button-play.png) no-reoeat; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAABoUlEQVR42sWVu2oCQRhGU/s8gpVYJeQJNkZSbiH4QNuLlQZS21sJayGYaOEFVFDxNiremj9zig2uzk5YQpKFg8PMd75ZZle9E5Ff4e+Ll8tlQuNoPI2vUcCYOdbIxCmm9F5T0YgNMmS/LebSwWdNa7VayXq9ls1mI9vtVna7nQBj5lgjQxYHN7KY3QkiUbDf7+V4PMrpdArBHGtkyOJc3/n1mVaUUl+F5/PZSrABDi4dpmKH3QkixQEHlw5TsccZmsRCoSD1et1ajkuHqdg/HA5GKZPJCOTzeanVasYMLh2mYsXDIGAoDuG6rlSr1WCdBxrcsTIWazgrQiHS6bSRYJ3XDzeq2O/3+9Ltdm9IpVIhstmslEqlUAY36ii8ZrMpjUbjhmQyKeA4jhSLRWMGN+rhOZ1Oh8ANuVxOyuUy40hwo163RK/XeyPQbrdjgYNr/ILAYDB41Gf1wZnFAQfX+iM0HA5fxuPx+2g0Ej22QoYsDq61mGsymTxMp9NX/Sk2yJDFsRZfXpzXbDZ7WiwW3nw+9zUKGDPHGpkL5V//mn7OJyJZApyzeUS5AAAAAElFTkSuQmCC); + *background-image: url(360-button-play.png); + background-repeat: no-repeat; +} + +.ui360 { + /* + "fake" button shown before SM2 has started, non-JS/non-SM2 case etc. + background image will be removed via JS, in threeSixyPlayer.init() + */ + background-position: 14px 50%; + _background:transparent url(360-button-play.gif) no-repeat 14px 50%; /* IE 6-only: special crap GIF */ +} + +.ui360 .sm2-360btn-default, +.ui360 .sm2-360ui.sm2_paused .sm2-360btn { + background-position:50% 50%; + _background:transparent url(360-button-play.gif) no-repeat 50% 50%; /* IE 6-only: special crap GIF */ +} + +.ui360 .sm2-360btn-default, +.ui360 .sm2-360ui.sm2_paused .sm2-360btn { + cursor:pointer; +} + +.ui360 .sm2-360btn-default:hover, +.ui360 .sm2-360ui.sm2_paused .sm2-360btn:hover { + background:transparent url(360-button-play-light.png) no-repeat 50% 50%; + _background:transparent url(360-button-play.gif) no-repeat 50% 50%; + cursor:pointer; +} + +.ui360 .sm2-360ui.sm2_playing .sm2-360btn:hover, +.ui360 .sm2-360btn-playing:hover { + background:transparent url(360-button-pause-light.png) no-repeat 50% 50%; + _background:transparent url(360-button-pause-light.gif) no-repeat 50% 50%; + cursor:pointer; +} + +.ui360 .sm2-360ui.sm2_playing .sm2-timing { + visibility:visible; +} + +.ui360 .sm2-360ui.sm2_buffering .sm2-timing { + visibility:hidden; +} + +.ui360 .sm2-360ui .sm2-timing, +.ui360 .sm2-360ui .sm2-360btn:hover + .sm2-timing, +.ui360 .sm2-360ui.sm2_paused .sm2-timing { + visibility:hidden; +} + +.ui360 .sm2-360ui.sm2_dragging .sm2-timing, +.ui360 .sm2-360ui.sm2_dragging .sm2-360btn:hover + .sm2-timing { + /* paused + dragging */ + visibility:visible; +} + +.ui360 .sm2-360ui.sm2_playing .sm2-360btn, +.ui360 .sm2-360ui.sm2_dragging .sm2-360btn, +.ui360 .sm2-360ui.sm2_dragging .sm2-360btn:hover, +.ui360 .sm2-360ui.sm2_dragging .sm2-360btn-playing:hover { + /* don't let pause button show on hover when dragging (or paused and dragging) */ + background:transparent; + cursor:auto; +} + +.ui360 .sm2-360ui.sm2_buffering .sm2-360btn, +.ui360 .sm2-360ui.sm2_buffering .sm2-360btn:hover { + background:transparent url(icon_loading_spinner.gif) no-repeat 50% 50%; + opacity:0.5; + visibility:visible; +} + +/* inline list style */ + +.sm2-inline-list .ui360, +.sm2-inline-block .ui360 { + position:relative; + display:inline-block; + float:left; + _display:inline; + margin-bottom:-15px; +} + +.sm2-inline-list .ui360 { + /* inline player: minor tweak, tighten spacing */ + margin-right:-2px; +} + +.sm2-inline-block .ui360 { + margin-right:8px; +} + +.sm2-inline-list .ui360 a { + display:none; +} + +/* annotations */ + +ul.ui360playlist { + list-style-type:none; +} + +ul.ui360playlist, +ul.ui360playlist li { + margin:0px; + padding:0px; +} + +div.ui360 div.metadata { + display:none; +} + +div.ui360 a span.metadata, +div.ui360 a span.metadata * { + /* name of track, note etc. */ + vertical-align:baseline; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html new file mode 100755 index 00000000..352856b4 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html @@ -0,0 +1,132 @@ + + + +360° MP3 player UI demo (SoundManager 2): Javascript + Canvas Visualization, basic example + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    360° Player Demo - Visualization Example, Basic Template

    + +

    Canvas-based UI with visualization options. Note: No EQ/spectrum support for IE < 9 (too slow.) Data not implemented in HTML5.

    + +
    + +
    + +
    + + + +

    Inline list

    + +
    + + + + + + +
    + +

    Block list

    + + + +
    + +

    + SoundManager 2 project page (not an MP3 link) +

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html new file mode 100755 index 00000000..1f3d6e2c --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html @@ -0,0 +1,359 @@ + + + +360° MP3 player UI demo (SoundManager 2): Javascript + Canvas Visualization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    SoundManager 2 / 360° Player Demo: JS + Canvas Visualization

    + +

    Canvas-based UI with visualization options. Note: Spectrum/EQ visualizations disabled for IE < 9 (too slow.) Data is not implemented under HTML5.

    +

    You can also show FPS or customize the UI, or see the hi-fi version. Check the basic template for a minimal code example; also see the default 360° UI.

    + + + + + + + +
    + +
    + +

    Inline list

    + + + +

    Artist thank-yous: "Graffiti Sex" courtesy of The Fugitives. "Blue Belle Lament" courtesy of Adrian Glynn. "I Tried" and "People Asking" courtesy of SonReal.

    + +

    Block list

    + + + +

    56K Modem sound (Creative Commons license) via dialup.mp3, from freesound.org user Jlew.

    + + +

    Variant: Annotations/meta-data

    + + +
      + +
    • + +
      + A Virtual Haircut (3 scenes) + +
      + +
    • + +
    • + +
      + Rubber Chicken Launch (Office) + + + + +
      + +
    • + +
    + +
    + +

    + SoundManager 2 project page (not an MP3 link) +

    + + + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css new file mode 100755 index 00000000..27281c0b --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css @@ -0,0 +1,179 @@ +#cp-container { position:relative;float:left;display:inline; margin-left:1em;padding: 6px; background-color: #f6f6f6; border:1px solid #eee; width: 320px; height:180px;z-index:2; } + +.yui-picker-controls li, +.yui-picker-controls input { + font-size:1em; + font-family:"helvetica neue",helvetica,arial,verdana; +} + +#controls { + position:relative; + margin-top:1.5em; + font-size:0.85em; +} + +#options { + float:left; + display:inline; + margin-bottom:0.5em; + margin-top:-1.2em; +} + +#controls .checkbox { + float:left; + display:inline; + width:21.2em; + margin-right:2.5em; +} + +#controls .checkbox div { + /* tab */ + width:auto; + padding:0.4em; + border:1px solid #ddd; + border-bottom:none; + background:#eee; +} + +#controls .checkbox div, +#controls .checkbox input { + font-family:arial,tahoma,verdana,"sans serif"; + font-size:1em; + vertical-align:middle; +} + +#controls dl { + width:21em; +} + +#controls dl.col { + position:relative; + float:left; + display:inline; + margin:0px; + margin-right:1em; + padding:0.75em; +/* + height:12.4em; +*/ + height:auto; + border:1px solid #ddd; + background:#f6f6f6; +} + +#controls .disabled { + color:#ccc; +} + +#controls .disabled dt, +#controls .disabled dd { + color:#999; + opacity:0.5; +} + +#controls dl dd p { + margin:0px; + padding:0px; +} + +#controls dt, +#controls dd { + margin:0px; + padding:0px; +} + +#controls dt { + border-bottom:none; +} + +#controls dt { + float:left; + display:inline; + background:transparent; + padding-right:0.7em; + margin-right:0.7em; + border-right:1px solid #ccc; + font-size:1.1em; + color:#333; + font-family:"helvetica neue",helvetica,verdana,arial,"sans serif"; +} + +#controls dd { + margin:0px; + padding:0px; + font-size:0.9em; + vertical-align:middle; + color:#666; +} + +#controls .title { + float:left; + display:inline; + margin-right:0.6em; + color:#333; +} + +/* those slider bits you might be wondering about */ + +#controls .control { + position:relative; + border-left:0px; + width:214px; + height:20px; +} + +#controls .control .bar { + position:absolute; + left:0px; + top:0px; + width:214px; + height:20px; + background:transparent url(../_image/slider-bar.gif) no-repeat 0px 9px; + cursor:pointer; + cursor:hand; +} + +#controls .control .slider { + position:absolute; + left:0px; + top:0px; + width:20px; + height:20px; + background:transparent url(../_image/slider.png) no-repeat 0px 0px; + *background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider.png'); + cursor:pointer; + cursor:hand; +} + +#controls .control .slider:hover { + background:transparent url(../_image/slider-1.png) no-repeat 0px 0px; + *background:none; +} + +#controls .control .slider.hover { + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-1.png'); +} + +#controls .disabled .control .slider { + background:transparent url(../_image/slider-disabled.png) no-repeat 0px 0px; + *background:none; + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-disabled.png'); +} + +#controls .disabled .control .slider:hover { + background:transparent url(../_image/slider-disabled-1.png) no-repeat 0px 0px; + *background:none; +} + +#controls .disabled .control .slider.hover { + filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-disabled-1.png'); +} + +#controls input[type=text] { + width:5em; +} + +#options div { + margin-bottom:0.25em; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js new file mode 100755 index 00000000..379cd33d --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js @@ -0,0 +1,750 @@ +/* + Ancient fireworks slider control code (2005) + Kinda/sorta refactored for SM2 360 demo + http://schillmania.com/projects/fireworks/ + -------------------------------------------- + Not required for your use! +*/ + +function Animator2() { + var self = this; + this.tweens = []; + this.tweens['default'] = [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]; + this.tweens['blast'] = [12,12,11,10,10,9,8,7,6,5,4,3,2,1]; + this.tweens['fade'] = [10,10,10,10,10,10,10,10,10,10]; + this.queue = []; + this.queue.IDs = []; + this.active = false; + this.timer = null; + + this.createTween = function(start,end,type) { + // return array of tween coordinate data (start->end) + type = type||'default'; + var tween = [start]; + var tmp = start; + var diff = end-start; + var x = self.tweens[type].length; + for (var i=0; i= 0.4 && pos <= 0.6) { + pos = 0.5; + } + pos = parseInt(pos*100); + // writeDebug('getPanX('+x+'): '+pos+'%'); + return pos; + } + + this.isEmpty = function(o) { + // needs further hacking + return (typeof(o)=='undefined'||(o==null&&o!=0)||(o==''&&o!=0)||o=='null'); + } + + this.init = function() { +// self.oFW = document.getElementById('fw'); +// self.oFP = document.getElementById('fp'); +// if (typeof(enableDebugMode)!='undefined' && (self.DEBUG||window.location.toString().toLowerCase().indexOf('debug')>=0)) enableDebugMode(); + self.getWindowCoords(); + self.animator = new Animator2(); + } + + this.destructor = function() { +/* + for (var i=self.fireworks.length; i--;) { + self.fireworks[i] = null; + } + self.fireworks = null; + if (soundManager) { + soundManager.destructor(); + soundManager = null; + } +*/ + } + + if (this.isSafari || this.isOpera) this.getWindowCoords = this.getWindowCoordsAlt; + +} + + +function Controller(o) { + var self = this; + this.o = o; + this.controls = []; + this.cb = []; + this.options = []; + this.functionExample = document.getElementById('function-example'); + this.fbIE = null; + + this.randomize = function() { + for (var i=1; i,\n\ + autoPlay: "+threeSixtyPlayer.config.autoPlay+",\n\ + allowMultiple: "+threeSixtyPlayer.config.allowMultiple+",\n\ + loadRingColor: '"+threeSixtyPlayer.config.loadRingColor+"',\n\ + playRingColor: '"+threeSixtyPlayer.config.playRingColor+"',\n\ + backgroundRingColor: '"+threeSixtyPlayer.config.backgroundRingColor+"',\n\ + circleDiameter: "+threeSixtyPlayer.config.circleDiameter+",\n\ + circleRadius: "+threeSixtyPlayer.config.circleRadius+",\n\ + animDuration: "+threeSixtyPlayer.config.animDuration+",\n\ + animTransition: Animator.tx.bouncy,\n\ + showHMSTime: "+threeSixtyPlayer.config.showHMSTime+",\n\ +\n\ + useWaveformData: "+threeSixtyPlayer.config.useWaveformData+",\n\ + waveformDataColor: '"+threeSixtyPlayer.config.waveformDataColor+"',\n\ + waveformDataDownsample: "+threeSixtyPlayer.config.waveformDataDownsample+",\n\ + waveformDataOutside: "+threeSixtyPlayer.config.waveformDataOutside+",\n\ + waveformDataConstrain: false,\n\ + waveformDataLineRatio: "+threeSixtyPlayer.config.waveformDataLineRatio+",\n\ +\n\ + useEQData: "+threeSixtyPlayer.config.useEQData+",\n\ + eqDataColor: '"+threeSixtyPlayer.config.eqDataColor+"',\n\ + eqDataDownsample: "+threeSixtyPlayer.config.eqDataDownsample+",\n\ + eqDataOutside: "+threeSixtyPlayer.config.eqDataOutside+",\n\ + eqDataLineRatio: "+threeSixtyPlayer.config.eqDataLineRatio+",\n\ +\n\ + usePeakData: "+threeSixtyPlayer.config.usePeakData+",\n\ + peakDataColor: '"+threeSixtyPlayer.config.peakDataColor+"',\n\ + peakDataOutside: "+threeSixtyPlayer.config.peakDataOutside+",\n\ + peakDataLineRatio: "+threeSixtyPlayer.config.peakDataLineRatio+",\n\ +\n\ + useAmplifier: "+threeSixtyPlayer.config.useAmplifier+"\n\ +\n\ +}"; +document.getElementById('config-code').style.display = 'block'; // weird Fx fix + } + + this.createCustomFirework = function() { + } + + this.destructor = function() { + for (var i=self.controls.length; i--;) { + self.controls[i].destructor(); + } + for (i=self.cb.length; i--;) { + self.cb.onclick = null; + self.cb[i] = null; + } + for (i=self.options.length; i--;) { + self.options[i] = null; + } + if (navigator.userAgent.match(/msie/i)) { + self.fbIE.onmouseover = null; + self.fbIE.onmouseout = null; + self.fbIE = null; + } + self.cb = null; + self.options = null; + self.controls = null; + self.functionExample = null; + self.o = null; + } + + var items = parseInt(this.o.length/3); + for (var i=0; iself.xMax) { + x = self.xMax; + } else if (x=self.tween.length-1) { + self.active = false; + self.frame = 0; + if (self._oncomplete) self._oncomplete(); +// self.doUpdate(); + return false; + } + self.doUpdate(); + return true; + } + + this.doUpdate = function(t) { + // if (!self.timer) self.timer = setTimeout(self.update,t||20); + self.update(); + } + + this.update = function() { + self.timer = null; + self.value = 1+parseInt(self.x/self.xMax*(self.scale-1)); + if (self.value<1) self.value = 1; + // if (self.oV.innerHTML != self.value) self.oV.innerHTML = self.value; + // self.oV.innerHTML = self.value; + } + + this.setValue = function(x) { + self.slide(self.x,Math.min(self.xMax,x)); + } + + this.randomize = function() { + self.slide(self.x,parseInt(Math.random()*self.xMax)); + } + + this.destructor = function() { + self.o.onmouseover = null; + self.o.onmouseout = null; + self.o.onmousedown = null; + self.o = null; + self.oV = null; + self.oB.onclick = null; + self.oB = null; + } + + if (soundManager.isIE) { + // IE is lame, no :hover + this.o.onmouseover = this.over; + this.o.onmouseout = this.out; + } + + this.o.onmousedown = this.down; + this.oB.onclick = this.barClick; + self.update(); + +} + +var gOID = 0; + +function demoInit() { + controller = new Controller(document.getElementById('controls').getElementsByTagName('dd')); +} + +function demoDestuctor() { + controller.destructor(); + controller = null; +} + +var controller = null; + +var mc = new MainController(); +// create null objects if APIs not present + +function createCP(oInput,oHandler) { + var Event = YAHOO.util.Event; + + cpHandler = oHandler; + if (picker != null) { + // picker.showcontrols(true); + var c = oInput.value.substr(1); + picker.setValue(hex2decArray([c.substr(0,2),c.substr(2,2),c.substr(4,2)]),true); // be silent + return false; + } + + Event.onDOMReady(function() { + picker = new YAHOO.widget.ColorPicker("cp-container", { + showhsvcontrols: true, + showhexcontrols: true, + images: { + PICKER_THUMB: "../_image/picker_thumb.png", + HUE_THUMB: "../_image/hue_thumb.png" + } + }); + +// picker.showcontrols(false); + //a listener for logging RGB color changes; + //this will only be visible if logger is enabled: + var onRgbChange = function(o) { + /*o is an object + { newValue: (array of R, G, B values), + prevValue: (array of R, G, B values), + type: "rgbChange" + } + */ + cpHandler(o.newValue); + controller.updateExampleCode(); + } + + //subscribe to the rgbChange event; + picker.on("rgbChange", onRgbChange); + + //use setValue to reset the value to white: + Event.on("reset", "click", function(e) { + picker.setValue([255, 255, 255], false); //false here means that rgbChange + //wil fire; true would silence it + }); + + //use the "get" method to get the current value + //of one of the Color Picker's properties; in + //this case, we'll get the hex value and write it + //to the log: + Event.on("gethex", "click", function(e) { + console.log("Current hex value: " + picker.get("hex")); + }); + + }); +} + +var picker = null; + +cpHandler = function() { +} + + + // hex -> dec / dec -> hex + // http://www.southwest.com.au/~jfuller/binary/converter.htm + + function dec2hex(cval) { + if (cval > 255) cval = 255; + var hexascii = "0123456789ABCDEF"; + var cval0 = Math.floor(cval/16); + var cval1 = cval-(cval0*16); + var c1 = hexascii.charAt(cval0); + var c2 = hexascii.charAt(cval1); + return (c1+c2); + } + + function hex2dec(cval) { + cval = cval.toUpperCase(); + var tval = 0; + var hexascii = "0123456789ABCDEF"; + var mychar, ch; + for (var c=0; cC&CvKvux~M zp|?;#Xo0OM<<;gw5D^$J%R~%F5Xl0S5L6_D5Q58G7D5OTBHoLen)%i94?O32e&-~o zXymasJb(u{fPg+ao$mPfxT2y$B9ROX4D9XgaX6euj~*Q!9zK5j_~FBcQmORWvuEAi z-4sPFEG*2<&aSMiXtmlWPoCVqeLFute{*xw*VnhCq-1Sv4af1Cni`A6qSx#9_xF2y zdkYH-^YZd0CML48vqwiqZ8lqAV4%a{uv)Eib91}9yZ-+E)6>(>pFdYBm4kzW(b3W6 z<>g~zW2L2~Wo2b)X=w)s2S-Oo!^6WH8yoTQ@fwXLJw06}lPxVRH8(da6pDt12D{x( zlH}8;PlZC^{QSIHt&WL_DK0KvUtj0(ctb-&J3Bj0r?axMa(jC_H8oW(mj?$2cXoE> z=H~YI_lra#48v~Sx}{R7R##WIwzjgevfSL<78e)AVsS`F$jQkG6YKvzK_`Orq^!)u z1YMFWGK$R%67)NV&jS!h85T1Wa4oBXIKfMaLkT041h_#C0135tvI1x?v;j|?Yg9LB z!X)wUU4(q31NT4oMryc)Uz-%`ZmE?ghE7_PO`<7?kzF8c=3D5lI{W&}va@e$)W}6v zjr{|}FBrD5jFLYr-+ciW11WQpGXMdATc9-Ss4s6u&TL0nOKYqy*d&`oZo;b z7c+13nl8r1?c&ehOEqVl=a&Tf3OqlH%JE_GQt=cNBN8#R+MqI;8b9S5npIrHlEO#0 ziMINh7DFwb@Q*G-L>Qv$`?M}jUz{L~N&rL<4Y){hakVL|I1|L><6MM)D&g&F5))m< z3)xbi0^>+hY~;uU(+I^TaE>WqY8om`o^v>zrTP1j0jIgsiCBmqA@;R>?yHHHrgUaV zw?=5!zqka75(b=0U>J;)=&lenj0}Af$PBGydX7GV?1AAf?!7(!K7OyE^?gAAu)pYo z>=EyA+$$iE8W+D6YU?>$0&-o9EhJ|I_?heKMY-UHptl;2lKl+-!)1I+nR)-_615F9 zlU}kBZ#G-3wsw+E0nvIJ)1tRsO@-M{_3aW}zTv*X<9gBcNyu%2jC-CdC2qhuR6;>v zT6Tt6L3zT0%i&h$X_#L@zZiGAs>0VOY=kqqU_VK9O)|?*8*jhbU(x^D$4yO+9KF{^ z-xb}I)O2rnj92~25ydwQwrbHK_=hJ`fDZExM5I6{2)e@#e>+;DijoN+`;K=J9m8Gw zuW`X?WJdM_Mi!#zCnOX3Rau<2FtndO@OBJUI6V7M=JGv+hwjRQ^GFFo&u0TF#K(jsG crTC^`aPD(cM;9w1IwI2CV)%(NQg=bzpXOJ!4FCWD literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif new file mode 100755 index 0000000000000000000000000000000000000000..8449353f08e515913a7412ec02a79e5de984a35d GIT binary patch literal 493 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html new file mode 100755 index 00000000..9453eb92 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html @@ -0,0 +1,173 @@ + + + +360° MP3 player UI demo (SoundManager 2) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    SoundManager 2 / 360° Player: JavaScript + Canvas UI

    + +

    Canvas-based UI. Load progress, seek, play/pause etc. Also see 360° UI visualization demo.

    + +
    + +
    + +
    + + + + +
    + +

    Alternate style: inline

    + + + +
    + +
    + +
    + + +

    How This Works

    + +

    The script looks for a container element matching div.ui360, and then the first link inside of it.

    + +
    + +
    <div class="ui360">
    + <a href="/path/to/an.mp3">play "an.mp3"</a>
    +</div>
    + +
    + +

    When the 360 player script loads, it adds a UI template to the block, prepending it in front of the MP3 link:

    + +
    <div class="ui360">
    + <-- dynamically-inserted block -->
    + <div class="ui">
    +  <canvas class="sm2-canvas"></canvas>
    +  <span class="sm2-360btn"></span> 
    +  <div class="sm2-timing"></div>
    +  <div class="sm2-cover"></div>
    + </div>
    + <-- /UI -->
    + <a href="/path/to/an.mp3">
    +</div>
    + +

    Customizing the UI

    + +

    The player's default 50x50-pixel canvas is defined both within JavaScript and CSS. For an example with different values, see this larger version.

    + +
    threeSixtyPlayer.config = {
    +  playNext: false, // stop after one sound, or play through list until end
    +  autoPlay: false, // start playing the first sound right away
    +  allowMultiple: true, // let many sounds play at once (false = one at a time)
    +  loadRingColor: '#ccc', // amount of sound which has loaded
    +  playRingColor: '#000', // amount of sound which has played
    +  backgroundRingColor: '#eee', // "default" color shown underneath everything else
    +  animDuration: 500,
    +  animTransition: Animator.tx.bouncy // http://www.berniecode.com/writing/animator.html
    +}
    + +

    The CSS for the canvas UI block is a bit ugly, but JavaScript reads the width of the .sm2-360ui element in the DOM as set by CSS and uses that to later draw and update the canvas element while playing.

    + +
    .ui360,
    +.sm2-360ui {
    +  /* size of the container for the circle, etc. */
    +  width:50px;
    +  height:50px;
    +}
    +
    + +

    Third-party Components

    + +

    This demo includes use of Bernie's Better Animation Class (Apache licensed) for some animation effects.

    +

    Also, some loader/spinner icons from ajaxload.info are used for showing loading/buffering states.

    + +
    + +

    + SoundManager 2 project page (not an MP3 link) +

    + + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js new file mode 100755 index 00000000..c869d1a1 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js @@ -0,0 +1,1410 @@ +/** + * + * SoundManager 2 Demo: 360-degree / "donut player" + * ------------------------------------------------ + * http://schillmania.com/projects/soundmanager2/ + * + * An inline player with a circular UI. + * Based on the original SM2 inline player. + * Inspired by Apple's preview feature in the + * iTunes music store (iPhone), among others. + * + * Requires SoundManager 2 Javascript API. + * Also uses Bernie's Better Animation Class (BSD): + * http://www.berniecode.com/writing/animator.html + * +*/ + +/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: false, newcap: true, immed: true */ +/*global document, window, soundManager, navigator */ + +var threeSixtyPlayer, // instance + ThreeSixtyPlayer; // constructor + +(function(window) { + +function ThreeSixtyPlayer() { + + var self = this, + pl = this, + sm = soundManager, // soundManager instance + uA = navigator.userAgent, + isIE = (uA.match(/msie/i)), + isOpera = (uA.match(/opera/i)), + isSafari = (uA.match(/safari/i)), + isChrome = (uA.match(/chrome/i)), + isFirefox = (uA.match(/firefox/i)), + isTouchDevice = (uA.match(/ipad|iphone/i)), + hasRealCanvas = (typeof window.G_vmlCanvasManager === 'undefined' && typeof document.createElement('canvas').getContext('2d') !== 'undefined'), + // I dunno what Opera doesn't like about this. I'm probably doing it wrong. + fullCircle = (isOpera||isChrome?359.9:360); + + // CSS class for ignoring MP3 links + this.excludeClass = 'threesixty-exclude'; + this.links = []; + this.sounds = []; + this.soundsByURL = []; + this.indexByURL = []; + this.lastSound = null; + this.lastTouchedSound = null; + this.soundCount = 0; + this.oUITemplate = null; + this.oUIImageMap = null; + this.vuMeter = null; + this.callbackCount = 0; + this.peakDataHistory = []; + + // 360player configuration options + this.config = { + + playNext: false, // stop after one sound, or play through list until end + autoPlay: false, // start playing the first sound right away + allowMultiple: false, // let many sounds play at once (false = only one sound playing at a time) + loadRingColor: '#ccc', // how much has loaded + playRingColor: '#000', // how much has played + backgroundRingColor: '#eee', // color shown underneath load + play ("not yet loaded" color) + + // optional segment/annotation (metadata) stuff.. + segmentRingColor: 'rgba(255,255,255,0.33)', // metadata/annotation (segment) colors + segmentRingColorAlt: 'rgba(0,0,0,0.1)', + loadRingColorMetadata: '#ddd', // "annotations" load color + playRingColorMetadata: 'rgba(128,192,256,0.9)', // how much has played when metadata is present + + circleDiameter: null, // set dynamically according to values from CSS + circleRadius: null, + animDuration: 500, + animTransition: window.Animator.tx.bouncy, // http://www.berniecode.com/writing/animator.html + showHMSTime: false, // hours:minutes:seconds vs. seconds-only + scaleFont: true, // also set the font size (if possible) while animating the circle + + // optional: spectrum or EQ graph in canvas (not supported in IE <9, too slow via ExCanvas) + useWaveformData: false, + waveformDataColor: '#0099ff', + waveformDataDownsample: 3, // use only one in X (of a set of 256 values) - 1 means all 256 + waveformDataOutside: false, + waveformDataConstrain: false, // if true, +ve values only - keep within inside circle + waveformDataLineRatio: 0.64, + + // "spectrum frequency" option + useEQData: false, + eqDataColor: '#339933', + eqDataDownsample: 4, // use only one in X (of 256 values) + eqDataOutside: true, + eqDataLineRatio: 0.54, + + // enable "amplifier" (canvas pulses like a speaker) effect + usePeakData: true, + peakDataColor: '#ff33ff', + peakDataOutside: true, + peakDataLineRatio: 0.5, + + useAmplifier: true, // "pulse" like a speaker + + fontSizeMax: null, // set according to CSS + + scaleArcWidth: 1, // thickness factor of playback progress ring + + useFavIcon: false // Experimental (also requires usePeakData: true).. Try to draw a "VU Meter" in the favicon area, if browser supports it (Firefox + Opera as of 2009) + + }; + + this.css = { + + // CSS class names appended to link during various states + sDefault: 'sm2_link', // default state + sBuffering: 'sm2_buffering', + sPlaying: 'sm2_playing', + sPaused: 'sm2_paused' + + }; + + this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.addEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + o.attachEvent('on'+evtName,evtHandler); + }); + + this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.removeEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + return o.detachEvent('on'+evtName,evtHandler); + }); + + this.hasClass = function(o,cStr) { + return typeof(o.className)!=='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false; + }; + + this.addClass = function(o,cStr) { + + if (!o || !cStr || self.hasClass(o,cStr)) { + return false; + } + o.className = (o.className?o.className+' ':'')+cStr; + + }; + + this.removeClass = function(o,cStr) { + + if (!o || !cStr || !self.hasClass(o,cStr)) { + return false; + } + o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); + + }; + + this.getElementsByClassName = function(className,tagNames,oParent) { + + var doc = (oParent||document), + matches = [], i,j, nodes = []; + if (typeof tagNames !== 'undefined' && typeof tagNames !== 'string') { + for (i=tagNames.length; i--;) { + if (!nodes || !nodes[tagNames[i]]) { + nodes[tagNames[i]] = doc.getElementsByTagName(tagNames[i]); + } + } + } else if (tagNames) { + nodes = doc.getElementsByTagName(tagNames); + } else { + nodes = doc.all||doc.getElementsByTagName('*'); + } + if (typeof(tagNames)!=='string') { + for (i=tagNames.length; i--;) { + for (j=nodes[tagNames[i]].length; j--;) { + if (self.hasClass(nodes[tagNames[i]][j],className)) { + matches.push(nodes[tagNames[i]][j]); + } + } + } + } else { + for (i=0; i 1) { + // only catch left-clicks + return true; + } + + var o = self.getTheDamnLink(e), + canvasElements, sURL, soundURL, thisSound, oContainer, has_vis, diameter; + + if (o.nodeName.toLowerCase() !== 'a') { + o = self.isChildOfNode(o,'a'); + if (!o) { + return true; + } + } + + if (!self.isChildOfClass(o,'ui360')) { + // not a link we're interested in + return true; + } + + sURL = o.getAttribute('href'); + + if (!o.href || !sm.canPlayLink(o) || self.hasClass(o,self.excludeClass)) { + return true; // pass-thru for non-MP3/non-links + } + + sm._writeDebug('handleClick()'); + soundURL = (o.href); + thisSound = self.getSoundByURL(soundURL); + + if (thisSound) { + + // already exists + if (thisSound === self.lastSound) { + // and was playing (or paused) + thisSound.togglePause(); + } else { + // different sound + thisSound.togglePause(); // start playing current + sm._writeDebug('sound different than last sound: '+self.lastSound.id); + if (!self.config.allowMultiple && self.lastSound) { + self.stopSound(self.lastSound); + } + } + + } else { + + // append some dom shiz, make noise + + oContainer = o.parentNode; + has_vis = (self.getElementsByClassName('ui360-vis','div',oContainer.parentNode).length); + + // create sound + thisSound = sm.createSound({ + id:'ui360Sound'+(self.soundCount++), + url:soundURL, + onplay:self.events.play, + onstop:self.events.stop, + onpause:self.events.pause, + onresume:self.events.resume, + onfinish:self.events.finish, + onbufferchange:self.events.bufferchange, + type:(o.type||null), + whileloading:self.events.whileloading, + whileplaying:self.events.whileplaying, + useWaveformData:(has_vis && self.config.useWaveformData), + useEQData:(has_vis && self.config.useEQData), + usePeakData:(has_vis && self.config.usePeakData) + }); + + // tack on some custom data + + diameter = parseInt(self.getElementsByClassName('sm2-360ui','div',oContainer)[0].offsetWidth, 10); + + // see note re: IE <9 and excanvas when Modernizr is included, making weird things happen with . + canvasElements = self.getElementsByClassName('sm2-canvas','canvas',oContainer), + + thisSound._360data = { + oUI360: self.getParentByClassName(o,'ui360'), // the (whole) entire container + oLink: o, // DOM node for reference within SM2 object event handlers + className: self.css.sPlaying, + oUIBox: self.getElementsByClassName('sm2-360ui','div',oContainer)[0], + oCanvas: canvasElements[canvasElements.length-1], + oButton: self.getElementsByClassName('sm2-360btn','span',oContainer)[0], + oTiming: self.getElementsByClassName('sm2-timing','div',oContainer)[0], + oCover: self.getElementsByClassName('sm2-cover','div',oContainer)[0], + circleDiameter: diameter, + circleRadius: diameter/2, + lastTime: null, + didFinish: null, + pauseCount:0, + radius:0, + fontSize: 1, + fontSizeMax: self.config.fontSizeMax, + scaleFont: (has_vis && self.config.scaleFont), + showHMSTime: has_vis, + amplifier: (has_vis && self.config.usePeakData?0.9:1), // TODO: x1 if not being used, else use dynamic "how much to amplify by" value + radiusMax: diameter*0.175, // circle radius + width:0, + widthMax: diameter*0.4, // width of the outer ring + lastValues: { + bytesLoaded: 0, + bytesTotal: 0, + position: 0, + durationEstimate: 0 + }, // used to track "last good known" values before sound finish/reset for anim + animating: false, + oAnim: new window.Animator({ + duration: self.config.animDuration, + transition:self.config.animTransition, + onComplete: function() { + // var thisSound = this; + // thisSound._360data.didFinish = false; // reset full circle + } + }), + oAnimProgress: function(nProgress) { + var thisSound = this; + thisSound._360data.radius = parseInt(thisSound._360data.radiusMax*thisSound._360data.amplifier*nProgress, 10); + thisSound._360data.width = parseInt(thisSound._360data.widthMax*thisSound._360data.amplifier*nProgress, 10); + if (thisSound._360data.scaleFont && thisSound._360data.fontSizeMax !== null) { + thisSound._360data.oTiming.style.fontSize = parseInt(Math.max(1,thisSound._360data.fontSizeMax*nProgress), 10)+'px'; + thisSound._360data.oTiming.style.opacity = nProgress; + } + if (thisSound.paused || thisSound.playState === 0 || thisSound._360data.lastValues.bytesLoaded === 0 || thisSound._360data.lastValues.position === 0) { + self.updatePlaying.apply(thisSound); + } + }, + fps: 0 + }; + + // "Metadata" (annotations) + if (typeof self.Metadata !== 'undefined' && self.getElementsByClassName('metadata','div',thisSound._360data.oUI360).length) { + thisSound._360data.metadata = new self.Metadata(thisSound,self); + } + + // minimize ze font + if (thisSound._360data.scaleFont && thisSound._360data.fontSizeMax !== null) { + thisSound._360data.oTiming.style.fontSize = '1px'; + } + + // set up ze animation + thisSound._360data.oAnim.addSubject(thisSound._360data.oAnimProgress,thisSound); + + // animate the radius out nice + self.refreshCoords(thisSound); + + self.updatePlaying.apply(thisSound); + + self.soundsByURL[soundURL] = thisSound; + self.sounds.push(thisSound); + if (!self.config.allowMultiple && self.lastSound) { + self.stopSound(self.lastSound); + } + thisSound.play(); + + } + + self.lastSound = thisSound; // reference for next call + + if (typeof e !== 'undefined' && typeof e.preventDefault !== 'undefined') { + e.preventDefault(); + } else if (typeof window.event !== 'undefined') { + window.event.returnValue = false; + } + return false; + + }; + + this.fanOut = function(oSound) { + + var thisSound = oSound; + if (thisSound._360data.animating === 1) { + return false; + } + thisSound._360data.animating = 0; + soundManager._writeDebug('fanOut: '+thisSound.id+': '+thisSound._360data.oLink.href); + thisSound._360data.oAnim.seekTo(1); // play to end + window.setTimeout(function() { + // oncomplete hack + thisSound._360data.animating = 0; + },self.config.animDuration+20); + + }; + + this.fanIn = function(oSound) { + + var thisSound = oSound; + if (thisSound._360data.animating === -1) { + return false; + } + thisSound._360data.animating = -1; + soundManager._writeDebug('fanIn: '+thisSound.id+': '+thisSound._360data.oLink.href); + // massive hack + thisSound._360data.oAnim.seekTo(0); // play to end + window.setTimeout(function() { + // reset full 360 fill after animation has completed (oncomplete hack) + thisSound._360data.didFinish = false; + thisSound._360data.animating = 0; + self.resetLastValues(thisSound); + }, self.config.animDuration+20); + + }; + + this.resetLastValues = function(oSound) { + oSound._360data.lastValues.position = 0; + }; + + this.refreshCoords = function(thisSound) { + + thisSound._360data.canvasXY = self.findXY(thisSound._360data.oCanvas); + thisSound._360data.canvasMid = [thisSound._360data.circleRadius,thisSound._360data.circleRadius]; + thisSound._360data.canvasMidXY = [thisSound._360data.canvasXY[0]+thisSound._360data.canvasMid[0], thisSound._360data.canvasXY[1]+thisSound._360data.canvasMid[1]]; + + }; + + this.stopSound = function(oSound) { + + soundManager._writeDebug('stopSound: '+oSound.id); + soundManager.stop(oSound.id); + if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) + soundManager.unload(oSound.id); + } + + }; + + this.buttonClick = function(e) { + + var o = e?(e.target?e.target:e.srcElement):window.event.srcElement; + self.handleClick({target:self.getParentByClassName(o,'sm2-360ui').nextSibling}); // link next to the nodes we inserted + return false; + + }; + + this.buttonMouseDown = function(e) { + + // user might decide to drag from here + // watch for mouse move + if (!isTouchDevice) { + document.onmousemove = function(e) { + // should be boundary-checked, really (eg. move 3px first?) + self.mouseDown(e); + }; + } else { + self.addEventHandler(document,'touchmove',self.mouseDown); + } + self.stopEvent(e); + return false; + + }; + + this.mouseDown = function(e) { + + if (!isTouchDevice && e.button > 1) { + return true; // ignore non-left-click + } + + if (!self.lastSound) { + self.stopEvent(e); + return false; + } + + var evt = e?e:window.event, + target, thisSound, oData; + + if (isTouchDevice && evt.touches) { + evt = evt.touches[0]; + } + target = (evt.target||evt.srcElement); + + thisSound = self.getSoundByURL(self.getElementsByClassName('sm2_link','a',self.getParentByClassName(target,'ui360'))[0].href); // self.lastSound; // TODO: In multiple sound case, figure out which sound is involved etc. + // just in case, update coordinates (maybe the element moved since last time.) + self.lastTouchedSound = thisSound; + self.refreshCoords(thisSound); + oData = thisSound._360data; + self.addClass(oData.oUIBox,'sm2_dragging'); + oData.pauseCount = (self.lastTouchedSound.paused?1:0); + // self.lastSound.pause(); + self.mmh(e?e:window.event); + + if (isTouchDevice) { + self.removeEventHandler(document,'touchmove',self.mouseDown); + self.addEventHandler(document,'touchmove',self.mmh); + self.addEventHandler(document,'touchend',self.mouseUp); + } else { + // incredibly old-skool. TODO: Modernize. + document.onmousemove = self.mmh; + document.onmouseup = self.mouseUp; + } + + self.stopEvent(e); + return false; + + }; + + this.mouseUp = function(e) { + + var oData = self.lastTouchedSound._360data; + self.removeClass(oData.oUIBox,'sm2_dragging'); + if (oData.pauseCount === 0) { + self.lastTouchedSound.resume(); + } + if (!isTouchDevice) { + document.onmousemove = null; + document.onmouseup = null; + } else { + self.removeEventHandler(document,'touchmove',self.mmh); + self.removeEventHandler(document,'touchend',self.mouseUP); + } + + }; + + this.mmh = function(e) { + + if (typeof e === 'undefined') { + e = window.event; + } + var oSound = self.lastTouchedSound, + coords = self.getMouseXY(e), + x = coords[0], + y = coords[1], + deltaX = x-oSound._360data.canvasMidXY[0], + deltaY = y-oSound._360data.canvasMidXY[1], + angle = Math.floor(fullCircle-(self.rad2deg(Math.atan2(deltaX,deltaY))+180)); + + oSound.setPosition(oSound.durationEstimate*(angle/fullCircle)); + self.stopEvent(e); + return false; + + }; + + // assignMouseDown(); + + this.drawSolidArc = function(oCanvas, color, radius, width, radians, startAngle, noClear) { + + // thank you, http://www.snipersystems.co.nz/community/polarclock/tutorial.html + + var x = radius, + y = radius, + canvas = oCanvas, + ctx, innerRadius, doesntLikeZero, endPoint; + + if (canvas.getContext) { + // use getContext to use the canvas for drawing + ctx = canvas.getContext('2d'); + } + + // re-assign canvas as the actual context + oCanvas = ctx; + + if (!noClear) { + self.clearCanvas(canvas); + } + // ctx.restore(); + + if (color) { + ctx.fillStyle = color; + } + + oCanvas.beginPath(); + + if (isNaN(radians)) { + radians = 0; + } + + innerRadius = radius-width; + doesntLikeZero = (isOpera || isSafari); // safari 4 doesn't actually seem to mind. + + if (!doesntLikeZero || (doesntLikeZero && radius > 0)) { + oCanvas.arc(0, 0, radius, startAngle, radians, false); + endPoint = self.getArcEndpointCoords(innerRadius, radians); + oCanvas.lineTo(endPoint.x, endPoint.y); + oCanvas.arc(0, 0, innerRadius, radians, startAngle, true); + oCanvas.closePath(); + oCanvas.fill(); + } + + }; + + this.getArcEndpointCoords = function(radius, radians) { + + return { + x: radius * Math.cos(radians), + y: radius * Math.sin(radians) + }; + + }; + + this.deg2rad = function(nDeg) { + return (nDeg * Math.PI/180); + }; + + this.rad2deg = function(nRad) { + return (nRad * 180/Math.PI); + }; + + this.getTime = function(nMSec,bAsString) { + + // convert milliseconds to mm:ss, return as object literal or string + var nSec = Math.floor(nMSec/1000), + min = Math.floor(nSec/60), + sec = nSec-(min*60); + // if (min === 0 && sec === 0) return null; // return 0:00 as null + return (bAsString?(min+':'+(sec<10?'0'+sec:sec)):{'min':min,'sec':sec}); + + }; + + this.clearCanvas = function(oCanvas) { + + var canvas = oCanvas, + ctx = null, + width, height; + + if (canvas.getContext) { + // use getContext to use the canvas for drawing + ctx = canvas.getContext('2d'); + } + + if (ctx) { + width = canvas.offsetWidth; + height = canvas.offsetHeight; + ctx.clearRect(-(width/2), -(height/2), width, height); + } + + }; + + this.updatePlaying = function() { + + var timeNow = (this._360data.showHMSTime?self.getTime(this.position,true):parseInt(this.position/1000, 10)); + var ringScaleFactor = self.config.scaleArcWidth; + + if (this.bytesLoaded) { + this._360data.lastValues.bytesLoaded = this.bytesLoaded; + this._360data.lastValues.bytesTotal = this.bytesTotal; + } + + if (this.position) { + this._360data.lastValues.position = this.position; + } + + if (this.durationEstimate) { + this._360data.lastValues.durationEstimate = this.durationEstimate; + } + + // background ring + self.drawSolidArc(this._360data.oCanvas,self.config.backgroundRingColor,this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad(fullCircle),false); + + // loaded ring + self.drawSolidArc(this._360data.oCanvas,(this._360data.metadata?self.config.loadRingColorMetadata:self.config.loadRingColor),this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad(fullCircle*(this._360data.lastValues.bytesLoaded/this._360data.lastValues.bytesTotal)),0,true); + + // don't draw if 0 (full black circle in Opera) + if (this._360data.lastValues.position !== 0) { + self.drawSolidArc(this._360data.oCanvas,(this._360data.metadata?self.config.playRingColorMetadata:self.config.playRingColor),this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad((this._360data.didFinish===1?fullCircle:fullCircle*(this._360data.lastValues.position/this._360data.lastValues.durationEstimate))),0,true); + } + + // metadata goes here + if (this._360data.metadata) { + this._360data.metadata.events.whileplaying(); + } + + if (timeNow !== this._360data.lastTime) { + this._360data.lastTime = timeNow; + this._360data.oTiming.innerHTML = timeNow; + } + + // draw spectrum, if applicable + if ((this.instanceOptions.useWaveformData || this.instanceOptions.useEQData) && hasRealCanvas) { // IE <9 can render maybe 3 or 4 FPS when including the wave/EQ, so don't bother. + self.updateWaveform(this); + } + + if (self.config.useFavIcon && self.vuMeter) { + self.vuMeter.updateVU(this); + } + + }; + + this.updateWaveform = function(oSound) { + + if ((!self.config.useWaveformData && !self.config.useEQData) || (!sm.features.waveformData && !sm.features.eqData)) { + // feature not enabled.. + return false; + } + + if (!oSound.waveformData.left.length && !oSound.eqData.length && !oSound.peakData.left) { + // no data (or errored out/paused/unavailable?) + return false; + } + + /* use for testing the data */ + /* + for (i=0; i<256; i++) { + oSound.eqData[i] = 1-(i/256); + } + */ + + var oCanvas = oSound._360data.oCanvas.getContext('2d'), + offX = 0, + offY = parseInt(oSound._360data.circleDiameter/2, 10), + scale = offY/2, // Y axis (+/- this distance from 0) + // lineWidth = Math.floor(oSound._360data.circleDiameter-(oSound._360data.circleDiameter*0.175)/(oSound._360data.circleDiameter/255)); // width for each line + lineWidth = 1, + lineHeight = 1, + thisY = 0, + offset = offY, + i, j, direction, downSample, dataLength, sampleCount, startAngle, endAngle, waveData, innerRadius, perItemAngle, yDiff, eqSamples, playedAngle, iAvg, nPeak; + + if (self.config.useWaveformData) { + // raw waveform + downSample = self.config.waveformDataDownsample; // only sample X in 256 (greater number = less sample points) + downSample = Math.max(1,downSample); // make sure it's at least 1 + dataLength = 256; + sampleCount = (dataLength/downSample); + startAngle = 0; + endAngle = 0; + waveData = null; + innerRadius = (self.config.waveformDataOutside?1:(self.config.waveformDataConstrain?0.5:0.565)); + scale = (self.config.waveformDataOutside?0.7:0.75); + perItemAngle = self.deg2rad((360/sampleCount)*self.config.waveformDataLineRatio); // 0.85 = clean pixel lines at 150? // self.deg2rad(360*(Math.max(1,downSample-1))/sampleCount); + for (i=0; i16500 Hz), most stuff won't actually use it. + sampleCount = (eqSamples/downSample); + innerRadius = (self.config.eqDataOutside?1:0.565); + direction = (self.config.eqDataOutside?-1:1); + scale = (self.config.eqDataOutside?0.5:0.75); + startAngle = 0; + endAngle = 0; + perItemAngle = self.deg2rad((360/sampleCount)*self.config.eqDataLineRatio); // self.deg2rad(360/(sampleCount+1)); + playedAngle = self.deg2rad((oSound._360data.didFinish===1?360:360*(oSound._360data.lastValues.position/oSound._360data.lastValues.durationEstimate))); + j=0; + iAvg = 0; + for (i=0; iplayedAngle?self.config.eqDataColor:self.config.playRingColor),oSound._360data.width*innerRadius,oSound._360data.radius*scale*(oSound.eqData.left[i]*direction),endAngle,startAngle,true); + } + } + + if (self.config.usePeakData) { + if (!oSound._360data.animating) { + nPeak = (oSound.peakData.left||oSound.peakData.right); + // GIANT HACK: use EQ spectrum data for bass frequencies + eqSamples = 3; + for (i=0; i', + ' ', // note use of imageMap, edit or remove if you use a different-size image. + '
    ', // + Ever-so-slight Safari horizontal alignment tweak + '
    ' + ]; + + }; + + this.uiTest = function(sClass) { + + // fake a 360 UI so we can get some numbers from CSS, etc. + + var oTemplate = document.createElement('div'), + oFakeUI, oFakeUIBox, oTemp, fakeDiameter, uiHTML, circleDiameter, circleRadius, fontSizeMax, oTiming; + + oTemplate.className = 'sm2-360ui'; + + oFakeUI = document.createElement('div'); + oFakeUI.className = 'ui360'+(sClass?' '+sClass:''); // ui360 ui360-vis + + oFakeUIBox = oFakeUI.appendChild(oTemplate.cloneNode(true)); + + oFakeUI.style.position = 'absolute'; + oFakeUI.style.left = '-9999px'; + + oTemp = document.body.appendChild(oFakeUI); + + fakeDiameter = oFakeUIBox.offsetWidth; + + uiHTML = self.getUIHTML(fakeDiameter); + + oFakeUIBox.innerHTML = uiHTML[1]+uiHTML[2]+uiHTML[3]; + + circleDiameter = parseInt(oFakeUIBox.offsetWidth, 10); + circleRadius = parseInt(circleDiameter/2, 10); + + oTiming = self.getElementsByClassName('sm2-timing','div',oTemp)[0]; + fontSizeMax = parseInt(self.getStyle(oTiming,'font-size'), 10); + if (isNaN(fontSizeMax)) { + // getStyle() etc. didn't work. + fontSizeMax = null; + } + + // soundManager._writeDebug('diameter, font size: '+circleDiameter+','+fontSizeMax); + + oFakeUI.parentNode.removeChild(oFakeUI); + + uiHTML = oFakeUI = oFakeUIBox = oTemp = null; + + return { + circleDiameter: circleDiameter, + circleRadius: circleRadius, + fontSizeMax: fontSizeMax + }; + + }; + + this.init = function() { + + sm._writeDebug('threeSixtyPlayer.init()'); + + var oItems = self.getElementsByClassName('ui360','div'), + i, j, oLinks = [], is_vis = false, foundItems = 0, canvasElements, oCanvas, oCanvasCTX, oCover, diameter, radius, uiData, uiDataVis, oUI, oBtn, o, o2, oID; + + for (i=0,j=oItems.length; i. + * When this is the case, the first doesn't have getContext('2d') and such - so, use the second. + */ + canvasElements = oCanvas.parentNode.getElementsByTagName('canvas'); + if (canvasElements.length > 1) { + oCanvas = canvasElements[canvasElements.length-1]; + } + } else { + // add a handler for the button + oCanvas = oLinks[i].parentNode.getElementsByTagName('canvas')[0]; + } + oCover = self.getElementsByClassName('sm2-cover','div',oLinks[i].parentNode)[0]; + oBtn = oLinks[i].parentNode.getElementsByTagName('span')[0]; + self.addEventHandler(oBtn,'click',self.buttonClick); + if (!isTouchDevice) { + self.addEventHandler(oCover,'mousedown',self.mouseDown); + } else { + self.addEventHandler(oCover,'touchstart',self.mouseDown); + } + oCanvasCTX = oCanvas.getContext('2d'); + oCanvasCTX.translate(radius, radius); + oCanvasCTX.rotate(self.deg2rad(-90)); // compensate for arc starting at EAST // http://stackoverflow.com/questions/319267/tutorial-for-html-canvass-arc-function + } + } + if (foundItems>0) { + self.addEventHandler(document,'click',self.handleClick); + if (self.config.autoPlay) { + self.handleClick({target:self.links[0],preventDefault:function(){}}); + } + } + sm._writeDebug('threeSixtyPlayer.init(): Found '+foundItems+' relevant items.'); + + if (self.config.useFavIcon && typeof this.VUMeter !== 'undefined') { + this.vuMeter = new this.VUMeter(this); + } + + }; + +} + +// Optional: VU Meter component + +ThreeSixtyPlayer.prototype.VUMeter = function(oParent) { + + var self = oParent, + me = this, + _head = document.getElementsByTagName('head')[0], + isOpera = (navigator.userAgent.match(/opera/i)), + isFirefox = (navigator.userAgent.match(/firefox/i)); + + this.vuMeterData = []; + this.vuDataCanvas = null; + + this.setPageIcon = function(sDataURL) { + + if (!self.config.useFavIcon || !self.config.usePeakData || !sDataURL) { + return false; + } + + var link = document.getElementById('sm2-favicon'); + if (link) { + _head.removeChild(link); + link = null; + } + if (!link) { + link = document.createElement('link'); + link.id = 'sm2-favicon'; + link.rel = 'shortcut icon'; + link.type = 'image/png'; + link.href = sDataURL; + document.getElementsByTagName('head')[0].appendChild(link); + } + + }; + + this.resetPageIcon = function() { + + if (!self.config.useFavIcon) { + return false; + } + var link = document.getElementById('favicon'); + if (link) { + link.href = '/favicon.ico'; + } + + }; + + this.updateVU = function(oSound) { + + if (soundManager.flashVersion >= 9 && self.config.useFavIcon && self.config.usePeakData) { + me.setPageIcon(me.vuMeterData[parseInt(16*oSound.peakData.left, 10)][parseInt(16*oSound.peakData.right, 10)]); + } + + }; + + this.createVUData = function() { + + var i=0, j=0, + canvas = me.vuDataCanvas.getContext('2d'), + vuGrad = canvas.createLinearGradient(0, 16, 0, 0), + bgGrad = canvas.createLinearGradient(0, 16, 0, 0), + outline = 'rgba(0,0,0,0.2)'; + + vuGrad.addColorStop(0,'rgb(0,192,0)'); + vuGrad.addColorStop(0.30,'rgb(0,255,0)'); + vuGrad.addColorStop(0.625,'rgb(255,255,0)'); + vuGrad.addColorStop(0.85,'rgb(255,0,0)'); + bgGrad.addColorStop(0,outline); + bgGrad.addColorStop(1,'rgba(0,0,0,0.5)'); + for (i=0; i<16; i++) { + me.vuMeterData[i] = []; + } + for (i=0; i<16; i++) { + for (j=0; j<16; j++) { + // reset/erase canvas + me.vuDataCanvas.setAttribute('width',16); + me.vuDataCanvas.setAttribute('height',16); + // draw new stuffs + canvas.fillStyle = bgGrad; + canvas.fillRect(0,0,7,15); + canvas.fillRect(8,0,7,15); + /* + // shadow + canvas.fillStyle = 'rgba(0,0,0,0.1)'; + canvas.fillRect(1,15-i,7,17-(17-i)); + canvas.fillRect(9,15-j,7,17-(17-j)); + */ + canvas.fillStyle = vuGrad; + canvas.fillRect(0,15-i,7,16-(16-i)); + canvas.fillRect(8,15-j,7,16-(16-j)); + // and now, clear out some bits. + canvas.clearRect(0,3,16,1); + canvas.clearRect(0,7,16,1); + canvas.clearRect(0,11,16,1); + me.vuMeterData[i][j] = me.vuDataCanvas.toDataURL('image/png'); + // for debugging VU images + /* + var o = document.createElement('img'); + o.style.marginRight = '5px'; + o.src = vuMeterData[i][j]; + document.documentElement.appendChild(o); + */ + } + } + + }; + + this.testCanvas = function() { + + // canvas + toDataURL(); + var c = document.createElement('canvas'), + ctx = null, ok; + if (!c || typeof c.getContext === 'undefined') { + return null; + } + ctx = c.getContext('2d'); + if (!ctx || typeof c.toDataURL !== 'function') { + return null; + } + // just in case.. + try { + ok = c.toDataURL('image/png'); + } catch(e) { + // no canvas or no toDataURL() + return null; + } + // assume we're all good. + return c; + + }; + + this.init = function() { + + if (self.config.useFavIcon) { + me.vuDataCanvas = me.testCanvas(); + if (me.vuDataCanvas && (isFirefox || isOpera)) { + // these browsers support dynamically-updating the favicon + me.createVUData(); + } else { + // browser doesn't support doing this + self.config.useFavIcon = false; + } + } + + }; + + this.init(); + +}; + +// completely optional: Metadata/annotations/segments code + +ThreeSixtyPlayer.prototype.Metadata = function(oSound, oParent) { + + soundManager._wD('Metadata()'); + + var me = this, + oBox = oSound._360data.oUI360, + o = oBox.getElementsByTagName('ul')[0], + oItems = o.getElementsByTagName('li'), + isFirefox = (navigator.userAgent.match(/firefox/i)), + isAlt = false, i, oDuration; + + this.lastWPExec = 0; + this.refreshInterval = 250; + this.totalTime = 0; + + this.events = { + + whileplaying: function() { + + var width = oSound._360data.width, + radius = oSound._360data.radius, + fullDuration = (oSound.durationEstimate||(me.totalTime*1000)), + isAlt = null, i, j, d; + + for (i=0,j=me.data.length; ime.refreshInterval) { + me.refresh(); + me.lastWPExec = d; + } + + } + + }; + + this.refresh = function() { + + // Display info as appropriate + var i, j, index = null, + now = oSound.position, + metadata = oSound._360data.metadata.data; + + for (i=0, j=metadata.length; i= metadata[i].startTimeMS && now <= metadata[i].endTimeMS) { + index = i; + break; + } + } + if (index !== metadata.currentItem && index < metadata.length) { + // update + oSound._360data.oLink.innerHTML = metadata.mainTitle+' '; + // self.setPageTitle(metadata[index].title+' | '+metadata.mainTitle); + metadata.currentItem = index; + } + + }; + + this.strToTime = function(sTime) { + var segments = sTime.split(':'), + seconds = 0, i; + for (i=segments.length; i--;) { + seconds += parseInt(segments[i], 10)*Math.pow(60,segments.length-1-i); // hours, minutes + } + return seconds; + }; + + this.data = []; + this.data.givenDuration = null; + this.data.currentItem = null; + this.data.mainTitle = oSound._360data.oLink.innerHTML; + + for (i=0; i= Math.abs(this.state - this.target)) { + this.state = this.target; + } else { + this.state += movement; + } + + try { + this.propagate(); + } finally { + this.options.onStep.call(this); + if (this.target == this.state) { + window.clearInterval(this.intervalId); + this.intervalId = null; + this.options.onComplete.call(this); + } + } + }, + // shortcuts + play: function() {this.seekFromTo(0, 1)}, + reverse: function() {this.seekFromTo(1, 0)}, + // return a string describing this Animator, for debugging + inspect: function() { + var str = "# 20) return; + } + }, + getStyle: function(state) { + state = this.from + ((this.to - this.from) * state); + if (this.property == 'filter') return "alpha(opacity=" + Math.round(state*100) + ")"; + if (this.property == 'opacity') return state; + return Math.round(state) + this.units; + }, + inspect: function() { + return "\t" + this.property + "(" + this.from + this.units + " to " + this.to + this.units + ")\n"; + } +} + +// animates a colour based style property between two hex values +function ColorStyleSubject(els, property, from, to) { + this.els = Animator.makeArray(els); + this.property = Animator.camelize(property); + this.to = this.expandColor(to); + this.from = this.expandColor(from); + this.origFrom = from; + this.origTo = to; +} + +ColorStyleSubject.prototype = { + // parse "#FFFF00" to [256, 256, 0] + expandColor: function(color) { + var hexColor, red, green, blue; + hexColor = ColorStyleSubject.parseColor(color); + if (hexColor) { + red = parseInt(hexColor.slice(1, 3), 16); + green = parseInt(hexColor.slice(3, 5), 16); + blue = parseInt(hexColor.slice(5, 7), 16); + return [red,green,blue] + } + if (window.DEBUG) { + alert("Invalid colour: '" + color + "'"); + } + }, + getValueForState: function(color, state) { + return Math.round(this.from[color] + ((this.to[color] - this.from[color]) * state)); + }, + setState: function(state) { + var color = '#' + + ColorStyleSubject.toColorPart(this.getValueForState(0, state)) + + ColorStyleSubject.toColorPart(this.getValueForState(1, state)) + + ColorStyleSubject.toColorPart(this.getValueForState(2, state)); + for (var i=0; i 255) number = 255; + var digits = number.toString(16); + if (number < 16) return '0' + digits; + return digits; +} +ColorStyleSubject.parseColor.rgbRe = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i; +ColorStyleSubject.parseColor.hexRe = /^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; + +// Animates discrete styles, i.e. ones that do not scale but have discrete values +// that can't be interpolated +function DiscreteStyleSubject(els, property, from, to, threshold) { + this.els = Animator.makeArray(els); + this.property = Animator.camelize(property); + this.from = from; + this.to = to; + this.threshold = threshold || 0.5; +} + +DiscreteStyleSubject.prototype = { + setState: function(state) { + var j=0; + for (var i=0; i section ? 1 : 0); + } + if (this.options.rememberance) { + document.location.hash = this.rememberanceTexts[section]; + } + } +} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js new file mode 100755 index 00000000..d7488739 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js @@ -0,0 +1,17 @@ +// Excanvas (Explorer Canvas) R43 +// http://excanvas.sourceforge.net/ +// Copyright 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +if(!document.createElement("canvas").getContext){(function(){var u=Math;var v=u.round;var r=u.sin;var C=u.cos;var l=u.abs;var B=u.sqrt;var a=10;var n=a/2;function g(){return this.context_||(this.context_=new p(this))}var t=Array.prototype.slice;function D(j,m,E){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}var h={init:function(i){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",D(this.init_,this,j))}},init_:function(F){if(!F.namespaces.g_vml_){F.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!F.namespaces.g_o_){F.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!F.styleSheets.ex_canvas_){var E=F.createStyleSheet();E.owningElement.id="ex_canvas_";E.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var m=F.getElementsByTagName("canvas");for(var j=0;j','","");this.element_.insertAdjacentHTML("BeforeEnd",Y.join(""))};k.stroke=function(ae){var J=[];var K=false;var ap=c(ae?this.fillStyle:this.strokeStyle);var aa=ap.color;var ak=ap.alpha*this.globalAlpha;var F=10;var M=10;J.push("V.x){V.x=ai.x}if(ao.y==null||ai.yV.y){V.y=ai.y}}}J.push(' ">');if(!ae){var U=this.lineScale_*this.lineWidth;if(U<1){ak*=U}J.push("')}else{if(typeof this.fillStyle=="object"){var N=this.fillStyle;var S=0;var ah={x:0,y:0};var ab=0;var Q=1;if(N.type_=="gradient"){var P=N.x0_/this.arcScaleX_;var m=N.y0_/this.arcScaleY_;var O=N.x1_/this.arcScaleX_;var aq=N.y1_/this.arcScaleY_;var am=this.getCoords_(P,m);var al=this.getCoords_(O,aq);var I=al.x-am.x;var G=al.y-am.y;S=Math.atan2(I,G)*180/Math.PI;if(S<0){S+=360}if(S<0.000001){S=0}}else{var am=this.getCoords_(N.x0_,N.y0_);var j=V.x-ao.x;var E=V.y-ao.y;ah={x:(am.x-ao.x)/j,y:(am.y-ao.y)/E};j/=this.arcScaleX_*a;E/=this.arcScaleY_*a;var ag=u.max(j,E);ab=2*N.r0_/ag;Q=2*N.r1_/ag-ab}var Z=N.colors_;Z.sort(function(H,i){return H.offset-i.offset});var T=Z.length;var Y=Z[0].color;var X=Z[T-1].color;var ad=Z[0].alpha*this.globalAlpha;var ac=Z[T-1].alpha*this.globalAlpha;var af=[];for(var aj=0;aj')}else{J.push('')}}J.push("");this.element_.insertAdjacentHTML("beforeEnd",J.join(""))};k.fill=function(){this.stroke(true)};k.closePath=function(){this.currentPath_.push({type:"close"})};k.getCoords_=function(E,j){var i=this.m_;return{x:a*(E*i[0][0]+j*i[1][0]+i[2][0])-n,y:a*(E*i[0][1]+j*i[1][1]+i[2][1])-n}};k.save=function(){var i={};w(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=d(q(),this.m_)};k.restore=function(){w(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};k.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];this.m_=d(i,this.m_)};k.rotate=function(j){var E=C(j);var m=r(j);var i=[[E,m,0],[-m,E,0],[0,0,1]];this.m_=d(i,this.m_)};k.scale=function(G,F){this.arcScaleX_*=G;this.arcScaleY_*=F;var j=[[G,0,0],[0,F,0],[0,0,1]];var i=this.m_=d(j,this.m_);var E=i[0][0]*i[1][1]-i[0][1]*i[1][0];this.lineScale_=B(l(E))};k.clip=function(){};k.arcTo=function(){};k.createPattern=function(){return new f};function z(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}z.prototype.addColorStop=function(j,i){i=c(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function f(){}G_vmlCanvasManager=h;CanvasRenderingContext2D=p;CanvasGradient=z;CanvasPattern=f})()}; \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png new file mode 100755 index 0000000000000000000000000000000000000000..b7b3b5ddd5822192b2ee83a517215957757748ec GIT binary patch literal 11385 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 Hu0mjfZbc{S literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png new file mode 100755 index 0000000000000000000000000000000000000000..28cc08791df1866fed4359eaa7ae1fc42d2c496e GIT binary patch literal 12003 zcmV<9E*#N`P)BPF0YOR4D?A z{r&glF8MTnW#bY2#=3X!-oC!R4I4JZ8XgV00Pa}B&G96#`0&FISFBi}E(X3uxm&kx z?(XhXVHYl37&mSl7Vum+IJ_0><;$0YG%A0fk}d%E{Q2|wdh6D$f*N~^vX+*XgM$MH z%gxQLM~@y@3?DxH%9Shprj?b|`0?Yh`26$F!^6XQc7eDj7K=gCSbzWh_c=K^Z&6l< zGG48%t&uZ;6Tl3uTD8K>l`B_*J+S!rOHiLsk&^l8GxUDk_ST!`}?J z14Q8U*=L`9@x>Qo$Bs2HFaX?miyZEUAATSraJRj^J$Gt-ef?9XPEm!;m@(tlty=*4 z--L2ldf0f|@$HYccTaGyqF?i%@J`8{%C{&k&>>4nNr{PxfpfhKsH7@GM~$Pb-Z+yW zivWF_o0}u|z#SVKn~4)A5>b;TO_1cZYuApa()h%lJ$vFiVQFdkuR+-}!L$9b_8pIP z9A`VOsJy81{|^YQTMgHB)qVW*aam~@N(uNT0OiO^)SFtA)fgZKO}A{>^8ESp zU=`e1vSbMg8LF_28#h)u_0XY15f97D%l`!^gH<;NY=$r6Iuvn8c*)Fz%sUsga7Hq8T}IBnaeRz{|O1 zxg#%+>~O4u)>*B@f<(p)&!5EQ#YvN-P9aXfS5ghOnn$_P;Ld&e^Z{wS`|i64jE07W z{QjOjdk{SN8pMJ)@h`|Rd~f@9KG7NOtmmV5@8LaXrL%L0bEG&@Aysg^{wb7UyuaL{ zMT@g%&jN0|1@2&Kgi4-%gocLBnKK8h@}{HwTwuJ>=17|f))Rsi!6LCpE|GJj-UO7n zAv|&p@%Q&fMZ?1;${8~=Grm4_=+K*Mve*Jp>cHzQ>&d$#8bk5Ws9v;Yi-Yk^M9+!n@gjaTf6B81ZGNlaQyrwCoVwqIT z*9xgvE)`2F784!vEW=Z@`e_3k;`Zqe^!`Wm&U@f(5U0V5J01@fm0(5 zM?VA^=No}?PFc<>&sAMcbn#8{EiNiXS@F901575BC}rZ^ez)yIVt_3Ey=`!;e}rO& zQ_h*do87GM9SXSJ_goVF)RTVgN1uF2E8MB27R|dz&3jS*mGt$m)Zkr$X)UBK6J8hS zfddDQ88e2zMU(p6xpTaF!~;OB^hTf@og3ZbbPq(ly?%QYvf4llSbf74z;vj6!CH@u zwI1nPyi=w)<{EjWjkLeJ)hA_;UE%&~iG3Z)snq~lA4Khjl3pOS?oS4x)T$3{lu(O5 zX`wBB-I@#|sLRCKF*TeQeN@Z@u)rO(ux)K^Ei5b$4F6%2y%N1nNl&@Nxg7I9#uBw! zS-f1d-8XsE)qFGG6GxoK|{K+o81DhuREe=>Mus8^!eDr&KFL34?Nx_wc|Q2!AfeSyAb`a;(` zQ=M|n{Zjf`=TqAewA6_@jiqJI>~)DF{V|#5TT$=1q;rb;E~Z&$81CI?)H)<0_W)5K z)dR%Hta)8?{P=MnA0ISB{sEN16|)^?+upFPb*?6@xcb-@gOU4RDca+g*zZaa@YS*{ zK6EVsuRHyc05P0;t8Z#w%WUc}mKNF3?~~YTkC`<62#wrK1J}^(v($AOEpecZV`#ZM zb)QMKH6W{_qk}pH3*OJWbm$%3bcB zxxzhjvSZ#BpJaIP4&S5!R|@y|-yV7O?lQMbW1sZC7c;2SBwAoi-KI029bruUmeRs2 z)Nv%O0(A_b)xL~6^n)2`)WOhiLVJ(T0bE>MfH+zrRAG90dT4Ut6-}=H1fKaP)& zM>bGLL%QY`7WMn(5{qjIaO5pMDe&CsPPv=CQ-H6zFGGBtN4kM`M&ENO^!qfLXGvPR zG}@E_4Z2ut&t7$HsOM~&d4dM%(d2zpX9E{Q@rA6}*x0zz$4yO5(f#Pvs~6r57%%{E z^Uf_=dPqeyk1|9K7&M^iBdN3Tj2PJk0^q<3=N)KQXy}y+*Ph^zx5+zYgnhvVuQWZc zJAFD4nx*czhyMvl6uUdxfiJK5*lMl(~rW(S#12dD`~>u$e0Z9HL666UBJuV zeDh6ZR|I7XK;YA_S+iyV6Ahz`)}=-ut|SdppJW}UoLSD<8@*HE!ay9A$Q+j}By-3& zfbwdutUf2>sQVn6WFo z=FL2bhM|f<8xIXt3~uO!d3$?n5@pOaSW>JxL%rt{uIyu5Wa^Wm6XnNg~rdss48KZXW0 zln7`{W6i~2CMG7}jZK?2Va;zs{8)RGZ=~M9Fsc3V_6Keph>}N1>c?b~$Y_~( z2M!#lCCV7(c_(@gx;Uuk>7MpM_HwCQ^8kw@m2z2FZ1QP&i8QzN(;#VT;RM5j9XfWR z`Y|LJn06ztfYfHtph1=QQNJMcK{rx+UfvzDdwsxHYTsG-^_bSSpo7#wOdw zKQIspyA;A6g-~nrzawl?3Y$Yq*X%j-IaK~Dr ztjtmVaq^GW7Om$y&Q~ZEQoy1)Q%WPl6>(SNiuWjmqCZ9I`m^5u@hjLzCwrm+v3$!?X|NVE=-;j;f5@kh>VxIH7PA59; z^xRqHY*boNAER=6O^Oi5$R(bN^kdOax66c8p~8Nputh8wLKS?#M|xq){6+Y80x$m%GxaPb zdF!=2+_Ky0Zq{MeN~y9+M~)Cn(M9|I{6qBGgGI6^S!DGPM@5~Im+n>yMnE=#K@1<< zBo=nc0XkdYi+}sxYwqQHh=;`ft(lZv2H_0l-3nn@uy8zHFcLkRw#=ZxYfT5+45F`E zsVTcTHUIL!8@7b_MM$%Z>yjC@V&yDj|-Jwvau57q1UzEDWbx7Y-L@(7>HHi*b`J ztP)-iW%o4pueM4U&~WEna$#d6yADP%pe00j z;*6aZXm0G=x35ztmeoLmipE1VC_jDnbdl?#HWqE#9c|b1OwZ*W%RLi4BQhhdh_0v# zdO*`9G#YbH%r%Y&+}h`#*vYCCT{J)s0+CkX#Yzj={e#iMst`CDFooN)g-Im4OeGBB ztzz6~c$L?9aQx)CutUcG6=NHGA&eOLFn0zW9gb$azYpvr7p5%Tpq6nPvKn$rG>zLy zjlU(e1}{eRLk{=ykOeygszJHzQJL8dvmuv;bUxm>?a{Wt8lu9SkXC_9A2 zTndUa_e}!6XzpO1wA3xL)8$e$*rbw|qoO!gAv-O<2e(=pEF6jkO8^C6fp0n%fEX|V zARvW{!6eG9Daug=?B}=gC&V5V`)2SbhwNo-7#<{}CUZGH?&*+;DmePLLA1u7=3b;< zy0fts1_kfFuYPdFl^ZZ@W#trNtDn>r`5Iofg?s>jCsr7xf)fI5K+5U}WSQU=Q>{5d*77xv;!&w&QFA zUjq=dEK6n=YiAW=rD~uD{>5AlqfeWl*d=b6Amy3PIi~_|V%^iG*vK<&n@>t#+af?O z5=(sKNoQ|9UlIf_#2y+t7y*or=D(wJZn%?wyYtGr2jIdvL`#xxslp%c=1EUj?Cj9k4t zqa?u=ASgvE`xsCpq3vD`%0a0?ZI84CU4Se4U+8ag%|xP5*W5XCJzm?k=r_x<6>gd5 zuE($O$mnKWGTS8^=%X1w#I9hwPcm|k=`MFA*$?5xfYq4sFLN$48H-N9cS|KMxGH^F z%s}zYsDWZST{s!XC}LA3#A5EwoTKqs3|u@^q~xnZ+3RM7FiCF*lg{Yc(pWPlk-;E*yMYq2ZI=M+h#p!=mz@uOEobNna0a)XzcLDT&fzBL(@ZbU39h2Yh(D|>Ts)Z zmg7W{s_6n<%A*0d#@Xis&~rE9fox~15{Q5fGw)8*zEU{PB@44r$X2F0WV_vD+2NyS zf<+8t$sKaW6@UQ9ZsPb>as{pmbk5%tF5MDN#0pQ;HjL0tvP@tZJWTr$lAv(n4{TMhn|7XtDb^#f!iTZIZZjrrnCcBGtt4sJ=9?o z^Cf~Dz|j2xQD{423!!? zKoK21iEnA>7p3wBmhZSx(nl?EY4H7LjD$9Fy16}=%`z0dUa4fj>m z=LGh4Au-@wEt}#lmrHeB@9gux{g>bEX-+x)uM{qH%|hr~K8K4t(F-6C$)6{DY zHS59jN)vZe!%s-HVTOX}*QHAr?27&CufMS0ts0c`%JR<2&YIpZ)p69(b#j~`B!jxqD1t%EYs=^YL6ybi-2Z&`LFzS^xwEb{%{a!e?l6LJ$U+;^52d;1S?=7Z zsT%Pv@I@vE;WH#&*n9}xSM|J%WX?L;8Uk5yB0yFtpTOv7pWkixGKd)U$Rx*H1Ftm5 zu7EG-0*nl}H+ZE-RQp* z?bLBJ6O@9rXIQWd`io|21dONyxz-DY#IAaju_dI%p%%z7j$Au}4v{KSM&1T|7rWkp zL=!nO(uuh)S&+aEwkrU>n2qXtq^|NUDE$XO7M?z5R}JmFuY^WyrCDd0^Z>atvbuiD zY2shB)}K~+z`JpiX?DMAsVWAd-OMLd;ArRtFsy?1r5cnkDK0_m4U{dfTdGVjBoe=H z#V)@jpgitselMG1WEz+~L+gf88=4hF#W8ldN2Ddf8*d5uqzf-a!-LURthj7fGiD3?AeMGW*y@(Y!Qs%a7} zaLGblhtvYK-!9)IwBojTry%G}bd()wPj}mY0_bu zae^l9rQt@@eL4$(s8hfdqqeX*WnCccNFwcJYUFhElEI^EgmOY&f`7Pwl_;al29ayC z3lFqxi_qj;&Y#4U?N8@#T%lJ`jFM)pZ&!8qACp97i@Y(ri{}gjEszM4nmDk&bXTqDpJW9K_WT! z)u0|hn*tCoaLt0O4dScOSMMUb81Ilb(=mH?4VngRmiD2RG+x&=1(LVBWElpVyW z4Ioy69t@0u_617q0jtr$K&HWTx@aL8i&(Ou+OP`|yM3T>#vWMok8rdMM%vY*9FiD< zt){9-*(+Sx<#I_Es}g99fh^h=$SWXgL$?St4R=O@aX2C$fnHOFjgL^TVhi)|4NN`?e1S5wjR<`U?O1Y%#MCV0|lT{XemF^rMl3$BZ;PS7y{9atXcnz2P#$;Ve5YF9XJ%rQo ztOa~LmQ6`4a77D8Vz9=Ao2Y>69c5I2$@f_Co%2ArTaLaG+8XR8=d|R4haWFEhu#Gn zs-la()Cv82R+Z=nk)epW@YYx|OQc=Nq!)mVn^pFV(9QVbg(2lYJ0EHSl_;a??{NcOBiNV@eH>i&N$5M*FUlz;_!Qm( z1%!8?q0(SC!T@x2e(80CXTtWVUiF@4yCK5EK#%YO0| zdiPb%0O|iTZEbCpC}WG{FNc1aW<3oP)w-xRuScgCiy4}xXxS*(l!R+7fHm*KZL1ik z%I^xW`a>Co5rzgvY=Fy#Qf4nk2TX-jF_7J<6n6UF{^a923B92F#CePOkKsfloF#+l z9}+w0ZdIb3Rgz^JW9u95i+w3|(HKU?+%gtD$7G~(fX{)3D{hQN&lr=cJyC+8b!fx)>$DFA$9X|DfUU*&zag1BdGaL0`Y5=OeI_R-L)P^Q z$`77A*dM-swfAa6AHy(lSnaikVzE>ieKh(Re8&hZ5yAdQz{;j`K$$ra-ZHqazUDsi zrAwDW%Tv>^R?3jw#3+K{YbN7T4cuWULqxzPuySF}uFLOGoeZR0Wq$)xLF`#Wg7gZ? zklNz}t>y=tYn{>ZkMOTOX~3ki(=m_mmjGG(ZEzp%Of1jK!rMM4Cknj5lx#PQcc znGa&{>6Ic4tU)92<@FK57Ns!9UT+#hDRQN3#`og+C;z2g9hFDAE7F+m2eZW76A&ckA{wIJQB!>UhzG#+U zH2vc1ItpzeGC~(0^$0dj!FkaL1;i--FwzDT*xCAblut=c;Z!FaIkd-Tk5ZXTk)c*=RHb?UB5I&tdVnK66@kls(6OZ#14FboSeUoG?`tf-n7z0Ukcx=iQ8*8ZCAgf>^``0%} zJ+EH93YNgZ8aUe={W*TL7dNDIRWJrlgF|5=$`pkqg|Svf9SpUJPfYfDk+6>e4G#jK zaHvtdPX534&i$#WI}PJM?fwlrvp?-cSGTR5TI=ri#_@I zt#;jZwC#2}?6%cvtGiUZv=(i(;$lUVDt9n|1StrSa0%g-gyfLqBqUr!5CIcJh@fD- z>?irIOs2X?AdNTTK#Bfpi zq8HL$Ak7GGBFfNgk@uOe!cOYV&;6#fI9b_qyaLRo3 zUdv5|dBA*&l}dep+!6z$ye5L7BM=o8B}6L&A6V{>ln7`s2k9@mpSYw>j=`jJhFn+f#ep)>1mNV2`@wx$?x zOOhl6UNK4f#qfscOZ-2o9Nq@4G#cL%oJ7b1!Mpe+ttDHlww`dD&^z?#jD_Wz4Ti>M z`(fL4&Qs9TxK&B)06oO2FHB#;B0Bvk;XOo>&d-21&dAC4_QB?0(jEeChR)$8$Hm1h zUc8v3_(w8}Ec&sqfY=UgIp%q&u=z+3lqvrlZb!N~{bSX~(aLDSMhtU?T_K&{YbDfR zN7xi$XA)kb_{`1zurm<4MeFLkzJiLMI*6&aB>7sC+1BKbatLtq%;p8K;#f;%{@s6? zl}rw0Tp)J4-GTTRy_b69YT{Prtz@Ncn}@!Z3$b#h}A(<2ZhhQ{COng$!K@ z5C6n$7J(k;qv`cJgwT(^Q9PBG^q*@VABz?2~ zkl|2GM@^}^bjP+G^B$Z>Gb;!epVkpnPv)($X!OhA*M4XGE>;!WXlM-6Y4Bl_L0{$^ zoC38FKx4h}N<5RCOw2;@f+d1U(~dG*t{TiXBZeH_L0*tjnL>{6*x|?CDtar?lqmPe z5E+7?EX*0@vV42~y0Udo9(~d~z;ke3PIXQ=nTF)k?L>bMT7jWwB=l%T7is$~roJdK z09xc^{uRgYWX6fduU+4w9WJYv%%*Trwo29mngf(?pu_`~Y*~9*@OeK()#DrDpG|!h zWW^`vC(Vcasg|dnHIt1(D_CCOVgO>($ulbo-40i%lITq?3Yl9Fiy;QTXYqIb2Yhts zI_J9@JR3_oqmErfB+wcL&~z&+8!HRs0>*ojjmb;0mMqC$0+BPMsmiZvznZ;&Huyeu z^r;wiOm$~9y9w;n>{K^Qr3=bwD75mQa)uEpgL(^3V{>We$`b>v?vQ{^_W55gto|rt z%YL}yG-x)3a$rMy^`7;`sD`@XS;Osvp(^ILrer3|X#No@7XBz0k@WYN&d0 z@_Cv5a)K@ar%Y!K8QO)(3uk{jn}2aqPQwVqM*TMxZSyiOp?HWPuT=JK; z@p*@;qnWN8$F_XZK7~NT@Fc3l0G%XKij36P2R2iosG-w&rh8FXMSNnH> z5#kpVu3gpVzV8_SQ5T=;V?(_cO3_8*S>Q|cNb7QoAHFo3#PsCt*Q#UaMyfQpy0G^x zCBnj(uvcRdw)H0`yC6U<%^$#)nFIyywI$uN(??S@EmBBpK$d)6zSof^%wCnhYV3!x zaCJUK^C+P)fq!w?v1Jw3iU7j21jlWv)4xa==VTZK{8ifJUFGfEp@7Q?JeoZWBa~C+ zFI)o*oS|ZvqKk9g|329nqZw-MADifZ;x6bmcvqTz-DhGT`0ntvhFR$VRuX5i<}aG4 z)XiOf1(#>+T8j1Zrt<#37xplI!Ppj;7N!}pxce&FU;sloTV2=(!;h(PY=W!KCCA2t z`V9=3M4-@C$Y3PO0P54~pG-}ak)Bj3)jjI&^YoQ9mIYX*!vF5CYz56Ulq$-o-Voc{;KXVKPp?f7|s{!4*-Z^MB0?AV1dR+m{VgdYRA z04>nOV0r5W9dpKIi#9QTr~L%+Bk#0#GEg44rnFyt|D+oi@o{k%IO2j)y(I#}u#Q)^ zamfi43@8Hk3Z<9Oo~g0VN*~>DvRewF#-&TQwqWf;2OmOkp~clg-tyCH*3x<|ca+!a zY6EceaT;i$GBw3r`B3I1rq%wCJxnOaY%!&SRn7(3p2R9A!H09^{I{!4L)_;AFs}V_ zu4`>^SB(1nDNA>*{nA0}4}?1wQ)oNzVguH#2YnngYtN*2TmUb=Uzx6FwTz#T2exX5 zVpL~W74-g1*@qN4`3(O!cMoHS42Z8S=I-g|>hh%w!eGKjsvQh~0yOF7tc+2nkI3!= z2R(KTT9LPc4i9;S)F(wsf7vtcksMOs1^~YmJ|66Ge*F{2hL|zgSJC?WjFAkD9o`~- zkO?2|P?*k4{wz{lAbUl@1j$sCCdsr?tL?H;hrWqqwlrAV%go&>yDQH&oMIVGm9OMF z#!}_W+47~5mce36pW58nEVs}qvzc`NI@$S;@4b-?7eVI0XgE%Qg7b6lw_wg41Z2MV zugZQR9zO$L3=5kdLy+J_eyz-|Kmj1G)>X%A;{kVD)i%6n1XZrNM?O=3rqCz?=Nl%U z(hlR5oHO9!qq$GvfSCP-z!5)b_K~Cb3@w`cM05jgCBLqpl4Z&TSPK8 znfxBS6_Ql+)kGVfw*_@p3=^9LT#S^c@RR~a-1_*jA^aHk5MG#zjl|L)bB3V;$CRF7 zPCr*GdNPyewy#s$E5YII>#em7SGq^49<_Hpf8L8hgi;13H5gBm+|}e2L3gCHDtf29zEQxlnLI zUng4dFLQ5U#n>_)EL&^)b=nm|H22v$U(nMVf|Mavhn1w3hOpT2jp?R{E4Irnxk9dB z?Uk<&RQ{O^g>_aE4{lG)83#fz1kmN)xYvV!;LOQkxd1o{d?*3xc&!zyoU(#5ZU);+7%%6XN;d7?&cQ)_h~N>u4$8ts zxfiAkv8Xw@NR&T2PId4_xFd|0OUOV5=%e|bKzPW+McAm73hOKdwX!}K#GIf}GQOVu zI=+IzbWqm!=tVspS(K4NBO6COgD#Y0mqIBB>-EN>I?JP39)b*eWnkLmSoA^}ca8Ry zWH?g{aBJBa>@iGzeX&0TvjKP{j29E;a;9L&zQFrxfeTskI=vBR9yB`!ViKwfdj%uY z?0JK`pj(O7(9o5kh@;HG#eA>mJ$8-STeml}Ix{HH*b7zz*0^2l8iz>O$*i%>@%d;v zN{6c*7&v9FDQwwyGQw5L^MqMOJjIX;m-Cgp0jBc#I+AzZ>iJ0_G%FhP4IdSJgq)s2 zR#bIXJ(uGYVp5fp(u10FPR3|fjhzULU={Tq83nn7F_f;GNosI5fGpvT_0L3o zA~_u0c0`Bn-mWkt&e6ruRNj1X!3MhslR^WusJ7Z~0xusLwlJ+F$9U(ebsq zUG!_hm&(S=GgnJ2Wdc^^)J2<%HWM_&^3`-5TrkQ`@;1Aq3;p5|T6B``wd~jC9GF96-rQ$? zG2=x{cmil3p8mZm*~~q~l=5`S(<)h|GwOt!o~}cqlPK{gwOV?l@<>Hn#Rk;|mWKeB zB~Z!`PUqpohk47m%{{d5Dp^jRJ#R_IlGLhHdN0#u)TYVMDr^=TTg0N|%}(holESWn z!3{5kaWU+dhCMqk05lvR+~Ylga>rl?qKe+#gB7nfx3hh)Rv7iYco@7HTSiqzsv$MY zngxzH;!jkcPzNAgNEbnzQNAr7&3b@_byeJ2JpCwB-LF=z=C?xRU@QGNZQM&~FL5U_ zIdQLH&6X>e@IlSN`G@8&NL~OZ0$+g%gEHInvdZj#UUU>VDY`}M?LGY{Gc6%zQb;Yy z-Z=qY^W(~G{ftxL%5l$3CYmrzUGzrD?xmRYKN{_*QjqKt)2$=U@!=L873VW8Sy7; zw-2_5anjSY>p14X5;~C@yN1u0Va~wi@is@!p#ic_vrnN_V9=a1XMWf4g$s*j@91bm zh6|?wW#c&`9W2t!r8!IOE;|(}1RP$AeGTw>1eRgXFz0NsSb!ixaC65H4@{ED>2M+_ zH9mfewRj((43spvMKTZd#xv$gG$bO=ibda1!39AgTqHDiay~%ef#aSU=zNL;1{?Td zxyNdbMdw9-uKwJA50U!>WfDvj{|MG=lxrrkOA=3H>H>U<>CU#kwhs$F++DU?Yt&lI z7Esgs9fsQu{zySg!AADNTh{Ppt8B4b*!KL5tT!@D8GGvXyj%1xsSdI0K0}#VyC2Ak z-aP(hZCCB2K8PnNau#jZY^Rnb`Xfg(I5^nb+l!^6&fVJD>hK+GrpvR_>11oHB7M=e zl5M-ncl8bQ5zyGpc>MY}BLwtgztDWaFNqvv)9;r#gcV2nfSWpN|1A7||7icjA8GVh z`>o>Ex&Kg}h9lFGN$SFKr&x%K$T5R5sV*rwYjL!7W>AjQ0VR->oO~u%&YeLyQU|-@ z(Z>O3#$jeqj?}?42UKk`ice2{I)iegjvh}B>-M1hPT@Or(PmJN$T4_%kg*JQAbdIN zWh5PEP>#q!TZ$H-vPIc+u8DTw49YXdT|s%~_%A+asF!hRdaVEe002ovPDHLkV1kxv BEzSS{ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png new file mode 100755 index 0000000000000000000000000000000000000000..fd57d068f82f80547fec98b3986d02b7f7fbf431 GIT binary patch literal 8983 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

    H5OikG@5m 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg new file mode 100755 index 00000000..9b4ae056 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg @@ -0,0 +1,127 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Generated in 2010 by FontLab Studio Copyright info pending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..5ba183cee5676a916c2f49205889a1e61baedcd7 GIT binary patch literal 20496 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..97fd210d646be5656c6e7c47525344d14504c214 GIT binary patch literal 19626 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..cd75c788ab07394a27fdc7d82c922de1a1c7744f GIT binary patch literal 23040 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 z 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 I_n8g=02>8dtN;K2 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg new file mode 100755 index 0000000000000000000000000000000000000000..20497b7ec7638876d38399658738b4b99b63c1d7 GIT binary patch literal 12510 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 xjud4|RJ?+w%$GZ`3do(maC!UEvi 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 ^c)JcNzP*u2ic$an2@0ILws_N|T= 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png new file mode 100755 index 0000000000000000000000000000000000000000..ad08d03e719156dae248362e9637cb85b4f33638 GIT binary patch literal 233 zcmV{2?{}i*(=npME3wC6OwO==={#p@3r|u z&y_snUFgyURtKyOSRLr}6GTAh$tJ4}K+ooJ4?g(l_DK`K>)Ras z>$*?DKW~iz=m@+o*~l*t&`kF^M;G0?Gz2OgiEU0+RzN_b%ZTgpTLOVb9Ve jMz3LY!0O;M1& literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png new file mode 100755 index 0000000000000000000000000000000000000000..c4d7b764b2944b078734a342be2de417c175b3a7 GIT binary patch literal 1895 zcmaJ?dpOkV7XE%?#{7tKO>JS2+)B1-t6lD4BD)!dlG|vGkbA{YHp39Ry&tzo8qA~+ z5wb}x&4`-XPK7Zi$0#$d<({_tT+Zm6zt4KUXFcnA*Lt7zerx@)ej}X1Da!vK4**bf zIpKI30Ei-u&0$%o-*v4v2>`U2i=(|q{LpL(K6BV(4_l{bf`?ESI4 zWbLinr$gPAv^Q>U{h}m6&q?gTFIUMMqH$4P0-m7e@lZ7937d!bR5S8w|uqQ%Pu)XbpWaAvfumFL_(A#ZI@ z`*7UUcKBv>^(nfIA2ni7=T=0^zK7Ompf27W@q1oK5GhXQMY5_Oxlw238b6Z9ZR@1> zt?2S!A86G7fOPWoG!e4HeF)F&74xv~}jpS1BqN}R$!2y9liqTJgI#Vl@2hV+S9*%r|3$G zU?F3L|5A;;--PHWl=amIH_RkfFf)DW9nU*FmWV4oT=GnW1dtubM+3`twQDv@{$b>! z6^tj@8gdfnAsWkm#0WXifV6v3gIPSb^b>M*TZO4%w1I8Vv&*t`;X8foXFhW(?xRQa zO1szJBaDI<$+Lz41_(@Y(2j4T5Ru(ws|?;K)yq*1fnFQ;fN6&lbf-)_>AL1bG0j^M zj-OPYODf*fkBtmx9tTQ5Dh8wSg14jN&hn4F{K3}=ccs0{-mj82v7B67?>v!Ce|cLo ztz*76DfR+_#~jmkh|(E~wO8I^MrZJ`1BxT=Otexl6%Uo8!LVW!KS>_!nS;P4_BgAr zUEPPqN=Tw|6-RwR&XlJOZi|=09KHAP2N`f)exJ0PM~Eq4SP#XGXB8X}aucjL+5I&Tn ze3h{)pwuXzw5t&LhB|`_8sEj*Noy`48Ig$KL#ZQeL_GVulr2;r;(I(8F-8!5LGLSB ziut1Tm9f3wvxEzv+b|<+ao^%689RycFMigjt8&_MK(KDr)u)e#LXRAdLTD^G$x5}h zbY-*^nV%&T>BvOLPLdd;>k5CL?a@l~4nxgx#*CoaL}SC4Qo53GdbqF}fIppyQqn^e zFi;@W3ukGJHST@2VWzfR9cv$Wl_ zGj$5h!*LTo{>g5r9#s1lyZ~4fQE`NHr6P35%dAj?{V*2pl{b^~KDb%7ShbOV0$zPo zJxD{h2qB2eXWead|I_3D- HftdOq;(1m} literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png new file mode 100755 index 0000000000000000000000000000000000000000..0492e8a0d565c476e0d99cd424a9a2fb0b652fdc GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mbUj@hLn;`PfB3V=yy_}A>8zpA z$m}rHams^D?5lXv_~d?fm~?KK&G9?0(^b literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png new file mode 100755 index 0000000000000000000000000000000000000000..f08a6705410b2fd854cb7413531c9d2fe8cc42ea GIT binary patch literal 33987 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 R;a2}rtxloLi%wj*|8M6>t!MxM literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png new file mode 100755 index 0000000000000000000000000000000000000000..edc5d35fe454b5e2a79c982b827bb2aa9146da92 GIT binary patch literal 3224 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 KMNUMnLSTaTL)zm2 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png new file mode 100755 index 0000000000000000000000000000000000000000..8c60abbcd8b90a9f8fcacce8b6b5a576cec4758b GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ez!2%??1H#S&scKIb$B+ufr585x9#WKW`B;C$ zJ$=WiQ>-@*a>g{@OYl!ms@xp8_ngcA=J5Xy4s9&Hv*vK+S@rD6(X;Q|dJ=X<^O;C- zm*v$THo){H<$tih%kt=) fB)|JR|Gj5^W@xhep;2HG&>0M#u6{1-oD!M<+15+& literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png new file mode 100755 index 0000000000000000000000000000000000000000..8d20f60338cc6a64e3df9867d25b244403d94a21 GIT binary patch literal 168 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png new file mode 100755 index 0000000000000000000000000000000000000000..de21a6f2b4b9ede823652fbec87d569a6169389a GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s0wkH2?q3U}j67W&Ln;`P|D0!FbKv5VILI>N zzxB$bj%OJyNdr_?O2ytc_e zgAKqOsRX2gj^PWWJgFP0o|30#p?N%gG=!7B?`OZPbQWJe_~-t@{>?^i-~SpyjUHz3 zz^gL0W|>EhVpq*(GyDFZo#(%5(L3%?y!84+toUicdhClCJO5t6d3r9Lc;oX1d;8s^ z_H*zeqp~!30Wr_>hQ2wwesb^DUY>EC#TQc)pO3SML(CRTSP2r=GcJq0G?rNUxo0oK ziwv@gLAYgo)KsNXnY{lOy%l7~UwvwrIb%_rfYcj7g(Xmn-+Rn&H!i;YXfoU=6be;2 z=ty~>lD?2?wVFQRGfUHg+vgs!hkYhE6J)*`ezybB7tA6jQLI)Uq$RMf7z7~G&_<)- zHZxC5(QQbzJ_(yFMnu?<`S4jNxCpr<^5`fs8aDWBShw4avNX3Ye9mm!l0a;Ok@>8# z!w?FkhX;2VV@1qwK)>G)GTm0w&*a>Z7*W(>BqWZE-<}XCEaruRIqmipGRUHJGlK=Qn@bBadm%I+wjVwM|Ch$S0rc-+G__I`{n_KMz;Ck;KOiAFb(Uo~>tKum%7; Caxka> literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png new file mode 100755 index 0000000000000000000000000000000000000000..320f987e0b977c2d4df09e5eb8baddc526713ffc GIT binary patch literal 549 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 F_+S00Ar}Au literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png new file mode 100755 index 0000000000000000000000000000000000000000..679051dc4973018277f08a5400a3aa8f66d2845f GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^QXtF$Bp7-Wg@u4rzNd?0NCji>#EpCh95|f*{(sM^ z-fkwPSGHoF&e@~l3ub-hDOw?({HNFOPe)@o&yuvRo$9lewmJ!2sk`hlwLe7j^yLle zQx?aoen~pg87JIz>3Zt=ZQK*D$0;3sU+)~d=c&p3m38qGt&j3I@49j2HDi(d6wO-o R{wE+Oc)I$ztaD0e0svqHK^y=8 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png new file mode 100755 index 0000000000000000000000000000000000000000..ad1c48849f7848eca63ce722a48313fdd763c88f GIT binary patch literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^4Gav73@pq*R_FEPDL_ghz$e62P*9K|ZKi~T1dvox zQUa0?5r(z0O+YnlB|(0{3=FSd3kf+Y{V!r*V7ln(;uunK>+Q{*xiXFdtq%|Jw{6^J zB=AIc2D9;mg)Au=8j?PZH&~{y*fs_*nH;%!Gr8~Gu3O4kcjm7BUU=iOugxdt{rl<- z^BlgsE-}b6VA~__r|-<{r~kfvBID)lyi9Bfa+72Y>ciC&7QbR41;Q_lQg@oyj0vos$xo#{I zV9iP9U^cUCVVte-sG(G-@PJhpOTtuFrVU)m%n{2bGU`0`U=*ud!qDwd)KINtdBAp( z%7ba1LIvEa+&h*{VvR}mWY*icgmHSprv}TJHVJ)c3QpTFn-#~UXj@6N)%-eyl9kA60I;v>CWc~ zA`j)-Q#iU!RGcGP6gdwWaeE3(3-p+?!OQ7UOQ?X5+M41C28puGE}XMPRJ?AqC^#N6 zW9AgvCg{<#!P_CJC6+-*>CJOx#Y1&ALW(BKlm(rVErb-dq$x8xWt%)wH&Iuvb1F7? zXKh{l@%}BjZt2@U4;I+3JGc1g?>$xiV(;_UeBXU^XWFjS+|O6NU6)^TdfWazANN}P z73aCWdi9=1JIwe~Cm-Bgol(s*@2~gmrv+~oyt3;~<_|BgdgB{&|Ha0B!M`gG+MMV) z%=cNtv@d$i<||gY8~uu3@7ezEcm0-sj~<-Q|628Lb^X6Ed?5=C^qOD)9@wwlIC=I) T<87;e$(_N|)z4*}Q$iB}%|KH! literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg new file mode 100755 index 0000000000000000000000000000000000000000..d758823dcc1178837533079db971df62ea024317 GIT binary patch literal 13063 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

    VVwY34U7I_pH(nE(#nKyTNP(bX`rB8>4MT5hT zWRDw}y3BfmR%!28o>x$qefDPFo```d5lKl4R;(<|FRp8-LP~UO5k`4IfVZytR9}4Hmz=Gx;iy3zRj#V`RnJa9)3CN+>!dqlB-#}wT*U##d*kT z!q7K#bXHfFcN)6zf>N+U00UqYz6Iez>& zghq>tg!OgnV9V{6EE}Z|mCa4HRpkX^#{!&HUQvD>v2HvkNnkpXpN1(eB|Kq%@kZGv zH2MDh2SD!yTr2SpB@EH9=F)KNVFQxuX&4IzY(r2IxB~f~u%9u|xLqKfh&925a}qM9 z32YNCG2NXz=x~ooh*NSV;epSdJ!@NFz)b*X10ocs(*rQ9F%~N5@cCa2@-Q$j4e}mjP*uieO*1G^ze`aC0D3UR$D8HwPRXaC|+=vORt_M zLU@vcC|F26hO7hV1p28$DZ2=y>B52*Z9N<};$yZWHcPI;TWMQJ)iLOsK7M0)b>o%6 z_s(l?Fvw*tqoyp}@UQoud-b(XzdBr2QV|^$dgRyN%A2l@AJ?~~zO$;S(OK;bW5Lu_;-o8LPIn971cB}*0;4GPTdX=!-|S>4J5CthDMwpu)sZh z*FCoOz5n~s%}@2iw=XJX_C~8bDtS;v#dRky_lCBrnE3P#gHZ(EyHsYYPfbl7ahZ^W zb}Ga!@a?1#OC3!W6lYV4nOuo);^?5txpozhdHeV8!*m-L7lVq3YgeyTRn`Col_*Da z4mP22J481~C?pT3Jjmpvi}QkAy?Ow#hBHjBYlKQnV+83N^>vk)Q22n`&SEpR zP1mS$RQF)JsGFPd%JM&+C9E)_xJ(QHh!H$(X>n;ne8Py~BRoC93+^lxiNP54*LI?( zVpp!nqh_r*7<@u3M9?tcTP}a43}HH+Bpw7Z$x;YUF5H1sWMRe7s@$FfsrK+l<3`wE zyfxM^nQ5_5vkyW!r*pB*2au{vKjDJ#5|@>g!V*MRGzu>f``uRPMk~3PLgj5bJ?tjT z;J$voKpGNmWTG;WmjXSv=S$q${);$ITz<`++JRdi84;VAc`PbA5=%*O;nBmtj2S&y zQW)uRaioJ)tg#Oc9L3w8?9eqdSEJ)-Vhqxb9p$Q5o_S{X&h6iR@#U4=>*Hn&O-&u; z>=f42cJacw-0@=u>)UiDUok_628ElIU9Z0M@BjPn<^W%B7>dTOZq(Kyr9xyB$wY3G zgjFv$J1Co4TAdt3GhSdaI5;@J{nDoVsta*(K^_6}q}Tx(O%l8$S2L~{yYtE}RHly` zZ)a54J9d~&P9VBuVB!;lPWaNo#)Cv6%|tYDHO6}|{Ct89LX+pK3D3}2TC`JI-qK9G_>ohmp;?qK0-d?@~Wu5%L zpggp^Pd@pC#1w^gWUOQJS-i5+|1268XAW9Q`Ef$2xV^rQDK4cLo4WyJ9933Uuw&=9 zcySmD;Su2^MR6Es3vZYp%}2r{MH`0%5WRIwUt6>Aeg+foz_W&)!CuLO6XtR#KFY*lp4yf_7`L<4;EaB^ed5l z2l%3v7Ol6JH|EIMbLIn>7Z1!r1w_VUaL?lAhMI3aecj2!Gwad`Pj^pqmqp*zy!`KL zZ{9pVY23`_mZsG7G^N^Iq3IkqdR1JXP>{Q(x(u9&bCGoJqIS_ZDgX8N$LngVP(Gsq z0|BQ^BozxYQYH;VD9mmyu0CEKUYKIRZejU(7l7D~rxgjEf#B6m<-J*vcL{o=7dk;b#z%$}tq9}0?C+_3vONvWzV!IyE9XOro7ddBB^wRyP zw|Fc+9Tuf~qcEU+SgL{yEqxM+}5fY=~j(8Dz)9oM4ZJ1?Ww!`a$X(q;D?K}1>&_j!bSK(IsoB$|*0)oj-q8>6PrtI-QHg5ie%%fZ3E#@Tq(c*%7n|(o&3u z>{1LB$#v3&*U!tphJi9-#3+yiHFV3CKC<=8?JX^>7_`Kjl5J!Ap;>pr?*eQd64MOo zNc)*)7UtDnBXX9WiuT|*xxxXN=t$o1^N*Im4J_n#=H<33X*_pea1@e0p{l@uadQiB z1;>(m;|~RRk`s$k6~&75SPwVPz<}U!W5*pidIUWw%#dan;(+Rx4kDf;j^d82j66zG zizFmTP79$6w?OgP)x~zL4oktVg3N- zCfGwrUrLu@iWALxrFie`+B?TGf3qVK=a3)}FXN0VA$te>3Ap-<%yZQhC616wCiqpL zMF9|oP8SJ23YAMxbi%?l8_{kfDrvC3wW>{9(*;sFIH@#_i7_6?mX_lR4=m#85(K*C7SH|u+pR54jaD;gjQTl%!bEs_1t6M` zeev8Y|9b58f4?|v`~-u*ZPVqK6r8_Qapv5W{f9rFG5>*q{f6z{_G49Zg!Z2Y2q;4_5@Cbkmn3PLu=!my9EY-3m znwO_XL`1mRV6X?jNgV`CNO+XYOFSE;{!v3mh9kzBA^AyLCMy>^iF*l((H0tpq$oWM z)!f~N7|wE%o3c~3Gb`S-P$3>88*`6#2A85|V6a72iRq@~B#ViQ1u7lTPNJh@P=rui zTncj@4@;avg^J9ywBSjN?QIEhar*Z5>dI4uUb zB=8;k^&NQp__3&{XoSKMV*d5$!Tw1D?K(}O>Rsfx33P8O&O!o_+2G<5q*7{<`cG*Q zh%PmlY}y+u6+WR8Cf*+z@7K5gy>=$Wxg*EUUD%IK&d?HWR_UXHb2{qv)=rENqrE~I z6zF#;`--=l2D90>KYV*&_l^rU$`{R_dg*d8GW&zVoG+ZarZd^M>Dpb~G?)=VG?c}S z92xEJ=k2U^iV8{I^4=!{`=;*vd2d*>*F&>Mgamo4U;Xs<|L%%PI_n=6pp;LsDmtwY z)I!iw;=71oV)&p+$J8xFwai^e7l43;<62i!k$FBVC@=(p+@0TThg0P5&%R`6?{v|) zkdK&{o$W)6F`|TIq`?C1j))9H?km19=}5i#nR;0m>tDi~$4F|&yvd$YKH$&d>f%V0 z_;$1-Pg_U;mq2L0#Xq-{U~AJ5#6q@Q-+lv1OUp7ZoSi;xhLhSQE+%phI1|bw*aKE2 z+__RY4lx7rNpLT6EHRH!J}_e)Vqr^?oKjp>%i65%V-_BuFCS9&X&f4 z8_0MnGj%GjWFC|`t7|H1-CR6d8uWl*+p+D7l}|kS)2}~zxVm1vR2C5Ejyf#}62y~y zHSQ(#ZNYwCy6Psh*)6E3j0=wl2nh!U;DQGyjvGGE*Hb+pHNwG3;pgo%ZPLQ(o912L z9mp*#+Ix8SQ|lgHxANh}auYP|{d*6jPfhmsjL*4VeI@5I#2#`BBzB|fP=$q3y1Rwp z3i?UzgU$}{sL_1r;O^0*#>B-XfPVe~{*xxpM6e05B6-g^!>KIf*zwC<0Nef4SNM?ey7<1SbF9wV4OhJQO(X$X^ zQ&5NRi2dB{7ROJXG`Xa-xT>-$=h_W4$Z~de$6j*Q^yu5SYOqL6fP+q>aZK)$?BHm> zci+$OfR~n5-~gobNJPgF5EQqwr8pDdFGqJcqEGn%Sfu^cSU48vRVq^M@ZqrpeIO#`@pPrR@ATTB> zZAeo80fRK2E;@a8baY6!Nx5L&xRJw04xci7%*1i|CDrL^2`vb>${jCVFS&2#y%X*k z)zYC4jR+i^9Jzo08C`1!!b^dUu8wMDO|3RQ&U@aBSsvlBKYWq7=g7W+17g~cTG7_= z%DeBKJf88;y4Ox*6nok`H5NCV%Kj-P+D9qB0CXFK(4^qEiX1hl+#@#t_6u0ZPOvM! zb2mVzMvWSZkMh)$8$*Hvlal+k>N=ze^_DqD$xPJMhRk_O4|Snl3V0`z1qM87YWwu< zlaLgbkd%;^7>~AfV1PT)2v0&BtE{NV$F0J`A|YdSEp>WBE2u-p)9+7U--U=C<18=& z91u=U&Rs@ba}z~(eurw!ZNi!2)N%f`_bE%s%{5&oM zSJC5JVvJ(OQsQ2Z_?2{BVk!nA#Wrkal7vvI=@_p2<78$kF()a?oQ&g%C#k;{p*phn zm@Z;#1CvdQE0A<$92pk!bPLP^2xk=*-bDLC;1$oFGvli-ze-B(hf^5NpHjo&!UW5L z23R0Twc5sKpLu%Qwr?vcYUD~g=rtZ5o=CMskSsnCsZ$96XTt;7YQY>lXAR=7_=@Rd z5RE$nNNR&AIwlbbHvl?1dibzWZ@8Rw8WV|>=xoK~qX8pu5RkZNXX>;{ty~Z-#fPr1 zzHTy_9aKse&p+}<_33-`IT4RK%Od0+P`gh0&err&~P~|6vveM zV@tCy4Pb^8l~b=ra5NGU=Fgk;(lS4uy zuU*Tjsjitlb5?0#5r&?quS6<^O1SXhHiuaYSxGrc#0eyCS&A}P1o2_Fw2y8g9f3Aj2xAYMzT5_$_K@mMM>6P4&rr84TfXe8 zueZWe=mOd5=7CriTEE)auoh97B&=Da#~20-NQ{n-O-M|6@BPov$OGdF_?63+F5dXW z;~O@t+OU4r`n8X)U9&>ujj_XlK^P>azk8gg-WQsTxwR?2F>LPbGIlb4&iquZjAcdIN;)jFeReQ8Qc?1(=76XJY>!^3mS^SZ8?Gjj_( zeKoJV`o_ntFDccb$?*}_vnvuqBXbIJZsvbCWcWPzu_=yaf@*G&IJL_Jxr%JB9p7$_ ziwzk%c<9Ebo;`8$cm;y*hwKfvsAm&f!MLX zpTDl{7LEZjf!NBTG-2B|R@7(%YjD4mWFzqGzxn1HB%_nZMf}D+KzRC<_7LUqbQlMa zV92B==Ph`igmSMPmzd(T2FUyHp`*Ut@da-6+2;3_jGvV8>(Q}8hh=47f+q)p2_Fkj zhS-h;gI+q9yV0>Pmpr#@c(WMc6bNDf2JB~l73;UeSKRQDa+~?Pkv7ZPHDNMROo%mM zYH~?;#F|my=tTO7(aCWlwcBoPY<}bQcUG);Bse%6z-$stEj=$Hqj)&MNI>+9Dcvd}4k1aV1RpBt9333FFHf#toron$t4ECVzeVpa*?p1o_%F=ts>MmsEoIa+8K}DFKPz=P&Sis+yOGR>@McJyi7&_HX&K`I| z1gV@{y?9hO@zO${vq-)V(@ZBu0cXd?dlr|1ZO)R?7)YROu^}~;yHAYWo z*NT$zw3wu*sKB>getFe{51-6B;S~`+bi_UPFP%Q`{xv3tE^AX|+Tdt=xepXzd_I$? zeuH?0q9D1T6v~$7>X@jImS$aTeZ$Kyz4*x|AFo`sYVyQ!KkYk^lG2|bCTSs^knw)8 zaIPXTEwtglzyKgFLkROZFVOMS>Xy^Cs8Ilp#{bSeR*>8 z-{yq+v%F&Vf%l&CWWfoyGc6f8=O|K`ijhYcI6K$--N z)LWqo`pXP41tx|X)!b?4>Ws>B6{>C5(lV8sYgWy{#>VE9Y(fKQb-vF^SF*0Z21M zgb>lQz@T`{@pxt?e6KwL%)%Gq0S{42OC6pkGCEpjgN=OqiM>%A4wErsCY<L{ZBsms8y?tjslqW zek430Hx}9yWjK*{m!<%CsuSX)k<9!d04zRuuc)xp$Hx~=QwUf%qwo(-ANb2?BEtYf z;Wg`2Ha>*E8r|WM#*~vn7qmmXc34oz^)~&O@aVR)r@LL82RS(Xy#4dp>z-=w7W2J? z=1A$XW(i4B*iMkBR)wXd)qrLo0PR()?PX^B@bDN2+jAFw^Y#qrmpZ1Tu&SguyWLpU zCqA~jqqD5M4%7$6cv*F=(b5$Y;Vpw|qyQ?cVd|_gO%>&a?uPm%v&zBp%3IH#`tE?* z!9FxN@Ei)bQj+7<&OxD(JHPzyMs|i=8RTZF_w^duZfKNQ@HA$$@T@8++jr!nhnGKx zf^A^7iJ3*}!-c6t?do~_$WQCnJ_7B1(`zqXy>i7W>YK9w1vhYD+HWV09659}I3!Bo zPf6&U)ZtfJGvXHh#F_~r_?n;*1O5H?{`hll?hSYirO~DU8W0KS zsRv0{+rIDgsATtYr##MQ!cW{Dn$9IHo&Cu?9pGv#jXBkE%spc=GR`4wHa;;KMcQ9~ z{dHpUKuimSXh-t`HM~M}9p>wr$CrkO25;Gl{{3-t<}N_1G=*d%gKyCMVf(kcLPJ8K z31flkmyG=K*UMjnM zDIlqDw?%5ZO68waf@JOzeher}=ndz93xZ>mAVpJSo|kW^tGjyS*vSAR22xBya#X9n ztfRW7vaF!h&>0fuSA0_oV3wvO~tPrix{@Qm#+|H_he7^{PqZXY@^bV9itaZT{kuYdM+8{YC>~qN%0A+GcX{RyWla1SO>2 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 LNkvXXu0mjf`(=D8 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg new file mode 100755 index 0000000000000000000000000000000000000000..2d8aeaf7e5e5ef5ef72a539ca63c4918522dce41 GIT binary patch literal 14946 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 z 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..756e8d93e0e031e1fef58c0abc1771b775564deb GIT binary patch literal 40541 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..3816dd76075329524cda08175c9467d308ffb227 GIT binary patch literal 2160 zcmeH|X;70_6ozj|fEbW9QVb{=AebP8fTERJNGyvW*vJwIz}lL<)im5~wT!>STb(B2rL6WK&eIED1~UHR()k|1ka8AMG=9XYQSI?woVq^Uhp& zB{mTJ1CGp~NNI|ybfEx1M*-?uKx@&w7VsKKYgswdTEy5=T}>MApKuY)EfX*$z=pJnxMQBy_cLq~4PBGzuQIz)Mjgplq9}iE0g~_Ttjn zawxPK9*IOo&CWKV7&>zL}`h(8pV zK|Dg=%}G{B_;Eo1^H$;6k&)Jdj1b5ipee-7`Y2~2LW#F5HH)Mh^_7H!hZ zMPU?mgTo)>fAP{N6?e7%!=|B#VP0x<(PKuA*B_yhEa?@Bu8M*jTjroib`@pTvO=Ln zKY5ly)YjQNi^rc5DQ9HK*@@P3dr)oa`LlRxFlx$?7OJTVo2hY_F1wlg;^C5_{@X^6 zjfPinSQ^E#37+rU(fkr<=(rA9$Gx2{%i0juK1X|M&Cu%(lg&#RVjWHxm@(&~^r#1K zd_W`8Bi^1E%Z?PKT%7RW-oRkDL50Kvd1ubM*uL$`Oc=a~cekI0sWtpG`GJJAiVn16 zkXUnn^mIUqB(g8QymObvdt=MpnU1(ne0}J3%O2)rJ@NL(=k-|=@(nBExwb@MH%%UY z?^4CWO;0AH@;d3#UV%%<3C~~4y`QsK&iftx<)yC&0Fg3Y^79aOSp1i8Qkm|GKh-_= zA)u*f5`mCcee(o{(}93;&^}9Gqc9w5>N-A?@ipbp-qAzwNf5=5C<}w&?VtTS_?uNQ z7LBeIRc-Yw&xGSoPt8o5*sK=Eg0ZG9_10`1C*Pp6!3kUK<7%u1IQR9+^5^*`3ko|& zdMzHhnP|bbg2QRg?7~vsaoV@0ynT)GlP&l$9EH$5%Q< zs|($aYkC(eb@zt%=^Ne1OnNy)PRm~@IVrIFW^vf6fB9RlNe@feyvP9glI{I*Jyk`Q zYqeaQipWNsv5pl&h|{H81QvLZyTD?da&8FT#KV-sox*XlsoGd#IejtFM-UnEef8YUuvha{ zUSl=Fl?xKX(>lH)dcd^S{RZ|r{@iF@EoX3aS;e2>WG{G7`!Qm4sJ-cxSvVtd-=I+# zuD)NG{|VMW&CA^Vk!4_eZy7Dgb`PH7ZWY5V zw}HjSnzR6&hy{vBHYBT~`t%1$6Wo@)&z?evZ|Sj6Jb6*WCdZp7FUO{G=@f0WEJ=~x zB4TOIkkVfxRX-=k^S#nV7%GP|4lno{*q+Om&5H;j3~|0p`6?87?6lA090&r4B3-G{ c0Blc$01B>&`SUBm69bO2{7D}F^DimzJBp@V)&Kwi literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..9e9c63806d08da756f08ee10082b6757627cbb6d GIT binary patch literal 2592 zcmd^>c~Fx{8pgjIKsbaD5XpcfLJWt1a)?CK1d$*JnE;|3q9GucgF!?g;YflEMW|J`3zcXf4lRlof{Pj$cG zm&7pOFK|B?&QNU8QZyw1P{RUt-y!@vlzoTm-vRt@6lZPpboO$!vnFhyLyj*+XlVlg zx-^_p69oWhOL4T~SgA`3|4)El^@7v_zBd4phC}}YL47XZx2VGI-Yd|KIBq>}F#=r; zK=j-v=9JZ-$mG~9@01Z2B7H(B$mVl^z{wI;;wW>c41lyma_b>0oh14!~xJ>I5bB?O%+(d=*%vC1n@$2 zH#hU@c=&`Hm#-@bEl%)mKa<^Jti?VV$%P*>@Cc3M3o#Gnw63jTtyv*gEof8&Z~+9% z(o)N;bCl=k2hr<9Fu~=LwUI&scz<_M9T45FWN%AsoEf9&t zk+jn}ZT=@n$}m##hQ(0X+iynteE7nVfSjNA(V%Dx23s^zXCK7_s7-y?V#HXCF5Z*Qa?;&Wh#+H zTHw@RqC}J%5gdukp4}yyUsUJiWO1v(sSB%)wg+KN)Hk-;*UuBp^zd)o&zN8`vd=E* zrOt_`9}Aqq1Dbj?UfxU=faEQUsc&pKVGQ}HYXq(mAD9)d{No$`W_KLxeCkOiIgl^! z&YD3bc=uSacuD2;l1I@vU%d9Vn(g&DmF}hyCvW~xoA{*uC~LNy|I?g_(8;sw+M`E% z)1@l4^9SalUdMC}3;XuSBkIl#GD2tC5__YAHamIWlX_XTHQ+8gwW$*aol!3?;l4^L zr8T;kWwt!qQKLw%&xNyS2)v?nEHBNMA2~W%f3So)O50IYw;U)t__(oS=7@5>&rnrC zl^l(TCQ4g#DIZ@uKoKHkBSWLpdh1mz4#|8_MvV)Pvt4f=S?M(raMLKdbBsb7Pm;(= z;t*$b2SOiaFjA;>gW6&Od}pw2hAMyge&*o$;<$Ki@9DQaIiu1KM>GK#T(jDC8n#t! zDMY6sbwc#T_SQ?~!Cptrd(=Z>i++*+-hMsk{&U*w#L&lv$+&|F)FHwHoL%bLm+{GM zw|EZ@u>aT#E=n%jJS9w6cVG;%Y_@*9?O#8!r~w(UC6lde@=Q1Hc`nGYEEJO?0uzen zHV8-O@O!`|y$I*ekxyDrn%MSoT$$F z3^V^``Q)G7qDDBe%#@F^_O z@E-e{QUB358@rOAj3S@A!B6H=wD$(I%y(901HLVf3O_+GQD|K!+j!NUf@EKCWniK2 zL`K=M7>grxGsC{rCmxgrjG-L78weupg#+s}6E2)n;Xv>mtY<|-q10<{05ftr)fQ6+ z=L~wxw|BVj4un6*K`lcdDf#tV2MHR}3FS18#laY1Ua4a;BwA?< zyu9PozFAo$FSfacK2%NTbc-os2PSRm5R4CB7gm`OH5}PnusW$mm9e-Sy{C$3vR!y{ zR!~A#J$=XYt6rQizxW5tm&ot1|83sIV~c3#t~%SUX{WXo(v*^* z&;C>VAW#^1c#7Q@5cs0PV`F*s+$5%QHq(=PHJf_v+I60f*fbr*|YMHYKW_qlhW;@ zewJC}N;-9S)D^QLiGa7Z&bBnLcq`*eslK=rZ>*PBpySpi0w*&s#|`nG`RMqcX(%i( z*S^QU0m_EMEBhi@eg4QvrE~LR#FNMSs)*Edici)wKW`w{GGW}6dQeqWa ziYuQr#jiP#bKKndwmQ(7Y!4wpO<)2Dg!+-Erx#pS@q#$#H|&=f-cqusCfY2ZBe;vP zl)#YiHrE(e%B0Ia*}Nt6Zh@khfN+peFRAU|`{IW5u=n~i z)anw-wmcZnT3}_LX9)deTOlfU(=rt%ZRRcN>~IyT>7UgJ){MSCKE%A~f0I7}b(L$5 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..ec251cf2b592270798fa861cd9e2e072429d2ebc GIT binary patch literal 2592 zcmd^>do9My#?UmGkx{~B#2_SZWAYf4JdTPCX$~2g8RK~rc^#QyG9J~T2?x;` zMjDUFJ5pUk$|Dtrk|-jF5Glzce%G9{?pk-P+gkVkdp>LJz4lsrueHD5@8`SM+TdC= z75E=GhSGo9Jc8OBk^q3f0>(9*L55kYj4V1W< zzdc}-Rzp-Y1D@X#HSXjf^a0&oLZDVMI zDH2iz0%1`m(!7w$P}G(FYi?Gc3mGso(1Xflw2o2?fsXq>nRq*cEBN4}TUi1x;zcff z;`2ljnFD@t6*pZ`Cu@{~SC)~IfQaKo1VV@&b$TW~(J)p*^}JlK;YV#X8AN64;{JnN zT=UxqIp5*xByHyMqJbH1@)uojBX>w6;Lr|>=QT}@J1q|oMw>+qA$rsuT1zs?Le zDy-b<_bIrYRq^`j(ujVr89 z7Js8IZqIZHTRZCoqx0Sv*ghV@3~^wtPr;*+?>r7<7cI?~+ou&ZsN;5$3NqZvv!^r{ zncYV&Sx1}q6Tz-3EZFSOKHldRx8F;72 z$9|ov-*8H9$I$co!d~L5^YQnBvTklnfZ%}>_QO~#_xO-Se{VUB#jv$H@F?9$#t3yZ zU!bw~+1Z8LbwYeddz;12-!xw#Vq)R@zAk8qjw!4+x2>YCQ%C_#n8x#F{o%%QLZq^2!#kF-2vDRnusj8!m` zBNUYS!A=?$;o;unc^V$YGqyiJeAAmu*UIot(-4;!0H9_MU`l~c6V-rIZPc_a8g+J6 zKB=C|o?gmSR^JO+c5(|L?!y*Vr`;sEv2isyX7<_Bm1q_?B`1Gkb>%TpjwEBnxlnrh z)^e}9ZYoP}I5>iXdXKpxSVla$9d@(eLj3Res{O?S#BVsL?8^WaMNr3P^FXvfuuPFAWuMHb`P z9bGXpc;HMnm!8Sr@YTZ*lHNSx803gHYi3M)X^dMg z&2@X38*oi1^icL3RqTrlQ1`}@7icQO>Mer;7cFU2tmK)+t1N?9NX14K7JkV1;Khoi zcHwWc4CUIiBmKb|_0216-tud*IhwhOQ9^B@+suWguQOaPUYYZ1LS^^GeCXk)>v}k9 z#l0(7*R(8Wu2iIZlr!@N?CV}Qxo3`mht87;W-9tUu_uQc7oy)QmbP1rmrO7$W901A zZ?vm#=77_@R2X;|XW0DLa}v+%s--p{7 z!sf2=_-@59JJe>$2H1}NFQ;z08yius>lZ)5jqfl$B1bK#NV{T)&*hqzUZy)m9{=I< z+U|M}ZgyaN+`^Zca|711pFaHRe^=LgN$Br_PqaVi($%;v=31y((9XbcCddPbhKsu( zqTjb{HRI$03K7+rdvz$p+YJ(_7n#Wtt;yg*YpA~Mu}{Dh9tL*FX`+?DkBScXwGnW` z#X)r|62f|%vYB@P-vN+@h<(KalHtL}uUliGPW+YLE)0;CKcsHi20-Gn1zH>fI1-Bx zWxx?xMzOPX5pn0sV;`3$B~+OaYz2sX6B6mwvir-E#U#Z7U6B)V_mkNHu8uA>?V3w#JE^oMKr}GgPe9a0dFdFS(daTL6#AU#ahNv9%44w_$^_iB z@>*l_UH1>9TDhOkjqYwATz7Y$u2e9POW;2NCok{>A4yXwyIf2@HD=0(Wwl}hM15_A i^@+D+Pw&$~v{j?eZab0n?~e*r`!p@WcaQu35&r@ul`FRZ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..adc281f930d21404052a6eedcad81cea68af34ef GIT binary patch literal 106161 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

    ;}1%2qQ3Ocdnd{6uTPW-NoIBgep)72m>E<>~ME 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 ijA|!)sob>;$VVI?eVSK9M?`HmGSbQ zb|bSqre-zgWQN@(+fM9&0vdM!LQED~OeXsGq{O9xG2F4>Pc7pUhuRW?W~KyGf_JT* zaPo@MbB09+{(62;FvQaMCi$!vD9RC5(?3%Os39;v4Px={^PVa=UwL%N5FzFVxcDAKgb ze>|am0Ms|p`H!`nyd?Z633)5hT?=^FHal^|Jpm8f@~B(*%TGgYk?FkdzgmwE^OYjL znkQ@Cyj_M$_L3WYR+zfHYFQdOpqsJK|=_9fytF|~)E^*uP z0KQQ->W$$)1V^mXwJAl|PU8_);z2H0)ju?ZVj9{gm$U))2JOB!uS+FLq0%qNiC%%v zz(q#Zf3AONgV13O5;7)Jl81I~4=T~x5bX>d0cb~HmkrZuDkQ0K+|^d#Bn#5vnXhFr zG|Z2Ko?1@U%hasWYgZi8C=cHqu3oPVK=|8HVYQf;(%WL6m-bs6 zMn!MRl;*JVMila_(pp8(^WMS=LR_CwL-OiGD)Hda3I(ili zGK-hADHc=OzUS=7QeVp4iVc{jhr_4UwHat5!6Z!RD%KQ0+EHf4;o5I|yO2@4NhW@A z`4!%zYg9ryt~xXJxPJ4ts=y}q2e&10T3q0X$8nFp6m;1RVBi$v-vpaC=^=r&a8O4~ z@x>BxdeBSBA-{HR$zdxzW5_gEB@Mo?9Tp2E9DbKB@ZuzTELOB**iog;)w3J7O1|70 z^U6y%wo@8wAl}lYyJYtLfhzDCVGJcwSY50wYhtUn)(lYXRhOFvz1b~-ATs~52jK(+ON3a$mv;m@M_y=Cy0?wz&Pp+vU%AUa^I?F(gqZvJf6R z=tRHRZs^f10nSw#lQgw1O!wvzBoBXL*AB){hm6NxzubQdV~`9ePU4rc#4g!f-Qp!-T9BV39!$(`r%7ngKlU6OT3i%U zCCKhmHjoS)38MThmv7xd+1>Xx#dF~|P^_q#`~EWa*4)@rB-dT$tp1rj`jokPYp8Cq zZrW7O?@e;$>Hq+pqM@Pd8i)Cl?DMw!=$2XkdFR9-yyi@!Q=e(V_541Jq4a<0Yd z8+9_*G`rNFGRy)oe}_R=nq7OtdOTLw-QioNFYgBGY=-JrW4g->y?OVnDIorm>bL9v zx?CVRo|qaK6zr`uz;6iX$BUUrSH6TZvNlgV0T0{u5JQ$+pe|g%1^QIuqaV2f>@0Z| zID$)DSfGjzqUCtfI5A{KLwu&*B$><^299Tz^{+8_f$%HHlhixXuToVu= zGu?!v5}BZtFAvTKWNAyFImJ}_

    g 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png new file mode 100755 index 0000000000000000000000000000000000000000..7bffca2be916277343906d731b918cbdb3dc79da GIT binary patch literal 119618 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 LNkvXXu0mjfJjvls literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f07cd01e9ae28191b2e6c02df4c813c32dbb62c6 GIT binary patch literal 23588 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 Mi^}vm{qOSs03JDOwEzGB literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png new file mode 100755 index 0000000000000000000000000000000000000000..5600eee6f242605a6aefa0ed9e9a739aba8f6203 GIT binary patch literal 119590 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

    ',d=navigator.userAgent.match(/(ipad|iphone|ipod)/i);if(soundManager.html5.mp3&&soundManager.html5.mp4)return soundManager._wD("Special homepage case: Flash appears to blocked, HTML5 support for MP3/MP4 exists; trying HTML5-only mode..."),soundManager.useHTML5Audio= +!0,soundManager.preferFlash=!1,setTimeout(function(){soundManager.reboot();soundManager.onready(function(){a.innerHTML='

    Support note

    SoundManager 2 tried to start using HTML5 + Flash, but rebooted in HTML5-only mode as flash was blocked. Visualization demo features will not be shown in this mode. To enable flash, whitelist the blocked movie and reload this page.

    '+(soundManager.useAltURL?'

    Running offline? Flash may be blocked due to security restrictions; see troubleshooting for more.': +"")+"

    ";a.style.marginBottom="1.5em";a.style.display="block"})},1),!1;a.innerHTML=b;c.innerHTML='

    SoundManager 2 could not start. See below for details.

    ';if(d||soundManager.getMoviePercent())_id("flashblocker").style.display="none",d&&(_id("flash-offline").style.display="none");a.style.marginBottom="1.5em";a.style.display="block";c.style.display="inline-block"})} +function startStuff(){navigator.userAgent.match(/safari/i)&&(document.getElementsByTagName("html")[0].className="isSafari");doVersion();ie6Sucks();fixLinks();getLiveData();doAltShortcuts()}document.addEventListener?document.addEventListener("DOMContentLoaded",startStuff,!1):window.onload=startStuff; diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css new file mode 100755 index 00000000..e98629a4 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css @@ -0,0 +1,2926 @@ +body { + background:#fff; + color: #444; /* scandalous. */ + margin:0px; + padding:0px; + font:76% "helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; + /* wacky IE 6 horizontal scrollbar hack */ + _width:99.5%; + /* a little fun: transition font size with @media shift. */ + -moz-transition: font-size 0.1s; + -webkit-transition: font-size 0.1s; +} + +@media all and (min-width: 1280px) { + /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ + body { + font-size: 80%; + } +} + +@media all and (min-width: 1600px) { + /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ + body { + font-size: 90%; + } + body.home .sm2-speaker { + max-width: 226px !important; + } + /* nav vertical align tweak */ + #nav > ul > li > strong > a { + padding-bottom: 0.5em !important; + } +} + +@media all and (min-width: 1800px) { + /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ + body { + font-size: 105%; + } + body.home .sm2-speaker { + left: -2.5% !important; + margin-left: -15% !important; + margin-top: 20px !important; + } +} + +body.home { + min-width: 80em; +} + +body, +#main-wrapper, +#nav ul li strong a { + background: #fff url(../demo/_image/noise.png); +} + +body, +#main-wrapper, +#nav ul li strong a { + background: #fff url(../demo/_image/tiny_grid.png); + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaAgMAAADUJKRdAAAADFBMVEX8/Pz19fX09PT29vY9qbYoAAAAaElEQVR4Xk2MoREDMRADrzSDBQcEQj71GBw4kBbSQKp4YBBw9PsJyLxtsR2tZNfx/LyPhzX7R1Ue2SfjKlicDKBNdpBXsz790Nj8kUlo+WR47PvEPfY+gb7+kMhm5801EBsLvq/z3v8Apg8pkRmgbrsAAAAASUVORK5CYII=); + /* old IE */ + *background: #fff url(../demo/_image/tiny_grid.png); +} + +#nav ul li strong a { + background-position: 0px 5px; +} + +/* below block commented out as it crashes YUI Compressor (as of 12/2011) - moved out to make-rollups script. */ + +/* +* "Chunk" font by Meredith Mandel - http://work.meredithmandel.com/#379252/Typeface-Chunk-Five +* http://www.theleagueofmoveabletype.com/fonts/4-chunk +* Provided under the SIL Open Font License (OFL) +* http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL&_sc=1 +*/ + +/* +@font-face { + font-family: 'ChunkFiveRegular'; + src: url('_image/chunk-webfont.woff') format('woff'), + url('_image/chunk-webfont.ttf') format('truetype'), + url('_image/chunk-webfont.svg#ChunkFiveRegular') format('svg'); + font-weight: normal; + font-style: normal; +} +*/ + +@font-face { + /** + * DejaVu font license + * http://dejavu-fonts.org/wiki/index.php?title=Main_Page + */ + font-family: 'DejaVuSansMonoBook'; + src: url('../demo/_image/dejavusansmono-webfont.eot'); + src: url('../demo/_image/dejavusansmono-webfont.eot?#iefix') format('embedded-opentype'), + url('../demo/_image/dejavusansmono-webfont.woff') format('woff'), + url('../demo/_image/dejavusansmono-webfont.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +h2.special { + font-family:"ChunkFive","ChunkFiveRegular","helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; + font-weight: normal; + display: inline; +} + +h1, h2, h3, h4 { + font-size: 1em; + margin: 0px; + padding: 0px; + vertical-align: middle; + font-weight: 300; +} + +h4.new, +h4.recent, +h4.flash9 { + min-height: 24px; +} + +h1 { + font-size: 2em; + font-weight: 500; +} + +h2 { + font-size: 1.5em; +} + +h3 { + font-size: 1.17em; + font-weight: bold; + border-top: 0.25em solid #333; + border-bottom: 1px dotted #999; + padding-top: 0.25em; + padding-bottom: 0.25em; + _margin-top: 1.5em; /* fark IE6 */ +} + +body.home h3 { + border-top: 0.25em solid #444; + margin-top: 1.25em; +} + +#doc .c2 h3 { + position: relative; + background: #333; + color: #fff; + padding: 0.25em 0.75em; + border: none; + line-height: 1.4em; /* windoze alignment */ +} + +h3, +.likeh3, +.home .columnar .c2 #about-sm2 h3:first-child { /* silly override */ + margin-top:1.5em; +} + +h4 { + margin:1.5em 0px 0.5em 0px; + font-size:1.15em; + font-weight: 500; +} + +h5 { + font-size:1.2em; + font-weight: 500; + color:#333; +} + +.c2 h5 { + border-bottom:1px solid #ccc; + padding-bottom:0.25em; +} + +.sub-heading { + color: #666; + font-weight: 400; +} + +h2.special a { + /* download SM2 link */ + top: -0.65em; +} + +body.home #about-header { + /* speaker image, etc. */ + position: relative; + margin-left: 18%; + min-height: 175px; + padding-top: 1.75em; +} + +body.home #about-header .feature { + /* special alignment tweak */ + position: relative; + vertical-align: middle; + font-size: 1.2em; +} + +body.home .sm2-speaker { + position: absolute; + left: -1.5%; + top: 0px; + margin-right: 2em; + margin-bottom: 8px; + max-width: 192px; + min-width: 64px; + width: 20%; + margin-left: -20%; +} + +body.home .sm2-speaker img { + width:100%; + max-width:226px; + min-width:32px; +} + +body.home #about-sm2 h2.special, +body.home #about-sm2 h3, +body.home #about-sm2 h4 { + font-weight:500; + font-size:2em; + border-bottom:none; + padding-bottom:0px; +} + +body.home #about-sm2 h2.special { + font-size:3.5em; + color: #333; + margin-top:0.1em; +} + +body.home #about-sm2 h3 { + font-size: 2.25em; +} + +body.home #about-sm2 b { + font-weight: 500; +} + +body.home #about-sm2 strong { + font-weight: 500; + color: #333; +} + +#col3 a.button, /* "newer version available" */ +a.feature-hot, +a.feature { + display: inline-block; + -moz-transition: all 0.25s ease-in-out; + -webkit-transition: all 0.25s ease-in-out; + transition: all 0.25s ease-in-out; + text-shadow: 0px 1px 0px rgba(0,0,0,0.33); +} + +@-moz-keyframes highlight { + from { + box-shadow: 0px 0px 0px rgba(255,64,64,0); + } + to { + box-shadow: 0px 0px 16px rgba(255,64,64,0.75); + } +} + +@-webkit-keyframes highlight { + from { + box-shadow: 0px 0px 0px rgba(255,64,64,0); + } + to { + box-shadow: 0px 0px 16px rgba(255,64,64,0.75); + } +} + +#col3 a.feature { + /* "newer version available" hack */ + margin-top: 0px; +} + +a.feature-hot:hover, +a.feature:hover, +#col3 a.button:hover { + -moz-animation-duration: 0.5s; + -moz-animation-name: highlight; + -moz-animation-iteration-count: infinite; + -moz-animation-direction: alternate; + -webkit-animation-duration: 0.5s; + -webkit-animation-name: highlight; + -webkit-animation-iteration-count: infinite; + -webkit-animation-direction: alternate; +} + +body.home #about-sm2 h3 { + color:#444; + font-weight: bold; + padding-bottom: 0px; + margin-bottom: 0px; + font-weight: 300; +} + +body.home h4 { + border-bottom: 1px solid #e9e9e9; + padding-bottom: 0.33em; + margin-bottom: 0.75em; +} + +body.home #about-sm2 h4 { + font-weight: 600; + color: #777; + font-size: 1.3em; + margin-bottom: 1.25em; + margin-top: 0.15em; +} + +body.home #about-sm2 h4 b { + color: #777; +} + +body.home #about-sm2 h3 + h4 { + /* sub-headers directly under headers */ + color: #666; + font-size: 1.25em; + font-weight: 400; + margin-bottom: 2em; + border-bottom: 1px dotted #b0b0b0; + padding-bottom: 0.75em; +} + +body.home .demo-more, +body.home .demo-more-abs { + text-align:right; + font-size:85%; + margin-right:0.25em; + white-space:nowrap; +} + +body.home .demo-more-abs { + position:absolute; + right:0px; + bottom:0px; +} + +body.home #about-sm2 h4.home-shopping-network { + font-style:italic; +} + +em em { + /* special highlight */ + color:#003366; + background:#e9f3ff; + font-weight:bold; + margin-top:-0.3em; + padding:0.2em 0.25em; +} + +pre { + border-left:2px solid #f3f3f3; + padding-left:0.5em; +} + +dl pre { + border-color:#e9f3ff; +} + +dl.alt pre { + border-color:#f3f3f3; +} + +pre, +code, +pre code, +.code, +.code-block, +dt, +#soundmanager-debug, +.c3 ul li ul li { + font-family:Menlo,"DejaVu Sans Mono","DejaVuSansMonoBook",monaco,"Andale Mono","VT-100","Lucida Console","Courier New",monospace,courier,system,sans-serif; +} + +pre, +code, +.code, +dt, +#soundmanager-debug { + font-weight:normal; + line-height:auto; + color:#006699; + background:#f6fcff; +} + +.no-code-highlight pre, +.no-code-highlight code, +.no-code-highlight .code +.no-code-highlight { + background: transparent; +} + +pre, +#soundmanager-debug { + font-size: 100%; +} + +body.home p code { + font-size: 91%; +} + +pre code { + /* don't scale further down, of course... */ + font-size: 100%; +} + +pre { + line-height:1.75em; +} + +pre.specialcommentblock span span { + *line-height:1.75em; +} + +.block.small { + font-size:92%; +} + +p pre, +p.in pre { + font-size:0.97em; +} + +#soundmanager-debug { + background:#fff; + padding-left:0.75em; + border:2px solid #ddeeff; + font-size: 85%; + line-height:1.7em; +} + +body.home #soundmanager-debug { + position:fixed; + _position:absolute; /* IE <7 */ + bottom:1em; + right:1em; + height:12em; + width:auto; + overflow:auto; + padding:0px; + margin:1em 6px 6px 1em; + opacity:0.95; + color:#333; + border:1px solid #ccddee; + border-radius:3px; + background:#f3f9ff; + z-index:10; + font-size: 85%; + line-height:1.2em; +} + +body.home #soundmanager-debug div { + padding-left:0.5em; +} + +#soundmanager-debug div { + margin:0px; + padding:0.25em 0px; + font-size: 100%; + color:#333; +} + +#soundmanager-debug div { + background-color:#fff; +} + +#soundmanager-debug div.sm2-alt { + background-color: #f3f9ff; + color:#336699; +} + +#live-debug { + display:table; + *display:block; +} + +dd pre, +dd code { + background:transparent; +} + +pre code { + font-size:1em; +} + +pre { + white-space:-moz-pre-wrap; + white-space:pre-wrap; + word-wrap:break-word; /* IE */ +} + +ul.code-block em, +pre span, +code span, +dt span { + color:#339933; +} + +ul.code-block em { + font-style: normal; +} + +ul.code-block span, +pre span span, +code span span, +dt span span { + color:#667788; +} + +pre.block, +pre.block code, +div.block div.code, +ul.code-block { + position:relative; + display:table; + *display:block; + border:1px solid #ccc; + border-radius:3px; +} + +div.block, +pre.block { + background:#e9f3ff; + border-color:#eee; + padding:3px; +} + +pre.block code, +.block .code { + background:#fff; + border:1px solid #ccddee; + padding:0.5em; + font-size: 100%; + line-height:1.75em; + background-image: -webkit-linear-gradient(#fcfcfc 50%, #fff 50%); + background-image: -o-linear-gradient(#fcfcfc 50%, #fff 50%); + background-image: linear-gradient(#fcfcfc 50%, #fff 50%); + background-size: 100% 3.5em; + background-origin: content-box; +} + +#sm2-properties .code { + /* special case: no zebra striping for this one. */ + background-image: none; +} + +pre.block code { + padding: 1em; +} + +h2 code { + /* common header stuffs */ + background: none; + font-size: 93%; +} + +dl { + background:#f9fcff; + padding-bottom: 1px; + border: 1px solid #ccddee; + border-radius: 3px; + margin-top: 1em; +} + +dd { + margin:1em 0px; + padding:0px 1em; + line-height:1.75em; +} + +dt { + padding:0px; + margin:0px; + border-bottom:1px solid #ddeeff; + padding:0.5em 0.5em 0.5em 0.75em; + background:#eef6ff; + font-size:1.15em; +} + +dt.alt { + background:#f3f3f3; + border-bottom-color:#e6e6e6; +} + +dl:nth-child(2n+1), +dl.alt { + background:#fcfcfc; + padding:0px 0px 1px 0px; + border-color:#ddd; +} + +dl.tight dt.alt { + background: #fcfcfc; +} + +#smsound-methods dl a { + font-weight: normal; +} + +#smsound-methods dt:last-of-type { + border-bottom: none; +} + +h2 { + padding-top:0.5em; +} + +#top { + position:relative; + padding:1em 1em 0px 1.5em; + max-width: 95.5em; + color:#fff; + z-index:3; + margin: 0px auto; +} + +#content { /* #top #content */ + background: #222 url(../demo/_image/noise-dark.png); +} + +#top, +#top div { + *zoom:1; +} + +#top h1 { + /* special christmas light case */ + display:inline; +} + +#top h2 { + /* tagline */ + font-size:1.25em; + font-weight:300; + padding-top:2px; +} + +#top h1, +#top h2, +#version { + text-shadow: 0px 1px 0px rgba(0,0,0,0.5); +} + +#main-wrapper { + position: relative; + /* fade out the body texture */ + /* + border: 1px solid #fff; + */ + box-shadow: inset 0px 0px 16px #fff; +} + +#main { + position:relative; + padding:0px 0px 2em 0px; + padding-top:1px; + margin:0px auto; + *padding:0px 1em 2em 1em; + zoom:1; + /* + box-shadow: 0px 0px 32px rgba(0,0,0,0.05); + */ +} + +#main { + max-width: 98em; +} + +body.home #main { + box-shadow: none; + max-width: 104em; +} + +.columnar { + position:relative; + margin:0px; + padding:0px; + margin:1.9em 0.5em 0.5em 1em; /* slight left tweak */ +} + +.columnar .c1 { + position:absolute; + left:0px; + top:0px; + width:20em; + height:30px; + _position:relative; /* IE 6 hackery */ + _height:auto; +} + +#doc .columnar .c1 { + left:auto; + right:1em; + _right:auto; +} + +.columnar .c1 h2 { + position:relative; + font-size:1.2em; + padding:0.37em 0.5em; + vertical-align:middle; + background:#333; + color:#fff; + text-indent: 0.25em; +} + +.columnar .c1 p { + margin:0.5em 0px 1em 0px; + padding-left:0.5em; + padding-right:0.5em; + font-size:0.95em; + line-height:1.35em; + color:#666; +} + +.columnar .c1 p code { + color:#336699; +} + +.columnar .c2 { + position:relative; + margin-top:0px; + margin-left:22em; + margin-bottom:1.5em; +} + +.triple .columnar .c2 { + margin-right:21.25em; + min-width:20em; +} + +#doc .triple .columnar .c2 { + margin-left:21.5em; + margin-right:23em; + _margin-right:0px; /* not you, IE 6. */ +} + +#doc.special .triple .columnar .c2 { + /* override case: make c2 extra-wide. */ + margin-right: 0.75em; + max-width: 70em; +} + +#doc .triple .columnar .c1 { + margin-right:0px; + margin-left:21.25em; +} + +.columnar .c2 p:first-child { + margin-top:0.2em; +} + +.columnar .c2 > .f-block:first-child > h4 { + margin-top:0.5em; +} + +.columnar .c2 strong strong { + display:block; + padding:0.5em; + border-bottom:1px solid #999; + background:#f0f6ff; + color:#336699; +} + +.columnar .c2 p { + line-height:1.75em; + padding-top: 0.25em; + padding-bottom: 0.25em; +} + +p code, +.columnar .c2 p code { + font-size: 97%; +} + +.three .columnar { + position:relative; +} + +.three .columnar .c1 { + position:relative; + width:20em; +} + +.three .columnar .c2 { + position:relative; + margin-right:16em; +} + +.c3 { + position:absolute; + right:1em; + margin-right:16px; + top:2em; + width:16em; + margin-top:-0.5em; +} + +#doc .c3 { + right:auto; + margin-right:0px; + margin-left:16px; + left:1.25em; + z-index: 1; +} + +#nav { + position:relative; + margin-top:0.75em; + margin-left:-0.5em; +} + +ul { + /* lists inside main content area */ + line-height: 1.75em; +} + +ul li { + margin-bottom: 0.75em; +} + +#nav ul { + margin:0px; + padding:0px; + line-height:1em; + list-style-type:none; +} + +#nav ul li { + position:relative; + margin:0px; + padding:0px; + float:left; + display:inline; + padding-right:1px; +} + +#nav ul li ul { + position:absolute; + z-index:1; + display:none; + min-width:19em; + max-width:21em; + background:#3399cc; + background: -moz-linear-gradient(top, rgba(51,153,204,0.99) 0%, rgba(35,96,127,0.96) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(51,153,204,0.99)), color-stop(100%,rgba(35,96,127,0.96))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* W3C */ + text-shadow: 0px 1px 0px rgba(0,0,0,0.25); + _width:19em; + *top:2.3em; + *left:0px; +} + +#nav ul li:last-child ul { + right:1px; +} + +#nav ul li:hover ul, +#nav ul li ul:hover { + display:block; +} + +#nav ul li ul li { + float: none; + display: block; + width: 100%; +} + +#nav ul li ul li a { + display: block; + width: auto; + border: none; + padding: 0.5em 0px 0.5em 1em; + font-size: 1.1em; + line-height: 1.1em; + color: #fff; + font-weight: 300; + color:rgba(255,255,255,0.9); + border-bottom: 1px dotted rgba(0,0,0,0.2); + border-top: 1px dotted rgba(255,255,255,0.2); +} + +#nav ul li ul li:first-of-type a { + border-top: none; +} + +#nav ul li a { + display: inline-block; + padding: 0.5em 1em; + text-decoration: none; + font-weight: bold; + color: #fff; +} + +#nav ul li ul li a:hover { + background-color: #336699; + background-color: rgba(0,0,0,0.45); +} + +#nav>ul>li>a, +#nav>ul>li>strong>a { + /* top-level links */ + color:#ddd; + font-size: 1.25em; + font-weight: 300; + vertical-align: bottom; +} + +#nav ul li strong a { + color:#333; +} + +#nav > ul > li > strong > a { + /* tweak for good browsers that respect larger font size */ + padding-bottom: 8px; +} + +#nav ul li a:hover, +#nav>ul>li:hover>a { + /* top-level */ + background: #3399cc; + color:#fff; + text-shadow: 0px 1px 0px rgba(0,0,0,0.25); +} + +#version { + position:relative; + float:right; + display:inline; + margin-left:1em; + font-size:85%; + margin-bottom:0px; + bottom: -1em; + color:#999; +} + +div.clear { + clear:both; + font-size:1px; + line-height:1px; +} + +.note { + margin-top:0.5em; + font-size:0.95em; + color:#999; +} + +.note a { + color:#666; + padding:1px; + margin:-1px; +} + +.note a:hover { + color:#fff; + background:#666; +} + +.medium-note { + padding-top:1.5em; + font-size:1em; +} + +ul.standard { + line-height:1.5em; + padding-left:1.2em; + *padding-left:0px; + color:#333; + margin-top:1em; + margin-bottom:1em; + list-style-type:square; +} + +ul.standard li { + margin-bottom:0.5em; +} + +ul.standard ul { + margin-top:0.5em; + margin-bottom:1.5em; + padding-left:1.2em; +} + +.c3 ul { + list-style-type:none; +} + +.c3 ul, +.c3 ul li { + margin:0px; + padding:0px; +} + +.c3 h2 { + font-size:1.1em; + text-indent:0.4em; +} + +.c3 ul li a { + display: block; + text-decoration:none; +} + +.c3 ul li, +.c3 ul li a, +.c3 ul li a:hover, +.c3 ul li a:focus { + color:#555; + _color:#555; + outline:none; +} + +.c3 ul li.active { + box-shadow: 0 0 6px #003366 inset; + border-radius: 1px; +} + +.c3 ul li.active a { + border-radius: 2px; + text-shadow: 0px 1px 0px rgba(0,0,0,0.25); +} + +.c3 ul li.active, +.c3 ul li.active a, +.c3 ul li ul li:hover, +.c3 ul li ul li:hover a { + color: #fff; +} + +.c3 ul li.active a:hover { + _color:#fff; +} + +.c3 .box { + margin-top:6px; +} + +.wedge, +.c3 h2 { + position:relative; + background:#333; + color:#fff; + margin:0px; + padding:0px; + height:2.101em; + line-height:1.65em; +} + +.c3 h2 { + height:2em; + line-height:2em; +} + +.c3 h2, +#doc .c2 h3 { + text-shadow: 0px 1px 0px #000; +} + +.wedge { + background-color:#3399cc; +} + +.wedge-dark { + background:#333; +} + +.wedge .l, +.wedge .r { + border-top:1.75em solid #333; +} + +.c3 h2 .l, +.c3 h2 .r { + border-top: 2em solid #333; + border-top: 2.1em solid #333\9; /* IE 8 */ +} + +.wedge .l, +.c3 h2 .l, +.wedge .r, +.wedge-dark .r, +.c3 h2 .r { + background:transparent url(../demo/_image/wedge.png) no-repeat; + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEABAMAAACJ12OUAAAAGFBMVEUREREAZpkYGBgAZpkiIiIAZpkREREAZpkArR2CAAAABnRSTlMAAOvrEhJBIv9yAAAC0UlEQVR42u3ZuW0cQRCF4cIPhrG2MhDkLZgDM5ChBGQoKBlMgdgElAQ9gVACNMTZ2WOO7rraI2rcna33cdjTTTzyQ7++fzFuQPTrdDBuMAa8H04vQwNOL++HkQHTtw0CBmAekh0wf1cnYAEsAibAIGACDAI2QCdgA3QCDoBKwAFQCXgAGgEPQCPgAigEXACFgA/QJ+AD9Ak4AV0CTkCXgBfQI+C/tT0W952dubgBncH4Ae3J+AHt0QQAzdkEAM3hRACt6UQArfGEAI35hACNAGKAfQIxwD6CIGCXQRCwCyEK2KYQBWxjCAM2OYQBmyDigHUSccA6igRglUUCsAojA1imkQEs40gBFnmkAItAcoB7IjnAPZIk4JZJEnALJQu4ppIFXGNJAy65pAGXYPKAOZk8YI5mAHDOZgBwJjACmAiMACYCT7/U6+c3/fOv1R9Uf1D9QfUH1R9Uf1D9QfUH1R9Uf1D9QfUH1R9Uf1D9wefvD/4NXhwfRwQPrzy8jgw4PiIjhI90ZITwEY4MEKZsZIAwRSN5wjkZyRPOwUiaMOciacIci2QJl1QkS7iEIknCNRNJEq6RSI5wS0RyhFsgkiLc85AU4R6HZAiLNCRDWIQhCcIyC0kQllFInLBKQuKEVRASJqxzkDBhHYNECZsUJErYhCBBwjYDCRK2EUiMsEtAYoRdABIi7OcjIcJ+PBIhNKYjEUJjOBIgtGYjAUJrNOInNCcjfkJzMO47O3Px39oeixvb+cFwP67Oo8X7vHpPFu9vrPe7xblmuqsL56rtrm98y7a/vPG9OP0XDNerq7ziuDYPZZPBs3toewye/Uvb5XDsoOo+i2MPV3d67E1c3+ixjxH9qME8yIzDDvMoNY5brLPUOm2xTnPrvLf++3+0/uLgz2/1ev6rf/5W/UH1B9UfVH9Q/UH1B9UfVH9Q/UH1B9UfVH9Q/UH1B9UffPr+4D+tsZObsTO2qgAAAABJRU5ErkJggg==); + *background-image:url(../demo/_image/wedge.png); +} + +.wedge .l, +.c3 h2 .l { + background-position: -64px 0px; + position:absolute; + left:0px; + top:0px; + width:16px; + height:100%; + margin-left:-16px; +} + +.wedge .r, +.wedge-dark .r, +.c3 h2 .r { + background-position: -48px 0px; + position:absolute; + right:0px; + top:0px; + width:16px; + height:100%; + margin-right:-16px; +} + +.wedge .l, +.wedge .r { + border-color:#3399cc; +} + +.wedge .l { + background-position:-64px -64px; + border-top: 2em solid #3399cc +} + +.wedge .r { + margin-top:-15px; + border-top:none; + height:16px; + border-bottom:2em solid #3399cc; + background-position:0px -192px; +} + +.wedge-dark .l, +.wedge-dark .r { + border-color:#333; +} + +.wedge-dark .l { + background-position:-64px 0px; +} + +.wedge-dark .r { + background-position:0px -128px; +} + +.c3 h2 .r.up { + margin-top:-16px; + border-top:none; + height:16px; + border-bottom:1.66em solid #333; + background-position:0px -128px; +} + +.c3 h2 .l.flat, +.wedge .l.flat, +.c3 h2 .r.flat, +.wedge .r.flat { + background-image:none; +} + +.c3 ul { + margin:0px; + padding:0px; + list-style-type:none; +} + +.c3 ul li { + border:1px solid #f3f3f3; + border-top:none; + border-bottom:none; +} + +.c3 ul ul li { + border:none; +} + +.c3 ul li { + margin:0px; + padding:0px; +} + +.c3 ul li ul li { + background-color: #fcfcfc; + background-color: rgba(255,255,255,0.5); + font-size: 97%; + line-height:2.4em; + text-indent:0.5em; + padding: 0px 0.25em; + cursor:hand; + border-bottom: 1px dotted #eee; +} + +.c3 ul li ul li:hover { + background-color:#999; + cursor:pointer; + cursor:hand; +} + +.c3 ul li ul li.active { + background-color:#3399cc; + color:#fff; +} + +.c3 h3 { + position: relative; + margin: 0px; + padding: 0px; + height: auto; + min-height: 25px; + background: #3399cc; + border: none; + color: #fff; + text-indent: 0.5em; + font-size: 1em; + line-height: 2em; + text-shadow: 0px 1px 0px rgba(0,0,0,0.25); +} + +.c3 h4 { + font-size:1em; + margin:0px; + padding:0.4em 0.2em 0.4em 0.75em; + vertical-align:middle; + color:#333; + background-color: #f3f3f3; + background-color: rgba(0,0,0,0.05); + border-top: 1px dotted #d6d6d6; + border-bottom: 1px dashed #e9e9e9; + text-shadow: 0px 1px 0px #fff; +} + +.c3 h4:first-of-type { + border-top-color: transparent; +} + +#get-satisfaction h2 a { + color:#fff; +} + +#get-satisfaction a { + color:#555; +} + +#get-satisfaction a:hover { + color:#fff; +} + +.c3 h2 a { + color:#fff; +} + +.c3 h2 a:hover { + color:#fff; + text-decoration:underline; +} + +.flash9 { + background-image:url(../demo/_image/flash9.png); + background-repeat:no-repeat; + background-position:bottom right; + _background-image:none; +} + +li.flash9 { + background-position:bottom right; +} + +.flash9:hover, +.flash9.active { + background-image:url(../demo/_image/flash9-dark.png); + _background-image:none; +} + +.new { + background-image:url(../demo/_image/new.png); + background-repeat:no-repeat; + background-position:bottom right; + _background-image:none; +} + +.recent { + background-image:url(../demo/_image/new-bw.png); + background-repeat:no-repeat; + background-position:bottom right; + _background-image:none; +} + +.new:hover, +.new.active, +.recent:hover, +.recent.active { + background-image:url(../demo/_image/new-dark.png); + background-repeat:no-repeat; + background-position:bottom right; + _background-image:none; +} + +.deprecated { + font-style: italic; + color: #333 !important; +} + +span.nevermind, +.removed { + text-decoration:line-through; + opacity:0.33; +} + +strong.removed { + font-weight: normal; + opacity:0.5; +} + +.padded { + padding:0.5em; +} + +dd.deprecation-note { + color: #993333; + background-color: #fff6f6; +} + +.c3 p { + font-size:0.9em; + padding-left:0.75em; + padding-right:0.5em; +} + +.c1 pre code { + margin-top:0px; + color:#336699; + margin-left:0px; +} + +.c1 pre { + margin-top:0px; + padding-top:0px; + margin-left:0.5em; +} + +#reset-filter { + position:relative; + font-family:"Helvetica Neue","Helvetica",helvetica,arial,verdana,sans-serif; + font-weight:300; + font-size:2.5em; +} + +.c2 .option { + font-size:85%; + float:right; + display:inline; + margin-left:1em; + margin-right:0.5em; + margin-top:3px; + line-height:1em; + white-space:nowrap; +} + +.c2 .option a { + padding:0.1em 0.35em 0.1em 0.35em; + color:#3399cc; +} + +#filter-box { + position:relative; + display:none; +} + +#get-satisfaction { + position:relative; +} + +#support-wrapper { + position: relative; + background: #fff; + border: 1px solid rgba(0,0,0,0.03); + box-shadow: 0px 0px 1px rgba(0,0,0,0.075); +} + +#gsfn_content { + position: relative; + padding:0.5em 0px 0.5em 0px; +} + +#gsfn_content ul { + position: relative; + /* initially, hide and then expand. */ + overflow: hidden; + height: 0px; + margin: 0px; + /* smooth height transitions, why not */ + -webkit-transition: height 0.5s ease-in-out; + -moz-transition: height 0.5s ease-in-out; + transition: height 0.5s ease-in-out; +} + +#gsfn_list_widget.loaded ul { + /* JS callback assigns this class when load is complete */ +} + +#gsfn_content ul li { + border:none; +} + +div#gsfn_list_widget img { + border: none; +} + +div#gsfn_list_widget a { + text-decoration:none; +} + +div#gsfn_list_widget a.widget_title { + display: block; + margin-bottom: 10px; + font-weight: bold; +} + +div#gsfn_list_widget .powered_by { + font-family:verdana,arial; + margin:-0.25em 1em 0px 1em; + padding:0.25em 0px 0.5em 0px; + border-top: 1px dotted #ddd; + font-size:75%; +} + +body.home div#gsfn_list_widget .powered_by { + padding-bottom: 0px; +} + +div#gsfn_list_widget .powered_by a { + font-style: italic; + color: #999; +} + +div#gsfn_list_widget .powered_by a:hover { + color:#333; +} + +div#gsfn_list_widget div#gsfn_content { + font-size:0.88em; + padding-left:0.5em; + padding-right:0.5em; +} + +div#gsfn_list_widget div#gsfn_content li { + text-align:left; + position: relative; + clear:right; + *zoom:1; +} + +div#gsfn_list_widget div#gsfn_content li:hover, +div#gsfn_list_widget div#gsfn_content li:hover a { + background:#3399cc; + color:#fff; +} + +div#gsfn_list_widget div#gsfn_content a.gsfn_link { + display:block; + line-height:1.2em; + padding:5px 0px 5px 5px; +} + +div#gsfn_list_widget div#gsfn_content a.gsfn_link:hover { + _color:#fff; + _background-color:#3399cc; +} + +div#gsfn_list_widget div#gsfn_content span.time { + font-size: 85%; + color:#999; + padding-left:3px; + padding-right:3px; + text-align:right; + float:right; + display:inline; + margin-top:1px; +} + +div#gsfn_list_widget div#gsfn_content li:hover span.time { + color:#fff; +} + +div#gsfn_list_widget div#gsfn_content p.gsfn_summary { + margin-top: 2px; + position:relative; + z-index:2; +} + +.tight { + margin-top:0px; +} + +.compact { + margin-bottom:0.25em !important; +} + +.smaller { + margin-top: 0px !important; + margin-bottom: 0.25em !important; +} + +.c2 a, +a.cta { + margin-top:-0.3em; + padding:0.2em 0.25em; + margin-left: -0.25em; + margin-right: -0.25em; + *margin: 0px; + *padding: 0px 2px; + *margin: 0px -2px 0px -2px; + text-decoration:none; + color:#3399cc; + border-radius:0.25em; + zoom:1; +} + +body.home .c2 a, +body.home a.cta { + text-shadow: 0px 1px 0px #fff; +} + +body.home .c2 a:hover, +body.home a.cta:hover { + text-shadow: none; +} + +pre code a, +.c2 pre code a { + color: #3399cc; + font-weight: 400; + text-decoration: none; + text-shadow: none; +} + +pre code a:hover, +.c2 pre code a:hover { + background-color: #3399cc; + color: #fff; + font-weight: 400; +} + +/* redefine for simple mp3 button demo */ +.c2 a.sm2_button { + border-radius:6px; +} + +.c2 a.sm2_button.type-2 { + border-radius:9px; +} + +.c2 a { + color:#3399cc; + font-weight:500; + text-decoration:none; +} + +.c2 a.cta { + text-decoration:none; +} + +a.cta span { + font-size:1.5em; + line-height:1em; +} + +a.cta:hover, +.c2 a:hover, +#sm2-options a:hover { + position: relative; + z-index: 1; + background-color:#3399cc; + border-color:#3399cc; + color:#fff; + text-decoration:none; +} + +.c2 a.sm2_button:hover { + /* arg. not specific enough, redefine here. */ + background-color:#cc3333; +} + +dt a:hover span { + color: #fff; +} + +a.cta-more { + color:#ddeeff; + font-size:0.8em; + position:absolute; + right:0px; + margin:0px; + padding:1px; + bottom:0.9em; + line-height:1em; +} + +a.cta-more:hover { + background:#fff; + color:#3399cc; +} + +div.html5support { + clear: both; + padding-top: 2em; +} + +div.html5support span { + padding:0px 5px; + display:inline-block; + text-align:center; + font-weight:bold; + background:#ccc; + color:#fff; + border-radius:5px; + margin-left:0.5em; + margin-bottom:0.25em; +} + +div.html5support em { + font-weight:bold; +} + +div.html5support span.true { + background:#669966; +} + +div.html5support span.partial { + background:#993333; +} + +div.html5support em.partial { + color:#993333; +} + +div.html5support em.true { + color:#669966; +} + +#nav ul li ul { + /* eh, why not. */ + box-shadow:2px 2px 2px rgba(51,153,204,0.2); +} + +.newer { + vertical-align: middle; + margin-top: 1em; + margin-bottom: 1em; +} + +.newer a, +a.feature, +.feature-hot { + position:relative; + display:inline-block; + background:#3399ff; + font-size: 1.1em; + line-height: 1.75em; + padding: 0px 0.5em; + margin: 0px 0.125em; + color:#fff; + font-weight:bold; + border:3px solid #cce6ff; + border:3px solid rgba(255,255,255,0.66); + border-radius:8px; + text-decoration:none; +} + +a.feature { + margin-left:0px; +} + +.newer a, +.feature-hot { + background:#ff0000; + border-color:#ff6666; + color:#fff; +} + +.newer a:hover, +.c2 .feature-hot:hover { + background:#990000; + border-color:#cc0000; +} + +a.feature:focus, +a.feature:hover { + background:#ff0000; + border-color:#ff6666; + color:#fff; +} +# +a.warning, +span.warning { + font-weight:bold; +} + +a.warning, +span.warning, +a.warning code, +span.warning code { + color:#993300; +} + +a.warning:hover { + color:#fff; + background:#993300; +} + +.newer p { + margin:0px; + padding:0px; +} + +.scratched-out { + display: inline-block; + text-decoration:line-through; + color:#999; + font-size:0.9em; + margin-top:-0.75em; + -webkit-transform:rotate(-15deg); + -moz-transform:rotate(-15deg); + transform:rotate(-15deg); +} + +div.inthewild { + position: relative; + margin-top:1em; +} + +ul.inthewild { + display: inline; + margin: 0px auto; + list-style-type: none; +} + +ul.inthewild, +ul.inthewild li { + position: relative; + margin: 0px; + padding: 0px; +} + +ul.inthewild { + margin-bottom: 2em; +} + +ul.inthewild li { + display: inline-block; + *float: left; + *display: inline; + width: 128px; + height: 64px; + vertical-align: middle; + text-align: center; + margin: 2px 0px; + background-color: #fcfcfc; + background-color: rgba(255,255,255,0.5); + border-radius: 2px; + border: 1px solid #eee; + border-color: rgba(0,0,0,0.05) +} + +ul.inthewild a, +ul.inthewild a img { + border:none; + vertical-align:middle; +} + +ul.inthewild a { + position: absolute; + left: 50%; + top: 50%; + overflow:hidden; + margin: 0px; + padding: 0px; + border-radius: 0px; + background: transparent url(../demo/_image/logo-sprite.png) no-repeat 0px 0px; + line-height: 96px; + vertical-align: middle; +} + +ul.inthewild a:hover { + background-color: transparent; +} + +ul.inthewild a span { + position:absolute; + text-indent:-9999em; +} + +#eight-tracks { + background-position: 0 0; + width: 64px; + height: 20px; + margin: -10px 0px 0px -32px; +} + +#audiogalaxy { + width: 100px; + height: 22px; + background-position: 0 -37px; + margin: -11px 0px 0px -50px; +} + +#discogs { + background-position: 0 -72px; + width: 55px; + height: 20px; + margin: -10px 0px 0px -27px; +} + +#hypem { + background-position: 0 -111px; + width: 80px; + height: 38px; + margin: -19px 0px 0px -40px; +} + +#lastfm { + background-position: 0 -176px; + width: 80px; + height: 28px; + margin: -14px 0px 0px -40px; +} + +#pitchfork { + background-position: 0 -688px; + width: 100px; + height: 20px; + margin: -10px 0px 0px -50px; +} + +#nyancat { + background-position: 0 -312px; + width: 64px; + height: 40px; + margin: -20px 0px 0px -32px; +} + +#soundcloud { + background-position: 0 -424px; + width: 83px; + height: 58px; + margin: -29px 0px 0px -42px; +} + +#turntable-dot-fm { + background-position: 0 -252px; + width: 100px; + height: 20px; + margin: -10px 0px 0px -50px; +} + +#baroque-me { + background-position: 0 -541px; + width: 88px; + height: 47px; + margin: -23px 0px 0px -42px; +} + +#freesound { + background-position: 0 -635px; + width: 100px; + height: 27px; + margin: -15px 0px 0px -50px; +} + +div.inthewild.active li:hover { + background-color: rgba(255,255,255,0.9); + border-color: #ccc; + box-shadow: 0px 0px 3px rgba(0,0,0,0.075); +} + +/* homepage-specific demo shiz */ + +.sidenote { + font-size:85%; + opacity:0.75; +} + +ul.playlist { + font-size:85%; +} + +ul.playlist li { + margin-bottom:0.2em; +} + +ul.playlist li a { + font-size:1em; + color:#333; +} + +ul.playlist li a, +ul.playlist li a:hover { + background:transparent; + border-radius:0px; + line-height:1em; +} + +ul.playlist li .timing { + margin-right: 0.1em; + font-size: 50%; + top: 0.5em; +} + +ul.playlist.use-peak li .peak { + /* overrides */ + height:0.61em; + margin-top:-5px; + width:0.92em; +} + +html.isSafari ul.playlist.use-peak li .peak { + margin-top:-4px; /* dumb tweak */ +} + +ul.playlist.use-peak li .timing { + right:4em; +} + +ul.playlist.use-peak li .peak-box { + height:0.66em; +} + +ul.playlist li .peak .l { + margin-right:0px; +} + +ul.playlist li .peak .l, +ul.playlist li .peak .r { + width:6px; +} + +ul.playlist li .peak .r { + left:9px; +} + +a.not-supported { + /* give user a hint that the format doesn't work */ + text-decoration:line-through; + color:#666; + opacity:0.25; +} + +ul.graphic li { + line-height:1.5em; +} + +ul.graphic li a, +ul.graphic li a.sm2_link { + min-width:17.75em; + width:auto; +} + +ul.graphic li a, +ul.graphic li a.sm2_link { + background-color:#ddd; + border-color:#ddd; + color:#333; + vertical-align:middle; +} + +ul.graphic li a { + background:#ddd url(../demo/play-mp3-links/image/icon_play.png) no-repeat 3px 50%; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA6ElEQVR42q2UvQqDMBRGC47dAj6rgygIDg5OfQlHF30GX0JFURddnEQU+eoNLaSJFRUvnPzA/c4QkjwA3AIf1tJWnitsRT8I+2Q0UfTM8/yFk0UZyooiNk0ThmE4BWUoK4r0cRxxBcr+iMh+AVW0LAtkoihCURS0/ocqwkaZpgnbtrmwrmts1DGR67owDIPjeR7iOEbXdfuisiwh4zgOSb5wcZIkYo8qapoGMpZlkYALwzBElmWoqkrsUUVt20LG930EQUAHTvstVFHf95BJ05TmPVQR3dQLKCI2zzOuQNnbHu3t38gtvAF1L6rpAc8MDwAAAABJRU5ErkJggg==); + *background-image: url(../demo/play-mp3-links/image/icon_play.png); + _background-image:url(../demo/play-mp3-links/image/icon_play.gif); +} + +ul.graphic li a:hover, +ul.graphic li a.sm2_paused:hover, +ul.graphic li a.sm2_link:hover, +ul.graphic li a.sm2_playing, +ul.graphic li a.sm2_playing:hover { + background-color:#336699; + border-color:#336699; + color:#fff; +} + +ul.graphic li a.sm2_link { + /* Doesn't work on this page. */ + -webkit-transition-property: none; + -webkit-transition: none; +} + +.c2 ul.playlist li a { + margin:0px; + padding:0px; + letter-spacing: -0.02em; +} + +ul.inline-playlist { + min-height:49px; + min-width:512px; + margin-top:4em; +} + +ul.inline-playlist li { + float:left; + display:inline; + width:45%; + margin-right:0.25%; +} + +body.home .sm2-inline-list .ui360-vis { + margin-right:0px; +} + +body.home #special-demo-left .ui360 { + margin-right: 4px; + /* homepage-specific demo UI: a slight inner shadow + BG color + border */ + background-color: rgba(0,0,0,0.025); + box-shadow: inset 0px 0px 8px rgba(0,0,0,0.075); + /* a little radii, modern browsers only */ + border: 1px solid rgba(0,0,0,0.075); + border-radius: 32px; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + /* specifics */ + -moz-transition-property: background, border, box-shadow; + -webkit-transition-property: background, border, box-shadow; + transition-property: background, border, box-shadow; +} + +body.home #special-demo-left .ui360:hover { + background-color: rgba(0,0,0,0.045); + border-color: rgba(0,0,0,0.15); + box-shadow: inset 0px 0px 5px rgba(0,0,0,0.15); +} + +body.home #special-demo-left .ui360:last-child { + margin-right: 0px; +} + +body.home .columnar .c2 p { + font-size: 1.1em; + line-height:1.6em; + color:#333; +} + +body.home .c2 ul.playlist li a { + _color:#000; /* stupid IE */ +} + +body.home .c2 ul.playlist li.sm2_paused a, +body.home .c2 ul.playlist li.sm2_playing a { + _color:#fff; /* argh */ +} + +body.home .c2 ul.standard { + _margin-left:1.5em; +} + +body.home .ie6sucks { + _background: transparent !important; + _display: none !important; +} + +body.home .ie7sucks { + *display: none !important; +} + +/* Flash positioning and flashblock / clicktoflash handling */ + +/* special-case for the SM2 homepage only */ + +body.home #sm2-container { + position: fixed; + bottom: 0px; + left: 0px; + width: 48px; + height: 48px; + /* IE 6 hax, unlikely to have flashblock anyway... */ + _margin:-8px 0px 0px 0px; +} + +@-moz-keyframes flashblock { + from { + border-color: #ff3333; + } + + to { + border-color: #fff; + } +} + +@-webkit-keyframes flashblock { + from { + border-color: #ff3333; + } + + to { + border-color: #fff; + } +} + +body.home #sm2-container.swf_timedout { + /* blocked state */ + border:1px solid #ff3333; + -moz-animation-duration: 1s; + -moz-animation-name: flashblock; + -moz-animation-iteration-count: 5; + -webkit-animation-duration: 1s; + -webkit-animation-name: flashblock; + -webkit-animation-iteration-count: 5; + width:48px; + height:48px; +} + +body.home #sm2-container.swf_unblocked { + /* unblocked state */ +} + +body.home #sm2-container.swf_unblocked, +body.home #sm2-container.swf_loaded { + top:auto; + left:0px; + bottom:0px; + margin:0px; + width: 6px; + height: 6px; +} + +#sm2-support-warning { + display:none; + border:1px solid #ff9999; + padding:0.5em; + margin-top:1.5em; + font-weight:bold; +} + +#sm2-support { + display:none; + font-size:0.9em !important; + margin-top: 1.5em; +} + +#sm2-support-warning, +#sm2-support { + background:#fff6f0; + border:1px solid #ff3333; +} + +body.home #about-sm2 #sm2-support h3 { + border-color:#ff9999; + margin-top:0.25em; +} + +body.home #special-demo-left { + min-height:70px; + position:relative; + float:left; + display:inline; + margin-right:14px; + padding-right:0.9em; + border-right:1px dotted #e0e0e0; + *border-right:none; + _width:210px; +} + +body.home #special-demo-right { + min-height:51px; + position:relative; + float:left; + display:inline; + margin-top:18px; + /* + padding-right:15px; + */ + *width: 90px; + _display: none; +} + +body.home #inline-playlist { + clear:both; + float:right; + display:inline; + width:256px; + min-height:49px; + margin-top:2em; + padding-bottom:0px; +} + +#demo-box { + position:relative; + float:right; + display:inline; + margin-top:-4px; + background:#fff; + padding-left:3em; + width:256px; + z-index: 1; +} + +hr { + visibility:hidden; + margin:0px; + padding:0px; +} + +.demo-block { + position:relative; + background:#f9f9f9; + border:1px solid #e6e6e6; + padding:4px; + padding-top:0.5em; + margin-top:-0.55em; + border-top:none; +} + +#demo-header { + color:#333; + background:#f9f9f9; + border:1px solid #e6e6e6; + border-bottom:0px; + margin-bottom:0px; + padding:0.5em; +} + +#demos h3 { + padding-bottom:0px; + text-indent:0.5em; + font-weight:normal; +} + +#demos h3 a { + font-weight:normal; +} + +#revision-list > li { + margin-top:3em; + margin-bottom:2em; +} + +#revision-list > li:first-child { + margin-top:2em; +} + +/* seasonal decorations */ + +body.home.has-lights { + /* prevent ugly scrollbars from explosion fragments */ + overflow-x: hidden; +} + +body.home #lights { + position:absolute; + border-top:1px solid #006600; + left:0px; + top:0px; + width:100%; + z-index:4; + display:none; +} + +.xlsf-light { + position:absolute; + margin-top:-1px; +} + +body.fast .xlsf-light { + opacity:0.9; +} + +.xlsf-light { + opacity:0.9; +} + +#explosion-box { + position: absolute; + left: 0px; + top: 0px; + width: 100%; + z-index: 10; +} + +.xlsf-fragment { + position:absolute; + background:transparent url(christmas-lights/image/bulbs-50x50-fragments.png) no-repeat 0px 0px; + width:50px; + height:50px; +} + +.xlsf-fragment-box { + position:absolute; + left:0px; + top:0px; + width:50px; + height:50px; + *width:100%; + *height:100%; + display:none; +} + +.figure { + display:inline; + display:inline-block; + border:1px solid #ddeeff; + padding:0.5em; + margin:0.5em 0px 0.5em 0px; +} + +.figure .code span { + padding:0.25em; + border:1px solid #f0f9ff; + background:#fff; +} + +.figure .code span.mid { + color:#666; +} + +#sm2-container.flash_debug { + /* flash movie, when soundManager.debugFlash = true */ + position:relative; + width:auto; + height:300px; + width:100%; + background:#f6f6f6; + border:1px solid #ccc; +} + +#sm2-container.flash_debug object, +#sm2-container.flash_debug embed { + width:100%; + height:100%; + left:auto; + top:auto; +} + +ul.file-structure ul { + padding-left:1.5em; +} + +ul.file-structure li { + list-style-type:square; + margin-top:0.25em; + margin-left:0px; +} + +ul.file-structure li span { + color:#999; +} + +#sm2-filesizes { + border:1px solid #ddd; + background:#fff; +} + +#sm2-filesizes tr:nth-child(2n+1) { + background:#f9f9f9; +} + +#sm2-filesizes th { + background:#eee; + font-weight:bold; + text-align:left; +} + +#sm2-filesizes th { + padding:4px 6px; +} + +#sm2-filesizes td { + padding:0px 6px; + border:1px solid #eee; +} + +#sm2-filesizes p { + margin-top:0.5em; + margin-bottom:0px; +} + +#sm2-filesizes pre { + border-left:none; + margin-top:0.5em; + margin-bottom:0.5em; +} + +#sm2-filesizes .nw { + white-space:nowrap; +} + +#sm2-filesizes .booyaa { + /* in the words of Paris Hilton, "that's hot." (in the nerdy sense, I suppose.) */ + background:#fff9f9; + color:#990000; +} + +#history li.in > p.compact { + font-weight:bold; +} + +#sm2-options { + /* -html5, -debug etc. */ + position: relative; + clear: both; + color: #666; + margin: 0.33em 0.75em 0px 0.75em; + border-top: 1px dotted #ddd; +} + +#sm2-options .options-divider { + font-size: 85%; + color: #ccc; +} + +#sm2-options p { + font-size: 85%; + padding-left: 0px; + padding-bottom: 0px; + margin-bottom: 0.75em; +} + +#sm2-options p:first-child { + margin-top: 0.75em; +} + +#sm2-options a { + color: #3399cc; + text-decoration: none; + padding: 1px; + margin-top: -2px 0px 0px -2px; +} + +#without-html5 { + display: none; +} + +body.home #about-sm2 #inline-demo-header { + margin-top: 1.5em; + border-bottom: 1px solid #eee; + padding-bottom: 0.5em; +} + +body.home #about-sm2 #inline-demo-header, +body.home #about-sm2 .home-shopping-network { + display: block; +} + +#about-sm2 a img { + border: none; +} + +/* alternate code + comment blocks */ + +ul.code-block { + list-style-type: none; + position: relative; + padding: 3px; + font-size: 85%; +} + +ul.code-block, +ul.code-block li { + position: relative; + margin: 0px; + padding: 0px; + line-height: 1.5em; +} + +ul.code-block li { + padding: 0.75em 0.5em; +} + +ul.code-block li:nth-child(2n+1) { + background-color: #fcfcfc; +} + +ul.code-block li:last-child { + padding-bottom: 0px; +} + +ul.code-block li div { + position: absolute; + left: 0.5em; + top: 0.75em; /* note: match LI padding */ + width: 22em; /* left gutter */ + z-index: 2; /* sit on top */ +} + +ul.code-block li span { + position: relative; + display: block; + padding-left: 22.5em; /* room for left gutter */ + text-indent: -2em; +} + +/* special min-width case */ +#soundmanager-properties ul.code-block { + min-width: 43em; +} + +/** +* November 2011 homepage redesign +*/ + +div.oneup, +div.twoup, +div.threeup { + position: relative; + clear: both; + padding: 2em 1em 2.5em 1em; + *zoom:1; /* god damn shite IE */ +} + +div.oneup, +div.twoup, +div.threeup, +#about-sm2 h2.special, +#about-sm2 p { + text-shadow: 0px 1px 0px #fff; /* eh, why not. */ +} + +div.oneup .column { + position: relative; + width: 100%; +} + +div.twoup .column, +div.threeup .column { + position: relative; + float: left; + display: inline; + width: 33.3%; + _width: 32%; /* IE 6 */ +} + +div.twoup .column { + width: 50%; + _width: 49%; /* IE 6 can die */ +} + +div.oneup .column, +div.twoup .column, +div.threeup .column { + padding-bottom: 0.5em; +} + +div.oneup .column-wrapper, +div.twoup .column-wrapper, +div.threeup .column-wrapper { +/* + border-top: 1px dotted #d0d0d0; +*/ + margin: 0px 2.5em; +} + +div.oneup .column-wrapper.spaced-out, +div.twoup .column-wrapper.spaced-out, +div.threeup .column-wrapper.spaced-out { + /* spacing for columns without an <h3> header */ + padding-top: 6.25em; +} + +div.threeup.first { + padding-top: 0.75em; +} + +div.threeup.first .column-wrapper { + border-top: none; +} + +body.home #main .oneup p, +body.home #main .twoup p, +body.home #main .threeup p { + font-size: 1.1em; + line-height: 1.5em; + margin-bottom: 1.5em; +} + +body.home #main p.sidenote { + /* disclaimer */ + font-size: 92%; + color: #666; +} + +body.home h2 { + margin-top: 0px; +} + +body.home div.c3 { + /* pop discussion/support on top of margin */ + position: relative; + float: right; + display: inline; + margin-left: 30px; /* a little extra spacing, so the <h2> doesn't overlap */ + margin-top: -6px; + z-index: 2; + margin-bottom: 2.5em; +} + +body.home #inline-playlist { + float: none; + display: block; + width: auto; +} + +body.home .sm2-inline-list .ui360-vis { + /* center */ + margin: 0px auto; +} + +body.home ul.playlist { + font-size: 85%; +} + +body.home ul.playlist li { + font-size: 1.75em; + letter-spacing: -0.02em; +} + +body.home ul.playlist .sidenote { + font-size: 85%; +} + +body.home .demo-more, +body.home .demo-more-abs { + font-size: 95%; +} + +body.home ul.graphic { + margin-top: 1em; +} + +body.home ul.graphic { + position: relative; +} + +body.home ul.graphic li { + float: left; + display: inline; + width: 50%; + margin-bottom: 0px; +} + +body.home ul.graphic li a, +body.home ul.graphic li a.sm2_link { + display: block; + width: auto; + min-width: 8em; + margin-right: 0.5em; + margin-bottom: 0.5em; +} + +body.home ul li a:hover, +body.home ul.graphic a.sm2_playing, +body.home #inline-playlist li.sm2_paused a, +body.home #inline-playlist li.sm2_playing a, +body.home ul.playlist li div.timing, +body.home .feature-hot, +body.home #html5-support-li span { + /* take out shadow on most demo links */ + text-shadow: none; +} + +body.home .feature-hot { + /* hack: font size fix */ + font-size: 13px; +} + +body.home ul.graphic li a, +ul.playlist li a { + /* "..." on titles */ + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + /* crap IE */ + *overflow: auto; + *white-space: wrap; +} + +body.home ul.playlist li a, +body.home ul.playlist li a:hover { + line-height: 1.2em; +} + +body.home .demo-more a span, +body.home .demo-more-abs a span { + font-size: 1.5em; + line-height: 1em; +} + +body.home #sm2-visualization { + clear: both; + margin-top: 2em; +} + +body.home #sm2-visualization .ui360 { + float: none; + display: block; +} + +body.home #sm2-visualization .ui360 .sm2-360ui { + border-color: rgba(0,0,0,0.05); + background-color: rgba(255,255,255,0.5); + box-shadow: inset 0px 0px 32px rgba(0,0,0,0.075); +} + +body.home #sm2-visualization .ui360 canvas, +body.home #sm2-visualization .ui360 .sm2-360ui, +body.home #sm2-visualization .ui360 a { + border-radius: 128px; +} + +body.home #sm2-visualization .ui360 a { + /* put title underneath button */ + line-height: 340px; + *line-height: 480px; /* not crap IE, though. */ + line-height: 480px\9; /* nor IE 8. */ + color: #666 !important; /* hax */ + text-shadow: 0px 1px 0px #fff; +} + +:root body.home #sm2-visualization .ui360 a { + /* IE 9 correction */ + line-height: 340px\0/IE9; +} + +body.home #sm2-visualization .ui360 a, +body.home #sm2-visualization .ui360 canvas { + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; + -moz-transition-property: background-color, border, box-shadow; + -webkit-transition-property: background-color, border, box-shadow; + transition-property: background-color, border, box-shadow; +} + +body.home #sm2-visualization .ui360:hover { + background-color: rgba(0,0,0,0); +} + +body.home #sm2-visualization .ui360:hover a { + background-color: rgba(0,0,0,0.01); + border-color: rgba(0,0,0,0.1); + box-shadow: inset 0px 0px 32px rgba(0,0,0,0.05); +} + +body.home #sm2-visualization .ui360 .sm2_playing canvas, +body.home #sm2-visualization .ui360 .sm2_paused canvas { + /* hide song title while playing */ + background-color: #fafafa; + *background-color: transparent; /* not you, crap IE. */ + background-color: transparent\9; /* nor IE 8. */ +} + +body.home #sm2-visualization .ui360 .sm2_playing canvas, +body.home #sm2-visualization .ui360 .sm2_paused canvas { + background-color: #fafafa; + box-shadow: inset 0px 0px 32px rgba(0,0,0,0.066); +} + +body.home #sm2-visualization .ui360:hover .sm2_playing canvas, +body.home #sm2-visualization .ui360:hover .sm2_paused canvas { + background-color: #fafafa; + box-shadow: inset 0px 0px 32px rgba(0,0,0,0.1); +} + +body.home .gsfn_topic_list li { + /* by default, hide (and only show first X items.) */ + display: none; +} + +body.home .gsfn_topic_list .gsfn-item-1, +body.home .gsfn_topic_list .gsfn-item-2, +body.home .gsfn_topic_list .gsfn-item-3 { + /* show these items only. */ + display: block; +} + +div.clearfix { + font-size: 0px; + height: 0px; + overflow: hidden; +} + +div.icons ul { + list-style-type: none; +} + +div.icons ul, +div.icons ul li { + margin: 0px; + padding: 0px; +} + +div.icons ul li, +.icon { + position: relative; + display: inline-block; + vertical-align: middle; + *display: none; /* not you, crap IE. */ + background: transparent url(data:image/png;base64,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) no-repeat; + width: 32px; + height: 24px; + padding-right: 4px; + text-indent: -999em; + overflow: hidden; + cursor: help; + opacity: 0.75; +} + +div.icons ul li:hover, +.icon:hover { + opacity: 1; +} + +.icon { + display: inline-block; + *display: none; + width: 32px; + height: 30px; + margin-left: 16px; + margin-top: 5px; + opacity: 0.85; + cursor: default; +} + +div.icons ul li.desktop { + background-position: -11px -12px; + height: 24px; +} + +div.icons ul li.laptop { + background-position: -59px -13px; + height: 22px; +} + +div.icons ul li.ipad { + background-position: -109px -10px; + width: 28px; + height: 28px; +} + +div.icons ul li.iphone { + background-position: -256px -9px; + width: 22px; + height: 28px; +} + +div.icons ul li.android { + background-position: -299px -7px; + width: 28px; + height: 32px; +} + +.icon.performance, +div.icons ul li.performance { + background-position: -205px -9px; +} + +.icon.performance { + width: 18px; + height: 28px; + margin-top: -7px; +} + +.icon.music-note, +div.icons ul li.music-note { + background-position: -155px -13px; +} + +.icon.music-note { + width: 19px; + height: 23px; + margin-top: -4px; +} + +.icon.package, +div.icons ul li.package { + background-position: -347px -7px; + height: 28px; +} + +.icon.package { + width: 22px; + margin-top: -8px; +} + +.bonus-demos { + position: relative; + list-style-type: none; +} + +.bonus-demos, +.bonus-demos li { + margin: 0px; + padding: 0px; +} + +.bonus-demos li { + float: left; + display: inline; + width: 24%; + margin-right: 1%; + text-align: center; +} + +.bonus-demos li img { + border-radius: 4px; +} + +#client-requests ul.flat { + /* nested examples as in HTML5 vs. flash download behaviours */ + list-style-type: none; + padding-left: 0.5em; + margin-top: 0.5em; +} + +#client-requests ul.flat li { + margin-bottom: 0px; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html new file mode 100755 index 00000000..31133af0 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html @@ -0,0 +1,28 @@ + + + +MP3 player demo + + + + + + + + + + + + +
    + +

    SoundManager 2 Demos

    + +

    + SoundManager 2 project page +

    + +
    + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js new file mode 100755 index 00000000..e26c92bd --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js @@ -0,0 +1,621 @@ +/* SoundManager 2 - project home utility JS */ + +var IS_CHRISTMAS = (document.domain.match(/schillmania.com/i) && new Date().getMonth() == 11) || window.location.toString().match(/christmas/i); + +function _id(sID) { + return document.getElementById(sID); +} + +getSoundByURL = function(sURL) { + return (typeof self.soundsByURL[sURL] != 'undefined'?self.soundsByURL[sURL]:null); +} + +function init() { + var o = document.getElementById('main'); + var el = o.getElementsByTagName('dt'); + for (var i=el.length; i--;) { + if ((i+1)%2==0) { + utils.addClass(el[i],'alt'); + } + } + var el = o.getElementsByTagName('dl'); + for (var i=el.length; i--;) { + if ((i+1)%2==0) { + utils.addClass(el[i],'alt'); + } + } + var newCSS; + if (IS_CHRISTMAS) { + // overflow-x: hidden hack for homepage during christmas light season (so explosion fragments don't cause horizontal scrollbars.) + var newCSS = document.body.className.split(' '); + newCSS.push('has-lights'); + document.body.className = newCSS.join(' '); + } +} + +function Utils() { + var self = this; + + this.hasClass = function(o,cStr) { + return (typeof(o.className)!='undefined'?new RegExp('(^|\\s)'+cStr+'(\\s|$)').test(o.className):false); + } + + this.addClass = function(o,cStr) { + if (!o || !cStr) return false; // safety net + if (self.hasClass(o,cStr)) return false; + o.className = (o.className?o.className+' ':'')+cStr; + } + + this.removeClass = function(o,cStr) { + if (!o || !cStr) return false; // safety net + if (!self.hasClass(o,cStr)) return false; + o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); + } + + this.toggleClass = function(o,cStr) { + var m = (self.hasClass(o,cStr)?self.removeClass:self.addClass); + m(o,cStr); + } + + this.getElementsByClassName = function(className,tagNames,oParent) { + var doc = (oParent||document); + var matches = []; + var i,j; + var nodes = []; + if (typeof(tagNames)!='undefined' && typeof(tagNames)!='string') { + for (i=tagNames.length; i--;) { + if (!nodes || !nodes[tagNames[i]]) { + nodes[tagNames[i]] = doc.getElementsByTagName(tagNames[i]); + } + } + } else if (tagNames) { + nodes = doc.getElementsByTagName(tagNames); + } else { + nodes = doc.all||doc.getElementsByTagName('*'); + } + if (typeof(tagNames)!='string') { + for (i=tagNames.length; i--;) { + for (j=nodes[tagNames[i]].length; j--;) { + if (self.hasClass(nodes[tagNames[i]][j],className)) { + matches[matches.length] = nodes[tagNames[i]][j]; + } + } + } + } else { + for (i=0; i'+o.innerHTML+'
    '; + _id('search-results').style.display = 'block'; + _id('filter-box').style.display = 'block'; + if (isClear) { + _id('filter-box').style.paddingBottom = '0px'; + _id('filter-box').style.display = 'none'; + } else { + _id('filter-box').style.paddingBottom = '0px'; + if (!navigator.userAgent.match(/msie/i)) { + _id('filter-box').style.paddingBottom = Math.max(0,(document.documentElement.scrollTop || window.scrollY)-utils.getOffY(_id('filter-box'))-parseInt(_id('filter-box').offsetHeight)-20)+'px'; + } + _id('filter-box').style.display = 'block'; + // if ((!document.documentElement.scrollTop && !window.scrollY)) _id('filter-box').style.display = 'none'; + } + if (lastSelected) { + if (lastSelected == o) { + utils.toggleClass(lastSelected,'active'); + } else { + utils.removeClass(lastSelected,'active'); + utils.addClass(o,'active'); + } + } else { + utils.addClass(o,'active'); + } + lastSelected = o; + if (typeof e.preventDefault !== 'undefined') { + e.preventDefault(); + } + // cancel bubble, too? + return false; + } +} + +function getLiveData() { + getDynamicData(); + // reinvigorate.net is a handy (and free!) stats tracking service thingy. you should check it out. + var is_live = (document.domain && document.domain.match(/schillmania.com/i) && typeof re_ != 'undefined'); + loadScript('http://include.reinvigorate.net/re_.js'); + setTimeout(function(){ + if (typeof re_ != 'undefined') re_(is_live?'f6795-v062d0xv4u':'u8v2l-jvr8058c6n'); + },3000); +} + +function getDynamicData() { + // Attempt to fetch data from schillmania.com: "Get Satisfaction" topics, version updates etc. + loadScript('http://www.schillmania.com/services/soundmanager2/info/?version='+soundManager.versionNumber+'&rnd='+parseInt(Math.random()*1048576)); +} + +function loadScript(sURL,onLoad) { + var loadScriptHandler = function() { + var rs = this.readyState; + if (rs == 'loaded' || rs == 'complete') { + this.onreadystatechange = null; + this.onload = null; + window.setTimeout(onLoad,20); + } + } + function scriptOnload() { + this.onreadystatechange = null; + this.onload = null; + window.setTimeout(onLoad,20); + } + var oS = document.createElement('script'); + oS.type = 'text/javascript'; + if (onLoad) { + oS.onreadystatechange = loadScriptHandler; + oS.onload = scriptOnload; + } + oS.src = sURL; + document.getElementsByTagName('head')[0].appendChild(oS); +} + +function doAltShortcuts() { +/* + var o = _id('shortcuts-list'); + if (!o) { + return false; + } + var oParents = []; + var oLIs = o.getElementsByTagName('li'); + var isIgnore = null; + var offset = 0; + for (var i=0; i + usePeakData: true, // [Flash 9 only] whether or not to show peak data (left/right channel values) - nor noticable on CPU + useWaveformData: false,// [Flash 9 only] show raw waveform data - WARNING: LIKELY VERY CPU-HEAVY + useEQData: false, // [Flash 9 only] show EQ (frequency spectrum) data + useFavIcon: false // try to apply peakData to address bar (Firefox + Opera) - performance note: appears to make Firefox 3 do some temporary, heavy disk access/swapping/garbage collection at first(?) - may be too heavy on CPU + } + + threeSixtyPlayer.config = { + + playNext: false, + autoPlay: false, + allowMultiple: true, + loadRingColor: '#ccc', + playRingColor: '#000', + backgroundRingColor: '#eee', + circleDiameter: 256, + circleRadius: 128, + scaleArcWidth: 1, + animDuration: 500, + animTransition: Animator.tx.bouncy, + showHMSTime: true, + + useWaveformData: true, + waveformDataColor: '#0099ff', + waveformDataDownsample: 2, + waveformDataOutside: false, + waveformDataConstrain: false, + waveformDataLineRatio: 0.73, + + useEQData: true, + eqDataColor: '#339933', + eqDataDownsample: 2, + eqDataOutside: true, + eqDataLineRatio: 0.69, + + usePeakData: true, + peakDataColor: '#ff33ff', + peakDataOutside: true, + peakDataLineRatio: 0.5, + + useAmplifier: true + + } + + if (navigator.platform.match(/win32/i) && navigator.userAgent.match(/firefox/i)) { + // extra-special homepage case (you should never see this), prevent out-of-view SWF load failure WITH high performance AND flashblock AND SWF in a placed element + soundManager.useHighPerformance = false; + } + + function checkBadSafari() { + var _ua = navigator.userAgent; + if (!document.location.href.match(/sm2-usehtml5audio/i) && !window.location.toString().match(/sm2\-ignorebadua/i) && _ua.match(/safari/i) && !_ua.match(/chrome/i) && _ua.match(/OS X 10_6_([3-7])/i)) { // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Known Apple "radar" bug. https://bugs.webkit.org/show_bug.cgi?id=32159 + var complaint = document.createElement('li'); + complaint.innerHTML = 'Note: Partial HTML5 in effect. Using Flash for MP3/MP4 formats (if available) for this browser/OS due to HTML5 audio load/play failures in Safari 4 + 5 on Snow Leopard 10.6.3 - 10.6.7 (purportedly fixed in OS X 10.6.8 and 10.7 "Lion.") Issue caused by bugs in QuickTime X and/or underlying frameworks. See bugs.webkit.org #32519. (Safari on iOS, Leopard and Windows OK, however.)

    Try HTML5 anyway? (some MP3 playback may intermittently fail.)'; + _id('html5-audio-notes').appendChild(complaint); + } + } + + soundManager.onready(function() { + + _id('sm2-support').style.display = 'none'; + _id('sm2-support-warning').style.display = 'none'; + + if (soundManager.didFlashBlock) { + soundManager.createSound({ + id: 'success', + url: 'demo/_mp3/mouseover.mp3' + }).play(); + } + + doChristmasLights(); + + // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt + + var _hasFlash; + var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; + + if (nP && nP.length) { + + type = 'application/x-shockwave-flash'; + types = n.mimeTypes; + + if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { + hasPlugin = true; + } + + } else if (typeof AX !== 'undefined') { + + try { + obj = new AX('ShockwaveFlash.ShockwaveFlash'); + } catch(e) { + // oh well + } + hasPlugin = (!!obj); + + } + + _hasFlash = hasPlugin; + + // if using HTML5, show some additional format support info + // written while watching The Big Lebowski for the Nth time. Donny, you're out of your element! + var s = soundManager; + + if (s.useHTML5Audio && s.hasHTML5) { + var liID = 'html5-support-li'; + var oldLI = document.getElementById(liID); + if (oldLI) { + oldLI.parentNode.removeChild(oldLI); + } + // what lies. not an

  • at all. ;) + var li = document.createElement('div'); + li.id = liID; + li.className = 'html5support'; + var items = []; + var needsFlash = false; + for (item in s.audioFormats) { + if (s.audioFormats.hasOwnProperty(item)) { + needsFlash = (soundManager.filePattern.test('.' + item)); + items.push('' + (s.html5[item] ? '<' : '') + item + (s.html5[item] ? '>' : '') + ''); + } + } + + li.innerHTML = [ + 'This browser\'s <HTML5> vs. Flash support:

    ', + items.join(''), + '
    ', + '', + (soundManager.html5.mp3 || soundManager.html5.mp4 ? (_hasFlash && soundManager.preferFlash ? 'Preferring flash for MP3/MP4; try preferFlash=false for HTML5-only mode.' : (soundManager.html5Only ? 'HTML5-only mode.' + (!soundManager.canPlayMIME('audio/aac') ? ' Try preferFlash=true for MP4 support as needed.' : '') : '  Some flash required; allowing HTML5 to play MP3/MP4, as supported.' + '

    ')) : 'Flash is required for this browser to play MP3/MP4.'), + '' + ].join(''); + _id('html5-audio-notes').appendChild(li); + _id('without-html5').style.display = 'inline'; + + } else { + + _id('without-html5').style.display = 'none'; + + } + + checkBadSafari(); + + // check inline player / HTML 5 bits + var items = utils.getElementsByClassName('button-exclude', 'a', _id('inline-playlist')).concat(utils.getElementsByClassName('exclude', 'a', _id('graphic-playlist'))); + for (var i = 0, j = items.length; i < j; i++) { + if (!soundManager.canPlayLink(items[i])) { + items[i].className += ' not-supported'; + items[i].title += '. \n\nNOTE: '+(soundManager.useHTML5Audio?'Format apparently not supported under this configuration or browser.':'SoundManager 2\'s HTML5 feature is not currently enabled. (Try turning it on, see +html5 link.)'); + } + } + + }); + + soundManager.ontimeout(function() { + + // failed to load + + if (navigator.userAgent.match(/msie 6/i)) { + // we don't care. + return false; + } + + var o = _id('sm2-support'); + var o2 = _id('sm2-support-warning'); + var smLoadFailWarning = '

    Oh snap!

    ' + (soundManager.hasHTML5 ? 'The flash portion of ' : '') + 'SoundManager 2 was unable to start. ' + (soundManager.useHTML5Audio ? (soundManager.hasHTML5 ? '

    Some HTML5 audio support is present, but flash is needed for MP3/MP4 support on this page.' : '

    No HTML5 support was found, so flash is required.') : '' ) + '

    All links to audio will degrade gracefully.

    If you have a flash blocker, try allowing the SWF to run - it may be visible below.

    ' + (soundManager.useAltURL ? 'Viewing offline? You may need to change a Flash security setting.' : 'Other possible causes: Missing .SWF, or no Flash?') + ' Not to worry, as guided help is provided.

    Troubleshooting

    '; + var hatesFlash = (navigator.userAgent.match(/(ipad|iphone|ipod)/i)); + + if (soundManager.html5.mp3 && soundManager.html5.mp4) { + // flash portion was blocked, but support exists. We'll "downgrade" to HTML5-only. + soundManager._wD('Special homepage case: Flash appears to blocked, HTML5 support for MP3/MP4 exists; trying HTML5-only mode...'); + soundManager.useHTML5Audio = true; + soundManager.preferFlash = false; + setTimeout(function() { + soundManager.reboot(); + soundManager.onready(function() { + // for when things start up in HTML5-only mode... + o.innerHTML = '

    Support note

    SoundManager 2 tried to start using HTML5 + Flash, but rebooted in HTML5-only mode as flash was blocked. Visualization demo features will not be shown in this mode. To enable flash, whitelist the blocked movie and reload this page.

    '+(soundManager.useAltURL?'

    Running offline? Flash may be blocked due to security restrictions; see troubleshooting for more.':'')+'

    '; + o.style.marginBottom = '1.5em'; + o.style.display = 'block'; + }); + }, 1); + return false; + } + + o.innerHTML = smLoadFailWarning; + o2.innerHTML = '

    SoundManager 2 could not start. See below for details.

    '; + if (hatesFlash || soundManager.getMoviePercent()) { + // movie loaded at least somewhat, so don't show flashblock things + _id('flashblocker').style.display = 'none'; + if (hatesFlash) { + // none of that here. + _id('flash-offline').style.display = 'none'; + } + } + o.style.marginBottom = '1.5em'; + o.style.display = 'block'; + o2.style.display = 'inline-block'; + }); + +} + +// side note: If it's not december but you want to smash things, try #christmas=1 in the homepage URL. + +// --------- /home JS ------------ + +function startStuff() { + if (navigator.userAgent.match(/safari/i)) { + document.getElementsByTagName('html')[0].className = 'isSafari'; + } + doVersion(); + ie6Sucks(); + fixLinks(); + getLiveData(); + doAltShortcuts(); +} + +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", startStuff, false); +} else { + window.onload = startStuff; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html new file mode 100755 index 00000000..f2510a5b --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html @@ -0,0 +1,56 @@ + + + +SoundManager 2 Demo: Basic MP3 Play Button (Simple Demo) + + + + + + + + + + + +

    SoundManager 2 / Basic MP3 Play Button: Template

    + +

    View the source code of this page for detail. Don't forget to set debugMode: false to disable debug output.

    + +

    Walking Walking

    + +

    Armstrong Beat Armstrong Beat

    + +

    SoundManager 2 project home

    + +
  • + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css new file mode 100755 index 00000000..495b0614 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css @@ -0,0 +1,117 @@ +/* + + SoundManager 2: Basic MP3 player CSS + ------------------------------------ + + Clicks on links to MP3s are intercepted via JS, calls are + made to SoundManager to load/play sounds. CSS classes are + appended to the link, which are used to highlight the + current play state and so on. + + Class names are applied in addition to "sm2_button" base. + + Default: + + sm2_button + + Additional states: + + sm2_playing + sm2_paused + + eg. + + + some.mp3 + + + some.mp3 + + + Note you don't require ul.graphic / ul.flat etc. for your use + if only using one style on a page. You can just use .sm2_button{} + and so on, but isolate the CSS you want. + + Side note: Would do multiple class definitions eg. + + a.sm2_default.sm2_playing{} + + .. except IE 6 has a parsing bug which may break behaviour, + applying sm2_playing {} even when the class is set to sm2_default. + + + If you want to make your own UI from scratch, here is the base: + + Default + hover state, "click to play": + + a.sm2_button {} + a.sm2_button:hover {} + + Playing + hover state, "click to pause": + + a.sm2_playing {} + a.sm2_playing:hover {} + + Paused + hover state, "click to resume": + + a.sm2_paused {} + a.sm2_paused:hover {} + +*/ + +a.sm2_button { + position:relative; + display:inline-block; /* If you worry about old browser bugs, Firefox 2 might not like this and may need -moz-inline-box instead. :D */ + width:18px; + height:18px; + text-indent:-9999px; /* don't show link text */ + overflow:hidden; /* don't draw inner link text */ + vertical-align:middle; + /* and, a bit of round-ness for the cool browsers. */ + border-radius:6px; + margin-top:-1px; /* vertical align tweak */ + /* safari 3.1+ fun (/W3 working draft extension, TBD.) */ + -webkit-transition-property: hover; + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out 0s; /* firefox 4 (couldn't sort out -moz-transform vs. MozTransform, so, "all" for now) */ + -o-transition-property: background-color; /* opera 10.5 */ + -o-transition-duration: 0.15s; + /* weird IE 6/7 display fixes, and/or I'm doing it wrong */ + *text-indent:0px; + *line-height:99em; + *vertical-align: top; +} + +a.sm2_button:focus { + outline:none; /* maybe evil, but don't show the slight border outline on focus. */ +} + +a.sm2_button, +a.sm2_button.sm2_paused:hover { + background-color:#3399cc; + background-image:url(../image/arrow-right-white.png); + /* where possible, use data: and skip the HTTP request. Fancy-pants. Would use short-hand background: for above, but IE 8 doesn't override background-image. */ + background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAKCAYAAABmBXS+AAAAbklEQVQY02NgQAL//v1jZMAF/v//vwuIs9HEUBUBTbj4HwIeA3EGVsVAxtn/qOAVUGM8uknIiv4hsV8A5ZKxKfoLVvnvHwifAzLtMKwDSQLBVSBti27dJajkcSD2RJODO3wtkOOMz/tMSJJYAxMA5dmsL0IfubQAAAAASUVORK5CYII=); + *background-image:url(../image/arrow-right-white.gif); /* IE 6+7 don't do DATA: URIs */ + background-repeat:no-repeat; + background-position:5px 50%; + *background-position:5px 4px; /* IE 6 again */ +} + +a.sm2_button:hover, +a.sm2_button.sm2_playing, +a.sm2_button.sm2_playing:hover { + background-color:#cc3333; +} + +a.sm2_button.sm2_playing, +a.sm2_button.sm2_playing:hover { + -moz-transform:rotate(90deg); + -webkit-transform:rotate(90deg); + -ms-transform:rotate(90deg); +} + +a.sm2_button.sm2_paused, +a.sm2_button.sm2_paused:hover { + background-color:#666; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif new file mode 100755 index 0000000000000000000000000000000000000000..6205273c316116296bdd8685ce98450a15156810 GIT binary patch literal 66 zcmZ?wbhEHb}k%ntXH#@73N>L%*ya=4xd9h@t5-754=4#6KD&Ar>mdKI;Vst046#ybN~PV literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif new file mode 100755 index 0000000000000000000000000000000000000000..d9ccd365f2efd63387d9dd8053eb3bbf6ab8eb55 GIT binary patch literal 60 zcmZ?wbhEHbw9=kJovxv z|4p715AGlR|Np=Jzxj=8UcIU3sQ9Wcw~R~a3%}34AJfmY1n@ZhpKo}tEt^Ga*RS(p w%RUNCsQ$BGebdM6|CWob7;|pbt1M??Xi{=mbwkcH1!xI_r>mdKI;Vst0O3eE-2eap literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html new file mode 100755 index 00000000..5c737141 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html @@ -0,0 +1,195 @@ + + + +SoundManager 2 Demo: Basic MP3 Play Button + + + + + + + + + + + + + +
    + +

    SoundManager 2 / Inline MP3 Player Button

    + +

    Basic MP3 Play Button Examples

    (also see basic demo.) + +
    + +
    + +
    + +

    Inline text, with "play" button

    + +

    Example code (link with a sm2_button CSS class):

    +
    <p> <a href="/path/to/coins.mp3" title="Play &quot;coins&quot;" class="sm2_button">coins.mp3</a> Spare change</p>
    +

    Renders as:

    +
    +

    coins.mp3 Spare change

    +

    Note that the text inside the link is hidden and replaced with an image, but should be descriptive - or at least should say something generic, like "play".

    +
    +

    Basic MP3 play button, no text

    + +

    Code:

    + +
    <a href="../_mp3/office_lobby.mp3" title="Play &quot;Office Lobby&quot;" class="sm2_button">Office Lobby</a>
    + +

    Renders as:

    +

    + Office Lobby +

    +

    How It Works

    + +

    SoundManager 2 intercepts clicks to MP3 links and plays them inline. The script assigns additional CSS classes to the links to indicate their state (playing/paused, etc.)

    + +

    Static Examples

    + +

    CSS classes are dynamically applied as follows:

    + + + +

    Basic CSS

    + +

    If you want to make your own UI from scratch, here is the base:

    + +
    + Default + hover state, "click to play":
    +
    + a.sm2_button {}
    + a.sm2_button:hover {}
    +
    + Playing + hover state, "click to pause":
    +
    + a.sm2_button.sm2_playing {}
    + a.sm2_button.sm2_playing:hover {}
    +
    + Paused + hover state, "click to resume":
    +
    + a.sm2_button.sm2_paused {}
    + a.sm2_button.sm2_paused:hover {}
    +
    + +

    Other Options

    + +

    By default, one sound will be played at a time; you can easily change a "config" object value to turn on playlist-like behaviour (i.e., play the next MP3 when the current one finishes.)

    + +
    +
    +// (within mp3-player-button.js)
    +this.config = {
    + playNext: false // stop after one sound, or play through list until end
    +}
    +
    + +

    I'd like to use this.

    +

    See this basic demo for reference.

    + +

    + SoundManager 2 project page (not an MP3 link) +

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js new file mode 100755 index 00000000..dc79ee52 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js @@ -0,0 +1,260 @@ +/** + * SoundManager 2 Demo: Play MP3 links via button + * ---------------------------------------------- + * + * http://schillmania.com/projects/soundmanager2/ + * + * A simple demo making MP3s playable "inline" + * and easily styled/customizable via CSS. + * + * A variation of the "play mp3 links" demo. + * + * Requires SoundManager 2 Javascript API. + */ + +/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: false, newcap: true, immed: true */ +/*global document, window, soundManager, navigator */ + +function BasicMP3Player() { + var self = this, + pl = this, + sm = soundManager, // soundManager instance + isTouchDevice = (navigator.userAgent.match(/ipad|iphone/i)), + isIE = (navigator.userAgent.match(/msie/i)); + this.excludeClass = 'button-exclude'; // CSS class for ignoring MP3 links + this.links = []; + this.sounds = []; + this.soundsByURL = {}; + this.indexByURL = {}; + this.lastSound = null; + this.soundCount = 0; + + this.config = { + // configuration options + playNext: false, // stop after one sound, or play through list until end + autoPlay: false // start playing the first sound right away + }; + + this.css = { + // CSS class names appended to link during various states + sDefault: 'sm2_button', // default state + sLoading: 'sm2_loading', + sPlaying: 'sm2_playing', + sPaused: 'sm2_paused' + }; + + // event + DOM utils + + this.includeClass = this.css.sDefault; + + this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.addEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + o.attachEvent('on'+evtName,evtHandler); + }); + + this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.removeEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + return o.detachEvent('on'+evtName,evtHandler); + }); + + this.classContains = function(o,cStr) { + return (typeof(o.className)!=='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false); + }; + + this.addClass = function(o,cStr) { + if (!o || !cStr || self.classContains(o,cStr)) { + return false; + } + o.className = (o.className?o.className+' ':'')+cStr; + }; + + this.removeClass = function(o,cStr) { + if (!o || !cStr || !self.classContains(o,cStr)) { + return false; + } + o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); + }; + + this.getSoundByURL = function(sURL) { + return (typeof self.soundsByURL[sURL] !== 'undefined' ? self.soundsByURL[sURL] : null); + }; + + this.isChildOfNode = function(o,sNodeName) { + if (!o || !o.parentNode) { + return false; + } + sNodeName = sNodeName.toLowerCase(); + do { + o = o.parentNode; + } while (o && o.parentNode && o.nodeName.toLowerCase() !== sNodeName); + return (o.nodeName.toLowerCase() === sNodeName ? o : null); + }; + + this.events = { + + // handlers for sound events as they're started/stopped/played + + play: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLink,this._data.className); + }, + + stop: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = ''; + }, + + pause: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPaused; + pl.addClass(this._data.oLink,this._data.className); + }, + + resume: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLink,this._data.className); + }, + + finish: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = ''; + if (pl.config.playNext) { + var nextLink = (pl.indexByURL[this._data.oLink.href]+1); + if (nextLink1) { + // ignore right-click + return true; + } + var o = self.getTheDamnLink(e), + sURL, + soundURL, + thisSound; + if (o.nodeName.toLowerCase() !== 'a') { + o = self.isChildOfNode(o,'a'); + if (!o) { + return true; + } + } + sURL = o.getAttribute('href'); + if (!o.href || !soundManager.canPlayLink(o) || self.classContains(o,self.excludeClass)) { + return true; // pass-thru for non-MP3/non-links + } + if (!self.classContains(o,self.includeClass)) { + return true; + } + sm._writeDebug('handleClick()'); + soundURL = (o.href); + thisSound = self.getSoundByURL(soundURL); + if (thisSound) { + // already exists + if (thisSound === self.lastSound) { + // and was playing (or paused) + thisSound.togglePause(); + } else { + // different sound + thisSound.togglePause(); // start playing current + sm._writeDebug('sound different than last sound: '+self.lastSound.id); + if (self.lastSound) { + self.stopSound(self.lastSound); + } + } + } else { + // create sound + thisSound = sm.createSound({ + id:'basicMP3Sound'+(self.soundCount++), + url:soundURL, + onplay:self.events.play, + onstop:self.events.stop, + onpause:self.events.pause, + onresume:self.events.resume, + onfinish:self.events.finish, + type:(o.type||null) + }); + // tack on some custom data + thisSound._data = { + oLink: o, // DOM node for reference within SM2 object event handlers + className: self.css.sPlaying + }; + self.soundsByURL[soundURL] = thisSound; + self.sounds.push(thisSound); + if (self.lastSound) { + // stop last sound + self.stopSound(self.lastSound); + } + thisSound.play(); + } + self.lastSound = thisSound; // reference for next call + return self.stopEvent(e); + }; + + this.stopSound = function(oSound) { + soundManager.stop(oSound.id); + if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) + soundManager.unload(oSound.id); + } + }; + + this.init = function() { + sm._writeDebug('basicMP3Player.init()'); + var i, j, + foundItems = 0, + oLinks = document.getElementsByTagName('a'); + // grab all links, look for .mp3 + for (i=0, j=oLinks.length; i0) { + self.addEventHandler(document,'click',self.handleClick); + if (self.config.autoPlay) { + self.handleClick({target:self.links[0],preventDefault:function(){}}); + } + } + sm._writeDebug('basicMP3Player.init(): Found '+foundItems+' relevant items.'); + }; + + this.init(); + +} + +var basicMP3Player = null; + +soundManager.setup({ + preferFlash: false, + onready: function() { + basicMP3Player = new BasicMP3Player(); + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml new file mode 100755 index 00000000..3d6606ae --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..ac40028ea65e031977fc9b6a09a5615208ba8816 GIT binary patch literal 12416 zcmeHtbx<7Nm+!#f!QF#vAjm*)26uu6Pw-)I*AU#@8QdL$4h$9u65L&bhXe}{BqZ=i z_V?Ybx9|PARqxf-o~qOGxu@^xKK;4Uw~vx6KM?RJSX4S%GAfS;$dAgaBd0F&xW@$p z0NNH#?(TGKO0xW~_}KOI_4OZd+D8T0xVt-xJb&)x<;87gX9nfAaB_J5kDZRpON~bp zoJW;Xky841_@##2BSiP8FI}M!sH2%Zos_FP)Xkkv*U`?=$;moK`VRk7CCl5DwsD+M!oYo_Z`lx(7Jc2q>s?v{# z6p#9k1)Z#`hl3sTKPu9Y<9#gt&)#*Ebod@&!bg=hb94K9)jv10@$nwe&Tt7_q5%SshZsP9@Dyr2Dmlx;!yv5Ee{d-`Ar>%XoMcSJNCw**;oA2L7M3M*%(0SSR=X#s4^b;p5|DOTj`yz~e>D zGqQ0WnM1NP;pxw$EdtTd01*(bMXnAW?qF4UcB1K=Qd@KVa(M5;c|9gM3d_LQ#Wgoh zx!(#OpV*PgE8)qvrE0vDJ*ne&`lk99AAa2$AGasBt+BU>9(%qZJ(Ya8Ul;hMz1D|a z1M#di&Q*{Z^=1P*5oP6rwr$dx-g>k?Kb2d5|2QHMuMJQMH;pfoEc86JdAM`!M-NFn z<~8&$4aB@<;}~y_=cQ?oLofyuR?NYlQwBsaHe(|P_aSdBsg-_u%Yv)s9u)F<%n`=#5C`+UuTet$0#wJxW~ z>mTES`Nyqe;}u%OuUTr-aqWBn69*k-jcIhqBrWiKEiqp4fK< zV$IWbQVwU~0<1aZWBD!12<@HUYXR@$K8$`XYTfs}mDmyJe!Ko3>0XTSu6 zimC&XQ}0ayJ5CwSO`G@AZ?qytZ#z`+_vOrySnwB1VutL92+f%kv>rIesNHqD$G
    s#f9|h+X>0s?AtOUga6{CT(rhZwB`MYdFg-MG~&aB!+$F6xitAt;wV2-gFSC z5Ny8Fr;39-5Xqy!tO;hG`{P> z9Ya_A0-=o9Bp(O;vOx1AYd}-5vXbG2U0lh}FjizU%PJ`5h;`Rh>Q&QUEALGsbj`n* z%?a>1v6TO6+Ly6swUK&b?rD|o&C3%MLZw9Zwex3*A2$lmE*nLN4oS3ePv@&Ylmmw( z3aiLElz3tOWUjy|qd=5!1{#|}cQDk7YcB|OGjMREza>XQx}S4NL5nmB>0CwDcam>0 zp*nf7y?0_*@IJ7di88hY&Nwh4US#gW}`be;1Y&CJvOU3|0%HvwaVZrfdAN6*xd0^M=lBFPXRyhoKqB zgprq0!l0~-$yocjJ|&)MveNcl_Xo~`F<1bj4`RpogRD(oNue<6PZLcWMue?vWYIqV zJpZl5*F4v!%YBDfQ)c*wBUkbvEJT1&XJqWc?SRo$e(x(yR&23v-DmtJX+jBqD5nKX zM0yE!=p0tMq-Ry@&tmWE#n(TqKn=6pL+hI?M?(YM#2VL!x&u@|4@-1MhBP2HqBkD%<&h9&8DnkPr^ z08jczvB#!!`2u_BnUGMDNLJc8$&Oc{Z@pHCE9)1+J|ssnFdX+U)_g{%m&b?=N~YtZ z?=6|;191Se1iv%Ik@Bh63@=F7TRl-64PlS=N?{4-;P|^;7Btu_7CN( zfeF993#v1@DcwIUi-Y6xJb|c_6^B=-By*`>I(Fch53&wKpkhvE`Yoar>}^r(>znYW zv!io3FB6zYF~CpB{jblJfw9t<qUVro6 zrx(>;autPjf~tPK;$hzH8KT#AYB@r*|4hkyO<~9?O);5c)*;(t?;Iq#3?F zp1PN!LNlV2ezeEBbR{EeOevdHC1~j$a0Os5 zmNC?L0nTHo2IQf;8j&V>1N!V-Hp$Oi36w}Y8s&zn(9qso4jPHsnS8AK_bxhzEXPhFO5&NR~a36e<&9p zlJKRKgZnTf=$49EX`D&O9Sy9muS^#i3ASXD#;XeDiZreGS^0bm&B!W9a}f90DuHC| z`&wob7Dh)dCoMvFd(#WlVQnR~&Kwh(x^a6*+{mdQpLb$=Fq-;|JMum`_}t(dC(mr_ zm2cI_!S&2xMDdTs5K?5KH$^Fwcqv@HI}|}h`#1oOq4}k39aFnHcCPqQI+!W}SLhQ` zdz$(uX|7K|YD-y|S=7NJadw4$0a)+XKi-vV$CzsQhwl4b!Hi6zKuCaP60Si zYdE|y?8B41Ca3nM6VH`vasT2}-f>qu8QLfVq<9XKaT)+rs(32?($sM}UHWmt-QVkn zKMW>iVy~=r8;$6~jVGQH-oIIdkrZKmwqPf)LWV|}D;A^oDm%E2_A42RqdWZ_SPMfE zjd$48tr(?lXi5fVad|T2c&&-yO2YO}iEq-XwVpW-4RO9fFvnd*GwBF!=?%7tdHx)g zo{|F=*W5{Tq?u>09TjwDhqRd&1=Fp*Mm|GRW~Oa~yTvF&$uFH{{k4M*t0T*wHpkb8`smb8?nZ{c9&ft&xJ&*JZSv;XQ;V5YsF@kADhOjU1ls~E zfjBRL;wQ!2(;=uxT0LbTAY<~;tMu^7H%rWA8wh?r+m9szD=O03&FYY&LG%wBi`Agg z)@Kvi=7a;H%ay|XL_QA1a|59$J-LJY!tumiwnqG#6|qNF76D#rM0J(R_AQrxDAyE% z_v;&rI=P!P+GCUIhna5rX%fA+*1cSu7pJt%lDyq;itJu`okDPRDIKub0Pdw9+w!{n zSWMgx?i|t((?Tf4WrVc%y>ISL`SooKyjH@)5#suK;xz2F zch>p3)AjIIq7g~55z{S0%_ z6|S6|V>)j9Kr%yi>HQG|c|%+ua`4CZN~8jgzzB?f?cLt?N-7MYe%5&Tll*ay?vskt z=5@ujm{G$nO~Q@VD;P;jUDP^uORKw&M^!{`j?kyKs}!A$FTaB>Ir5>wQYo-Myd$J=h|eby$S=A+7}a-Pe2Pi5oKHlTGuNDcc8hjXgUmb zm2nxOR2pWc0H0E0?d)U!;uJ1H2sTG1o3y4JG(z}6v@ERMFwEfUYB9~Tdh_UNDsDgX zKHaW;BLU*O@~UcPtUvN?P1cu_$kMf@)QA{5o&al-s$>kz@Q}9*+DfZLfRFf!-Np=b z6dzx*I-|1jD7()bg&Fm8v9P_eD>O;MHUbwFArwh-flGNn z4iA=6#bfpq%Fb5piz{8dvik}I4a4!&h@!05C0^GmRn=a(R9)!9?PVA`y%XAX|Fuj_nJ5%f3Q^F$*w2$mF@X;Fj~>&xd(r z4fb3Hb!_dZpQ4r|z0p1q6g?lr=q}>XdRoXMrmU9%X6VhYJ!5I&4$*ndm4uKyZqC@) z@lwBs4M(%G2q%jQ^Xk`oj+H4$dS`q#H@8PT!440w^WcU+>s~HSOtek?Dl8Q*4`}X+ z9f~4l0oe5u2Rfgl8Z=@%yD+1>iLZ!>nUJ#NOOvo90*Tqg3!A14u@X`gF#5(!c?twZ z1L0E^E%tfN;F&lv0{>^F+chC(QN)V7dT7Bq&qfx6cB~RuwS4dz>Hta0Ay~-D^`Dh) z1V|*vzv_Rki4aLV^ig<|?1wvFp6(TKC*hrs$Ym?fNa-Nxev@kG#Q08TT=Q*zVI}%A zFu$+O)Rn-n4^V{Bd9RnPoGX?|lYp7rl!te0Q~oI#ZlJ0&3KBYcXiU14c8jRqAIcp7 z3EA(cxl5qI;vX!+`fv(hT81IMMXcJT8geA1ZY3t^ka`1ZfjpyCf(#?lt~k0)`2!{v zfUFA4@=%%pz*YgVvi$`2w1K{(UY?Iw5oj#b<;&=J7Ng|~i{_A*gX}}Kgu`ZL_w?SPTKsB@?#a5}9lz61nLqUR*46X{VvKe* zZu1J}35)c-I1~#R$v!=F_SHpsaV|g(#+V5tkq$v|2qBc0lSf8X2mE#ZQ zwbZ^-t7STjfV+0q`{QmeQoqNvmae2bwQ>@^q$iwLMQwU%;;Qf0hn2xkTUz}@fyRO8 z5G|xwuM1AiFC*B03;R(w++dv0U~MT=TV`dY+NB=OXQTj2tMKUJEat z478$+8}%gYF9lVkUtIPuUpA*?GW|a3S558N#-nU&K-+&xttc)Vnbfdv3)3doN~xD( zyS%b6jYaYs&ADWgKVYx*Rm!o;wxVJ1RfkCnSsJXBi@f#~RMQD+NWF)xRnuifRsT?v zLHr0B*@)Fxfj58FwK4~JZ(Teo;{xyoYXB1Eg@q$|P*C|$2r2Qgkuj#N2^SClQ0_38 zaQT)Jcef8qQPQGemQ)Dw3=|dA(xWb$l(n!QXHCa-c;eCS7NvBAXt{oAY|;};fN8LG*o+E>AQEa;4Rz3h!C$;dhg z8`;oTy864}+cas4Qn4lWxPr302dMotnTGANicAt15%CyLv;d}jnw!@lLl%G!(S)dCY^!&`L*>4R70t^}OixOuYf6Wd9@ z%_=Dt(0m!SWw7==@Dmu!a8SK%>4-VZ8hS9tsIdf4#74JdR5Ac4#QY9S*k!@#e<*hl zOek#RiEN4LoWa&fMGVnu7G_M4!2(z!m~#OD%vWG+WZD8 z&E-Kx@91n@nSU}zYb_MTw<9=e0-LV9LPrYOj+7J?1wyfHI&D9GqDA2~17^; z&0V4vwu4ZNnQyFe>){n-T<%=VTiQEHvx>OfR=BjdNw5RQif*4_T*)-8iik?)n)a^- zls-+_@8!rF3@ertOUK5jmSUmgV8L8;02q5mP6nPC*dI)WgniPafk6#^_m1ap-~d|C zYw8JdyN~h`7P@^nKD~xSE!oIjJ%?TtRLq)-GjNGsL@~P<#2~(@$r+aC% zchPCvKieBWDG(*d8RY#OSMQ95ul#H~Zfos8q_?+c*<_!T+2y@?sGR zcBp-Ik?q zmWG=g8Z9qrp*u#W$l4S)J!daeL2eo^z@;gRnwUsF@o}g>FCm;>pf}uZp>1DddfXY! zoKGK|WLE))&`s!b1R&;AQd(wAHn8OZ6m$X}K6H5&E7nQyFj?9X6V($UeqcANEh`-FhiaW%i=NxMT&q z8B6Ndnuz;?el0%yLVFZ!4 z$y03cT7NK;muUKj%&N-@g?mbgfpS6r44^Q=O*cCdfUm++FQmg!qo&TDYyX#WfrM$t zloR9*BmCVvh3nYtb$a75CmJ6oKI<1L-G_8E6U_|asWuml-rBcUBf%t0^D{ z9Tv1%(;*`>BaD=i59qTDFbWw)Ubey#@5U+gUNEkX@+YU}oQo!!2NUcG@-c*+O*TS& zEK;<}1~FXQyhiw>1G}~dJ!ND-MUzOU z#u$;~6UY4Th;XBQgdMKV`#i&z)y~bm^tKsW6$QsHZHE?-S|Y*=z6O|9py%p1>;jXX z2|{8!2Ldb}jk2yP1F(Wg5sc}oDp&0rok)6aov7(gl2vX;LXck#m=_FzYrqZxH^~qf zJgL&e2}KS$(Q_#6(lU8N860Js$~UY5`n7_y3?{xZlVXx*0yk2lC=#f^Oudx+oAVsKCmiuQ1)s0Ub_M%tNm)u63d@|hJS34>87_Cj z!{yNu4=rks?)72NGu1i-vVUG4sMn(CrJA04J&y@w1CTzEC}lJi<4p$Ge1De<%eo+Q zx>UmgMdPveE>qFOD-N#u3Ky3;cg}(JZ%GNLHJfaGWVP$|P$HybKX7s&Gt1|mK{28_ zviEEG8goluRU-Jqs}My`MIyWy8T{L22gMZRqsvsIYUNzRZ_y5u$rz<21Ms z4Lm=3QL3e}dv)jxZMIUW7*Uas>;nOe!5JupgU?XH@%2AX;l^Kf1Ipq@=Ow>6*?94e zc8(ssS@9dcIK&flPPQbhluyJ)4VRxir}o^Z&MXS6nsNi18ls97v`_w>1Ov39Zpp_p z?M7rI%zJyY5J1X|)D6w>vF_ij;WG%OOIS@9ryN<8I@QSwTZfCgZ=-r$PFkl4W!?FJa6G-6aEgiZ^}o2Lz3)Hxo?U$rumL|feqV>uIoMyh zb((v z<+~Yz#>p{to%dJHOEF`(Uc2uIMwl?@TxfGSFG{+@2u9sB{kl3!{YI}+l zEhJ&kZKa>$V6%ysB`}XJ^+v=7dyIgV09OD|$-#lN4~|AyX~7gZd3&jxYAK&}2rx4& zHOSnwu-L`{5&B-a7TW-Q22^8^;RSkLEBm6Q#Dj!{K!rdF-(h~S$|gfqw0p5zH@nWD zYBst8*3r^dk#*vmcd@A(Uc5@Q@lfH;id_q_ zy`8~ftiq7cLIY5TPM+GwkrXp$Ys@|=x2FW@V<0&5lWbC$NV0U~AIg0J5SAWOaCLr+ z7X4rz)Jdnv$DQCQG3L1}KhxjSJ7TovnfSF+RW?AmrdeYBy@OZOs7tGH?N|L~kD-l2 zs>rD95?N(=(6?r(j?EWbhHpWhvvywM#qRK_tHv}g&pkfltg|TEVJs2#sOjfvLG1J0 zgH86A`V~KfZO6=^R`IQ7*M!bhPpB;8Uws9*1Olju1&)PAWgubElx@aN|a$Uq5 zRgkhAZD}@_Ml1GuW~{s#RB~mZGFy)qnfwWlv$&`89T59IC$Qe<+O@JsqNeKt@fBBt z*q9ln3Qx{V}N=v;DM`ae7UDEyFiY5Az(my>JPAIZrFy652XH)~cR$6pi0R zFBD%OmC_rAkgS&I0^}D)E+e-Peom{gujhzj6)G#+=_@FUoFH%xk&Xe@g>1J&f!#O%oPnl zWAbEx0R=yY!p6M;bGJ!(K{=Xx44i{KAm#V51P!-O#!Dx*%XIPQVM!(n6!Uyi2GvLsMGMULw0}eda1KOgqJf9|m0+-9wtyS>-t;^v- zh8JP4IYCE$^U+?Bw!xohzwk%{%V|ZP}@%cpPqZv0_hcEXjTG2b)F*N!cJJJ<*OQdnHPqfp5^U(CN9WbfEk=zDc%cUHE( zv{oa}`rJd<>3PBrc(+qzLW4v0^PFG#db*8e?HG_zMe5q(vTBeCY<41{KT#08jy-YH)Z38j3v0ARmoGk+hhT@*-5fT7hi% zqmfS2rn!=)UXlJC(;KL=e4D8ST@J+gy^hx08k1)2Um`_Vp6k>FJ|%8XFE9*u_p}(*}0P@cpMtmh=#0#l;*dCu$^dQ zn2C9;+|USL?Y*)BNDZ2mQNTIu!4#>1))A784p>WvjFEu#!^Y`CMwXQ{ zlj|f`)V1iYjePq4V)D>4Rh+^6$^8XrQ2QZb%LD| z>T4wW+SBKTFAxDuuNMad0}gi72a@x}zD?e}?611odhJADM3!Wr_mue@R_UV|9$efu zH#TLpYxit_TJ=-}8b6^!=?xKXI7=$c1~AeA#5iap(KwOt+iVRU|5S4mRyn*WnK!Qz zd{+u;Z(-(sU#4Ew^^`if6ws!NM65l2%~Lh7J0V6>`>^hN9J_SAcfjX!bYJa6MR_i8 zpI`4FH=){ovMIjMX9ejDSl#)3&9y0LU)w$4c+diEyuEl~P~9>3a7{brcVO&)s+;}B zuxXU)sQ>%6I8(EeplN?HEjO{XDXfdqJdg+_3Q2~=PnRyE>2XH#xS)xwWpIr#UIHCa zk}wS#BUduyS*d?UC8U^!N|1_?Mq7L<>&g~REP$W1Pt4nWs0il{%2Uy-T;hK^08_Rq znmH;ivla{|v2CTH9^yJ@UL}j0mC|47`^EIb-8<|1YE(?S40t73vz=7(zQWamt=3et zz9BDW#1mmbuR6W)(c0gz>qn)BxzO^fA-*X8u9e)dq9Yp}HjO+UcmVoSk~)6lZsAF^ zwvm>mbGJevZTdRi6s$`-QKnPo32L)S4_IAJ%=WLFb+wLBsX0NJW zuNt8ZPBO*Mk1Lg%EkxB8iOLKeis+z#ncP!pBU}yz1O(tM^~ZlH2OzY%K%Q>`Jh|x0 z0}7o1Y7usJ5u!2at%@r-_TN@Ee=l+gJVI`{8V7$opB*@eprWcrCSc@qjpW{>>z_q` zwlM{HD^n5XKFkx)a=4RtjiM9bYisKMlK`jt-%kEet^ue4#f2OH2z<=l1O3_j*FEKb z-@xhqq1;1A4*;p;F=CJMUmUsrx_9vZTTMDr3jZmWotORJLin%kf8_7~r-Hxb|Mv{~ Ve=Pr`+y8Gl`u`OC;{nOye*yN0aX8Q}=v0_scz9H8ZvM>gis!>bJW8-McsZ!F3SupNpak_Z5~fGaZBA=PQUZVk`cu2IQIP^}wt%jHbnL*ESGQaWFOUh_ zjAjg`;X!GrNPvOgm}iK=fJg~=ubmK+ig-{|?@$ODDndE}93D1G|3qeHkuMdoNoMPzo%E{6Kctx>C@_H!fNw(YT9I>F&5kMX7 z4svjQd;)*N3Nshxn3q~jTh2kBxseX5C5dd%g_zK9H_Qhc^2Mwe9PEOo%CxdK_uXcW z)*&@QBNncH;@h(i2S$t6hV^l0Jy#gDbRPn$=6?Ct|8j!#z#n-J_BINv%^lJn`hb}q zx`CotqO#Ba+$NnST<=B!)k@527I@@{JjN%m_q8&ODB*<`$AKR%+D_3$uv1 z_H0Fd!BFRc9LueyARo9$_x(FJtPBrgqBQRrn@{{!d!UxA-Kf+L_lj>G(VceRdf{_c zPPW}jr-mRqIC`S&WN@y9fm(dg%GR*j@m8$!{outCSDUbVZ^Wl>v+#{ggH1@@Ua41r zB%%Qtv-PeduapeZ8=#ZJI3PUn1(IiQ*S-!rAFkXyeHtHT0s`J~!=*DyS_e{ljD~zt7&^@KQ2l|>3dAW#>l~$Di0MZ-{i?w?Yq*?_H zQ;p^n2m4dGs|P>3Do<90&MrppvTsKUi|5=~Z%xowfAVI2bEo#rm|tZ*xZu!(DYb!C zddngWVG>d$*}%fXs0VBklg(Bum_4{H*dSmHoe%QdByfrX$kMs`%{P?;m0pYPvSi$*YwapR*l zSRv2V>x@30B7||*fK^A=hbgs5U}`nhyxay?QOMDgB_j}5H}xMUW_uX( zXxuir$+eRH=?vjt;$js+JGUCYdZ+#(CxMg@_fo}~OFim0q1|LxDK`p&^zmR41Cu!< zFv!(>3x!2T4)&5b^IF9mupnK?IB%*yW5l|yKi$ZxeL9EK%Al>E$2U(YsKr!HrBNe$ zILl-2mPQuMmna!JjsQt)5xR^L_I}5v686VkRt7bL)O7MPU`65^G{Jo)EYc&`=M>%^ zRd%>Vs=sq|)Tj#pm~Nx0knz5{9S-LOBLvAJ!VH4<&=l}-XqYmCTzPKU-TOG^J0`5+ zfhHxxr75*y2X>J>bWTi4ay77hGNV&BjQ0z(+Rj%>V__kq`H0Q$8$Py8mwYXU(I;zL zC9G}`jYQB|9+Rm5;AWQic8B3b2KoJXf!9iL65kTCf!3>1D7sOqVx78xZbVF_GmfZV z2#E;o@8fanePOa{#(AhDK?MzGfc!;HJ0u~BU%{Eq6aBj4Fs=pbj^Si1wD(aAp`7r2 z(`yQhVguhr@*4_8u2)@?m0s=VV>O3^-1PA;D)fwR&aW7J8Cu%OQ@H2@XI4%s4g=6S z99WR1ZKmN%9;o>6w|1oy+i&9=006UIYiN|K&xa^-Zge2hJc0FS1aHxI20G$M2b~OE z%cjUwhsJ_=3XBGZsvNhf|XtvEFh6PUCxk^25ld;c}|dyq&jt^dq+(d z35n>KD9p9t4g93j@mhbOrWwk(W`fBz;!Pb_b>J^Ik9_UH_^YGQ5WYN$@6Ly{5Gu{6Rw^^0a@Go*7LK3;wg`D>y`tB(iCY$0{YOR;yaQHC*69E?h z{wZ4FIyTI!5*%1?=>WVU6qX5P1kT{oeLU>uQpIS@&Rq+Lnaid+8^YhU z*=wMwd_mVr9*kB9!d7#oc44j`V*C6^^EwKq$n##%$S=d;b^`+y0Th^wSG z_skNcFI?H4SjvCy`?3X74Q6v(fKCx7)NI?v@rhVEns8Dc~(&s3{z@&&!? zn(S?5fz-_K(uF7}OO;dba%NMYhdU@*H6GCGMjc_|Tz&R1llKT4U1jE25gzQS|1H65 ze)>u9sm04Xpuzn~B46Gp!TTf^n$by#MpHzHd6ew^Pw$5SQm}@lh2a(ewVsgJ6=*?K znD7EJf>IEQoXPVZAWJCy7r6wagoQ~yHGBHLyIhEBHP>N1AvQgKUua<;ZD0^Pa@3&} zNaXT8gwkm{gZWP?-yy2$6WP1`2xL2lF*+J*>8Y zFNwpfXlnexXh5Ck1)C>m6Y)R-c6}7rvlEPHPK^7C9}&=rXfDuJ=A)u)LLOY5#6P@H z9TSq589?S8vb|Iols&aM{$ z6acBrK4N?Y&!BM`6g-t28E!PEaU>AU{%M&yBx(Pi;pZ?e6KQ5eRwdeCqyn}@s_K#| zr6rfFKZ7-f^reQRkLzFLib4_BlDN>IT9rjRaYm-La(~JHzSgI1L%z zUDzp&B*1!@8lMCU$j8GISqD-V`7FW8r%jR5Z+xnVKLgI^Vw0e@sK(Yt?3vYfQ6=>M z{=34W){MThE;ZHU@?9j2_PoYbLc7lA4X>tL8}Fw*G~c+9ir?$BOe^qa!Jd4k7WJd! zKi}XtReM>JMm|NpM_%J;016}|$xAeFWAD;{j#4p7Uf6a=n`TCg;-^9h z3X;i4MP$cCiR32u64Rr6Jdp9CF?<9!tC1i-H^Q|P1OT8OpXkXW+p(G{pq2j^SJ!_@ zb2o~+O4fe!#IgTECHUwsa!p8yLg#F1HjF{{6nly=D3{{suRf~6KTKXRS#bC!{E-tZ z6L#^^_o0^*FaWvqCdScN;pgjGpA;sWcKh!6qC2XXh$n}tuKsu(cBx_*59x*}zqFj&#NJGGYg-hO> zaz?IwG#b4^Bw|=*q1#{NhC*--&so$CZTnwjl%h}4xjts+Y*|cB#4%v<=2UPoYY@k} z6{}&eAqIZO`7!LttDP#xSyEHVcOcb*1~S7&_JZOuC<;##UU)07>aj@0PypXhIV${O z-xr@C;XB|SJwbsPbtxtqtQslg&7I9oV4tYG+|al`mH*OF4qq<(wiZQZ$O>5{W5EXU z)2W#H$0OrliIT^@Vu_{3?8hyp9pTQjjj@R(CLd)f7?O_H)Uz>gt zRK2fyZYfo+mUS(b+j#x?+i#OuU%zX((%PhnalW}Ml8R&DiGh?I8Hh_%wy^ISnHCo? zf_!OpgCm3`qyQQZY7|84i*A%c4F(dViqs)RWYakAB7&&=BxnGwp_0%C<@c}bdosR8 z&(F!*7}uyfY28zQ%5K}^Hyu^7IcgM8$S5dxi5hjuY zGq0|X9-oMXs!77;HK(sFK|b~gcomLUS+rD*D+P2Lv*+j|oFumuUeo9}xiOXc8eeU+A0e1}3pa4LUwRcU=F5-8LDwzik7=@H zGz$wBpu=B5!67Q|Iy*K5oVI!D5|6Ykfvb^}@k%6`5e1p;Q}(*Z#AUcTt$)t+ZRUDT zl<)H3Kj6hTZ<8ZaJG1b`)eg;6Ami)>=~?M7H3A(vYTZtSbLZ6_k7L*{y5frGR?>E z82{Og9WXd~ettQv^}1$X=jlV|X`Wp2W6vJNdrN`DDE4T1+Le+H+&`vP@M0PFN%UJJ zp5)hlyaY#l9x}>lU#tsu!rDTpR4L=yVb|CL5yB5uEC??BZ6x8AgL zg}_xHY+vR@po&HtLo&%<34ok;1yXX)Gr$hfU~Hx!D`(i?uqsASow7_)9l*R$)&(glfS3jH1s3l>h-DO5e!dd3 zK9#R8DClG4HuGb&ygJdsP#JcaNsknNm?}3Fm;>_Q*2T06nz}R0%U{HHU$eIHgB%iG-2shi$xN{9>k_%acoJYx5(5QBVOs&R5Z+-E(bmca zsbM9%t^T_@n{H+1pCzB=kj8aT60>qxWUA`A(L^5h33Ev789tInNCviqYF78uzgg`e zJpe>K-0UpsmfNyRD30mK`h8sMhUR7zefe6uDLf;;mc7gUqgGW}u^P+7j7uIXc8%)- zGMU`h-<`AqdHG z#9$z>raMewVvF7~cS?$pPKaXNpG@i&yYM{ud2O8E!#fSD)ykTKZFDE}o$kGvST4Qy zfF(?*W#o;VDDlH-grIX~FfqE!mlM#WZ&qJScGm8apqmP?d+a%kUScQ!88pdl%j?t& zZ~{PM1+dW&GnuLh8U6nwcXq9*Q>^BY=dep)d~iw~)MyoaKTbjj84%7@2*{naP0zj1{av%CeX+7S<)}6M z>zkR_+=Kr?z}aTH!?%2^Q^>*-e~Rm^rE<$V+inlFXN4AlTduXm2e7jC(GjvMF&rkK zN0@(sgIMUHT@#!Bujv8L`GE@C&bD8Pw?uU?np*(`)JW$-RHNGBb53CHfK1H&`t0ht zqH3v;wk3-<{*@lLTUaqhdgFyPy|&ko@`P{0BL~hyBrrU2BKt$>inP8pc=!CABM(AT5N%DTs(<4sO;v+V)6n zR8qlAzGFmJVg;tZ$Q>f#sdQ7R9nnThckiMPVhGo#0t+}ouR24lb=b|3SEVLT z*keM{_9PWOBb?ODn#~}-lG+3DY$8_}nvFGthV@P2%HUD|n8|OZ%78yUGQ#5U!ihCA zk2{l|%bW8IivX1iB{S7p+b8G;Cs^%uBCCxT&rTAhiBaSYG9s76NciIx8BJKPbiS=x&5*6O z!G)$_ZRWCe@=(+np+bZ}lrwKMi$JtHpF$JOZht>8RvIzIGGP7*1(JSS!Y_%b|ewMy_`BRZ;pY?X8}az2p&Pqv+)gwV%WX_14SwL zym7)+7%YLk|3*&kfl4*=UB5=xbKv5B(KRzeV2TEq#Wfr5*WNQi5Qhqi9Ngn$Rz;eWCBNGZ(SAW%U6Q|tl@-u!Cc zG_M2NuwsMus4cU7ocj8rNG4sqW&wrg)NAc`RINbi$9T;7qbJp2J+H&aTUTucv#XJCmrL zW@OON^|L>aINvbOU+|=i9~^vb zyd(MMemP~``b4*gNhiT!^R||tMB)!xNxO7=j+cfUot0+cO&XAB3K4`P3g-W9byX_( zeV)vX3;z-a34k8?0w#oxMuL}og7wa#%{@1EtYXmiqq(vM-^44bn~+>Iw zt@CzTv6Io8u)p;sI8Q zXYT15(HwF~6dxaNT0Wje#g5AbG?4O>>4#cv4N0StV>iA;6lN0Fy5_7yig^!5<{663 z+0vkm6Wt?0U_@Z&4qCnyk`ey^op>F4Y{|D`T}9KG6})bf(Vv!t`b*A2u!hAM-qflh>0M2boI_ zBy}_xm`eArQBHI37o}>ZYqYAkRa7H3ZZL|OrDVFwT`L~->QvhB1l6CKI&k9wfA%#? zi1=rT&LWQrmt}VWzn!-XwWYy1gP~SN+}h<3_GoltSHF0=l{;HXpbyD!ED5-{%Ay4O z%pRxu$<^b;SSLot=e@bBQ@Ev|AHSM#*y&M?N;{N&H-PDyL5O3tm_%M1P3c7<0{y(d z6t|rWQY8(5yWjl~8u+Y5h;|1;v?|%EI9iR!976`cODVo5WXmt&#ab*vq3#{JOjZFD z2U*1$E~zUJA|7H`+L}=Bx6-Qn>nlF-fB}hi`WzZ@Y1WLZ=5{69ezAZUI;-{3hQyS6 z!@>u@eDpv46Iw?+17&xG>wNjgH8jL7l(gbul)kE~ycmw)IjzhF`UIe|Zmi7FqHha#fUl|9+v!RQtr^6Z} z`yLLxw58^V7p}vVpv{4mxhdr<+y?mH5wLZ>-;~hmfy}lae5Ib6XQaIuO>8i{krwx` zJjgRr{nC#d#oQvi62_zP1H#T}gu*LL;4~MYQljqOH_{pRGYTU`!Xwg1|QU%2u3csF-5ebvR|34L{~oY8bCaXHg^sddx& z(R5NThjoDVDH@lsxyJOxZ%d{_x@O~Q2CJ=My%9-p8kpF&FUI6$0TKb|g+BJzMA=MD z5qlCJsl1E?bShMcg(LSZO{t>Gnz1cim(4t;4uM0x@@~8Ae0%BXy5@ypg+Qf}P2b_P zop97N5g1>?yxpR}2&7Fyt!n?$|7Sw`fkGsFBJ5o3Q!B*tj}9*f33-{J(wsfxsOt~< z#ObnY`=lC~(HO%qrtYx@*xZbYXCY@WwWjrKuSFuUhOv7RdS>*n87=~PP>2;-Ji7FD zAHhG!A!?PLlTSVePF%b=t|^|W;;qTeBv5zgvizp~&8FCtS*P;Gp5Ky$T||~O0Z)I9 zYau9d!4PRCj4Ea9;`nm1irfjde(y7#Ga}+0-$7u!E6>AtI%X=PQhLncr?TA??*8tE zSL{4@O~)tkUh6P&D&9j_=TP6;U_tlzd~x)ht3Gd1VpwF3@i9R17+^jIIfl3nLQETQ zh0rOuc6vdEftVLr>hJ6@4Qm?U6i6=P4hIbDTaOaQ`t%y+_Cv{#f?VN>BkE68EtkWWVBAENc{n zO_9^?o9zbVqGJq)hqh9_+_q*53Bm}fNLmPToh|EDaM}ikQ`sPgZ`Ut z{vhW1W@r(MG6$s7=r3-CKaANjZdS%g z2@eL?qMcMRwRL$1g*h@*7NWLz6J>Hxa1}2iDu8?aAQG}!Nt>$T3#=TBmWAwfmN9;W@03MH0{EiGJ7k*@>Y?uZSK;AC-H5$M57Yk$}J>Kbk1%? zf=JsBUpTjj45OX9R88wO+HAtF!acZsz+MI2t_#T!YtBQC?81Hvt~zgSiw|yXiVahg zfOvaSsytJ8xr+hmYbWc$;(e=M{dU#d!!^<`HP|WaL+o^gfSUwgYZGdACy)REdDYN( z;*^k3)$6cS4fTosQp9US^CsUC3}d8$m3b#AeoWz1!`E4nsmKC8enumjj7{zaySJ^RVt^4{rr*ER|%Z~GEzQNCJ+xFIylfT=Z_LM&OCA7AMo017^ za}ZXR=@uvOK+g5mqZ@AqXa~jto$Flh6{OShs-*do!3vf@W zsCjfp%)W<&q4lL`aWJlZufjKA9E}^fnn*I1`elgk3QeQAbDvhf=;%${LoLZ}GYQtm z8D?(myWNvPv3m-JohH= zzo+B4L>upH!pX4Cgy=bbKleLw*}+?Um6lgup$u6-)U87!V89Q`HXpSK8;c8rh#_VM zvXM(@5>fmvV;V+h}lT?OM7%|g=jj~k8Q}bA_U9i5hs~INSUM{A@>K@KD-$CQnm3N%1`sO&6hwl@J3;ifOBILoo!RW)%TAYyo&wcnufMQ9TH7VGhWk zAcSI>SD}N!8dmDfxM?;VQo%2!Oq$em=5NbHOx>KmY4Kcp`g~Myr(4%;uJG+A4Eixe zM)-K1{1WF-g7%J7c~it1Y*ZHehTL*KG}+eKy~vM$@z9ERpXb_b zqhPRsA}PJ2oSdCbFf&y=jH>t!jIV@ZZTBM5+<2S;2d!%ZSDju}Qzeje+-`yp`Ck*O z7WW+i2bZIg#+UC=gK<6`iz+`h3aJ9s@OHO;&7d>a&tMG+=QDq;n)_+p#n-}v3qLrp zF@trb`4ecM`ZcEdI(M5d})HYs*LYSYOWEtF>?qQWVgS!*({(U%9Fk zc1|!w=REeWDV`S!|smZq!2I9Q+*~EGcDlQ@i zu6IBqy>C8K9<23KU22Mt96!%7S(FVfCohBo`ls3Tt5)~;TEnnc{2KzQX?U(mW4-N>{w_NU$_WYFxKHRIKwT^Y`6x}H4L@vZzTjz@CYTe`oEStKF{=AaxDPq7t zDq||66|_;CAE?n}VpzbH%hUt0)vpKl3P;q&?2x$o6hwoNA{BvwCWIMp+W+S2Iiil@ zZxDw)!nmx2rD0P%6(d1X62?`rxdz^%u?=%{ml76R!WX1=+e=atK6L6JQVlY93oL{Y z3cr?l@Yx&O!k>*=#-o#HIqu{B8A%&cqb|^t9>2F=hoN6Zj|P|pFD`P+Y;-tmURm+( zbbWS?w5_insUkWIISkbrwls0kOQMHl;+{B$yUUwAtevU*w#@Ip z@0zuZhzcuMgnaXxtEyrmk3Ui#wAX09?YJSy`sLw)Pf@e!>@lMK&KOU!ny_UrZ5KhOOz$i&A$Tzqx(zad25~{_q>N5 zti^wa_q=>iQvCA$S&{hgxqY0@!g%pcC+nN&(xXBINtiX_qj?{{{`g{cp7tBu;ab^F zWvz>=*=-X3lD6DY4#j;HFUp4PRp80BQoEUd#$2LjIP|IKm0@el#VA~K`l4O28%ttZ z%>I;8`_pFRRV<2BE)Opc@$#IZ<*+#k0GtmV@Xnm)drqmf+i@T8G(}v%f1eMNadz$4l1pPIZ3E#2>k}Mm z`G=tEJXr{=L%^P;<*qoJ;&p|#m;^Xp zZ)FuHUt23vPR_%^)DG87#yiJR+Pz3oAE*7UyHN3gAf6(d=S=G}Mv3MLD(gElC)J2NxiGB9o(GA(uC*63X_~o}k$4(ZM z)*X}d6wm+AZt8T~{MY4y@(Vg^lqN({uyEm$yJHST!7y5&j#L8nOrDS>YVbeE0kmxH zuqW#r$7R24L!08>%P$lYqhn~UH|LhtR8LB8(qX|mjiN|pE1F%vllf=5N=VG=NzC;` z+29g={&3)064W9#h|r~;L_jVK+_y*JU(cTo4h1Xdl?GI9U5CG#r|QN=V{u z`<5$~&0{RVvB#i;)+y?j=#MVPoy2s#505S7@tdyO!pHlXX zb<<8ZQ!p*-TCYt$A+nx$nBtYWBWeK^4o?{Gm;z64ALF}O6D1T0taiSZe~Vz;bBxJS z^k}g!7U=ca!p^r%{c#@gcU4;z!gO@+*^)K1jFK^csz}R_qCJ%Tv&O0usi`sB)Rg1s zr9vXv3s1U6uJtO|e?|r21Q(u8fH%BnvHZ-q9GjAUV;KkTwUQh=1$6#|=4hH+)cW_7fMYERFWh%fU_->@-{_j~H?!UUz3%4nYa%&~h^ zo|TI|)FMdL-RnDT5l0{wDJ!xTO1N?ab)+t!wHJWyYekhg7;X$LLN=GzE~|DgN%7)d zf3iUPOkzvx+r_{=LfwvZist#F@x z%WLj+{KTayN-XRCOh&339CRwHjKpt(qd@8181CSs%{P3Dol4fvhrXV7mx7)}F!E&P z^C&02^_;81d2A6xIU3a+2vNE_X4*V~!((I3u8D)?J~q}d5ce0ymr5gv#D1Sb z9!hgZNu;ViM0j3xS>J$Z7nwTeg104z9P}dVmKAhH?0i^V#o@2SCXo)?rjCliQOJl! z4aNhJv=RFm1pE^27}iT8Qu@$Ej=~3QBpL_Xmky%FuJs9AhnHz^_@5}HFy%fl3)cI}HNiD-uS+NA`SW?;svD{i8XT*x zDSejH$RV@0HL4i_&$r1EjRJFixe{58UVZy!J~$mg_m z_o4;rFw0>^zV6AWFxZbOZ(5@?a9Qc>+JeMC6`#AUJWXRpiA{<{=aoW`TSgIH94AB@ z6v6q&eA9^Q4S8PDSJFMnJF4{5lVB?S$Gdoy|LyV*a)EepKko@k06@eqWHP*gfd6(Y z|K%V4-yQoeoBW?*_>0`g{cKbl9h F`d`6lpMU@W literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..583313404e6afc815e18023bf3171d2270eaf772 GIT binary patch literal 5642 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 Ts~beau2=u&xc~3^mjwO;%sBDI literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..679376c89a1db0330f3ad0632aeebcddf23a3c93 GIT binary patch literal 45139 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 G^WOl$`Sqm$ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..79bf78c296538c91ef588b605d1e0a04538109a5 GIT binary patch literal 7523 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 R2OtDN?*7lU@_(X1{||)_yg~o~ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..990d8f1e68a0c9693db2394d8bae08ba8c7a49ce GIT binary patch literal 15986 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 Izkl`r0F`6o=l}o! literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..d9c371c15b3f4f26c1f2ca5f5dbef0ead07786ca GIT binary patch literal 20062 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..cadd93e6aa4e0a63dde7883449b5f51250e6934b GIT binary patch literal 18808 zcmc$k<8vil*zR|XiS3Dv9ou%YW822Wnb@}NWMbR4ZD)dsCz#~SJnwtHoPXeSRae*Q z{?J`l{qF0&dad>O<~RiSe-CMUbBDk8kpG^%0D!ay01_4!5fK#=6AzDwl$45!j){ql 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..354c35ab85f7295a0b83ec17009e23f5d55c48e4 GIT binary patch literal 5955 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 Q=3@14NBsZbzf9mi0EaAKQ2+n{ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..319348cd4e73f9d93867293d1c25df4cbfbaca0a GIT binary patch literal 17554 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 UO>CZ#`~RSD|C_7$f8%NY2ivd7H2?qr literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..baf7a87948f927e3866f918b3d8faa4935066988 GIT binary patch literal 15046 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..18a514261a361930a0efeb62cf09d6faf8d4bb46 GIT binary patch literal 46393 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..db773015fa0682866b91be40e169a2f2c83e8b5d GIT binary patch literal 61440 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..4d999f26e9d46c1ff5f96f38015d57b5bcf57966 GIT binary patch literal 53603 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 rBE`-HI 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

    Q@8$}#5Y3nPOZPMi5k8d=a(lpLu6Q5{f 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 L|N653pRWEFy)nea literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..1e5601c65a5b6176d461154a11a03a294809bb9d GIT binary patch literal 49841 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..701e150ca6812ab6840d812be9a6e8a569d2e1db GIT binary patch literal 38243 zcmc$_RaaZx_s1LDEybY_+}*9X7I&8dEnd91ySuwP#hv2rPH}fA?&QGp|DBuj2F@BI zBO^N(d*-`7)7IPpKil>J{=ZAw=KIh0YiRE;R{$W<7yu0mkBEx?2@8kdGcgGnH7z|O zGdmX#pP;a)xTLJSqOz){ww{5J=?`;DTYE=m7Y{FA|G?1j$mrOll(dYTyu#wr%IccB zhSv7ZuAYIR(edfo`Nie+&F$U&-)#&*Y|sA%L>bhvoZ3pf*^YTUy~pW$>D{B z|NE3^-1v8g>i_-X|L=G3f5M^Z(|k*D_5mWXGciT{24MbY6;y5yRg40RFIAL-_Y}np zm>qgkR^%5raBM4=+ur+W0C19w00zhHv}0f4s*RX=gLlT9fl=n5?F!Ri3a zV000HoVTiLSq>cw@tM!xm==^M6lMQG zk?dv7nVqRxFXFmL+~GOAfklzqJPbek7QA+cC~b*~WEU&EVyyhoLiEr2c$5A@e`7~; zxRAr&jtjlKU{nSjqw*7UkL&;^E7UWm#ERB{dL?%Di{MvXrC)cHCgeZ>016i6f|gaU zK}ybksZfW5^Ed?jVhO7J>t6)3-H6yc4ej)H4MlA5SqC$&LH+6bpT8}Pg;u1yyhPO= zAt-YRkTA4x{dOP7Q39qo{H^;tuzgRft(%7`U6g^*4^{Z0Ct>@lpq96|S0t<#S4UP} z&Rg1>AN8u}`h}M<<7^N#3}XX~q~(%(b0G&=;i!^btu+`RRDVkcI{~Sh=CutIxrC!y z`ht}ca>O6HL)`aDn`ENwdSnryl$nx)7E&m<1O>#;~NKKag{90SiXhSFBL!*nZ zFUs@zoWNS1gNwy#mozWjzTcy28B8x!X5`mbtm2)?exY8JH?Ov?U81-yEoiO&pp||= zq9B2JR|FsGiW*xcK+Ka$D=u4y=2va<&x28kArw0u21qM(Ro(u3G%c(N8jZ&t#n9Qi zP_Xx8>-8w!aTb1ZwS8sXc`a-d{ni^zi*I)8L#W{3oWZJlKpu- zzj^!Vzu1(hnh)f7e4>rAEr%=GApX{z3BZJd$WqssZd1J@@8E?M-|g|+qFkhp@gKge z8sgL7wzCkIruBXr9b8R?3)G+q2J&ZsBxQaj+`l;qo69o#pInIC@{;B`2*sf$olM&o zSE1k}CQ|PV!MxHv#o51vN;qBFVc5!dF+u}Hn*3bVJ{R=ep7J6%F0o+J9{;87{s-KK zlfZbtEdT-)`%kKJ4OL-Nb;rwvHzVFZny?dMuzD|=HZ62g*6x;c5n%Ouc6m*CCmuS-2cq=kM$|?W?L=}^jV5u*PrljbKa8Mjd=2RT$zMt9>jl(MO1e-<3waRHJ z)hhOhs2U0UK9ExZOkrf39#rT+oK;k~co0otbC$f(jsF7Mf1yIfOdYXK${Qa%C&MTB zffY8;F}PY%Ls*7}5A9nb7>%Upk?+FCWI=~aWW1}!@=x)2z8J;k^e$0Wp+;@PTrCkl z8u_|wj{Fhh@A4up8}LIAm;fQ%hvJM4L42>;5SYC@Eh>q zL@aH9|8`2H%tmNRC1-|bN(G&i^A(z<>9@4V7i^PHMJmT-A>K1h1zt(GuI^jMYn&|= ze?{fU?2AVj7I4}YX?83YfDR}V3}WYGsOTrKhy8{FYCeqJ4{sQ}R>ni|WmjYtvMB8H zb9Rkk*8M>42Ox&V)p(}^+Yi8a%5RouD1nhf$J9*J{`pc$V7o|d4D5UMC?1ls;t+;G z#UjDPqSnVhwUV*XNhVPH;YDeQV8S3F$oTd~K!W7K6bwiA3=Vg|K||q3f~P1emf>iYW5L*6 zrrf0vWc;}g^H8AUuO)a9f)7)~C9H){m(lN>z}P7SE`MCfZ8&X^TOXKi+e?x5L1zZw za4oTtL0*}+8axBTyRDh0yumLxb64gi_vq!5F?n=kMew>mw`NsNX%ta^egz3p$muFU`{CMouET|!M??k1*xmbH9zTgmdS`VPpR6LRN~93%Cp8tuN?h3 zZ-_nf)I%ns_+=AT0Wk#tbOFp27pddm@hb^PCRnI77~{iBR=2oM9{flzfz6>XO{^SJ z*{lSjs$|hMzO3x5CM^%t;OBhz=s|Pc!|AQs7M{T zgU9I>x`Iw%cl#v%v)KTOt7|0-x>hWK#o-#bq&YI5@RPce3sh&G^vmqS00 z3kSrM+Uf0WVf#UrTY6$9r-c9fS1X~)qJ2kwaj=Qt%Zq_&Zek>UU?E^>U%35mMrY1q zW3lV41T{%`7k_=7E=U`y#V4vx9%7F#g?7^cc8^Mfj9d6`Vl2~nNA0(IfvO!-N#}Eq zP+b+8YDycK>hqsle>8f%CyFV097LS)eoX@qyA}RXCKWGv@0eMl>v$w!5rbXa(0k5+ z$Xy8Xnlvj<+uf?aim$z#I=!&=Ia@6C;zt-W&a!*LwZ8Z$6%81({v^sBO#gwJ$?w?b z^!+xGaQotZI6=_T{>jSz{0?NKtA0YBnWHxLS*4mR7_(e51Tx!ZcRm462n6w=#Ztdi z3g!s3VtXKaOXMd`@@(b6jNp7wj~L&mF*9_1R8MO_eH7KmmVK}*Vy!H=&I+_j`|hl^ zeQCavuX;Lrd(Ohkl>j8g$66>V*;-@g;t(d69C`npib9%YAB-rBgpQ&WM;YJAN| zZ!@||1fWhz8~bFzjQValF8<2_%*QHt$Azh}Or1QNa|xXRF+x z{DZ5Qyok49Vj+3erWxF^nO`b5$A$mE=zur68MdV?4|3m5uKw*btR%f zl|=s=x(E_E(BvB$ptR4b(OzTQi?ga{T01bm_gEk173Z5=EebmDzJ39N4PLl@-V^QR zQ~1N63w|RV;H;?FRtGx7Gp%lE) zkP}LVB}GN=`N|~txj;GONZhU+iuB2{obncyBZ0_TH>L9OxeM zKn#Ml)-iLd?Sryli+2hf27g|*3<-Huk9WPkE z-hQ^KR@#T_Jg6UOx(bAqAIp1Jw)6-aJLDw*08s+K1rTdq31j;IO$C#?0#-ke>jy-S zD`|Zow@+SHAHf*X7^&#H@9phwznWqkf)1Uf=1nWsn&D@7sIVBOGilIH&Vhx+UWEZ+ zwpLm#@RhnG!%Ct>Vf^i($!bd3=2TEP`w9?WQvyl#%lpP!Nkgc`n^AwL zF|s?j)MAjo0O$G=jdaU?t|%sF+d$w{o-f`Ww1?x|eWa2uYBdVzkM?vMSnKAzt;+zs?w=N4BLEB;mrm(7)9 zX@kiuJ{XcAb!{ql>bW{m1n8MTd8aR0%!U#GfFU5WApwn`AdQaOa`Xea6+rYni(3AX zWA|NES$hOy3TkYs$Fvi5#AmvBWypApG~*B{A$9zu=rF?pD``Q&&)w<@6;I}IkUG_4 zIZ+3de?l2(#>i;%8- zQQoT-tlYABEvYyfDMKjd8n%Fv+-1*CSCtMnOWuFOreUUZU#@=Fu?=k?ALbH<;mQoE z0l#TMCcFGWi&gjjL8=5~(@S7{NvN_kJf0p*M;if$lC<$2`93y@*vcllvo@kfmuRJr#Kasc4kO%)Q z^^G6Dw;kPRPfXg)O5+D|=MeEq6w<|8cYZQu zG>#pNwl$LX90uVGT12I0J~X@%@CU=G({WG;R#FN|9kbnv5miQ|!9*y8F!4tI>#dVa zf3r52JQ)t-kFUzHESYDbI9KK;i?dQAbelwBB2eIgMnX5f^9C#&KrW;Rs#7R!vFx`=vUX`+NgcLHaUy?bHo@<&ejtARR8mqRYC})yW3+9mqmf{dD`vlPkaz{RKp*nIE9d3TC z%lUV`h;M9q)GNdREz6oU_zJ zh3NMRo(HooKq`<-4}y${`lT?{%1~ANX{(d>&W^ zv)?}}lj+!b@Txa-z|okunps?=n`;>Pq~df)`k#awm2cY^+6+cXH3#0d`m9nGx#(vO z&n;>K@+YpZ4a&MUI@PbI3hHN{Mymc>qyv#GXnUpVAtpd(>f#?JFJ!GS!b#75770 z_`o?WWO%N;fzAwHLx2$Esr!=$$c=YaphYQyZvo;a?#BwQ#=abbxGzk5opYv(*rm(=9vT?OU&FqNB78tL?HfILf%H^EEZ zUxN@%ku8$GuG5__0mTN%ZY1h&tomcyPnJ*XdUBWb=?NjoOcb0|#@GqOFGKL^$V3x_ z4s7?Q-nb;<|eO%x(!f$GV6~99(4S48&6;< zs=rtEP#CGQcJq}6t`yAx_>V5-va;)BAiqqk$5alLtM1f%>;bmzRk|QvWMiz+)gFX- zNH_)I2l1$0@f}t1=GjX5Hw&)6a?uYiL5IU4l3|Ixp}U`1GB+b&koIJ&@);u^SxZNe@cFV?>CVf3JM~n5ADG} zGDL+4@{mQ6!m1f3#f+ad$p>zT|(6TjFPcsP_-n?mf5F~kuE5St+cqF;yiFw>aSNU2YCRoOwp^`4=}IMu59Jv0vSe7Tfy2jX+%r5kUC({{|U zyg^Fu)WJg-1-~wqxi#&nf9uoVIBVASGq(Nk)gwS$rh;Vg5f>tVNl8O;zSf+4@d1xX zh|~=Z-)LJ!l3|RY^No0FZ2Z$=Zow(3{Ff!|7amZ;LP7O2CUW|wH0_G|$W9HF$um3u zIC=9IC396?Cow}&f=TkQvF6%y@Z|}vZR#X6kL0#mwb?~V(O?tH8GO;0clu^hx#(1rs3n7y zv>JEX77PtpZi+G8MfxaZ3fh!4Xq%`gj(y!?vMq)UG@)5qVbt#X%df8Kp7ph!adIBs ze$@F^iQ{seIytYg%IGU;3;#75p@BYCbt6ZHLiyMNpy& zprJmrvh1MQT}xv^sCHF!{0LaeLcJ3F^3cOtS1gByZzpy<{Wm0ra?y~g8HV)ArUp%a64 zV!(fz0fZxe<`f2zyESMFqR8ze4h+JF3ffdS|Je#Zj+i2kYoOF

      rF5w9%7_!~&s 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
      + +
      + +

      SoundManager 2: Javascript Drum Machine Demo

      +

      Trigger the pads to play different sounds.

      +

      View with debug output

      +

      Photo: MPC 2500 by .schill on Flickr

      +

      (If supported): Your browser is cool and is using 100% HTML5 Audio. Look ma, no Flash!

      +
      + +
      + +
      + +
        +
      • 1
      • +
      • 2
      • +
      • 3
      • +
      • 4
      • +
      + +
        +
      • q
      • +
      • w
      • +
      • e
      • +
      • r
      • +
      + +
        +
      • a
      • +
      • s
      • +
      • d
      • +
      • f
      • +
      + +
        +
      • z
      • +
      • x
      • +
      • c
      • +
      • v
      • +
      + +
      + +
      + +
      + + + +

      |h}Dq@t{9Bx6r#ryHl`2AlK4 zhi6-;;Y=2nNL_74$9i=xT3BdH?5r0-&nO#m)jBRVmiAJens6p_W1wEO3~sry$A?R4EGBuNW+1e7>dW94?C@P%z#>zYAd8Z;r@q24gl3D zjUw69mAwewgdjm{zmv0Rff*0BCqWd3f+~hOxyhb73W6b@6|A!Ip^{V1GMk0tYj)p_ zG6IW}qN))2GIzOv%k~b(UAl_!3-P5_w+jTp_acWOjg{R;C*~JtZhe;`8ZX`$JR*PK zDV+9hiu~;QEolg{pIw5<8-{s&Y2N3yM%r323zG6#k{$NhqZA zmV}7ka8f6yY%iv2{NZYR$pW0~plbB~2hq-`0p<*&aMt(u!-j(V==w`fY^6pJNnAO$ z4qoXn!MnocH?_ss$mjGo3Q40<|LmGIw;4^tAs4JHjtUj}S?>O8#R#ZdQ6A(1(ROM+ zZFcyXr*l0w)%7i099l$a7W*mMVoc3EX^t(B2ptVQfp2G)^Vo{!Fx-kDBNgPJ^0P>M zLN-qcTjCuEKaft)QixkOc7o;!#D$%3%THH!S}9VhD_b^+&gdVxxG*wVWs1qqNv*Fc znUj#<>;cntRYw}SmasC(o=KZ^k-ngAmea}h>6OpfzR=pksmY)RN0jlvYoq!oh^u4G2768tHQnIeiJD+|PwOK_XM7Zkf=2Wn}cESl~>d$BWxbjd?w(84V~SEQr0li%%ogv!Ro zd`+64mgo~MWws@w&wy0ExAXLj&-i`%@%wZ2q)5@^(a=Dih^@mnsZeR-VCn zqN3QomhH6_$>&EJbPFxHzgVkXclom!;doQcRrFJoo`I61x@d0H;~+07fq4dH-&)(D zH+1m~&{P~B>RJKI{g}U9LBzyQ@Y*XGA9D^mH={tndkFu;mE&~I}C*w z9S~Gk8mr3ZY?;Qy^B>I8h8STE5T1E)!I0m-`q?3(9zFJqJ89iZYf~s4DxFNJteU8c zPtJ8+f+@5p-q?McDcdPza}QUcN*l;zSiie$02U*Z%bMAnQf6&YO5-GvgyO z^7*fPT2AVc{HZ^Kn!)DjeO;zOBTt90(Ig#8cFZ|*1iYRq=_Eg>QJM^@KAHWOa$%6D z&v*x!Z&g)4lukqthMjA6{NpK>F-8}WBcvS^-5W(j({M?ZR3qC>B8AHdoaxLUZJ^X% zuWQj%H?#$zGVjf`L$*LRr4L)8^x+>!$YRo@fNLsPvPN3^@ zyf7Wz@u@p*BLg3dIkH;qm0Krf7A3yx;v^&0;wX{@RarTsp88CFmCIc>8ObVO=ryoJ zoH`0HuqHERjF&6$ssu-us&|D~M6r%fCx$5-1Q2aAK$L@qfmGV#3aL)KI}}pD!zs55 z6*(|lg7P0J%^m!#nO+IEfwqY>tbnEOLPptPv7J}~Yy|>ryR&^;(_j|dD=9+8y`o!1f z<@}Jf8BGbTPq#aJ^Qrj^9=^2y7D-Jlxl7_G7aSY>&aS(8fK682NjCNySxdueZ~o0n z4;_XVPeZd;I`@TcE^pDcet>iE_kL5rlGlAoAiDz(89aM$?ma)dtc*w7$(9 znlysdq|q&Cm6@#LDcC6>^bqb~ocF0TkWhXJqS;hZ7vc(1BWA&PE(MI+AN(Wz4h}eU zgqoP7KJ=MH==_GUA~fSmc>=WB5mvX-_`_a%V|H6g>E);e9&&&UN{(lho EFS9%J^#A|> literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css new file mode 100755 index 00000000..cddf9f0d --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css @@ -0,0 +1,158 @@ +/* Demo/example CSS - not needed for general use */ + +body { + background:#000; + font:normal 75% "helvetica neue",helvetica,verdana,arial,tahoma,"times new roman","sans serif"; + color:#fff; + margin:0px; + padding:0px; +} + +#background { + position:absolute; + left:0px; + top:0px; + width:100%; + height:100%; + background:transparent url(http://farm1.static.flickr.com/45/191496680_97cdc5351b_b.jpg) no-repeat 50% 50%; +} + +#site { + position:relative; + z-index:2; + background:rgba(0,0,0,0.5); + padding:1em; +} + +#site h1 { + margin-top:0px; +} + +#site p { + margin:0.5em 0px 0.5em 0px; +} + +#site p:last-child { + margin:0px; +} + +.clear { + float:none; + clear:both; + font-size:1px; + line-height:1px; + height:1px; + overflow:hidden; +} + +#mpc { + position:absolute; + left:50%; + top:50%; + margin-left:-19em; + margin-top:-19em; + width:38em; + _width:37.3em; + border:3px solid #666; + border:3px solid rgba(255,255,255,0.25); + border-radius:12px; + z-index:2; +} + +#mpc #wrapper { + position:relative; + background:#333; + background:rgba(0,0,0,0.5); + padding:0.5em; + border-radius:12px; +} + +#mpc ul { + margin:0px; + padding:0px; + margin-left:2px; + *margin-left:1em; + _margin-left:2px; + padding:2px 0px 2px 0px; +} + +#mpc ul li { + position:relative; + float:left; + display:inline; + width:7em; + height:7em; + margin:0.5em; + background:#999; + border:1px solid rgba(0,0,0,0.75); + border-radius:2px; + font:normal 1em/1em "helvetica",verdana,arial,system; + padding:0.5em; + cursor:pointer; + cursor:hand; + color:#eee; + text-transform:uppercase; + font-weight:bold; +} + +#mpc ul li span { + text-transform:none; + font-weight:normal; + color:#ccc; +} + +#mpc ul li.active { + background:#666; +} + +#mpc ul li div { + /* progress indicator */ + position:absolute; + left:0px; + bottom:1em; + font-size:1em; + line-height:1em; + height:1em; + margin:0px 0px 0px 1em; + width:6em; + background:#888 url(../image/progress.png) no-repeat -256px 0px; + background-repeat:no-repeat; + border:1px solid #666; + visibility:hidden; +} + +#mpc ul li.active div, +#mpc ul li.loading div { + visibility:visible; +} + +#soundmanager-debug { + position:absolute; + right:20px; + bottom:20px; + height:12em; + width:50em; + overflow:auto; + margin-left:1em; +} + +#soundmanager-debug div { + font-size:11px; + font-family: "lucida console",system,verdana,arial; /* IE doesn't seem to obey short-hand font family here? */ + padding:0px 1em 0.5em 0px; +} + +#mpc-debug, +.note { + color:#999; +} + +#mpc-debug a, +.note a { + color:#6699cc; + text-decoration:none; +} + +#isHTML5 { + display:none; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png new file mode 100755 index 0000000000000000000000000000000000000000..cfd26fbefabe18c952631a1821f2cb697dba9a48 GIT binary patch literal 1452 zcmV;d1ylNoP)pz1rQA65Tlt*DfA~Q|!@(Fiu-2U3yK2>{k6p8G?qTdaFyX}0E|Mz8 zJt}KQ!J?J#bNwmbJZ4zeAy=khzQ>GLdK1`Z`V(hd9$0(P{As9P1CQ86`=^HNtoW1<&l^K6GfqElsPx-lYrTPczDS?t} zpwWufJ3_`n)hW9mZyN8q6X9NOzaIGQJRk~t3FH@OEbk(y+1ILxvG_Qg^HN7CFkfMhGh@`NQqRIFvCUmO)t&E2A=$VKrr z8?7+G4ymG=2ofu&Ws+F`jai+AY+u)`$hL^_~{KFj=y~$=IjcY2X~5g zlpt}*^P;OWM30q3u$z|>VG?=!W{(U;F$MWddHQz4A}kxx#N7lu%2K6xDI_2t9xftJ zxallK2CGmaK_?i6ZOs&xV2c;;ZiT24$}6q)+=X#qwuLHapdeAb%F_&w?uNX z%B2fM;v0Erpx9(xk2X+VDO6gf))rOq{$>RMxUZ<5rDxOMO-ETGl<2VG>6nfMly?L#T+X{p_SZqVfnq)P@KY?F+M01Es^z z2<7x8#*rs zXUhG?%y=XEQuPS^ax0`J+tkC#(jtwbe#N~Jd4i*%DVOK{eLBcVqfu_^vZHjPDOg?q z8@ni$ZcavBt(Py$im;t^3e!aRsWJJyowkN(B(&ARBAU0-(T(1fe-)y00SX^ z>v8P9914Te03ZMe00MvjAOHve0)PM@00;mAfB+x>2mk|D7jP%bx&jyg0000 + + +SoundManager 2: A Javascript Sound API - MPC Demo + + + + + + + + + + + + +

    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js new file mode 100755 index 00000000..c53912c0 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js @@ -0,0 +1,134 @@ +/** + * SoundManager 2: MPC (Drum Machine) demo + */ + +var MPC = function() { + var self = this; + this.idPrefix = 'btn-'; // HTML ID prefix + this.statusWidth = 6; + this.progressWidth = 256; + this.keys = {'1':0,'2':1,'3':2,'4':3,'q':4,'w':5,'e':6,'r':7,'a':8,'s':9,'d':10,'f':11,'z':12,'x':13,'c':14,'v':15} + + // scope within these event handler methods: "this" = SMSound() object instance (see SMSound() in soundmanager.js for reference) + + this.showProgress = function() { + // sound is loading, update bytes received using this.bytesLoaded / this.bytesTotal + if (self._getButton(this.id).className != 'loading') self._getButton(this.id).className = 'loading'; // a bit inefficient here.. + self._showStatus(this.id,this.bytesLoaded,this.bytesTotal); + } + + this.onload = function() { + var sID = this.id; + self._getButton(this.id).className = ''; + self._getButton(this.id).title = ('Sound ID: '+this.id+' ('+this.url+')'); + } + + this.onfinish = function() { + self._getButton(this.id).className = ''; + self._reset(this.id); + } + + this.onplay = function() { + self._getButton(this.id).className = 'active'; + } + + this.whileplaying = function() { + self._showStatus(this.id,this.position,this.duration); + } + + this._keyHandler = function(e) { + var oEvt = e?e:event; + var sChar = String.fromCharCode(oEvt.keyCode).toLowerCase(); + if (typeof self.keys[sChar] != 'undefined') soundManager.play('s'+self.keys[sChar]); + } + + this._showStatus = function(sID,n1,n2) { + var o = self._getButton(sID).getElementsByTagName('div')[0]; + var offX = (n2>0?(-self.progressWidth+parseInt((n1/n2)*o.offsetWidth)):-self.progressWidth); + o.style.backgroundPosition = offX+'px 0px'; + } + + this._getButton = function(sID) { + return document.getElementById(self.idPrefix+sID); + } + + this._reset = function(sID) { + var id = sID; + self._showStatus(sID,1,1); + setTimeout(function(){self._showStatus(sID,0,0);},200); + } + + this.init = function() { + document.onkeydown = self._keyHandler; + } + +} + +var mpc = new MPC(); + +soundManager.flashVersion = (window.location.toString().match(/#flash8/i)?8:9); +if (soundManager.flashVersion != 8) { + soundManager.useHighPerformance = true; +} + +soundManager.setup({ + url: '../../swf/', // path to load SWF from (overriding default) + bgColor: '#333333', + wmode: 'transparent', + debugMode: false, + preferFlash: false, + html5PollingInterval: 50, + onready: function() { + + soundManager.setup({ + defaultOptions: { + autoLoad: true, + multiShot: true, + whileloading: mpc.showProgress, + onid3: mpc.onid3, + onload: mpc.onload, + onplay: mpc.onplay, + whileplaying: mpc.whileplaying, + onfinish: mpc.onfinish + } + }); + + // This is the "onload" equivalent which is called when SoundManager has been initialised (sounds can be created, etc.) + mpc.init(); + + if (!soundManager.html5.needsFlash) { + document.getElementById('isHTML5').style.display = 'inline'; + } + + var soundURLs = 'AMB_BD_1,AMB_FTM2,AMB_HHCL,AMB_HHOP,AMB_HHPD,AMB_HTM,AMB_LTM2,AMB_MTM,AMB_RIM1,AMB_SN13,AMB_SN_5,CHINA_1,CRASH_1,CRASH_5,CRASH_6,RIDE_1'.split(','); + for (var i=0; i + + +SoundManager 2 Demo: Play MP3 links on a page, "page as playlist" style + + + + + + + + + + + + +
    + +

    SoundManager 2 / page as a playlist, basic template (flash 8)

    + +
    + +
    + + + +

    For alternate themes, add the class to the playlist UL - eg. <ul class="playlist dark"> or <ul class="playlist bubblegum">; the base default is <ul class="playlist">.

    + +

    A reminder that if loading from the local filesystem, Flash will deny access to remote (network/internet) URLs by default unless whitelisted via the Flash Player Global Security Settings Page. Some URLs in this example are remote to demonstrate this.

    + +

    Note that by default, the Flash 8 version is used and therefore Flash 9-only features such as the VU meter, waveform etc. are not available. Refer to the main "page player" demo for configuration examples, or view the source of page-player.js for the configuration object (similar to that used in SoundManager 2 itself.)

    + +

    SoundManager 2 project

    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css new file mode 100755 index 00000000..89776425 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css @@ -0,0 +1,124 @@ +/* + ----------------------------------------------------------------- + In-page demo CSS for code, documentation etc. + See page-player.css for actual playlist-relevant stuff. + ----------------------------------------------------------------- + */ + +#soundmanager-debug { + /* SM2 debug container (optional, makes debug more useable) */ + position:absolute;position:fixed;*position:absolute;bottom:10px;right:10px;width:50em;height:18em;overflow:auto;background:#fff;margin:1em;padding:1em;border:1px solid #999;font-family:"lucida console",verdana,tahoma,"sans serif";font-size:x-small;line-height:1.5em;opacity:0.9;filter:alpha(opacity=90);z-index:99; +} + +body { + font:75% normal verdana,arial,tahoma,"sans serif"; +} + +h1, h2, h3 { + font:300 3em "Helvetica Neue",georgia,"times new roman","Arial Rounded MT Bold",helvetica,verdana,tahoma,arial,"sans serif"; + margin-bottom:0px; +} + +h1, h2 { + letter-spacing:-1px; /* zomg web x.0! ;) */ +} + +h1, h2, h3 { + float:left; + clear:both; + border-bottom:1px solid #999; + padding-bottom:1px; + margin-bottom:0.25em; +} + +h1 { + margin-top:0px; + margin-bottom:0px; + background-color:#666; + color:#ccc; + margin-left:-5px; + padding-left:5px; + padding-right:5px; +} + +h1, +h1 a { + color:#fff; + text-decoration:none; +} + +h1 a:hover { + text-decoration:underline; +} + +h2 { + font-size:2em; + margin-top:1em; + background-color:#aaa; + color:#fff; + padding:5px; + margin-left:-5px; + min-width:23em; +} + +h3 { + font-size:1.65em; + margin-top:0.5em; + margin-bottom:0.25em; + color:#333; + min-width:28em; +} + +h3 a { + font-size:small; +} + +h4 { + color:#444; +} + +ul.notes { + margin-left:0px; + padding-left:1.5em; +} + +.note { + margin-top:0px; + font-style:italic; + color:#999; +} + +pre { + font-size:1.2em; + _font-size:1em; +} + +code { + font-family:"lucida console",monaco,courier,system; + font-size:1em; + color:#003366; +} + +code span { + color:#666; +} + +ul, +p, +pre { + clear:left; + max-width:46em; +} + +ul.tight li { + max-width:44.5em; +} + +ul.playlist { + /* undo the above nonsense */ + max-width:none; +} + +ul.tight { + padding-left:1.5em; +} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css new file mode 100755 index 00000000..16b4964c --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css @@ -0,0 +1,162 @@ +/* + ------------------------------------------ + -- annotations (sub-tracks, notes etc.) -- + ------------------------------------------ +*/ + +ul.playlist li a.sm2_link .metadata { + display:none; /* hide by default */ +} + +ul.playlist li.sm2_paused a.sm2_link .metadata, +ul.playlist li.sm2_playing a.sm2_link .metadata { + display:inline; +} + +ul.playlist li ul { + list-style-type:none; + margin:0px; + padding:0px; + position:relative; + font-size:small; + display:none; +} + +ul.playlist li ul li { + position:relative; + margin:0px; + padding:2px 3px; + border:1px solid transparent; + border-radius:6px; + margin-right:1em; + font-family:helvetica,verdana,tahoma,arial,"sans serif"; + font-size:x-small; + font-weight:300; + letter-spacing:0px; + background-color:transparent; + opacity:0.66; +} + +ul.playlist li ul li:hover { + opacity:1; + background-color:#fff; + border-color:#ccc; + color:#666; +} + +ul.playlist li.sm2_playing ul li, +ul.playlist li.sm2_paused ul li { + color:#fff; +} + +ul.playlist li.sm2_playing ul li:hover { + background-color:#fff; + color:#5588bb; + border-color:#336699; + opacity:0.9; +} + +ul.playlist li.sm2_paused ul li:hover { + background-color:#888; +} + +/* metadata */ + +ul.playlist li .metadata .duration { + /* optional timing data */ + display:none; +} + +ul.playlist li .metadata ul li p { + margin:0px; + padding:0px; +} + +ul.playlist li .metadata ul li span { + display:none; +} + +ul.playlist li .controls .statusbar .annotation { + position:absolute; + background-color:transparent; + top:0px; + color:#666; + text-align:right; + margin-left:10px; + height:0.5em; +} + +ul.playlist li .controls .statusbar .annotation:hover { + z-index:12; /* sit on top of note */ +} + +ul.playlist li .controls .statusbar .annotation span.bubble { + /* using · */ + display:inline-block; + background-color:#fff; + border:1px solid #666; + border-radius:6px; +} + +ul.playlist li .controls .statusbar .annotation span { + display:block; + background:transparent url(../image/divot.png) no-repeat 50% 0px; + width:15px; + margin-left:-15px; + height:12px; + text-align:center; +} + +ul.playlist li .controls .statusbar .annotation.alt { + top:auto; + bottom:0px; +} + +ul.playlist li .controls .statusbar .annotation span:hover { + cursor:none; /* Fx3 rules. */ + margin-top:0.1em; +} + +ul.playlist li .controls .statusbar .annotation.alt span:hover { + margin-top:-0.1em; +} + +ul.playlist li .controls .statusbar .annotation.alt span { + background:transparent url(../image/divot-bottom.png) no-repeat 50% bottom; +} + +ul.playlist li .note { + position:absolute; + display:none; + left:0px; + top:0px; + z-index:10; + font-size:x-small; + padding:2px 4px 2px 4px; + width:auto; + color:#666; + background-color:#fff; + border:1px solid #ccc; + border-radius:6px; + font-style:normal; + font-weight:bold; + font-family:arial,tahoma,verdana,"sans serif"; + letter-spacing:0px; + margin-top:1.1em; +} + +ul.playlist li .note.alt { + margin-top:-1.32em; +} + +ul.playlist li .note:hover { + display:block !important; +} + +ul.playlist li .sm2_divider { + font-size:0.75em; +} + +ul.playlist li .sm2_metadata { + font-size:0.65em; +} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css new file mode 100755 index 00000000..0b85b44e --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css @@ -0,0 +1,200 @@ +/* + --------------------------------- + -- alternate (optional) themes -- + --------------------------------- +*/ + +ul.playlist.dark li.sm2_playing a { + color:#fff; +} + +ul.playlist.dark li.sm2_playing .timing, +ul.playlist.use-peak.dark li.sm2_playing .peak { + color:#999; +} + +ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container { + background-color:#222; + border-color:#444; +} + +ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container .spectrum { + background-color:#999; +} + +ul.playlist.dark li.sm2_paused { + background-color:#333; +} + +ul.playlist.dark li.sm2_paused a { + color:#999; +} + +ul.playlist.dark li.sm2_playing, +ul.playlist.dark li.sm2_playing:hover { + background-color:#333; +} + +ul.playlist.dark li:hover .controls .statusbar { + background-color:#666; +} + +ul.playlist.dark li .controls { + background-color:#333; +} + +ul.playlist.dark li .controls .statusbar { + background-color:#666; + border-color:#444; +} + +ul.playlist.dark li .controls .statusbar .position { + background-color:#111; + border-right:3px solid #111; + border-radius:3px; +} + +ul.playlist.dark li .controls .statusbar .loading { + background-color:#444; +} + +ul.playlist.dark li .timing, +ul.playlist.use-peak.dark li .peak { + background-color:#222; + border-color:#444; +} + +ul.playlist.dark.use-peak li .peak .l, +ul.playlist.dark.use-peak li .peak .r { + border-color:#444; + background-color:#999; +} + + +/* gold theme */ + +ul.playlist.gold li.sm2_paused { + background-color:#996600; +} + +ul.playlist.gold li.sm2_playing, +ul.playlist.gold li.sm2_playing:hover { + background-color:#cc9900; +} + +ul.playlist.gold li .controls { + background-color:transparent; +} + +ul.playlist.gold li .controls .statusbar { + background-color:#fff; + border-color:#fff; +} + +ul.playlist.gold li .controls .statusbar .position { + background-color:#996600; + border-right:3px solid #996600; + border-radius:3px; +} + +ul.playlist.gold li .controls .statusbar .loading { + background-color:#ffeedd; +} + +ul.playlist.gold li .timing, +ul.playlist.use-peak.gold li .peak { + background-color:#CC9900; + border-color:#ffcc33; +} + +ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container { + background-color:#cc9900; + border-color:#ffcc33; +} + +ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container .spectrum { + background-color:#fff; +} + +ul.playlist.gold.use-peak li .peak .l, +ul.playlist.gold.use-peak li .peak .r { + border-color:#fff; + background-color:#fff; +} + + +/* ZOMG PONIES!!!ONEONEONE */ + +ul.playlist.bubblegum li a { + font-family:"comic sans ms",verdana,arial,tahoma,"sans serif"; /* heh */ +} + +ul.playlist.bubblegum li.sm2_paused, +ul.playlist.bubblegum li.sm2_paused:hover { + background-color:#ffccee; +} + +ul.playlist.bubblegum li.sm2_paused a, +ul.playlist.bubblegum li.sm2_paused:hover a, +ul.playlist.bubblegum li.sm2_paused .timing, +ul.playlist.use-peak.bubblegum li.sm2_paused .peak { + color:#ff6699; +} + +ul.playlist.bubblegum li:hover { + background-color:#ffddee; +} + +ul.playlist.bubblegum li.sm2_playing, +ul.playlist.bubblegum li.sm2_playing:hover { + background-color:#ff7799; +} + +ul.playlist.bubblegum li .controls { + background-color:transparent; +} + +ul.playlist.bubblegum li .controls .statusbar { + background-color:#fff; + border-color:#fff; +} + +ul.playlist.bubblegum li .controls .statusbar .position { + background-color:#ffaacc; + border-right:3px solid #ffaacc; + border-radius:3px; +} + +ul.playlist.bubblegum li .controls .statusbar .loading { + background-color:#ffeedd; +} + +ul.playlist.bubblegum li .timing, +ul.playlist.use-peak.bubblegum li .peak { + background-color:#ffaacc; + border-color:#ffccee; +} + +ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container { + background-color:#ffaacc; + border-color:#ffccee; +} + +ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container .spectrum { + background-color:#fff; +} + +ul.playlist.bubblegum.use-peak li .peak .l, +ul.playlist.bubblegum.use-peak li .peak .r { + border-color:#fff; + background-color:#fff; +} + + +ul.playlist.shiny li.sm2_paused, +ul.playlist.shiny li.sm2_playing { + background-image:url(../image/top-highlight.png); + background-repeat:repeat-x; + background-position:0px -1px; + _background-image:none; /* can't be bothered with IE 6. */ +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css new file mode 100755 index 00000000..9c0098fa --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css @@ -0,0 +1,307 @@ +/* + + SoundManager 2: "page as playlist" example + ------------------------------------------ + http://schillmania.com/projects/soundmanager2/ + +*/ + +.spectrum-container { + display:none; +} + +ul.use-spectrum li.sm2_playing .spectrum-container { + position:absolute; + left:0px; + top:0px; + margin-left:-266px; + margin-top:-1px; + display:block; + background-color:#5588bb; + border:1px solid #99ccff; + border-radius:4px; +} + +ul.use-spectrum .spectrum-box { + position:relative; + width:255px; + font-size:1em; + padding:2px 0px; + height:1.2em; + overflow:hidden; +} + +ul.use-spectrum .spectrum-box .spectrum { + position:absolute; + left:0px; + top:-2px; + margin-top:20px; + display:block; + font-size:1px; + width:1px; + height:1px; /* set to 50px for a thick line, 1px for a thin line, etc. */ + overflow:hidden; + background-color:#fff; +} + +ul.playlist { + list-style-type:none; + margin:0px; + padding:0px; + +} + +ul.playlist li { + /* assume all items will be sounds rather than wait for onload etc. in this example.. may differ for your uses. */ + position:relative; + display:block; + width:auto; + font-size:2em; + color:#666; + padding:0.25em 0.5em 0.25em 0.5em; + border:none; + letter-spacing:-1px; /* ZOMG WEB X.0. ;) */ + background-color:#f9f9f9; + -webkit-transition-property: hover; + -webkit-transition: background-color 0.15s ease-in-out; + -moz-transition: background-color 0.15s linear 0s; /* firefox 4 */ + -o-transition-property: background-color; /* opera 10.5 */ + -o-transition-duration: 0.15s; + +} + +ul.playlist li a { + display:block; + text-decoration:none; + font-weight:normal; + color:#000; + font-size:120%; + outline:none; + position:relative; + z-index:2; +} + +ul.playlist li.sm2_playing, +ul.playlist li.sm2_paused, +ul.playlist li.sm2_playing a { + color:#fff; + border-radius:3px; +} + +ul.playlist li:hover { + background-color:#eee; +} + +ul.playlist li:hover a { + color:#333; +} + +ul.playlist li.sm2_playing, +ul.playlist li.sm2_playing:hover { + background-color:#6699cc; +} + +ul.playlist li.sm2_paused { + background-color:#999; +} + +ul.playlist li.sm2_playing:hover a, +ul.playlist li.sm2_paused a { + color:#fff; +} + +ul.playlist li .controls { + display:none; +} + +ul.playlist li .peak, +ul.playlist.use-peak li .peak { + display:none; + position:absolute; + top:0.55em; + right:0.5em; +} + +ul.playlist li.sm2_playing .controls, +ul.playlist li.sm2_paused .controls { + position:relative; + display:block; +} + +ul.playlist.use-peak li.sm2_playing .peak, +ul.playlist.use-peak li.sm2_paused .peak { + display:inline; + display:inline-block; +} + +ul.playlist.use-peak li .peak { + display:none; /* IE 7 */ +} + +ul.playlist li.sm2_paused .controls { + background-color:#666; +} + +ul.playlist li:hover .controls .statusbar { + position:relative; + cursor:ew-resize; + cursor:-moz-grab; + cursor:grab; +} + +ul.playlist li.sm2_paused .controls .statusbar { + background-color:#ccc; +} + +ul.playlist li .controls { + position:relative; + margin-top:0.25em; + margin-bottom:0.25em; + background-color:#99ccff; +} + +ul.playlist li .controls .statusbar { + position:relative; + height:0.5em; + background-color:#ccddff; + border:2px solid #fff; + border-radius:2px; + overflow:hidden; + cursor:-moz-grab; + cursor:grab; +} + +ul.playlist li .controls.dragging .statusbar { + cursor:-moz-grabbing; + cursor:grabbing; +} + +ul.playlist li .controls .statusbar .position, +ul.playlist li .controls .statusbar .loading, +ul.playlist li .controls .statusbar .annotation { + position:absolute; + left:0px; + top:0px; + height:0.5em; +} + +ul.playlist li .controls .statusbar .position { + background-color:#336699; + border-right:3px solid #336699; + border-radius:3px; +} + +ul.playlist li.sm2_paused .controls .statusbar .position { + background-color:#666; + border-color:#666; +} + +ul.playlist li .controls .statusbar .loading { + background-color:#eee; +} + +ul.playlist li .controls .statusbar .position, +ul.playlist li .controls .statusbar .loading { + width:0px; +} + +ul.playlist li.sm2_playing a.sm2_link, +ul.playlist li.sm2_paused a.sm2_link { + margin-right:4.5em; /* room for timing stuff */ +} + +ul.playlist li .timing { + position:absolute; + display:none; + text-align:right; + right:1em; + top:1em; + width:auto; + height:1em; + padding:3px 5px; + background-color:#5588bb; + border:1px solid #99ccff; + border-radius:4px; + letter-spacing:0px; + font:44% monaco,"VT-100","lucida console",courier,system; + line-height:1em; + vertical-align:middle; +} + +ul.playlist.use-peak li .timing { + right:4.25em; +} + +ul.playlist li:hover .timing { + z-index:2; +} + +ul.playlist li .timing div.sm2_timing { + margin:0px; + padding:0px; + margin-top:-1em; +} + +ul.playlist li.sm2_playing .timing, +ul.playlist li.sm2_paused .timing { + display:block; +} + +ul.playlist li.sm2_paused .timing .sm2_position { + text-decoration:blink; /* hee hee. first actual appropriate use? :D */ +} + +ul.playlist li.sm2_paused .timing, +ul.playlist.use-peak li.sm2_paused .peak { + background-color:#888; + border-color:#ccc; +} + +/* peak data */ + +/* ul.playlist ... */ + +ul.playlist.use-peak li .peak { + display:none; + zoom:1; + border:1px solid #99ccff; + padding:2px; + height:0.55em; + border-radius:4px; + background-color:#5588bb; + width:0.8em; + height:0.55em; + margin-top:-3px; +} + +ul.playlist.use-peak li .peak-box { + position:relative; + width:100%; + height:0.55em; + overflow:hidden; +} + +ul.playlist li .peak .l, +ul.playlist li .peak .r { + position:absolute; + left:0px; + top:0px; + width:7px; + height:50px; + background:#fff; + border:1px solid #fff; + border-radius:1px; + margin-top:1em; +} + +ul.playlist li .peak .l { + margin-right:1px; +} + +ul.playlist li .peak .r { + left:10px; +} + +#control-template { + display:none; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png new file mode 100755 index 0000000000000000000000000000000000000000..929b42d3022e3e3766eed5455c31740d65b9dc43 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^{6NgX!2%?EZsk@2sRU0K$B+ufWChj@Mjsdr^-ktI zzpeg-S8~P%Povg|y|uso|G(Q^6jj7yz_B>O?&t;ucLK6V8 Cm^cyu literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png new file mode 100755 index 0000000000000000000000000000000000000000..76c5ee537d76bd5269f00b66014a2b2ec9b50c0f GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^{2p7^bmrD{zOh|HI_E8MW zpa1WF{r5$4rpYk#7%3P=Zl0Sz|AKkT%OfmncxoKZ7;rJ{nC)40d8dCF&_)JNS3j3^ HP69*YC91r6&DGMdRITw;u~I^fK{!%F7C z5&4Be409Qn4iqyoaVRt}FmW94WnjF)31oh#OIKECRJ(6t4z!EG)78&qol`;+07ob< A2LJ#7 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html new file mode 100755 index 00000000..678d2e8f --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html @@ -0,0 +1,379 @@ + + + +SoundManager 2 Demo: Play MP3 links on a page, "page as playlist" style + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    SoundManager 2 / "Page as a playlist"

    + +

    Muxtape.com-style UI, MP3/AAC Player Example

    + +

    This page uses Flash 9-based effects where supported. The default config uses Flash 8.

    + +

    You can also try enabling experimental visualization features.

    + +
    + +
    + + + +

    MPEG4 / H.264 + HE-AAC (Flash "MovieStar" 9.0r115+) format support - audio-only example

    +

    A subset of MPEG4 is supported including AAC, FLV, MP4, M4A, MOV, MP4V, 3GP and 3G2 files.

    + + + +

    Basics

    + +

    Don't want a Flash 9 requirement, EQ/waveform, perhaps less CPU? See Flash 8-based basic demo.

    + +

    Clicking a title will start loading + playing, or pause, a sound.

    +

    Once loading, click (or click and drag) on the loading/position bar to seek within the sound.

    +

    The document title reflects the currently-playing sound, and by default the list will play sequentially if left alone. (This is configurable.)

    + +

    Themes

    +

    Just for fun, a few color schemes (visible when playing/paused):

    + + +
    +
    + +
    +
    + + +

    Experimental (Alpha) Variant: MP3 "Metadata": Annotations / notes / sub-tracks

    +

    A potential approach to noting interesting moments in sounds, scene changes, new tracks in seamless DJ mixes etc. Keep in mind this is a single MP3 being loaded, but annotations are placed along the timeline as shown.

    +

    A "metadata" element contains a nested list of data (UL/LI combination) - in this case, a summary of each scene - and the time at which this item occurs/begins. In order to help with positioning, the total length of the sound is also specified up-front. View the source code of this page for the details.

    + +
      + +
    • + A Virtual Haircut (3 scenes) + +
    • + +
    • + Rubber Chicken Launch (Office) + +
    • + +
    + +

    How It Works

    + +

    This example uses SoundManager 2 to find links to MP3 files within an unordered list, and makes them playable "in-place" on a page. The script assigns CSS classes to links' parent LI nodes to indicate their state (playing/paused, etc.)

    + +

    Progressive Enhancement

    + +

    This provides a nice HTML base for all browsers and user agents, and enhances progressively for those with Javascript and Flash. Links pointing to MP3s are assigned an onclick handler which intercepts the click (preventing the browser from following the link and unloading the page. SM2 will then create sound objects as needed to play the MP3s. In the event there is an error at runtime or a lack of support (no JS/Flash etc.), the browser will simply load the MP3s directly as it normally would. This includes iPhones, etc.

    + +

    HTML Fragments (UI Element Templates)

    +

    Each item in the playlist has its own set of controls and progress indicators, etc. This content is defined once as a hidden template of HTML in the player JavaScript file, separate from the playlist markup, and is cloned for each item as needed. This can be easily styled with CSS as well, of course.

    + +

    I'd like to use this.

    +

    See this basic demo for reference.

    +

    The basic demo uses the default Flash 8 configuration, but you can easily change this to use Flash 9 features. The only difference in code is the configuration.

    + +

    A reminder that if loading from the local filesystem, Flash will deny access to remote (network/internet) URLs by default unless whitelisted via the Flash Player Global Security Settings Page. Some URLs in this example are remote to demonstrate this.

    + +

    Configuration + Options

    + +

    Default configuration

    + +

    Behaviours such as auto-start and UI elements like VU meters and spectrum graphs are easy configurable, using an object literal format as shown below.

    +

    The page player config (see related page-player.js file) as below.

    +

    The custom parameters used to make this demo page are highlighted in red.

    +
      // ( within page-player.js )
    +
    +  soundManager.setup({
    +    // If you need flash 9, include this line.
    +    flashVersion: 9
    +  });
    +
    +  this.config = {
    +    usePeakData: true,     // [Flash 9 only] show peak (VU-meter) data
    +    useFavIcon: true,      // try to show peakData in address bar (Firefox + Opera) - requires usePeakData = true too, of course.
    +    useWaveformData: true, // [Flash 9 only] true: show raw waveform data - WARNING: CPU-intensive
    +    useEQData: false,      // [Flash 9 only] show EQ (frequency spectrum) data - WARNING: CPU-intensive
    +    fillGraph: false,      // [Flash 9 only] draw full lines instead of only top (peak) spectrum points
    +    allowRightClick:true,  // let users right-click MP3 links ("save as...", etc.) or discourage (can't prevent.)
    +    useThrottling: false,  // try to rate-limit potentially-expensive calls (eg. dragging position around)
    +    autoStart: false,      // begin playing first sound when page loads
    +    playNext: true,        // stop after one sound, or play through list until end
    +    updatePageTitle: true, // change the page title while playing sounds
    +    emptyTime: '-:--'      // null/undefined timer values (before data is available)
    +  }
    +
    + +

    Per-page configuration override

    + +

    Alternately, you may override the defaults on a per-page basis by defining an "alternate configuration" object before the page-player.js file has been included in your source code:

    + +
      // ( before soundManager.onready() has fired )
    +
    +  soundManager.setup({
    +    // If you need flash 9, include this line.
    +    flashVersion: 9
    +  });
    +
    +  var PP_CONFIG = {
    +    usePeakData: true,     // [Flash 9 only] whether or not to show peak data (no notable CPU cost)
    +    useWaveformData: true  // [Flash 9 only] show raw waveform data. WARNING: Experimental, likely CPU-heavy
    +  }
    + +

    Any options specified in PP_CONFIG will override the defaults defined in page-player.js.

    + +

    Basic CSS

    + +
    + If you want to make your own UI from scratch, here is the base:
    +
    + ul.playlist {}
    +
    + Default + hover state, "click to play":
    +
    + li.sm2_link {}
    + li.sm2_link:hover {}
    +
    + Playing + hover state, "click to pause":
    +
    + li.sm2_playing {}
    + li.sm2_playing:hover {}
    +
    + Paused + hover state, "click to resume":
    +
    + li.sm2_paused {}
    + li.sm2_paused:hover {}
    +
    + +

    The positioning (load status / control bar) template is also applied after each MP3 link, from an element named "control-template"

    + +

    "loading" and "position" have background colors applied, and have their width adjusted dynamically by SM2 as the sound(s) load/play. "timing" is replaced with the current time / duration, eg. 1:23 / 4:20

    +

    The class names applied can be edited within the source JS also, for convenience.

    +

    The controls are shown and hidden via the same dynamic CSS updates. See the source CSS for the timing / status bar layout.

    + +

    Performance Considerations

    +

    Experimental Flash 9 features

    +
      +
    • +

      Dynamic "favicon" VU meter

      +

      The VU meter "favicon" option as shown in the address/location bar for Firefox and Opera can cause a lot of disk access in Firefox (2.x/3.0 at time of writing, from what has been reported.) It may be garbage collection-related.

      +

      The behaviour seems to be connected to the dynamic swapping of <link> elements with data: URIs containing the VU meter data, and looks to be noticeable with the first sound played - after which point things settle down. Perhaps the browser is attempting to cache the favicon data being assigned.

      +
    • +
    • +

      Waveform/spectrum visualization graph

      +

      Enabling the waveformData and/or eqData features will result in some heavy DOM calls (manipulation of 256 <div> elements with each "frame" drawn) which can eat up a good amount of CPU and may make really old computers cower in fear.

      +

      Ultimately, the UI refresh rate will simply be limited if a CPU ceiling is hit, and audio playback should not be affected.

      +
    • +
    + +

    More CSS comments

    + +
    +
    +
    + SoundManager 2: "page as playlist" example
    + ------------------------------------------
    +
    + Clicks on links to MP3s are intercepted via JS, calls are
    + made to SoundManager to load/play sounds. CSS classes are
    + appended to the LI parent, which are used to highlight the
    + current play state and so on.
    +
    + Class names are applied in addition to "sm2_link" base.
    +
    + Default:
    +
    + sm2_link
    +
    + Additional states:
    +
    + sm2_playing
    + sm2_paused
    +
    + eg.
    +
    + <!-- default -->
    + <li class="sm2_link"><a href="some.mp3">some.mp3</a></li>
    +
    + <!-- playing -->
    + <li class="sm2_link sm2_playing"><a href="some.mp3">some.mp3</a></li>
    +
    + The script also injects an HTML template containing control bar
    + and timing elements, which can also be targeted with CSS.
    +
    +
    + Note you don't necessarily require ul.playlist for your use
    + if only using one style on a page. You can just use .sm2_link
    + and so on, but isolate the CSS you want.
    +
    + Side note: Would do multiple class definitions eg.
    +
    + li.sm2_default.sm2_playing{}
    +
    + .. except IE 6 has a parsing bug which may break behaviour,
    + applying sm2_playing {} even when the class is set to sm2_default.
    +
    +
    + If you want to make your own UI from scratch, here is the base:
    +
    + Default + hover state, "click to play":
    +
    + li.sm2_link {}
    + li.sm2_link:hover {}
    +
    + Playing + hover state, "click to pause":
    +
    + li.sm2_playing {}
    + li.sm2_playing:hover {}
    +
    + Paused + hover state, "click to resume":
    +
    + li.sm2_paused {}
    + li.sm2_paused:hover {}
    +
    +
    + +

    SoundManager 2 project home

    + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js new file mode 100755 index 00000000..0faa0e35 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js @@ -0,0 +1,142 @@ +// SoundManager 2: Page Player demo, MetaData UI prototype + +/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, newcap: true, immed: true */ +/*global pagePlayer, document, window */ + +var Metadata = function(oSound) { + + var self = this, + pl = pagePlayer, + oLI = oSound._data.oLI, + o = oLI.getElementsByTagName('ul')[0], + oItems = o.getElementsByTagName('li'), + oTemplate = document.createElement('div'), + oTemplate2 = document.createElement('div'), + oTemplate3 = document.createElement('div'), + oDuration, i; + + oTemplate.innerHTML = ' '; + oTemplate.className = 'annotation'; + oTemplate2.innerHTML = ' '; + oTemplate2.className = 'annotation alt'; + oTemplate3.className = 'note'; + + this.totalTime = 0; + this.data = []; + this.data.givenDuration = null; + this.data.currentItem = null; + this.data.mainTitle = oSound._data.oLink.innerHTML; + + this.strToTime = function(sTime) { + var segments = sTime.split(':'), + seconds = 0, i; + for (i=segments.length; i--;) { + seconds += parseInt(segments[i],10)*Math.pow(60,segments.length-1-i); // hours, minutes + } + return seconds; + }; + + // make stuff + this.createElements = function() { + var oFrag = document.createDocumentFragment(), + oNode = null, + oNodeSpan = null, + oNode2 = null, i; + for (i=0; i= metadata[i].startTimeMS && now <= metadata[i].endTimeMS) { + index = i; + break; + } + } + if (index !== metadata.currentItem) { + // update + oSound._data.oLink.innerHTML = metadata.mainTitle+' '; + pl.setPageTitle(metadata[index].title+' | '+metadata.mainTitle); + metadata.currentItem = index; + } + }; + + this.refresh = function() { + var offset = 0, + relWidth = null, + duration = (self.data.givenDuration?self.data.givenDuration:oSound.durationEstimate), i; + for (i=0; i 3) { + args.pop(); // no capture + } + } else if (len === 3) { + args.push(false); + } + return args; + } + + function apply(args, sType) { + var element = args.shift(), + method = [evt[sType]]; + if (old) { + element[method](args[0], args[1]); + } else { + element[method].apply(element, args); + } + } + + function add() { + apply(getArgs(arguments), 'add'); + } + + function remove() { + apply(getArgs(arguments), 'remove'); + } + + return { + 'add': add, + 'remove': remove + }; + + }()); + + // event + DOM utilities + + this.hasClass = function(o, cStr) { + return (typeof(o.className)!=='undefined'?new RegExp('(^|\\s)'+cStr+'(\\s|$)').test(o.className):false); + }; + + this.addClass = function(o, cStr) { + if (!o || !cStr || self.hasClass(o,cStr)) { + return false; // safety net + } + o.className = (o.className?o.className+' ':'')+cStr; + }; + + this.removeClass = function(o, cStr) { + if (!o || !cStr || !self.hasClass(o,cStr)) { + return false; + } + o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); + }; + + this.select = function(className, oParent) { + var result = self.getByClassName(className, 'div', oParent||null); + return (result ? result[0] : null); + }; + + this.getByClassName = (document.querySelectorAll ? function(className, tagNames, oParent) { // tagNames: string or ['div', 'p'] etc. + + var pattern = ('.'+className), qs; + if (tagNames) { + tagNames = tagNames.split(' '); + } + qs = (tagNames.length > 1 ? tagNames.join(pattern+', ') : tagNames[0]+pattern); + return (oParent?oParent:document).querySelectorAll(qs); + + } : function(className, tagNames, oParent) { + + var node = (oParent?oParent:document), matches = [], i, j, nodes = []; + if (tagNames) { + tagNames = tagNames.split(' '); + } + if (tagNames instanceof Array) { + for (i=tagNames.length; i--;) { + if (!nodes || !nodes[tagNames[i]]) { + nodes[tagNames[i]] = node.getElementsByTagName(tagNames[i]); + } + } + for (i=tagNames.length; i--;) { + for (j=nodes[tagNames[i]].length; j--;) { + if (self.hasClass(nodes[tagNames[i]][j], className)) { + matches.push(nodes[tagNames[i]][j]); + } + } + } + } else { + nodes = node.all||node.getElementsByTagName('*'); + for (i=0, j=nodes.length; i playlist item, find previous
  • and then + if (o.previousElementSibling) { + o = o.previousElementSibling; + } else { + o = o.previousSibling; // move from original node.. + while (o && o.previousSibling && o.previousSibling.nodeType !== 1) { + o = o.previousSibling; + } + } + if (o.nodeName.toLowerCase() !== 'li') { + return null; + } else { + return o.getElementsByTagName('a')[0]; + } + }; + + this.playPrevious = function(oSound) { + if (!oSound) { + oSound = self.lastSound; + } + if (!oSound) { + return false; + } + var previousItem = self.getPreviousItem(oSound._data.oLI); + if (previousItem) { + pl.handleClick({target:previousItem}); // fake a click event - aren't we sneaky. ;) + } + return previousItem; + }; + + this.getNextItem = function(o) { + // given
  • playlist item, find next
  • and then + if (o.nextElementSibling) { + o = o.nextElementSibling; + } else { + o = o.nextSibling; // move from original node.. + while (o && o.nextSibling && o.nextSibling.nodeType !== 1) { + o = o.nextSibling; + } + } + if (o.nodeName.toLowerCase() !== 'li') { + return null; + } else { + return o.getElementsByTagName('a')[0]; + } + }; + + this.playNext = function(oSound) { + if (!oSound) { + oSound = self.lastSound; + } + if (!oSound) { + return false; + } + var nextItem = self.getNextItem(oSound._data.oLI); + if (nextItem) { + pl.handleClick({target:nextItem}); // fake a click event - aren't we sneaky. ;) + } + return nextItem; + }; + + this.setPageTitle = function(sTitle) { + if (!self.config.updatePageTitle) { + return false; + } + try { + document.title = (sTitle?sTitle+' - ':'')+self.pageTitle; + } catch(e) { + // oh well + self.setPageTitle = function() { + return false; + }; + } + }; + + this.events = { + + // handlers for sound events as they're started/stopped/played + + play: function() { + pl.removeClass(this._data.oLI,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLI,this._data.className); + self.setPageTitle(this._data.originalTitle); + }, + + stop: function() { + pl.removeClass(this._data.oLI,this._data.className); + this._data.className = ''; + this._data.oPosition.style.width = '0px'; + self.setPageTitle(); + self.resetPageIcon(); + }, + + pause: function() { + if (pl.dragActive) { + return false; + } + pl.removeClass(this._data.oLI,this._data.className); + this._data.className = pl.css.sPaused; + pl.addClass(this._data.oLI,this._data.className); + self.setPageTitle(); + self.resetPageIcon(); + }, + + resume: function() { + if (pl.dragActive) { + return false; + } + pl.removeClass(this._data.oLI,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLI,this._data.className); + }, + + finish: function() { + pl.removeClass(this._data.oLI,this._data.className); + this._data.className = ''; + this._data.oPosition.style.width = '0px'; + // play next if applicable + if (self.config.playNext) { + pl.playNext(this); + } else { + self.setPageTitle(); + self.resetPageIcon(); + } + }, + + whileloading: function() { + function doWork() { + this._data.oLoading.style.width = (((this.bytesLoaded/this.bytesTotal)*100)+'%'); // theoretically, this should work. + if (!this._data.didRefresh && this._data.metadata) { + this._data.didRefresh = true; + this._data.metadata.refresh(); + } + } + if (!pl.config.useThrottling) { + doWork.apply(this); + } else { + var d = new Date(); + if (d && d-self.lastWLExec > 50 || this.bytesLoaded === this.bytesTotal) { + doWork.apply(this); + self.lastWLExec = d; + } + } + + }, + + onload: function() { + if (!this.loaded) { + var oTemp = this._data.oLI.getElementsByTagName('a')[0], + oString = oTemp.innerHTML, + oThis = this; + oTemp.innerHTML = oString+' | Load failed, d\'oh! '+(sm.sandbox.noRemote?' Possible cause: Flash sandbox is denying remote URL access.':(sm.sandbox.noLocal?'Flash denying local filesystem access':'404?'))+''; + setTimeout(function(){ + oTemp.innerHTML = oString; + // pl.events.finish.apply(oThis); // load next + },5000); + } else { + if (this._data.metadata) { + this._data.metadata.refresh(); + } + } + }, + + whileplaying: function() { + var d = null; + if (pl.dragActive || !pl.config.useThrottling) { + self.updateTime.apply(this); + if (sm.flashVersion >= 9) { + if (pl.config.usePeakData && this.instanceOptions.usePeakData) { + self.updatePeaks.apply(this); + } + if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) { + self.updateGraph.apply(this); + } + } + if (this._data.metadata) { + d = new Date(); + if (d && d-self.lastWPExec>500) { + this._data.metadata.refreshMetadata(this); + self.lastWPExec = d; + } + } + this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%'); + } else { + d = new Date(); + if (d-self.lastWPExec>30) { + self.updateTime.apply(this); + if (sm.flashVersion >= 9) { + if (pl.config.usePeakData && this.instanceOptions.usePeakData) { + self.updatePeaks.apply(this); + } + if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) { + self.updateGraph.apply(this); + } + } + if (this._data.metadata) { + this._data.metadata.refreshMetadata(this); + } + this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%'); + self.lastWPExec = d; + } + } + } + + }; // events{} + + this.setPageIcon = function(sDataURL) { + if (!self.config.useFavIcon || !self.config.usePeakData || !sDataURL) { + return false; + } + var link = document.getElementById('sm2-favicon'); + if (link) { + _head.removeChild(link); + link = null; + } + if (!link) { + link = document.createElement('link'); + link.id = 'sm2-favicon'; + link.rel = 'shortcut icon'; + link.type = 'image/png'; + link.href = sDataURL; + document.getElementsByTagName('head')[0].appendChild(link); + } + }; + + this.resetPageIcon = function() { + if (!self.config.useFavIcon) { + return false; + } + var link = document.getElementById('favicon'); + if (link) { + link.href = '/favicon.ico'; + } + }; + + this.updatePeaks = function() { + var o = this._data.oPeak, + oSpan = o.getElementsByTagName('span'); + oSpan[0].style.marginTop = (13-(Math.floor(15*this.peakData.left))+'px'); + oSpan[1].style.marginTop = (13-(Math.floor(15*this.peakData.right))+'px'); + if (sm.flashVersion > 8 && self.config.useFavIcon && self.config.usePeakData) { + self.setPageIcon(self.vuMeterData[parseInt(16*this.peakData.left,10)][parseInt(16*this.peakData.right,10)]); + } + }; + + this.updateGraph = function() { + if (pl.config.flashVersion < 9 || (!pl.config.useWaveformData && !pl.config.useEQData)) { + return false; + } + var sbC = this._data.oGraph.getElementsByTagName('div'), + scale, i, offset; + if (pl.config.useWaveformData) { + // raw waveform + scale = 8; // Y axis (+/- this distance from 0) + for (i=255; i--;) { + sbC[255-i].style.marginTop = (1+scale+Math.ceil(this.waveformData.left[i]*-scale))+'px'; + } + } else { + // eq spectrum + offset = 9; + for (i=255; i--;) { + sbC[255-i].style.marginTop = ((offset*2)-1+Math.ceil(this.eqData[i]*-offset))+'px'; + } + } + }; + + this.resetGraph = function() { + if (!pl.config.useEQData || pl.config.flashVersion<9) { + return false; + } + var sbC = this._data.oGraph.getElementsByTagName('div'), + scale = (!pl.config.useEQData?'9px':'17px'), + nHeight = (!pl.config.fillGraph?'1px':'32px'), + i; + for (i=255; i--;) { + sbC[255-i].style.marginTop = scale; // EQ scale + sbC[255-i].style.height = nHeight; + } + }; + + this.updateTime = function() { + var str = self.strings.timing.replace('%s1',self.getTime(this.position,true)); + str = str.replace('%s2',self.getTime(self.getDurationEstimate(this),true)); + this._data.oTiming.innerHTML = str; + }; + + this.getTheDamnTarget = function(e) { + return (e.target||(window.event?window.event.srcElement:null)); + }; + + this.withinStatusBar = function(o) { + return (self.isChildOfClass(o,'playlist')) && (self.isChildOfClass(o,'controls')); + }; + + this.handleClick = function(e) { + + // a sound (or something) was clicked - determine what and handle appropriately + + if (e.button === 2) { + if (!pl.config.allowRightClick) { + pl.stopEvent(e); + } + return pl.config.allowRightClick; // ignore right-clicks + } + var o = self.getTheDamnTarget(e), + sURL, soundURL, thisSound, oControls, oLI, str; + if (!o) { + return true; + } + if (self.dragActive) { + self.stopDrag(); // to be safe + } + if (self.withinStatusBar(o)) { + // self.handleStatusClick(e); + return false; + } + if (o.nodeName.toLowerCase() !== 'a') { + o = self.getParentByNodeName(o,'a'); + } + if (!o) { + // not a link + return true; + } + + // OK, we're dealing with a link + + sURL = o.getAttribute('href'); + + if (!o.href || (!sm.canPlayLink(o) && !self.hasClass(o,'playable')) || self.hasClass(o,'exclude')) { + + // do nothing, don't return anything. + return true; + + } else { + + // we have something we're interested in. + + // find and init parent UL, if need be + self.initUL(self.getParentByNodeName(o, 'ul')); + + // and decorate the link too, if needed + self.initItem(o); + + soundURL = o.href; + thisSound = self.getSoundByObject(o); + + if (thisSound) { + + // sound already exists + self.setPageTitle(thisSound._data.originalTitle); + if (thisSound === self.lastSound) { + // ..and was playing (or paused) and isn't in an error state + if (thisSound.readyState !== 2) { + if (thisSound.playState !== 1) { + // not yet playing + thisSound.play(); + } else { + thisSound.togglePause(); + } + } else { + sm._writeDebug('Warning: sound failed to load (security restrictions, 404 or bad format)',2); + } + } else { + // ..different sound + if (self.lastSound) { + self.stopSound(self.lastSound); + } + if (spectrumContainer) { + thisSound._data.oTimingBox.appendChild(spectrumContainer); + } + thisSound.togglePause(); // start playing current + } + + } else { + + // create sound + thisSound = sm.createSound({ + id:o.id, + url:decodeURI(soundURL), + onplay:self.events.play, + onstop:self.events.stop, + onpause:self.events.pause, + onresume:self.events.resume, + onfinish:self.events.finish, + type:(o.type||null), + whileloading:self.events.whileloading, + whileplaying:self.events.whileplaying, + onmetadata:self.events.metadata, + onload:self.events.onload + }); + + // append control template + oControls = self.oControls.cloneNode(true); + oLI = o.parentNode; + oLI.appendChild(oControls); + if (spectrumContainer) { + oLI.appendChild(spectrumContainer); + } + self.soundsByObject[o.id] = thisSound; + + // tack on some custom data + thisSound._data = { + oLink: o, // DOM reference within SM2 object event handlers + oLI: oLI, + oControls: self.select('controls',oLI), + oStatus: self.select('statusbar',oLI), + oLoading: self.select('loading',oLI), + oPosition: self.select('position',oLI), + oTimingBox: self.select('timing',oLI), + oTiming: self.select('timing',oLI).getElementsByTagName('div')[0], + oPeak: self.select('peak',oLI), + oGraph: self.select('spectrum-box',oLI), + className: self.css.sPlaying, + originalTitle: o.innerHTML, + metadata: null + }; + + if (spectrumContainer) { + thisSound._data.oTimingBox.appendChild(spectrumContainer); + } + + // "Metadata" + if (thisSound._data.oLI.getElementsByTagName('ul').length) { + thisSound._data.metadata = new Metadata(thisSound); + } + + // set initial timer stuff (before loading) + str = self.strings.timing.replace('%s1',self.config.emptyTime); + str = str.replace('%s2',self.config.emptyTime); + thisSound._data.oTiming.innerHTML = str; + self.sounds.push(thisSound); + if (self.lastSound) { + self.stopSound(self.lastSound); + } + self.resetGraph.apply(thisSound); + thisSound.play(); + + } + + self.lastSound = thisSound; // reference for next call + return self.stopEvent(e); + + } + + }; + + this.handleMouseDown = function(e) { + // a sound link was clicked + if (isTouchDevice && e.touches) { + e = e.touches[0]; + } + if (e.button === 2) { + if (!pl.config.allowRightClick) { + pl.stopEvent(e); + } + return pl.config.allowRightClick; // ignore right-clicks + } + var o = self.getTheDamnTarget(e); + if (!o) { + return true; + } + if (!self.withinStatusBar(o)) { + return true; + } + self.dragActive = true; + self.lastSound.pause(); + self.setPosition(e); + if (!isTouchDevice) { + _event.add(document,'mousemove',self.handleMouseMove); + } else { + _event.add(document,'touchmove',self.handleMouseMove); + } + self.addClass(self.lastSound._data.oControls,'dragging'); + return self.stopEvent(e); + }; + + this.handleMouseMove = function(e) { + if (isTouchDevice && e.touches) { + e = e.touches[0]; + } + // set position accordingly + if (self.dragActive) { + if (self.config.useThrottling) { + // be nice to CPU/externalInterface + var d = new Date(); + if (d-self.dragExec>20) { + self.setPosition(e); + } else { + window.clearTimeout(self.dragTimer); + self.dragTimer = window.setTimeout(function(){self.setPosition(e);},20); + } + self.dragExec = d; + } else { + // oh the hell with it + self.setPosition(e); + } + } else { + self.stopDrag(); + } + e.stopPropagation = true; + return false; + }; + + this.stopDrag = function(e) { + if (self.dragActive) { + self.removeClass(self.lastSound._data.oControls,'dragging'); + if (!isTouchDevice) { + _event.remove(document,'mousemove',self.handleMouseMove); + } else { + _event.remove(document,'touchmove',self.handleMouseMove); + } + if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) { + self.lastSound.resume(); + } + self.dragActive = false; + return self.stopEvent(e); + } + }; + + this.handleStatusClick = function(e) { + self.setPosition(e); + if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) { + self.resume(); + } + return self.stopEvent(e); + }; + + this.stopEvent = function(e) { + if (typeof e !== 'undefined') { + if (typeof e.preventDefault !== 'undefined') { + e.preventDefault(); + } else { + e.stopPropagation = true; + e.returnValue = false; + } + } + return false; + }; + + this.setPosition = function(e) { + // called from slider control + var oThis = self.getTheDamnTarget(e), + x, oControl, oSound, nMsecOffset; + if (!oThis) { + return true; + } + oControl = oThis; + while (!self.hasClass(oControl,'controls') && oControl.parentNode) { + oControl = oControl.parentNode; + } + oSound = self.lastSound; + x = parseInt(e.clientX,10); + // play sound at this position + nMsecOffset = Math.floor((x-self.getOffX(oControl)-4)/(oControl.offsetWidth)*self.getDurationEstimate(oSound)); + if (!isNaN(nMsecOffset)) { + nMsecOffset = Math.min(nMsecOffset,oSound.duration); + } + if (!isNaN(nMsecOffset)) { + oSound.setPosition(nMsecOffset); + } + }; + + this.stopSound = function(oSound) { + sm._writeDebug('stopping sound: '+oSound.id); + sm.stop(oSound.id); + if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) + sm.unload(oSound.id); + } + }; + + this.getDurationEstimate = function(oSound) { + if (oSound.instanceOptions.isMovieStar) { + return (oSound.duration); + } else { + return (!oSound._data.metadata || !oSound._data.metadata.data.givenDuration ? (oSound.durationEstimate||0) : oSound._data.metadata.data.givenDuration); + } + }; + + this.createVUData = function() { + + var i=0, j=0, + canvas = vuDataCanvas.getContext('2d'), + vuGrad = canvas.createLinearGradient(0, 16, 0, 0), + bgGrad, outline; + + vuGrad.addColorStop(0,'rgb(0,192,0)'); + vuGrad.addColorStop(0.30,'rgb(0,255,0)'); + vuGrad.addColorStop(0.625,'rgb(255,255,0)'); + vuGrad.addColorStop(0.85,'rgb(255,0,0)'); + bgGrad = canvas.createLinearGradient(0, 16, 0, 0); + outline = 'rgba(0,0,0,0.2)'; + bgGrad.addColorStop(0,outline); + bgGrad.addColorStop(1,'rgba(0,0,0,0.5)'); + for (i=0; i<16; i++) { + self.vuMeterData[i] = []; + } + for (i=0; i<16; i++) { + for (j=0; j<16; j++) { + // reset/erase canvas + vuDataCanvas.setAttribute('width',16); + vuDataCanvas.setAttribute('height',16); + // draw new stuffs + canvas.fillStyle = bgGrad; + canvas.fillRect(0,0,7,15); + canvas.fillRect(8,0,7,15); + /* + // shadow + canvas.fillStyle = 'rgba(0,0,0,0.1)'; + canvas.fillRect(1,15-i,7,17-(17-i)); + canvas.fillRect(9,15-j,7,17-(17-j)); + */ + canvas.fillStyle = vuGrad; + canvas.fillRect(0,15-i,7,16-(16-i)); + canvas.fillRect(8,15-j,7,16-(16-j)); + // and now, clear out some bits. + canvas.clearRect(0,3,16,1); + canvas.clearRect(0,7,16,1); + canvas.clearRect(0,11,16,1); + self.vuMeterData[i][j] = vuDataCanvas.toDataURL('image/png'); + // for debugging VU images + /* + var o = document.createElement('img'); + o.style.marginRight = '5px'; + o.src = self.vuMeterData[i][j]; + document.documentElement.appendChild(o); + */ + } + } + + }; + + this.testCanvas = function() { + // canvas + toDataURL(); + var c = document.createElement('canvas'), + ctx = null, ok; + if (!c || typeof c.getContext === 'undefined') { + return null; + } + ctx = c.getContext('2d'); + if (!ctx || typeof c.toDataURL !== 'function') { + return null; + } + // just in case.. + try { + ok = c.toDataURL('image/png'); + } catch(e) { + // no canvas or no toDataURL() + return null; + } + // assume we're all good. + return c; + }; + + this.initItem = function(oNode) { + if (!oNode.id) { + oNode.id = 'pagePlayerMP3Sound'+(self.soundCount++); + } + self.addClass(oNode,self.css.sDefault); // add default CSS decoration + }; + + this.initUL = function(oULNode) { + // set up graph box stuffs + if (sm.flashVersion >= 9) { + self.addClass(oULNode,self.cssBase); + } + }; + + this.init = function(oConfig) { + + if (oConfig) { + // allow overriding via arguments object + sm._writeDebug('pagePlayer.init(): Using custom configuration'); + this.config = this._mergeObjects(oConfig,this.config); + } else { + sm._writeDebug('pagePlayer.init(): Using default configuration'); + } + + var i, spectrumBox, sbC, oF, oClone, oTiming; + + // apply externally-defined override, if applicable + this.cssBase = []; // optional features added to ul.playlist + + // apply some items to SM2 + sm.useFlashBlock = true; + + if (sm.flashVersion >= 9) { + + sm.defaultOptions.usePeakData = this.config.usePeakData; + sm.defaultOptions.useWaveformData = this.config.useWaveformData; + sm.defaultOptions.useEQData = this.config.useEQData; + + if (this.config.usePeakData) { + this.cssBase.push('use-peak'); + } + + if (this.config.useWaveformData || this.config.useEQData) { + this.cssBase.push('use-spectrum'); + } + + this.cssBase = this.cssBase.join(' '); + + if (this.config.useFavIcon) { + vuDataCanvas = self.testCanvas(); + if (vuDataCanvas && supportsFavicon) { + // these browsers support dynamically-updating the favicon + self.createVUData(); + } else { + // browser doesn't support doing this + this.config.useFavIcon = false; + } + } + + } else if (this.config.usePeakData || this.config.useWaveformData || this.config.useEQData) { + + sm._writeDebug('Page player: Note: soundManager.flashVersion = 9 is required for peak/waveform/EQ features.'); + + } + + controlTemplate = document.createElement('div'); + + controlTemplate.innerHTML = [ + + // control markup inserted dynamically after each page player link + // if you want to change the UI layout, this is the place to do it. + + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + '
    ', + + '
    ', + '
    ', + ' %s1 / %s2', + '
    ', + '
    ', + + '
    ', + '
    ', + '
    ', + + '
    ', + '
    ', + '
    ', + '
    ', + '
    ' + + ].join('\n'); + + if (sm.flashVersion >= 9) { + + // create the spectrum box ish + spectrumContainer = self.select('spectrum-container',controlTemplate); + + // take out of template, too + spectrumContainer = controlTemplate.removeChild(spectrumContainer); + + spectrumBox = self.select('spectrum-box',spectrumContainer); + + sbC = spectrumBox.getElementsByTagName('div')[0]; + oF = document.createDocumentFragment(); + oClone = null; + for (i=256; i--;) { + oClone = sbC.cloneNode(false); + oClone.style.left = (i)+'px'; + oF.appendChild(oClone); + } + spectrumBox.removeChild(sbC); + spectrumBox.appendChild(oF); + + } else { + + // flash 8-only, take out the spectrum container and peak elements + controlTemplate.removeChild(self.select('spectrum-container',controlTemplate)); + controlTemplate.removeChild(self.select('peak',controlTemplate)); + + } + + self.oControls = controlTemplate.cloneNode(true); + + oTiming = self.select('timing-data',controlTemplate); + self.strings.timing = oTiming.innerHTML; + oTiming.innerHTML = ''; + oTiming.id = ''; + + function doEvents(action) { // action: add / remove + + _event[action](document,'click',self.handleClick); + + if (!isTouchDevice) { + _event[action](document,'mousedown',self.handleMouseDown); + _event[action](document,'mouseup',self.stopDrag); + } else { + _event[action](document,'touchstart',self.handleMouseDown); + _event[action](document,'touchend',self.stopDrag); + } + + _event[action](window, 'unload', cleanup); + + } + + cleanup = function() { + doEvents('remove'); + }; + + doEvents('add'); + + sm._writeDebug('pagePlayer.init(): Ready',1); + + if (self.config.autoStart) { + // grab the first ul.playlist link + pl.handleClick({target:pl.getByClassName('playlist', 'ul')[0].getElementsByTagName('a')[0]}); + } + + }; + +} + +soundManager.useFlashBlock = true; + +soundManager.onready(function() { + pagePlayer = new PagePlayer(); + pagePlayer.init(typeof PP_CONFIG !== 'undefined' ? PP_CONFIG : null); +}); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html new file mode 100755 index 00000000..a9bcf6d2 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html @@ -0,0 +1,23 @@ + + +XBM image test + + + + + +

    XBM (X-Bitmap) Support Test

    + +

    Firefox 3.6 dropped support for XBM images citing lack of use (and a security hole or two), so SoundManager 2 has moved to using canvas for rendering favicon images on-the-fly.

    + +

    +XBM with data URI (may be broken image, invalid etc.):
    + +

    + +

    See the SoundManager 2 demo with experimental favicon animation feature enabled, and the related screenshot showing the different states.

    + +

    XBM (X-Bitmap) is neat in that it's an ASCII, C-style declarative image format, and is quite old. See XBM on Wikipedia for more.

    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html new file mode 100755 index 00000000..e41a20bf --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html @@ -0,0 +1,61 @@ + + + +SoundManager 2 Demo: Play MP3 Links on a page + + + + + + + + + + +

    SoundManager 2 / page as a playlist, basic template

    + +

    Don't forget to set debugMode = false within inlineplayer.js to disable debug output.

    + +
    + +
    + + + +

    SoundManager 2 project home

    + +
  • + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css new file mode 100755 index 00000000..69e05341 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css @@ -0,0 +1,210 @@ +/* + + SoundManager 2: In-page MP3 player example + ------------------------------------------ + + Clicks on links to MP3s are intercepted via JS, calls are + made to SoundManager to load/play sounds. CSS classes are + appended to the link, which are used to highlight the + current play state and so on. + + Class names are applied in addition to "sm2_link" base. + + Default: + + sm2_link + + Additional states: + + sm2_playing + sm2_paused + + eg. + + + some.mp3 + + + some.mp3 + + + Note you don't require ul.graphic / ul.flat etc. for your use + if only using one style on a page. You can just use .sm2_link{} + and so on, but isolate the CSS you want. + + Side note: Would do multiple class definitions eg. + + a.sm2_default.sm2_playing{} + + .. except IE 6 has a parsing bug which may break behaviour, + applying sm2_playing {} even when the class is set to sm2_default. + + + If you want to make your own UI from scratch, here is the base: + + Default + hover state, "click to play": + + a.sm2_link {} + a.sm2_link:hover {} + + Playing + hover state, "click to pause": + + a.sm2_playing {} + a.sm2_playing:hover {} + + Paused + hover state, "click to resume": + + a.sm2_paused {} + a.sm2_paused:hover {} + + +*/ + +/* two different list types */ + +ul.flat { + list-style-type:none; + padding-left:0px; +} + +ul.flat li, +ul.graphic li { + padding-bottom:1px; +} + +ul.flat li a { + display:inline-block; + padding:2px 4px 2px 4px; +} + +ul.graphic { + list-style-type:none; + padding-left:0px; + margin-left:0px; +} + +/* background-image-based CSS3 example */ + +ul.graphic { + list-style-type:none; + margin:0px; + padding:0px; +} + +ul.graphic li { + margin-bottom:2px; +} + +ul.graphic li a, +ul.graphic li a.sm2_link { + /* assume all items will be sounds rather than wait for onload etc. in this example.. may differ for your uses. */ + display:inline-block; + padding-left:22px; + min-height:16px; + vertical-align: middle; + background-color:#336699; + border-radius:3px; + padding:3px 3px 3px 25px; + min-width:19em; + _width:19em; /* IE 6 */ + text-decoration:none; + font-weight:normal; + color:#f6f9ff; +} + +ul.graphic li a.sm2_link { + /* safari 3.1+ fun (or, proprietary crap. TBD.) */ + -webkit-transition-property: hover; + -webkit-transition: background-color 0.15s linear; + -moz-transition: background-color 0.15s linear 0s; /* firefox 4 */ + -o-transition-property: background-color; /* opera 10.5 */ + -o-transition-duration: 0.15s; +} + +ul.graphic li a, /* use a.sm2_link {} if you want play icons showing only if SM2 is supported */ +ul.graphic li a.sm2_paused:hover, +ul.graphic li a.sm2_link:hover { + background-image:url(../image/icon_play.png); + background-position:3px 50%; + background-repeat:no-repeat; + _background-image:url(../image/icon_play.gif); /* IE 6 */ +} + +ul.graphic li a.sm2_link:hover { + /* default hover color, if you'd like.. */ + background-color:#003366; + color:#fff; +} + +ul.graphic li a.sm2_paused { + background-color:#999; +} + +ul.graphic li a.sm2_paused:hover { + background:#003366 url(../image/icon_play.png) no-repeat 3px 50%; + _background-image:url(../image/icon_play.gif); +} + +ul.graphic li a.sm2_playing, +ul.graphic li a.sm2_playing:hover { + background:#003366 url(../image/icon_pause.png) no-repeat 3px 50%; + _background-image:url(../image/icon_pause.gif); + text-decoration:none; +} + +/* hide button while playing? +ul.graphic li a.sm2_playing { + background-image:none; +} +*/ + +body #sm2-container object, +body #sm2-container embed { + /* + flashblock handling: hide SWF off-screen by default (until blocked timeout case.) + include body prefix to ensure override of flashblock.css. + */ + + left:-9999em; + top:-9999em; +} + +/* flat CSS example */ + +ul.flat a.sm2_link { + /* default state: "a playable link" */ + border-left:6px solid #999; + padding-left:4px; + padding-right:4px; +} + +ul.flat a.sm2_link:hover { + /* default (inactive) hover state */ + border-left-color:#333; +} + + +ul.flat a.sm2_playing { + /* "now playing" */ + border-left-color:#6666ff; + background-color:#000; + color:#fff; + text-decoration:none; +} + +ul.flat a.sm2_playing:hover { + /* "clicking will now pause" */ + border-left-color:#cc3333; +} + +ul.flat a.sm2_paused { + /* "paused state" */ + background-color:#666; + color:#fff; + text-decoration:none; +} + +ul.flat a.sm2_paused:hover { + /* "clicking will resume" */ + border-left-color:#33cc33; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif new file mode 100755 index 0000000000000000000000000000000000000000..7f3443d9d46e0b576b36ba68927da3362b8e69ad GIT binary patch literal 189 zcmV;u07CyqNk%w1VG;lm0J9GO{QUgv?CkCB?ez5Y;o;%s<>mYP`}p|y@bK{c{rz`$ zcl!GJ_V)Jb>gxah|NsC0A^8LW000jFEC2ui01^Na000DP@X1Ll1w*vWyBL5p1Wsw5 zWiUv>!n|<&E`rn?c&_V>z5Kvnu=i*rj>u$^*f=Q^rRRz1ggT@qCSgl>ZoOP)VO)5Q r&17b0&9))l@OYdltHX!_gMQEF*B&D%f(|MY7#eIGA0ZZv6%hbCfP-P( literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png new file mode 100755 index 0000000000000000000000000000000000000000..846dd8adddefad95f42466f03c0cb6e105653b16 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mYCT;XLn;`jPTI(I*n!8HRWjfB z&h~HipBfwaBCSfTPEB3(OyGt$@49;n9P>8^o^4}u{@)mTT5YAQ^<)|ASt_$-I42u; z{yi#F;xX$?;Y;Vj-5p|jfsx5uJ}oa<9+AAI;N=o9>A3M&#=}dKE%kVp?MTUgcHkBJ dx;^?4M>7Bb literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif new file mode 100755 index 0000000000000000000000000000000000000000..39543369dde96067f28557f192c07bc68617025c GIT binary patch literal 193 zcmV;y06zamNk%w1VG;lm0J9GOetv$mw6xvb-QnTk<>lq=?d|mR^!@$)@bK{a`}_F# z`1<<#_V)Jb>gxah|NsC0A^8LW000jFEC2ui01^Na000DT@X1LlJ*KqHdohQUIb>;) zpHwVN>%Q$$NR49OINs1p@BhEuqj4w}0|TQ{*f;?I0m6ytd_tQf=3u+EKBHSEVLY}X v8)Rmu0Trw_G=y9(nA;IdnBFBUB>sSbfin*yCx2UNYo5{bM8=ZWHk&A}dG-|Ek9sEeI)M>MF*%XH!`eOHIn z+Y=&gdq_^;`_jqg!o2F!tL$t^z`)M;olr5{r&Lp z@b>oh>gwwM|NrFV + + +SoundManager 2 Demo: Play MP3 Links on a page + + + + + + + + + + +
    + +

    SoundManager 2 / Playable MP3 links

    + +

    Inline MP3 Player Example: Fancy* CSS 3 version

    +

    *CSS 3 border-radius supported only by Firefox 2.x+, Safari (2.x?) - sadly, not IE 8.

    + +
    + +
    + + + +

    How It Works

    + +
      +
    • Lightweight (single JS click event handler)
    • +
    • Uses existing SoundManager 2 API
    • +
    • CSS for UI, easy to modify to taste
    • +
    + +

    This example uses SoundManager 2 to find links to MP3 files, and makes them playable "in-place" on a page. The script assigns CSS classes to links to indicate their state (playing/paused, etc.)

    +

    Links pointing to MP3s are assigned an onclick handler which intercepts the click (preventing the browser from following the link and unloading the page. SM2 will then create sound objects as needed to play the MP3s.

    + +

    Static Examples

    +

    CSS classes are dynamically applied as follows:

    + +

    :hover effects are also active.

    + +

    Flat (CSS-only) style

    + + + +

    Static Examples

    + + + +

    Forcing play (or exclusion) of links

    + +

    If you have a link to a PHP file that serves MP3 files eg. /music.php?fileID=123, it won't be picked up by the script as containing a known, playable .mp3 extension. To tell the script it should be treated as playable, include a type="audio/mpeg" MIME type attribute, or CSS class="inline-playable" in the link. eg:

    + +

    + <a href="/music.php?fileID=123" type="audio/mpeg">A song</a> +

    + +

    Or via CSS class name:

    + <a href="/music.php?fileID=123" class="inline-playable">A song</a> +

    + +

    + To exclude an .MP3 or otherwise-playable link from being handled by SM2, use class="inline-exclude" and it will be ignored. +

    + +

    + SoundManager 2 project page (not an MP3 link) +

    + +

    Basic CSS

    + +
    + If you want to make your own UI from scratch, here is the base:
    +
    + Default + hover state, "click to play":
    +
    + a.sm2_link {}
    + a.sm2_link:hover {}
    +
    + Playing + hover state, "click to pause":
    +
    + a.sm2_playing {}
    + a.sm2_playing:hover {}
    +
    + Paused + hover state, "click to resume":
    +
    + a.sm2_paused {}
    + a.sm2_paused:hover {}
    +
    + +

    Other Options

    + +

    By default, one sound will be played at a time; you can easily change a "config" object value to turn on playlist-like behaviour (i.e., play the next MP3 when the current one finishes.)

    + +
    +// (within inlineplayer.js)
    +this.config = {
    + playNext: false // stop after one sound, or play through list until end
    +}
    +
    + +

    I'd like to use this.

    +

    See this basic demo for reference.

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js new file mode 100755 index 00000000..0b1f977d --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js @@ -0,0 +1,256 @@ +/** + * + * SoundManager 2 Demo: Play MP3 links "in-place" + * ---------------------------------------------- + * + * http://schillmania.com/projects/soundmanager2/ + * + * A simple demo making MP3s playable "inline" + * and easily styled/customizable via CSS. + * + * Requires SoundManager 2 Javascript API. + * + */ + +function InlinePlayer() { + var self = this; + var pl = this; + var sm = soundManager; // soundManager instance + var isIE = (navigator.userAgent.match(/msie/i)); + this.playableClass = 'inline-playable'; // CSS class for forcing a link to be playable (eg. doesn't have .MP3 in it) + this.excludeClass = 'inline-exclude'; // CSS class for ignoring MP3 links + this.links = []; + this.sounds = []; + this.soundsByURL = []; + this.indexByURL = []; + this.lastSound = null; + this.soundCount = 0; + + this.config = { + playNext: false, // stop after one sound, or play through list until end + autoPlay: false // start playing the first sound right away + } + + this.css = { + // CSS class names appended to link during various states + sDefault: 'sm2_link', // default state + sLoading: 'sm2_loading', + sPlaying: 'sm2_playing', + sPaused: 'sm2_paused' + } + + this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.addEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + o.attachEvent('on'+evtName,evtHandler); + }); + + this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { + return o.removeEventListener(evtName,evtHandler,false); + } : function(o, evtName, evtHandler) { + return o.detachEvent('on'+evtName,evtHandler); + }); + + this.classContains = function(o,cStr) { + return (typeof(o.className)!='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false); + } + + this.addClass = function(o,cStr) { + if (!o || !cStr || self.classContains(o,cStr)) return false; + o.className = (o.className?o.className+' ':'')+cStr; + } + + this.removeClass = function(o,cStr) { + if (!o || !cStr || !self.classContains(o,cStr)) return false; + o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); + } + + this.getSoundByURL = function(sURL) { + return (typeof self.soundsByURL[sURL] != 'undefined'?self.soundsByURL[sURL]:null); + } + + this.isChildOfNode = function(o,sNodeName) { + if (!o || !o.parentNode) { + return false; + } + sNodeName = sNodeName.toLowerCase(); + do { + o = o.parentNode; + } while (o && o.parentNode && o.nodeName.toLowerCase() != sNodeName); + return (o.nodeName.toLowerCase() == sNodeName?o:null); + } + + this.events = { + + // handlers for sound events as they're started/stopped/played + + play: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLink,this._data.className); + }, + + stop: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = ''; + }, + + pause: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPaused; + pl.addClass(this._data.oLink,this._data.className); + }, + + resume: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = pl.css.sPlaying; + pl.addClass(this._data.oLink,this._data.className); + }, + + finish: function() { + pl.removeClass(this._data.oLink,this._data.className); + this._data.className = ''; + if (pl.config.playNext) { + var nextLink = (pl.indexByURL[this._data.oLink.href]+1); + if (nextLink1) { + // ignore right-click + return true; + } + var o = self.getTheDamnLink(e); + if (o.nodeName.toLowerCase() != 'a') { + o = self.isChildOfNode(o,'a'); + if (!o) return true; + } + var sURL = o.getAttribute('href'); + if (!o.href || (!sm.canPlayLink(o) && !self.classContains(o,self.playableClass)) || self.classContains(o,self.excludeClass)) { + return true; // pass-thru for non-MP3/non-links + } + var soundURL = (o.href); + var thisSound = self.getSoundByURL(soundURL); + if (thisSound) { + // already exists + if (thisSound == self.lastSound) { + // and was playing (or paused) + thisSound.togglePause(); + } else { + // different sound + sm._writeDebug('sound different than last sound: '+self.lastSound.id); + if (self.lastSound) { + self.stopSound(self.lastSound); + } + thisSound.togglePause(); // start playing current + } + } else { + // stop last sound + if (self.lastSound) { + self.stopSound(self.lastSound); + } + // create sound + thisSound = sm.createSound({ + id:'inlineMP3Sound'+(self.soundCount++), + url:soundURL, + onplay:self.events.play, + onstop:self.events.stop, + onpause:self.events.pause, + onresume:self.events.resume, + onfinish:self.events.finish, + type:(o.type||null) + }); + // tack on some custom data + thisSound._data = { + oLink: o, // DOM node for reference within SM2 object event handlers + className: self.css.sPlaying + }; + self.soundsByURL[soundURL] = thisSound; + self.sounds.push(thisSound); + thisSound.play(); + } + + self.lastSound = thisSound; // reference for next call + + if (typeof e != 'undefined' && typeof e.preventDefault != 'undefined') { + e.preventDefault(); + } else { + event.returnValue = false; + } + return false; + } + + this.stopSound = function(oSound) { + soundManager.stop(oSound.id); + soundManager.unload(oSound.id); + } + + this.init = function() { + sm._writeDebug('inlinePlayer.init()'); + var oLinks = document.getElementsByTagName('a'); + // grab all links, look for .mp3 + var foundItems = 0; + for (var i=0, j=oLinks.length; i0) { + self.addEventHandler(document,'click',self.handleClick); + if (self.config.autoPlay) { + self.handleClick({target:self.links[0],preventDefault:function(){}}); + } + } + sm._writeDebug('inlinePlayer.init(): Found '+foundItems+' relevant items.'); + } + + this.init(); + +} + +var inlinePlayer = null; + +soundManager.setup({ + // disable or enable debug output + debugMode: true, + // use HTML5 audio for MP3/MP4, if available + preferFlash: false, + useFlashBlock: true, + // path to directory containing SM2 SWF + url: '../../swf/', + // optional: enable MPEG-4/AAC support (requires flash 9) + flashVersion: 9 +}); + +// ---- + +soundManager.onready(function() { + // soundManager.createSound() etc. may now be called + inlinePlayer = new InlinePlayer(); +}); + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html new file mode 100755 index 00000000..831a090e --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html @@ -0,0 +1,243 @@ + + + +SoundManager 2: Deferred loading / Lazy-loading / Dynamic script loading Example + + + + + + + + + + + + +
    + +

    SoundManager 2: Lazy Loading Example

    +

    This is an example of dynamically loading SoundManager 2 using JS, after window.onload() has fired.

    + +

    How it works

    +

    This page waits until window.onload(), delays 1 second and loads soundmanager2.js, which should then start up.

    +

    Behaviour note: SM2 will not automatically start if it is loaded at or after the DOMContentLoaded event has fired, which may be common with most JS loaders.

    +

    However, SM2 will try to start once soundManager.setup() is called and a url attribute has been provided.

    +

    If you want to ensure that SM2 starts after setup, you can call soundManager.beginDelayedInit() - this should be safe to call after DOMContentLoaded has fired.

    + +

    Pseudo-code Example

    + +

    Once SM2 has been dymamically loaded, you can call its setup() method. Passing a url attribute will trigger the initialization process.

    + +
    loadJS('soundmanager2.js', function() {
    +  soundManager.setup({
    +    url: '/path/to/swfs/',
    +    onready: function() {
    +      // good to go!
    +      // soundManager.createSound(...), etc.
    +    }
    +  });
    +});
    + +

    Live Example

    + +

    SoundManager 2 status: Waiting for window.onload()...

    + +
    /**
    + * Dynamic script loading helper (example)
    + * Normalizes good browser onload() vs. IE readyState weirdness
    + */
    +
    +function loadScript(sURL, onLoad) {
    +
    +  function loadScriptHandler() {
    +    var rs = this.readyState;
    +    if (rs == 'loaded' || rs == 'complete') {
    +      this.onreadystatechange = null;
    +      this.onload = null;
    +      if (onLoad) {
    +        onLoad();
    +      }
    +    }
    +  }
    +
    +  function scriptOnload() {
    +    this.onreadystatechange = null;
    +    this.onload = null;
    +    window.setTimeout(onLoad,20);
    +  }
    +
    +  var oS = document.createElement('script');
    +  oS.type = 'text/javascript';
    +  if (onLoad) {
    +    oS.onreadystatechange = loadScriptHandler;
    +    oS.onload = scriptOnload;
    +  }
    +  oS.src = sURL;
    +  document.getElementsByTagName('head')[0].appendChild(oS);
    +
    +}
    +
    +// Wait for window load, then load soundmanager2.js, let it start and play a test sound
    +
    +window.onload = function() {
    +
    +  msg('Window loaded, waiting 1 second...');
    +
    +  setTimeout(function() {
    +
    +    msg('Loading soundmanager2.js...');
    +
    +    loadScript('../../script/soundmanager2.js', function() {
    +
    +      // SM2 script has loaded
    +
    +      window.setTimeout(function() {
    +        msg('soundmanager2.js loaded, delaying before setup()...');
    +      }, 500);
    +
    +      window.setTimeout(function() {
    +
    +        soundManager.setup({
    +          url: '../../swf/',
    +          onready: function() {
    +            soundManager.createSound({
    +              id: 'foo',
    +              url: '../_mp3/mouseover.mp3'
    +            }).play();
    +            msg('Started OK');
    +          },
    +          ontimeout: function() {
    +            msg('Loaded OK, but unable to start: unsupported/flash blocked, etc.');
    +          }
    +        });
    +
    +        // ensure start-up in case document.readyState and/or DOMContentLoaded are unavailable
    +        soundManager.beginDelayedInit();
    +
    +      }, 1000);
    +
    +    });
    +
    +  }, 1000);
    +
    +}
    +
    + +

    Handling flash blockers

    +

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info on this, see the Flashblock example.

    + +

    Preventing auto-init using SM2_DEFER

    +

    If you want to completely defer the normal start-up of SM2 and call the SoundManager() constructor yourself, you can declare an SM2_DEFER global and set it to true. See the SM2_DEFER example for details.

    + +

    Disabling debug output

    +

    SoundManager 2 will write to a debug <div> element or a javascript console if available, by default. To disable it, simply set the relevant property to false:

    +soundManager.setup({ debugMode: false }); +

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    +

    Troubleshooting

    +

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool which can help you fix things.

    +

    No-debug, compressed version of soundmanager2.js

    +

    You can also use the "minified" (60% smaller) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. If you can, serve this with gzip compression for even greater bandwidth savings!

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html new file mode 100755 index 00000000..d4357cd9 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html @@ -0,0 +1,87 @@ + + + +SoundManager 2: HTML 5 DTD test + + + + + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html new file mode 100755 index 00000000..c7a62d49 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html @@ -0,0 +1,206 @@ + + + +SoundManager 2 Template + + + + + + + + + + + + + + + + + + + + + +
    + +

    SoundManager 2 Template Example

    +

    This page covers the basics of adding SoundManager 2 to your project.

    + +

    How it works

    +

    The minimal code needed to get SoundManager 2 going is below, with configurable parts highlighted. You can copy/paste it to get started. This page is also running the template code; If available, look at your JavaScript console for debug output from SM2.

    + +

    Dependencies

    + +

    You'll need to copy the files inside the script/ and swf/ subdirectories included with the SoundManager 2 package into your project.

    + +
      +
    • + soundmanager2/ +
        +
      • + script/ - API core, soundmanager2.js +
      • +
      • + swf/ - API core, SoundManager 2 .SWF files +
      • +
      +
    • +
    + + +

    At the bare minimum, you will need soundmanager2.js, soundmanager2.swf and soundmanager2_debug.swf for the default flash 8-based configuration. (Optionally, SM2 can use a Flash 9-based audio API which has MP4 support, data visualization and a few other features.)

    + +

    Template Code: Basic Version

    + +

    This is a compact version of the template you can copy/paste to get started. For new users, see the commented version.

    + +
    <script src="/path/to/soundmanager2.js"></script>
    +<script>
    +soundManager.setup({
    +  url: '/path/to/swf-files/',
    +  onready: function() {
    +    var mySound = soundManager.createSound({
    +      id: 'aSound',
    +      url: '/path/to/an.mp3'
    +    });
    +    mySound.play();
    +  },
    +  ontimeout: function() {
    +    // Hrmm, SM2 could not start. Missing SWF? Flash blocked? Show an error, etc.?
    +  }
    +});
    +</script>
    + + + +

    Template Code: Commented Version

    + +
    <!-- include SM2 library (see builds for optimized versions) -->
    +<script type="text/javascript" src="/path/to/soundmanager2.js"></script>
    +
    +<!-- configure SM2 for your use -->
    +<script type="text/javascript">
    +
    +soundManager.setup({
    +
    +  // location: path to SWF files, as needed (SWF file name is appended later.)
    +
    +  url: '/path/to/swf-files/',
    +
    +  // optional: version of SM2 flash audio API to use (8 or 9; default is 8 if omitted, OK for most use cases.)
    +  // flashVersion: 9,
    +
    +  // use soundmanager2-nodebug-jsmin.js, or disable debug mode (enabled by default) after development/testing
    +  // debugMode: false,
    +
    +  // good to go: the onready() callback
    +
    +  onready: function() {
    +
    +    // SM2 has started - now you can create and play sounds!
    +
    +    var mySound = soundManager.createSound({
    +      id: 'aSound', // optional: provide your own unique id
    +      url: '/path/to/an.mp3'
    +      // onload: function() { console.log('sound loaded!', this); }
    +      // other options here..
    +    });
    +
    +    mySound.play();
    +
    +  },
    +
    +  // optional: ontimeout() callback for handling start-up failure
    +
    +  ontimeout: function() {
    +
    +    // Hrmm, SM2 could not start. Missing SWF? Flash blocked? No HTML5 audio support? Show an error, etc.?
    +    // See the flashblock demo when you want to start getting fancy.
    +
    +  }
    +
    +});
    +
    +</script>
    + +

    HTML5 Support Notes

    +

    Read up on HTML5 audio support, if you're feeling adventurous. iPad/iPhone and devices without flash installed will always use 100% HTML5 mode. By default, SM2 will use 100% HTML5 mode where supported. If you want to override this, specify preferFlash: true and Flash will be used (if present) for playing MP3 and MP4 (AAC) formats.

    + +

    Handling flash blockers

    +

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info, see the Flashblock example.

    + +

    Disabling debug output

    +

    SoundManager 2 will write debug output via console.log() if available, by default. To disable it, simply specify debugMode: false.

    +

    You can also write HTML-based debug output to the DOM via consoleOnly: false and/or useConsole: false.

    +

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    + +

    Troubleshooting ("failed to start": Viewing offline, missing SWF, flash blockers etc.)

    +

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool for tips.

    + +

    No-debug, compressed version of soundmanager2.js

    +

    Once development is finished, you can also use the "minified" (down to ~8% of original size with gzip!) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. Serve with gzip compression wherever possible for best bandwidth savings.

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html new file mode 100755 index 00000000..526f43eb --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html @@ -0,0 +1,128 @@ + + + +SoundManager 2: SM2_DEFER Example + + + + + + + + + + + + + + + + + + +
    + +

    SoundManager 2: SM2_DEFER Example

    + +

    This is an example of manually starting SoundManager 2. If you want to pre-load the SM2 script up front and have its onready() events etc. fire much later without delay, this approach makes sense. Otherwise, it's better to lazy-load or simply load SM2 normally as an external script without deferring.

    + +

    How it works

    +

    By default, SM2 will call its own SoundManager() constructor inline and will try to initialize ASAP. This page defines a global boolean - window.SM2_DEFER = true; - before loading soundmanager2.js, preventing the constructor from being called.

    + +

    Some time later, you must call soundManager = new SoundManager(); manually and set things like soundManager.url etc. Finally, you may then call soundManager.beginDelayedInit() to kick off the initialization process. SM2 should then start as usual.

    + +

    Example code

    + +
    <script type="text/javascript">
    +
    +/*
    + * Firstly, define SM2_DEFER and set it to true *before* we load soundmanager2.js.
    + * This prevents the SoundManager() constructor from being called immediately.
    + * SM2_DEFER should be assigned within the global scope.
    +*/
    +
    +window.SM2_DEFER = true;
    +
    +</script>
    +
    +<!-- Now, load soundmanager2.js as we normally would. -->
    +<script type="text/javascript" src="../../script/soundmanager2.js"></script>
    +
    +<!-- "Some time later", window.onload() may have fired and you now want to start SM2, etc... -->
    +<script type="text/javascript">
    +
    +// for example purposes, we'll wait until window.onload before starting things.
    +window.onload = function() {
    +
    +  /*
    +   * Now that the SM2 constructor is defined, you can call the constructor,
    +   * set the options and "kick-start" SM2's init process, and it should work as normal.
    +   * WARNING: Do not call beginDelayedInit() before "DOM ready", or things will fail.
    +  */
    +
    +  // construct the instance (must be named soundManager, and scoped globally)
    +  window.soundManager = new SoundManager();
    +
    +  // assign flash url, flashVersion and other SM2 options as usual
    +  soundManager.setup({
    +    // path to directory containing SM2 SWF
    +    url: '/path/to/swfs/',
    +    flashVersion: 9
    +    // etc...
    +  });
    +
    +  // finally, kick-start the init process.
    +  // (old IE etc. may miss domloaded/ready/window.load if they've already fired.)
    +  soundManager.beginDelayedInit();
    +
    +}
    +
    +</script>
    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css new file mode 100755 index 00000000..59ff8a6a --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css @@ -0,0 +1,162 @@ +/** + * + * SoundManager 2: TEMPLATE EXAMPLE / DEMO ONLY, just to make the demo page pretty. + * + * You don't need this stuff for SM2 to work. :) + * + */ + +body { + font-size:75%; + background: #fff url(../../demo/_image/noise.png); +} + +pre { + padding: 0.5em; + background: #f9f9f9; +} + +code, pre { + font-family:"lucida console",monaco,courier,system; + font-size:100%; + color:#2233cc; +} + +em em { + font-weight:normal; + font-style:normal; + color:#339933; +} + +h1, +h2.special { + letter-spacing: -0.005em; +} + +h1, h2, h3, h4 { + font-family:"helvetica neue",helvetica,verdana,arial,tahoma,"sans serif"; + font-size:1em; + margin:0px; + padding:0px; + vertical-align:middle; +} + +h1 { + font-size:2em; + border-bottom: 1px dotted #999; +} + +h2 { + font-family:"helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; + font-size:1.5em; + margin-top: 1.5em; + margin-bottom: 0px; +} + +h2 code { + font-size: 85%; +} + +h3 { + font-size:1.17em; + border-bottom:1px solid #ccc; + padding-bottom:0.25em; + margin-top:1.5em; +} + +h4 { + margin:1.5em 0px 0.5em 0px; + font-size:1.1em; +} + + +p, +li { + font:normal 1em verdana,tahoma,arial,"sans serif"; + line-height: 1.4em; +} + +code span, +pre span { + color:#666; +} + +ul.file-structure ul { + padding-left:1.5em; +} + +ul.file-structure li { + list-style-type:square; + margin-top:0.25em; + margin-left:0px; +} + +ul.file-structure li span { + color:#999; +} + +/* re-used bits from index.css */ + +pre code { + font-size:1em; +} + +pre { + white-space:-moz-pre-wrap; + white-space:pre-wrap; + word-wrap:break-word; /* IE */ +} + +ul.code-block em, +pre span, +code span, +dt span { + color:#339933; +} + +ul.code-block em { + font-style: normal; +} + +ul.code-block span, +pre span span, +code span span, +dt span span { + color:#667788; +} + +pre.block, +pre.block code, +div.block div.code, +ul.code-block { + position:relative; + display:table; + *display:block; + border:1px solid #ccc; + border-radius:3px; +} + +div.block, +pre.block { + background:#e9f3ff; + border-color:#eee; + padding:3px; +} + +pre.block code, +.block .code { + background:#fff; + border:1px solid #ccddee; + padding:0.5em; + font-size: 100%; + line-height:1.75em; + background-image: -webkit-linear-gradient(#fcfcfc 50%, #fff 50%); + background-image: -o-linear-gradient(#fcfcfc 50%, #fff 50%); + background-image: linear-gradient(#fcfcfc 50%, #fff 50%); + background-size: 100% 3.5em; + background-origin: content-box; +} + +pre.block code { + padding: 1em; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml new file mode 100755 index 00000000..38bcbb13 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml @@ -0,0 +1,143 @@ + + + +SoundManager 2 Template + + + + + + + + + + + + + + + + + + +
    +

    SoundManager 2 Template Example

    +

    This is a basic template for adding SoundManager to your page.

    +

    How it works

    +

    This page includes the SM2 script, which starts up on its own as appropriate. By default it will try to start as soon as possible.

    +

    The minimal code needed to get SoundManager 2 going is below, with configurable parts:

    + +
    +<!-- include SM2 library -->
    +<script type="text/javascript" src="/path/to/soundmanager2.js"></script>
    +
    +<!-- configure it for your use -->
    +<script type="text/javascript">
    +
    +soundManager.setup({
    +  url: '/path/to/sm2-flash-files/', // directory where SM2 .SWFs live
    +
    +  /*
    +   * Note that SoundManager will determine and append the appropriate .SWF file to the URL,
    +   * eg. /path/to/sm2-flash-files/soundmanager2.swf automatically.
    +   * You should not put soundmanager2.swf in there yourself.
    +  */
    +
    +  // Beta-ish HTML5 audio support (force-enabled for iPad), flash-free sound for Safari + Chrome. Enable if you want to try it!
    +  // useHTML5Audio: true,
    +
    +  // do this to skip flash block handling for now. See the flashblock demo when you want to start getting fancy.
    +  useFlashBlock: false,
    +
    +  // disable debug mode after development/testing..
    +  // debugMode: false
    +
    +});
    +
    +// Option 1: Simple onready() + createSound() method
    +
    +soundManager.onready(function() {
    +  // SM2 has loaded - now you can create and play sounds!
    +  soundManager.createSound('helloWorld','/path/to/hello-world.mp3');
    +  soundManager.play('helloWorld');
    +});
    +
    +// Option 2 (better): More flexible onready() + createSound() method
    +
    +soundManager.onready(function() {
    +
    +  var mySound = soundManager.createSound({
    +    id: 'aSound',
    +    url: '/path/to/an.mp3'
    +    // onload: [ event handler function object ],
    +    // other options here..
    +  });
    +
    +  mySound.play();
    +
    +});
    +
    +// Option 3 (best): onready() + createSound() / ontimeout() methods for success/failure:
    +
    +soundManager.onready(function() {
    +
    +  // SM2 has loaded - now you can create and play sounds!
    +  var mySound = soundManager.createSound({
    +    id: 'aSound',
    +    url: '/path/to/an.mp3'
    +    // onload: [ event handler function object ],
    +    // other options here..
    +  });
    +  mySound.play();
    +
    +});
    +
    +soundManager.ontimeout(function() {
    +
    +  // (Optional) Hrmm, SM2 could not start. Show an error, etc.?
    +
    +});
    +
    +
    +</script>
    + +

    Handling flash blockers

    +

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info on this, see the Flashblock example.

    + +

    Making SM2 wait for window.onload()

    +

    If you prefer to have the library wait for window.onload() before making onready() / ontimeout() callbacks, you can specify waitForWindowLoad: true.

    + +

    Disabling debug output

    +

    SoundManager 2 will write debug output via console.log() if available, by default. To disable it, simply specify debugMode: false.

    +

    You can also write HTML-based debug output to the DOM via consoleOnly: false and/or useConsole: false.

    +

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    + +

    Troubleshooting ("failed to start": Viewing offline, missing SWF, flash blockers etc.)

    +

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool for tips.

    + +

    No-debug, compressed version of soundmanager2.js

    +

    Once development is finished, you can also use the "minified" (down to ~8% of original size with gzip!) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. Serve with gzip compression wherever possible for best bandwidth savings.

    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html new file mode 100755 index 00000000..9c666c0c --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html @@ -0,0 +1,2041 @@ + + + +SoundManager 2: Revision History (Archived) + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + + +
    + +
    +
    +
    + +
    +
    +
    + +
    + + +
    + +
    + +

    Revision History

    +

    Archived versions of SM2 releases

    + +
    + +
    + +
    + +

    Revision History (Archives)

    + +

    A changelog of sorts.

    + +
      + + + +
    • + +

      V2.97a.20111220 - HTML5 src/onload()/onstop() fixes, new HTML5 polling, onPosition() updates, "audio sprites" (from/to) and multiple URL support. (Also: New homepage design!) (Download archived version)

      + +

      Fixes for HTML5 audio including redundant src assignment, onload and onstop. New html5PollingInterval property, onPosition() and clearOnPosition() methods, "audio sprites" support via from and to parameters. Updated onposition() sound method, added new onposition sound parameter, and multiple URLs / URL formats now allowed for a sound. Also: Version checking between JS and SWF, brand-new optimized homepage design and demo UI tweaks + optimizations.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + HTML5: Fixed Audio() src attribute re-assignment bug seen in createSound()->play() use case. +

          +
        • + +
        • +

          + HTML5: mySound.load({onload:function(){}}) callback fixed so it works. +

          +
        • + +
        • +

          + HTML5 + Flash: onload() now called immediately when load({onload:function(){}}) is used on a sound with the same URL which has already loaded. +

          +
        • + +
        • +

          + onstop() now mimics onfinish() in terms of sequence. HTML5 sets position to 0, but retains pre-stop() position property value (like Flash does.) +

          +
        • + +
        • +

          + Amazon Kindle Fire UA looks like Safari on OS X 10.6.3, but does not have broken HTML5 audio (i.e., intermittent playback failure) like the "isBadSafari" case. +

          +
        • + +
        • +

          + MovieStar/NetStream (non-RTMP) edge case: Correct onfinish() after play() and a seek so that it always fires. Remove metadata() after first call (as it was) for non-RTMP. Reduce buffer-near-end logic to 3 seconds from 5. +

          +
        • + +
        • +

          + Flash 9 MovieStar/RTMP: Only fire onconnect() for RTMP (was firing for flash 9/NetStream, too, breaking MovieStar createSound({autoLoad:true,onload:function(){this.play()}}) case.) +

          +
        • + +
        • +

          + RTMP: Exclude RTMP from 30-second resume() reposition hack (streaming does not have this issue.) May have been breaking buffer due to seek on resume. +

          +
        • + +
        • +

          + Fix edge case where soundManager.waitForWindowLoad = true (non-async startup case), but _initComplete() may fire after window.onload() and thus onready() never fired. +

          +
        • + +
        + +
      • + +
      • + +

        API updates

        + +
          + +
        • +

          + Added soundManager.html5PollingInterval property, for increased whileplaying() callback frequency (higher UI framerates) similar to flashPollingInterval. (By default, null/off.) Also excludes mobile (eg., iOS) by default. +

          +
        • + +
        • +

          + soundManager.onPosition(): Queues a callback that will be fired each time a sound reaches a given position during playback. Applies for the life of the sound object. +

          +
        • + +
        • +

          + soundManager.clearOnPosition(): Removes onPosition() callback(s) from a sound, by position and/or callback. (If no position or callback are specified, then all callbacks are cleared for the given sound.) +

          +

          + Optionally, an onstop: function(){} handler can be passed to capture the moment when "to" is reached. When using Flash, sound is preloaded 100% in order to guarantee playback can start at the "from" position. +

          +
        • + +
        • +

          + Added support for "audio sprites." New sound options, from and to allow segments, samples or slices of sound to be played. eg., mySound.play({ from: 5000, to: 10000}); +

          +
        • + +
        • +

          + New sound option, onposition, defines times and related callbacks for positions of interest within a sound. Applies on a per-play basis. eg. onposition: {500: function(p) { console.log('position ' + p + ' was reached.') } } +

          +
        • + +
        • +

          + Experimental: Multiple formats/encodings support in the sound url parameter; now accepts an array as an alternate to a single string. eg. soundManager.createSound({id:'foo', url:['bar.ogg','bar.mp3']}); - SM2 will use the first playable URL it finds and the URL property will then reflect the one URL after that point. Note that this means the original array data will be lost. +

          +

          + Also accepts type attributes, eg. url:[{type:'audio/mp3',url:'/path/to/play.php?song=123'},...] - useful for URLs without obvious filetype extensions. +

          +
        • + +
        • +

          + Flash 9 + MovieStar (NetStream) / RTMP: onmetadata (sound parameter) callback, allows capturing of metadata events from flash (eg., streaming song / title updates) similar to onid3(). Can now fire multiple times, eg., when RTMP streaming and new song / artist info is provided. +

          +
        • + +
        • +

          + Added JS version + Flash SWF build/version check to SM2 during start-up. (Finally! :D) ... Will now throw new Error() if soundmanager.js version reports V2.97a.20111030 and SWF version is V2.97a.20110918, for example. (Happens when upgrading/replacing old versions of SM2, you may forget to update one of the SWFs etc.) +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Homepage: Brand-new, shinier design, improved three-column layout; looks better even in IE 6. Small UI tweaks on inline demos. Combined demo JS + CSS files for performance; cut HTTP requests by over 50% (now down to 14 HTTP requests in most cases) via concatenation and data: URIs for some background images and sprites. +

          +
        • + +
        • +

          + 360 player demos: Updated UI with more circles and a few gradients, border-radius etc. Small 50x50 UI is now clickable over entire area, rather than small circular button. +

          +
        • + +
        • +

          + Demos: Some data: URIs added to inline player and 360 player for performance (reduced HTTP requests.) Christmas lights demo now uses YUI 3 seed + animation. +

          +
        • + +
        • +

          + soundManager.useConsoleOnly = true by default, was previously false. New "true" default means no HTML debug output if console.log() is available. +

          +
        • + +
        • +

          + soundmanager2.js: Micro-optimizations, further -nodebug-jsmin optimizations and minor comment formatting. Eliminated last Google Closure Compiler warning (caused by an empty "if" block.) +

          +
        • + +
        • +

          + Debug output no longer shows "loops: 1" (redundant), only interesting values eg. 2+ are reported. +

          +
        • + +
        • +

          + Documentation: Small theme tweaks, textured background and re-organization of properties (left menu) for easier navigation. Fixed "onsuspend" event labeling, clarify SMSound events as properties and not methods. Re-sorted property lists, tidied up code formatting. Added missing soundManager.onPosition() documentation (side note: previously named onposition(), old lower-case method name maintained for backward compatibility.) +

          +
        • + +
        • +

          + Page player / Muxtape demos: Removed useMovieStar sound option - no longer exists, redundant. +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20111030 - HTML5 unload() improvements, Android 2.3 fix and new onsuspend() event (Download archived version)

      + +

      Fixes for HTML5 unload() on Webkit (connection was not closing), playback on Android 2.3, and IE 9 "not implemented" / unsupported HTML5 case. Addition of onsuspend() HTML5 event, possibly applicable to iOS where stalled events suggest that user action is needed to play or resume audio playback.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • + +

          HTML5 unload(): Correctly apply about:blank (_emptyURL default) to everyone except Firefox, which allegedly likes ''. Webkit was not actually closing the connection of loading streams, in this case.

          + +
        • + +
        • + +

          HTML5 audio playback fix for Android 2.3 (Honeycomb), which doesn't seem to like new Audio('foo.mp3') followed by load() -> play(); first request/attempt stalls and eventually fires ended event. Rather odd. (Related discussion.)

          + +
        • + +
        • + +

          Added try...catch for dumb IE 9 Audio() "not implemented" error in Windows server case without "desktop experience" installed, means no HTML5 audio/video support. Hat tip: Modernizr issue 224

          + +
        • + +
        + +
      • + +
      • + +

        API updates

        + +
          + +
        • + +

          Added soundManager.noSWFCache (boolean) for easy cache busting - good for dev/testing. SWFs tend to be aggressively cached by browsers, especially in offline cases.

          + +
        • + +
        • +

          HTML5 suspend events are now listened for and fired via SMSound option onsuspend(). This event may be the best way to detect when mobile Safari (eg. iOS) is blocking autoplay-style behaviour, and user interaction is required to start or resume playback.

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • + +

          Fix "playable MP3 links" demo for iOS, playing 2nd+ sound now works. Due to single sound object reuse, "old" sound must be paused before new one is created. Previously, playing sound 1 -> sound 2 -> sound 1 would fail.

          + +
        • + +
        • + +

          Tweaked 360player behaviour to support being initialized multiple times (for dynamic content, "decorating" new MP3 links etc.)

          + +
        • + +
        • + +

          Modified soundManager core property documentation to be multi-line, allowing longer comments

          + +
        • + +
        + +
      • + +
      + +
    • + +
    • + +

      V2.97a.20110918 - Code clean-up, improved comments and formatting, generated documentation, polling and onbefore- removal, HTML5 stop()/unload() fixes (Download archived version)

      + +

      Added block comments above major SM2 methods (and Docco-generated documentation), more line breaks for consistent vertical spacing and readability, removal of onbefore-related SMSound options, allowPolling + useFastPolling features. Improved build task optimizing of -nodebug JS build, removing comments, extra line breaks and debug code blocks which were previously only commented out.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • HTML5 unload: Gecko can use url = '' to cancel request etc., others seem to need about:blank or similar empty URL (matching Flash 8.)
        • + +
        • HTML5 stop(): Don't call unload() here (file under "durrr." This fixes a few state-related bugs.)
        • + +
        • Fire the onposition callback after setting item.fired, instead of before. This allows looping in the form of mySound.onposition(200, function(){ mySound.setposition(100); });
        • + +
        • Fix movieStar (MPEG-4) handling for URLs without MIME hints (eg. a URL ending in .php) if type: 'audio/mp4' is passed, for example. (Possible regression introduced with V2.97a.20110801, one report was received.)
        • + +
        • Fire onposition() after increasing the internal "onPositionFired" counter.
        • + +
        + +
      • + +
      • + +

        API updates

        + +
          + +
        • + +

          Clean-up time! The following soundManager properties have been removed as they're ineffective and/or have modern replacements:

          + +

          + soundManager.nullURL = 'about:blank'; (internalized; search for 'about:blank' in the source if you want to customize it.) +

          + +

          + soundManager.allowPolling = true; (ignored, always true now. whileloading() / whileplaying() calls rely on it.) +

          + +

          + soundManager.useFastPolling = false; (redundant, now determined by flashPollingInterval now being specified as a number eg., 20, instead of the default of null.) +

          + +

          + The following SMSound (sound options) have been removed, in favour of modern replacements (and also didn't work with HTML5 sounds.) +

          + +
          soundManager.defaultOptions.onbeforefinish = null;
          +soundManager.defaultOptions.onbeforefinishtime = 5000;
          +soundManager.defaultOptions.onbeforefinishcomplete = null;
          +soundManager.defaultOptions.onjustbeforefinish = null;
          +soundManager.defaultOptions.onjustbeforefinishtime: 200;
          + +

          + As a replacement, use the SMSound.onposition() method to assign an event callback handler to fire at the relevant time. +

          + +
          mySound.onposition(10000, function() {
          +  console.log('the sound ' + this.id + ' is now at position ' + this.position);
          +});
          + +

          + If you need to fire an event relative to the true end of the sound, reference its duration once the sound has fully-loaded - ie., at or after the onload() event - as the duration will not be completely accurate until that time. durationEstimate may be referenced before onload(), but it should not be relied on when "precise" timings of say, < 1 second are desired. +

          + +
          mySound.load({
          +  onload: function() {
          +    this.onposition(this.duration - 5000, function() {
          +      console.log('the sound ' + this.id + ' is now at position ' + this.position);
          +    }
          +  }
          +});
          + +

          + Again, note that due to the interval / polling-based methods of both HTML5 and flash audio, sound status updates and thus precision can vary between 20 msec to perhaps 0.5 seconds and the sound's position property will reflect this delta when the onposition() callback fires. +

          + +
        • + +
        • + +

          Added soundManager.onposition() (forgot to mirror the SMSound method)

          + +
        • + +
        • + +

          + Privatize soundManager.netStreamMimeTypes, etc. soundManager.mimePattern, the resulting one applied to canPlayMIME() etc., is still exposed. +

          + +
        • + +
        • + +

          + Simplify getMovie() to use _id(smID) || _doc[smID] || _win[smID] rather than IE / Safari special checks. Sometimes (old?) IE and Safari would return null on getElementById(), but window[id] or document[id] would work. Presumably related to Flash + ExternalInterface wackiness. +

          + +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • Reviewed soundmanager2.js code for readability and comments. Added linebreaks, spacing and block-style comments around main functions.
        • + +
        • Added generated documentation via "Rocco" (ruby port of Docco.)
        • + +
        • Added build.xml notes re: Closure compiler, MTASC and where to find working builds
        • + +
        • Modified soundmanager-nodebug.js build so comments and debug blocks are removed entirely from the code. Double-spaced linebreaks are also removed.
        • + +
        • Removed executable permissions from almost all files
        • + +
        • parseInt() on soundManager.flashVersion, invalidate strings like "9"
        • + +
        • Use 10 / 50 msec polling interval for high performance mode vs. regular mode
        • + +
        • Page cache/unload/restore (back button case): Only apply window unload event if using flash, since plugin is more likely to break (ie., state won't be recalled correctly.)
        • + +
        + +
      • + +
      + +
    • + +
    • + +

      V2.97a.20110801 - "100% HTML5 mode" desktop browser (+no flash) fix, useHTML5Audio enabled by default, flash 9 end-of-sound correction, ClickToFlash improvements (Download archived version)

      + +

      Last release introduced a regression with HTML5-only mode on desktops when flash was not installed/present, now fixed; HTM5 audio support is enabled by default, although flash is still preferred for MP3/MP4 by default. probably|maybe is now the default when testing HTML5 format support. Flash 9 now does not reset sound position to 0 at onfinish(), matching flash 8 and HTML5 behaviour. Better ClickToPlugin / ClickToFlash compatibility (CSS tweaks for display of blocked SWF.) Minor internal flash polling loop improvements. soundManager onload, onerror and oninitmovie events have been deprecated in favour of onready() and ontimeout(), but remain functional.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • A regression was introduced in V2.97.20110706 where SM2 would fail to start in HTML5-only mode on supported desktop browsers when flash was disabled or not installed, eg., Safari on new Macs or IE 9 without flash. (iOS was not affected.) This has been fixed with the 2.97.20110801 release.
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • +

          soundManager.useHTML5Audio is now true by default; however, soundManager.preferFlash is also true and HTML5 browsers will still attempt to use flash for playing MP3/MP4 by default, if those formats are marked as "required".

          +

          If you wish to have 100% HTML5 mode in more cases, set soundManager.preferFlash = false. Presently, the MP3 links and MP3 button SM2 demos are more HTML5-friendly and will serve as a test for exposing bugs that may be in the wild.

          +
        • + +
        • +

          soundManager.html5Test has been relaxed to use (probably|maybe) for Audio's canPlayType() test (previously, was only "probably") - so formats will be more likely to work on HTML5-only devices that conservatively report "maybe" for MIME types like audio/mpeg; codecs="mp3" at this point.

          +
        • + +
        • +

          Certain mobile and tablet-like devices are special-cased as preferring HTML5, and will ignore checking for flash altogether; this presently includes the iPad, iPhone and iPod, Palm Pre and Motorola Xoom.

          +
        • + +
        • +

          The HTML5 audio "loadeddata" event triggers an SMSound onload() event, which now fires whileplaying() and tries to pass identical bytesLoaded, bytesTotal parameters so that UIs will correctly show the sound as fully-"loaded" - even if in truth, not all bytes have actually been fetched (depending on the browser and server, etc.) because of the ability to do arbitrary seeking.

          +
        • + +
        • +

          Updated Flash 9 onfinish() / end-of-sound behaviour: Sound objects' position property no longer resets to 0 when a sound ends (and when onfinish() fires.) This now matches both HTML5 and flash 8's existing behaviour; therefore, a sound's position will equal its duration at onfinish() in all cases now. In the event play() is called from the end of a sound at or after onfinish(), the sound's position will be set to 0 before playback begins if using flash 9.

          +

          Edge case covered: if at internal SOUND_COMPLETE the SMSound.position is < its duration, flash will match position to duration and fire whileplaying() one last time so "100%" is always reached before onfinish() is called.

          +

          multiShot + multiShotEvent case has been verified as working (eg. onfinish() fires 5x if play() called 5x.)

          +
        • + +
        • +

          soundManager.onload, soundManager.onerror and soundManager.oninitmovie have been deprecated in favour of soundManager.onready() and soundManager.ontimeout(). The deprecated methods are still present and work with this release, but you should migrate to their modern replacements.

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          Flash 8 + 9 internal whileplaying() + whileloading() polling improvements: Internal check previously looped through all sounds from onLoad(), registerOnComplete(), _load() and _setPosition(). Now only the relevant sound is checked.

          +
        • + +
        • +

          Improved HTML5 support debug ouput/messaging, now right up top. Better messaging and error handling when Flash isn't present, yet required case (Flash plugin either not installed or disabled, but needed in some cases) - eg., Firefox and audioFormats.mp3.required = true; ... Also, only one _detectFlash() call now made.

          +
        • + +
        • +

          Playable MP3 links and MP3 button demos use soundManager.preferFlash = false, so they should be able to run in 100% HTML5 mode. Some HTML5 bugs are anticipated, and these may help to reveal issues via a smaller audience.

          +
        • + +
        • +

          Initialization code reorganized, minor edits and clean-up, removal of some unused objects and ternary optimizations per jslint

          +
        • + +
        • +

          Cleaned up IE <object> code, added highPriority flash param (affects flash 10.1+, if at all.)

          +
        • + +
        • +

          Improved flashblock handling / compatibility (CSS layout tweaks) with newer ClickToPlugin/ClickToFlash Safari (5.0.6 / 5.1+) extensions.

          +
        • + +
        • +

          SM2 homepage demos try HTML5 + Flash if available, with "safe" reboot + fallback to HTML5-only mode (if supported - eg., Safari with flashBlock/ClickToFlash.)

          +
        • + +
        • +

          Basic MP3 player demo: Fix event JS error when manually calling things like basicMP3Player.handleClick({target:document.getElementById('foo')});

          +
        • + +
        • +

          Flash SWFs, debug versions: Mention right-click -> security panel options when troubleshooting security errors

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20110706 - improved HTML5/flash "mixed mode" via preferFlash, Safari + Snow Leopard HTML5 audio bug update, better ClickToFlash compatibility, minor demo tweaks (Download archived version)

      + +

      Special note: This was V2.97a.20110705, but the latest Flex SDK (4.5.1.21328) was downloaded and used for this build, and it compiled a Flash 9 SWF that wouldn't fully-start on some Windows machines running Firefox and IE 7, possibly others - thus, SM2 would fail to start up. The Flash 9 SWFs are now compiled with an older, working SDK version 4.1.0.16076, used in previous working releases. See discussion for more details.

      + +

      Improved "mixed mode" HTML5/flash handling via new (experimental) preferFlash option, enabled by default. (If present, MP3/MP4 get flash for stability; HTML5 is used for other formats.) OS X 10.6.8 (finally?) fixes HTML5 audio in Safari. SoundManager 2 SWF adjusted to fall under ClickToFlash's "invisible" rules, may lower chance of blocking.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • ClickToFlash (Safari/Mac flashblock-style extension) compatibility improvement: Use width/height: auto on SWF instead of 100%. The latter is not recognized as being within ClickToFlash's <= 8x8px "invisible flash" rules, almost guaranteed to be blocked. (When considered "invisible", SWF is allowed to load normally if user has the invisibles option enabled.)
        • + +
        • Flash blocking/handling improvements: Default #sm2-container size now always 8x8px to fall under "invisible" flash rules, better chance of load being allowed. If blocked and using flashblock.css, #sm2-container reverts to 48x48px at ontimeout() for visibility (so user can see, and unblock the flash bit.)
        • + +
        • OS X 10.6.8 "pre-Lion release" update finally appears to have fixed the broken Safari HTML5 audio issue. Thus, audio was broken from OS X 10.6.3 to 10.6.7 and SM2 will use Flash for these known cases. Related: Testcase and Webkit bug #32159.
        • + +
        • HTML5 audio: Playback now does not start after a setPosition() call (if the sound was not already playing), or if it was paused - matching the existing Flash API behaviour.
        • + +
        • Fix ontimeout() queue incorrectly processing after onload() and successful startup.
        • + +
        • Debug output: extraneous "%s" fixes for onready() / ontimeout()
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • +

          Added experimental soundManager.preferFlash (default:true) for a more consistent MP3/MP4 playback option in certain HTML5 cases. If using soundManager.useHTML5Audio + preferFlash and flash is available, flash will be used for MP3/MP4.

          +

          HTML5 is still new and relatively unstable, and bugs are yet to be found and fixed across a growing number of browsers/platforms etc. (consider that it was broken on Safari between OS X 10.6.3 and 10.6.7.) If flash is not installed or preferFlash = false, 100% HTML5 mode can still apply. In any event, HTML5 will still be used (if enabled) for all other formats.

          +
        • + +
        • Moved internal html5Only to (experimental) soundManager.html5Only, for detecting "HTML5-only mode" - eg., iOS, Safari without preferFlash or other environments where SM2 is operating without the flash portion of SM2.
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • Improved "can play" detection (canPlayURL() + canPlayMIME()) for HTML5 + flash cases. Increased "getting impatient, waiting for flash" message to 1 second.
        • + +
        • 360°, inline, MP3 button players: Event add/remove: use addEventListener based on typeof attachEvent === null (old IE behaviour)
        • + +
        • MP3 player button demo: Fix IE 6/7 display issue on button (d'oh!)
        • + +
        • Muxtape-style demo: Added pagePlayer.playPrevious(), to match pagePlayer.playNext() (call when a sound is currently playing.)
        • + +
        • Fixed 360° player basic visualization demo (missing class in HTML), clarified canvas support (no eq/spectrum) re: IE <9.
        • + +
        • 360° UI: Old "empty element doesn't catch mouse events" bug apparently still applies to IE 9. Fix with invisible background image.
        • + +
        • Minor homepage stylistic updates, source code order change for API docs (CTRL-F search now hits left column first)
        • +
        • Small debug output clean-up in SM2, object/embed, init etc.
        • + +
        + +
      • + +
      + +
    • + +
    • + +

      V2.97a.20110424 - Minor HTML5 tweaks, option inheritance fixes, improved build.xml file (Download archived version)

      + +

      HTML5 bulletproofing, Audio(null) argument fix for iOS + Opera, load() vs. createSound() and setVolume()/setPan() options/inheritance correction

      + +
        + +
      • + +

        Bug fixes

        + +
          +
        • HTML5: new Audio(null) fix for differences between iOS (which would try to load null) and Opera 9.64, which would throw a WRONG_ARGUMENTS_ERR if null was not passed.
        • +
        • HTML5: Restrict internal volume value range to 0..1, avoid DOM exceptions.
        • +
        • HTML5: load{url:x}) improvements for desktop, better old vs. new URL comparison.
        • +
        • HTML5, iOS 4.2/4.3+, SM2 Muxtape/inline/link demos: onfinish()->unload()->playNext() was breaking on newer iOS versions, "play through" affected. Removing unload() for iOS fixed issue.
        • +
        • Flash object/embed pluginspage/codebase attribute now uses http:// when being used from file:// (offline), and http/https-agnostic //macromedia.com syntax to avoid SSL mixed-content warnings.
        • +
        • Fix setVolume() / setPan() to properly update SMSound.options (when not "instance-only"), so settings are retained for future play() calls. Bug was that original volume/pan were incorrectly restored after the first instance completed.
        • +
        +
      • + +
      • + +

        Miscellaneous

        + +
          +
        • +

          New and improved (nearly platform-independent) build.xml file, thanks to github user "dolmen". A .build.properties file is now needed, defining "mxmlc", "mtasc", and "closure-compiler.jar" paths. e.g.:

          +
          <!-- .build.properties file in SM2 root -->
          +mxmlc=/Applications/flexsdk/bin/mxmlc
          +mtasc=/Applications/mtasc/mtasc
          +closure-compiler.jar=${user.home}/compiler.jar
          + +

          Running ant from the SM2 root will build the no-debug and minified versions of the script, as well as the SWF files.

          + +
        • + +
        +
      • + +
      +
    • + + + + +
    • +

      V2.97a.20110306 - HTML5 audio updates, Flash/HTML5 mode detection, IE flash init tweaks, reuse and instance options fixes (Download archived version)

      + +

      Bug fixes and improvements for HTML5 audio (object reuse on iOS), improved URL comparison. onfinish() -> this.play() instance option fix. IE flash wmode initialization tweak. Flash/NetStream (MP4) unpause()/resume() hack now applies to everyone. If no flash found (eg., new Mac desktops), HTML5 audio will now be tried. Make hasPriority actually work (d'oh!)

      + +
        + +
      • +

        Bug fixes

        +
          +
        • HTML5: _resetProperties() when setting Audio().src, fix sound1.play() -> sound2.play() -> sound1.play() case on iOS 4.1 not correctly re-assigning original sound URL (related to global audio object.)
        • +
        • HTML5 audio: If no flash, try forcing useHTML5Audio = true (eg. desktop safari on new Macs which don't come with Flash.) Related: flash detection code tweak.
        • +
        • Improved _iO vs. old _iO URL comparison, rather than .src which gets translated from local paths to file:// etc.
        • +
        • Correctly trash instanceOptions (and _iO) before calling onfinish(), but maintain local copy of onfinish() so it still works. Fix play({onfinish:this.play}) bug where _iO was being incorrectly remembered.
        • +
        • Flash 9/movieStar: setPosition() unpause hack for everyone, not just Webkit (via 8tracks dudes, reported now in Firefox? Should not cause regressions.)
        • +
        • Special wmode tweak for reports of SM2 start-up failures, may be admin/non-admin account related, IE 8-only on Windows 7 (possibly Vista, too?) as of late January, 2011.
        • +
        • Apply hasPriority to object/embed, not its style. D'oh. :P
        • +
        • HTML5: use new Audio(null) vs new Audio(), Opera 9.64 expects URL argument; throws WRONG_ARGUMENTS_ERR otherwise. Doesn't implement canPlayType() either, but both are fixed in future releases.
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Don't actually apply new value in setPosition() if a sound has not yet loaded (and if so, hasn't errored out.)
        • +
        • isNaN() check for HTML5 loading (saw one under Safari, in testing).
        • +
        • Added CLSID and codebase attributes for IE <object> (same as used in SWFObject), just to be safe.
        • +
        • Removed some HTML5 debug bits, unused _HTML5_states/codes block.
        • +
        • Flashblock CSS: Correctly hide the SWF via left/top:-9999em when it hits .swf_loaded {}, ie., never blocked in the first place. Minor flashblock regression fixes after .swf_loaded / .swf_unblocked changes with last release.
        • +
        • Ant build script parameter change, now uses .build.properties file (related pull request)
        • +
        +
      • + +
      +
    • + +
    • +

      V2.97a.20110123 - HTML5 audio improvements for desktop + mobile (iOS), 360° UI demo tweaks (Download archived version)

      + +

      Tweaks to HTML5 features, "mixed-mode" HTML5 + flash cases, desktop and iOS tweaks. Improved sound re-use and "play-through" on iOS (believed previously working, may have regressed with iOS 4.2.1.) Code clean-up and shuffling of homepage, 360° demo (jslinted and improved functionality), load({options}) fix, better handling of broken Safari/Snow Leopard audio case.

      + +
        + +
      • +

        Bug fixes

        +
          +
        • Fix for soundManager.load({options}) / SMSound.load({options})-specific case (regular load() sans-parameters was fine), where load({onload:...}) would fail if a URL parameter was not specified. load({url:...,onload:...}) was OK. If unspecified, load now takes URL from SMSound.url.
        • +
        • Fixed unload/replay case on iOS: play sound #1, interrupt it by starting sound #2, then play sound #1 again - previously, #1 would fail on replay due to interrupted state since iOS only allows one sound at a time. Should now restart OK. (This applies to the new soundManager.useGlobalHTML5Audio stuff.) Playlist auto-advance looks to be OK as well.
        • +
        +
      • + +
      • +

        API Updates

        +
          +
        • New (experimental) soundManager.useGlobalHTML5Audio property - if true (default for iOS/mobile), reuses a single Audio() object for loading sound. Helps make playlist / onfinish()->play() work on iOS without user interaction.
        • +
        • New (experimental) soundManager.requireFlash property (default: false.) If true, prevents HTML5-only mode on devices with both HTML5 and Flash. May be useful when HTML5 is enabled (and can play MP3), but Flash is desired to play RTMP content etc. As of this version, will only use Flash for RTMP.
        • +
        • HTML5: Fix for type:'audio/mp3' returning false on canPlay(). Timer update-while-paused tweak.
        • +
        • HTML5: More event listeners, ignore events on destroyed sounds, improved event clean-up, "seek before load" fix
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Improved broken Safari/Snow Leopard HTML5 audio situation: HTML5 mode is no longer disabled - and if available, Flash is used to play MP3/MP4 content to work around known playback issues with native HTML5 audio.
        • +
        • (Finally) report "true" position of MovieStar (MPEG4/AAC) content while scrubbing a playing/paused sound. Previously did not fire updates while scrubbing. Imperfect on resume due to buffer, but should be negligible and an improvement vs. old behaviour.
        • +
        • 360° player refresh, works with multiple types (eg. small 48x48 square vs. large 256x256 square w/spectrum + EQ visualizations) on the same page now. Can play and seek simultaneously, as well. More configurable. Removed old empty.gif + imageRoot junk. Core JS now appeases the jslint gods.
        • +
        • Code clean-up, removed undocumented/experimental playOnSeek and related methods from a prior fork.
        • +
        • Fresh homepage demo design/layout, should be nicer for new users.
        • +
        +
      • + +
      +
    • + +
    • +

      V2.97a.20110101 - Simplified onready() behaviour (see potential onready() regression note), new ontimeout() handler, Webkit + MovieStar 30-second-pause fix (Download archived version)

      +

      onready() is now called only for SM2 init success (makes default case easier, no need for "supported" check) - new ontimeout() is called only for failure case, ie., flash blocked/missing. Special Webkit/MovieStar won't-resume-after-30-seconds-paused fix. soundManager.supported() renamed to soundManager.ok() (old method aliased for the time being.)

      + +
        + +
      • +

        Bug fixes

        +
          +
        • Special bad case, Webkit/Flash+MovieStar (AAC/MPEG4/RTMP-only, not MP3): sounds don't resume after being paused for 30+ seconds(?), but setPosition() with current position gets things going again after a resume() attempt. Reported via 8tracks dudes.
        • +
        +
      • + +
      • +

        API Updates

        +
          +
        • +

          In previous releases, the soundManager.onready() queue would be processed for both OK and failure cases. The onready() queue is now processed only if successful initialisation occurs, making old "supported" checks within the onready() handlers redundant.

          +

          Potential regression note: Old error case handling within onready() will never execute as a result of this change. Update your code to use the new explicit soundManager.ontimeout() handler instead.

          + +
          +

          Old onready() method

          +
          soundManager.onready(function(){
          +  if (soundManager.supported()) {
          +    // OK, play sound etc.
          +  } else {
          +    // SM2 could not start; message user?
          +  }
          +});
          +
          + +
          +

          New onready() / ontimeout() method

          +
          soundManager.onready(function(){
          +  // OK, play sound etc.
          +});
          +
          +soundManager.ontimeout(function(){
          +  // SM2 could not start; message user?
          +});
          +
          + +
        • +
        • New soundManager.ontimeout(myFunction) method, for asynchronous queueing of init failure handlers. Fired only when SoundManager 2 is unable to initialise (usually due to blocked/missing flash, or flash security error.) Queue behaviour is the same style as onready().
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Code cleanup: Took the unsupported "jsAMP" demo (2007 prototype) out back and shot it.
        • +
        • 360° UI demo: New "allowMultiple" config option, let 2+ sounds play at once etc. (Default: false, one at a time.)
        • +
        • 360° UI, canvas visualization demo: Minor layout, UI, code tweaks
        • +
        • API/docs/demos reference and use updated onready()/ontimeout() methods.
        • +
        +
      • + +
      +
    • + +
    • +

      V2.97a.20101221 - HTML5 loading/progress and RTMP tweaks, onready() double-firing fix, hasPriority for mobile flash, Muxtape-style player now AJAX-friendly (Download archived version)

      +

      Improved HTML5 whileloading() / whileplaying(), unload and event handling. hasPriority for off-screen SWF loading on mobile, replaces old mobileFlash positioning tricks. Effectively re-wrote page player (Muxtape-style) demo to use event delegation + read live DOM, so should not break in AJAX cases. RTMP onplay() / play() / buffering fixes, setPosition() regression fix.

      + +
        + +
      • +

        Bug fixes

        +
          +
        • Double onready()-firing bug (HTML5 and non-flashblock case) fixed.
        • +
        • HTML5: Don't request null/about:blank URL with unload(), may hang/JS error in Chrome and IE 9 preview 7.
        • +
        • RTMP: Ensure onplay() is called for auto-loading streams when resumed. Don't call play() until connected. play() sets flash pauseOnBufferFull = false (fix for reported "RTMP not playing audio" issue.)
        • +
        • overHTTP was likely returning incorrect values previously - now fixed.
        • +
        • unload() tweak: Ensure position is reset to 0 if unload() fails
        • +
        • Flash audio: Log metaDataHandler info if debug enabled, possible duration metaData fix
        • +
        • No HTML5 audio for any Safari on OS X Snow Leopard 10.6.[3|4|5] due to underlying bugs causing intermittent audio playback failure; ongoing Apple issue, on their radar. Amusingly, Safari on Windows appears to be fine.
        • +
        +
      • + +
      • +

        API Updates

        +
          +
        • Revised HTML5 Audio() events, improved whileloading() / whileplaying() / onload() for Webkit and Firefox 4. Progress/onload are still a bit quirky as HTML5 audio is more about "non-linear" loading including range and partial requests, where supported. See related discussion.
        • +
        • New soundManager.ok() method, nicer alias for soundManager.supported().
        • +
        • Took soundmanager.loadFromXML() (SM1 legacy method) out back and shot it. Last tweak was in 2008, nobody uses it.
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Flash <object> / <embed>: hasPriority attribute, enables off-screen SWF loading with Flash 10.1+. Removed mobileFlash positioning/repositioning tricks in lieu of this.
        • +
        • Effectively re-wrote page-player (Muxtape-style) demo, now traverses live DOM for next item(s). Should be more AJAX-friendly. Event delegation now handles any links added at any time. Externalised experimental features, too.
        • +
        • HTML5: If URL lacks type attribute and extension such as .mp3 (worst-case scenario, you shouldn't be doing this anyway) just try dumbly loading it - imitating Flash behaviour.
        • +
        • Improved dataerror (wave/spectrum) exception handling, should result in lowered CPU use if playback continues with access exceptions (eg. YouTube video going in another tab.)
        • +
        • Start-up debug output/messaging clean-up (no movieStar in flash 8, minimal output in HTML5-only mode, etc.)
        • +
        • Add window unload handler if Flash being used, so back button will cause a page refresh (vs. the browser showing "previous state") to reinstate Flash in good browsers. Previously, the "previous state" was be shown but Flash audio would be broken.
        • +
        • ipod (ipod touch) gets HTML5 now, too.
        • +
        • Microsoft have added Audio() to Internet Explorer 9 as of "Platform Preview 7" - previous pre-releases of IE 9 only implemented <audio>, which SM2 does not use.
        • +
        +
      • + +
      +
    • + +
    • +

      V2.97a.20101010 - Code cleanup, HTML5 audio tweaks, RTMP features, removal of experimental video, optional usePolicyFile crossdomain.xml feature (Download archived version)

      +

      Shuffling of SoundManager 2 core, approximately 5% shaved off full debug-enabled file size after bug fixes, additional comments, new features and so on. Internal event handling code cleaned up. .SWF builds optimized, Flash 9 non-debug version now under 10 KB. Debug version now flash debugger-enabled. RTMP improvements for Red5 + Flash Media Server streaming cases - buffering, event and state handling. Experimental video feature is toast, createVideo() no longer implemented. iPhone + iPad touch events on page player + 360° player UI demos; tap and drag to seek, etc.

      + +
        + +
      • +

        Bug fixes

        +
          +
        • No HTML5 audio for *any* Safari on OS X Snow Leopard 10.6.[3|4] due to underlying bugs causing intermittent audio playback failure; ongoing Apple issue, on their radar. (See related GitHub commit)
        • +
        • Don't unload() at onfinish() for HTML5 audio (was originally done to be conservative, but results in additional HTTP requests despite caching expectations?)
        • +
        • onload() for HTML5 now using proper boolean values
        • +
        • Fix NetStream-specific autoLoad/autoPlay/volume createSound() call, specific null flash sound object error scenario. (Related changes on GitHub.)
        • +
        • Fix for "onbufferchange(1) followed immediately by onbufferchange(0)" case when audio was actually still buffering.
        • +
        • Removed setPosition() within unload(), cleaner exit when destroying a sound
        • +
        +
      • + +
      • +

        API Updates

        +
          +
        • Removed experimental video feature (originally added late 2008, never developed further.) createVideo(), allowFullScreen and related video methods are now gone. Other dedicated HTML5/flash video player projects have since solved this problem.
        • +
        • New SMSound option: usePolicyFile - (boolean, default: false) - enables Flash to request /crossdomain.xml file for content on third-party domains, if access to ID3/metadata such as wave/peak/spectrum is needed. Will automagically enable if onid3() or peak/wave/spectrum features are being used.
        • +
        • console.warn()-style messaging (instead of throwing exceptions) if createSound() etc. are called before SM2 init has fired. Now calls similar warning and exits if called after a failed, unsuccessful startup (ie., timeout or not-supported case.)
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • SoundManager 2 core code cleanup, ~5% shaved off soundmanager2.js code size after new features, bug fixes and comments etc. Internal event handling (DOM-related events for init, IE 6 vs. everybody else) improved.
        • +
        • Flash builds optimized; Flash 9 SWF build now under 10 KB. Debug-enabled Flash 9 SWF now hooks into Flash debug player/IDE debugging tools (compiled with -debug=true)
        • +
        • Attempt to detect RTL documents, position Flash accordingly if so to avoid long horizontal scrollbar issue (related discussion)
        • +
        • iPhone + iPad touchmove() and related events added to page player + 360° player UI demos; tap and drag to seek should now work.
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.96a.20100822 - HTML5 audio support no longer alpha, Safari 5.0.1/SL HTML5 audio issues continue, iPad/iPhone "play through", Flash tweak for Android (Download archived version)

      +

      useHTML5Audio feature now considered beta-worthy, though disabled by default to be safe (with the exception of iPhone + iPad.) iPhone/iPad will now play a sequence of sounds, user interaction only required to start first one. Flash on-screen positioning tweak for Android devices that run Flash. Safari 5.0.1 on Snow Leopard exhibits same buggy HTML5 audio issue, disabled by default; Apple have been notified. IE 9 "Platform Preview 4" has <audio> but no Audio() support (yet?) See bug #586311 (may require connect.microsoft.com / Windows Live ID, login first etc.)

      + +
        + +
      • +

        Bug fixes

        +
          +
        • HTML5 Audio() still broken in Safari 5.0.1 on Snow Leopard (10.6.3, 10.6.4), where sounds intermittently fail to load and play. Apple are aware of the regression. Related bug: #32519. Include sm2-ignorebadua in URL on SM2 pages to ignore this check and verify broken behaviour, etc.
        • +
        • Tweaks for experimental RTMP feature re: handling of paused state, tracking of position and onfinish() firing early.
        • +
        • Bumped SWF z-index to 5000 for Safari 5, SoundCloud-reported bug-and-fix for Safari 5-specific bad redraw issues, and occasional crash case referencing WebCore::RenderLayer::paintLayer
        • +
        +
      • +
      • +

        API Updates

        +
          +
        • iPhone/iOS 4 and iPad can now play a sequence of sounds (once the user starts sound initially), provided onfinish() is used to create/play the next sound. Example: Muxtape-style UI on homepage will play through list without further interaction once a user plays something in the list.
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Special case for getting SM2 working more reliably on HTC Android + Flash 10.1, where flash does not load until on-screen (ie., in view.) If off-screen, Flash is repositioned at left/top 0px in order to load (including scroll/resize if needed), then events released and movie is repositioned off-screen. If movie is in the DOM already eg. as in useFlashBlock cases, flashLoadTimeout is set to 0 to allow infinite wait (eg., SM2 will not timeout with an error, and will simply load when the flash is scrolled into view.)
        • +
        • Documentation: Clarified createSound() behaviour if an existing sound ID is given (returns sound object "as-is", ignores any options passed.)
        • +
        • Page-player demo updated to use canPlayLink() instead of canPlayURL, more flexible link/type handling.
        • +
        • Homepage and documentation UI/layout and language tweaks, a few new "as seen on the internets" icons etc.
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.96a.20100624 - Safari 5/Snow Leopard 10.6.3/10.6.4 HTML5 Audio() issue, X-domain SWF build fixes (Download archived version)

      + +

      Disabling HTML5 Audio for Safari 5 on Snow Leopard 10.6.3 + 10.6.4 (current release) only, as it is broken similar to Safari 4.x (also on Snow Leopard only.) Related bug: #32519. Also, version info in SWFs and fixed X-domain SWF build.

      + +
        + +
      • +

        Bug fixes

        +
          +
        • HTML5 Audio() still broken in Safari 5 on Snow Leopard (10.6.3, 10.6.4) - disabling for now, falling back to Flash as with Safari 4.x on Snow Leopard. Include sm2-ignorebadua in URL to ignore this check and verify broken behaviour, etc.
        • +
        • Fixed X-domain SWF builds to actually work cross-domain.
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Added version info string to SWFs in Flash right-click / context menu, helpful when troubleshooting SWFs.
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.96a.20100606 - RTMP (Flash Media Server) Support, HTML5 Updates (Download archived version)

      + +

      HTML5 update, new RTMP feature: Experimental Flash Media Server support, onposition() event listener, SMSound type option and code cleanup.

      + +
        + +
      • +

        API Updates

        +
          +
        • New experimental RTMP support while maintaining existing NetStream-based behaviour for non-RTMP MPEG4 audio, etc. Uses new serverURL parameter for FMS (I used Red5 for dev/testing,) eg. soundManager.createSound({id:'rtmpTest',serverURL:'rtmp://localhost/oflaDemo',url:'oh-alberta.mp3'}).play();
        • +
        • New SMSound option for createSound(), load(), play(): 'type', for specifying MIME type alongside URL to help with detecting playability. eg. +soundManager.createSound({id:'foo', url:'/player.php?stream=1', type:'audio/mp3'}).play(); and so on. Hat tip: sylvinus.org
        • +
        • New SMSound event: onposition(), for attaching listeners to specific times within a sound.
        • +
        +
      • +
      • +

        Bug fixes

        +
          +
        • Flash sound unload/destroy ActionScript "could not close stream" exception/warning (finally?) fixed.
        • +
        • Sound looping updated for Flash 8, working (albeit with a quirk - requires preloading.)
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Removed Base64 HTML5 Audio() tests, redundant as numerous MIME (audio/mpeg, audio/mp3 etc.) checks seem to cover it.
        • +
        • Updated MPC (drum machine) demo from 2006-era design, modernizing the CSS a bit.
        • +
        • nullURL = 'about:blank' tweak for unloading (flash 8.) May have finally fixed that dumb stream closing error on unload/destroy.
        • +
        • set soundManager.didFlashBlock *before* firing onready()/onerror() listeners
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.96a.20100520 - HTML5 Edition (Download archived version)

      + +

      Experimental HTML5 support, lots of code shuffling and performance tweaks.

      + +
        + +
      • +

        API Updates

        +
          +
        • New soundManager.useHTML5Audio (disabled by default except for iPad, Palm Pre) - adds experimental HTML5 Audio support, with Flash fallback for MP3/MP4 formats as needed.
        • +
        • Sound looping now works in Flash! eg. mySound.play({loops:3}); - for an example + discussion of how to get near-seamless looping, see Seamless Looping MP3s in Flash (demo video) on Flickr.
        • +
        +
      • +
      • +

        Bug fixes

        +
          +
        • beginDelayedInit() is always used in lazy loading case (eg. via dynamic script tag/XHR etc.,) as some cases where SM2 won't auto-start eg. document.readyState empty for Firefox 3.5.5 (seen on Win32) with an HTML5 DOCTYPE.
        • +
        • SWF is now 8x8 pixels by default, vs. 6x6 pixels (odd fix for HTML5 Doctype on Firefox 3.6/win32)
        • +
        • Fixed dumb IE undefined ID bug
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • soundmanager2.swf and soundmanager2_flash9.swf are now "non-debug" versions; with debugMode enabled, soundmanager2_debug.swf and soundmanager2_flash9_debug.swf are loaded instead.
        • +
        • New build script for JS + SWFs, see file size table. JS compression now done via Google Closure compiler; new soundmanager-jsmin.js build, debug-enabled but compressed, in addition to build-script-optimized, no-debug, compressed JS (~9 KB with gzip vs. ~90 KB for raw, commented, debug-enabled version.)
        • +
        • Null check fix for unavailable eq/waveform data
        • +
        • Experimental video (flash 9-only) change: Use stage width/height instead of 0/0 when lacking metadata
        • +
        • Page player whileloading() calls now being throttled
        • +
        • Better page player click handling for IE 7
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.95b.20100323 (Download archived version)

      +

      useFlashBlock, better handling of time-out/errors (CSS-based SWF repositioning options for unblocking on time-out), "play MP3 button" demo, canPlayLink(), canPlayMIME(), eqData + waveformData for AAC/H.264 (movieStar) content, missing documentation and miscellaneous bug fixes.

      + +
        + +
      • +

        API Updates

        +
          +
        • New soundManager.useFlashBlock (disabled by default) - enables CSS classes assigned to SWF container indicate start-up state (ok/error/blocked), allowing positioning/display of SWF for unblock cases and successful recovery from unblocking. Built into homepage + (most) demos. Updated flashblock demo as well.
        • +
        • playableClass attribute eg. <a href="foo.php" class="inline-playable">, allowing URLs without .mp3 to be picked up
        • +
        • New soundManager.canPlayLink() + canPlayMIME(), ability to check <a href="foo.php" type="audio/mp3"> for example
        • +
        +
      • +
      • +

        Bug fixes

        +
          +
        • soundManager.play() type check fix, instanceof Object vs. typeof x === 'Object' (typo)
        • +
        • computeSpectrum() can access waveform and eq (spectrum) data for movieStar (AAC/MP4, netstream-based) objects, too.
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Moved old demo code using $() to _id(), _$ in soundManager2 to _id() to avoid potential jQuery (and other $-based library) collisions
        • +
        • Make new SoundManager('/path/to/swfs/'); actually work.
        • +
        • Flash time-out (flash blockers) vs. security failure detection/other error cases is smarter on the SM2 homepage now
        • +
        • New "MP3 player button" demo
        • +
        • Removed old IE onclick handler fix in several demos for non-MP3 links
        • +
        • eqeqeq = true for jslint, why not.
        • +
        +
      • + +
      +
    • + + +
    • +

      V2.95b.20100101 (Download archived version)

      +

      New features: Flash movie debugging in SWF via debugFlash (default:false), SMSound.eqData = { left:[], right:[] }, code tidying and debug output clean-up

      + +
        + +
      • +

        API Updates

        +
          +
        • New soundManager.debugFlash property, enables debug messages from within flash (output to flash movie). Useful for troubleshooting start-up, security issues etc. Flash debug output example
        • +
        • SMSound.eqData now has left and right channels - e.g. eqData = { left: [], right: [] } - was previously a single array: eqData = []; Backwards-compatibility is maintained for now as eqData[i] still works with the new structure.
        • +
        +

        Bug fixes

        +
          +
        • stream = true is no longer automatically set when SMSound.play() is called and readyState == 0, as it was breaking the stream:false case where playback should not start until the sound has fully-loaded.
        • +
        • soundManager.reboot() forces recreation of object/embed rather than old method of node remove/re-append (in case other options changed, eg. debugFlash was false, but assigned to true after an error during start-up.)
        • +
        +

        Miscellaneous

        +
          +
        • Review of all SM2 debug output, more concise and informative messaging - especially around start-up troubleshooting/error debugging, security sandbox errors, SWF 404 case etc.
        • +
        • Code formatting clean-up (via jsbeautifier.org) + soundmanager2.js tested and passes JSLint, Edition 2009-11-22 + options: /*jslint undef: true, bitwise: true, newcap: true, immed: true */
        • +
        • Better organization/use of strings for debug output
        • +
        • New canvas-based favicon VU meter demo for home page, 360 player and muxtape-style player demos where supported (Firefox and Opera, currently.) Firefox 3.6 is disappearing support for XBM images, which were previously used.
        • +
        +
      • + +
      +
    • + +
    • +

      V2.95a.20090717 (Download archived version)

      +

      New features: onready(), fast polling, flash blocking demos etc.

      + +
        + +
      • +

        API Updates

        +
          +
        • New soundManager.onready(myFunction[,scope]) method, for asynchronous queueing of onload()-style handlers. Fires when SM2 has finished initialising. Accepts an optional scope parameter to apply to handler; if none given, window object is used. A "status" object is passed to your handler (can be ignored) which includes a success boolean indicating whether SM2 loaded OK or not. Handlers added via onready() after successful initialisation will fire immediately.
        • +
        • New soundManager.oninitmovie() event callback, single assignment similar to onload(). Fires when the flash movie has first been written to (or read from) the DOM. Used internally for a flashblock-handler-related example, custom timeout condition.
        • +
        • New soundManager.useFastPolling property (false by default), enables 1 msec Flash 9+ timer for highest-possible whileplaying() and related JS callback frequency (default is 20 msec.) Use with soundManager.useHighPerformance = true for best performance, frame rates while updating the UI via whileplaying() etc.
        • +
        • New sound option (soundManager.defaultOptions): multiShotEvents (default:false) - enable support for multiShot-style events (currently onfinish() only). Eg. When mySound.play() is called three times, onfinish() will subsequently fire three times.
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • createSound now writes a warning to debug output if the sound ID is a number, or is a string starting with a numeric character. Because SMSound objects are stored in soundManager.sounds[], while not syntactically invalid, numeric IDs will be treated as array indices and are likely to break things.
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • New flashblock / "click to flash" demo, example of handling blocked conditions and graceful recovery when flash is initially blocked until user chooses to allow it.
        • +
        • Cross-domain-scripting enabled SWF (using allowDomain("*")) included in swf/ directory (in its own .zip file.) Use when you must have domain A loading SM2 .SWF from domain B, or for testing etc and can't compile your own custom x-domain SWF from source.
        • +
        • Documentation, layout and menu tweaks
        • +
        +
      • + +
      +
    • + +
    • +

      V2.95a.20090501 (Download archived version)

      +

      Lots of updates.

      + +
        + +
      • +

        API Updates

        +
          +
        • Added soundManager.allowFullVideo for full-screen video playback, triggered by double-clicking. Also, related soundManager.onfullscreenchange event handler.
        • +
        • Updated waveformData to include stereo channels. Now an object literal instead of a single array. New format: SMSound.waveformData = { left: [], right: [] }
        • +
        • New SMSound.ondataerror() (flash 9+) handler for cases where waveform/eq data is inaccessible due to other flash movies in the current browser which have loaded sound. (Flash must have security permissions to "read" all data currently being output, long story short. Having a YouTube tab open can cause this, for example.)
        • +
        • New isBuffering property for MovieStar (MP4 audio/video) content, related onbufferchange() event handler (sound object)
        • +
        • New bufferTime property for MovieStream content. Defines seconds of data to buffer before playback begins (null = flash default of 0.1 seconds; if AAC playback is gappy, try up to 3 seconds.)
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • Off-screen flash with wmode set to non-default value (transparent/opaque) will break SM2 for non-IE on Windows, time-out error style. SM2 will now revert wmode to default for this case (losing transparency/layering of movie) - or set soundManager.flashLoadTimeout to 0 and SM2 will retain wmode, but must now wait potentially infinitely for flash to load (until user scrolls it into view.) soundManager.specialWmodeCase reflects if this fix has been applied after init time.
        • +
        • Calling soundObject.load() after directly assigning a value to soundObject.url should now work as expected.
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Shiny new "360° UI" canvas + visualization demos (Warning: Beta-ish code.)
        • +
        • Experimental SM2 exception/error handling + stack trace reporting added, an attempt to make custom errors thrown from SM2 more meaningful (ideally showing the user's call to SM2 where things went wrong in the stack.)
        • +
        • Calling soundObject.load() after directly assigning a value to soundObject.url should now work as expected.
        • +
        • soundManager.useHighPerformance update: Now false/disabled by default. Strange bug with JS/flash communication breaking with wmode=opaque on flash, specific (?) to Firefox on windows. SM2 does not normally set wmode. When useHighPerformance = true, wmode=transparent will be used on the flash movie by default.
        • +
        • Tweaks related to position, whileplaying(), playState, buffering and state resetting when sound has finished playing (fixes for a few edge cases if replaying or reusing the same sound or video.)
        • +
        • Better code/feature separation and clean-up on inline player, Muxtape-style demos
        • +
        +
      • + +
      +
    • + +
    • +

      V2.94a.20090206 (Download archived version)

      + +
        + +
      • +

        API Updates

        +
          +
        • New isBuffering property, related onbufferchange() event handler (sound object)
        • +
        • New soundManager.reboot() method (experimental): Shut down and re-initialise SoundManager, remove and recreate flash movie (possibly handy for cases where you want to restart after flashblock-type whitelisting, etc.)
        • +
        • New soundManager.flashLoadTimeout property, milliseconds SM2 will wait for flash movie callback before failing and calling soundManager.onerror() during start-up/init. If set to 0, SM2 will wait indefinitely for flash (good for reboot/flashblock-type scenarios.)
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • Reverted Firebug 1.3 console.log().apply() hack, was breaking console.log() under IE 8 RC1 (as used with debug mode.) Firebug 1.3 seems to have a bug, occasional "console undefined" error.
        • +
        • Fixed a dumb flash 9/AS3 bug with setVolume() passing an extra parameter to flash.
        • +
        • soundManager.useHighPerformance update: Now false/disabled by default. Strange bug with JS/flash communication breaking with wmode=opaque on flash, specific (?) to Firefox on windows. SM2 does not normally set wmode. When useHighPerformance = true, wmode=transparent will be used on the flash movie by default.
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Tweaked project page / documentation UI, nicer code/debug formatting
        • +
        • Misc. API documentation fixes, improvements
        • +
        +
      • + +
      + +
    • + + +
    • +

      V2.93a.20090117 (Download archived version)

      + +
        + +
      • +

        General Updates

        +
          +
        • New SoundManager 2 start-up debugger / troubleshooting tool, built into project home (see troubleshooting, and a standalone version - see "troubleshoot/" directory of download package)
        • +
        • New soundManager.getMemoryUse() method (flash 9+.) Returns RAM use for flash plugin (appears to be browser-wide, possibly system-wide by design.) Video demo includes an example RAM use monitor.
        • +
        • highPerformance disabled by default for Firefox on Windows due to reports of bugs preventing SM2 start-up in some cases. To override the disabling safety check, set soundManager.useHighPerformance = 'always';
        • +
        • Updated API demo testcases (API Demo page)
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • Fixed Flash 8 bug with autoLoad/autoPlay and playState not being correctly set.
        • +
        • Fixed a bug with onfinish() not firing when autoPlay is used.
        • +
        • Fixed a bug with pan and volume defaults not being correctly inherited and handled
        • +
        • console[method]() now uses apply(), preventing possible Firebug 1.3-related scope issue where this != console
        • +
        • IE now appends (vs. destructive .innerHTML write) SWF movie to target element, appends DIV with className "sm2-object-box"
        • +
        +
      • + +
      + +
    • + + +
    • +

      V2.92a.20081224 (Download archived version)

      + +
        + +
      • +

        General Updates

        +
          +
        • Note: Flash (SWF) assets moved to swf/ subdirectory, starting with this version.
        • +
        • Updated design on API demo page, new looping example
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • Improved regular-expression-based URL detection for canPlayURL(), flash 8/9 and MovieStar (video) formats
        • +
        • Improved soundManager.url-related normalizeURL() handling. If GET parameters are in the URL including the SWF, it will be left alone.
        • +
        • Fixed out-of-bounds issue with setPosition().
        • +
        • Fixed a setPosition(0) and before onfinish()-related issue, so it is possible to nicely loop sounds from within onfinish() - see looping a sound (API demo)
        • +
        • Fixed an error condition where destroying a loading sound would not terminate the HTTP request, relating to error cases involving netStream.close().
        • +
        +
      • + +
      + +
    • + + +
    • +

      V2.91a.20081205 (Download archived version)

      + +
        + +
      • +

        General Updates

        +
          +
        • Completely-redesigned project page, multiple pages/sections, more-legible grid-based documentation layout
        • +
        • Code verified with jslint. 0 errors reported with default settings, Edition 2008-11-26
        • +
        +
      • + +
      • +

        Bug fixes

        +
          +
        • True XHTML DOM compatibility. Rewrote createMovie() to use standard DOM createElement() methods, vs. previous writing to .innerHTML method which caused exceptions with XHTML documents.
        • +
        • Special-cased useHighPerformance for Firefox 2 only, disabling it as it seems to be problematic. Further research pending.
        • +
        • Removed try .. catch error handling within soundManager.onload(), catching exceptions when calling user-defined onload handler. Errors should now fall through as normally expected.
        • +
        • Fixed several setPosition()-related bugs (NaN/undefined error, seeking to invalid position, position inconsistencies with pause/resume)
        • +
        +
      • +
      + +
    • + +
    • +

      V2.90a.20081028 (Old documentation theme) - Download archived version

      + +
        +
      • +

        API: Bug fixes

        +
          +
        • Fixed numerous Flash AS3 exceptions for Flash 10 plugin users of SM2 with Flash 9 .SWF
        • +
        • Fixed a setPosition() bug where position > duration would stop sounds playing in other tabs
        • +
        • Fixed createSound(); play(); destruct(); sequence to correctly stop sound under Flash 9
        • +
        • Changed Flash 9 onload() to properly pass boolean "false" on load failure, same as Flash 8
        • +
        • Fixed autoLoad=true bug with Flash 9 movieStar (MPEG4) content, now pauses after creating
        • +
        +
      • + +
      • +

        API: New shiny!

        +
          +
        • soundManager.useHighPerformance: Minimize JS/Flash lag, ~3x whileplaying() frequency! (Most noticeable on Mac OS X, and Safari on Windows? Investigating IE cases.)
        • +
        • soundManager.pauseAll() / soundManager.resumeAll(): Global pause/resume
        • +
        • soundManager.muteAll() / soundManager.unmuteAll(): Global mute/unmute
        • +
        +
      • + +
      • +

        MovieStar MPEG4 video support! (experimental)

        +
          +
        • soundManager.createVideo() / soundManager.destroyVideo() for MovieStar MPEG4 formats!
        • +
        • Uses same SMSound instance object and API methods/options as regular sounds, with a few extra parameters
        • +
        • soundManager.useVideo will show video when applicable (false/disabled by default)
        • +
        • SMSound.onmetadata: Meta data handler for MPEG4 video files - provides dimensions (w/h)
        • +
        +
      • + +
      • +

        Miscellaneous

        +
          +
        • Removed experimental flashBlock support. Considering eliminating SM2 timeout-based onerror() behaviour in favour of asynchronous loading (eg. user may initially block, notice flash movie and take action to unblock many seconds after loading - thus, flash movie eventually loads and can eventually trigger successful SM2 init.)
        • +
        • Modified pause() and resume() to only affect playing sounds (eg. playState != 0).
        • +
        +
      • + +
      + +
    • + + + +
    • +

      V2.80a.20081005

      + +
        +
      • +

        API: Bug fixes

        +
          +
        • Changed Flash 8 onload() boolean "loaded" to be based on sound duration being >0, better test of load success.
        • +
        • Modified Flash 9 onload() to include boolean result for success/fail, parity with Flash 8
        • +
        +
      • + +
      • +

        API: New shiny!

        +
          +
        • +

          Added experimental Flash 9.0r115+ (flash codename "MovieStar", Flash 9 Update 3) MPEG4 / HE-AAC support (audio only.) A subset of MPEG4 should be supported including FLV, MP4, M4A, MOV, MP4V, 3GP and 3G2 files. Feature is disabled by default.

          +
            +
          • New soundManager useMovieStar property, controls feature availability (currently disabled by default.)
          • +
          • New SMSound option, isMovieStar, configures feature behaviour on a per-sound basis. Default (null) is to auto-detect .mp4, .mov etc. in URL and enable if found, but can also be forced on or off (true / false).
          • +
          • Video-based formats use the Flash 9 NetStream and NetConnection objects, whose API differs slightly from the Sound object. Seeking is limited to video key frames and is not as smooth as an MP3.
          • +
          • Audio playback has been seen to pause during certain events (window scrolling, etc.) while playing MovieStar formats. It doesn't appear to be from CPU overload. More investigation is needed.
          • +
          • Basic load, progress, onload, whileplaying API support is provided (page player demo includes MP4 and FLV formats). Not all methods (eg. setVolume) have been tested.
          • +
          • .AVI is not included by default, but may work if the format is actually MPEG4-based.
          • +
          • Format limitation note: EQ, peak and spectrumData are not available with MovieStar content. This may be a Flash 9/AS3 limitation.
          • +
          +
        • +
        +
      • + +
      • +
          +
        • +

          Miscellaneous

          +
            +
          • Added CSS checks to page player: "exclude" and "playable" to override default URL matching behaviour.
          • +
          +
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.78a.20080920

      + +
        +
      • +

        API: Bug fixes

        +
          +
        • Added SoundLoaderContext parameter to load(), Flash should now check policy-related (crossdomain.xml) files when loading resources from remote domains. Should fix previous security exception warnings when trying to access ID3 and/or waveform/EQ data. See related SoundLoaderContext documentation (ActionScript 3)
        • +
        • Fixed a bug with load(), was improperly expecting an options object - now works properly.
        • +
        +
      • +
      • +

        API: New shiny!

        +
          +
        • Added soundManager.altURL property (and useAltURL conditional) for convenient offline and other URL switching cases (dev vs. production environments, etc.)
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Renamed internal soundManager and SMSound self closure references to _s and _t, respectively, to avoid potential conflicts with others' code
        • +
        • Moved self-destruct to use window.onunload instead of onbeforeunload, given the latter event can be caught and canceled if desired by the user
        • +
        • Inline player demo: Added autoPlay option
        • +
        • "Basic" demo directory (demo/basic/) moved to demo/api/, added load()-related testcase
        • +
        +
      • +
      + +
    • + +
    • +

      V2.78a.20080920

      + +
        +
      • +

        API: Bug fixes

        +
          +
        • Added SoundLoaderContext parameter to load(), Flash should now check policy-related (crossdomain.xml) files when loading resources from remote domains. Should fix previous security exception warnings when trying to access ID3 and/or waveform/EQ data. See related SoundLoaderContext documentation (ActionScript 3)
        • +
        • Fixed a bug with load(), was improperly expecting an options object - now works properly.
        • +
        +
      • +
      • +

        API: New shiny!

        +
          +
        • Added soundManager.altURL property (and useAltURL conditional) for convenient offline and other URL switching cases (dev vs. production environments, etc.)
        • +
        +
      • +
      • +

        Miscellaneous

        +
          +
        • Renamed internal soundManager and SMSound self closure references to _s and _t, respectively, to avoid potential conflicts with others' code
        • +
        • Moved self-destruct to use window.onunload instead of onbeforeunload, given the latter event can be caught and canceled if desired by the user
        • +
        • Inline player demo: Added autoPlay option
        • +
        • "Basic" demo directory (demo/basic/) moved to demo/api/, added load()-related testcase
        • +
        +
      • +
      + +
    • + +
    • +

      V2.77a.20080901

      + +
        + +
      • +

        API: Bug fixes

        +
          +
        • Fixed some mute() / unmute()-related bugs, global muting should now work properly. Added some related demo page examples.
        • +
        • Removed comment on flash9Options merging code, was previously new and didn't actually work as it was commented out. Oops. :D
        • +
        • Added experimental Flashblock exception handling (mozilla/firefox extension), "notification bar"-style UI which can message and assist users in unblocking SM2 .swf. Configured via soundManager.flashBlockHelper object, currently disabled by default.
        • +
        • Modified soundManager.destroySound() and sound.destruct(), fixed a bug with these methods and flash's unloading of sounds which was breaking things. Hopefully fixes destroying sounds within whileplaying() and related event handlers, too.
        • +
        • Modified flash 9 "peak data" code to only set the data if the feature is actually enabled.
        • +
        • Modified soundManager._debug() to list all sound object details, instead of just ID/URL.
        • +
        +
      • + +
      + +
    • + +
    • +

      V2.76a.20080808

      + +
        + +
      • +

        API: Bug fixes

        +
          +
        • Fixed some memory "leaks" / garbage collection issues. RAM allocated to load sounds previously wasn't freed until page unload; now memory should be garbage collected some time after sound.unload() and/or soundManager.destroySound()/sound.destruct() methods are called. In certain cases, Flash sound objects may be destroyed and re-created (transparent to the JS-side) to release memory. Note that garbage collection is not instantaneous, and is affected by CPU/system load and other variables.
        • +
        • Fixed an issue with play() not working on sounds created with autoPlay.
        • +
        • Fixed SM2 to work under proper XHTML (served as application/xhtml+xml MIME type). Rewrote object/embed code again, now version-agnostic for IE (no CLSID parameters.)
        • +
        • Corrected reported loadFromXML() bug, multiple loadFromXML() calls should work.
        • +
        +
      • + +
      • +

        API: New shiny!

        +
          +
        • New useWaveformData and useEQData sound options, providing access to raw waveform and sound frequency/EQ spectrum data via sound.waveformData and sound.eqData.
        • +
        • Renamed useSpectrumData to useWaveformData - if using waveform stuff currently, make sure you update your code!
        • +
        • Added soundManager.features object, which reflects the "support" state for peakData, waveformData and eqData. Handy for current and future version/support branching.
        • +
        +
      • + +
      • +

        API: Miscellaneous

        +
          +
        • New flash9Options configuration object for logical separation. When Flash 9+ is used, these options are merged into the defaultOptions object.
        • +
        • Added allowDomain() stubs and documentation to .as source for allowing .swf on external domains to work (recompile of .swf required)
        • +
        +
      • + +
      • +

        "Page As Playlist" demo: Updates

        +
          +
        • Added "favicon" VU meter display option (Flash 9+ only, experimental, currently Firefox/Opera only)
        • +
        • More-efficient RAM use via unload() and destruct() sound methods, discarding inactive sounds and freeing RAM as appropriate.
        • +
        • Added useEQData, showing sound spectrum (frequency range) instead of raw waveform
        • +
        • Added fillGraph config option, allowing solid waveform graphs instead of only peak points
        • +
        • Fixed playNext bug where same track couldn't be played twice in a row.
        • +
        • Fixed duplicate URL bug; items with identical MP3 URLs will now work. (Previously, URL was the ID for items and thus had to be unique. Lookup is now done by object.)
        • +
        • Modified MP3 URL search to include URL parameters, characters after ".mp3"
        • +
        +
      • + +
      • +

        Other updates

        +
          +
        • Demo code clean-up, externalised CSS, prettier demo layout and code color highlighting
        • +
        +
      • + +
      +
    • + +
    • +

      V2.75a.20080707

      +
        +
      • Flash 9 support! (soundmanager2_flash9.swf) - multiShot now actually works (layering/"chorus" effects on sounds), new spectrumData and peakData API features. All existing API features should have parity.
      • +
      • Added soundManager.flashVersion property. Flash 8 is the supplied default.
      • +
      • Modified soundManager.url to require only a path, eg. /path/to/soundmanager-swfs/ to allow loading of varying .SWF versions.
      • +
      • Basic (API) demo: Updated multiShot/Flash 9 behaviour documentation
      • +
      • Page player demo: Added optional spectrum and VU (spectrumData/peakData) features
      • +
      • MPC + animation demos: Modified to use Flash 9 (demo improved multiShot feature)
      • +
      • Flash 9 behaviour differences: +
          +
        • multiShot properly allows play() to be called multiple times on a sound object, creating desired "chorus" effect. Will call onfinish() multiple times, but whileplaying() etc. are called only for the first "play instance" to avoid complications.
        • +
        • New soundSpectrum and peakData sound features (spectrum graph / "VU" meter-style data) available
        • +
        • Sounds can be actually unloaded ("null" MP3 no longer needed to cancel loading of an MP3), but URL cannot be changed without destroying and recreating the related Flash sound object. The Flash 9 version does this to maintain API consistency.
        • +
        +
      • +
      • New + improved documentation/project page, updated 2-column layout with content filters, "Get Satisfaction" integration and self-update checks (and a light-switch-related easter egg.)
      • +
      +
    • + +
    • +

      V2.5b.20080525

      +
        +
      • Added waitForWindowLoad for delayed init
      • +
      • Added onpause() and onresume() event handlers
      • +
      • Added mute() and unmute()
      • +
      • Updated demos, revised documentation
      • +
      +
    • + +
    • +

      V2.5b.20080505

      +
        +
      • To improve startup time, soundManager.go() (createMovie() alias) now fires at onDOMContentLoaded() by default if supported. (Otherwise, falls back to window.onload().)
      • +
      • Improved initialisation routine - soundManager.onerror() is called when the Flash init "times out." Specifically, onerror() is called when Flash fails to make an ExternalInterface (Flash-> JS) call to SM2 within 1 second of window.onload() firing.
      • +
      • Added logic to handle special Safari delayed init case (Flash not loading when in a new, unfocused tab until focused) as a exception to the above.
      • +
      • Added better exception handling + debug messaging for initialisation failure cases (Flash security restrictions due to loading from local file system, no flash support, no ExternalInterface support etc.)
      • +
      • Updated .swf appendChild() target to use best-to-worst options: (document.body || document.documentElement || document.getElementsByTagName('div')[0])
      • +
      • Safari console[log|warn|error]-style messages are now properly formatted.
      • +
      • Added tons of semicolons to closing braces, eg. };
      • +
      • "No-debug", minified version of SM2 included: soundmanager2-nodebug-jsmin.js (17.4 KB, down from full size of 35 KB.) With Gzip compression, file size is ~6 KB. (Commented, debug-enabled version compresses to 10 KB with Gzip.)
      • +
      +
    • + +
    • + +

      V2.5b.20080501

      +

      Warning: A little experimental too, read details below.

      +

      Changelog:

      +
        +
      • Rewrote SoundManager initialisation: "Way faster." Communication now initiated from Flash, verification callback then performed by JS; far faster, hopefully more-reliable (TBD.) Init time drastically reduced from seconds to milliseconds in most cases, dependent primarily on Flash movie load rather than window.onload().
      • +
      • Above change also fixes Safari "loading SM2 in background tab" issue, where Safari does not init Flash until background tab comes into focus (when a link is opened in a new, non-focused tab.)
      • +
      • Current drawback: Difficult to determine, save for falling back to window.onload() plus focus methods due to above issue, whether SM2 is actually available or not (ie., soundManager.onerror() will not likely be called as in past.) However, the supported() method will correctly reflect if SM2 has successfully initialised, for example.
      • +
      • Added sandbox/security model code; SM2 can now tell if it is restricted to either local or internet access only, for example. Helpful in potential debugging errors, plus viewing demos off the local filesystem should no longer throw init errors requiring whitelisting (seemingly due to the new initialisation method.) Win!
      • +
      • Opera 9.27 has been noted to have some bugs relating to ExternalInterface, seems to be unable to make calls from ActionScript-level methods using setTimeout() or setInterval(). As a reulst, SoundManager 2 events like onfinish(), whileplaying() and onfinish() can be sporadically called or missed altogether. No known workaround at this time, but Opera 9.5 (beta 2) does not have this issue. Popular MP3 "mix tape" site muxtape.com uses similar techniques for JS-Flash communication and appears to suffer from the same problem.
      • +
      • Warning: Random crash issue noticed when using IE 6 + 7 and this demo page, calling createSound() when soundManager.defaultOptions.autoLoad = true; from within soundManager.onload(), for creating + preloading the tab/theme switch sounds. Removing autoLoad=true (leaving the default of false) fixed the crash. Exact reason not determined, perhaps recursive calls or pre-onload issue (?), seems to be isolated to the home page. MPC demo uses autoLoad also, but did not crash. Mentioning just in case.
      • +
      • Updated Muxtape-style demo: More themes, load/security debugging info etc.
      • +
      +
    • + +
    • + +

      V2.2.20080420

      +

      Changelog:

      +
        +
      • More demos! "Page as a playlist" (muxtape.com-style) example, "Make MP3 links playable inline" demo
      • +
      • Corrected onStop() handler inheritance/overriding behaviour (was incorrectly checking defaultOptions)
      • +
      • Added debug output of options object for createSound() calls. Full options (result of merging global default + sound-instance-specific options) displayed, helpful in troubleshooting. Event handler function code is intelligently (hopefully) displayed, truncated at 64 characters of first block or end of line, whichever comes first.
      • +
      • Removed most HTML markup from non-HTML (eg. console) _writeDebug() calls
      • +
      • soundManager.destruct() writes to console, to be consistent
      • +
      + +
    • + +
    • + +

      V2.1.20080331

      +

      Changelog:

      +
        +
      • Modified createSound() to return a sound object if successful (more logical)
      • +
      • Updated setPosition() method and added position option parameter, documentation + demo (bugfix)
      • +
      • Corrected createSound() and play() sound option inheritance/overriding behaviour (eg. position) to work as expected (most to least important: Method call options -> sound object instance options -> SM2 global options)
      • +
      • Updated deleteSound() so Array.splice() is used instead of delete, the latter doesn't cause Array.length to update (bugfix)
      • +
      • Modified debug=alert to only work when debug mode is enabled (potential annoyance aversion)
      • +
      • Modified togglePause() to use position option parameter rather than undocumented offset (oops :D)
      • +
      • Added supported() convenience method (indicates pass/fail after SM2 has initialised.)
      • +
      • Added disabling debug calls from Flash (performance)
      • +
      • Added URL hash updating/bookmarking and page title updating to jsAMP demo app
      • +
      • Updated project page layout
      • +
      + +
    • + +
    • + +

      V2.0b.20070415

      +

      Changelog:

      +
        +
      • Added destroySound() method
      • +
      • Made debug output slightly less-verbose (commented out)
      • +
      • Safety tweak for position-related Flash bug when loading new sounds
      • +
      • Highly-expanded documentation (SMSound events + properties, examples, caveats, FAQs etc.)
      • +
      • Added time-sensitive light/dark theme for documentation
      • +
      + +
    • + +
    • + +

      V2.0b.20070201

      +

      Second beta?

      +

      Changelog:

      +
        +
      • Fixed stopAll() bug (previously broken)
      • +
      • Added nullURL parameter
      • +
      • Updated documentation
      • +
      +

      V2.0b.20070123

      +

      V2.0b.20070118

      +

      V2.0b.20070115

      +
    • + +
    • +

      V2.0b.20070107

      +

      First beta

      +
    • + +
    • +

      V2.0a.20060904

      +

      Prerelease alpha

      +
    • + +
    + + + + +
    + +
    HTML5 Audio: Support updates, technical notes, quirks, bugs and annoyances
    + +

    Note: This section is archived content and has been rolled into Revision History.

    + +

    As of the V2.97.20111220 release of SM2:

    + +
      + +
    • +

      Multiple URLs (and/or multiple MIME types) can be specified when creating a sound, thus allowing for better native HTML5 support between OGG, MP3 and others. See SMSound.url for details.

      +
    • + +
    • +

      Support for "audio sprites" has been added in the form of from and to sound options. See the audio sprite demo for a live example.

      +
    • + +
    • +

      Added soundManager.html5PollingInterval, for increased whileplaying() callback frequency (higher framerates.) Excludes mobile (eg., iOS) by default.

      +
    • + +
    • +

      Fixed Audio() object src property re-assignment bug seen in createSound()->play().

      +
    • + +
    • +

      mySound.load({onload:function(){}}) callback fixed so it works.

      +
    • + +
    • +

      onload() now called immediately when load({onload:function(){}}) is used on a sound with the same URL which has already loaded.

      +
    • + +
    • +

      onstop() now mimics onfinish() in terms of sequence. HTML5 sets position to 0, but retains pre-stop() position property value (like Flash does.)

      +
    • + +
    • +

      Amazon Kindle Fire UA looks like Safari on OS X 10.6.3, but does not have broken HTML5 audio (i.e., intermittent playback failure) like the "isBadSafari" case.

      +
    • + +
    • +

      Side note: iOS ignores volume, always returns value of "1" (at least, on iOS 4 and present iOS 5 releases.) See related notes.

      +
    • + +
    + +

    As of the V2.97.20111030 release of SM2:

    + +
      + +
    • +

      Fixes for HTML5 unload() on Webkit (connection was not closing) due to src being set to '' (OK only in Firefox, presently?) vs. an "empty" URL.

      +
    • + +
    • +

      HTML5 suspend events are now listened for and fired via SMSound option onsuspend(). This event may be the best way to detect when mobile Safari (eg. iOS) is blocking autoplay-style behaviour, and user interaction is required to start or resume playback. (iOS does not allow auto-play of audio; user interaction is required for audio playback to start.)

      +
    • + +
    • +

      Added try...catch for dumb IE 9 Audio() "not implemented" error in Windows server case without "desktop experience" installed, means no HTML5 audio/video support. Hat tip: Modernizr issue 224.

      +
    • + +
    + +

    As of the V2.97.20110801 release of SM2:

    + +
      +
    • A regression was introduced in V2.97.20110706 where SM2 would fail to start in HTML5-only mode on supported desktop browsers when flash was disabled or not installed, eg., Safari on new Macs or IE 9 without flash. (iOS was not affected.) This has been fixed with the 2.97.20110801 release.

    • +
    • +

      soundManager.useHTML5Audio is now true by default; however, soundManager.preferFlash is also true and HTML5 browsers will still attempt to use flash for playing MP3/MP4 by default, if those formats are marked as "required".

      +

      If you wish to have 100% HTML5 mode in more cases, set soundManager.preferFlash = false. Presently, the MP3 links and MP3 button SM2 demos are more HTML5-friendly and will serve as a test for exposing bugs that may be in the wild.

      +
    • +
    • +

      soundManager.html5Test has been relaxed to use (probably|maybe) for Audio's canPlayType() test (previously, was only "probably") - so formats will be more likely to work on HTML5-only devices that conservatively report "maybe" for MIME types like audio/mpeg; codecs="mp3" at this point.

      +
    • +
    • +

      Certain mobile and tablet-like devices are special-cased as preferring HTML5, and will ignore checking for flash altogether; this presently includes the iPad, iPhone and iPod, Palm Pre and Motorola Xoom.

      +
    • +
    • +

      The HTML5 audio "loadeddata" event triggers an SMSound onload() event, which now fires whileplaying() and tries to pass identical bytesLoaded, bytesTotal parameters so that UIs will correctly show the sound as fully-"loaded" - even if in truth, not all bytes have actually been fetched (depending on the browser and server, etc.) because of the ability to do arbitrary seeking.

      +
    • +
    • +

      The experimental soundManager.useGlobalHTML5Audio and soundManager.requireFlash properties were removed. Internally the global HTML5 audio logic still applies to iOS, but it does not seem to be necessary for other devices at this time.

      +
    • +
    + +

    As of the V2.97.20110706 release of SM2:

    + +
      +
    • HTML5 audio appears to have been fixed in Safari with Snow Leopard 10.6.8, the "pre-Lion release", from 06/2011. SM2 will now only blacklist Safari + OS X 10.6.3 through 10.6.7 as having broken HTML5 audio (intermittent load/playback failures), and falling back to Flash where available.

    • +
    • +

      New, experimental soundManager.preferFlash for handling "mixed-mode" HTML5 + flash cases. In the event HTML5 supports MP3/MP4 and preferFlash is true (and flash is installed), flash will be used for MP3/MP4 content while allowing HTML5 to play OGG, WAV and other formats etc.

      +

      Important note: Because HTML5 audio is still quirky and has bugs, preferFlash is true by default to help ensure MP3/MP4 play consistently. If set to false or flash is not available, "HTML5-only" mode will kick in and will apply to all formats.

      +
    • +
    + +

    As of the V2.97.20110424 release of SM2:

    + +
      +
    • HTML5 audio in Safari on Snow Leopard 10.6.3 through 10.6.9 (10.6.7 was released 03/2011) are blacklisted and will fall back to Flash. 10.6.8 and 10.6.9 are preemptive guesses. According to beta testers, OS X 10.7 ("Lion") has fixed the intermittent HTML5 audio load/playback issue.

    • +
    • new Audio(null) is no longer used for iOS, as iOS would attempt to load a URL called "null".

    • +
    • iOS 4.2 or 4.3 may have introduced new security restrictions around onfinish()->unload()->play() that prevents the "play-through" behaviour previously allowed in certain cases. The unload() attempts to nullify the audio's src attribute, breaking the future play() request. The Muxtape/button/link demos were affected by this, and have been fixed with this release. To prevent this issue in your own apps, avoid unload() and simply use onfinish()->play() for iOS.

    • +
    + +

    As of the V2.97.20110306 release of SM2:

    + +
      +
    • Testing suggests that auto-play ("auto-annoy?") does work on iOS 4.1, but are aggressively blocked as of iOS 4.2.

    • +
    • _resetProperties() when setting Audio().src, fix sound1.play() -> sound2.play() -> sound1.play() case on iOS 4.1 not correctly re-assigning original sound URL (related to global audio object.)

    • +
    • If no flash is detected, try forcing useHTML5Audio = true (eg. desktop safari on new Macs which don't come with Flash.) Related: flash detection code tweak.

    • +
    • isNaN() check for HTML5 loading (saw one under Safari, in testing).

    • +
    • Use new Audio(null) vs (), Opera 9.64 expects URL argument; throws WRONG_ARGUMENTS_ERR otherwise. Doesn't implement canPlayType() either, but both are fixed in future releases.

    • +
    + +

    As of the V2.97.20110123 release of SM2:

    + +
      +
    • New (experimental) soundManager.useGlobalHTML5Audio attribute, enabled by default for mobile + iOS. Enables use of a single audio object, re-used for loading and playing all sounds. iOS currently can only play one sound at a time, so this limitation is safe for now. The global object fixes previous regression of play-through/playNext()-style behaviours.

    • +
    • Sound recycling with new global audio feature should work better than in prior (development) versions.

    • +
    • Improved broken Safari/Snow Leopard HTML5 audio situation: HTML5 mode is no longer disabled - and if available, Flash is used to play MP3/MP4 content to work around known playback issues with native HTML5 audio.

    • +
    • New (experimental) soundManager.requireFlash property (default: false.) If true, prevents HTML5-only mode on devices with both HTML5 and Flash. May be useful when HTML5 is enabled (and can play MP3), but Flash is desired to play RTMP content etc. As of this version, will only use Flash for RTMP.

    • +
    • Fix for type:'audio/mp3' returning false on canPlay(). Timer update-while-paused tweak.

    • +
    • More event listeners, ignore events on destroyed sounds, improved event clean-up, "seek before load" fix

    • +
    + +

    As of the January 1, 2011 (V2.97a.20110101) and December, 2010 releases of SM2 (V2.97a.20101221):

    +
      +
    • The bytesLoaded and bytesTotal properties may become less-relevant under HTML5 due to non-linear HTTP downloading (using ranges and partials), but they are still provided under Firefox at this time.

    • +
    • Related to bytes loading/total, a sound's onload event may not always be fired (Mozilla currently discourage use of the DOM loaded event), again because of range requests and the ability to arbitrarily seek within a file.

    • +
    • Basic support for the W3 TimeRanges implementation of sound buffering (ie., loaded data) has been implemented. This gives an idea of "total time loaded", but again, is not necessarily sequential.

    • +
    • HTML5 audio is disabled for all versions of Safari (4 and 5) on Snow Leopard (OS X 10.6.3 - 10.6.5) until Apple fixes issues with audio loading and playback due to bugs in "underlying frameworks." See Webkit #32159. HTML5 audio in Safari on Windows (provided QuickTime is installed) does not have the same fatal bug.

    • +
    + +

    As of the October, 2010 release of SM2 (V2.97a.20101010):

    +
      +
    • HTML5 audio is disabled for all versions of Safari (4 and 5) on Snow Leopard (OS X 10.6.3 and 10.6.4) until Apple fixes issues with audio loading and playback due to bugs in "underlying frameworks." See Webkit #32159.

    • +
    + +

    As of the August, 2010 release of SM2 (V2.96a.20100822):

    +
      +
    • Safari 5.0.1 (533.17.18) on Snow Leopard (10.6.x) continues to show buggy HTML5 audio load/playback behaviour. Apple are aware of the regression, which began with Safari 4.0 on Snow Leopard (perhaps with the new QuickTime.) See Webkit #32159.

    • +
    • iPad/iPhone iOS4 will now play a sequence of sounds if using onfinish() to create/start the next (eg., the Muxtape-style playlist on the SM2 homepage will play through once the user starts it.) In any event, user interaction is always required to start the first sound.

    • +
    + +

    As of the June, 2010 release of SM2 (V2.96a.20100624):

    +
      +
    • Safari 5.0 (533.16) on OS X Snow Leopard (10.6.x) continues to show buggy HTML5 audio load/playback behaviour, same as with Safari 4.0.5 on Snow Leopard only - may be related to underlying QuickTime implementation (a guess, at this point.) SM2 will disable HTML5 audio support by default for this specific browser + OS combo. See Webkit #32159 for discussion + testcases.

    • +
    + +

    As of the May, 2010 release of SM2 (V2.96a.20100520):

    +
      +
    • Safari 4.0.5 on OS X Snow Leopard (10.6.x) appears to have an annoying bug where audio inconsistently fails to load / play; SM2 will currently disable or ignore the HTML5 feature on this exact browser + OS version. See Webkit #32159 for discussion + testcases. Note that Safari on OS X 10.5 "Leopard" and on Windows do not appear to have this bug; it seems to be limited to Snow Leopard, seen on OS X 10.6.3.

    • +
    • Some browsers (and iPad 3.2?) do not fire progress events, and/or do not implement bytesLoaded/bytesTotal-style attributes.

    • +
    • iPad 3.2 appears to be able to only play one sound at a time, and will terminate other sounds.

    • +
    • iPad 3.2 may also loop AAC+ (HE-AAC) and WAV sounds, perhaps not firing onfinish() and resetting the position to 0 each time, but is fine with MP3s. This has been observed, but not fully-tested.

    • +
    • Looping in HTML5 is either "infinite" or "none". A wrapper may be created for SM2 so that a number of loops can be specified, as with Flash. This is not yet implemented.

    • +
    • Panning (left/right channel balance) does not appear to be in HTML5.

    • +
    • Flash-only features such as ID3 tag reading, waveform and spectrum data will simply be ignored, and their related events will not fire on SMSound objects which are using HTML5.

    • +
    + +
    + + + + +
    + + +
    + + +
    + + + +
    + + + +
    + + + +
    + +
    + +
    + + +
    + + +
    + + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html new file mode 100755 index 00000000..25fb5a13 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html @@ -0,0 +1,1452 @@ + + + +SoundManager 2: Download + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + + +
    + +
    +
    +
    + +
    +
    +
    + +
    + +
    + +
    +

    Get SoundManager 2

    +

    Get the latest and greatest.

    +
    + +
    + +

    Download SoundManager 2

    + +

    Latest changes: 100% HTML5 mode by default, where available. Duration fix for Adobe FMS/RTMP server-based streaming. HTML5 unload, multiShot, autoPlay tweaks and more. See revision history for details.

    + +

    Download SoundManager 2.97a.20131201 or see on GitHub

    + +

    Performance tip: SM2's code size varies from over 150 KB (commented, debug-enabled) down to 11 KB (optimized) over HTTP; check the pre-optimized builds for details.

    + +

    Side reading + video talks, slides etc.

    + + + +
    + +
    + + +
    + +
    + +

    Revision History

    +

    Latest changes and archived notes from bug fixes, API updates, feature development etc.

    + +
    + +
    + +
    + +

    Revision History

    + +

    A changelog of sorts.

    + +
      + +
    • + +

      V2.97a.20131201 - 100% HTML5 mode by default. Duration fix for Adobe FMS/RTMP server-based streaming. HTML5 unload, multiShot and autoPlay tweaks. See GitHub commits.

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Adobe FMS (RTMP Server) fix: Invoke server-side getStreamLength() call to determine duration. (Red5 and other free RTMP servers use NetStream onMetaData() to pass duration.) +

          +
        • + +
        • +

          + Fix html5Unload() by loading a tiny base64-encoded data: URI WAVe file where supported. Elsewhere, use about:blank. This fixes errors in Chrome where the browser attempts to load the url "null" (a string.) +

          +
        • + +
        • +

          + D'oh! Fix HTML5 sprite regression where _oncanplay() was not being picked up & fired, sound would not play on first click. +

          +
        • + +
        • +

          + HTML5: Fix double-play bug with autoPlay: true. Correct edge case where onposition() items would sometimes be cleared if called/assigned before play(). +

          +
        • + +
        • +

          + ontimeout: function(status) {} callback parameter corrections. Fix missing error { type: 'INIT_TIMEOUT' } for missing/404 SWF case, and INIT_FLASHBLOCK for flashblock-specific case. +

          +
        • + +
        • +

          + HTML5: Apply volume to cloned sounds in HTML5 multiShot case. +

          +
        • + +
        • +

          + Fixed issue in _processOnPosition where the item in onPositionItems[i] can be undefined mid-loop if the callback that is triggered changes the length of the onPositionItems array, where onPositionItems.length becomes zero and there's an uncaught TypeError when trying to access item.fired the next time around. +

          +
        • + +
        • +

          + Fixed mute in HTML5. +

          +
        • + +
        • +

          + Fix onload in Firefox 3.6 with no flash (and yes, Firefox 25 is the current release. :D) +

          +
        • + +
        • +

          + Correct event removal (cloned HTML5 nodes) - onendedended +

          +
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • +

          + Use 100% HTML5 mode by default, where available. preferFlash: false is now the default setting. Firefox does MP3 on Vista (and newer) via HTML5, and recently (via Firefox Aurora builds) on OS X - the last major hold-out. The vast majority of browsers now support MP3 via HTML5, thus reducing the reliance on Flash. +

          +
        • + +
        • +

          + Reboot into 100% HTML5 mode where supported if flash fails after loading, i.e., local/offline/file:// or other edge case. +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Fixed canPlayMIME() documentation example. +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20130512 - multiShot for polyphonic HTML5 clients. createSound() no longer requires an id. Auto-reboot() into 100% HTML5 mode where supported. HTML5 unload tweaks. (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Init enhancement: If preferFlash: true but useFlashBlock: false (the default SM2 config) and flash timeout / blocked case occurs, SM2 will reboot reboot into 100% HTML5 mode if available so init can succeed. If flash block handling is enabled, user interaction will be required to whitelist the flash movie and init will be delayed until the SWF loads. +

          +
        • + +
        • +

          + Correct reboot() to allow 100% HTML5 mode when Flash was previously required due to preferFlash: true. Previously, soundManager.audioFormats.mp3.required = false; soundManager.reboot() did not result in 100% HTML5 mode under Firefox. Now works as expected. +

          +
        • + +
        • +

          + HTML5 unloading: Firefox was supposed to like assigning '' to Audio().url for canceling requests, unloading and destroying the decoder (perhaps only on <audio>, in retrospect?) - similarly, .src = null did not seem to work, possible request to ./ - undesirable. +

          + +

          + Now using more-conservative null URL for unload / destruct on webkit, iOS and others, and emptyURL for Firefox (user-customizable, 'about:blank' by default.) +

          +
        • + +
        • +

          + More HTML5 safety checks so that buffered can't go beyond 100%. +

          +
        • + +
        • +

          + Improve Flash 9 load() -> onload() failure case, when loading a non-404 (eg., HTTP 301 -> 200) with non-audio content. Improved messaging for Flash 8, Flash 9 + HTML5 with zero-duration (invalid / unsupported sound) case. +

          + +
        • + +
        • +

          + Fix flash-only (no HTML5 / useHTML5Audio: false) init case, e.g., running under IE 8. +

          +
        • + +
        • +

          + HTML5: Fix legacy "overloaded" case when soundManager.play('someID', 'some.mp3'); is called twice, second call would fail. This shortcut method is deprecated, and not recommended for use other than a conveience when in development / testing. +

          +
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • + +

          + createSound() no longer requires an id property. If omitted, a unique id will automatically be generated for the new sound object with a prefix based on the SM2 setup option idPrefix. +

          + +

          + Specifying an id is useful if you want to look up the sound via getSoundById() - otherwise, you can simply use the object returned by the createSound() call. +

          + +
        • + +
        • + +

          + multiShot + multiShotEvents for HTML5 Audio()-based sounds, allowing layered / "chorused" playback if play() is called and multiShot: true has been specified to either createSound() or play(). Behaviour should mimic that of Flash 9. If multiShotEvents: true is specified, onfinish() will fire for each instance. Does not apply to mobile clients (e.g., iOS and Android) which only allow one sound to be played at a time. +

          + +

          + Implementation summary: A new Audio(src) instance is created with an onfinish listener, and played immediately. It is unloaded and destroyed when playback finishes. +

          + +

          + Caveat #1: If a position argument is provided eg., play({ position: 1000 }), the cloned Audio() instance must wait for a HTML5 canplay event before a seek and playback can begin. This may mean playback *could* have a slight delay vs. playing without the position offset. +

          + +

          + Caveat #2: The from/to parameters used for "sound sprites", e.g., { from: 500, to: 1500 }, are not presently supported under multiShot. +

          + +

          + Caveat #3: multiShot is not supported where only a single audio instance can be playing at once, e.g., iOS (iPhone/iPad) and some Android devices. +

          + +

          + Secondary instances are "fire-and-forget", similar to the Flash 9 implementation, and fire no events other than onfinish(). They do not respond to position, volume etc. after playback has begun. +

          + +
        • + + + + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Remove debug-related complain() calls from -nodebug and minified script builds +

          +
        • + +
        • +

          + Force data: URLs over to HTML5. Catch unsupported case under 100% HTML5 mode, preventing attempt to use Flash fallback. +

          +
        • + +
        • +

          + Edge case: Fix error case if setup() called without arguments inline, before DOMReady / init etc. +

          +
        • + +
        • +

          + Tweak soundManager.getSoundById() to not throw error if ID omitted. Improve language on "not found" messaging. +

          +
        • + +
        • +

          + Warn on possible 32-sound channel Flash ceiling/limit, which can occur when Flash tries to begin playback and fails to start. +

          +
        • + +
        • +

          + Documentation updates: How Clients Download Audio (Flash/HTML5 progressive download vs. byte streaming) +

          +
        • + +
        • +

          + Improved API Examples page design, two-column layout with navigation +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20130324 - Fix for playlist/event chaining when using flashVersion = 8 with Flash Player 11.6.602.171. HTML5 iOS load() fix. Added Opus to audio formats. (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Flash Player 11.6.602.171, released by Adobe on 02/26/2013, introduced an issue with SM2's default Flash 8 (flashVersion: 8) API-based JS/Flash interaction, where SM2 methods called from callbacks such as onfinish() would not work. This primarily broke methods used for playing sounds in sequence, serially loading a series of sounds and so on. (See discussion for more.) +

          + +

          + Note that this does not affect cases where soundManager.setup({ flashVersion: 9}) is being used; however, SM2 does use flashVersion: 8 by default. +

          + +

          + Specifically, Flash-initiated events (such as a sound finishing) make Flash -> JS calls to the SM2 API, which subsequently call user-specified event handlers. If the user-specified SM2 onfinish() handler immediately calls a SM2 method like play() that makes a JS -> Flash call, this call either silently fails or is blocked. Other JS + Flash libraries that use similar callback patterns may also be affected, if their SWF is built targeting the Flash 8 API. +

          + +

          + Suspecting a timing or recursion/stack issue, it was found that introducing a setTimeout(callback, 0) to user-specified SM2 callbacks like onfinish() restored sequential/playlist functionality. +

          + +

          + Flash Player 11.6.602.180, relased by Adobe on 3/12/2013, exhibits the same behaviour. To avoid additional hacks, SM2 applies this to all Flash 8-based API callbacks regardless of what version of Flash Player is installed. No regressions are anticipated as a result of this change. +

          + +

          + Alternately, this issue can be avoided by using soundManager.setup({ flashVersion: 9 }) as the Flash 9-based API does not appear to have this problem. +

          +
        • + +
        • +

          + HTML5: Fix for iOS load() case when using an auto-load and looping pattern (related discussion). +

          +
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • +

          + HTML5: Added check for Opus (OGG-based audio codec, audio/opus). +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • + +

          + Added documentation for Serving To Clients, and Mobile Device Limitations. +

          +
        • + +
        • + +

          + Minor SM2 homepage + documentation CSS tweaks (design) +

          +
        • + +
        • + +

          + This SM2 release is tagged "Mahalo Edition" to say thank-you, and because some SM2 work was done while on vacation in Hawai'i. Also, some new demo sound recordings from the beach on Kaua'i were added. +

          + + +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20130101 - Strict Mode. Android 2.3 HTML5 fixes, cleaner debug output, improved default flashblock handling. Confirmed compatibility with Firefox WMF-based HTML5 MP3 support. New reset() method, reboot() tweaks (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + HTML5: Reset last URL and load state for "singleton" (global HTML5 audio) case, on iOS + Android <= 2.3 for specific use case - createSound() -> play() -> destruct() -> createSound() -> play() with same URL/parameters. +

          +
        • + +
        • +

          + HTML5: Fix for Android 2.3 / Nexus 7 - they work better with the singleton HTML5 audio() instance as well, same as iOS, for chained (i.e., playlist-style) playback cases. +

          +
        • + +
        • +

          + soundManager.setup() now allows html5Test (regular expression, eg. /probably|maybe/i) to be passed. Was previously unrecognized/rejected. +

          +
        • + +
        + +
      • + +
      • + +

        API Updates

        + +
          + +
        • +

          + The SoundManager 2 core API (soundmanager2.js) now runs in Strict Mode, via "use strict";. This is scoped to a closure within soundmanager2.js, and should not cause issues when combined (rolled-up and/or minified) with other JavaScript code. +

          +
        • + + +
        • +

          + New soundManager.reset() method. Similar to reboot(), but also nukes any registered onready() and related callbacks. Based on pull request from Github user jabr. Chaining is now possible too, e.g., soundManager.reset().setup({onready:function(){console.log('reset() complete, reboot OK')}});. Call soundManager.beginDelayedInit() to re-init after a reset(). +

          +
        • + +
        • +

          + soundManager.setup({url:...}) + lazy-loading (dynamically-loaded JS) case: If setup() given a url parameter after DOMContentLoaded has fired, assume we should start right away. (Helps reduce need for beginDelayedInit() + "just works" for most users). +

          +
        • + +
        • +

          + Don't init inline after document.readyState === 'complete' (improve lazy-loading case, wait for setup() with url instead). +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • + +

          + Prerelease Firefox builds can play MP3 audio via HTML5 in some cases, as part of a move to support H.264 video (see Bugzilla #799318 for details). Firefox 20 (nightlies, and Aurora channel builds in January 2013) can get native MP3 support via Windows Media Foundation (OS-level codec support) components on Windows 8, Windows 7, and soon, Windows Vista. As of 12/2012, OS X support is planned, and Windows XP support is not. (Disclaimer: Vista, OS X and XP notes sourced from comments on Hacker News; see links). +

          + +

          + When enabled with media.windows-media-foundation.enabled = true under about:config, Firefox may be able to play MP3s via HTML5 and thus get "100% HTML5 mode" when soundManager.setup({preferFlash: false}) is used. +

          + +

          + At time of writing (12/30/2012), Firefox 20 (nightly) returns "" for canPlayType('audio/mpeg; codecs="mp3"'), a test commonly used to query for MP3 support under HTML5 and one which works in other modern browsers. Firefox's behaviour differs because it is trying to follow the MPEG spec, which does not include an explicit MP3 MIME type. Instead, canPlayType('audio/mpeg'), which is in-spec, presently returns a "maybe" when MP3 is supported under Firefox. +

          + +
        • + +
        • +

          + Improved SM2 console.log() debug output, aiming to be less "noisy". Core setup options are shown better at start-up, eg. "SoundManager V2.97a.20130101 (AS3/Flash 9) + HTML5 audio + preferFlash + html5PollingInterval (50ms) + flashBlock". +

          +
        • + +
        • +

          + Christmas light demo: Tweaks for iOS + Android touch devices. +

          +
        • + +
        • +

          + MP3 Player Button demo: Include HTML type (MIME hint) attribute, if specified. +

          +
        • + +
        + +
      • + +
      + +
    • + +
    • + +

      V2.97a.20121104 - HTML5 + iOS load fixes, Windows 8 App Store compatibility tweak, code pattern improvements (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Fix HTML5 unload() -> play() case (re-use of same object without assigning new URL). +

          +
        • + +
        • +

          + More global (iOS) HTML5 object unload() / play() re-use tweaks, improved handling of re-use and empty / load() cases +

          +
        • + +
        • +

          + HTML5: Ensure instanceOptions are set after play() call results in load(). Noted instanceOptions not being set from within whileplaying(). +

          +
        • + +
        • +

          + Fix call signature for Flash 8 load method, was tying usePolicyFile (enables remote crossdomain.xml request for ID3/waveform data on 3rd-party domains) to precence of whileloading() due to driver error. Derp. :D +

          +
        • + +
        • +

          + Windows 8 Store Apps (IE 10/"MSAppHost" in UA) don't support Flash or ActiveX, except for (at time of writing), three special ActiveX controls. Thus, new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash') seems to work without error. However, an error is thrown if an <object> with a Flash ActiveX CLSID is appended to the DOM. http://msdn.microsoft.com/en-us/library/windows/apps/hh465143.aspx +

          +
        • + + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Death to underscores! Removed legacy pattern of var _foo = ... for most private internals. +

          +
        • + +
        • +

          + Better typeof x === 'undefined' -> x === undefined pattern per newer jslint rules. +

          +
        • +
        + +
      • + +
      + +
    • + +
    • + +

      V2.97a.20120916 - Inline, deferred and lazy-load init improvements, HTML5 format / detection improvements, "re-use" load/play URL fix. (Download archived version)

      + +
        + +
      • + +

        API Updates

        + +
          + +
        • +

          + Init improvement: Don't fail if Flash URL is null in normal include + init case. Instead, show note in debug input and wait for soundManager.setup() with url param, then treat as delayed init case. Improved experience if including <script>, then trying to do setup() after DOM Ready (common jQuery case). +

          +
        • + +
        • +

          + soundManager.setup({url:...}) + lazy-loading (dynamically-loaded JS) case: If setup() given url parameter after DOMContentLoaded has fired, assume we should start right away. (Helps reduce need for beginDelayedInit() + "just works" for most users) +

          +
        • + +
        • +

          + Don't init inline after document.readyState === 'complete' (improve lazy-loading case, wait for setup() with url: instead) +

          +
        • + +
        + +
      • + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Fix 'audio/mpeg' canPlay() checks, was incorrectly returning false due to audio/mpeg; codecs="mp3" working and preventing audio/mpeg from being checked. +

          +
        • + +
        • +

          + More paranoid Audio() handling for "bad" Opera (< 10) where new Audio() would throw not_enough_arguments (always required URL). +

          +
        • + +
        • +

          + Safer HTML5 duration checks - null now assigned instead of undefined. +

          +
        • + +
        • +

          + Improve durationEstimate under HTML5 during whileloading(). +

          +
        • + +
        • +

          + Flash 9/RTMP: Actually provide caption data to oncaptiondata(). +

          +
        • + +
        • +

          + Fix SMSound.play({url:...}) "re-use" case where new URL wasn't being assigned + loaded right away, and SMSound.url property was not being updated. +

          +
        • + +
        • +

          + Correct load() and play() with new URL parameter, so that subsequent play() call uses new URL (and not URL assigned with original createSound() call). +

          +
        • + +
        • +

          + Use seconds for SMSound.buffered (time ranges) whether HTML5 or Flash, since SM2 API uses seconds for setPosition() etc. +

          +
        • + +
        • +

          + Correct play() -> pause() -> setPosition(0) -> play() -> pause() case where the latter wasn't firing due to invalid state. +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + New Cassette Tape UI Prototype/demo (experimental). +

          +
        • + +
        • +

          + Tweaked documentation layout for legibility. Webfont (deja vu sans mono) from dejavu-fonts.org for code examples. +

          +
        • + +
        • +

          + Improved lazy-load / deferred example based on new setup() logic +

          +
        • + +
        • +

          + Added SMSound.buffered documentation +

          +
        • + +
        • +

          + Added m4b extension as an mp4 format +

          +
        • + +
        • +

          + Safer initial HTML5 support checks +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20120624 - New soundManager.setup() method, numerous HTML5 improvements for createSound(), load(), progress and reuse cases, and minor flash audio bug fixes (Download archived version)

      + +
        + +
      • + +

        API: New sugar-like stuff

        + +
          + +
        • + +

          + New soundManager.setup() mixin-style method for assigning properties and common start-up callbacks. Collects top-level soundManager configuration properties and object collections - onready, ontimeout, defaultOptions, flash9Options and movieStarOptions - under a single method call. +

          +

          + Upgrade / legacy note: This is a modern replacement for the direct property assignment method used in all previous versions - eg., soundManager.url = '/swfs/' - the old method continues to work for legacy support, but you should migrate to using the new method as it's much cleaner. All included demos use the new method where applicable. +

          + +

          + New soundManager.setup() method example +

          + +
          soundManager.setup({
          +  // required
          +  url: '/path/to/swfs/',
          +  // optional
          +  flashVersion: 9,
          +  // convenience
          +  onready: function() {
          +    console.log('Ready to play sound!');
          +  },
          +  ontimeout: function() {
          +    console.log('SM2 start-up failed.');
          +  },
          +  // more custom parameters
          +  defaultOptions: {
          +    volume: 50
          +  }
          +});
          + +

          + See soundManager.setup() for details. +

          + +
        • + +
        + +
      • + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Improve HTML5 audio load/playback reliability + stability on iOS, and for object reuse cases (play() -> load({url: ...}). Prior behaviour was making initial HTTP request when object was created (meta/preload, not necessarily loading entire file.) Request now only happens with preload/load/play-related calls. +

          +
        • + +
        • +

          + HTML5: Firefox seems to have changed when unloading HTML5 audio, url = '' now loads hosting page HTML (boo) instead of null / no request. Changed to about:blank like everyone else. Also fixed boolean logic on isMovieStar assignment. +

          +
        • + +
        • +

          + Add audio/mp3 and related MIME checks for flash, correct edge case where play({type:'audio/mp3'}) would use HTML5 when preferFlash = true, due to seeming lack of Flash support for the MIME type. +

          +
        • + +
        • +

          + Fixed old Flash 8 onload() edge case where loading from cache might return incorrect didLoad: false result - corrected by checking for a non-zero sound duration. +

          +
        • + +
        • +

          + Properly reset SMSound.id3 = {} with internal resetProperty and public methods like load(). +

          +
        • + +
        • +

          + Edge case fix: Don't attempt to remove flash unless reference exists (prevent false warning when reboot() called in 100% HTML5 mode.) +

          +
        • + +
        • +

          + Correct empty options JS error on internal _setup_html5() when reusing HTML5 audio object per V2.97a.20120527 bug report +

          +
        • + +
        • +

          + Fix minor false positive (undocumented error handler case) with HTML5 play() falsely reporting 32-sound ceiling edge case and calling SMSound.onplayerror() (if assigned) when using flashVersion = 9. Should only apply when flash 9 is being used for playback, and ceiling hit. +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Finally assign + use SMSound.id (instead of sID), matching createSound({id: 'foo'}) pattern; maintain legacy sID property (ancient behaviour, originally intended to avoid potential namespace conflicts many years ago - now silly and not a concern.) +

          +
        • + +
        • +

          + Improved handling of whileloading() vs. HTML5 onload (when using HTTP range/partial requests). +

          +

          + HTML5 onload() (now triggered via native canplaythrough event) may fire early, followed by numerous HTML5 progress requests during playback as the audio object requests and buffers more audio ranges (eg., 0-10 seconds), eventually matching the total sound duration. +

          +

          + Bytes loaded / total are not available, so bytesLoaded instead reflects a fraction of "duration loaded", between 0 and 1 as data is buffered in. Previously, whileloading events would not fire once onload had fired under HTML5. +

          +
        • + +
        • +

          + New (undocumented, for now) buffered array on SMSound objects; list of objects following the pattern SMSound.buffered = [{ start: 0, end: 706 }] representing loaded time ranges (somewhat similar to HTML5 TimeRanges spec, but using static properties instead of method calls with an index parameter.) Array will initially be empty, zero-length. This can be looped through to show overlays of "loaded" time fragments on progress bars, for example.

          +

          SMSound buffered is updated during whileloading() calls, where values are provided by the browser. For flash, will always be one item with { start: 0, end: SMSound.duration } assigned. Also stopped sending 1/1 values to whileplaying() at onload(), since HTML5 can fire onload() (via canplaythrough) very early followed by many progress (whileloading()) events. +

          +

          + Support note: Not all browsers (eg., Safari 5.1.7) appear to provide buffer / TimeRanges data for HTML5 audio objects. At time of writing (06/2012), Firefox, Chrome Canary, IE 9 and Opera provide TimeRanges alongside progress events. +

          +
        • + +
        • +

          + Upgraded demos to use to soundManager.setup({...}) for most configuration cases (vs. setting soundManager.url, soundManager.defaultOptions.autoLoad directly etc.) +

          +
        • + +
        • +

          + Warn if soundManager.setup() called with url or flashVersion, and init has already fired (ie., flash options already set + movie already loaded) where changes will not take effect until soundManager.reboot(). +

          + +
        • + +
        • +

          + Assign top-level soundManager properties (eg. soundManager.url) from soundManager.setupOptions at DOMReady time; this allows legacy soundManager.url = ... assignment to work, and helps to ensure legacy-style, directly-assigned top-level property values get written back to soundManager.setupOptions. +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20120527 - Fix for ontimeout() regression. GWT/JSNI compatibility, slow connection and Safari "background tab" SWF load handling improvements (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Fix for ontimeout() regression seen when using lazy-loading / SM2_DEFER introduced with V2.97a.20120513; bug introduced when making edits to pass newer jslint rules regarding return within if...else blocks. +

          +
        • + +
        • +

          + Replaced instanceof Function with "safer" typeof x === 'function' for onready(), ontimeout() and related callback argument checks as GWT + JSNI was passing arguments that failed the instanceof check. (Related bug report.) +

          +
        • + +
        • +

          + Corrected another small regression for the ontimeout() -> onready() "recovery" edge case, ensuring "ready" does not fire after a timeout when init was unsuccessful. +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + + +
        • +

          + Improved handling for special Safari page load case: When a new tab is opened that does not have focus, the Flash SWF does not load/init until the tab is brought to the foreground. SM2 now recognizes this special case and waits until window.onfocus() before attempting to do the JS/Flash part of init. Previously, it would fail with a timeout. +

          +

          + Code written to originally handle Safari 3.1, which did not support document.hasFocus(), was modified and updated for this purpose. The Safari 3.1 logic previously deferred SM2's start-up in a similar fashion. (The old Safari 3.1 mousemove() focus-detection hack has been removed as Safari 4 has been out since mid-2009, and Safari 5 since mid-2010.) +

          + +
        • + +
        • +

          + SM2 init process will now delay and retry if no Flash response, and SWF has loaded > 0 and < 100%. Timeout will now happen only after delay and when SWF has loaded 100%. Should help prevent first-visit (non-cached) failure on very slow or laggy connections. +

          + +
        • + +
        • +

          + Added note about potential Firefox regression: Offline JS/Flash start-up (viewing HTML pages via file:// and/or c:/ and so forth), possibly not working as of Firefox 9 and newer (at time of writing, also up to and including Firefox 12), even despite special security whitelisting under Flash Player "trusted locations" preferences / control panel. +

          +

          + After successful Flash -> JS call, SM2's "return" JS -> Flash call fails with unusual JS/Flash exception, "Error in ActionScript" error with no further detail. Offline viewing still works in other browsers. +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20120513 - Fixes for Android 2.3 playback, onPosition() in HTML5, Flash 9 double-play edge case. Minor new Flash 9-specific features (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Android 2.3 playback fix (some sounds started only after 2+ play attempts due to Android not liking load() immediately followed by play()?) +

          +
        • + +
        • +

          + onPosition() fix for HTML5 playback, items were mistakenly being removed. +

          +
        • + +
        • +

          + Fix RTMP stream duration reporting via onmetadata() (wrong value was being returned, previously.) +

          +
        • + +
        • +

          + Fix for Flash 9 double-play edge case found with pause() + setPosition() calls. +

          +
        • + + +
        • +

          + JSLINT validation per 04-15-2012 edition rules, mostly removal of multiple return statements within if ... else blocks and inverted loop tricks. +

          +
        • + +
        + +
      • + +
      • + +

        API updates

        + +
          + +
        • +

          + Enabled waveform/eq/spectrum data features for MovieStar (H.264/NetStream content.) +

          +
        • + +
        • +

          + Added oncaptiondata() callback for caption data from Flash 9 (NetStream/RTMP-only, similar to onmetadata(). Contributor: GitHub user karma.) +

          +
        • + +
        • +

          + Added SMSound.onplayerror(), presently for Flash 9 (non-MovieStar/NetStream) which can detect lack of available sound hardware or 32-channel ceiling as reasons for playback failure. +

          +
        • + +
        • +

          + Added oncaptiondata() callback for caption data from Flash 9 (NetStream/RTMP-only, similar to onmetadata().) +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + Scaling added to 360 UI (via GitHub user tomasdev) +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      V2.97a.20120318 - Minor updates. from / to and onplay() bug fixes, canPlayMIME() and canPlayLink() Flash-specific corrections. (Download archived version)

      + +
        + +
      • + +

        Bug fixes

        + +
          + +
        • +

          + Fix silly undefined"soundID" debug output message shown at SMSound.onload (now says SMSound._onload() as previously.) +

          +
        • + +
        • +

          + soundManager.sounds = {} instead of [] on reboot (per bug report) +

          +
        • + +
        • +

          + Fix logic for calling onplay(), was always non-truthy. D'oh! +

          +
        • + +
        • +

          + Add missing typeof to fix html5 MIME check for playability tests +

          +
        • + +
        • +

          + Don't apply width:auto to SWF (invalid per HTML5, allegedly: Related patch.) +

          +
        • + +
        • +

          + Make soundManager.canPlayMIME() and canPlayLink() check flash support before returning (check after ontimeout() was returning truthy when flash required under Firefox, for example, for 'audio/mp3') +

          +
        • + +
        • +

          + Fix play() "from" + "to" sound sprite playback issue: In some cases, previously-fired "to" events were re-firing due to not being removed, because an equality check was comparing against a potential "to" value of a string rather than a number. (eg., 0-700 followed by 1500-2000; playback would stop in second case, saying 700 had been reached. (Related bug report.) +

          +
        • + +
        • +

          + Re-appeased the jslint gods, removed unused variables and two-statement reverse loop (for i=x; i--;) { } trickery. +

          +
        • + +
        + +
      • + +
      • + +

        Miscellaneous

        + +
          + +
        • +

          + The SoundManager project turned 10 years old, having originally launched in late 2001. Thanks for using it! +

          +
        • + +
        + +
      • + +
      + +
    • + + + +
    • + +

      Older Release Info

      +

      For release and changelog history going back to 2010, see the archive page.

      + +
    • + +
    + + +
    + + +
    + + +
    + + +
    + + + +
    + + + +
    + + + +
    + +
    + + +
    + + +
    + + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html new file mode 100755 index 00000000..df95c37e --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html @@ -0,0 +1,938 @@ + + + + + SoundManager2_AS.as + + + + + + +
    +
    + + + +
      + +
    • +
      +

      SoundManager2_AS.as

      +
      +
    • + + + +
    • +
      + +
      + +
      + +
      + +
      /**
      + * SoundManager 2: Javascript Sound for the Web
      + * ----------------------------------------------
      + * http://schillmania.com/projects/soundmanager2/
      + *
      + * Copyright (c) 2007, Scott Schiller. All rights reserved.
      + * Code licensed under the BSD License:
      + * http://www.schillmania.com/projects/soundmanager2/license.txt
      + *
      + * Flash 8 / ActionScript 2 version
      + *
      + * Compiling AS to Flash 8 SWF using MTASC (free compiler - http://www.mtasc.org/):
      + * mtasc -swf soundmanager2.swf -main -header 16:16:30 SoundManager2.as -version 8
      + *
      + * ActionScript Sound class reference (Macromedia), documentation download:
      + * http://livedocs.macromedia.com/flash/8/
      + * Previously-live URL:
      + * http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002668.html
      + *
      + * *** NOTE ON LOCAL FILE SYSTEM ACCESS ***
      + *
      + * Flash security allows local OR network access, but not both
      + * unless explicitly whitelisted/allowed by the flash player's
      + * security settings.
      + *
      + * To enable in-flash messaging for troubleshooting, pass debug=1 in FlashVars (within object/embed code)
      + * SM2 will do this by default when soundManager.debugFlash = true.
      + *
      + */
      +
      +import flash.external.ExternalInterface; // woo
      +
      +class SoundManager2 {
      +
      +  static var app: SoundManager2;
      +
      +  function SoundManager2() {
      +
      +    var version = "V2.97a.20131201";
      +    var version_as = "(AS2/Flash 8)";
      +
      +    /**
      +     *  Cross-domain security options
      +     *  HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work.
      +     *  // allow_xdomain_scripting = true;
      +     *  // xdomain = "foo.com";
      +     *  For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*");
      +     *  When loading from HTTPS, use System.security.allowInsecureDomain();
      +     *  See "allowDomain (security.allowDomain method)" in Flash 8/AS2 liveDocs documentation (AS2 reference -> classes -> security)
      +     *  download from http://livedocs.macromedia.com/flash/8/
      +     *  Related AS3 documentation: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain%28%29
      +     */
      +
      +    var allow_xdomain_scripting = false;
      +    var xdomain = "*";
      +
      +    if (allow_xdomain_scripting && xdomain) {
      +      System.security.allowDomain(xdomain);
      +      version_as += ' - cross-domain enabled';
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      externalInterface references (for Javascript callbacks)

      + +
      + +
          var baseJSController = "soundManager";
      +    var baseJSObject = baseJSController + ".sounds";
      + +
    • + + +
    • +
      + +
      + +
      +

      internal objects

      + +
      + +
          var sounds = []; // indexed string array
      +    var soundObjects = []; // associative Sound() object array
      +    var timer = null;
      +    var pollingEnabled = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call
      +    var debugEnabled = true; // Flash debug output enabled by default, disabled by JS call
      +    var flashDebugEnabled = false; // debug output to flash movie, off by default
      +    var didSandboxMessage = false;
      +    var caughtFatal = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      for flash text output, debugging etc.

      + +
      + +
          var _messages = [];
      +    var _messageObj = null;
      +    flashDebugEnabled = (_root.debug == 1);
      + +
    • + + +
    • +
      + +
      + +
      +

      display stuffs

      + +
      + +
          Stage.scaleMode = 'noScale';
      +    Stage.align = 'TL';
      + +
    • + + +
    • +
      + +
      + +
      +

      context menu item with version info

      + +
      + +
      +    var doNothing = function() {}
      +
      +    var sm2Menu:ContextMenu = new ContextMenu();
      +    var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as, doNothing);
      +    sm2MenuItem.enabled = false;
      +    sm2Menu.customItems.push(sm2MenuItem);
      +    _root.menu = sm2Menu;
      +
      +    var writeDebug = function(s, logLevel) {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (!debugEnabled) return false;
      +      ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, (logLevel || 0));
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
          }
      +
      +    var flashDebug = function(messageText) {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            _messages.push(messageText);
      +      if (!flashDebugEnabled) {
      +        return false;
      +      }
      +      var sans = new TextFormat();
      +      sans.size = 12;
      +      sans.font = "Arial";
      + +
    • + + +
    • +
      + +
      + +
      +

      320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.)

      + +
      + +
            var w = Stage.width?Stage.width:320;
      +      var h = Stage.height?Stage.height:240;
      +      if (!_messageObj) {
      +        _messageObj = _root.createTextField("_messageObj", 0, 0, 0, w, h);
      +        _messageObj.x = 0;
      +        _messageObj.y = 0;
      +        _messageObj.multiline = true;
      +        _messageObj.html = true;
      +        _messageObj.wordWrap = true;
      +        _messageObj.align = 'left';
      +        _messageObj.autoSize = false;
      +      }
      +      _messageObj.htmlText = _messages.join('\n');
      +      _messageObj.setTextFormat(sans);
      +      _messageObj.width = w;
      +      _messageObj.height = h;
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
          }
      +
      +    var _externalInterfaceTest = function(isFirstCall) {
      +      var sandboxType = System.security['sandboxType'];
      +      try {
      +        if (isFirstCall) {
      +          flashDebug('Testing Flash -&gt; JS...')
      +          if (!didSandboxMessage && sandboxType != 'remote' && sandboxType != 'localTrusted') {
      +            didSandboxMessage = true;
      +            flashDebug('<br><b>Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".<br>Additional security permissions need to be granted.<br>See <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html">flash security settings panel</a> for non-HTTP, eg. file:// use.</b><br>http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html<br><br>You may also be able to right-click this movie and choose from the menu: <br>"Global Settings" -> "Advanced" tab -> "Trusted Location Settings"<br>');
      +          }
      +          ExternalInterface.call(baseJSController + "._externalInterfaceOK", version);
      +          if (!didSandboxMessage) {
      +            flashDebug('Flash -&gt; JS OK');
      +            flashDebug('Waiting for JS -&gt; Flash...');
      +          }
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('SM2 SWF ' + version + ' ' + version_as, 1);

      + +
      + +
                ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType);
      +          flashDebug('JS -&gt; Flash OK');
      +        }
      +      } catch(e) {
      +        flashDebug(e.toString());
      +        if (!caughtFatal) {
      +          caughtFatal = true;
      +        }
      +        return false;
      +      }
      +      return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.)
      +    }
      +
      +    var _disableDebug = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      prevent future debug calls from Flash going to client (maybe improve performance)

      + +
      + +
            writeDebug('_disableDebug()');
      +      debugEnabled = false;
      +    }
      +
      +    var checkProgress = function() {
      +      var bL = 0;
      +      var bT = 0;
      +      var nD = 0;
      +      var nP = 0;
      +      var oSound = null;
      +      for (var i = 0, j = sounds.length; i < j; i++) {
      +        oSound = soundObjects[sounds[i]];
      +        bL = oSound.getBytesLoaded();
      +        bT = oSound.getBytesTotal();
      +        nD = oSound.duration || 0; // can sometimes be null with short MP3s? Wack.
      +        nP = oSound.position;
      +        if (bL && bT && bL != oSound.lastValues.bytes) {
      +          oSound.lastValues.bytes = bL;
      +          ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", bL, bT, nD);
      +        }
      +        if (typeof nP != 'undefined' && nP != oSound.lastValues.position) {
      +          oSound.lastValues.position = nP;
      +          ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileplaying", nP);
      + +
    • + + +
    • +
      + +
      + +
      +

      if position changed, check for near-end

      + +
      + +
              }
      +      }
      +    }
      +
      +    var onLoad = function(bSuccess) {
      +      checkProgress(); // ensure progress stats are up-to-date
      + +
    • + + +
    • +
      + +
      + +
      +

      force duration update (doesn't seem to be always accurate)

      + +
      + +
            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.getBytesLoaded(), this.getBytesTotal(), this.duration);
      +      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", this.duration > 0 ? 1 : 0); // bSuccess doesn't always seem to work, so check MP3 duration instead.
      +    }
      +
      +    var onID3 = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      --- NOTE: BUGGY? ---

      +

      TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) +ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) +iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. +May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33

      + +
      + +
            var id3Data = [];
      +      var id3Props = [];
      +      for (var prop in this.id3) {
      +        id3Props.push(prop);
      +        id3Data.push(this.id3[prop]);
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('id3['+prop+']: '+this.id3[prop]);

      + +
      + +
            }
      +      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onid3", id3Props, id3Data);
      + +
    • + + +
    • +
      + +
      + +
      +

      unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) +Therefore if ID3V2 data is received, ID3V1 is ignored.

      + +
      + +
            soundObjects[this.sID].onID3 = null;
      +    }
      +
      +    var registerOnComplete = function(sID) {
      +      soundObjects[sID].onSoundComplete = function() {
      +        checkProgress();
      +        ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      +      }
      +    }
      +
      +    var _setPosition = function(sID, nSecOffset, isPaused, _allowMultiShot) {
      + +
    • + + +
    • +
      + +
      + +
      +

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical.

      + +
      + +
            var s = soundObjects[sID];
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_setPosition()');

      + +
      + +
            s.lastValues.position = s.position;
      +      if (s.lastValues.loops > 1 && nSecOffset != 0) {
      +        writeDebug('Warning: Looping functionality being disabled due to Flash limitation.', 240);
      +        s.lastValues.loops = 1;
      +      }
      +      s.start(nSecOffset, s.lastValues.nLoops || 1); // start playing at new position
      +      if (isPaused) {
      +        s.stop();
      +      }
      +    }
      +
      +    var _load = function(sID, sURL, bStream, bAutoPlay, bCheckPolicyFile) {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_load(): '+sID+', '+sURL+', '+bStream+', '+bAutoPlay+', '+bCheckPolicyFile);

      + +
      + +
            if (typeof bAutoPlay == 'undefined') {
      +        bAutoPlay = false;
      +      }
      +      if (typeof bStream == 'undefined') {
      +        bStream = true;
      +      }
      +      if (typeof bCheckPolicyFile == 'undefined') {
      +        bCheckPolicyFile = false;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('bStream: '+bStream); +writeDebug('bAutoPlay: '+bAutoPlay); +checkProgress();

      + +
      + +
            var s = soundObjects[sID];
      +      s.onID3 = onID3;
      +      s.onLoad = onLoad;
      +      s.loaded = true;
      +      s.checkPolicyFile = bCheckPolicyFile;
      +      s.loadSound(sURL, bStream);
      +      if (bAutoPlay != true) {
      +        s.stop(); // prevent default auto-play behaviour
      +      } else {
      +        writeDebug('auto-play allowed');
      +      }
      +      registerOnComplete(sID);
      +    }
      +
      +    var _unload = function(sID, sURL) {
      + +
    • + + +
    • +
      + +
      + +
      +

      effectively "stop" loading by loading a tiny MP3

      + +
      + +
            var s = soundObjects[sID];
      +      s.onID3 = null;
      +      s.onLoad = null;
      +      s.loaded = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      ensure position is reset, if unload fails

      + +
      + +
            s.start(0,1);
      +      s.stop();
      +      s.loadSound(sURL, true);
      +      s.stop(); // prevent auto-play
      +    }
      +
      +    var _createSound = function(sID, loops, checkPolicyFile) {
      +      var s = new Sound();
      +      if (!soundObjects[sID]) {
      +        sounds.push(sID);
      +      }
      +      soundObjects[sID] = s;
      +      s.setVolume(100);
      +      s.sID = sID;
      +      s.paused = false;
      +      s.loaded = false;
      +      s.checkPolicyFile = checkPolicyFile;
      +      s.lastValues = {
      +        bytes: 0,
      +        position: 0,
      +        nLoops: loops||1
      +      };
      +    }
      +
      +    var _destroySound = function(sID) {
      + +
    • + + +
    • +
      + +
      + +
      +

      for the power of garbage collection! .. er, Greyskull!

      + +
      + +
            var s = (soundObjects[sID] || null);
      +      if (!s) {
      +        return false;
      +      }
      +      for (var i = 0; i < sounds.length; i++) {
      +        if (sounds[i] == sID) {
      +          sounds.splice(i, 1);
      +          break;
      +        }
      +      }
      +      s = null;
      +      delete soundObjects[sID];
      +    }
      +
      +    var _stop = function(sID, bStopAll) {
      + +
    • + + +
    • +
      + +
      + +
      +

      stop this particular instance (or "all", based on parameter)

      + +
      + +
            if (bStopAll) {
      +        _root.stop();
      +      } else {
      +        soundObjects[sID].stop();
      +        soundObjects[sID].paused = false;
      +      }
      +    }
      +
      +    var _start = function(sID, nLoops, nMsecOffset, _allowMultiShot) {
      + +
    • + + +
    • +
      + +
      + +
      +

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. +writeDebug('_start: ' + sID + ', loops: ' + nLoops + ', nMsecOffset: ' + nMsecOffset);

      + +
      + +
            registerOnComplete();
      +      var s = soundObjects[sID];
      +      s.lastValues.paused = false; // reset pause if applicable
      +      s.lastValues.nLoops = (nLoops || 1);
      +      s.start(nMsecOffset, nLoops);
      +      return true;
      +    }
      +
      +    var _pause = function(sID, _allowMultiShot) {
      + +
    • + + +
    • +
      + +
      + +
      +

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. +writeDebug('_pause()');

      + +
      + +
            var s = soundObjects[sID];
      +      if (!s.paused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      reference current position, stop sound

      + +
      + +
              s.paused = true;
      +        s.lastValues.position = s.position;
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_pause(): position: '+s.lastValues.position);

      + +
      + +
              s.stop();
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      resume playing from last position +writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.nLoops+' times');

      + +
      + +
              s.paused = false;
      +        s.start(s.lastValues.position / 1000, s.lastValues.nLoops);
      +      }
      +    }
      +
      +    var _setPan = function(sID, nPan) {
      +      soundObjects[sID].setPan(nPan);
      +    }
      +
      +    var _setVolume = function(sID, nVol) {
      +      soundObjects[sID].setVolume(nVol);
      +    }
      +
      +    var _setPolling = function(bPolling, timerInterval) {
      +      if (typeof timerInterval === 'undefined') {
      +        timerInterval = 50;
      +      }
      +      pollingEnabled = bPolling;
      +      if (timer == null && pollingEnabled) {
      +        flashDebug('Enabling polling, ' + timerInterval + ' ms interval');
      +        timer = setInterval(checkProgress, timerInterval);
      +      } else if (timer && !pollingEnabled) {
      +        flashDebug('Disabling polling');
      +        clearInterval(timer);
      +        timer = null;
      +      }
      +    }
      +
      +    var _init = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      OK now stuff should be available

      + +
      + +
            try {
      +        flashDebug('Adding ExternalInterface callbacks...');
      +        ExternalInterface.addCallback('_load', this, _load);
      +        ExternalInterface.addCallback('_unload', this, _unload);
      +        ExternalInterface.addCallback('_stop', this, _stop);
      +        ExternalInterface.addCallback('_start', this, _start);
      +        ExternalInterface.addCallback('_pause', this, _pause);
      +        ExternalInterface.addCallback('_setPosition', this, _setPosition);
      +        ExternalInterface.addCallback('_setPan', this, _setPan);
      +        ExternalInterface.addCallback('_setVolume', this, _setVolume);
      +        ExternalInterface.addCallback('_setPolling', this, _setPolling);
      +        ExternalInterface.addCallback('_externalInterfaceTest', this, _externalInterfaceTest);
      +        ExternalInterface.addCallback('_disableDebug', this, _disableDebug);
      +        ExternalInterface.addCallback('_createSound', this, _createSound);
      +        ExternalInterface.addCallback('_destroySound', this, _destroySound);
      +      } catch(e) {
      +        flashDebug('Fatal: ExternalInterface error: ' + e.toString());
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      try to talk to JS, do init etc.

      + +
      + +
            _externalInterfaceTest(true);
      + +
    • + + +
    • +
      + +
      + +
      +

      flashDebug('Init OK');

      + +
      + +
          }
      +
      +    flashDebug('SM2 SWF ' + version + ' ' + version_as);
      +
      +    if (ExternalInterface.available) {
      +      flashDebug('ExternalInterface available');
      +      _init();
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      d'oh! - may be from a corrupt install, ancient (pre-Netscape 6?) browser etc.

      + +
      + +
            flashDebug('Fatal: ExternalInterface (Flash &lt;-&gt; JS) not available');
      +    }
      +
      +
      +  } // SoundManager2()
      + +
    • + + +
    • +
      + +
      + +
      +

      entry point

      + +
      + +
        static function main(mc) {
      +    app = new SoundManager2();
      +  }
      +
      +}
      + +
    • + +
    +
    + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html new file mode 100755 index 00000000..a41e3fe8 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html @@ -0,0 +1,2026 @@ + + + + + SoundManager2_AS3.as + + + + + + +
    +
    + + + +
      + +
    • +
      +

      SoundManager2_AS3.as

      +
      +
    • + + + +
    • +
      + +
      + +
      + +
      + +
      /**
      + * SoundManager 2: Javascript Sound for the Web
      + * ----------------------------------------------
      + * http://schillmania.com/projects/soundmanager2/
      + *
      + * Copyright (c) 2007, Scott Schiller. All rights reserved.
      + * Code licensed under the BSD License:
      + * http://www.schillmania.com/projects/soundmanager2/license.txt
      + *
      + * Flash 9 / ActionScript 3 version
      + */
      +
      +package {
      +
      +  import flash.display.Sprite;
      +  import flash.events.Event;
      +  import flash.events.IOErrorEvent;
      +  import flash.events.MouseEvent;
      +  import flash.events.SecurityErrorEvent;
      +  import flash.events.AsyncErrorEvent;
      +  import flash.events.NetStatusEvent;
      +  import flash.events.TimerEvent;
      +  import flash.external.ExternalInterface; // woo
      +  import flash.media.Sound;
      +  import flash.media.SoundChannel;
      +  import flash.media.SoundMixer;
      +  import flash.net.URLLoader;
      +  import flash.net.URLRequest;
      +  import flash.system.Security;
      +  import flash.system.System;
      +  import flash.text.TextField;
      +  import flash.text.TextFormat;
      +  import flash.text.TextFieldAutoSize;
      +  import flash.ui.ContextMenu;
      +  import flash.ui.ContextMenuItem;
      +  import flash.utils.setInterval;
      +  import flash.utils.clearInterval;
      +  import flash.utils.Dictionary;
      +  import flash.utils.Timer;
      +
      +  public class SoundManager2_AS3 extends Sprite {
      +
      +    public var version:String = "V2.97a.20131201";
      +    public var version_as:String = "(AS3/Flash 9)";
      +
      +    /**
      +     *  Cross-domain security options
      +     *  HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work.
      +     *  // allow_xdomain_scripting = true;
      +     *  // xdomain = "foo.com";
      +     *  For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*");
      +     *  When loading from HTTPS, use System.security.allowInsecureDomain();
      +     *  See http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain()
      +     */
      +    public var allow_xdomain_scripting:Boolean = false;
      +    public var xdomain:String = "*";
      + +
    • + + +
    • +
      + +
      + +
      +

      externalInterface references (for Javascript callbacks)

      + +
      + +
          public var baseJSController:String = "soundManager";
      +    public var baseJSObject:String = baseJSController + ".sounds";
      + +
    • + + +
    • +
      + +
      + +
      +

      internal objects

      + +
      + +
          public var sounds:Array = []; // indexed string array
      +    public var soundObjects: Dictionary = new Dictionary(); // associative Sound() object Dictionary type
      +    public var timer: Timer = null;
      +    public var pollingEnabled: Boolean = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call
      +    public var debugEnabled: Boolean = true; // Flash debug output enabled by default, disabled by JS call
      +    public var flashDebugEnabled: Boolean = false; // Flash internal debug output (write to visible SWF in browser)
      +    public var loaded: Boolean = false;
      +    public var currentObject: SoundManager2_SMSound_AS3 = null;
      +    public var paramList:Object = null;
      +    public var messages:Array = [];
      +    public var textField: TextField = null;
      +    public var textStyle: TextFormat = new TextFormat();
      +    public var didSandboxMessage: Boolean = false;
      +    public var caughtFatal: Boolean = false;
      +
      +    public function SoundManager2_AS3() {
      +
      +      if (allow_xdomain_scripting && xdomain) {
      +        Security.allowDomain(xdomain);
      +        version_as += ' - cross-domain enabled';
      +      }
      +
      +      this.paramList = this.root.loaderInfo.parameters;
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (this.paramList['debug'] == 1) {
      +        this.flashDebugEnabled = true;
      +      }
      +
      +      if (this.flashDebugEnabled) {
      +        var canvas: Sprite = new Sprite();
      +        canvas.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
      +        addChild(canvas);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      flashDebug('SM2 SWF ' + version + ' ' + version_as);
      + +
    • + + +
    • +
      + +
      + +
      +

      context menu item with version info

      + +
      + +
      +      var sm2Menu:ContextMenu = new ContextMenu();
      +      var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as);
      +      sm2MenuItem.enabled = false;
      +      sm2Menu.customItems.push(sm2MenuItem);
      +      contextMenu = sm2Menu;
      +
      +      if (ExternalInterface.available) {
      +        flashDebug('ExternalInterface available');
      +        try {
      +          flashDebug('Adding ExternalInterface callbacks...');
      +          ExternalInterface.addCallback('_load', _load);
      +          ExternalInterface.addCallback('_unload', _unload);
      +          ExternalInterface.addCallback('_stop', _stop);
      +          ExternalInterface.addCallback('_start', _start);
      +          ExternalInterface.addCallback('_pause', _pause);
      +          ExternalInterface.addCallback('_setPosition', _setPosition);
      +          ExternalInterface.addCallback('_setPan', _setPan);
      +          ExternalInterface.addCallback('_setVolume', _setVolume);
      +          ExternalInterface.addCallback('_setPolling', _setPolling);
      +          ExternalInterface.addCallback('_externalInterfaceTest', _externalInterfaceTest);
      +          ExternalInterface.addCallback('_disableDebug', _disableDebug);
      +          ExternalInterface.addCallback('_getMemoryUse', _getMemoryUse);
      +          ExternalInterface.addCallback('_createSound', _createSound);
      +          ExternalInterface.addCallback('_destroySound', _destroySound);
      +          ExternalInterface.addCallback('_setAutoPlay', _setAutoPlay);
      +        } catch(e: Error) {
      +          flashDebug('Fatal: ExternalInterface error: ' + e.toString());
      +        }
      +      } else {
      +        flashDebug('Fatal: ExternalInterface (Flash &lt;-&gt; JS) not available');
      +      };
      + +
    • + + +
    • +
      + +
      + +
      +

      call after delay, to be safe (ensure callbacks are registered by the time JS is called below)

      + +
      + +
            var timer: Timer = new Timer(20, 0);
      +      timer.addEventListener(TimerEvent.TIMER, function() : void {
      +        timer.reset();
      +        _externalInterfaceTest(true);
      + +
    • + + +
    • +
      + +
      + +
      +

      timer.reset(); +flashDebug('Init OK');

      + +
      + +
            });
      +      timer.start();
      + +
    • + + +
    • +
      + +
      + +
      +

      delayed, see above +_externalInterfaceTest(true);

      + +
      + +
          } // SoundManager2()
      +
      +    public function flashDebug (txt:String) : void {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            messages.push(txt);
      +      if (this.flashDebugEnabled) {
      +        var didCreate: Boolean = false;
      +        textStyle.font = 'Arial';
      +        textStyle.size = 12;
      + +
    • + + +
    • +
      + +
      + +
      +

      320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.)

      + +
      + +
             var w:Number = this.stage.width?this.stage.width:320;
      +       var h:Number = this.stage.height?this.stage.height:240;
      +        if (textField == null) {
      +          didCreate = true;
      +          textField = new TextField();
      +          textField.autoSize = TextFieldAutoSize.LEFT;
      +          textField.x = 0;
      +          textField.y = 0;
      +          textField.multiline = true;
      +          textField.textColor = 0;
      +          textField.wordWrap = true;
      +        }
      +        textField.htmlText = messages.join('\n');
      +        textField.setTextFormat(textStyle);
      +        textField.width = w;
      +        textField.height = h;
      +        if (didCreate) {
      +          this.addChild(textField);
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
          }
      +
      +    public function _setAutoPlay(sID:String, autoPlay:Boolean) : void {
      +      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      if (s) {
      +        s.setAutoPlay(autoPlay);
      +      }
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      methods

      + +
      + +
      +    public function writeDebug (s:String, logLevel:Number = 0) : Boolean {
      +      if (!debugEnabled) {
      +        return false;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, null, logLevel);
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
            return true;
      +    }
      +
      +    public function _externalInterfaceTest(isFirstCall: Boolean) : Boolean {
      +      var sandboxType:String = flash.system.Security['sandboxType'];
      +      if (!didSandboxMessage && sandboxType != 'localTrusted' && sandboxType != 'remote') {
      +        didSandboxMessage = true;
      +        flashDebug('<br><b>Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".<br>Additional security permissions need to be granted.<br>See <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html">flash security settings panel</a> for non-HTTP, eg., file:// use.</b><br>http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html<br><br>You may also be able to right-click this movie and choose from the menu: <br>"Global Settings" -> "Advanced" tab -> "Trusted Location Settings"<br>');
      +      }
      +      try {
      +        if (isFirstCall == true) {
      +          flashDebug('Testing Flash -&gt; JS...');
      +          ExternalInterface.call(baseJSController + "._externalInterfaceOK", version);
      +          flashDebug('Flash -&gt; JS OK');
      +          flashDebug('Waiting for JS -&gt; Flash...');
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('SM2 SWF ' + version + ' ' + version_as, 1);

      + +
      + +
                ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType);
      +          flashDebug('JS -&gt; Flash OK');
      +        }
      +      } catch(e: Error) {
      +        flashDebug('Fatal: Flash &lt;-&gt; JS error: ' + e.toString());
      +        writeDebug('_externalInterfaceTest: Error: ' + e.toString(), 2);
      +        if (!caughtFatal) {
      +          caughtFatal = true;
      +        }
      +        return false;
      +      }
      +      return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.)
      +    }
      +
      +    public function _disableDebug() : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      prevent future debug calls from Flash going to client (maybe improve performance)

      + +
      + +
            writeDebug('_disableDebug()');
      +      debugEnabled = false;
      +    }
      +
      +    public function checkLoadProgress(e: Event) : void {
      +      try {
      +        var oSound:Object = e.target;
      +        var bL: int = oSound.bytesLoaded;
      +        var bT: int = oSound.bytesTotal;
      +        var nD: int = oSound.length || oSound.duration || 0;
      +        var sMethod:String = baseJSObject + "['" + oSound.sID + "']._whileloading";
      +        ExternalInterface.call(sMethod, bL, bT, nD);
      +        if (bL && bT && bL != oSound.lastValues.bytes) {
      +          oSound.lastValues.bytes = bL;
      +          ExternalInterface.call(sMethod, bL, bT, nD);
      +        }
      +      } catch(e: Error) {
      +        writeDebug('checkLoadProgress(): ' + e.toString());
      +      }
      +    }
      +
      +    public function checkSoundProgress(oSound:SoundManager2_SMSound_AS3, forceCheck:Boolean = false, forceEndCheck:Boolean = false) : void {
      +      var bL: int = 0;
      +      var bT: int = 0;
      +      var nD: int = 0;
      +      var nP: int = 0;
      +      var bufferLength: int = 0;
      +      var lP:Number = 0;
      +      var rP:Number = 0;
      +      var isBuffering:Object = null;
      +      var oSoundChannel: flash.media.SoundChannel = null;
      +      var sMethod:String = null;
      +      var newPeakData: Boolean = false;
      +      var newWaveformData: Boolean = false;
      +      var newEQData: Boolean = false;
      +      var areSoundsInaccessible: Boolean = SoundMixer.areSoundsInaccessible();
      +      var isPlaying: Boolean = true; // special case for NetStream when ending
      +      var hasNew:Boolean = false;
      +      var hasNewLoaded:Boolean = false;
      +
      +      if (!oSound || !oSound.useEvents || oSound.failed || !oSound.connected) {
      + +
    • + + +
    • +
      + +
      + +
      +

      edge cases for ignoring: if sounds are destructed within event handlers while checkProgress() is running, may be null

      + +
      + +
              return;
      +      }
      +
      +      sMethod = baseJSObject + "['" + oSound.sID + "']._whileloading";
      +
      +      if (oSound.useNetstream) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Don't do anything if there is no NetStream object yet

      + +
      + +
              if (!oSound.ns) {
      +          return;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      stream

      + +
      + +
              bufferLength = oSound.ns.bufferLength;
      +        bL = oSound.ns.bytesLoaded;
      +        bT = oSound.ns.bytesTotal;
      +        nD = int(oSound.duration || 0); // can sometimes be null with short MP3s? Wack.
      +        nP = oSound.ns.time * 1000;
      +
      +        if (oSound.paused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: paused netStreams don't update if setPosition() is called while they are paused. +instead, return lastValues.position which should reflect setPosition() call. +writeDebug('paused case, setting nP of '+nP+' to -1'); +writeDebug('lastValues: '+oSound.lastValues.position);

      + +
      + +
                nP = oSound.lastValues.position;
      +        }
      +
      +        if (nP >= 0 && nP != oSound.lastValues.position) {
      +          oSound.lastValues.position = nP;
      +          hasNew = true;
      +        }
      +        if (nD > oSound.lastValues.duration) {
      +          oSound.lastValues.duration = nD;
      +          hasNew = true;
      +        }
      +        if (bL > oSound.lastValues.bytesLoaded) {
      +          oSound.lastValues.bytesLoaded = bL;
      +          hasNew = true;
      +        }
      +        if (bT > oSound.lastValues.bytes) {
      +          oSound.lastValues.bytes = bT;
      +          hasNew = true;
      +        }
      +        if (bufferLength != oSound.lastValues.bufferLength) {
      +          oSound.lastValues.bufferLength = bufferLength;
      +          hasNew = true;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      Don't set loaded for streams because bytesLoaded and bytesTotal are always 0 +writeDebug('ns: time/duration, bytesloaded/total: '+nP+'/'+nD+', '+bL+'/'+bT);

      + +
      + +
              if (oSound.loaded != true && nD > 0 && bL == bT && bL != 0 && bT != 0) {
      + +
    • + + +
    • +
      + +
      + +
      +

      non-MP3 has loaded

      + +
      + +
                oSound.loaded = true;
      +          try {
      +            ExternalInterface.call(sMethod, bL, bT, nD, bufferLength);
      +            ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", oSound.duration > 0 ? 1 : 0);
      +          } catch(e: Error) {
      +            writeDebug('_whileLoading/_onload error: ' + e.toString(), 2);
      +          }
      +        } else if (oSound.loaded != true && hasNew) {
      +          ExternalInterface.call(sMethod, bL, bT, nD, bufferLength);
      +        }
      +
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      MP3 sound

      + +
      + +
              oSoundChannel = oSound.soundChannel;
      +        bL = oSound.bytesLoaded;
      +        bT = oSound.bytesTotal;
      +        nD = int(oSound.length || 0); // can sometimes be null with short MP3s? Wack.
      +        isBuffering = oSound.isBuffering;
      +
      +        if (oSoundChannel) {
      +          nP = (oSoundChannel.position || 0);
      +          if (oSound.lastValues.loops > 1 && nP > oSound.length) {
      + +
    • + + +
    • +
      + +
      + +
      +

      round down to nearest loop

      + +
      + +
                  var playedLoops:Number = Math.floor(nP/oSound.length);
      +            nP = nP - (oSound.length*playedLoops);
      +          }
      +          if (oSound.usePeakData) {
      +            lP = int((oSoundChannel.leftPeak) * 1000) / 1000;
      +            rP = int((oSoundChannel.rightPeak) * 1000) / 1000;
      +          } else {
      +            lP = 0;
      +            rP = 0;
      +          }
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      stopped, not loaded or feature not used

      + +
      + +
                nP = 0;
      +        }
      +
      +        if (forceEndCheck) {
      + +
    • + + +
    • +
      + +
      + +
      +

      sound finish case: Ensure position is at end (sound duration), as flash 9 does not always correctly match the two.

      + +
      + +
                if (nP < nD) {
      +            writeDebug('correcting sound ' + oSound.sID + ' end position ('+nP+') to length: '+ nD, 2);
      +            nP = nD;
      +          }
      +        }
      +
      +        if (nP != oSound.lastValues.position && nP !== 0 && !oSound.didFinish) { // once "completed", sound is locked via didFinish so no more position-type events fire.
      +          oSound.lastValues.position = nP;
      +          hasNew = true;
      +        }
      +
      +        if (nD > oSound.lastValues.duration) { // original sound duration * number of sound loops
      +          oSound.lastValues.duration = nD;
      +          hasNew = true;
      +        }
      +
      +        if (bL > oSound.lastValues.bytesLoaded) {
      +          oSound.lastValues.bytesLoaded = bL;
      +          hasNew = true;
      +        }
      +
      +        if (bT > oSound.lastValues.bytes) {
      +          oSound.lastValues.bytes = bT;
      +          hasNew = true;
      +          hasNewLoaded = true;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      loading progress

      + +
      + +
              if (hasNewLoaded) {
      +          oSound.lastValues.bytes = bL;
      +          ExternalInterface.call(sMethod, bL, bT, nD);
      +        }
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      peak data

      + +
      + +
            if (oSoundChannel && oSound.usePeakData) {
      +        if (lP != oSound.lastValues.leftPeak) {
      +          oSound.lastValues.leftPeak = lP;
      +          newPeakData = true;
      +        }
      +        if (rP != oSound.lastValues.rightPeak) {
      +          oSound.lastValues.rightPeak = rP;
      +          newPeakData = true;
      +        }
      +      }
      +
      +      var newDataError:Boolean = false;
      +      var dataError:String;
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: Netstream may try to fire whileplaying() after finishing. check that stop hasn't fired.

      + +
      + +
            isPlaying = (oSound.didLoad && !oSound.paused && (!oSound.useNetstream || (oSound.useNetstream && oSound.lastNetStatus != "NetStream.Play.Stop"))); // don't update if stream has ended
      + +
    • + + +
    • +
      + +
      + +
      +

      raw waveform + EQ spectrum data

      + +
      + +
            if (isPlaying && (oSoundChannel || oSound.useNetstream)) {
      +
      +        if (oSound.useWaveformData) {
      +          if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) {
      +            try {
      +              oSound.getWaveformData();
      +            } catch(e: Error) {
      +              if (!oSound.handledDataError) {
      +                writeDebug('getWaveformData() (waveform data) '+e.toString());
      +              }
      + +
    • + + +
    • +
      + +
      + +
      +

      oSound.useWaveformData = false;

      + +
      + +
                    newDataError = true;
      +              dataError = e.toString();
      +            }
      +          }
      +        }
      +
      +        if (oSound.useEQData) {
      +          if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) {
      +            try {
      +              oSound.getEQData();
      +            } catch(e: Error) {
      +              if (!oSound.handledDataError) {
      +                writeDebug('computeSpectrum() (EQ data) '+e.toString());
      +              }
      + +
    • + + +
    • +
      + +
      + +
      +

      oSound.useEQData = false;

      + +
      + +
                    newDataError = true;
      +              dataError = e.toString();
      +            }
      +          }
      +        }
      +
      +        if (oSound.waveformDataArray != oSound.lastValues.waveformDataArray) {
      +          oSound.lastValues.waveformDataArray = oSound.waveformDataArray;
      +          newWaveformData = true;
      +        }
      +
      +        if (oSound.eqDataArray != oSound.lastValues.eqDataArray) {
      +          oSound.lastValues.eqDataArray = oSound.eqDataArray;
      +          newEQData = true;
      +        }
      +
      +        if (newDataError && !oSound.handledDataError) {
      +          sMethod = baseJSObject + "['" + oSound.sID + "']._ondataerror";
      +          ExternalInterface.call(sMethod, 'data unavailable: ' + dataError);
      +          oSound.handledDataError = true;
      +        }
      +
      +      }
      +
      +      if (typeof nP != 'undefined' && (hasNew && (oSound.soundChannel || oSound.useNetstream || forceCheck || forceEndCheck))) { // && isPlaying - removed to allow updates while paused, eg. from setPosition() calls. Also be more liberal if we're using netStream.
      + +
    • + + +
    • +
      + +
      + +
      +

      oSound.lastValues.position = nP;

      + +
      + +
              sMethod = baseJSObject + "['" + oSound.sID + "']._whileplaying";
      +        var waveDataLeft:String = (newWaveformData ? oSound.waveformDataArray.slice(0, 256).join(',') : null);
      +        var waveDataRight:String = (newWaveformData ? oSound.waveformDataArray.slice(256).join(',') : null);
      +        var eqDataLeft:String = (newEQData ? oSound.eqDataArray.slice(0, 256).join(',') : null);
      +        var eqDataRight:String = (newEQData ? oSound.eqDataArray.slice(256).join(',') : null);
      +        ExternalInterface.call(sMethod, nP, (newPeakData ? {
      +          leftPeak: lP,
      +          rightPeak: rP
      +        } : null), waveDataLeft, waveDataRight, (newEQData ? {
      +          leftEQ: eqDataLeft,
      +          rightEQ: eqDataRight
      +        } : null));
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      check isBuffering

      + +
      + +
            if (!oSound.useNetstream && oSound.isBuffering != oSound.lastValues.isBuffering) {
      + +
    • + + +
    • +
      + +
      + +
      +

      property has changed

      + +
      + +
              oSound.lastValues.isBuffering = oSound.isBuffering;
      +        sMethod = baseJSObject + "['" + oSound.sID + "']._onbufferchange";
      +        ExternalInterface.call(sMethod, oSound.isBuffering ? 1 : 0);
      +      }
      +
      +    }
      +
      +    public function checkProgress() : void {
      +      for (var i: int = 0, j: int = sounds.length; i < j; i++) {
      +        checkSoundProgress(soundObjects[sounds[i]]);
      +      }
      +    }
      +
      +    public function onLoadError(oSound:Object) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      something went wrong. 404, bad format etc.

      + +
      + +
            ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", 0);
      +    }
      +
      +    public function onLoad(e: Event) : void {
      +      var oSound:Object = e.target;
      +      checkSoundProgress(soundObjects[oSound.sID]); // ensure progress stats are up-to-date
      +      if (!oSound.useNetstream) { // FLV must also have metadata
      +        oSound.loaded = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      force duration update (doesn't seem to be always accurate)

      + +
      + +
              ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", oSound.bytesLoaded, oSound.bytesTotal, oSound.length || oSound.duration);
      + +
    • + + +
    • +
      + +
      + +
      +

      duration > 0 means a valid sound was loaded.

      + +
      + +
              ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", (oSound.length || oSound.duration ? 1 : 0));
      +      }
      +    }
      +
      +    public function onID3(e: Event) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      --- NOTE: BUGGY (Flash 8 only? Haven't really checked 9 + 10.) --- +TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) +ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) +iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. +May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33

      + +
      + +
            try {
      +        var oSound:Object = e.target;
      +
      +        var id3Data:Array = [];
      +        var id3Props:Array = [];
      +        for (var prop:String in oSound.id3) {
      +          id3Props.push(prop);
      +          id3Data.push(oSound.id3[prop]);
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('id3['+prop+']: '+oSound.id3[prop]);

      + +
      + +
              }
      +        ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onid3", id3Props, id3Data);
      + +
    • + + +
    • +
      + +
      + +
      +

      unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) +Therefore if ID3V2 data is received, ID3V1 is ignored. +soundObjects[oSound.sID].onID3 = null;

      + +
      + +
            } catch(e: Error) {
      +        writeDebug('onID3(): Unable to get ID3 info for ' + oSound.sID + '.');
      +      }
      +      oSound.removeEventListener(Event.ID3, onID3);
      +    }
      +
      +    public function registerOnComplete(sID:String) : void {
      +      var oSound: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      if (oSound && oSound.soundChannel) {
      +        oSound.didFinish = false; // reset this flag
      +        oSound.soundChannel.addEventListener(Event.SOUND_COMPLETE, function() : void {
      +          if (oSound) {
      + +
    • + + +
    • +
      + +
      + +
      +

      force progress check, catching special end-of-sound case where position may not match duration.

      + +
      + +
                  checkSoundProgress(oSound, true, true);
      +            try {
      +              oSound.ignoreDataError = true; // workaround: avoid data error handling for this manual step..
      + +
    • + + +
    • +
      + +
      + +
      +

      oSound.soundChannel.stop();

      + +
      + +
                    oSound.didFinish = true; // "lock" sound, prevent extra whileplaying() position-type updates
      + +
    • + + +
    • +
      + +
      + +
      +

      call onfinish first (with end position)...

      + +
      + +
                    ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      + +
    • + + +
    • +
      + +
      + +
      +

      then reset sound so it can be played again. +oSound.start(0, 1); // go back to 0

      + +
      + +
                  } catch(e: Error) {
      +              writeDebug('Could not set position on ' + sID + ': ' + e.toString());
      +            }
      +            oSound.ignoreDataError = false; // ..and reset
      +            oSound.handledDataError = false; // reset this flag
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      safety net

      + +
      + +
                  ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      +          }
      +        });
      +      }
      +    }
      +
      +    public function doSecurityError(oSound: SoundManager2_SMSound_AS3, e: SecurityErrorEvent) : void {
      +      writeDebug('securityError: ' + e.text);
      + +
    • + + +
    • +
      + +
      + +
      +

      when this happens, you don't have security rights on the server containing the FLV file +a crossdomain.xml file would fix the problem easily

      + +
      + +
          }
      +
      +    public function _setPosition(sID:String, nSecOffset:Number, isPaused: Boolean, allowMultiShot: Boolean) : void {
      +      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      if (!s) return void;
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_setPosition()');

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      stop current channel, start new one.

      + +
      + +
            if (s.lastValues) {
      +        s.lastValues.position = nSecOffset; // s.soundChannel.position;
      +      }
      +      if (s.useNetstream) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Minimize the buffer so playback starts ASAP

      + +
      + +
              s.ns.bufferTime = s.bufferTime;
      +        writeDebug('setPosition ('+ sID + '): setting buffer to '+s.ns.bufferTime+' secs');
      +
      +        nSecOffset = nSecOffset > 0 ? nSecOffset / 1000 : 0;
      +        s.ns.seek(nSecOffset);
      +        checkSoundProgress(s); // force UI update
      +      } else {
      +        if (s.soundChannel) {
      +          s.soundChannel.stop();
      +        }
      +        writeDebug('setPosition ('+ sID + '): ' + nSecOffset); // +', '+(s.lastValues.loops?s.lastValues.loops:1));
      +        if (s.lastValues.loops > 1 && nSecOffset != 0) {
      +          writeDebug('Warning: Looping functionality being disabled due to Flash limitation.');
      +          s.lastValues.loops = 1;
      +        }
      +        try {
      +          s.start(nSecOffset, s.lastValues.loops || 1, allowMultiShot); // start playing at new position
      +        } catch(e: Error) {
      +          writeDebug('Warning: Could not set position on ' + sID + ': ' + e.toString());
      +        }
      +        checkSoundProgress(s); // force UI update
      +        try {
      +          registerOnComplete(sID);
      +        } catch(e: Error) {
      +          writeDebug('_setPosition(): Could not register onComplete');
      +        }
      +        if (isPaused && s.soundChannel) {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_setPosition: stopping (paused) sound'); +writeDebug('last position: '+s.lastValues.position+' vs '+s.soundChannel.position);

      + +
      + +
                s.soundChannel.stop();
      +        }
      +      }
      +    }
      +
      +    public function _load(sID:String, sURL:String, bStream: Boolean, bAutoPlay: Boolean, nLoops: Number, bAutoLoad: Boolean, bCheckPolicyFile: Boolean) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_load()');

      + +
      + +
            if (typeof bAutoPlay == 'undefined') bAutoPlay = false;
      +      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      if (!s) return void;
      +      var didRecreate: Boolean = false;
      +      if (s.didLoad == true) {
      + +
    • + + +
    • +
      + +
      + +
      +

      need to recreate sound

      + +
      + +
              didRecreate = true;
      +        writeDebug('recreating sound ' + sID + ' in order to load ' + sURL);
      +        var ns:Object = new Object();
      +        ns.sID = s.sID;
      +        ns.loops = nLoops||1;
      +        ns.usePeakData = s.usePeakData;
      +        ns.useWaveformData = s.useWaveformData;
      +        ns.useEQData = s.useEQData;
      +        ns.useNetstream = s.useNetstream;
      +        ns.bufferTime = s.bufferTime;
      +        ns.serverUrl = s.serverUrl;
      +        ns.duration = s.duration;
      +        ns.checkPolicyFile = s.checkPolicyFile;
      +        ns.useEvents = true;
      +        _destroySound(s.sID);
      +        _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, bAutoPlay, ns.useEvents, bAutoLoad, ns.checkPolicyFile);
      +        s = soundObjects[sID];
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('Sound object replaced');

      + +
      + +
            }
      +      checkSoundProgress(s);
      +
      +      if (!s.didLoad) {
      +        try {
      +          s.addEventListener(Event.ID3, onID3);
      +          s.addEventListener(Event.COMPLETE, onLoad);
      +        } catch(e: Error) {
      +          writeDebug('_load(): could not assign ID3/complete event handlers');
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      don't try to load if same request already made

      + +
      + +
            s.sURL = sURL;
      +
      +      try {
      +        if (!s.useNetstream) {
      +          s.addEventListener(IOErrorEvent.IO_ERROR, function(e: IOErrorEvent) : void {
      +            s.doIOError(e);
      +          });
      +        }
      +        s.loadSound(sURL);
      +      } catch(e: Error) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
              writeDebug('_load: Error loading ' + sURL + '. Flash error detail: ' + e.toString());
      +      }
      +
      +    }
      +
      +    public function _unload(sID:String) : void {
      +      var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null);
      +      if (!s) return void;
      +      var sURL:String = s.sURL; // save existing sound URL for object recreation
      +      try {
      +        removeEventListener(Event.ID3, onID3);
      +        removeEventListener(Event.COMPLETE, onLoad);
      +      } catch(e: Error) {
      +        writeDebug('_unload() warn: Could not remove ID3/complete events');
      +      }
      +      s.paused = false;
      +      if (s.soundChannel) {
      +        s.soundChannel.stop();
      +      }
      +      try {
      +        if (s.didLoad && !s.loaded && !s.useNetstream) {
      +          s.close(); // close stream only if still loading?
      +        }
      +      } catch(e: Error) {
      + +
    • + + +
    • +
      + +
      + +
      +

      stream may already have closed if sound loaded, etc.

      + +
      + +
              writeDebug(sID + '._unload(): Note: Unable to close stream: ' + e.toString());
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
            }
      + +
    • + + +
    • +
      + +
      + +
      +

      destroy and recreate Flash sound object, try to reclaim memory +writeDebug('sound._unload(): recreating sound '+sID+' to free memory');

      + +
      + +
            if (s.useNetstream) {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_unload(): closing netStream stuff');

      + +
      + +
              try {
      +          s.removeNetstreamEvents();
      +          s.ns.close();
      +          s.nc.close();
      + +
    • + + +
    • +
      + +
      + +
      +

      s.nc = null; +s.ns = null;

      + +
      + +
              } catch(e: Error) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
                writeDebug('_unload(): caught exception during netConnection/netStream close');
      +        }
      +      }
      +      var ns:Object = new Object();
      +      ns.sID = s.sID;
      +      ns.loops = s.loops;
      +      ns.usePeakData = s.usePeakData;
      +      ns.useWaveformData = s.useWaveformData;
      +      ns.useEQData = s.useEQData;
      +      ns.useNetstream = s.useNetstream;
      +      ns.bufferTime = s.bufferTime;
      +      ns.serverUrl = s.serverUrl;
      +      ns.duration = s.duration;
      +      ns.autoPlay = s.autoPlay;
      +      ns.autoLoad = s.autoLoad;
      +      ns.checkPolicyFile = s.checkPolicyFile;
      +      _destroySound(s.sID);
      +      _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, ns.autoPlay, false, ns.autoLoad, ns.checkPolicyFile); // false: don't allow events just yet
      +      soundObjects[sID].connected = true; // fake it?
      +      writeDebug(s.sID + '.unload(): ok');
      +    }
      +
      +    public function _createSound(sID:String, sURL:String, usePeakData: Boolean, useWaveformData: Boolean, useEQData: Boolean, useNetstream: Boolean, bufferTime:Number, loops:Number, serverUrl:String, duration:Number, autoPlay:Boolean, useEvents:Boolean, autoLoad:Boolean, checkPolicyFile:Boolean) : void {
      +      var s: SoundManager2_SMSound_AS3 = new SoundManager2_SMSound_AS3(this, sID, sURL, usePeakData, useWaveformData, useEQData, useNetstream, bufferTime, serverUrl, duration, autoPlay, useEvents, autoLoad, checkPolicyFile);
      +      if (!soundObjects[sID]) {
      +        sounds.push(sID);
      +      }
      +      soundObjects[sID] = s;
      +      this.currentObject = s;
      +      s.sID = sID;
      +      s.sURL = sURL;
      +      s.paused = false;
      +      s.loaded = false;
      +      s.checkPolicyFile = checkPolicyFile;
      +      s.lastValues = {
      +        bytes: 0,
      +        duration: 0,
      +        position: 0,
      +        loops: loops||1,
      +        leftPeak: 0,
      +        rightPeak: 0,
      +        bufferLength: 0
      +      };
      +    }
      +
      +    public function _destroySound(sID:String) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      for the power of garbage collection! .. er, Greyskull!

      + +
      + +
            var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null);
      +      if (!s) return void;
      + +
    • + + +
    • +
      + +
      + +
      +

      try to unload the sound

      + +
      + +
            for (var i: int = 0, j: int = sounds.length; i < j; i++) {
      +        if (sounds[i] == sID) {
      +          sounds.splice(i, 1);
      +          break;
      +        }
      +      }
      +      if (s.soundChannel) {
      +        s.soundChannel.stop();
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      if is a movie, remove that as well.

      + +
      + +
            if (s.useNetstream) {
      + +
    • + + +
    • +
      + +
      + +
      +

      s.nc.client = null;

      + +
      + +
              try {
      +          s.removeNetstreamEvents();
      + +
    • + + +
    • +
      + +
      + +
      +

      s.nc.removeEventListener(NetStatusEvent.NET_STATUS, s.doNetStatus);

      + +
      + +
              } catch(e: Error) {
      +          writeDebug('_destroySound(): Events already removed from netStream/netConnection?');
      +        }
      +        if (s.didLoad) {
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: figure out if stream is still open first, can't close an already-closed stream.

      + +
      + +
                try {
      +            s.ns.close();
      +            s.nc.close();
      +          } catch(e: Error) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
                  writeDebug('_destroySound(): caught exception: '+e.toString());
      +          }
      +        }
      +      } else if (s.didLoad) {
      + +
    • + + +
    • +
      + +
      + +
      +

      non-netstream case

      + +
      + +
              try {
      +          s.close(); // close stream only if still loading?
      +        } catch(e: Error) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
              }
      +      }
      +      s = null;
      +      soundObjects[sID] = null;
      +      delete soundObjects[sID];
      +    }
      +
      +    public function _stop(sID:String, bStopAll: Boolean) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      stop this particular instance (or "all", based on parameter)

      + +
      + +
            if (bStopAll) {
      +        SoundMixer.stopAll();
      +      } else {
      +        var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +        if (!s) return void;
      +        if (s.useNetstream && s.ns) {
      +          s.ns.pause();
      +        } else if (s.soundChannel) {
      +          s.soundChannel.stop();
      +        }
      +        s.paused = false;
      +      }
      +    }
      +
      +    public function _start(sID:String, nLoops: int, nMsecOffset: int, allowMultiShot: Boolean) : Boolean {
      +      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      var result: Boolean;
      +      if (!s) return true;
      +      writeDebug('start (' + sID + '): ' + nMsecOffset + (nLoops > 1 ? ', loops: ' + nLoops : ''));
      +      s.lastValues.paused = false; // reset pause if applicable
      +      s.lastValues.loops = (nLoops || 1);
      +      if (!s.useNetstream) {
      +        s.lastValues.position = nMsecOffset;
      +      }
      +      s.handledDataError = false; // reset this flag
      +      try {
      +        result = s.start(nMsecOffset, nLoops, allowMultiShot);
      +      } catch(e: Error) {
      +        writeDebug('Could not start ' + sID + ': ' + e.toString());
      +      }
      +      try {
      +        registerOnComplete(sID);
      +      } catch(e: Error) {
      +        writeDebug('_start(): registerOnComplete failed');
      +      }
      +      return result;
      +    }
      +
      +    public function _pause(sID:String, allowMultiShot: Boolean) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_pause(): ' + sID);

      + +
      + +
            var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      +      if (!s) return void;
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('s.paused: '+s.paused);

      + +
      + +
            if (!s.paused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      reference current position, stop sound

      + +
      + +
              s.paused = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_pause(): position: '+s.lastValues.position);

      + +
      + +
              if (s.useNetstream) {
      +          if (s.ns) {
      +            s.lastValues.position = s.ns.time*1000;
      +            s.ns.pause();
      +          } else if (s.autoPlay) {
      +            s.setAutoPlay(false);
      +          }
      +        } else {
      +          if (s.soundChannel) {
      +            s.lastValues.position = s.soundChannel.position;
      +            s.soundChannel.stop();
      +          }
      +        }
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      resume playing from last position +writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.loops+' times');

      + +
      + +
              s.paused = false;
      +        if (s.useNetstream) {
      +          s.ns.resume();
      +        } else {
      +          s.start(s.lastValues.position, s.lastValues.loops, allowMultiShot);
      +        }
      +        try {
      +          registerOnComplete(sID);
      +        } catch(e: Error) {
      +          writeDebug('_pause(): registerOnComplete() failed');
      +        }
      +      }
      +    }
      +
      +    public function _setPan(sID:String, nPan:Number) : void {
      +      if (soundObjects[sID]) {
      +        soundObjects[sID].setPan(nPan);
      +      }
      +    }
      +
      +    public function _setVolume(sID:String, nVol:Number) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('_setVolume: '+nVol);

      + +
      + +
            if (soundObjects[sID]) {
      +        soundObjects[sID].setVolume(nVol);
      +      }
      +    }
      +
      +    public function _setPolling(bPolling: Boolean = false, nTimerInterval: uint = 50) : void {
      +      pollingEnabled = bPolling;
      +      if (timer == null && pollingEnabled) {
      +        flashDebug('Enabling polling, ' + nTimerInterval + ' ms interval');
      +        timer = new Timer(nTimerInterval, 0);
      +        timer.addEventListener(TimerEvent.TIMER, function() : void {
      +          checkProgress();
      +        }); // direct reference eg. checkProgress doesn't work? .. odd.
      +        timer.start();
      +      } else if (timer && !pollingEnabled) {
      +        flashDebug('Disabling polling');
      + +
    • + + +
    • +
      + +
      + +
      +

      flash.utils.clearInterval(timer);

      + +
      + +
              timer.reset();
      +      }
      +    }
      +
      +    public function _getMemoryUse() : String {
      +      return System.totalMemory.toString();
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +
      +

      end methods

      + +
      + +
      +  }
      + +
    • + + +
    • +
      + +
      + +
      +

      package

      + +
      + +
      +}
      + +
    • + +
    +
    + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html new file mode 100755 index 00000000..ff0ae3f4 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html @@ -0,0 +1,1302 @@ + + + + + SoundManager2_SMSound_AS3.as + + + + + + +
    +
    + + + +
      + +
    • +
      +

      SoundManager2_SMSound_AS3.as

      +
      +
    • + + + +
    • +
      + +
      + +
      + +
      + +
      /**
      + * SoundManager 2: Javascript Sound for the Web
      + * ----------------------------------------------
      + * http://schillmania.com/projects/soundmanager2/
      + *
      + * Copyright (c) 2007, Scott Schiller. All rights reserved.
      + * Code licensed under the BSD License:
      + * http://www.schillmania.com/projects/soundmanager2/license.txt
      + *
      + * Flash 9 / ActionScript 3 version
      + */
      +
      +package {
      +
      +  import flash.external.*;
      +  import flash.events.*;
      +  import flash.media.Sound;
      +  import flash.media.SoundChannel;
      +  import flash.media.SoundLoaderContext;
      +  import flash.media.SoundTransform;
      +  import flash.media.SoundMixer;
      +  import flash.net.URLRequest;
      +  import flash.utils.ByteArray;
      +  import flash.utils.getTimer;
      +  import flash.net.NetConnection;
      +  import flash.net.NetStream;
      +  import flash.net.Responder;
      +
      +  public class SoundManager2_SMSound_AS3 extends Sound {
      +
      +    public var sm: SoundManager2_AS3 = null;
      + +
    • + + +
    • +
      + +
      + +
      +

      externalInterface references (for Javascript callbacks)

      + +
      + +
          public var baseJSController: String = "soundManager";
      +    public var baseJSObject: String = baseJSController + ".sounds";
      +    public var soundChannel: SoundChannel = new SoundChannel();
      +    public var urlRequest: URLRequest;
      +    public var soundLoaderContext: SoundLoaderContext;
      +    public var waveformData: ByteArray = new ByteArray();
      +    public var waveformDataArray: Array = [];
      +    public var eqData: ByteArray = new ByteArray();
      +    public var eqDataArray: Array = [];
      +    public var usePeakData: Boolean = false;
      +    public var useWaveformData: Boolean = false;
      +    public var useEQData: Boolean = false;
      +    public var sID: String;
      +    public var sURL: String;
      +    public var didFinish: Boolean;
      +    public var loaded: Boolean;
      +    public var connected: Boolean;
      +    public var failed: Boolean;
      +    public var paused: Boolean;
      +    public var finished: Boolean;
      +    public var duration: Number;
      +    public var handledDataError: Boolean = false;
      +    public var ignoreDataError: Boolean = false;
      +    public var autoPlay: Boolean = false;
      +    public var autoLoad: Boolean = false;
      +    public var pauseOnBufferFull: Boolean = false; // only applies to RTMP
      +    public var loops: Number = 1;
      +    public var lastValues: Object = {
      +      bytes: 0,
      +      position: 0,
      +      duration: 0,
      +      volume: 100,
      +      pan: 0,
      +      loops: 1,
      +      leftPeak: 0,
      +      rightPeak: 0,
      +      waveformDataArray: null,
      +      eqDataArray: null,
      +      isBuffering: null,
      +      bufferLength: 0
      +    };
      +    public var didLoad: Boolean = false;
      +    public var useEvents: Boolean = false;
      +    public var sound: Sound = new Sound();
      +
      +    public var cc: Object;
      +    public var nc: NetConnection;
      +    public var ns: NetStream = null;
      +    public var st: SoundTransform;
      +    public var useNetstream: Boolean;
      +    public var bufferTime: Number = 3; // previously 0.1
      +    public var lastNetStatus: String = null;
      +    public var serverUrl: String = null;
      +
      +    public var checkPolicyFile:Boolean = false;
      +
      +    public function SoundManager2_SMSound_AS3(oSoundManager: SoundManager2_AS3, sIDArg: String = null, sURLArg: String = null, usePeakData: Boolean = false, useWaveformData: Boolean = false, useEQData: Boolean = false, useNetstreamArg: Boolean = false, netStreamBufferTime: Number = 1, serverUrl: String = null, duration: Number = 0, autoPlay: Boolean = false, useEvents: Boolean = false, autoLoad: Boolean = false, checkPolicyFile: Boolean = false) {
      +      this.sm = oSoundManager;
      +      this.sID = sIDArg;
      +      this.sURL = sURLArg;
      +      this.usePeakData = usePeakData;
      +      this.useWaveformData = useWaveformData;
      +      this.useEQData = useEQData;
      +      this.urlRequest = new URLRequest(sURLArg);
      +      this.didFinish = false;
      +      this.loaded = false;
      +      this.connected = false;
      +      this.failed = false;
      +      this.finished = false;
      +      this.soundChannel = null;
      +      this.lastNetStatus = null;
      +      this.useNetstream = useNetstreamArg;
      +      this.serverUrl = serverUrl;
      +      this.duration = duration;
      +      this.useEvents = useEvents;
      +      this.autoLoad = autoLoad;
      +      if (netStreamBufferTime) {
      +        this.bufferTime = netStreamBufferTime;
      +      }
      +      this.checkPolicyFile = checkPolicyFile;
      +
      +      writeDebug('SoundManager2_SMSound_AS3: Got duration: '+duration+', autoPlay: '+autoPlay);
      +
      +      if (this.useNetstream) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Pause on buffer full if auto-loading an RTMP stream

      + +
      + +
              if (this.serverUrl && this.autoLoad) {
      +          this.pauseOnBufferFull = true;
      +        }
      +
      +        this.cc = new Object();
      +        this.nc = new NetConnection();
      + +
    • + + +
    • + + +
              this.nc.client = this;
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: security/IO error handling +this.nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doSecurityError);

      + +
      + +
              nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
      +
      +        if (this.serverUrl != null) {
      +          writeDebug('SoundManager2_SMSound_AS3: NetConnection: connecting to server ' + this.serverUrl + '...');
      +        }
      +        this.nc.connect(serverUrl);
      +      } else {
      +        this.connected = true;
      +      }
      +
      +    }
      +
      +    public function rtmpResponder(result:Object):void {
      + +
    • + + +
    • +
      + +
      + +
      +

      callback from Flash Media Server (RTMP) for 'getStreamLength' server-side method - result should be a floating-point. +http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html

      + +
      + +
            writeDebug('RTMP server getStreamLength() response: ' + result);
      + +
    • + + +
    • +
      + +
      + +
      +

      we now know the duration. type cast to floating-point - this will update JS-land during whileloading() / whileplaying().

      + +
      + +
            this.duration = Number(result) * 1000;
      +    }
      +
      +    public function netStatusHandler(event:NetStatusEvent):void {
      +
      +      if (this.useEvents) {
      +        writeDebug('netStatusHandler: '+event.info.code);
      +      }
      +
      +      switch (event.info.code) {
      +
      +        case "NetConnection.Connect.Success":
      +          try {
      +            this.ns = new NetStream(this.nc);
      +            this.ns.checkPolicyFile = this.checkPolicyFile;
      + +
    • + + +
    • + + +
                  this.ns.bufferTime = this.bufferTime; // set to 0.1 or higher. 0 is reported to cause playback issues with static files.
      +            this.st = new SoundTransform();
      +            this.cc.onMetaData = this.onMetaData;
      +            this.cc.setCaption = this.captionHandler;
      +            this.ns.client = this.cc;
      +            this.ns.receiveAudio(true);
      +            this.addNetstreamEvents();
      +            this.connected = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      RTMP-only

      + +
      + +
                  if (this.serverUrl && this.useEvents) {
      +              var responder:Responder = new Responder(rtmpResponder);
      + +
    • + + +
    • +
      + +
      + +
      +

      call a method on server to get the length of the stream (like onMetaData, but Flash Media Server-specific) +Red5 and other RTMP servers appear to provide duration via onMetaData event(s) in the stream. +http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html

      + +
      + +
                    nc.call('getStreamLength', responder, this.sURL);
      +              writeDebug('NetConnection: connected');
      +              writeDebug('firing _onconnect for '+this.sID);
      +              ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._onconnect", 1);
      +            }
      +          } catch(e: Error) {
      +            this.failed = true;
      +            writeDebug('netStream error: ' + e.toString());
      +            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code);
      +          }
      +          break;
      +
      +        case "NetStream.Play.StreamNotFound":
      +          this.failed = true;
      +          writeDebug("NetConnection: Stream not found!");
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Stream not found!', event.info.level, event.info.code);
      +          break;
      + +
    • + + +
    • +
      + +
      + +
      +

      This is triggered when the sound loses the connection with the server. +In some cases one could just try to reconnect to the server and resume playback. +However for streams protected by expiring tokens, I don't think that will work.

      +

      Flash says that this is not an error code, but a status code... +should this call the onFailure handler?

      + +
      + +
              case "NetConnection.Connect.Closed":
      +          this.failed = true;
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection closed!', event.info.level, event.info.code);
      +          writeDebug("NetConnection: Connection closed!");
      +          break;
      + +
    • + + +
    • +
      + +
      + +
      +

      Couldn't establish a connection with the server. Attempts to connect to the server +can also fail if the permissible number of socket connections on either the client +or the server computer is at its limit. This also happens when the internet +connection is lost.

      + +
      + +
              case "NetConnection.Connect.Failed":
      +          this.failed = true;
      +          writeDebug("NetConnection: Connection failed! Lost internet connection? Try again... Description: " + event.info.description);
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code);
      +          break;
      + +
    • + + +
    • +
      + +
      + +
      +

      A change has occurred to the network status. This could mean that the network +connection is back, or it could mean that it has been lost...just try to resume +playback.

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      KJV: Can't use this yet because by the time you get your connection back the +song has reached it's maximum retries, so it doesn't retry again. We need +a new _ondisconnect handler. +case "NetConnection.Connect.NetworkChange": + this.failed = true; + writeDebug("NetConnection: Network connection status changed"); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Reconnecting...'); + break;

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      Consider everything else a failure...

      + +
      + +
              default:
      +          this.failed = true;
      +          writeDebug("NetConnection: got unhandled code '" + event.info.code + "'! Description: " + event.info.description);
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', event.info.level, event.info.code);
      +          break;
      +      }
      +
      +    }
      +
      +    public function writeDebug (s: String, logLevel: Number = 0) : Boolean {
      +      return this.sm.writeDebug (s,logLevel); // defined in main SM object
      +    }
      +
      +    public function onMetaData(infoObject: Object) : void {
      +      var prop:String;
      +      if (sm.debugEnabled) {
      +        var data:String = new String();
      +        for (prop in infoObject) {
      +          data += prop+': '+infoObject[prop]+' \n';
      +        }
      +        writeDebug('Metadata: '+data);
      +      }
      +      this.duration = infoObject.duration * 1000;
      +      if (!this.loaded) {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('not loaded yet: '+this.ns.bytesLoaded+', '+this.ns.bytesTotal+', '+infoObject.duration1000); +TODO: investigate loaded/total values +ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.ns.bytesLoaded, this.ns.bytesTotal, infoObject.duration1000);

      + +
      + +
              ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.bytesLoaded, this.bytesTotal, (this.duration || infoObject.duration))
      +      }
      +      var metaData:Array = [];
      +      var metaDataProps:Array = [];
      +      for (prop in infoObject) {
      +        metaData.push(prop);
      +        metaDataProps.push(infoObject[prop]);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      pass infoObject to _onmetadata, too

      + +
      + +
            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onmetadata", metaData, metaDataProps);
      + +
    • + + +
    • +
      + +
      + +
      +

      this handler may fire multiple times, eg., when a song changes while playing an RTMP stream.

      + +
      + +
            if (!this.serverUrl) {
      + +
    • + + +
    • +
      + +
      + +
      +

      disconnect for non-RTMP cases, since multiple firings may mess up duration.

      + +
      + +
              this.cc.onMetaData = function(infoObject: Object) : void {}
      +      }
      +    }
      +
      +    public function captionHandler(infoObject: Object) : void {
      +
      +      if (sm.debugEnabled) {
      +        var data:String = new String();
      +        for (var prop:* in infoObject) {
      +          data += prop+': '+infoObject[prop]+' \n';
      +        }
      +        writeDebug('Caption: '+data);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      null this out for the duration of this object's existence. +it may be called multiple times. +this.cc.setCaption = function(infoObject: Object) : void {}

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('Caption\n'+infoObject['dynamicMetadata']); +writeDebug('firing _oncaptiondata for '+this.sID);

      + +
      + +
      +      ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._oncaptiondata", infoObject['dynamicMetadata']);
      +
      +    }
      +
      +    public function getWaveformData() : void {
      + +
    • + + +
    • + + +
            SoundMixer.computeSpectrum(this.waveformData, false, 0); // sample wave data at 44.1 KHz
      +      this.waveformDataArray = [];
      +      for (var i: int = 0, j: int = this.waveformData.length / 4; i < j; i++) { // get all 512 values (256 per channel)
      +        this.waveformDataArray.push(int(this.waveformData.readFloat() * 1000) / 1000);
      +      }
      +    }
      +
      +    public function getEQData() : void {
      + +
    • + + +
    • + + +
            SoundMixer.computeSpectrum(this.eqData, true, 0); // sample EQ data at 44.1 KHz
      +      this.eqDataArray = [];
      +      for (var i: int = 0, j: int = this.eqData.length / 4; i < j; i++) { // get all 512 values (256 per channel)
      +        this.eqDataArray.push(int(this.eqData.readFloat() * 1000) / 1000);
      +      }
      +    }
      +
      +    public function start(nMsecOffset: int, nLoops: int, allowMultiShot:Boolean) : Boolean {
      +
      +      this.useEvents = true;
      +
      +      if (this.useNetstream) {
      +
      +        writeDebug("SMSound::start nMsecOffset "+ nMsecOffset+ ' nLoops '+nLoops + ' current bufferTime '+this.ns.bufferTime+' current bufferLength '+this.ns.bufferLength+ ' this.lastValues.position '+this.lastValues.position);
      + +
    • + + +
    • +
      + +
      + +
      +

      mark for later Netstream.Play.Stop / sound completion

      + +
      + +
              this.finished = false;
      +
      +        this.cc.onMetaData = this.onMetaData;
      + +
    • + + +
    • +
      + +
      + +
      +

      Don't seek if we don't have to because it destroys the buffer

      + +
      + +
              var set_position:Boolean = this.lastValues.position != null && this.lastValues.position != nMsecOffset;
      +
      +        if (set_position) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Minimize the buffer so playback starts ASAP

      + +
      + +
                this.ns.bufferTime = this.bufferTime;
      +        }
      +
      +        if (this.paused) {
      +          writeDebug('start: resuming from paused state');
      +          this.ns.resume(); // get the sound going again
      +          if (!this.didLoad) {
      +            this.didLoad = true;
      +          }
      +          this.paused = false;
      +        } else if (!this.didLoad) {
      +          writeDebug('start: !didLoad - playing '+this.sURL);
      +          this.ns.play(this.sURL);
      +          this.pauseOnBufferFull = false; // SAS: playing behaviour overrides buffering behaviour
      +          this.didLoad = true;
      +          this.paused = false;
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      previously loaded, perhaps stopped/finished. play again?

      + +
      + +
                writeDebug('playing again (not paused, didLoad = true)');
      +          this.pauseOnBufferFull = false;
      +          this.ns.play(this.sURL);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      KJV seek after calling play otherwise some streams get a NetStream.Seek.Failed +Should only apply to the !didLoad case, but do it for all for simplicity. +nMsecOffset is in milliseconds for streams but in seconds for progressive +download.

      + +
      + +
              if (set_position) {
      +          this.ns.seek(this.serverUrl ? nMsecOffset / 1000 : nMsecOffset);
      +          this.lastValues.position = nMsecOffset; // https://gist.github.com/1de8a3113cf33d0cff67
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      this.ns.addEventListener(Event.SOUND_COMPLETE, _onfinish);

      + +
      + +
              this.applyTransform();
      +
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('start: seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops'));

      + +
      + +
              if (!this.soundChannel || allowMultiShot) {
      +          this.soundChannel = this.play(nMsecOffset, nLoops);
      +          this.addEventListener(Event.SOUND_COMPLETE, _onfinish);
      +          this.applyTransform();
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('start: was already playing, no-multishot case. Seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); +already playing and no multi-shot allowed, so re-start and set position

      + +
      + +
                if (this.soundChannel) {
      +            this.soundChannel.stop();
      +          }
      +          this.soundChannel = this.play(nMsecOffset, nLoops); // start playing at new position
      +          this.addEventListener(Event.SOUND_COMPLETE, _onfinish);
      +          this.applyTransform();
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      if soundChannel is null (and not a netStream), there is no sound card (or 32-channel ceiling has been hit.) +http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29

      + +
      + +
            return (!this.useNetstream && this.soundChannel === null ? false : true);
      +
      +    }
      +
      +    private function _onfinish() : void {
      +      this.removeEventListener(Event.SOUND_COMPLETE, _onfinish);
      +    }
      +
      +    public function loadSound(sURL: String) : void {
      +      if (this.useNetstream) {
      +        this.useEvents = true;
      +        if (this.didLoad != true) {
      +          this.ns.play(this.sURL); // load streams by playing them
      +          if (!this.autoPlay) {
      +            this.pauseOnBufferFull = true;
      +          }
      +          this.paused = false;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      this.addEventListener(Event.SOUND_COMPLETE, _onfinish);

      + +
      + +
              this.applyTransform();
      +      } else {
      +        try {
      +          this.didLoad = true;
      +          this.urlRequest = new URLRequest(sURL);
      +          this.soundLoaderContext = new SoundLoaderContext(1000, this.checkPolicyFile); // check for policy (crossdomain.xml) file on remote domains - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundLoaderContext.html
      +          this.load(this.urlRequest, this.soundLoaderContext);
      +        } catch(e: Error) {
      +          writeDebug('error during loadSound(): ' + e.toString());
      +        }
      +      }
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      Set the value of autoPlay

      + +
      + +
          public function setAutoPlay(autoPlay: Boolean) : void {
      +      if (!this.serverUrl) {
      +        this.autoPlay = autoPlay;
      +      } else {
      +        this.autoPlay = autoPlay;
      +        if (this.autoPlay) {
      +          this.pauseOnBufferFull = false;
      +        } else if (!this.autoPlay) {
      +          this.pauseOnBufferFull = true;
      +        }
      +      }
      +    }
      +
      +    public function setVolume(nVolume: Number) : void {
      +      this.lastValues.volume = nVolume / 100;
      +      this.applyTransform();
      +    }
      +
      +    public function setPan(nPan: Number) : void {
      +      this.lastValues.pan = nPan / 100;
      +      this.applyTransform();
      +    }
      +
      +    public function applyTransform() : void {
      +      var st: SoundTransform = new SoundTransform(this.lastValues.volume, this.lastValues.pan);
      +      if (this.useNetstream) {
      +        if (this.ns) {
      +          this.ns.soundTransform = st;
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('applyTransform(): Note: No active netStream');

      + +
      + +
              }
      +      } else if (this.soundChannel) {
      +        this.soundChannel.soundTransform = st; // new SoundTransform(this.lastValues.volume, this.lastValues.pan);
      +      }
      +    }
      + +
    • + + +
    • + + +
          public function onBWDone() : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      writeDebug('onBWDone: called and ignored');

      + +
      + +
          }
      + +
    • + + +
    • +
      + +
      + +
      +

      NetStream client callback. Invoked when the song is complete.

      + +
      + +
          public function onPlayStatus(info:Object):void {
      +      writeDebug('onPlayStatus called with '+info);
      +      switch(info.code) {
      +        case "NetStream.Play.Complete":
      +          writeDebug('Song has finished!');
      +          break;
      +      }
      +    }
      +
      +    public function doIOError(e: IOErrorEvent) : void {
      +      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", 0); // call onload, assume it failed.
      + +
    • + + +
    • +
      + +
      + +
      +

      there was a connection drop, a loss of internet connection, or something else wrong. 404 error too.

      + +
      + +
          }
      +
      +    public function doAsyncError(e: AsyncErrorEvent) : void {
      +      writeDebug('asyncError: ' + e.text);
      +    }
      +
      +    public function doNetStatus(e: NetStatusEvent) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      Handle failures

      + +
      + +
            if (e.info.code == "NetStream.Failed"
      +          || e.info.code == "NetStream.Play.FileStructureInvalid"
      +          || e.info.code == "NetStream.Play.StreamNotFound") {
      +
      +        this.lastNetStatus = e.info.code;
      +        writeDebug('netStatusEvent: ' + e.info.code);
      +        this.failed = true;
      +        ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', e.info.level, e.info.code);
      +        return;
      +      }
      +
      +      writeDebug('netStatusEvent: ' + e.info.code);  // KJV we like to see all events
      + +
    • + + +
    • +
      + +
      + +
      +

      When streaming, Stop is called when buffering stops, not when the stream is actually finished. +@see http://www.actionscript.org/forums/archive/index.php3/t-159194.html

      + +
      + +
            if (e.info.code == "NetStream.Play.Stop") {
      +
      +        if (!this.finished && (!this.useNetstream || !this.serverUrl)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      finished playing, and not RTMP

      + +
      + +
                writeDebug('calling onfinish for a sound');
      + +
    • + + +
    • +
      + +
      + +
      +

      reset the sound? Move back to position 0?

      + +
      + +
                this.sm.checkProgress();
      +          this.finished = true; // will be reset via JS callback
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish");
      +
      +        }
      +
      +      } else if (e.info.code == "NetStream.Play.Start" || e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Buffer.Full") {
      + +
    • + + +
    • +
      + +
      + +
      +

      RTMP case.. +We wait for the buffer to fill up before pausing the just-loaded song because only if the +buffer is full will the song continue to buffer until the user hits play.

      + +
      + +
              if (this.serverUrl && e.info.code == "NetStream.Buffer.Full" && this.pauseOnBufferFull) {
      +          this.ns.pause();
      +          this.paused = true;
      +          this.pauseOnBufferFull = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      Call pause in JS. This will call back to us to pause again, but +that should be harmless.

      + +
      + +
                writeDebug('Pausing on buffer full');
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "'].pause", false);
      +        }
      +
      +        var isNetstreamBuffering: Boolean = (e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Play.Start");
      + +
    • + + +
    • +
      + +
      + +
      +

      assume buffering when we start playing, eg. initial load.

      + +
      + +
              if (isNetstreamBuffering != this.lastValues.isBuffering) {
      +          this.lastValues.isBuffering = isNetstreamBuffering;
      +          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onbufferchange", this.lastValues.isBuffering ? 1 : 0);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      We can detect the end of the stream when Play.Stop is called followed by Buffer.Empty. +However, if you pause and let the whole song buffer, Buffer.Flush is called followed by +Buffer.Empty, so handle that case too.

      +

      Ignore this event if we are more than 3 seconds from the end of the song.

      + +
      + +
              if (e.info.code == "NetStream.Buffer.Empty" && (this.lastNetStatus == 'NetStream.Play.Stop' || this.lastNetStatus == 'NetStream.Buffer.Flush')) {
      +          if (this.duration && (this.ns.time * 1000) < (this.duration - 3000)) {
      +            writeDebug('Ignoring Buffer.Empty because this is too early to be the end of the stream! (sID: '+this.sID+', time: '+(this.ns.time*1000)+', duration: '+this.duration+')');
      +          } else if (!this.finished) {
      +            this.finished = true;
      +            writeDebug('calling onfinish for sound '+this.sID);
      +            this.sm.checkProgress();
      +            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish");
      +          }
      +
      +        } else if (e.info.code == "NetStream.Buffer.Empty") {
      + +
    • + + +
    • +
      + +
      + +
      +

      The buffer is empty. Start from the smallest buffer again.

      + +
      + +
                this.ns.bufferTime = this.bufferTime;
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      Remember the last NetStatus event

      + +
      + +
            this.lastNetStatus = e.info.code;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      KJV The sound adds some of its own netstatus handlers so we don't need to do it here.

      + +
      + +
          public function addNetstreamEvents() : void {
      +      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError);
      +      ns.addEventListener(NetStatusEvent.NET_STATUS, doNetStatus);
      +      ns.addEventListener(IOErrorEvent.IO_ERROR, doIOError);
      +    }
      +
      +    public function removeNetstreamEvents() : void {
      +      ns.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError);
      +      ns.removeEventListener(NetStatusEvent.NET_STATUS, doNetStatus);
      +      ns.addEventListener(NetStatusEvent.NET_STATUS, dummyNetStatusHandler);
      +      ns.removeEventListener(IOErrorEvent.IO_ERROR, doIOError);
      + +
    • + + +
    • +
      + +
      + +
      +

      KJV Stop listening for NetConnection events on the sound

      + +
      + +
            nc.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      Prevents possible 'Unhandled NetStatusEvent' condition if a sound is being +destroyed and interacted with at the same time.

      + +
      + +
          public function dummyNetStatusHandler(e: NetStatusEvent) : void {
      + +
    • + + +
    • +
      + +
      + +
      +

      Don't do anything

      + +
      + +
          }
      +  }
      +}
      + +
    • + +
    +
    + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css new file mode 100755 index 00000000..97efe8f2 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css @@ -0,0 +1,508 @@ +/*--------------------- Typography ----------------------------*/ + +@font-face { + font-family: 'aller-light'; + src: url('public/fonts/aller-light.eot'); + src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'), + url('public/fonts/aller-light.woff') format('woff'), + url('public/fonts/aller-light.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'aller-bold'; + src: url('public/fonts/aller-bold.eot'); + src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'), + url('public/fonts/aller-bold.woff') format('woff'), + url('public/fonts/aller-bold.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'novecento-bold'; + src: url('public/fonts/novecento-bold.eot'); + src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'), + url('public/fonts/novecento-bold.woff') format('woff'), + url('public/fonts/novecento-bold.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +/*--------------------- Layout ----------------------------*/ +html { height: 100%; } +body { + font-family: "aller-light"; + font-size: 14px; + line-height: 18px; + color: #30404f; + margin: 0; padding: 0; + height:100%; +} +#container { min-height: 100%; } + +a { + color: #000; +} + +b, strong { + font-weight: normal; + font-family: "aller-bold"; +} + +p { + margin: 15px 0 0px; +} + .annotation ul, .annotation ol { + margin: 25px 0; + } + .annotation ul li, .annotation ol li { + font-size: 14px; + line-height: 18px; + margin: 10px 0; + } + +h1, h2, h3, h4, h5, h6 { + color: #112233; + line-height: 1em; + font-weight: normal; + font-family: "novecento-bold"; + text-transform: uppercase; + margin: 30px 0 15px 0; +} + +h1 { + margin-top: 40px; +} + +hr { + border: 0; + background: 1px solid #ddd; + height: 1px; + margin: 20px 0; +} + +pre, tt, code { + font-size: 12px; line-height: 16px; + font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; + margin: 0; padding: 0; +} + .annotation pre { + display: block; + margin: 0; + padding: 7px 10px; + background: #fcfcfc; + -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); + -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); + box-shadow: inset 0 0 10px rgba(0,0,0,0.1); + overflow-x: auto; + } + .annotation pre code { + border: 0; + padding: 0; + background: transparent; + } + + +blockquote { + border-left: 5px solid #ccc; + margin: 0; + padding: 1px 0 1px 1em; +} + .sections blockquote p { + font-family: Menlo, Consolas, Monaco, monospace; + font-size: 12px; line-height: 16px; + color: #999; + margin: 10px 0 0; + white-space: pre-wrap; + } + +ul.sections { + list-style: none; + padding:0 0 5px 0;; + margin:0; +} + +/* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + + More Info : http://www.quirksmode.org/css/box.html +*/ +ul.sections > li > div { + -moz-box-sizing: border-box; /* firefox */ + -ms-box-sizing: border-box; /* ie */ + -webkit-box-sizing: border-box; /* webkit */ + -khtml-box-sizing: border-box; /* konqueror */ + box-sizing: border-box; /* css3 */ +} + + +/*---------------------- Jump Page -----------------------------*/ +#jump_to, #jump_page { + margin: 0; + background: white; + -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; + -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; + font: 16px Arial; + cursor: pointer; + text-align: right; + list-style: none; +} + +#jump_to a { + text-decoration: none; +} + +#jump_to a.large { + display: none; +} +#jump_to a.small { + font-size: 22px; + font-weight: bold; + color: #676767; +} + +#jump_to, #jump_wrapper { + position: fixed; + right: 0; top: 0; + padding: 10px 15px; + margin:0; +} + +#jump_wrapper { + display: none; + padding:0; +} + +#jump_to:hover #jump_wrapper { + display: block; +} + +#jump_page { + padding: 5px 0 3px; + margin: 0 0 25px 25px; +} + +#jump_page .source { + display: block; + padding: 15px; + text-decoration: none; + border-top: 1px solid #eee; +} + +#jump_page .source:hover { + background: #F9FCFF; +} + +#jump_page .source:first-child { +} + +/*---------------------- Low resolutions (> 320px) ---------------------*/ +@media only screen and (min-width: 320px) { + .pilwrap { display: none; } + + ul.sections > li > div { + display: block; + padding:5px 10px 0 10px; + } + + ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { + padding-left: 30px; + } + + ul.sections > li > div.content { + background: #F9FCFF; + overflow-x:auto; + -webkit-box-shadow: inset 0 0 5px #e5e5ee; + box-shadow: inset 0 0 5px #e5e5ee; + border: 1px solid #dedede; + margin:5px 10px 5px 10px; + padding-bottom: 5px; + } + + ul.sections > li > div.annotation pre { + margin: 7px 0 7px; + padding-left: 15px; + } + + ul.sections > li > div.annotation p tt, .annotation code { + background: #f8f8ff; + border: 1px solid #dedede; + font-size: 12px; + padding: 0 0.2em; + } +} + +/*---------------------- (> 481px) ---------------------*/ +@media only screen and (min-width: 481px) { + #container { + position: relative; + } + body { + background-color: #F9FCFF; + font-size: 15px; + line-height: 21px; + } + pre, tt, code { + line-height: 18px; + } + p, ul, ol { + margin: 0 0 15px; + } + + + #jump_to { + padding: 5px 10px; + } + #jump_wrapper { + padding: 0; + } + #jump_to, #jump_page { + font: 10px Arial; + text-transform: uppercase; + } + #jump_page .source { + padding: 5px 10px; + } + #jump_to a.large { + display: inline-block; + } + #jump_to a.small { + display: none; + } + + + + #background { + position: absolute; + top: 0; bottom: 0; + width: 350px; + background: #fff; + border-right: 1px solid #e5e5ee; + z-index: -1; + } + + ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { + padding-left: 40px; + } + + ul.sections > li { + white-space: nowrap; + } + + ul.sections > li > div { + display: inline-block; + } + + ul.sections > li > div.annotation { + max-width: 350px; + min-width: 350px; + min-height: 5px; + padding: 13px; + overflow-x: hidden; + white-space: normal; + vertical-align: top; + text-align: left; + } + ul.sections > li > div.annotation pre { + margin: 15px 0 15px; + padding-left: 15px; + } + + ul.sections > li > div.content { + padding: 13px; + vertical-align: top; + background: #F9FCFF; + border: none; + -webkit-box-shadow: none; + box-shadow: none; + } + + .pilwrap { + position: relative; + display: inline; + } + + .pilcrow { + font: 12px Arial; + text-decoration: none; + color: #454545; + position: absolute; + top: 3px; left: -20px; + padding: 1px 2px; + opacity: 0; + -webkit-transition: opacity 0.2s linear; + } + .for-h1 .pilcrow { + top: 47px; + } + .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { + top: 35px; + } + + ul.sections > li > div.annotation:hover .pilcrow { + opacity: 1; + } +} + +/*---------------------- (> 1025px) ---------------------*/ +@media only screen and (min-width: 1025px) { + + body { + font-size: 16px; + line-height: 24px; + } + + #background { + width: 525px; + } + ul.sections > li > div.annotation { + max-width: 525px; + min-width: 525px; + padding: 10px 25px 1px 50px; + } + ul.sections > li > div.content { + padding: 9px 15px 16px 25px; + } +} + +/*---------------------- Syntax Highlighting -----------------------------*/ + +td.linenos { background-color: #f0f0f0; padding-right: 10px; } +span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } +/* + +github.com style (c) Vasily Polovnyov + +*/ + +pre code { + display: block; padding: 0.5em; + color: #000; + background: #f8f8ff +} + +pre .comment, +pre .template_comment, +pre .diff .header, +pre .javadoc { + color: #408080; + font-style: italic +} + +pre .keyword, +pre .assignment, +pre .literal, +pre .css .rule .keyword, +pre .winutils, +pre .javascript .title, +pre .lisp .title, +pre .subst { + color: #954121; + /*font-weight: bold*/ +} + +pre .number, +pre .hexcolor { + color: #40a070 +} + +pre .string, +pre .tag .value, +pre .phpdoc, +pre .tex .formula { + color: #219161; +} + +pre .title, +pre .id { + color: #19469D; +} +pre .params { + color: #00F; +} + +pre .javascript .title, +pre .lisp .title, +pre .subst { + font-weight: normal +} + +pre .class .title, +pre .haskell .label, +pre .tex .command { + color: #458; + font-weight: bold +} + +pre .tag, +pre .tag .title, +pre .rules .property, +pre .django .tag .keyword { + color: #000080; + font-weight: normal +} + +pre .attribute, +pre .variable, +pre .instancevar, +pre .lisp .body { + color: #008080 +} + +pre .regexp { + color: #B68 +} + +pre .class { + color: #458; + font-weight: bold +} + +pre .symbol, +pre .ruby .symbol .string, +pre .ruby .symbol .keyword, +pre .ruby .symbol .keymethods, +pre .lisp .keyword, +pre .tex .special, +pre .input_number { + color: #990073 +} + +pre .builtin, +pre .constructor, +pre .built_in, +pre .lisp .title { + color: #0086b3 +} + +pre .preprocessor, +pre .pi, +pre .doctype, +pre .shebang, +pre .cdata { + color: #999; + font-weight: bold +} + +pre .deletion { + background: #fdd +} + +pre .addition { + background: #dfd +} + +pre .diff .change { + background: #0086b3 +} + +pre .chunk { + color: #aaa +} + +pre .tex .formula { + opacity: 0.5; +} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot new file mode 100755 index 0000000000000000000000000000000000000000..1b32532a8e40e483069482c3650c3ef22ef16bdd GIT binary patch literal 29804 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 F>VRGqwvGS* literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..dc4cc9c27a59ab14fbb7444c6ab35c5b33a034f6 GIT binary patch literal 66836 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%0AAIIsziQtyhPht7#*LdNqb{-ye3^( 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ⅆA*wV|2E?UgaO-298Xthc^!eoT=hLnT61q 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff new file mode 100755 index 0000000000000000000000000000000000000000..fa16fd0aba81582de121d833c7bc50e8f1b1b981 GIT binary patch literal 33244 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 q6yXA@F-u0Z~1!1poleYR}~W literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot new file mode 100755 index 0000000000000000000000000000000000000000..40bd654b5fe63501ae64d5673b5aa45051a69e65 GIT binary patch literal 29509 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�y6>nTFX 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot new file mode 100755 index 0000000000000000000000000000000000000000..98a9a7fbabb1083aca5143bc306e228886ff2eeb GIT binary patch literal 18190 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 F001ed(;ol; literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css new file mode 100755 index 00000000..73abb76f --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css @@ -0,0 +1,375 @@ +/*! normalize.css v2.0.1 | MIT License | git.io/normalize */ + +/* ========================================================================== + HTML5 display definitions + ========================================================================== */ + +/* + * Corrects `block` display not defined in IE 8/9. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section, +summary { + display: block; +} + +/* + * Corrects `inline-block` display not defined in IE 8/9. + */ + +audio, +canvas, +video { + display: inline-block; +} + +/* + * Prevents modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/* + * Addresses styling for `hidden` attribute not present in IE 8/9. + */ + +[hidden] { + display: none; +} + +/* ========================================================================== + Base + ========================================================================== */ + +/* + * 1. Sets default font family to sans-serif. + * 2. Prevents iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/* + * Removes default margin. + */ + +body { + margin: 0; +} + +/* ========================================================================== + Links + ========================================================================== */ + +/* + * Addresses `outline` inconsistency between Chrome and other browsers. + */ + +a:focus { + outline: thin dotted; +} + +/* + * Improves readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* ========================================================================== + Typography + ========================================================================== */ + +/* + * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, + * Safari 5, and Chrome. + */ + +h1 { + font-size: 2em; +} + +/* + * Addresses styling not present in IE 8/9, Safari 5, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/* + * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/* + * Addresses styling not present in Safari 5 and Chrome. + */ + +dfn { + font-style: italic; +} + +/* + * Addresses styling not present in IE 8/9. + */ + +mark { + background: #ff0; + color: #000; +} + + +/* + * Corrects font family set oddly in Safari 5 and Chrome. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, serif; + font-size: 1em; +} + +/* + * Improves readability of pre-formatted text in all browsers. + */ + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +/* + * Sets consistent quote types. + */ + +q { + quotes: "\201C" "\201D" "\2018" "\2019"; +} + +/* + * Addresses inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* ========================================================================== + Embedded content + ========================================================================== */ + +/* + * Removes border when inside `a` element in IE 8/9. + */ + +img { + border: 0; +} + +/* + * Corrects overflow displayed oddly in IE 9. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* ========================================================================== + Figures + ========================================================================== */ + +/* + * Addresses margin not present in IE 8/9 and Safari 5. + */ + +figure { + margin: 0; +} + +/* ========================================================================== + Forms + ========================================================================== */ + +/* + * Define consistent border, margin, and padding. + */ + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +/* + * 1. Corrects color not being inherited in IE 8/9. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + border: 0; /* 1 */ + padding: 0; /* 2 */ +} + +/* + * 1. Corrects font family not being inherited in all browsers. + * 2. Corrects font size not being inherited in all browsers. + * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome + */ + +button, +input, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 2 */ + margin: 0; /* 3 */ +} + +/* + * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +button, +input { + line-height: normal; +} + +/* + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Corrects inability to style clickable `input` types in iOS. + * 3. Improves usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/* + * Re-set default cursor for disabled elements. + */ + +button[disabled], +input[disabled] { + cursor: default; +} + +/* + * 1. Addresses box sizing set to `content-box` in IE 8/9. + * 2. Removes excess padding in IE 8/9. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/* + * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. + * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-appearance: textfield; /* 1 */ + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; /* 2 */ + box-sizing: content-box; +} + +/* + * Removes inner padding and search cancel button in Safari 5 and Chrome + * on OS X. + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* + * Removes inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +/* + * 1. Removes default vertical scrollbar in IE 8/9. + * 2. Improves readability and alignment in all browsers. + */ + +textarea { + overflow: auto; /* 1 */ + vertical-align: top; /* 2 */ +} + +/* ========================================================================== + Tables + ========================================================================== */ + +/* + * Remove most spacing between table cells. + */ + +table { + border-collapse: collapse; + border-spacing: 0; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html new file mode 100755 index 00000000..12064399 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html @@ -0,0 +1,11613 @@ + + + + + soundmanager2.js + + + + + + +

    + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html new file mode 100755 index 00000000..10f022ac --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html @@ -0,0 +1,563 @@ + + + +SoundManager 2 Tutorial: Getting Started + + + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    +
    +

    How SoundManager Works

    +

    It starts out easy, but you can go down the rabbit hole if you want.

    +
    + +
    + +
    + + + +

    SoundManager 2 Tutorial: What, Why, How

    + +

    Problem: Browsers lack good, consistent native audio support. (HTML 5's Audio() is the future, but is still in development.)

    +

    Solution: Javascript API using HTML5 Audio() + headless Flash via ExternalInterface, works almost everywhere. If HTML5 is supported but "non-free" MP3/MP4 formats are not, flash can be used as a fallback.

    +

    SoundManager 2 wraps and extends both the HTML Audio and Flash Audio APIs, providing a single, unified sound API to Javascript; the API is consistent regardless of the technology working under the hood to play sound. (The flash portion is hidden, transparent to both developers and end users.)

    + +
    + +
    + + +

    Including SoundManager 2

    + +

    The soundmanager2.js core can get down to 11 KB over the wire, depending on what version you use. A few versions of the SM2 script are available, balancing code size between commented, debug-enabled and production-optimized builds.

    +

    Regardless of which build you use, take advantage of gzip compression on your server for big savings. As shown below, SoundManager 2 compresses quite well with gzip; the full debug-enabled version served with gzip is smaller than even the minified, no-debug version served without.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Build versionRecommended useFile size+ gzip
    +

    Original, formatted debug-enabled version with comments. Passes jslint.

    +
    <script src="soundmanager2.js"></script>
    +
    Development, testing, debugging153 KB41 KB
    +

    "No-debug", formatted (comments removed, whitespace retained) version

    +
    <script src="soundmanager2-nodebug.js"></script>
    +
    Production, "clean" no-debug code78 KB17 KB
    +

    Minified (Google Closure Compiler-munged, no comments or whitespace), debug-enabled version

    +
    <script src="soundmanager2-jsmin.js"></script>
    +
    Production, with debug code47 KB16 KB
    +

    Build-script optimized, minified, no-debug version

    +
    <script src="soundmanager2-nodebug-jsmin.js"></script>
    +
    Production-optimized, debug code removed34 KB11 KB!
    + +

    You then need to tell SM2 where to find the flash .SWF it will need (depending on HTML5 support), and optionally what version of Flash (~2.8 KB for flash 8, and ~8.5 KB for flash 9) depending on what API features you want:

    + +
    <script>
    +soundManager.setup({
    +  url: '/path/to/swf-files/',
    +  flashVersion: 9, // optional: shiny features (default = 8)
    +  // optional: ignore Flash where possible, use 100% HTML5 mode
    +  // preferFlash: false,
    +  onready: function() {
    +    // Ready to use; soundManager.createSound() etc. can now be called.
    +  }
    +});
    +</script>
    + +

    If you plan to eventually use the flash block handling feature (disabled in this example), you'll want to look at the flash block demo and include the relevant CSS it uses.

    + + + +

    Basic SoundManager Template

    + +

    For a live example of a page including SoundManager 2, check the bare-bones template.

    + +

    SoundManager File Structure

    +

    Or, "What you get when you download SM2."

    +

    The core audio API bits require script/soundmanager2.js and the SWF files swf/soundmanager2.swf and swf/soundmanager2_flash9.swf, as well as the _debug versions of the SWFs. The flash 9 SWF enables some extra API features, and is only used if you set soundManager.flashVersion = 9 (the default is 8.)

    + +
      +
    • + soundmanager2/ +
        +
      • + demo/ - Examples, MP3 player UIs etc. +
      • +
      • + doc/ - API method documentation, notes, troubleshooting +
      • +
      • + script/ - API core, soundmanager2.js +
      • +
      • + src/ - AS2/AS3 Flash source used to build SWFs (for flash development) +
      • +
      • + swf/ - API core, SoundManager 2 .SWF files +
      • +
      • + troubleshoot/ - Tool for finding/fixing startup issues +
      • +
      +
    • +
    + +

    How SoundManager 2 Really Works

    + +

    SoundManager 2 is the result of Javascript talking to a hidden Flash movie. The Flash layer is not something you have to work with directly, but it is the component which makes audio control possible behind the scenes.

    + +
    + +
    + soundmanager2.js <- Flash + ExternalInterface, and/or HTML5 Audio() -> <- HTTP -> audio file +
    + +
    + +

    Flash can expose methods to Javascript via ExternalInterface, allowing bi-directional calls to be made and thus providing additional functionality to Javascript.

    + +

    For the real gory details on the behind-the-scenes action of JS + Flash, see How SoundManager 2 Works on schillmania.com.

    + + +
    + +
    + +

    Startup / Initialization

    + +

    In brief, here is now SM2 starts up:

    +
      +
    • soundmanager2.js loads
    • +
    • new SoundManager() constructor call, event listeners attached for dom ready/init
    • +
    • document.createElement('embed') (or 'object' for IE), append Flash .SWF to document
    • +
    • SWF loads, Flash makes call to JS function: "Hi, JS!"
    • +
    • JS -> Flash test (JS calls Flash function): "Hello, Flash!"
    • +
    • -- startup is complete, soundManager.onready() fires --
    • +
    + +

    A single Javascript include will link in all of the required code for the library, which will automatically begin loading either at onDOMContentLoaded() if supported, or alternately, after window.onload() (eg., IE 6 and others.) The default behaviour is to start "as soon as possible", but the library can be configured to wait for window.onload() in all cases as well. Loading and initialisation are separate events.

    + +

    Once initialised, SM2 will call event handlers/listeners registered via soundManager.onready(). There are also "old-skool" onload()/onerror() event handlers which you can define just as you would with window.onload().

    + +

    If you want to lazy-load or defer SM2, see Lazy-loading and SM2_DEFER.

    + +

    SoundManager onready() / ontimeout() Event Handlers

    + +

    onready() is a flexible method that can be used to queue numerous listeners for SM2's successful start-up. Simply pass a callback function, which will be called when SM2 has successfully started:

    + +
    soundManager.onready(function() {
    +    // SM2 is ready to go!
    +    makeSomeNoise(); // soundManager.createSound(), etc.
    +});
    + +

    ontimeout() is used to add listeners for SM2 init failures, which can happen due to missing or blocked Flash support. They are not necessarily fatal as in the flash block case, where onready() calls can follow ontimeout() if the user unblocks flash after a failed init attempt.

    + +
    soundManager.ontimeout(function() {
    +    // SM2 could not start. Flash blocked, missing or security error? Complain, etc.?
    +});
    + +

    Lazy-loading / Dynamically-loading SM2 on-the-fly

    + +

    Let's say you wanted to load and start SM2 after your page has loaded, using JavaScript to insert a script node etc., or otherwise only start SM2 conditionally. You can load the library dynamically (at or after DOMContentReady), and it will not attempt to init until you call setup() with a url parameter.

    +

    Example:

    + +
    function loadSM2() {
    +  // -- load soundmanager2.js via <script>, createElement('script') or XHR etc. --
    +  // imaginary loadJS() function with callback ...
    +  loadJS('/path/to/soundmanager2.js', function() {
    +    // once soundmanager2.js has loaded, call soundManager.setup().
    +    soundManager.setup({
    +      url: '/path/to/swfs/',
    +      onready: function() {
    +        // soundManager.createSound() etc. here
    +      }
    +    });
    +  });
    +}
    + +

    For a live demo, check out the deferred loading example.

    + +
    + + +
    + +
    + +
    + +
    +

    Sound Options Object Format

    +

    Object Literal, JSON-style data passed to createSound() and play()

    +
    + +
    + +
    + +

    Object Literal Format

    + +

    Sounds can be created with instance-specific parameters in an object literal (JSON-style) format, where omitted parameters inherit default values as defined in soundManager.

    + +
    soundManager.createSound({
    +  id: 'mySound',
    +  url: '/path/to/some.mp3',
    +  autoLoad: true,
    +  autoPlay: false,
    +  onload: function() {
    +    alert('The sound '+this.id+' loaded!');
    +  },
    +  volume: 50
    +});
    + +

    This object can also be passed as an optional argument to the play method, overriding options set at creation time.

    + +

    For a full list of available options, see Sound Properties Object

    + +
    + + +
    + +
    + +
    +
    +

    "Use Responsibly"

    +

    Only you can prevent audio pollution?

    +
    + +
    + +
    + +

    A Word Of Vice

    +

    Not every button, link, element or paragraph on the web needs to zoom, move, change colour and be noisy, repetitive and annoying all at the same time. Use your own discretion!

    +

    Sites which automatically start playing background sound, and/or don't have volume or mute controls are the kind of things you should avoid building. As a developer, gentle reader, you may eventually find yourself in such a situation. Please do your part in enhancing the web with sound if you use SM2, while at the same time keeping it audibly usable. :)

    + +
    + +
    + +
    + +
    + +
    +

    Troubleshooting

    +

    Console-style messaging, useful for troubleshooting start-up and runtime issues.

    +
    + +
    + +

    SoundManager 2 Start-up and Debug Tools

    +

    This troubleshooting tool can come in handy for debugging SM2 start-up problems, when Flash support is required.

    + +

    Flash options: Flash 8 (default), Flash 9 (normal) or Flash 9 + highPerformance + fastPolling modes.

    + +
    +
      + +
    • +

      OKFAILN/AUnknownSoundManager 2 start-up

      +
      +

      soundManager onready() or ontimeout() events are ultimately called when start-up completes.

      +

      If you're seeing a failure, refer to the below for troubleshooting details for common causes.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash

      +
      +

      Flash 8 or 9 may be required for SoundManager 2 to start, depending on HTML5 support. You are currently using [unknown].

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash SWF

      +
      +

      SoundManager 2 must load a flash movie before initialisation can proceed. If you have errors here, check that soundManager.url is correctly defined and that the URL being loaded is correct.

      +

      If the Flash movie URL is OK, Flash security or flash blockers are the likely cause. Check the section below.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash -> JS

      +
      +

      Once the flash component of SM2 has loaded, it tries to make a call to Javascript-land. This is a common point of failure, for security reasons.

      +
        +
      • +

        Have a flash blocker? Check that the SM2 flash movie (below) is loading and is not being blocked.

        +
      • +
      • + First time opening SM2 after downloading it? Is your browser URL at file:// or c:/path/ or otherwise not using HTTP? Flash security "whitelisting" is required to allow Flash + JS to work when offline, placing it in the "LocalTrusted" Flash security sandbox rather than "localWithFile". + +
        +

        Offline viewing: Adding a "trusted location" to the Flash Security Settings Panel

        +

        The Flash Player Global Security Settings Panel is a web-based control panel which allows you to configure Flash security. You will need to add the path of the SoundManager 2 project in order for it to work "offline" (ie., when viewing via file:// or c:/)

        +

        Show me how: Adding a "trusted location"

        + +

        Launch the Flash Security Settings Panel

        +
        + +
      • +
      • Flash blockers (FlashBlock, "click to flash" etc.) preventing flash load and start-up - need whitelisting/"allow this domain" to work smoothly. If you suspect blocking is the issue, try the SoundManager 2 Flashblock demo.
      • +
      • Online viewing (HTTP/S): Same-domain security rules apply to HTML + Flash content by default (crossdomain.xml/allowDomain() in .AS source required to override.)
      • +
      +

      See Flash debug output for more security error details.

      + +
      +

      Online viewing: Cross-domain security restrictions

      +

      HTML page on domain A loading .SWF from domain B: Flash security prevents JS + Flash when a cross-domain XML permission file is not available on domain B, and/or flash movie was not compiled with allowDomain('domainA') or allowDomain('*') - note that the SWF distributed with SM2 does not use this by default; try using the cross-domain version of the SWF, or compile your own which whitelists your own domain(s).

      + +

      Flash Blockers

      +

      Browser extensions/add-ons like "FlashBlock" and "click to flash" can prevent the .SWF from loading, and this will mean SM2 will time-out and fail waiting for a response from Flash. For development, it's best to whitelist the domain(s) or the .SWF for SM2 to allow it to work.

      +

      Have a flash blocker installed? Want to test it? Try the SoundManager 2 Flashblock demo.

      + +
      + +
      +
    • + +
    • +

      OKErrorN/AUnknownJS -> Flash

      +
      +

      At this point, Javascript attempts to respond to Flash's initial outgoing Flash -> JS call, completing the test for JS/flash communication. If SM2 does not receive a response from flash, it will eventually fail.

      +

      Offline viewing conditions and cross-domain security rules will prevent Flash <-> JS communication. See the details of Flash -> JS for information.

      +

      Special Firefox Note: Some versions of Firefox (9.0 and newer?) may break JS/Flash in the file:// or offline case even when the path has been whitelisted in the Flash player security settings panel. IE, Chrome, Safari and Opera do not have this issue.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownSound test

      +
      +

      Here, a simple createSound() call is made to test SM2's actual operation. A sound should load and play provided SM2 was able to start successfully.

      +
      +
    • + +
    +
    + +

    Flash detection code from Flash Detect (featureblend.com)

    + +

    Flash Movie Debug Output

    +

    When soundManager.debugFlash = true, Flash will write debug info as text to the flash movie. This can be helpful for troubleshooting Flash/JS issues when timeouts or security errors are involved which prevent Flash from talking to Javascript, potentially hiding useful debug information. A CSS class of flash_debug will also be appended to the Flash #sm2-container DIV element when enabled, if you wish to style it differently.

    +

    You can also specify ?debug=1 in the URL to the SWF, and it will write debug output. Try soundmanager2_debug.swf?debug=1, or soundmanager2_flash9_debug.swf?debug=1.

    + +
    + +
    + +

    Live Debug Output

    +

    SoundManager 2 relies on Javascript and Flash communicating via ExternalInterface, and this is subject to a number of timing, loading and browser security conditions. Because of this complexity, debug information is essential for troubleshooting start-up, loading, initialization and error conditions between Flash and Javascript.

    +

    With debug mode enabled via debugMode = true, SM2 can write helpful troubleshooting information to javascript console.log()-style interfaces. Additionally, output can be written to an optional DIV element with the ID of "soundmanager-debug".

    +

    If loading from the local filesystem (offline eg. file://, not over HTTP), Flash security is likely preventing SM2 from talking to Javascript. You will need to add this project's directory to the trusted locations in the Flash global security settings panel, or simply view this page over HTTP.

    +

    Below is a live example of debug output.

    +
    +
    + +
    +
    +

    For more examples of live debug output, see the Basic Template, API demo and other demos in the top navigation.

    + +

    Standalone version of troubleshooting tool

    +

    For debugging your development/production environment with this widget, see the troubleshooting subdirectory of the SoundManager 2 package.

    + +
    + +
    + +
    + + + +
    + +
    + +
    + +
    + + +
    + + +
    + + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html new file mode 100755 index 00000000..5463f54d --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html @@ -0,0 +1,1934 @@ + + + +SoundManager 2: Documentation + + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    + + + +
    + + + +
    + +

    API Elements

    + +

    SoundManager and SMSound API

    + + + + +
    + +
    + +
    + +
    + + +
    + +
    +
    +
    + +
    +
    +
    + +
    + +
    + +
    + +

    SoundManager Properties: soundManager.setup()

    + +

    + Just getting started? See the basics. For nicely-formatted, annotated source code, see the pretty-printed version. +

    + +
    + +

    The soundManager object has many configurable properties which set debug mode, determine the flash movie path and other behaviours.

    + +

    When configuring soundManager for your use, soundManager.setup() is the method used to assign these options; for example, soundManager.setup({ url: '/path/to/swfs/', flashVersion: 9 });

    + +

    You should call the setup method before "DOM Ready", which is when SM2 applies configuration and starts up.

    + +

    Below are the default settings for SoundManager 2, which are appropriate for the majority of use cases - you shouldn't need to change them. These parameters are defined and stored in soundManager.setupOptions.

    + +

    Note: The only property requiring customization is url - this defines the path used to look for the appropriate flash SWF for driving audio when HTML5 is not available. (If not specified, the current working path is used.) Aside from flash-specific items like url and flashVersion, most properties can be set after "DOM Ready" without issue.

    + +
    + +
      + +
    • +
      url: '/path/to/swf-files/',
      + // the directory where SM2 can find the flash movies (soundmanager2.swf, soundmanager2_flash9.swf and debug versions etc.) Note that SM2 will append the correct SWF file name, depending on flashVersion and debugMode settings. +
    • + +
    • +
      allowScriptAccess: 'always',
      + // for scripting the SWF (object/embed property), 'always' or 'sameDomain' +
    • + +
    • +
      bgColor: '#ffffff',
      + // SWF background color. N/A when wmode = 'transparent' +
    • + +
    • +
      consoleOnly: true,
      + // if console is being used, do not create/write to #soundmanager-debug +
    • + +
    • +
      debugMode: true,
      + // enable debugging output (console.log() with HTML fallback) +
    • + +
    • +
      debugFlash: false,
      + // enable debugging output inside SWF, troubleshoot Flash/browser issues +
    • + +
    • +
      flashVersion: 8,
      + // flash build to use (8 or 9.) Some API features require 9. +
    • + +
    • +
      flashPollingInterval: null,
      + // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. +
    • + +
    • +
      html5PollingInterval: null,
      + // msec affecting whileplaying/loading callback frequency. If null, native HTML5 update events are used. +
    • + +
    • +
      html5Test: /^(probably|maybe)$/i,
      + // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. +
    • + +
    • +
      flashLoadTimeout: 1000,
      + // msec to wait for flash movie to load before failing (0 = infinity) +
    • + +
    • +
      idPrefix: 'sound',
      + // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc. +
    • + + +
    • +
      noSWFCache: false,
      + // if true, appends ?ts={date} to break aggressive SWF caching. +
    • + +
    • +
      preferFlash: true,
      + // overrides useHTML5audio. if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers. +
    • + +
    • +
      useConsole: true,
      + // use console.log() if available (otherwise, writes to #soundmanager-debug element) +
    • + +
    • +
      useFlashBlock: false,
      + // requires flashblock.css, see demos - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. +
    • + +
    • +
      useHighPerformance: false,
      + // position:fixed flash movie can help increase js/flash speed, minimize lag +
    • + +
    • +
      useHTML5Audio: true,
      + // use HTML5 Audio() where supported. Some browsers may not support "non-free" MP3/MP4/AAC codecs. Ideally, transparent vs. Flash API where possible. +
    • + +
    • +
      waitForWindowLoad: false,
      + // force SM2 to wait for window.onload() before trying to call soundManager.onready() +
    • + +
    • +
      wmode: null
      + // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index) +
    • + + +
    + +
    + +

    Legacy support note: The new approach defines top-level properties in soundManager.setupOptions. The old approach was to assign properties directly to the soundManager instance. Thus, when soundManager.setup({ url: ... }); is called, the updated property value is assigned to both soundManager.setupOptions.url and soundManager.url. You can assign soundManager.url directly as with the old method, but it is recommended to use the new setup()-based method for forward compatibility.

    + +
    + +

    Bonus: Extended soundManager.setup() Parameters

    + +

    As it is common to configure soundManager properties and related events all at once, you can also pass onready and ontimeout parameters which will be called as if you had used soundManager.onready() and soundManager.ontimeout().

    + +

    You can also provide values from the following top-level soundManager properties:

    + +
      +
    • defaultOptions: {...} (global defaults for new sound objects)
    • +
    • flash9Options: {...} (API feature options specific to Flash 9)
    • +
    • movieStarOptions: {...} (Flash 9-only NetStream/RTMP-specific options)
    • +
    + +
    soundManager.setup({
    +  url: '/path/to/swfs/',
    +  flashVersion: 9,
    +  preferFlash: false, // prefer 100% HTML5 mode, where both supported
    +  onready: function() {
    +    // console.log('SM2 ready!');
    +  },
    +  ontimeout: function() {
    +    // console.log('SM2 init failed!');
    +  },
    +  defaultOptions: {
    +    // set global default volume for all sound objects
    +    volume: 33
    +  }
    +});
    + +
    + +
    + +
    +

    debugFlash

    +

    soundManager.debugFlash configures SM2's flash debugging output, disabled (false) by default. When enabled, the Flash portion of SM2 will write debug statements within the Flash movie. This can be useful for troubleshooting Flash/JS/browser (ExternalInterface) issues and so on.

    +

    A CSS class of flash_debug will also be appended to the Flash #sm2-container DIV element when enabled, if you wish to style it differently.

    +

    For a live example, see Flash Movie Debug Output in the Troubleshooting section.

    +
    + +
    +

    debugMode

    +

    soundManager.debugMode configures SM2's debug behaviour, enabled (true) by default. When enabled, SoundManager 2 will write console-like output to console.log()-style javascript interfaces, and/or an HTML element with the ID soundmanager-debug (will be created if not found in the DOM at runtime.)

    +

    For a live example of debug output, see Debug + Console Output.

    +
    + +
    + +

    flashVersion

    + +

    SoundManager 2 started with a Flash 8 base requirement, but can also use Flash 9 and take advantages of some unique features Flash 9 offers. By default Flash 8 will be used, but the version can be easily changed by setting flashVersion appropriately.

    + +

    Example: soundManager.setup({ flashVersion: 9 });

    + +

    The Flash 8 version is soundmanager2.swf, and the flash 9 version is soundmanager2_flash9.swf, accordingly. Note that only Flash 8 and Flash 9 are supported at this time; other values will result in errors.

    + +
    + +
    + +

    Flash 9-only features:

    + +
      +
    • MPEG-4 (HE-AAC/H.264) audio support
    • +
    • True "multi-shot" sound behaviour. play() can be called multiple times, giving a layered, "chorus" effect. Sound will also fire onfinish() multiple times. (Previous behaviour did not layer sounds, but would re-play a single instance.)
    • +
    • waveformData array: 256 waveform data values available while playing sound
    • +
    • eqData array: 256 EQ spectrum data values available while playing sound
    • +
    • peakData object: Left and right channel peak/volume data available while playing sound
    • +
    + +
    + +
    +

    flashLoadTimeout

    +

    After initializing the flash component during start-up, SM2 will wait for a defined period of time before timing out and calling soundManager.onerror().

    +

    The default value is 1000 (msec.) Setting a value of 0 disables the timeout and makes SM2 wait indefinitely for a call from the flash component. If you want to handle flash block-type situations, see soundManager.useFlashBlock.

    +

    Setting this parameter to 0 may be useful when attempting to gracefully recover from a flashBlock situation, where the user has whitelisted the movie after it was blocked etc.

    +

    Note that when the timeout is disabled, soundManager will not fire its onerror() handler if there is an error at the flash loading stage.

    +
    + +
    +

    flashPollingInterval

    +

    Setting this will override useFastPolling, and defines the interval of the internal flash timer used for callbacks to sound events like whileloading() and whileplaying(). For example, set this to 200 to have 200ms intervals. This is useful in the case where your callbacks are CPU intensive, or you simply wish to throttle your calls to be more CPU-conservative.

    +
    + +
    +

    html5PollingInterval

    +

    Setting this will enable a single interval that will affect the frequency of event callbacks such whileplaying() for HTML5 sounds, with the exclusion of mobile devices. If null, native HTML5 update events are used. The frequency of native events may vary widely across browsers, and may exceed 500 msec on mobile and other resource-limited devices.

    +

    By default, Flash uses a 50-msec timer interval and this is a reasonable value to apply to html5PollingInterval for desktop use cases.

    +
    + +
    +

    preferFlash

    +

    This property handles "mixed-mode" HTML5 + flash cases, and may prevent 100% HTML5 mode when enabled depending on the configuration of soundManager.audioFormats. In the event HTML5 supports the default "required" formats (presently MP3), and preferFlash is true (and flash is installed), flash will be used for MP3/MP4 content while allowing HTML5 to play OGG, WAV and other supported formats.

    +

    Important note: Because HTML5 audio has some bugs across various browsers and operating systems, preferFlash is true by default to help ensure MP3/MP4 play consistently. If set to false or flash is not available, "HTML5-only" mode will kick in and will apply to all formats.

    +

    To encourage 100% HTML5 mode, call soundMangager.setup({ preferFlash: false }) and then Flash will not be used for MP3/MP4 playback, provided that HTML5 supports them.

    +
    + +
    +

    url

    +

    soundManager.url, applied via soundManager.setup(), specifies the "online", generally HTTP-based path which SM2 will load .SWF movies from. The "local" (current) path of ./ will be used by default. The appropriate .SWF required (depending on the desired Flash version) will be appended to the URL.

    +

    Example: soundManager.setup({ url: '/path/to/swf-directory/' }); (Note trailing slash)

    +

    For a simple demo of this in action, see the basic template.

    +

    For cases where SM2 is being used "offline" in non-HTTP cases (eg., development environments), see altURL.

    +
    + +
    +

    useFastPolling

    +

    By default useFastPolling = false, and thus SoundManager uses a 50-millisecond timer inside Flash when polling for updated sound properties such as bytesLoaded and data and event callbacks eg. whileloading(), whileplaying() and so on. With useFastPolling = true, a 10-msec timer is used and callback frequency may noticeably increase. This is best combined with useHighPerformance for optimal results.

    +
    + +
    +

    useFlashBlock

    +

    Flash blockers (eg. FlashBlock, "Click To Flash") can prevent the flash portion of SM2 from loading, which will cause a start-up error with a time-out.

    +

    SM2 historically has kept the flash movie off-screen and out of view, and thus the user could not click on and unblock it. Now with useFlashBlock = true, the movie positioning can be handled by CSS. The initial state is still off-screen by default, but will change to be in view when a blocking (time-out) situation may be encountered. You can also edit the CSS to taste, of course.

    +

    When starting up, CSS classes are appended to the #sm2-container DIV (which you can provide, or SM2 will create and append to the document.) The CSS classes change with the state of SM2's start-up, eg. #sm2-container.swf_timedout { border:1px solid red; } could be used to highlight the movie to the user for unblocking and so on.

    +

    Setting useFlashBlock = true will cause SM2 to wait infinitely for the Flash content to load after an initial (non-fatal) timeout, having already waited for flashLoadTimeout to pass. If flashLoadTimeout = 0, SM2 will immediately go into "flash block mode" on start-up.

    +

    The relevant CSS is as follows:

    +
    #sm2-container {
    + /**
    +  * Initial/default state...
    +  * position:absolute/off-screen, or left/top:0
    +  */
    +}
    +
    +#sm2-container.swf_timedout {
    +  /**
    +   * Didn't load before time-out, show to user.
    +   * Maybe highlight on-screen, red border, etc..? 
    +   */
    +}
    +
    +#sm2-container.swf_unblocked {
    +  /**
    +   * Applied if movie loads successfully
    +   * (flash started, so move off-screen etc.)
    +   */
    +}
    +
    +#sm2-container.swf_error {
    +  /**
    +   * "Fatal" error case: SWF loaded, but SM2 was unable to start.
    +   * (Flash security or other error case.)
    +   */
    +}
    +
    +#sm2-container.high_performance {
    +  /**
    +   * Additional modifier for "high performance" mode
    +   * should apply position:fixed and left/bottom 0 to stay on-screen
    +   * at all times (better flash performance)
    +   */
    +}
    +
    +#sm2-container.flash_debug {
    +  /**
    +   * Additional modifier for flash debug output mode
    +   * should use width/height 100% so you can read debug messages
    +   */
    +}
    + +

    For a live example, see the FlashBlock Demo.

    +
    + +
    +

    useHighPerformance

    +

    Perhaps intuitively, Flash is given higher priority when positioned within the viewable area of the browser, at least 6px in height (oddly), fully-opaque, visible and displayed on the screen. By default, useHighPerformance is disabled. When enabled, it may noticeably reduce JS/flash lag and increase the frequency of callbacks such as whileplaying() in some circumstances.

    +

    soundManager.setup({useHighPerformance: true});

    +

    This has made a noticeable impact in responsiveness on Mac OS X, and Safari on Windows; animation lag is practically non-existent (see demo). Because setting wmode=transparent and fixed position has been reported to cause some issues, the feature is disabled by default.

    +

    To be least-obtrusive, SM2 attempts to set position:fixed, and uses bottom/left:0px to stay within view (though using wmode=transparent where possible, to be hidden from view.) It occupies an 8x8px square. If you wish to position the movie yourself or show it inline, have a DIV element with the ID of sm2-container present in the DOM for SM2 to reference and it will write the movie there without positioning.

    +
    + +
    + +

    useHTML5Audio

    + +

    HTML5 support is in active development. See Revision History for the latest updates on HTML5 playback support.

    + +

    useHTML5Audio determines whether HTML5 Audio() support is used (as available) to play sound, with flash as the fallback for playing MP3 and MP4 (AAC) formats. Browser support for HTML5 Audio varies, and format support (eg. MP3, MP4/AAC, OGG, WAV) can vary by browser/platform.

    + +

    The SM2 API is effectively transparent, consistent whether using flash or HTML5 Audio() for sound playback behind the scenes. The HTML5 Audio API is roughly equivalent to the flash 8 feature set, minus ID3 tag support and a few other items. (Flash 9 features like waveform data etc. are not available in HTML5 mode.)

    + +

    By default, "100% HTML5 mode" applies to Apple iPad 3.2+ (iPad version 1.0), iPhone / iOS 4.0+ devices and others without flash. In other cases, HTML5 support is tested and if MP3/MP4 aren't natively supported, flash will be used as a backup method of playing these "required" formats. (It is assumed MP3 playback is required by default, but this is user-configurable via soundManager.audioFormats.) HTML5 may also enable support for additional formats such as OGG and WAV.

    +

    On the desktop and other devices with flash support, SM2 will still try for 100% HTML5 mode by default. However, you can use soundManager.setup({ preferFlash: true }) if you would like to have Flash play MP3 and MP4 (AAC) formats even when they are supported via HTML5.

    + +
    SoundManager 2 + useHTML5Audio: Init Process
    + +

    At DOM ready (if useHTML5Audio = true), a test for Audio() is done followed by a series of canPlayType() tests to see if MP3, MP4, WAV and OGG formats are supported. If any of the "required" formats (by default, MP3) are not supported via HTML5, or if preferFlash = true and MP3 or MP4 are required, then flash is also added as a requirement for SM2 to start.

    + +

    soundManager.audioFormats defines the list of formats to check (MP3, MP4 and so on), their possible canPlayType() strings (long story short, it's complicated) and whether or not they are "required" - that is, whether flash should be loaded if they don't work under HTML5. (Again, only MP3 + MP4 are supported by flash.) If you had a page solely using OGG, you could make MP3/MP4 non-required, but many browsers do not play OGG files natively.

    + +

    SM2 will indicate its state (HTML 5 support or not, using flash or not) in console.log()-style debug output messages when debugMode = true.

    + +
    "My browser does HTML5, why not MP3"?
    + +

    Despite best efforts, some browsers eg. Chrome on Windows may only return "maybe" for Audio().canPlayType('audio/mpeg; codecs=mp3') and variants; SoundManager 2 will presently assume a format is supported if a "probably" or "maybe" response is given. You can modify html5Test to be /probably/i if you want to be more strict, for example.

    + +

    Safari, IE 9, and Chrome (excluding Chromium?) support the "non-free" MP3 and MP4 (including AAC) formats. Firefox, in some cases, does support the MP3 codec where the underlying OS has support for it. This includes Windows Vista (and newer), and as of November 2013, Firefox Aurora (development builds) also on OS X.

    +

    For the cases where MP3 is not supported via HTML5, flash is used as the fallback support for MP3/MP4 as needed. Additionally, if flash support is present, soundManager.preferFlash means that MP3/MP4 will be handled by flash even if HTML5 support is present for those formats.

    + +
    Additional HTML5 formats: OGG, WAV
    + +

    WAVe (uncompressed audio) and OGG (a free/open-source alternative to MP3) are both supported in a majority of browsers via HTML5, so SoundManager 2 will also test for support for these formats. A flash fallback for these formats has not been implemented. In 2011, Adobe suggested they would support OGG audio + video (combined, the "WebM" format) in a future release of flash. As of November 2013, this has yet to materialize.

    + +

    You may need to make a few server configuration updates given the importance of MIME types and the use of certain HTTP headers when serving audio to HTML5 clients. See Client Requests for more.

    + +

    HTML5 is not limited to OGG and WAV, of course, as the system is designed to be extensible. Support for other formats may exist, depending on what built-in support exists, and plug-ins or codecs the user has installed on their system.

    + +
    Testing audio format support
    + +

    Once soundManager.onready() has fired and SM2 has started, you can check for support via a number of methods. Namely, soundManager.canPlayLink() will take an <a> element and check its href and type attributes, if available, for hints as to its format or type. You can also pass arbitrary URLs to soundManager.canPlayURL(), which will make a "best guess" based on the extension it finds. In any event, SM2 will return a true/false value from canPlay methods based on HTML and/or flash capabilities.

    + +

    To see what formats are supported by HTML5, watch SM2's debug/console output when debug is enabled, or dump the contents of soundManager.html5 to the console; it will show the results of tests for simple items like "mp3", as well as canPlayType() strings such as 'mpeg; codecs=mp3'

    + +
    Apple iPad, iPhone, Palm Pre: Special Cases
    +

    The "Big iPhone" doesn't do Flash, and does support HTML5 Audio() pretty decently - so SM2 makes a special exception to enable useHTML5Audio when it detects an iPad, iPhone or Palm Pre user agent string by default. Feel free to disable this if you wish.

    +

    iPad and iPhone require user interaction to start a sound, eg. the createSound() and play() call should happen within an onclick() handler on a link, etc. The "security" model here seems to be implemented similarly to the way pop-up blockers work. You may "chain" sounds (eg. create and play a new one) provided it is done via the onfinish() event of a sound initiated by a user, however. The Muxtape-style demo on the SM2 homepage uses this, and will advance the playlist on the iPad/iPhone if allowed.

    +

    iPad 3.2 gets hung up on the "BC quail" HE-AAC example sound for some reason, and endlessly loops it rather than finishing and moving on to the next item. May be an iPad playback bug, as other formats are fine. iPhone OS 4 (iOS 4) does not show this issue.

    +

    iPhone OS version < 3.1 doesn't work, but 3.1 (and possibly earlier versions, not verified) have a native Audio() object. However, they seem to simply not play sound when play() is called, so SM2 looks for and ignores the iPhone with these OS revisions.

    +

    The Palm Pre supports a number of MP3, MP4 and WAV formats (WebOS 1.4.1 was tested; it didn't seem to like MP3s at 192kbps, but 128kbps was fine.)

    + +
    General Disclaimer
    +

    HTML5 audio support may still be in flux, and may not be fully-supported or implemented consistently in modern browsers. Be careful out there.

    + +
    Related Reading on HTML5
    +

    For some more backstory on HTML and audio, see the 24ways.org article "Probably, Maybe, No": The State Of HTML5 Audio (published December, 2010.)

    + +
    + +
    +

    wmode

    +

    The wmode property is applied directly to the flash movie, and can be either null, 'window', 'transparent' or 'opaque'. By default if useHighPerformance is enabled, transparency will be attempted by SM2 unless there are known issues with the rendering mode.

    +

    It appears that non-IE browsers on Windows will not load SWF content "below the fold" (out of scrollable view) when wmode is set to anything other than null (window). This will break SM2 as it expects Flash to load within a reasonably short amount of time - so SM2 by default will reset wmode for this case. If you wish to force retention of your wmode, set soundManager.flashTimeout = 0 which will ensure that if the content is below the fold, SM2 will not time out waiting for it to load.

    +

    Additionally, soundManager.specialWmodeCase will be set to true if wmode has been reset due to this special condition.

    +
    + + +
    + +

    SoundManager Top-Level Properties

    + +

    A few additional properties that hang off the soundManager instance object

    + +
    + +
    +

    soundManager.altURL

    +

    soundManager.altURL specifies an alternate path to soundManager.setupOptions.url which SM2 can load its SWF from. It is a simple convenience for when you may need to load SWFs from different paths depending on your hosting environment (eg., offline development vs. production.)

    +

    Example: soundManager.altURL = '../'; (Load from parent directory - note trailing slash)

    +

    For altURL to be used, it must be defined and an "alternate environment" condition must be met:

    +

    soundManager.useAltURL = (!document.location.protocol.match(/http/i));

    +

    By default and as shown above, SM2 will use this property when the hosting page is not being served over HTTP, and thus is assumed to being served "offline" - for example, when loading via file://, from the local file system.

    +

    This can easily be adapted to taste, eg., checking the domain matching yourdomain.com vs. localhost:

    +

    soundManager.useAltURL = (!document.location.match(/mydomain.com/i));

    +

    If soundManager.altURL is null (the default), soundManager.setupOptions.url will be used for all cases.

    +
    + +
    +

    soundManager.audioFormats

    + +

    soundManager.audioFormats defines a structure listing the audio codecs that will be tested for support under both HTML5 and Flash. Each type is defined by a file extension and MIME types, and optionally, a list of related extensions (eg. MPEG-4 content can be in an .mp4 file, but may also be .aac, or .m4a.)

    + +

    Additionally, each format can be defined as "required", meaning that SM2 can fail to start if playback support is not found via either HTML5 or Flash. By default, MP3 is a required format.

    +
    soundManager.audioFormats = {
    +
    +  /**
    +   * determines HTML5 support + flash requirements.
    +   * if no support (via flash/HTML5) for "required" format, SM2 will fail to start.
    +   * flash fallback is used for MP3 or MP4 if lacking HTML5 (or preferFlash = true)
    +   * multiple MIME types may be tried looking for positive canPlayType() response.
    +   */
    +
    +  'mp3': {
    +    'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
    +    'required': true
    +  },
    +
    +  'mp4': {
    +    'related': ['aac','m4a'], // additional formats under the MP4 container
    +    'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
    +    'required': false
    +  },
    +
    +  'ogg': {
    +    'type': ['audio/ogg; codecs=vorbis'],
    +    'required': false
    +  },
    +
    +  'wav': {
    +    'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
    +    'required': false
    +  }
    +
    +};
    + +
    + + +
    + + +
    + +
    + +
    + +
    + +

    soundManager Global Object

    + +

    This is a collection of methods, properties and event handlers available via the soundManager Javascript object. Sound properties and methods can be set on a global (inherited) default, or per-sound basis.

    + +
    + + + +
    +
    canPlay:boolean canPlayMIME(MIMEtype:string)
    +
    Returns a boolean indicating whether soundManager can play the given MIME type - eg., audio/mp3. The types supported vary based on Flash version and MPEG4 (MovieStar mode) options.
    +
    + MIME type patterns are as follows: +
      +
    • Defaults: /^audio\/(?:x-)?(?:mp(?:eg|3))\s*;?/i; - eg. audio/mp3 or audio/mpeg
    • +
    • MovieStar-only formats: /^audio\/(?:x-)?(?:mp(?:eg|3)|mp4a-latm|aac|speex)\s*;?/i; - eg. audio/m4a or audio/aac
    • +
    +
    +
    Example: +
    // link example: <a id="song1" href="foo.php?songID=1" type="audio/mp3">play #1</a>
    +var aLink = document.getElementById('song1');
    +if (soundManager.canPlayMIME(aLink.type)) {
    + soundManager.createSound('song1Sound', aLink.href);
    +}
    +
    If no type attribute is found, this method will return null instead of false.
    +
    + +
    +
    canplay:boolean canPlayURL(mediaURL:string)
    +
    Returns a boolean indicating whether soundManager can play the given URL. Playability is determined by a matching URL pattern set at runtime, based on Flash version and MPEG4 (MovieStar mode) support.
    +
    Example: +
    var sURL = '/path/to/some.mp3';
    +if (soundManager.canPlayURL(sURL)) {
    + soundManager.createSound('fooSound', sURL);
    +}
    +
    If no href attribute is found, this method will return null instead of false.
    +
    + +
    +
    object:SMSound clearOnPosition(id:string, msecOffset:integer, [callback:function])
    +
    Clears the event listener set via onPosition(), in the same way it was registered. If the callback is omitted, any and all callbacks registered for the given offset will be cleared.
    +
    Example: soundManager.clearOnPosition('mySound', 3000, positionHandler);
    +
    Example 2: soundManager.clearOnPosition('mySound', 3000);
    +
    + +
    + +
    object:SMSound createSound(object:options)
    +
    Creates a sound object, supporting an arbitrary number of optional arguments. Returns a SMSound object instance. At minimum, a url parameter is required.
    +
    + Minimal example: +
    var someSound = soundManager.createSound({ 
    +  url: '/path/to/an.mp3'
    +});
    +
    +
    + With optional parameters: +
    var mySoundObject = soundManager.createSound({
    + // optional id, for getSoundById() look-ups etc. If omitted, an id will be generated.
    + id: 'mySound',
    + url: '/audio/mysoundfile.mp3',
    + // optional sound parameters here, see Sound Properties for full list
    + volume: 50,
    + autoPlay: true,
    + whileloading: function() { console.log(this.id + ' is loading'); }
    +});
    +

    Each createSound() call results in the creation of a SMSound object which stores all properties, methods and events relevant to that particular sound instance. If you keep the SMSound object in scope, you probably don't need to specify an ID. However, if you do provide an id, you can easily get a reference to the given sound via soundManager.getSoundById() (for the above example, you would use mySound.)

    +

    When specifying an id you can also use controller-level convenience methods, i.e., soundManager.play('mySound'), soundManager.stop('mySound') and so on.

    +

    Individual sound objects can also easily be referenced as returned from createSound():

    +
    var mySoundObject = soundManager.createSound({
    + url: '/audio/mysoundfile.mp3'
    +});
    +mySoundObject.play(); // SMSound object instance
    + +

    For more SMSound parameters, see Object Literal Format.

    +
    +
    If createSound is called with the ID of an existing sound, that sound object will be returned "as-is". Any other createSound options passed (eg., url or volume, etc.) will be ignored.
    + +
    + +
    +
    object:SMSound createSound(id:string, url:string) - overloaded method
    +
    Creates a sound with the specified ID and URL (simple two-parameter method.)
    +
    Example: soundManager.createSound('mySound','/audio/mysoundfile.mp3');
    +
    + +
    +
    destroySound(id:string)
    +
    Stops, unloads and destroys a sound specified by ID.
    +
    Example: soundManager.destroySound('mySound');
    +
    SMSound equivalent example: mySound.destruct();
    +
    + +
    +
    object:SMSound mute([id:string])
    +
    Mutes the sound specified by ID and returns that sound object. If no ID specified, all sounds will be muted and null is returned. Affects muted property (boolean.)
    +
    Example: soundManager.mute('mySound');
    +
    + +
    +
    object:SMSound onPosition(id:string, msecOffset:integer, callback:function, [scope])
    +
    Registers an event listener, fired when a sound reaches or passes a certain position while playing. Position being "listened" for is passed back to event handler. Will also fire if a sound is "rewound" (eg. via setPosition() to an earlier point) and the given position is reached again. Listeners will be removed if a sound is unloaded. An optional scope can be passed as well.
    +
    Note that for multiShot cases, only the first play instance's position is tracked in Flash; therefore, subsequent "shots" will not have onPosition() events being fired.
    +
    Example: soundManager.onPosition('mySound', 3000, function(eventPosition){console.log(this.id+' reached '+eventPosition});
    +
    + +
    +
    onready(callback:function, [scope])
    +
    Queues an event callback/handler for successful initialization and "ready to use" state of SoundManager 2. An optional scope parameter can be specified; if none, the callback is scoped to the window. If onready() is called after successful initialization, the callback will be executed immediately. The onready() queue is processed before soundManager.onload().
    +
    Example: +
    soundManager.onready(function() {
    +  alert('Yay, SM2 loaded OK!');	
    +});
    +
    +
    Queueing multiple handlers: soundManager.onready(myOnReadyHandler); soundManager.onready(myOtherHandler);
    +
    The same listener may be added multiple times; there is no duplicate checking. Queue is processed in order of addition.
    +
    If soundManager.reboot() is called, all listeners' "fired" flags will be reset and they will be eligible to fire again when SM2 starts.
    +
    This method can also be used via soundManager.setup({ onready: function() { ... } });
    +
    + +
    +
    ontimeout(callback:function, [scope])
    +
    Queues an event callback/handler for SM2 init failure, processed at (or immediately, if added after) SM2 initialization has failed, just before soundManager.onerror() is called. An optional scope parameter can be specified; if none, the callback is scoped to the window.
    +
    Additionally, a status object containing success and error->type parameters is passed as an argument to your callback.
    +
    Example: +
    soundManager.ontimeout(function(status) {
    +  alert('SM2 failed to start. Flash missing, blocked or security error?');
    +  alert('The status is ' + status.success + ', the error type is ' + status.error.type);
    +});
    +
    +
    Queueing multiple handlers: soundManager.ontimeout(myOnTimeoutHandler); soundManager.ontimeout(myOtherHandler);
    +
    The timeout event is not necessarily fatal, as SM2 may be rebooted and fire an onready() in the useFlashBlock case (where the user sees, and chooses to unblock the Flash component after a failed init attempt.)
    +
    The same listener may be added multiple times; there is no duplicate checking. Queue is processed in order of addition.
    +
    If soundManager.reboot() is called, all listeners' "fired" flags will be reset and they will be eligible to fire again when SM2 starts.
    +
    This method can also be used via soundManager.setup({ ontimeout: function() { ... } });
    +
    + +
    +
    object:SMSound play(id:string, [options object])
    +
    Starts playing the sound specified by ID. (Will start loading if applicable, and will play ASAP.)
    +
    Returns an SMSound (sound object) instance.
    +
    Example: soundManager.play('mySound');
    +
    Note that the second parameter, options object, is not required and can take almost any argument from the object literal format (eg. volume.) It is convenient when you wish to override the sound defaults for a single instance.
    +
    Example: soundManager.play('mySound',{volume:50,onfinish:playNextSound});
    +
    + +
    +
    object:SMSound pause(id:string)
    +
    Pauses the sound specified by ID. Does not toggle. Affects paused property (boolean.) Returns the given sound object.
    +
    Example: soundManager.pause('mySound');
    +
    + +
    +
    pauseAll()
    +
    Pauses all sounds whose playState is >0. Affects paused property (boolean.)
    +
    Example: soundManager.pauseAll();
    +
    + +
    +
    reboot()
    +
    Destroys any created SMSound objects, unloads the flash movie (removing it from the DOM) and restarts the SM2 init process, retaining all currently-set properties.
    +
    Example: +
    soundManager.ontimeout(function() {
    +  // Something went wrong during init - in this example, we *assume* flashblock etc.
    +  soundManager.flashLoadTimeout = 0; // When restarting, wait indefinitely for flash
    +  soundManager.onerror = {}; // Prevent an infinite loop, in case it's not flashblock
    +  soundManager.reboot(); // and, go!
    +});
    +
    +
    This method may be helpful when trying to gracefully recover from FlashBlock-type situations where the user has prevented the SWF from loading, but is able to whitelist it. For more ideas, see Flashblock demo.
    +
    When using this method also consider flashLoadTimeout, which can have SM2 wait indefinitely for the flash to load if desired.
    +
    + +
    +
    reset()
    +
    Effectively restores SoundManager's original state without rebooting (re-initializing).
    +
    Similar to reboot() which destroys sound objects and the flash movie (as applicable), but also nukes any registered onready() and related callbacks.
    +
    Once soundManager.reset() has been called, soundManager.beginDelayedInit() (or soundManager.setup() with a url property) may be called to re-init SM2.
    +
    + +
    +
    object:SMSound resume(id:string)
    +
    Resumes and returns the currently-paused sound specified by ID.
    +
    Example: soundManager.resume('mySound');
    +
    + +
    +
    resumeAll()
    +
    Resumes all currently-paused sounds.
    +
    Example: soundManager.resumeAll();
    +
    + +
    +
    object:SMSound setPan(id:string,volume:integer)
    +
    Sets the stereo pan (left/right bias) of the sound specified by ID, and returns the related sound object. Accepted values: -100 to 100 (L/R, 0 = center.) Affects pan property.
    +
    Example: soundManager.setPan('mySound',-80);
    +
    + +
    +
    object:SMSound setPosition(id:string,msecOffset:integer)
    +
    Seeeks to a given position within a sound, specified by miliseconds (1000 msec = 1 second) and returns the related sound object. Affects position property.
    +
    Example: soundManager.setPosition('mySound',2500);
    +
    Can only seek within loaded sound data, as defined by the duration property.
    +
    + +
    +
    object:SMSound setVolume(id:string, volume:integer)
    +
    Sets the volume of the sound specified by ID and returns the related sound object. Accepted values: 0-100. Affects volume property.
    +
    Example: soundManager.setVolume('mySound',50);
    +
    + +
    +
    object:SMSound stop(id:string)
    +
    Stops playing the sound specified by ID. Returns the related sound object.
    +
    Example: soundManager.stop('mySound');
    +
    + +
    +
    stopAll()
    +
    Stops any currently-playing sounds.
    +
    Example: soundManager.stopAll();
    +
    + +
    +
    object:SMSound toggleMute(id:string)
    +
    Mutes/unmutes the sound specified by ID. Returns the related sound object.
    +
    Example: soundManager.toggleMute('mySound');
    +
    + +
    +
    object:SMSound togglePause(id:string)
    +
    Pauses/resumes play on the sound specified by ID. Returns the related sound object.
    +
    Example: soundManager.togglePause('mySound');
    +
    + +
    +
    object:SMSound unload(id:string)
    +
    Stops loading the sound specified by ID, canceling any current HTTP request. Returns the related sound object.
    +
    Example: soundManager.unload('mySound');
    +
    Note that for Flash 8, SoundManager does this by pointing the sound object to about:blank, which replaces the current one from loading.
    +
    + +
    +
    object:SMSound unmute([id:string])
    +
    Unmutes the sound specified by ID. If no ID specified, all sounds will be unmuted. Affects muted property (boolean.) Returns the related sound object.
    +
    Example: soundManager.unmute('mySound');
    +
    + +
    +
    object:SMSound load(id:string, [options object])
    +
    Starts loading the sound specified by ID, with options if specified. Returns the related sound object.
    +
    Example: soundManager.load('mySound');
    +
    Example 2: soundManager.load('mySound',{volume:50,onfinish:playNextSound});
    +
    + +
    +
    object:SMSound getSoundById(id:string)
    +
    Returns an SMSound object specified by ID, or null if a sound with that ID is not found.
    +
    Example: var mySMSound = soundManager.getSoundById('mySound');
    +
    + +
    +
    number:bytesUsed getMemoryUse()
    +
    Returns the total number of bytes allocated to the Adobe Flash player or Adobe AIR, or 0 if unsupported (Flash 9+ only.) This number may include memory use across all tabs, browsers etc. See system.totalMemory (livedocs.adobe.com)
    +
    Example: var mbUsed = (soundManager.getMemoryUse()/1024/1024).toFixed(2); // eg. 12.05 MB
    +
    + +
    +
    isSupported:boolean ok() ( previous name: supported() )
    +
    Returns a boolean indicating whether soundManager has attempted to and succeeded in initialising. This function will return false if called before initialisation has occurred, and is useful when you want to create or play a sound without knowing SM2's current state.
    +
    Example: var isSupported = soundManager.ok();
    +
    + +
    + +
    + +
    + +
    + +
    + +

    Sound Object Methods

    + +

    Each sound under SoundManager 2 is given a SMSound object instance which includes the following events, methods and properties. Note that most methods will return the sound object instance, allowing for method chaining if desired.

    + +
    +
    object:SMSound clearOnPosition(msecOffset:integer, [callback:function])
    +
    Clears the event listener set via onPosition(), in the same way it was registered. If the callback is omitted, any and all callbacks registered for the given offset will be cleared.
    +
    Example: mySound.clearOnPosition(3000, positionHandler);
    +
    Example 2: mySound.clearOnPosition('mySound', 3000);
    +
    + +
    +
    destruct()
    +
    Stops, unloads and destroys a sound, freeing resources etc.
    +
    Example: mySound.destruct();
    +
    + +
    +
    object:SMSound load([options object])
    +
    Starts loading the given sound, with options if specified.
    +
    Example: mySound.load();
    +
    Example 2: mySound.load({volume:50,onfinish:playNextSound});
    +
    + +
    +
    object:SMSound mute()
    +
    Mutes the given sound. Affects muted property.
    +
    Example: mySound.mute();
    +
    + +
    +
    object:SMSound onPosition(msecOffset:integer, callback:function, [scope])
    +
    Registers an event listener, fired when a sound reaches or passes a certain position while playing. Position being "listened" for is passed back to event handler. Will also fire if a sound is "rewound" (eg. via setPosition() to an earlier point) and the given position is reached again. Listeners will be removed if a sound is unloaded. An optional scope can be passed as well.
    +
    Note that for multiShot cases, only the first play instance's position is tracked in Flash; therefore, subsequent "shots" will not have onPosition() events being fired.
    +
    Example: mySound.onPosition(3000, function(eventPosition){console.log(this.id+' reached '+eventPosition});
    +
    If you need to fire an event relative to the true duration of the sound, reference its duration once the sound has fully-loaded - ie., at or after the onload() event - as the duration will not be completely accurate until that time. durationEstimate may be referenced before onload(), but it should not be relied on when "precise" timings of say, < 1 second are desired.
    +
    Example:
    mySound.load({
    +  onload: function() {
    +    this.onPosition(this.duration * 0.5, function(eventPosition) {
    +      console.log('the sound ' + this.id + ' is now at position ' + this.position + ' (event position: ' + eventPosition + ')');
    +    });
    +  }
    +});
    +
    +
    Again, note that due to the interval / polling-based methods of both HTML5 and flash audio, sound status updates and thus precision can vary between 20 msec to perhaps 0.5 seconds and the sound's position property will reflect this delta when the onPosition() callback fires.
    + +
    + +
    +
    object:SMSound pause()
    +
    Pauses the given sound. (Does not toggle.) Affects paused property (boolean.)
    +
    Example: mySound.pause();
    +
    + +
    +
    object:SMSound play([options object])
    +
    Starts playing the given sound, with an optional options object. (Will start loading if applicable, and will play ASAP.)
    +
    Note that the options object parameter is not required and can take almost any argument from the object literal format (eg. volume.)
    +
    Example: mySound.play('mySound',{volume:50,onfinish:playNextSound});
    +
    + +
    +
    object:SMSound setPosition(msecOffset:integer)
    +
    Seeks to a given position within a sound, specified by miliseconds (1000 msec = 1 second.) Affects position property.
    +
    Example: mySound.setPosition(2500);
    +
    Can only seek within loaded sound data, as defined by the duration property.
    +
    + +
    +
    object:SMSound resume()
    +
    Resumes the currently-paused sound. Does not affect currently-playing sounds.
    +
    Example: mySound.resume();
    +
    + +
    +
    object:SMSound setPan(volume:integer)
    +
    Sets the stereo pan (left/right bias) of the given sound. Accepted values: -100 to 100 (L/R, 0 = center.) Affects pan property.
    +
    Example: mySound.setPan(-80);
    +
    + +
    +
    object:SMSound setVolume(volume:integer)
    +
    Sets the volume of the given sound. Accepted values: 0-100. Affects volume property.
    +
    Example: mySound.setVolume(50);
    +
    + +
    +
    object:SMSound toggleMute()
    +
    Mutes/unmutes the given sound. Affected muted property (boolean.)
    +
    Example: mySound.toggleMute();
    +
    + +
    +
    object:SMSound togglePause()
    +
    Pauses/resumes play of the given sound. Will also start a sound if it is has not yet been played.
    +
    Example: mySound.togglePause();
    +
    + +
    +
    object:SMSound stop()
    +
    Stops playing the given sound.
    +
    Example: mySound.stop();
    +
    + +
    +
    object:SMSound unload()
    +
    Stops loading the given sound, canceling any current HTTP request.
    +
    Example: mySound.unload();
    +
    Note that for Flash 8, SoundManager does this by pointing the sound object to about:blank, which replaces the current one from loading.
    +
    + +
    +
    object:SMSound unmute()
    +
    Unmutes the given sound. Affects muted property.
    +
    Example: mySound.unmute();
    +
    + +
    + +
    + +
    + +
    + +
    + +
    + +

    Sound Object Events

    + +

    Like native javascript objects, each SoundManager SMSound (sound instance) object can fire a number of onload-like events. Handlers cannot be "directly" assigned (eg. someSound.onload), but can be passed as option parameters to several sound methods.

    +
    +
    soundManager.play('mySound',{
    +  onfinish: function() {
    +    alert('The sound '+this.id+' finished playing.');
    +  }
    +});
    +
    +

    Event handlers are scoped to the relevant sound object, so the this keyword will point to the sound object on which the event fired such that its properties can easily be accessed - eg. within an SMSound event handler, this.id will give the sound ID.

    + +
    + +
    + +
    +
    onbufferchange()
    +
    Fires when a sound's reported buffering state has changed while playing and/or loading. The current state is reflected in the boolean isBuffering property.
    +
    Flash 9+ only. Related information on Adobe, Sound.isBuffering.
    +
    + +
    +
    ondataerror()
    +
    Fires at least once per sound play instance when Flash encounters a security error when trying to call computeSpectrum() internally. This typically happens when sounds are 'inaccessible' due to another Flash movie (eg. YouTube) in another tab which has loaded, and may (or may not be) playing sound. Flash attempts to read the "combined" output to the sound card, and must have security permissions for all sounds as a result. See areSoundsInaccessible() on Adobe for more info.
    +
    If the offending resource causing the security error is closed or becomes inactive(?), the data will become available again. Intermittent availability will result in intermittent calls to ondataerror().
    +
    + +
    +
    onbeforefinishcomplete()
    +
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    + +
    + +
    +
    onbeforefinish()
    +
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    + +
    + +
    +
    onconnect()
    +
    Fires when a sound using an RTMP serverURL property has attempted to connect, and has either succeeded or failed. Affects connected property. Once connected, a stream can be requested from the RTMP server.
    +
    Example: +
    var s = soundManager.createSound({
    +  id: 'rtmpTest',
    +  serverURL: 'rtmp://localhost/test/',
    +  url: 'song.mp3',
    +  onconnect: function(bConnect) {
    +    // this.connected can also be used
    +    soundManager._writeDebug(this.id+' connected: '+(bConnect?'true':'false'));
    +  }
    +}).play(); // will result in connection being made
    +
    +
    + +
    +
    onfinish()
    +
    Fires when a playing sound has reached its end. By this point, relevant properties like playState will have been reset to non-playing status.
    +
    + +
    +
    onid3()
    +
    Fires when ID3 data has been received. Relevant property is id3, which is an object literal (JSON)-style object. Only fields with data will be populated.
    +
    Note that ID3V2 data is located at the beginning (header) of an MP3 file and will load almost immediately, whereas ID3V1 data is at the end and will not be received until the MP3 has fully loaded.
    +
    + Example handler code: +
    +
    soundManager._writeDebug('sound '+this.id+' ID3 data received');
    +var prop = null;
    +var data = '';
    +for (prop in this.id3) {
    +  data += prop+': '+this.id3[prop]+','; // eg. title: Loser, artist: Beck
    +}
    +
    +
    +
    Refer to the Flash 8 Sound.id3 documentation for a list of ID3 properties.
    +
    When parsing ID3 data, it is best to check for the existance of ID3V1 data first, and apply ID3V2 if no matching ID3V1 data is defined. (V1 should "inherit" from V2, ideally, if available.)
    +
    Note that Flash's cross-domain security restrictions may prevent access to ID3 information, even though the MP3 itself can be loaded. (crossdomain.xml files on the remote host can grant Flash permission to access this.)
    +
    Also note some issues with parsing ID3 from iTunes.
    +
    + + +
    +
    onjustbeforefinish()
    +
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    + +
    + +
    +
    onload(boolean:success)
    +
    Fires on sound load. Boolean reflects successful load (true), or fail/load from cache (false).
    +
    False value should seemingly only be for failure, but appears to be returned for load from cache as well. This strange behaviour comes from Flash. More detail may be available from the Flash 8 sound object documentation.
    +
    Failure can occur if the Flash sandbox (security) model is preventing access, for example loading SoundManager 2 on the local file system and trying to access an MP3 on a network (or internet) URL. (Security can be configured in the Flash security panel, [see here].)
    + +
    + +
    +
    onpause()
    +
    Fires when a sound pauses, eg. via sound.pause().
    +
    Example: soundManager.pause('mySound');
    +
    + +
    +
    onplay()
    +
    Fires when sound.play() is called.
    +
    + +
    +
    onresume()
    +
    Fires when a sound resumes playing, eg. via sound.resume().
    +
    Example: soundManager.resume('mySound');
    +
    + +
    +
    onsuspend()
    +
    HTML5-only event: Fires when a browser has chosen to stop downloading of an audio file.
    +
    Per spec: "The user agent is intentionally not currently fetching media data, but does not have the entire media resource downloaded."
    +
    One use case may be catching the behaviour where mobile Safari (iOS) will not auto-load or auto-play audio without user interaction, and using this event to show a message where the user can click/tap to start audio.
    +
    The HTML5 stalled event may also fire in desktop cases and might behave differently across browsers and platforms, so careful testing is recommended.
    +
    + +
    +
    onstop()
    +
    Fires when sound.stop() is explicitly called. For natural "sound finished" onfinish() case, see below.
    +
    + +
    +
    whileloading()
    +
    Fires at a regular interval when a sound is loading and new data has been received. The relevant, updated property is bytesLoaded.
    +
    Example handler code: soundManager._writeDebug('sound '+this.id+' loading, '+this.bytesLoaded+' of '+this.bytesTotal);
    +
    Note that the duration property starts from 0 and is updated during whileloading() to reflect the duration of currently-loaded sound data (ie. when a 4:00 MP3 has loaded 50%, the duration will be reported as 2:00 in milliseconds.) However, an estimate of final duration can be calculated using bytesLoaded, bytesTotal and duration while loading. Once fully-loaded, duration will reflect the true and accurate value.
    +
    + +
    +
    whileplaying()
    +
    Fires at a regular interval when a sound is playing, and a position (time) change is detected. The relevant, updated property is position.
    +
    Example handler code: soundManager._writeDebug('sound '+this.id+' playing, '+this.position+' of '+this.duration);
    +
    + +
    + +
    + +
    + + +
    + +
    + +
    + +

    Sound Object Properties

    +

    Each sound object inherits these properties from soundManager.defaultOptions. They can be set individually or at once when enclosed in object literal form to either createSound() or play().

    + +
    + +
    + +
    +
    id
    +
    Sound ID string as provided from the id parameter via createSound(). Can be referenced as this.id from within sound object event handlers such as onload(), whileloading() or whileplaying(), etc.
    +
    If an ID is known, the related SMSound object can be retrieved via getSoundById or directly referencing sounds[id] on the SoundManager global object.
    +
    Legacy note: The sound ID property used to be referenced as sID from within the sound object; this name is maintained for backward compatibility.
    +
    + +
    +
    url
    +
    The specified URL from which the sound is loaded, typically over HTTP. Can be referenced as this.url from within sound object event handlers such as onload() or whileplaying(), etc.
    +
    Experimental feature: Multiple formats/encodings can now be applied to the url parameter by specifying an array instead of a single string.
    +
    Example: +
    soundManager.createSound({
    +  id: 'foo',
    +  url: ['bar.ogg','bar.mp3']
    +});
    +
    SoundManager 2 will use the first playable URL it finds (according to canPlayURL() and/or canPlayType()), and the URL property will then reflect the playable URL after that point. Note that this means the original array data will be lost.
    +
    In this alternate format, the array accepts "type" attributes.
    +
    +
    soundManager.createSound({
    +  id: 'foo',
    +  // useful for URLs without obvious filetype extensions
    +  url: [
    +    {type:'audio/mp3',url:'/path/to/play.php?song=123'},
    +    {type:'audio/mp4',url:'/path/to/play.php?song=256'}
    +  ]
    +});
    +
    + +
    +
    serverURL
    +
    Note: Experimental feature. Only for use with RTMP streaming, ie., Flash Media Server and similar servers.
    +
    The RTMP server address which Flash will connect to using a NetStream object. Only the server address is specified here, when RTMP is in use; the url property is used to point to a specific resource on the server.
    +
    Example: +
    soundManager.createSound({
    +  id: 'mySound',
    +  serverURL: 'rtmp://localhost/rtmpDemo/', // RTMP server
    +  url: 'mysong.mp3' // path to stream
    +}).play();
    +
    + +
    +
    usePolicyFile
    +
    Boolean value (default: false) which instructs Flash, when loading MP3/MP4 content from remote/third party domains, to request example.com/crossdomain.xml first in order to determine permissions for access to metadata such as ID3 info, waveform, peak and/or spectrum data.
    +
    usePolicyFile will be automagically set to true if your sound options have an onid3() event handler, or uses sound data (peak/wave/spectrum) features. By default, Flash will not have access to this metadata on remote domains unless granted cross-domain security permissions via the crossdomain.xml file.
    +
    Consider additional HTTP traffic (albeit, perhaps with caching-like behaviour for subsequent checks?) and silent 404s in most cases given few hosts use crossdomain.xml files.
    +
    See Adobe's knowledge base for related ID3 + crossdomain.xml documentation.
    +
    + +
    + +
    + +
    + +

    Sound Object Dynamic Properties

    +

    Each sound includes a number of properties that are updated throughout the life of a sound - while loading or playing, for example. Many of these properties have related events that fire when they are updated, and should be treated as read-only.

    + +
    + +
    +
    buffered
    +
    Based loosely on the native HTML5 attribute, SM2 defines buffered as an array of objects which include start and end position (time) values. This property is updated during the SM2 whileloading event; internally, SM2 uses HTML5's progress event to track changes.
    +
    It is important to note that the buffered values may not always be contiguous and can change, particularly if the user seeks within the file during downloading. With ranges, you can draw highlighted segments on a progress bar UI which would reflect the current "slices" of buffered data.
    +
    Example: a buffered array of [{ start: 0, end: 2 }, { start: 5, end: 7 }]; shows a sound that has buffered data for the ranges 0-2 seconds, and 5-7 seconds.
    +
    In order to determine the total buffered data and thus "total percent loaded" under HTML5, you can loop through the buffered array and sum the total of (buffered[i].end - buffered[i].start). If you want to draw ranges, you can use the start and end values of each buffered item and draw that relative to the total duration (normalized as durationEstimate for flash compatibility).
    +
    Example: +
    var i, total = 0;
    +for (i=0, j=this.buffered.length; i<j; i++) {
    +  // draw current range in progress bar UI?
    +  drawProgressUI(this.buffered[i].start, this.buffered[i].end);
    +  // sum of all ranges vs. whole file duration
    +  total += (this.buffered[i].end - this.buffered[i].start);
    +}
    +
    +
    Note that under Flash, downloading is always sequential and thus the buffered array will always be a single item with start: 0 and an end value of duration (eg., the amount of currently-downloaded "time").
    +
    Additional behaviour note: A browser might download additional bytes of a sound in advance under HTML5, but may only update the buffered state to reflect the newly-downloaded range(s) when the "playback head" reaches near the end of the current buffer. This can also be affected if the user seeks within the file.
    +
    + +
    +
    bytesLoaded
    +
    The number of bytes currently received while loading a sound.
    +
    + +
    +
    bytesTotal
    +
    The total number of bytes to be downloaded, while loading a sound.
    +
    + +
    +
    didBeforeFinish
    +
    This property has been removed. Use the newer SMSound.onPosition() as a replacement.
    + +
    + +
    +
    didJustBeforeFinish
    +
    This property has been removed. Use the newer SMSound.onPosition() as a replacement.
    + +
    + +
    +
    duration
    +
    The current length of the sound, specified in milliseconds.
    +
    Note that during loading, this property reflects the length of downloaded data, not the full length, until completely loaded (see whileloading().) For an approximate "full duration" value while loading, see durationEstimate.
    +
    + +
    +
    durationEstimate
    +
    The estimated duration of the sound, specified in milliseconds.
    +
    Due to the dynamic nature of duration while loading, this attempts to provide the full duration by calculating parseInt((self.bytesTotal/self.bytesLoaded)*self.duration) and is updated with each whileloading() interval.
    +
    (Flash-only): Once the sound has fully loaded (onload() has fired), durationEstimate will be updated with the final, Flash-calculated value of duration.
    +
    Note that the durationEstimate method works only with Constant Bitrate (CBR)-encoded MP3s due to the consistent data/time assumption. VBR-encoded MP3s will give inaccurate results.
    +
    HTML5 behaviour: Both duration and durationEstimate are updated at regular intervals during loading of HTML5 audio, directly referencing the duration property provided on the native HTML5 object. Unlike Flash, HTML5 typically gets the true and final duration value by the time playback begins.
    +
    + +
    +
    eqData = {left:[], right: []}
    +
    Object containing two arrays of 256 floating-point (three decimal place) values from 0 to 1, the result of an FFT on the waveform data. Can be used to draw a spectrum (frequency range) graph while playing a sound. See Page-as-playlist demo for example implementation. Requires Flash 9+.
    +
    A spectrum frequency graph reflects the level of frequencies being played, from left to right, low to high (i.e., 0 to 20,000 Hz.)
    +
    eqData is set and updated during whileplaying(). A simple graph could be drawn by looping through the values and multiplying by a vertical scale value (eg. 32, thus a graph with peaks of 32 pixels.)
    +
    Example code: +
    someSoundObject.whileplaying = function() {
    +  // Move 256 absolutely-positioned 1x1-pixel DIVs, for example (ugly, but works)
    +  var gPixels = document.getElementById('graphPixels').getElementsByTagName('div');
    +  var gScale = 32; // draw 0 to 32px from bottom
    +  for (var i=0; i<256; i++) {
    +    graphPixels[i].style.top = (32-(gScale+Math.ceil(this.waveformData.left[i]*gScale)))+'px';
    +  }
    +}
    +
    +
    Related Adobe technical documentation (Flash 9/AS3 Sound() object): computeSpectrum()
    +
    Note: Flash security measures may deny access to waveformData when loading MP3s from remote domains.
    +
    Warning: This feature can eat up a lot of CPU in some cases. The amount of data passed from Flash to JS is not terribly large, but the JS-DOM updates and browser reflow can be expensive. Use with caution.
    +
    Backward compatibility note: Up to SoundManager 2.95a.20090717, eqData was a single array containing one channel of data. In newer versions this is unchanged, except the array now has .left[] and .right[] objects attached to it. To ensure future compatibility, use eqData.left[0] instead of eqData[0] and so on.
    +
    + +
    +
    id3
    +
    An object literal populated, if applicable, when ID3 data is received (related handler: onid3())
    +
    For property details, see onid3().
    +
    + +
    +
    isBuffering
    +
    Boolean value reflecting the buffering state of a playing or loading object. To be notified when this property changes, see onbufferchange().
    +
    Flash 9+ only. Related information on Adobe, Sound.isBuffering.
    +
    + +
    +
    isHTML5
    +
    Boolean property indicating whether a sound object is using HTML5 Audio for playback. Treat as read-only.
    +
    This should not really be relied on for anything, but it is provided as an indicator of support on a per-sound basis.
    +
    isHTML5 is set based on the URL provided to createSound(), and is updated when the URL changes.
    +
    + +
    +
    connected
    +
    Boolean value reflecting the state of an RTMP server connection (when serverURL is used to connect to a Flash Media Server or similar RTMP service.) Calls to load or play will result in a connection attempt being made, and onconnect() ultimately being called.
    +
    For example code using connected, see onconnect().
    +
    + +
    +
    loaded
    +
    Boolean value indicating load success as returned from Flash. True indicates success, False is a failure.
    +
    Because of the potential for false positives, duration and other properties could be checked as a test of whether sound data actually loaded. For more granular state information, see readyState.
    +
    + +
    +
    muted
    +
    Boolean indicating muted status. True/False.
    +
    Treat as read-only; use mute(), unmute() and toggleMute() methods to affect state.
    +
    + +
    +
    paused
    +
    Boolean indicating pause status. True/False.
    +
    Treat as read-only; use pause(), resume() and togglePause() methods to affect state.
    +
    + +
    +
    peakData = {left:0.0, right:0.0}
    +
    Object literal format including left and right properties with floating-point values ranging from 0 to 1, indicating "peak" (volume) level. Updated during whileplaying(). See Page-as-playlist demo as one example. Requires Flash 9+.
    +
    Example (within relevant sound object handler): +
    someSoundObject.whileplaying = function() {
    +  soundManager._writeDebug('Peaks, L/R: '+this.peakData.left+'/'+this.peakData.right);
    +}
    +
    + +
    +
    playState
    +
    Numeric value indicating the current playing state of the sound.
    +
    0 = stopped/uninitialised
    +
    1 = playing or buffering sound (play has been called, waiting for data etc.)
    +
    Note that a 1 may not always guarantee that sound is being heard, given buffering and autoPlay status.
    +
    + + +
    +
    position
    +
    The current location of the "play head" within the sound, specified in milliseconds (1 sec = 1000 msec).
    +
    + +
    +
    readyState
    +
    Numeric value indicating a sound's current load status
    +
    0 = uninitialised
    +
    1 = loading
    +
    2 = failed/error
    +
    3 = loaded/success
    +
    Under Flash, readyState will move from 0 to 1, and then change to 3 when the sound's onload() event fires (and all bytes have loade.)
    +
    Under HTML5, readyState will move from 0 to 1 when initializing the HTTP request (from load()), and will quickly change to 3 when the sound is ready to play. Note that HTML5 is buffer-based and onload() means "enough audio data has buffered to begin playback".
    +
    + +
    +
    type
    +
    A MIME type-like string eg. audio/mp3, used as a hint for SM2 to determine playability of a link with methods like canPlayURL().
    +
    This can be helpful when you have a sound URL that does not have an .mp3 extension, but serves MP3 data (eg., a PHP or other CGI script.)
    +
    Example: +
    var s = soundManager.createSound({
    +  id: 'aSound',
    +  url: '/path/to/some.php?songID=123',
    +  type: 'audio/mp3' // indicates an MP3 link, so SM2 can handle it appropriately
    +});
    +
    + +
    +
    waveformData = {left:[], right:[]}
    +
    Array of 256 floating-point (three decimal place) values from -1 to 1, can be used to draw a waveform while playing a sound. See Page-as-playlist demo for example implementation. Requires Flash 9+.
    +
    waveformData is set and updated during whileplaying(). A simple graph could be drawn by looping through the values and multiplying by a vertical scale value (eg. 32, which would make a graph with peaks of -32 and +32 pixels.)
    +
    Example code: +
    someSoundObject.whileplaying = function() {
    +  // Move 256 absolutely-positioned 1x1-pixel DIVs, for example (ugly, but works)
    +  var gPixels = document.getElementById('graphPixels').getElementsByTagName('div');
    +  var gScale = 32; // draw -32 to +32px from "zero" (i.e., center Y-axis point)
    +  for (var i=0; i<256; i++) {
    +    graphPixels[i].style.top = (gScale+Math.ceil(this.waveformData.left[i]*-gScale))+'px';
    +  }
    +}
    +
    +
    SM2 implementation note: waveformData contains both left and right channels, and the data represents a raw sound wave rather than a frequency spectrum.
    +
    Related Adobe technical documentation (Flash 9/AS3 Sound() object): computeSpectrum()
    +
    Note: Flash security measures may deny access to waveformData when loading MP3s from remote domains.
    +
    Warning: This feature can eat up a lot of CPU in some cases. The amount of data passed from Flash to JS is not terribly large, but the JS-DOM updates and browser reflow can be expensive. Use with caution.
    +
    + +
    + +
    + +
    + +
    + +
    + +
    +

    SMSound Object Methods

    +

    SoundManager provides wrappers for most SMSound methods - eg. soundManager.play('mySound') checks for a valid sound object, and then calls soundManager.sounds['mySound'].play() on that particular object; thus, it is the same as var sound = soundManager.getSoundById('mySound'); mySound.play();

    +

    The following methods can be called directly on a SMSound instance. The method calls are the same as the SoundManager global methods documented above for existing sound objects, minus the sound ID parameter.

    +
    + + + + +
    +
    + + + +
    + +
    + +
    + +

    SoundManager: Default Sound Options

    + +

    Sound objects inherit properties from soundManager.defaultOptions when they are created.

    +

    Sound parameters can be overridden on a per-sound basis at create time, or changed dynamically in some cases. Note that none of these options are required when calling createSound() except for id and url; the others will inherit the default values if unspecified.

    +

    soundManager.defaultOptions apply the properties and event handlers as specified above. Defaults are shown below as an example.

    + +
    soundManager.defaultOptions = {
    +  autoLoad: false,        // enable automatic loading (otherwise .load() will call with .play())
    +  autoPlay: false,        // enable playing of file ASAP (much faster if "stream" is true)
    +  from: null,             // position to start playback within a sound (msec), see demo
    +  loops: 1,               // number of times to play the sound. Related: looping (API demo)
    +  multiShot: true,        // let sounds "restart" or "chorus" when played multiple times..
    +  multiShotEvents: false, // allow events (onfinish()) to fire for each shot, if supported.
    +  onid3: null,            // callback function for "ID3 data is added/available"
    +  onload: null,           // callback function for "load finished"
    +  onstop: null,           // callback for "user stop"
    +  onfinish: null,         // callback function for "sound finished playing"
    +  onpause: null,          // callback for "pause"
    +  onplay: null,           // callback for "play" start
    +  onresume: null,         // callback for "resume" (pause toggle)
    +  position: null,         // offset (milliseconds) to seek to within downloaded sound.
    +  pan: 0,                 // "pan" settings, left-to-right, -100 to 100
    +  stream: true,           // allows playing before entire file has loaded (recommended)
    +  to: null,               // position to end playback within a sound (msec), see demo
    +  type: null,             // MIME-like hint for canPlay() tests, eg. 'audio/mp3'
    +  usePolicyFile: false,   // enable crossdomain.xml request for remote domains (for ID3/waveform access)
    +  volume: 100,            // self-explanatory. 0-100, the latter being the max.
    +  whileloading: null,     // callback function for updating progress (X of Y bytes received)
    +  whileplaying: null,     // callback during play (position update)
    +  // see optional flash 9-specific options, too
    +}
    +
    + +

    As a simple example, the following code would override the default autoPlay, pan and volume options for a given sound:

    + +
    soundManager.createSound({
    +  url: '/path/to/some.mp3',
    +  autoPlay: true,
    +  pan: -75,
    +  volume: 50
    +});
    + +

    Note: For live examples, see the code behind the "page as playlist" demo which uses much of this functionality.

    + +
    + +
    + +

    Sound Properties Object: Version-specific Options (Merging)

    + +

    Some sound properties object items (eg. usePeakData) are flash version-specific, non-default and are intentionally separated from soundManager.defaultOptions. Flash 9-specific options fall under this category.

    + +

    soundManager.flash9Options and soundManager.movieStarOptions are both defined as separate objects, and if supported according to flashVersion and defaultOptions parameters, are merged at the property level into soundManager.defaultOptions.

    + +
    // Note: These are merged into soundManager.defaultOptions when flashVersion = 9.
    +
    +soundManager.flash9Options = {
    +  isMovieStar: null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
    +  usePeakData: false,     // enable left/right channel peak (level) data
    +  useWaveformData: false, // enable sound spectrum (raw waveform data) - WARNING: May set CPUs on fire.
    +  useEQData: false,       // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
    +  onbufferchange: null,	  // callback for "isBuffering" property change
    +  ondataerror: null	  // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
    +}
    +
    +soundManager.movieStarOptions = {
    +  bufferTime: null  // seconds of data to buffer (null = flash default of 0.1 - if AAC gappy, try up to 3 seconds)
    +}
    +
    +// when merged, soundManager.flash9Options.isMovieStar -> soundManager.defaultOptions.isMovieStar, etc.
    + +
    + +
    + +
    + +
    + +
    + +
    + +

    SoundManager Dynamic (Runtime) Properties

    + +

    Some properties are dynamic, determined at initialisation or later during runtime, and should be treated as read-only.

    + + +

    soundManager.features Object

    + +

    As certain sound functionality is only available beginning with Flash 9, soundManager.features can provide a consistent way of checking for feature support.

    + +

    The structure (intended as read-only) is currently as follows:

    + +
    soundManager.features = {
    +  buffering: [boolean],
    +  peakData: [boolean],
    +  waveformData: [boolean],
    +  eqData: [boolean],
    +  movieStar: [boolean]
    +}
    + +

    Example (checking for peakData support):

    +
    if (soundManager.features.peakData) {
    +  // do peak data-related things here
    +}
    + +

    The features object is populated at initialisation time; the current feature support tests simply check the value of soundManager.flashVersion being >= 9. This object has been added in anticipation of additional features with future versions of Flash.

    + +
    + +

    soundManager.html5Only [boolean, read-only]

    +

    This property is set during initialization and reflects whether SM2 is running in "100% HTML5 mode", based on support for required formats defined by soundManager.audioFormats.

    + +
    + +
    + +
    + +
    + +
    + +

    SoundManager Core Events

    + +

    The following events are attached to the soundManager global object and are useful for detecting the success/failure of the API's initialisation.

    +

    Keep in mind that these core events are effectively asynchronous (ie., they may fire long before or after window.onload()) and therefore should not be relied on as the "ready" event for starting your application. Use the standard "DOM content loaded" or window load events for your own initialization routines.

    + +
    + +
    onready(callback:function(status),[scope])
    +
    Queue onload()-style event listener(s), triggered when soundManager has successfully started.
    +
    Example: soundManager.onready(myOnReadyHandler); soundManager.onready(myOtherHandler);
    +
    For more detail and examples, see soundManager.onready().
    + +
    ontimeout(callback:function(status),[scope])
    +
    Queue onload()-style event listener(s), triggered when soundManager has successfully started.
    +
    Example: soundManager.ontimeout(myOnTimeoutHandler); soundManager.ontimeout(myOtherHandler);
    +
    For more detail and examples, see soundManager.ontimeout().
    + +
    onerror(status)
    +
    Deprecation note: Use the newer soundManager.ontimeout() instead of this method.
    + + +
    oninitmovie()
    +
    Deprecation note: Use the newer soundManager.ontimeout() instead of this method.
    + +
    onload()
    + +
    Deprecation note: Use the newer soundManager.onready() instead of this method.
    + + +
    + +
    + + +
    +
    + +
    + +
    + +
    + +

    SoundManager Object Collections

    + +
    +
    soundIDs[]
    +
    An array of sound ID strings, ordered by creation. Can be used to iterate through sounds{} by ID.
    +
    sounds{}
    +
    An object literal/JSON-style instance of SMSound objects indexed by sound ID (as in sounds['mySound'] or sounds.mySound), used internally by SoundManager. soundManager.getSoundById() may be used as an alternate to directly accessing this object.
    +
    + +
    + +
    +
    + +
    + +
    + +
    + +

    Object Literal Format

    + +

    Sounds can be created with instance-specific parameters in an object literal (JSON) format, where omitted parameters inherit default values as defined in soundManager.

    + +
    soundManager.createSound({
    +  id: 'mySound',
    +  url: '/path/to/some.mp3',
    +  autoLoad: true,
    +  autoPlay: false,
    +  onload: function() {
    +    alert('The sound '+this.id+' loaded!');
    +  },
    +  volume: 50
    +});
    + +

    This object can also be passed as an optional argument to the play method, overriding options set at creation time.

    + +

    For a full list of available options, see Sound Properties Object

    + +
    + + +
    + +
    + + +
    + + +
    + + +
    + + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html new file mode 100755 index 00000000..d8cd10af --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html @@ -0,0 +1,243 @@ + + + +SoundManager 2: Resources + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    + +
    +

    Licensing

    +

    BSD licensed.

    +
    + +
    +

    SoundManager 2 License

    +

    SoundManager 2 is provided under a BSD license.

    +
    + +
    + + + + + +
    + + + +
    + + + +
    + +
    + +
    + + +
    + + +
    + + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html new file mode 100755 index 00000000..86972486 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html @@ -0,0 +1,508 @@ + + + +SoundManager 2: Technical Notes + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    + +
    +
    +
    + +
    +
    +
    + +
    + +
    + +
    +

    Requirements + Specifications

    +

    What SM2 needs, and how it works.

    +
    + +
    + +
    + +

    Requirements + Specifications

    + +

    Prerequisites (client)

    + +
      +
    • HTML5 Audio() support and/or Flash plugin, version 8 or higher
    • +
    • Supported web browser + platform
    • +
    + +

    Tested Browsers and Platforms

    + +
      +
    • Firefox (all versions), Windows/Mac
    • +
    • Safari 1.3+ (Mac) / All Windows versions
    • +
    • Mobile Webkit: iOS 4.0 devices, iPad 3.2 (original iPad iOS release) and newer
    • +
    • Android (2.3+, confirmed on 2.3.3.)
    • +
    • Google Chrome (all versions/OSes)
    • +
    • Internet Explorer 5.0+, Windows
    • +
    • Opera 9.10 (slightly buggy, 9.5+ ideal), Windows/Mac
    • +
    • Netscape 8.0+, Windows/Mac
    • +
    • Firefox 1.5+, Linux (Flash 9 beta)
    • +
    + +

    In the absence of native HTML5 audio support, JavaScript-to-flash communication is used to provide Flash-based audio playback. JS-to-flash is possible through Flash 8's ExternalInterface feature, which uses a standard browser plugin architecture implemented by each browser manufacturer (see NPAPI.)

    + +

    For further JS/flash reference, see Adobe's Flash 8 documentation, under the "ExternalInterface support" page which details supported browsers.

    + +

    Of course, not all possible combinations of browser/OS have been tested. Most modern browsers and devices should work reasonably well.

    + +
    + +
    + +

    Caveats + Limitations / FAQ

    + +
    + +
    + +

    Supported sound formats (MP3 via Flash 8 and MP4/M4A/AAC via Flash 9 "MovieStar", with caveats)

    +

    SM2 uses Flash's native Sound object for loading and managing sound, so it is subject to the same limitations that Flash 8 is. Perhaps a design decision, the Flash 8 sound object only supports MP3 files through the loadSound() ActionScript method. SM2 is not able to load other sound formats, including audio-only SWF files, due to this limitation. Refer to the Flash 8 documentation for details.

    + +

    MP3 Format Caveats

    +

    Additionally, some very low and very high bitrate MP3s, and Variable Bitrate (VBR) MP3s may play either too quickly or too slowly (see "the chipmunk problem"); if you are encountering this issue, try re-encoding at a different bitrate (between 64 kbps and 192 kbps, for example.) Using Constant Bitrate (CBR) encoding may also alleviate this problem.

    +

    It has been suggested that sample rates that are neither 22/44 KHz can also contribute to this issue. 44 KHz is the standard CD-spec sample rate, and is recommended for "hi-fi" recordings.

    + +

    Looping

    +

    Perhaps due to the way Flash dynamically loads and decodes MP3 data, seamless looping doesn't seem to be fully implemented. Loops have a noticeable gap between the finish and start. This has been an issue since the original version of SoundManager. Rather than have a broken feature, the funcionality has been omitted until a solid workaround is found.

    + +

    Flash 8 limitations with multiShot (overlaying/"chorus") effects

    +

    Regarding "layering" sounds (calling play() on a sound multiple times): Even though a multi-shot option can be specified, it does not work with Flash 8; a single instance of a sound can only have one timeline. The current behaviour is that when multiShot is specified and play() is called on a currently-playing sound, it will restart from the beginning without an overlay.

    +

    However, the API does provide some creative ways (onfinish for looping, multiple sound objects for multi-shot layering) of working around these Flash limitations.

    +

    It should be noted that sounds can loop seamlessly and be layered when linked and exported to SWF from within the Flash IDE, but SoundManager does not support SWF-based audio.

    + +

    Flash 9 multiShot capabilities

    +

    The Flash 9-based version of SoundManager2 can successfully layer sounds via "multiShot", truly playing a single sound multiple times on top of itself. However the API will only call certain timing-related methods such as whileplaying() for the first play() "instance" of the sound, to avoid confusion. By contrast, simpler methods such as onfinish() will be called multiple times, one for each instance of play().

    + +

    ID3 Parsing

    +

    ID3 data can differ in formatting, version and subsequently be oddly-parsed by Flash. Values may sometimes be repeated across different fields.

    +

    ID3 info seems to fail to load for iTunes 7-edited files, perhaps due to the format or inclusion of album artwork (image data.)

    + +

    Performance Notes: Caching + RAM Obeservations

    +

    Flash appears to use the browser cache (presumably the OS' native, or closest browser,) so the browser's cache size and other settings may affect Flash's cache behaviour. It is safe to assume a 100 MB MP3 will probably not be cached, for example, but a 16 MB one most likely will be.

    +

    MP3s appear to be loaded and stored in RAM while loading over HTTP, so memory use needs to be considered for both large MP3s and streaming radio-type applications.

    + +

    Timing/Latency (JS + Flash, ExternalInterface-related)

    +

    JavaScript-to-Flash communication is not instantaneous on slower systems, but can be much better on more modern systems. Latency (timing lag/delays) can be noted in some cases from function call to sound execution. It is possible some performance analysis can help to speed up this area for timing-critical applications involving animation etc., but this area has not been thoroughly investigated yet. Brad Neuberg has some notes on speeding up ExternalInterface which may be relevant.

    +

    Flash-to-OS/hardware latency (where flash reports progress, but no sound is heard for a number of milliseconds) may also be an unfortunate reality of Flash-based audio, varying between platform and OS version etc.

    +

    Additionally, MP3 files may contain audible gaps at the beginning or end by default when encoded, even if the source (eg. WAVE) file did not. Using optional "nogap" encoding options with programs such as LAME may help to remedy this.

    +

    Finally, the useHighPerformance option may help with JS/flash lag. Using this option causes the flash movie to be placed with position:fixed on-screen at all times (though in a small, hidden box) and has been shown to notably improve performance on Mac OS X. As well, flashPollingInterval will use a lower timer value, making polling calls run as quickly as reasonably possible and increasing the frequency of calls to whileplaying(), whileloading() and other time-related events.

    +

    Use these options with caution, as overly-aggressive intervals may hinder performance if event callbacks become too frequent.

    + +
    + +
    + +
    + +
    + +
    + +

    Serving to HTML5 + Flash Clients

    +

    A few notes on HTTP response headers, configuration and so forth.

    + +
    + +
    + +

    Tips for serving audio to HTML5 + Flash Clients

    +

    HTTP response headers from your server are important. Below is a brief list of recommended practices for serving audio content to clients using HTML5, and/or Flash.

    + +

    HTML5

    + +
      +
    • Likes Content-Length HTTP response headers (can affect duration and playback events if missing.)
    • +
    • Arbitrary seeking, dynamic loading/buffering works when the server supports Byte Serving via byte ranges, also known as HTTP partials / range requests. Without this support, behaviour falls back to a Flash-like single-connection, sequential/progressive-style download.
    • +
    • Likes a proper MIME type response from the server, e.g., audio/mpeg for MP3 content.
    • +
    + +

    Flash

    + +
      +
    • Likes Content-Length HTTP response headers. When missing, duration may be unknown and certain events like whileloading() / whileplaying() may not fire.
    • +
    • Does not care about MIME type or partials in server responses.
    • +
    + +

    In summary...

    + +

    Always serve a proper Content-Length HTTP response header. For HTML5, review that HTTP partials / range requests are enabled and that you are serving the correct MIME type in your response as well.

    +

    Never apply gzip or mod_deflate compression to binary assets. It causes playback problems, costs CPU and in some cases, may even increase the transfer size.

    + + +
    + +
    + +
    + +
    + +

    How Clients Download Audio

    +

    Progressive, sequential HTTP vs. HTTP 206 partials / range requests.

    + +
    + +
    + +

    How HTML5 + Flash Clients Download Audio

    + +

    In terms of HTTP, assets are typically requested and downloaded in sequential byte order over a single connection. Flash typically works this way, but HTML5 clients can use behaviours that are closer to streaming - instead, using multiple requests for pieces of data.

    + +

    Browsers can request audio from servers either sequentially or using Byte Serving (AKA "partials"), depending on client and server capabilities. The key difference is that with byte serving, clients request data in a "streaming" fashion and can buffer at will, therefore allowing arbitrary seeking, pausing and requesting of audio data in pieces - similar to how video playback typically works on YouTube, for example. Thus, preloading and onload() is less-meaningful when byte serving is involved.

    + +

    Traditional, "progressive" download (single request)

    + +

    The typical HTTP file download can be described as follows:

    + +
      +
    • Single HTTP request, one TCP connection
    • +
    • All bytes are sent sequentially "over the wire"
    • +
    • Network connection is closed when the download completes (or fails)
    • +
    • SoundManager 2 fires relevant sound onload() callback when the connection closes and the sound is deemed to be valid
    • +
    + +

    In terms of HTTP traffic, the sequence is something like this (excluding some headers for brevity):

    + +
      +
    • Client request +
        +
      • GET some.mp3 HTTP/1.1
      • +
      +
    • +
    • + Server response +
        +
      • HTTP/1.1 200 OK
      • +
      • Content-Length: 158958
      • +
      • Connection: close
      • +
      • Content-type: audio/mpeg
      • +
      +
    + +

    Progressive downloading behaviour in SoundManager 2

    + +

    This method is typically used by Flash when requesting audio via standard HTTP, and HTML5 clients in the event that Byte Serving (HTTP 206/Partial Content) is not implemented or cannot be negotiated.

    + +
      +
    • Playback begins after a small amount of buffering, once the download has started.
    • +
    • Once started, the download progress continues until all bytes are received. Stopping or pausing playback does not cancel the download.
    • +
    • During load, a SM2 sound object's whileloading() event will fire at a regular interval with bytesLoaded, bytesTotal and duration properties updating as the file progresses. Because Flash only reflects the "amount of duration loaded", durationEstimate is provided as a means of reflecting the total duration before load has completed (at which point duration is 100% and accurate.)
    • +
    • During load, the user can only seek within the amount of data (duration) downloaded.
    • +
    • onload() fires when the connection is closed, and all bytes have been received.
    • +
    + +

    Byte Serving (partials / byte range requests, "streaming"-style delivery)

    + +

    HTML5 clients will send a Accept-ranges: bytes header in the HTTP request for an audio asset to indicate their capability for Byte Serving, along with a Range header indicating what piece of the file to download.

    +

    If the server supports partials, it will reply with a HTTP/1.1 206 Partial Content header and a Content-Range header indicating the bytes it is going to send.

    +

    It appears that servers will return the whole range in the first response unless interrupted (and when a client requests a range of "0-" as in this case), but the initial connection may be dropped by the client if it wishes to stop "buffering" at any point, or if the user tries to seek to a new position in the audio that has not yet buffered.

    + +
      +
    • + Client request +
        +
      • GET some.mp3 HTTP/1.1
      • +
      • Range: bytes=0-
      • +
      +
    • +
    • + Server response +
        +
      • HTTP/1.1 206 Partial Content
      • +
      • Accept-ranges: bytes
      • +
      • Content-length: 4237566
      • +
      • Content-Range: bytes 0-4237565/7237566
      • +
      +
    • +
    • The first response includes all bytes in this case, but a client may drop this connection and make a new range request, if needed; for example, the user may seek to a new position in the file where data is not yet available, and the client will make a new request to buffer data beginning at the appropriate offset.
    • +
    + +

    HTTP/1.1 206 Partial Content request/response example

    + +
      +
    • + Client request +
        +
      • GET some.ogg HTTP/1.1
      • +
      • Range: bytes=5210604-5275910
      • +
      • If-Range: "508107-4d8a0b4e90d26"
      • +
      +
    • +
    • + Server response +
        +
      • HTTP/1.1 206 Partial Content
      • +
      • Accept-Ranges: bytes
      • +
      • Content-length: 65307
      • +
      • Content-Range: bytes 5210604-5275910/5275911
      • +
      • Content-Type: audio/ogg
      • +
      +
    • +
    + +

    Byte Serving behaviour in SoundManager 2

    + +

    Byte Serving is automatically negotiated between client and server, and offers a number of advantages over traditional downloads. Most notably, Byte Serving is closer to a "streaming" technology and enables clients to seek, buffer and resume playback at arbitrary positions within a file once the duration is known. Larger files benefit most from this technique, since they can be handled in smaller chunks vs. being held entirely in memory a la Flash.

    + +

    While SoundManager 2 uses the same events for HTML5 and Flash regardless of transport mechanism, there are some notable differences in SoundManager 2's behaviour when using HTML5 and Byte Serving.

    + +

    Most importantly, the concept of "loaded" (i.e., preloading data and waiting for onload()) with partials is irrelevant due to the way clients are able to pause, cancel and resume requests.

    + +
      +
    • Playback begins after a small amount of buffering, once the download has started.
    • +
    • The HTML5-native canplay() event fires when playback is ready to begin. This will cause SoundManager 2 to fire a sound's onload() callback. At this point, the sound's duration should be known, but the SM2-provided bytesLoaded and bytesTotal sound properties may not be known and thus are 0/0 during load time, and 1/1 if still undefined at load time.
    • +
    • SoundManager 2 attempts to fire whileloading() events as the HTML5-native progress() event fires, but keep in mind that any "bytes loaded" data may refer to blocks (i.e., buffered sequences of data) that are non-sequential and thus bytesLoaded and bytesTotal should not be relied on as an indicator of "total load progress".
    • +
    • HTML5 clients may use their own heuristic to determine how much to buffer, if and when to pause, cancel or resume requesting data.
    • +
    • Clients may request metadata from the end of a file in some cases, as with OGG formats, in order to determine information like the total duration of the sound.
    • +
    • During load (and once the duration is known), the user can seek to any position within the file.
    • +
    • A client may drop an open request in order to request a new byte range - for example, to buffer and resume playback if the user jumps to half-way through the file where that data has not been downloaded yet.
    • +
    + +
    + +
    + +
    + +
    +

    Mobile Device Limitations

    +

    Known restrictions, quirks and annoyances relating to HTML5 + mobile Webkit (iOS / Android) software.

    +
    + +
    +

    Mobile Device Restrictions, Quirks and Issues

    +

    Mobile devices tend to be somewhat limited in terms of battery life, network connection and other resources. Furthermore, they are unlike larger (laptop/desktop) devices in that audio is often not a "shareable" resource, and only one application may be using the sound hardware at any given time. Thus, mobile devices must be treated slightly differently in terms of playing audio via JavaScript.

    +

    iOS (mobile Safari/Webkit)

    +
      +
    • Sound play() calls are blocked by the OS unless in direct response to a user event like touch or click. ("Auto-play" attempts will be blocked, and the sound may fire a suspend event in this case.) For the curious, setTimeout() calls will also result in playback being blocked.
    • +
    • Sound load() and load-related methods may also have some limitations, similar to play().
    • +
    • Only one sound may be actively playing at a time. If an other sound (or application) is playing audio, it will be stopped by the OS in order to play the new sound.
    • +
    • Chained playback (sequential / playlist-style behaviour) works when using the onfinish event handler. Otherwise, blocking occurs.
    • +
    +

    Possible Alternatives

    +

    The Webkit Audio API (possibly a future standard as the Web Audio API) allows for low-level access, manipulation and control of audio from JavaScript. This API is mostly separate from the HTML5 audio API, but will ultimately allow for better fine-grained control and mixing of sound.

    +

    Once playback is allowed, the Webkit Audio API should be able to get around many of the current HTML5 audio limitations present on iOS including multiple sound playback, volume and pan control, and dynamic filtering / processing effects. However, the API is not a standard and is not consistently supported in Webkit, let alone other browsers.

    +

    SM2 does not presently use the Webkit Audio API. It may be experimentally or more formally added at some point in the future, when the API is more universally-supported.

    +
    + +
    + +
    + +
    +

    Debug + Console Output

    +

    Console-style messaging, useful for troubleshooting start-up and runtime issues.

    +
    + +
    +

    Live Debug Output

    +

    With debug mode enabled via soundManager.setup({debugMode: true}), SM2 can write helpful troubleshooting information to JavaScript console.log()-style interfaces. Additionally, output can be written to an optional DIV element with the ID of soundmanager-debug.

    +

    soundManager.setup({consoleOnly: true}) can be applied to disable HTML output (using console.log()-only methods) as well.

    +

    Additionally, debugging within the Flash portion of SM2 is also available and set using soundManager.setup({debugFlash: true}). Debug messages are written to the flash movie itself.

    +

    For info on SoundManager 2 loading/initialization failures and how to fix them, see troubleshooting.

    + +

    Below is a live example of debug output from SM2:

    + +
    +
    + +
    +
    + +

    Flash debug output, as applicable:

    + +
    + +
    +
    + +
    + + +
    + + + +
    + + + +
    + +
    + +
    + + +
    + + +
    + + +
    + + + + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html new file mode 100755 index 00000000..5058e802 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html @@ -0,0 +1,691 @@ + + + +SoundManager 2: JavaScript Sound For The Web + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + +
    + +
    + +
    + +
    + + +
    +

    + SM2 options:  +html5 +  |  + -html5 +  |  + +debug +

    +
    + +
    + + +
    + +
    + +
    + +
    + +
    + +
    + +
    + SoundManager 2 speaker logo +
    + +

    SoundManager 2 makes it easier to play audio using JavaScript.

    + +

    + Using HTML5 and Flash, SoundManager 2 provides reliable cross-platform audio under a single JavaScript API.  Get SoundManager 2 +

    + +
    + +
    + +
    + +
    + +
    + +

    Speak and be heard

    +

    More sound, in more places

    + +

    Despite being one of the senses, sound has largely been missing from the web due to inconsistent technology support. SoundManager 2 bridges this gap, making it easier to use audio across a growing variety of devices and platforms, both desktop and mobile.

    + +

    Getting started is pretty easy, too.

    + +

    A few live examples:

    + +
    + +
    + +
    + +
    + + + +
    + Random +
    + + + + + +
    + +
    + coins.mp3 +    glass0.mp3 +    glass1.mp3 + + + +
    + +
    + +
    +
    + +
    + +
    + + +
    +
    + +

    HTML5 + flash hybrid

    +

    Complexity, reduced

    + +

    Supporting HTML5 audio can be tedious in modern browsers, let alone legacy ones. With real-world visitors using browsers ranging from mobile Safari to IE 6 across a wide range of devices, there can be many support cases to consider.

    + +

    SoundManager 2 gives you a single, powerful API that supports both new and old, using HTML5 audio where supported and optional Flash-based fallback where needed. Ideally when using SoundManager 2, audio "just works."

    + +
    +
      +
    • Desktop support: Windows, Mac OS, Linux
    • +
    • Laptop/tablet support: Windows, Mac OS, Linux / Blackberry Playbook, Kindle Fire + other HTML5/Flash devices
    • +
    • iPhone support: iOS 4.0 and newer
    • +
    • iPad support: Version 1.0 (iOS 3.2) and newer
    • +
    • Android OS supporting HTML5 and/or Flash (Version 2.3 or newer)
    • +
    + The details: how it works » +
    + +
    +
    + +
    +
    +

    The ginsu knife: 11 KB

    +

    Big features, small footprint

    +

    But wait, there's more!

    +

    Performance is an important metric, too. SoundManager 2 packs a comprehensive, feature-rich API into as little as 11 KB over the wire when optimized; that's less than 8% of the original, uncompressed file size.

    +

    SM2 is self-contained, having no external dependencies, and is compatible with popular JavaScript frameworks.

    +

    The source code is BSD-licensed and is provided in fully-commented, non-debug and compiler-optimized "minified" versions appropriate for development and production use.

    +
    +
    + +
    + + +
    + +
    +
    + +

    Basic

    +

    Playable links and playlists

    + +

    These demos use unordered lists with MP3 links that play in-place; the UI is easily customized via CSS.

    + + + + + +
    + +

    A richer playlist theme with optional time, seekable progress bar and a VU meter where supported:

    + + + + +
    +
    + +
    +
    + +

    Shiny

    +

    Data visualization features

    + +

    The 360° player UI demo uses <canvas> and includes options for waveform and spectrum analysis data via Flash 9, adding beautiful visual feedback to the interface.

    + +

    Seven Or Eight Days courtesy of Adrian Glynn, from the album Bruise. For more, see the music video.

    + + + + + +
    +
    + +
    + +
    + +

    Experimental

    +

    Advanced prototypes

    + +

    The Cassette Tape UI is a skinnable player based on the TDK MA-R90 cassette tape, a classic design from 1982.

    + +
    + Cassette Tape UI Prototype Screenshot +
    + +

    Remember Type IV, Metal & Chromium/CrO2? Those were the days.

    + +

    The "Wheels Of Steel" started as a simple CSS prototype, and evolved to replicate most of the UI and functionality of a traditional DJ set-up. Pitch bending, scratch and EQ effects are present where supported.

    +

    wheelsofsteel.net: Online turntable demo (screenshot)

    +

    The Wheels Of Steel, a browser-based DJ turntable prototype. For the tech details, read An Ode To Turntables (in HTML.)

    + +
    +
    + +
    + +
    + +
    +
    + +

    Getting started

    + +

    Basic SoundManager 2 set-up

    + +

    Including the script, configuring the url and registering an onready() callback:

    + +
    <script src="soundmanager2.js"></script>
    +<script>
    +soundManager.setup({
    +  // where to find flash audio SWFs, as needed
    +  url: '/path/to/swf-files/',
    +  onready: function() {
    +    // SM2 is ready to play audio!
    +  }
    +});
    +</script>
    + +

    Upon execution of soundmanager2.js, SM2 will determine what Flash SWF to load (if any) based on the path defined in soundManager.url.

    +

    After successful initialization, soundManager.onready() will fire and sounds can be played.

    +

    By default, SM2 uses a Flash 8-based SWF build. Some additional features are available when using the Flash 9-based build.

    + +

    For a live example, see the basic template demo.

    + +
    + +
    + + +
    + +
    + +

    Playing audio

    +

    Basic playback control

    + +

    Once soundManager.onready() has fired, sounds can be loaded and played.

    + +

    Creating and playing a sound object

    + +
    // create "mySound"...
    +var mySound = soundManager.createSound({
    +  url: '/path/to/an.mp3'
    +});
    +
    +// ...and play it
    +mySound.play();
    +
    + +

    Additional options and events can be specified when loading and playing sounds. For more examples of playback features, see API Demos.

    + +
    + +
    + +
    + +
    + +
    +
    + +

    Bonus

    +

    Additional demos

    + +

    + Examples using multi-track playback, progress and combinations of sound and animation: +

    + +
      + +
    • +

      Armor Alley (game)

      + Armor Alley: Web Prototype (demo screenshot) +
    • + +
    • +

      SURVIVOR remake

      + SURVIVOR (C64 game remake) demo screenshot +
    • + +
    • +

      Drum Machine

      + MPC (drum machine) demo screenshot +
    • + +
    • +

      Christmas Lights

      + Smash Christmas Lights demo +
    • + +
    + +

    "Audio sprites" (sound segments / samples) demo

    + +

    With sound playback options like from and to, you can play portions of a larger, single-file "sprite" of many sounds.

    + +

    + "Fitter, Happier" waveform screenshot +

    + + +

    + For more live examples, see the API Demos. +

    + +
    +
    + +
    +
    + +

    Elsewhere

    +

    As heard on TV the internets

    + +

    A few nifty places SoundManager 2 has been seen in use on the Wild World Web:

    + + + +

    Articles and presentations

    + +

    Some other words, pictures and video on the subject of HTML5 and web audio:

    + + + +

    Credits and thank-yous

    + +
      +
    • Icons: Desktop / mobile / iOS device iconography via glyphish.com (CC). Tile background: "Tiny Grid". Homepage header typeface: Chunk (Five) by Meredith Mandel (OFL).
    • +
    • Music: Seven Or Eight Days courtesy of Adrian Glynn. Graffiti Sex courtesy of The Fugitives, from the album In Streetlight Communion. I Tried and People Asking courtesy of SonReal.
    • +
    + +
    + +
    + + + + +
    + +
    + +
    +
    + +

    Technical overview

    + +

    HTML5 audio + optional Flash fallback

    + +
      +
    • 100% Flash-free audio on iPad, iPhone (iOS4) and other HTML5-enabled devices + browsers
    • +
    • Invisible Flash SWF provides HTML5 fallback as needed
    • +
    • API is consistent whether using HTML5 or Flash
    • +
    • See useHTML5Audio for implementation details
    • +
    + +
    +
    + +
    +
    + +

    API specifics

    +

    Basic API features (HTML5, Flash 8*)

    + +
      +
    • Load, stop, play, pause, mute, seek, pan*, volume control from JavaScript
    • +
    • Events: onload(), whileloading(), whileplaying(), onfinish() and more
    • +
    • ID3V1 + ID3V2 tag support for MP3s (title, artist, genre etc.)*
    • +
    + +
    + +

    Additional Flash 9-based API features

    + +
      +
    • RTMP / Flash Media Server streaming support (experimental) - see serverURL
    • +
    • MPEG-4 (AAC, HE-AAC, H.264) audio support
    • +
    • "MultiShot" play (layered/chorusing effects)
    • +
    • Waveform/frequency spectrum data
    • +
    • Peak (L/R channel volume) data
    • +
    • Audio buffering state/event handling
    • +
    + +
    +
    + +
    +
    + +

    Everything else

    +

    Documentation, tools and demos

    + + + +
    +

    Not only do you get the ginsu knife...

    +

    Even more demos and examples using the SoundManager 2 API...

    + + + +
    +
    + + + +
    + + + + +
    + +
    + +
     
    + + + +
    + + + +
    + +
    + + + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt new file mode 100755 index 00000000..1a17182f --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt @@ -0,0 +1,29 @@ +Software License Agreement (BSD License) + +Copyright (c) 2007, Scott Schiller (schillmania.com) +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +* Neither the name of schillmania.com nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission from schillmania.com. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js new file mode 100755 index 00000000..7a645020 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js @@ -0,0 +1,110 @@ +/** @license + + + SoundManager 2: JavaScript Sound for the Web + ---------------------------------------------- + http://schillmania.com/projects/soundmanager2/ + + Copyright (c) 2007, Scott Schiller. All rights reserved. + Code provided under the BSD License: + http://schillmania.com/projects/soundmanager2/license.txt + + V2.97a.20131201 +*/ +(function(k,g){function fa(fa,wa){function ga(b){return c.preferFlash&&F&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function s(b){return function(d){var e=this._s;!e||!e._a?(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD(sb+"Ignoring "+d.type),d=null):d=b.call(this,d);return d}}this.setupOptions={url:fa||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3, +wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null, +usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1}, +opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=wa||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20131201";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns= +{flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only= +!1;var Va,c=this,Wa=null,l=null,sb="HTML5::",A,u=navigator.userAgent,U=k.location.href.toString(),p=document,xa,Xa,ya,m,G=[],za=!0,C,V=!1,W=!1,q=!1,t=!1,ha=!1,n,tb=0,X,B,Aa,O,Ba,M,P,Q,Ya,Ca,Da,ia,I,ja,Ea,R,Fa,Y,ka,la,S,Za,Ga,$a=["log","info","warn","error"],ab,Ha,bb,Z=null,Ia=null,r,Ja,T,cb,ma,na,J,w,$=!1,Ka=!1,db,eb,fb,oa=0,aa=null,pa,N=[],ba,z=null,gb,qa,ca,K,ra,La,hb,x,ib=Array.prototype.slice,E=!1,Ma,F,Na,jb,H,kb,Oa,sa,lb=0,ta=u.match(/(ipad|iphone|ipod)/i),mb=u.match(/android/i),L=u.match(/msie/i), +ub=u.match(/webkit/i),ua=u.match(/safari/i)&&!u.match(/chrome/i),Pa=u.match(/opera/i),Qa=u.match(/(mobile|pre\/|xoom)/i)||ta||mb,Ra=!U.match(/usehtml5audio/i)&&!U.match(/sm2\-ignorebadua/i)&&ua&&!u.match(/silk/i)&&u.match(/OS X 10_6_([3-7])/i),da=k.console!==g&&console.log!==g,Sa=p.hasFocus!==g?p.hasFocus():null,va=ua&&(p.hasFocus===g||!p.hasFocus()),nb=!va,ob=/(mp3|mp4|mpa|m4a|m4b)/i,ea=p.location?p.location.protocol.match(/http/i):null,pb=!ea?"http://":"",qb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, +rb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),vb=RegExp("\\.("+rb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!ea;var Ta;try{Ta=Audio!==g&&(Pa&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(wb){Ta=!1}this.hasHTML5=Ta;this.setup=function(b){var d=!c.url;b!==g&&(q&&z&&c.ok()&&(b.flashVersion!==g||b.url!==g||b.html5Test!==g))&&J(r("setupLate"));Aa(b);b&&(d&&(Y&&b.url!==g)&&c.beginDelayedInit(), +!Y&&(b.url!==g&&"complete"===p.readyState)&&setTimeout(R,1));return c};this.supported=this.ok=function(){return z?q&&!t:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return A(c)||p[c]||k[c]};this.createSound=function(b,d){function e(){f=ma(f);c.sounds[f.id]=new Va(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var a,f;a=null;a="soundManager.createSound(): "+r(!q?"notReady":"notOK");if(!q||!c.ok())return J(a),!1;d!==g&&(b={id:b,url:d});f=B(b);f.url=pa(f.url);void 0===f.id&&(f.id=c.setupOptions.idPrefix+ +lb++);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+r("badID",f.id),2);c._wD("soundManager.createSound(): "+f.id+(f.url?" ("+f.url+")":""),1);if(w(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];if(qa(f))a=e(),c._wD(f.id+": Using HTML5"),a._setup_html5(f);else{if(c.html5Only)return c._wD(f.id+": No HTML5 support for this sound, and no Flash. Exiting."),e();if(c.html5.usingFlash&&f.url&&f.url.match(/data\:/i))return c._wD(f.id+ +": data: URIs not supported via Flash. Exiting."),e();8a.instanceCount?(p(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):(c._wD(a.id+": Cloning Audio() for instance #"+a.instanceCount+"..."),h=new Audio(a._iO.url),v=function(){x.remove(h,"ended",v);a._onfinish(a);ra(h);h=null},k=function(){x.remove(h,"canplay",k);try{h.currentTime=a._iO.position/1E3}catch(c){J(a.id+": multiShot play() failed to apply position of "+a._iO.position/1E3)}h.play()},x.add(h,"ended",v),void 0!==a._iO.volume&&(h.volume=Math.max(0,Math.min(1,a._iO.volume/ +100))),a.muted&&(h.muted=!0),a._iO.position?x.add(h,"canplay",k):h.play()):(y=l._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9===m&&!y&&(c._wD(e+"No sound hardware, or 32-sound ceiling hit",2),a._iO.onplayerror&&a._iO.onplayerror.apply(a)))}return a};this.stop=function(b){var d=a._iO;1===a.playState&&(c._wD(a.id+": stop()"),a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),Ua(),d.to&&a.clearOnPosition(d.to),a.isHTML5?a._a&&(b=a.position, +a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),v()):(l._stop(a.id,b),d.serverURL&&a.unload()),a.instanceCount=0,a._iO={},d.onstop&&d.onstop.apply(a));return a};this.setAutoPlay=function(b){c._wD(a.id+": Autoplay turned "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&(!a.instanceCount&&1===a.readyState)&&(a.instanceCount++,c._wD(a.id+": Incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition= +function(b){b===g&&(b=0);var d=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!==b){c._wD(a.id+": setPosition("+b+")");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD(a.id+": setPosition("+b+") failed: "+e.message,2)}}}else if(b)return c._wD(a.id+": setPosition("+b+"): Cannot seek yet, sound not ready", +2),a;a.paused&&a._onTimer(!0)}}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD(a.id+": pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),v()):(b||b===g)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;c._wD(a.id+": resume()");a.paused=!1; +a.playState=1;a.isHTML5?(a._setup_html5().play(),p()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD(a.id+": togglePause()");if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan=b; +c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,d){b===g&&(b=100);d===g&&(d=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id, +b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){D.push({position:parseInt(b,10),method:c,scope:d!==g?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-= +1;0<=b;b--)c=D[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=D.length;if(!b)return!1;for(b-=1;0<=b;b--)c=D[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};z=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.id+': "To" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.id+': Playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};null!==d&&!isNaN(d)&& +(b.position=d,b.multiShot=!1,f());return b};q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};Ua=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};p=function(){a.isHTML5&&db(a)};v=function(){a.isHTML5&&eb(a)};f=function(b){b||(D=[],u=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate= +null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,E&&(Wa=c);a.isHTML5=!0;a._a=c;c._s=a;k();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};k=function(){if(a._a._added_events)return!1; +var b;a._a._added_events=!0;for(b in H)H.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,H[b],!1);return!0};h=function(){var b;c._wD(a.id+": Removing event listeners");a._a._added_events=!1;for(b in H)H.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,H[b],!1)};this._onload=function(b){var d=!!b||!a.isHTML5&&8===m&&a.duration;b=a.id+": ";c._wD(b+(d?"onload()":"Failed to load / invalid sound?"+(!a.duration?" Zero-length duration reported.":" -")+" ("+a.url+")"),d?1:2);!d&&!a.isHTML5&&(!0===c.sandbox.noRemote&& +c._wD(b+r("noNet"),1),!0===c.sandbox.noLocal&&c._wD(b+r("noLocal"),1));a.loaded=d;a.readyState=d?3:2;a._onbufferchange(0);a._iO.onload&&sa(a,function(){a._iO.onload.apply(a,[d])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD(a.id+": Buffer state change: "+b),a._iO.onbufferchange.apply(a));return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD(a.id+": Playback suspended"),a._iO.onsuspend.apply(a)); +return!0};this._onfailure=function(b,d,e){a.failures++;c._wD(a.id+": Failures \x3d "+a.failures);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,d,e);else c._wD(a.id+": Ignoring failure")};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount&&(a.instanceCount--,a.instanceCount||(Ua(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},v(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b))c._wD(a.id+ +": onfinish()"),sa(a,function(){b.apply(a)})};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var h=a._iO; +if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()? +new Audio(null):new Audio:null,e,a,f={},k,h;k=c.audioFormats;for(e in k)if(k.hasOwnProperty(e)&&(a="audio/"+e,f[e]=b(k[e].type),f[a]=f[e],e.match(ob)?(c.flash[e]=!0,c.flash[a]=!0):(c.flash[e]=!1,c.flash[a]=!1),k[e]&&k[e].related))for(h=k[e].related.length-1;0<=h;h--)f["audio/"+k[e].related[h]]=f[e],c.html5[k[e].related[h]]=f[e],c.flash[k[e].related[h]]=f[e];f.canPlayType=d?b:null;c.html5=B(c.html5,f);c.html5.usingFlash=gb();z=c.html5.usingFlash;return!0};I={notReady:"Unavailable - wait until onready() has fired.", +notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash \x3d true for more security details (output goes to SWF.)",checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+p.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/", +waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s",badID:'Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded", +onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down", +queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...",fbLoaded:"Flash loaded",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)", +noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout \x3d 0 (infinite) for off-screen, mobile flash case",needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.",policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.', +setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().",noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready.",reset:"soundManager.reset(): Removing event callbacks",mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device."};r=function(){var b, +c,e,a;b=ib.call(arguments);c=b.shift();if((a=I&&I[c]?I[c]:"")&&b&&b.length){c=0;for(e=b.length;cm)&&(c._wD(r("needfl9")),c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8b&&(d=!0));setTimeout(function(){b=c.getMoviePercent();if(d)return $=!1,c._wD(r("waitSWF")),k.setTimeout(Q,1),!1;q||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+(0===b?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash? +" "+r("checkSWF"):""),2),!ea&&b&&(n("localFail",2),c.debugFlash||n("tryDebug",2)),0===b&&c._wD(r("swf404",c.url),1),C("flashtojs",!1,": Timed out"+ea?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));!q&&nb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ja(),n("waitForever")):!c.useFlashBlock&&ba?Ca():(n("waitForever"),M({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}})):0===c.flashLoadTimeout?n("waitForever"):!c.useFlashBlock&&ba?Ca(): +Ha(!0))},c.flashLoadTimeout)};ia=function(){if(Sa||!va)return x.remove(k,"focus",ia),!0;Sa=nb=!0;n("gotFocus");$=!1;Q();x.remove(k,"focus",ia);return!0};Oa=function(){N.length&&(c._wD("SoundManager 2: "+N.join(" "),1),N=[])};kb=function(){Oa();var b,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&d.push(b+" \x3d "+c.html5[b]+(!c.html5[b]&&z&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&z?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required? +"required, ":"")+"and no flash support)":""));c._wD("SoundManager 2 HTML5 support: "+d.join(", "),1)}};X=function(b){if(q)return!1;if(c.html5Only)return n("sm2Loaded"),q=!0,P(),C("onload",!0),!0;var d=!0,e;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())q=!0;e={type:!F&&z?"NO_FLASH":"INIT_TIMEOUT"};c._wD("SoundManager 2 "+(t?"failed to load":"loaded")+" ("+(t?"Flash security/load error":"OK")+")",t?2:1);t||b?(c.useFlashBlock&&c.oMC&&(c.oMC.className=T()+" "+(null===c.getMoviePercent()? +"swf_timedout":"swf_error")),M({type:"ontimeout",error:e,ignoreInit:!0}),C("onload",!1),S(e),d=!1):C("onload",!0);t||(c.waitForWindowLoad&&!ha?(n("waitOnload"),x.add(k,"load",P)):(c.waitForWindowLoad&&ha&&n("docLoaded"),P()));return d};Xa=function(){var b,d=c.setupOptions;for(b in d)d.hasOwnProperty(b)&&(c[b]===g?c[b]=d[b]:c[b]!==d[b]&&(c.setupOptions[b]=c[b]))};ya=function(){if(q)return n("didInit"),!1;if(c.html5Only)return q||(x.remove(k,"load",c.beginDelayedInit),c.enabled=!0,X()),!0;ja();try{l._externalInterfaceTest(!1), +Za(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,C("jstoflash",!0),c.html5Only||x.add(k,"unload",xa)}catch(b){return c._wD("js/flash exception: "+b.toString()),C("jstoflash",!1),S({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),Ha(!0),X(),!1}X();x.remove(k,"load",c.beginDelayedInit);return!0};R=function(){if(Y)return!1;Y=!0;Xa();Ga();var b=null,b=null,d=U.toLowerCase();-1!==d.indexOf("sm2-usehtml5audio\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-usehtml5audio\x3d")+ +18),da&&console.log((b?"Enabling ":"Disabling ")+"useHTML5Audio via URL parameter"),c.setup({useHTML5Audio:b}));-1!==d.indexOf("sm2-preferflash\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-preferflash\x3d")+16),da&&console.log((b?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.setup({preferFlash:b}));!F&&c.hasHTML5&&(c._wD("SoundManager 2: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));hb();!F&&z&&(N.push(I.needFlash), +c.setup({flashLoadTimeout:1}));p.removeEventListener&&p.removeEventListener("DOMContentLoaded",R,!1);ja();return!0};La=function(){"complete"===p.readyState&&(R(),p.detachEvent("onreadystatechange",La));return!0};Fa=function(){ha=!0;x.remove(k,"load",Fa)};Ea=function(){if(Qa&&((!c.setupOptions.useHTML5Audio||c.setupOptions.preferFlash)&&N.push(I.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ta||mb&&!u.match(/android\s2\.3/i)))N.push(I.globalHTML5),ta&&(c.ignoreFlash=!0),E= +!0};Ea();Na();x.add(k,"focus",ia);x.add(k,"load",Q);x.add(k,"load",Fa);p.addEventListener?p.addEventListener("DOMContentLoaded",R,!1):p.attachEvent?p.attachEvent("onreadystatechange",La):(C("onload",!1),S({type:"NO_DOM2_EVENTS",fatal:!0}))}var wa=null;if(void 0===k.SM2_DEFER||!SM2_DEFER)wa=new fa;k.SoundManager=fa;k.soundManager=wa})(window); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js new file mode 100755 index 00000000..d7227094 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js @@ -0,0 +1,81 @@ +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20131201 + */ +(function(g,k){function U(U,ka){function V(b){return c.preferFlash&&v&&!c.ignoreFlash&&c.flash[b]!==k&&c.flash[b]}function q(b){return function(c){var d=this._s;return!d||!d._a?null:b.call(this,c)}}this.setupOptions={url:U||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0, +html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null, +ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1},opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1}, +wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=ka||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20131201";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features= +{buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var Ja,c=this,Ka=null,l=null,W,s=navigator.userAgent,La=g.location.href.toString(),n=document,la,Ma,ma,m,x=[],K=!1,L=!1,p=!1,y=!1,na=!1,M,w,oa,X,pa,D,E,F,Na,qa,ra,Y,sa,Z,ta,G,ua,N,va,$,H,Oa,wa,Pa,xa,Qa,O=null,ya=null,P,za,I,aa,ba,r,Q=!1,Aa=!1,Ra,Sa,Ta,ca=0,R=null,da,Ua=[],S,u=null,Va,ea,T,z,fa,Ba,Wa,t,fb=Array.prototype.slice,A=!1,Ca,v,Da, +Xa,B,ga,Ya=0,ha=s.match(/(ipad|iphone|ipod)/i),Za=s.match(/android/i),C=s.match(/msie/i),gb=s.match(/webkit/i),ia=s.match(/safari/i)&&!s.match(/chrome/i),Ea=s.match(/opera/i),Fa=s.match(/(mobile|pre\/|xoom)/i)||ha||Za,$a=!La.match(/usehtml5audio/i)&&!La.match(/sm2\-ignorebadua/i)&&ia&&!s.match(/silk/i)&&s.match(/OS X 10_6_([3-7])/i),Ga=n.hasFocus!==k?n.hasFocus():null,ja=ia&&(n.hasFocus===k||!n.hasFocus()),ab=!ja,bb=/(mp3|mp4|mpa|m4a|m4b)/i,Ha=n.location?n.location.protocol.match(/http/i):null,cb= +!Ha?"http://":"",db=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,eb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),hb=RegExp("\\.("+eb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!Ha;var Ia;try{Ia=Audio!==k&&(Ea&&opera!==k&&10>opera.version()?new Audio(null):new Audio).canPlayType!==k}catch(ib){Ia=!1}this.hasHTML5=Ia;this.setup=function(b){var e=!c.url;b!==k&&p&&u&&c.ok();oa(b);b&& +(e&&(N&&b.url!==k)&&c.beginDelayedInit(),!N&&(b.url!==k&&"complete"===n.readyState)&&setTimeout(G,1));return c};this.supported=this.ok=function(){return u?p&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return W(b)||n[b]||g[b]};this.createSound=function(b,e){function d(){a=aa(a);c.sounds[a.id]=new Ja(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!p||!c.ok())return!1;e!==k&&(b={id:b,url:e});a=w(b);a.url=da(a.url);void 0===a.id&&(a.id=c.setupOptions.idPrefix+Ya++);if(r(a.id, +!0))return c.sounds[a.id];if(ea(a))f=d(),f._setup_html5(a);else{if(c.html5Only||c.html5.usingFlash&&a.url&&a.url.match(/data\:/i))return d();8a.instanceCount?(n(),f=a._setup_html5(),a.setPosition(a._iO.position),f.play()):(h=new Audio(a._iO.url),g=function(){t.remove(h,"ended",g);a._onfinish(a);fa(h);h=null},J=function(){t.remove(h,"canplay",J);try{h.currentTime=a._iO.position/1E3}catch(b){}h.play()},t.add(h,"ended",g),void 0!==a._iO.volume&&(h.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(h.muted=!0),a._iO.position? +t.add(h,"canplay",J):h.play()):(f=l._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9===m&&!f&&a._iO.onplayerror&&a._iO.onplayerror.apply(a))}return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),x(),c.to&&a.clearOnPosition(c.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()):(l._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount= +0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&!a.instanceCount&&1===a.readyState&&a.instanceCount++)};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===k&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!== +b)try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){}}else if(b)return a;a.paused&&a._onTimer(!0)}}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),g()):(b||b===k)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b= +a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),n()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===k&&(b=0);c===k&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan= +b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,e){b===k&&(b=100);e===k&&(e=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;e||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==k;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id, +b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,e){p.push({position:parseInt(b,10),method:c,scope:e!==k?e:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-= +1;0<=b;b--)c=p[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=p.length;if(!b)return!1;for(b-=1;0<=b;b--)c=p[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};y=function(){var b=a._iO,c=b.from,e=b.to,d,f;f=function(){a.clearOnPosition(e,f);a.stop()};d=function(){if(null!==e&&!isNaN(e))a.onPosition(e,f)};null!==c&&!isNaN(c)&&(b.position=c,b.multiShot=!1,d());return b};q=function(){var b,c=a._iO.onposition; +if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};x=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};n=function(){a.isHTML5&&Ra(a)};g=function(){a.isHTML5&&Sa(a)};f=function(b){b||(p=[],u=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[]; +a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,h={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,A&&(Ka=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,B[b],!1);return!0};J=function(){var b;a._a._added_events= +!1;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,B[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);a._iO.onload&&ga(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a); +return!0};this._onfailure=function(b,c,e){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,c,e)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount||(x(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&ga(a,function(){b.apply(a)}))};this._whileloading=function(b,c,e,d){var f=a._iO;a.bytesLoaded= +b;a.bytesTotal=c;a.duration=Math.floor(e);a.bufferLength=d;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,e,d,f){var h=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()?new Audio(null):new Audio:null,d,a,f={},h,g;h=c.audioFormats;for(d in h)if(h.hasOwnProperty(d)&&(a="audio/"+d,f[d]=b(h[d].type),f[a]=f[d],d.match(bb)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),h[d]&&h[d].related))for(g=h[d].related.length-1;0<=g;g--)f["audio/"+h[d].related[g]]=f[d],c.html5[h[d].related[g]]=f[d],c.flash[h[d].related[g]]=f[d];f.canPlayType=e?b:null;c.html5=w(c.html5,f);c.html5.usingFlash= +Va();u=c.html5.usingFlash;return!0};sa={};P=function(){};aa=function(b){8===m&&(1m)&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)": +" (AS2/Flash 8)");8b&&(e=!0));setTimeout(function(){b=c.getMoviePercent();if(e)return Q=!1,g.setTimeout(F,1),!1;!p&&ab&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&za():!c.useFlashBlock&&S?qa():D({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&S?qa():xa(!0)))},c.flashLoadTimeout)};Y=function(){if(Ga||!ja)return t.remove(g,"focus", +Y),!0;Ga=ab=!0;Q=!1;F();t.remove(g,"focus",Y);return!0};M=function(b){if(p)return!1;if(c.html5Only)return p=!0,E(),!0;var e=!0,d;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())p=!0;d={type:!v&&u?"NO_FLASH":"INIT_TIMEOUT"};if(y||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=I()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),D({type:"ontimeout",error:d,ignoreInit:!0}),H(d),e=!1;y||(c.waitForWindowLoad&&!na?t.add(g,"load",E):E());return e};Ma=function(){var b,e=c.setupOptions; +for(b in e)e.hasOwnProperty(b)&&(c[b]===k?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};ma=function(){if(p)return!1;if(c.html5Only)return p||(t.remove(g,"load",c.beginDelayedInit),c.enabled=!0,M()),!0;Z();try{l._externalInterfaceTest(!1),Oa(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,c.html5Only||t.add(g,"unload",la)}catch(b){return H({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),xa(!0),M(),!1}M();t.remove(g,"load",c.beginDelayedInit);return!0}; +G=function(){if(N)return!1;N=!0;Ma();wa();!v&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Wa();!v&&u&&(Ua.push(sa.needFlash),c.setup({flashLoadTimeout:1}));n.removeEventListener&&n.removeEventListener("DOMContentLoaded",G,!1);Z();return!0};Ba=function(){"complete"===n.readyState&&(G(),n.detachEvent("onreadystatechange",Ba));return!0};ua=function(){na=!0;t.remove(g,"load",ua)};ta=function(){if(Fa&&(c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ha||Za&&!s.match(/android\s2\.3/i)))ha&& +(c.ignoreFlash=!0),A=!0};ta();Da();t.add(g,"focus",Y);t.add(g,"load",F);t.add(g,"load",ua);n.addEventListener?n.addEventListener("DOMContentLoaded",G,!1):n.attachEvent?n.attachEvent("onreadystatechange",Ba):H({type:"NO_DOM2_EVENTS",fatal:!0})}var ka=null;if(void 0===g.SM2_DEFER||!SM2_DEFER)ka=new U;g.SoundManager=U;g.soundManager=ka})(window); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js new file mode 100755 index 00000000..12b30e2b --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js @@ -0,0 +1,2660 @@ +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20131201 + */ + +/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */ +/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */ + +(function(window, _undefined) { +"use strict"; +var soundManager = null; +function SoundManager(smURL, smID) { + this.setupOptions = { + 'url': (smURL || null), + 'flashVersion': 8, + 'debugMode': true, + 'debugFlash': false, + 'useConsole': true, + 'consoleOnly': true, + 'waitForWindowLoad': false, + 'bgColor': '#ffffff', + 'useHighPerformance': false, + 'flashPollingInterval': null, + 'html5PollingInterval': null, + 'flashLoadTimeout': 1000, + 'wmode': null, + 'allowScriptAccess': 'always', + 'useFlashBlock': false, + 'useHTML5Audio': true, + 'html5Test': /^(probably|maybe)$/i, + 'preferFlash': false, + 'noSWFCache': false, + 'idPrefix': 'sound' + }; + this.defaultOptions = { + 'autoLoad': false, + 'autoPlay': false, + 'from': null, + 'loops': 1, + 'onid3': null, + 'onload': null, + 'whileloading': null, + 'onplay': null, + 'onpause': null, + 'onresume': null, + 'whileplaying': null, + 'onposition': null, + 'onstop': null, + 'onfailure': null, + 'onfinish': null, + 'multiShot': true, + 'multiShotEvents': false, + 'position': null, + 'pan': 0, + 'stream': true, + 'to': null, + 'type': null, + 'usePolicyFile': false, + 'volume': 100 + }; + this.flash9Options = { + 'isMovieStar': null, + 'usePeakData': false, + 'useWaveformData': false, + 'useEQData': false, + 'onbufferchange': null, + 'ondataerror': null + }; + this.movieStarOptions = { + 'bufferTime': 3, + 'serverURL': null, + 'onconnect': null, + 'duration': null + }; + this.audioFormats = { + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], + 'required': true + }, + 'mp4': { + 'related': ['aac','m4a','m4b'], + 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], + 'required': false + }, + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + 'opus': { + 'type': ['audio/ogg; codecs=opus', 'audio/opus'], + 'required': false + }, + 'wav': { + 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], + 'required': false + } + }; + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + this.versionNumber = 'V2.97a.20131201'; + this.version = null; + this.movieURL = null; + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.didFlashBlock = false; + this.filePattern = null; + this.filePatterns = { + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + }; + this.features = { + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + }; + this.sandbox = { + }; + this.html5 = { + 'usingFlash': null + }; + this.flash = {}; + this.html5Only = false; + this.ignoreFlash = false; + var SMSound, + sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [], + canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, + is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)), + mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid), + isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), + hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000, + emptyURL = 'about:blank', + emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', + overHTTP = (doc.location?doc.location.protocol.match(/http/i):null), + http = (!overHTTP ? 'http:/'+'/' : ''), + netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, + netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'], + netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; + this.useAltURL = !overHTTP; + swfCSS = { + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', + 'swfTimedout': 'swf_timedout', + 'swfLoaded': 'swf_loaded', + 'swfUnblocked': 'swf_unblocked', + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + }; + this.hasHTML5 = (function() { + try { + return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined); + } catch(e) { + return false; + } + }()); + this.setup = function(options) { + var noURL = (!sm2.url); + if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) { + } + assign(options); + if (options) { + if (noURL && didDCLoaded && options.url !== _undefined) { + sm2.beginDelayedInit(); + } + if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') { + setTimeout(domContentLoaded, 1); + } + } + return sm2; + }; + this.ok = function() { + return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5)); + }; + this.supported = this.ok; + this.getMovie = function(smID) { + return id(smID) || doc[smID] || window[smID]; + }; + this.createSound = function(oOptions, _url) { + var cs, cs_string, options, oSound = null; + if (!didInit || !sm2.ok()) { + return false; + } + if (_url !== _undefined) { + oOptions = { + 'id': oOptions, + 'url': _url + }; + } + options = mixin(oOptions); + options.url = parseURL(options.url); + if (options.id === undefined) { + options.id = sm2.setupOptions.idPrefix + (idCounter++); + } + if (idCheck(options.id, true)) { + return sm2.sounds[options.id]; + } + function make() { + options = loopFix(options); + sm2.sounds[options.id] = new SMSound(options); + sm2.soundIDs.push(options.id); + return sm2.sounds[options.id]; + } + if (html5OK(options)) { + oSound = make(); + oSound._setup_html5(options); + } else { + if (sm2.html5Only) { + return make(); + } + if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) { + return make(); + } + if (fV > 8) { + if (options.isMovieStar === null) { + options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern))); + } + } + options = policyFix(options, cs); + oSound = make(); + if (fV === 8) { + flash._createSound(options.id, options.loops||1, options.usePolicyFile); + } else { + flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile); + if (!options.serverURL) { + oSound.connected = true; + if (options.onconnect) { + options.onconnect.apply(oSound); + } + } + } + if (!options.serverURL && (options.autoLoad || options.autoPlay)) { + oSound.load(options); + } + } + if (!options.serverURL && options.autoPlay) { + oSound.play(); + } + return oSound; + }; + this.destroySound = function(sID, _bFromSound) { + if (!idCheck(sID)) { + return false; + } + var oS = sm2.sounds[sID], i; + oS._iO = {}; + oS.stop(); + oS.unload(); + for (i = 0; i < sm2.soundIDs.length; i++) { + if (sm2.soundIDs[i] === sID) { + sm2.soundIDs.splice(i, 1); + break; + } + } + if (!_bFromSound) { + oS.destruct(true); + } + oS = null; + delete sm2.sounds[sID]; + return true; + }; + this.load = function(sID, oOptions) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].load(oOptions); + }; + this.unload = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].unload(); + }; + this.onPosition = function(sID, nPosition, oMethod, oScope) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].onposition(nPosition, oMethod, oScope); + }; + this.onposition = this.onPosition; + this.clearOnPosition = function(sID, nPosition, oMethod) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].clearOnPosition(nPosition, oMethod); + }; + this.play = function(sID, oOptions) { + var result = null, + overloaded = (oOptions && !(oOptions instanceof Object)); + if (!didInit || !sm2.ok()) { + return false; + } + if (!idCheck(sID, overloaded)) { + if (!overloaded) { + return false; + } + if (overloaded) { + oOptions = { + url: oOptions + }; + } + if (oOptions && oOptions.url) { + oOptions.id = sID; + result = sm2.createSound(oOptions).play(); + } + } else if (overloaded) { + oOptions = { + url: oOptions + }; + } + if (result === null) { + result = sm2.sounds[sID].play(oOptions); + } + return result; + }; + this.start = this.play; + this.setPosition = function(sID, nMsecOffset) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setPosition(nMsecOffset); + }; + this.stop = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].stop(); + }; + this.stopAll = function() { + var oSound; + for (oSound in sm2.sounds) { + if (sm2.sounds.hasOwnProperty(oSound)) { + sm2.sounds[oSound].stop(); + } + } + }; + this.pause = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].pause(); + }; + this.pauseAll = function() { + var i; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].pause(); + } + }; + this.resume = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].resume(); + }; + this.resumeAll = function() { + var i; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].resume(); + } + }; + this.togglePause = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].togglePause(); + }; + this.setPan = function(sID, nPan) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setPan(nPan); + }; + this.setVolume = function(sID, nVol) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setVolume(nVol); + }; + this.mute = function(sID) { + var i = 0; + if (sID instanceof String) { + sID = null; + } + if (!sID) { + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].mute(); + } + sm2.muted = true; + } else { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].mute(); + } + return true; + }; + this.muteAll = function() { + sm2.mute(); + }; + this.unmute = function(sID) { + var i; + if (sID instanceof String) { + sID = null; + } + if (!sID) { + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].unmute(); + } + sm2.muted = false; + } else { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].unmute(); + } + return true; + }; + this.unmuteAll = function() { + sm2.unmute(); + }; + this.toggleMute = function(sID) { + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].toggleMute(); + }; + this.getMemoryUse = function() { + var ram = 0; + if (flash && fV !== 8) { + ram = parseInt(flash._getMemoryUse(), 10); + } + return ram; + }; + this.disable = function(bNoDisable) { + var i; + if (bNoDisable === _undefined) { + bNoDisable = false; + } + if (disabled) { + return false; + } + disabled = true; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + disableObject(sm2.sounds[sm2.soundIDs[i]]); + } + initComplete(bNoDisable); + event.remove(window, 'load', initUserOnload); + return true; + }; + this.canPlayMIME = function(sMIME) { + var result; + if (sm2.hasHTML5) { + result = html5CanPlay({type:sMIME}); + } + if (!result && needsFlash) { + result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); + } + return result; + }; + this.canPlayURL = function(sURL) { + var result; + if (sm2.hasHTML5) { + result = html5CanPlay({url: sURL}); + } + if (!result && needsFlash) { + result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null); + } + return result; + }; + this.canPlayLink = function(oLink) { + if (oLink.type !== _undefined && oLink.type) { + if (sm2.canPlayMIME(oLink.type)) { + return true; + } + } + return sm2.canPlayURL(oLink.href); + }; + this.getSoundById = function(sID, _suppressDebug) { + if (!sID) { + return null; + } + var result = sm2.sounds[sID]; + return result; + }; + this.onready = function(oMethod, oScope) { + var sType = 'onready', + result = false; + if (typeof oMethod === 'function') { + if (!oScope) { + oScope = window; + } + addOnEvent(sType, oMethod, oScope); + processOnEvents(); + result = true; + } else { + throw str('needFunction', sType); + } + return result; + }; + this.ontimeout = function(oMethod, oScope) { + var sType = 'ontimeout', + result = false; + if (typeof oMethod === 'function') { + if (!oScope) { + oScope = window; + } + addOnEvent(sType, oMethod, oScope); + processOnEvents({type:sType}); + result = true; + } else { + throw str('needFunction', sType); + } + return result; + }; + this._writeDebug = function(sText, sTypeOrObject) { + return true; + }; + this._wD = this._writeDebug; + this._debug = function() { + }; + this.reboot = function(resetEvents, excludeInit) { + var i, j, k; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].destruct(); + } + if (flash) { + try { + if (isIE) { + oRemovedHTML = flash.innerHTML; + } + oRemoved = flash.parentNode.removeChild(flash); + } catch(e) { + } + } + oRemovedHTML = oRemoved = needsFlash = flash = null; + sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false; + sm2.soundIDs = []; + sm2.sounds = {}; + idCounter = 0; + if (!resetEvents) { + for (i in on_queue) { + if (on_queue.hasOwnProperty(i)) { + for (j = 0, k = on_queue[i].length; j < k; j++) { + on_queue[i][j].fired = false; + } + } + } + } else { + on_queue = []; + } + sm2.html5 = { + 'usingFlash': null + }; + sm2.flash = {}; + sm2.html5Only = false; + sm2.ignoreFlash = false; + window.setTimeout(function() { + preInit(); + if (!excludeInit) { + sm2.beginDelayedInit(); + } + }, 20); + return sm2; + }; + this.reset = function() { + return sm2.reboot(true, true); + }; + this.getMoviePercent = function() { + return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); + }; + this.beginDelayedInit = function() { + windowLoaded = true; + domContentLoaded(); + setTimeout(function() { + if (initPending) { + return false; + } + createMovie(); + initMovie(); + initPending = true; + return true; + }, 20); + delayWaitForEI(); + }; + this.destruct = function() { + sm2.disable(true); + }; + SMSound = function(oOptions) { + var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted; + lastHTML5State = { + duration: null, + time: null + }; + this.id = oOptions.id; + this.sID = this.id; + this.url = oOptions.url; + this.options = mixin(oOptions); + this.instanceOptions = this.options; + this._iO = this.instanceOptions; + this.pan = this.options.pan; + this.volume = this.options.volume; + this.isHTML5 = false; + this._a = null; + urlOmitted = (this.url ? false : true); + this.id3 = {}; + this._debug = function() { + }; + this.load = function(oOptions) { + var oSound = null, instanceOptions; + if (oOptions !== _undefined) { + s._iO = mixin(oOptions, s.options); + } else { + oOptions = s.options; + s._iO = oOptions; + if (lastURL && lastURL !== s.url) { + s._iO.url = s.url; + s.url = null; + } + } + if (!s._iO.url) { + s._iO.url = s.url; + } + s._iO.url = parseURL(s._iO.url); + s.instanceOptions = s._iO; + instanceOptions = s._iO; + if (!instanceOptions.url && !s.url) { + return s; + } + if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) { + if (s.readyState === 3 && instanceOptions.onload) { + wrapCallback(s, function() { + instanceOptions.onload.apply(s, [(!!s.duration)]); + }); + } + return s; + } + s.loaded = false; + s.readyState = 1; + s.playState = 0; + s.id3 = {}; + if (html5OK(instanceOptions)) { + oSound = s._setup_html5(instanceOptions); + if (!oSound._called_load) { + s._html5_canplay = false; + if (s.url !== instanceOptions.url) { + s._a.src = instanceOptions.url; + s.setPosition(0); + } + s._a.autobuffer = 'auto'; + s._a.preload = 'auto'; + s._a._called_load = true; + } else { + } + } else { + if (sm2.html5Only) { + return s; + } + if (s._iO.url && s._iO.url.match(/data\:/i)) { + return s; + } + try { + s.isHTML5 = false; + s._iO = policyFix(loopFix(instanceOptions)); + instanceOptions = s._iO; + if (fV === 8) { + flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile); + } else { + flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile); + } + } catch(e) { + catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); + } + } + s.url = instanceOptions.url; + return s; + }; + this.unload = function() { + if (s.readyState !== 0) { + if (!s.isHTML5) { + if (fV === 8) { + flash._unload(s.id, emptyURL); + } else { + flash._unload(s.id); + } + } else { + stop_html5_timer(); + if (s._a) { + s._a.pause(); + lastURL = html5Unload(s._a); + } + } + resetProperties(); + } + return s; + }; + this.destruct = function(_bFromSM) { + if (!s.isHTML5) { + s._iO.onfailure = null; + flash._destroySound(s.id); + } else { + stop_html5_timer(); + if (s._a) { + s._a.pause(); + html5Unload(s._a); + if (!useGlobalHTML5Audio) { + remove_html5_events(); + } + s._a._s = null; + s._a = null; + } + } + if (!_bFromSM) { + sm2.destroySound(s.id, true); + } + }; + this.play = function(oOptions, _updatePlayState) { + var fN, allowMulti, a, onready, + audioClone, onended, oncanplay, + startOK = true, + exit = null; + _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState); + if (!oOptions) { + oOptions = {}; + } + if (s.url) { + s._iO.url = s.url; + } + s._iO = mixin(s._iO, s.options); + s._iO = mixin(oOptions, s._iO); + s._iO.url = parseURL(s._iO.url); + s.instanceOptions = s._iO; + if (!s.isHTML5 && s._iO.serverURL && !s.connected) { + if (!s.getAutoPlay()) { + s.setAutoPlay(true); + } + return s; + } + if (html5OK(s._iO)) { + s._setup_html5(s._iO); + start_html5_timer(); + } + if (s.playState === 1 && !s.paused) { + allowMulti = s._iO.multiShot; + if (!allowMulti) { + if (s.isHTML5) { + s.setPosition(s._iO.position); + } + exit = s; + } else { + } + } + if (exit !== null) { + return exit; + } + if (oOptions.url && oOptions.url !== s.url) { + if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) { + urlOmitted = false; + } else { + s.load(s._iO); + } + } + if (!s.loaded) { + if (s.readyState === 0) { + if (!s.isHTML5 && !sm2.html5Only) { + s._iO.autoPlay = true; + s.load(s._iO); + } else if (s.isHTML5) { + s.load(s._iO); + } else { + exit = s; + } + s.instanceOptions = s._iO; + } else if (s.readyState === 2) { + exit = s; + } else { + } + } else { + } + if (exit !== null) { + return exit; + } + if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) { + oOptions.position = 0; + } + if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) { + s.resume(); + } else { + s._iO = mixin(oOptions, s._iO); + if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) { + onready = function() { + s._iO = mixin(oOptions, s._iO); + s.play(s._iO); + }; + if (s.isHTML5 && !s._html5_canplay) { + s.load({ + _oncanplay: onready + }); + exit = false; + } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) { + s.load({ + onload: onready + }); + exit = false; + } + if (exit !== null) { + return exit; + } + s._iO = applyFromTo(); + } + if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) { + s.instanceCount++; + } + if (s._iO.onposition && s.playState === 0) { + attachOnPosition(s); + } + s.playState = 1; + s.paused = false; + s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0); + if (!s.isHTML5) { + s._iO = policyFix(loopFix(s._iO)); + } + if (s._iO.onplay && _updatePlayState) { + s._iO.onplay.apply(s); + onplay_called = true; + } + s.setVolume(s._iO.volume, true); + s.setPan(s._iO.pan, true); + if (!s.isHTML5) { + startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false); + if (fV === 9 && !startOK) { + if (s._iO.onplayerror) { + s._iO.onplayerror.apply(s); + } + } + } else { + if (s.instanceCount < 2) { + start_html5_timer(); + a = s._setup_html5(); + s.setPosition(s._iO.position); + a.play(); + } else { + audioClone = new Audio(s._iO.url); + onended = function() { + event.remove(audioClone, 'ended', onended); + s._onfinish(s); + html5Unload(audioClone); + audioClone = null; + }; + oncanplay = function() { + event.remove(audioClone, 'canplay', oncanplay); + try { + audioClone.currentTime = s._iO.position/msecScale; + } catch(err) { + } + audioClone.play(); + }; + event.add(audioClone, 'ended', onended); + if (s._iO.volume !== undefined) { + audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100)); + } + if (s.muted) { + audioClone.muted = true; + } + if (s._iO.position) { + event.add(audioClone, 'canplay', oncanplay); + } else { + audioClone.play(); + } + } + } + } + return s; + }; + this.start = this.play; + this.stop = function(bAll) { + var instanceOptions = s._iO, + originalPosition; + if (s.playState === 1) { + s._onbufferchange(0); + s._resetOnPosition(0); + s.paused = false; + if (!s.isHTML5) { + s.playState = 0; + } + detachOnPosition(); + if (instanceOptions.to) { + s.clearOnPosition(instanceOptions.to); + } + if (!s.isHTML5) { + flash._stop(s.id, bAll); + if (instanceOptions.serverURL) { + s.unload(); + } + } else { + if (s._a) { + originalPosition = s.position; + s.setPosition(0); + s.position = originalPosition; + s._a.pause(); + s.playState = 0; + s._onTimer(); + stop_html5_timer(); + } + } + s.instanceCount = 0; + s._iO = {}; + if (instanceOptions.onstop) { + instanceOptions.onstop.apply(s); + } + } + return s; + }; + this.setAutoPlay = function(autoPlay) { + s._iO.autoPlay = autoPlay; + if (!s.isHTML5) { + flash._setAutoPlay(s.id, autoPlay); + if (autoPlay) { + if (!s.instanceCount && s.readyState === 1) { + s.instanceCount++; + } + } + } + }; + this.getAutoPlay = function() { + return s._iO.autoPlay; + }; + this.setPosition = function(nMsecOffset) { + if (nMsecOffset === _undefined) { + nMsecOffset = 0; + } + var position, position1K, + offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0))); + s.position = offset; + position1K = s.position/msecScale; + s._resetOnPosition(s.position); + s._iO.position = offset; + if (!s.isHTML5) { + position = (fV === 9 ? s.position : position1K); + if (s.readyState && s.readyState !== 2) { + flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot); + } + } else if (s._a) { + if (s._html5_canplay) { + if (s._a.currentTime !== position1K) { + try { + s._a.currentTime = position1K; + if (s.playState === 0 || s.paused) { + s._a.pause(); + } + } catch(e) { + } + } + } else if (position1K) { + return s; + } + if (s.paused) { + s._onTimer(true); + } + } + return s; + }; + this.pause = function(_bCallFlash) { + if (s.paused || (s.playState === 0 && s.readyState !== 1)) { + return s; + } + s.paused = true; + if (!s.isHTML5) { + if (_bCallFlash || _bCallFlash === _undefined) { + flash._pause(s.id, s._iO.multiShot); + } + } else { + s._setup_html5().pause(); + stop_html5_timer(); + } + if (s._iO.onpause) { + s._iO.onpause.apply(s); + } + return s; + }; + this.resume = function() { + var instanceOptions = s._iO; + if (!s.paused) { + return s; + } + s.paused = false; + s.playState = 1; + if (!s.isHTML5) { + if (instanceOptions.isMovieStar && !instanceOptions.serverURL) { + s.setPosition(s.position); + } + flash._pause(s.id, instanceOptions.multiShot); + } else { + s._setup_html5().play(); + start_html5_timer(); + } + if (!onplay_called && instanceOptions.onplay) { + instanceOptions.onplay.apply(s); + onplay_called = true; + } else if (instanceOptions.onresume) { + instanceOptions.onresume.apply(s); + } + return s; + }; + this.togglePause = function() { + if (s.playState === 0) { + s.play({ + position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale) + }); + return s; + } + if (s.paused) { + s.resume(); + } else { + s.pause(); + } + return s; + }; + this.setPan = function(nPan, bInstanceOnly) { + if (nPan === _undefined) { + nPan = 0; + } + if (bInstanceOnly === _undefined) { + bInstanceOnly = false; + } + if (!s.isHTML5) { + flash._setPan(s.id, nPan); + } + s._iO.pan = nPan; + if (!bInstanceOnly) { + s.pan = nPan; + s.options.pan = nPan; + } + return s; + }; + this.setVolume = function(nVol, _bInstanceOnly) { + if (nVol === _undefined) { + nVol = 100; + } + if (_bInstanceOnly === _undefined) { + _bInstanceOnly = false; + } + if (!s.isHTML5) { + flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol); + } else if (s._a) { + if (sm2.muted && !s.muted) { + s.muted = true; + s._a.muted = true; + } + s._a.volume = Math.max(0, Math.min(1, nVol/100)); + } + s._iO.volume = nVol; + if (!_bInstanceOnly) { + s.volume = nVol; + s.options.volume = nVol; + } + return s; + }; + this.mute = function() { + s.muted = true; + if (!s.isHTML5) { + flash._setVolume(s.id, 0); + } else if (s._a) { + s._a.muted = true; + } + return s; + }; + this.unmute = function() { + s.muted = false; + var hasIO = (s._iO.volume !== _undefined); + if (!s.isHTML5) { + flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume); + } else if (s._a) { + s._a.muted = false; + } + return s; + }; + this.toggleMute = function() { + return (s.muted?s.unmute():s.mute()); + }; + this.onPosition = function(nPosition, oMethod, oScope) { + onPositionItems.push({ + position: parseInt(nPosition, 10), + method: oMethod, + scope: (oScope !== _undefined ? oScope : s), + fired: false + }); + return s; + }; + this.onposition = this.onPosition; + this.clearOnPosition = function(nPosition, oMethod) { + var i; + nPosition = parseInt(nPosition, 10); + if (isNaN(nPosition)) { + return false; + } + for (i=0; i < onPositionItems.length; i++) { + if (nPosition === onPositionItems[i].position) { + if (!oMethod || (oMethod === onPositionItems[i].method)) { + if (onPositionItems[i].fired) { + onPositionFired--; + } + onPositionItems.splice(i, 1); + } + } + } + }; + this._processOnPosition = function() { + var i, item, j = onPositionItems.length; + if (!j || !s.playState || onPositionFired >= j) { + return false; + } + for (i=j-1; i >= 0; i--) { + item = onPositionItems[i]; + if (!item.fired && s.position >= item.position) { + item.fired = true; + onPositionFired++; + item.method.apply(item.scope, [item.position]); + j = onPositionItems.length; + } + } + return true; + }; + this._resetOnPosition = function(nPosition) { + var i, item, j = onPositionItems.length; + if (!j) { + return false; + } + for (i=j-1; i >= 0; i--) { + item = onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + onPositionFired--; + } + } + return true; + }; + applyFromTo = function() { + var instanceOptions = s._iO, + f = instanceOptions.from, + t = instanceOptions.to, + start, end; + end = function() { + s.clearOnPosition(t, end); + s.stop(); + }; + start = function() { + if (t !== null && !isNaN(t)) { + s.onPosition(t, end); + } + }; + if (f !== null && !isNaN(f)) { + instanceOptions.position = f; + instanceOptions.multiShot = false; + start(); + } + return instanceOptions; + }; + attachOnPosition = function() { + var item, + op = s._iO.onposition; + if (op) { + for (item in op) { + if (op.hasOwnProperty(item)) { + s.onPosition(parseInt(item, 10), op[item]); + } + } + } + }; + detachOnPosition = function() { + var item, + op = s._iO.onposition; + if (op) { + for (item in op) { + if (op.hasOwnProperty(item)) { + s.clearOnPosition(parseInt(item, 10)); + } + } + } + }; + start_html5_timer = function() { + if (s.isHTML5) { + startTimer(s); + } + }; + stop_html5_timer = function() { + if (s.isHTML5) { + stopTimer(s); + } + }; + resetProperties = function(retainPosition) { + if (!retainPosition) { + onPositionItems = []; + onPositionFired = 0; + } + onplay_called = false; + s._hasTimer = null; + s._a = null; + s._html5_canplay = false; + s.bytesLoaded = null; + s.bytesTotal = null; + s.duration = (s._iO && s._iO.duration ? s._iO.duration : null); + s.durationEstimate = null; + s.buffered = []; + s.eqData = []; + s.eqData.left = []; + s.eqData.right = []; + s.failures = 0; + s.isBuffering = false; + s.instanceOptions = {}; + s.instanceCount = 0; + s.loaded = false; + s.metadata = {}; + s.readyState = 0; + s.muted = false; + s.paused = false; + s.peakData = { + left: 0, + right: 0 + }; + s.waveformData = { + left: [], + right: [] + }; + s.playState = 0; + s.position = null; + s.id3 = {}; + }; + resetProperties(); + this._onTimer = function(bForce) { + var duration, isNew = false, time, x = {}; + if (s._hasTimer || bForce) { + if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) { + duration = s._get_html5_duration(); + if (duration !== lastHTML5State.duration) { + lastHTML5State.duration = duration; + s.duration = duration; + isNew = true; + } + s.durationEstimate = s.duration; + time = (s._a.currentTime * msecScale || 0); + if (time !== lastHTML5State.time) { + lastHTML5State.time = time; + isNew = true; + } + if (isNew || bForce) { + s._whileplaying(time,x,x,x,x); + } + } + return isNew; + } + }; + this._get_html5_duration = function() { + var instanceOptions = s._iO, + d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)), + result = (d && !isNaN(d) && d !== Infinity ? d : null); + return result; + }; + this._apply_loop = function(a, nLoops) { + a.loop = (nLoops > 1 ? 'loop' : ''); + }; + this._setup_html5 = function(oOptions) { + var instanceOptions = mixin(s._iO, oOptions), + a = useGlobalHTML5Audio ? globalHTML5Audio : s._a, + dURL = decodeURI(instanceOptions.url), + sameURL; + if (useGlobalHTML5Audio) { + if (dURL === decodeURI(lastGlobalHTML5URL)) { + sameURL = true; + } + } else if (dURL === decodeURI(lastURL)) { + sameURL = true; + } + if (a) { + if (a._s) { + if (useGlobalHTML5Audio) { + if (a._s && a._s.playState && !sameURL) { + a._s.stop(); + } + } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) { + s._apply_loop(a, instanceOptions.loops); + return a; + } + } + if (!sameURL) { + if (lastURL) { + resetProperties(false); + } + a.src = instanceOptions.url; + s.url = instanceOptions.url; + lastURL = instanceOptions.url; + lastGlobalHTML5URL = instanceOptions.url; + a._called_load = false; + } + } else { + if (instanceOptions.autoLoad || instanceOptions.autoPlay) { + s._a = new Audio(instanceOptions.url); + s._a.load(); + } else { + s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()); + } + a = s._a; + a._called_load = false; + if (useGlobalHTML5Audio) { + globalHTML5Audio = a; + } + } + s.isHTML5 = true; + s._a = a; + a._s = s; + add_html5_events(); + s._apply_loop(a, instanceOptions.loops); + if (instanceOptions.autoLoad || instanceOptions.autoPlay) { + s.load(); + } else { + a.autobuffer = false; + a.preload = 'auto'; + } + return a; + }; + add_html5_events = function() { + if (s._a._added_events) { + return false; + } + var f; + function add(oEvt, oFn, bCapture) { + return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null; + } + s._a._added_events = true; + for (f in html5_events) { + if (html5_events.hasOwnProperty(f)) { + add(f, html5_events[f]); + } + } + return true; + }; + remove_html5_events = function() { + var f; + function remove(oEvt, oFn, bCapture) { + return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null); + } + s._a._added_events = false; + for (f in html5_events) { + if (html5_events.hasOwnProperty(f)) { + remove(f, html5_events[f]); + } + } + }; + this._onload = function(nSuccess) { + var fN, + loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration); + s.loaded = loadOK; + s.readyState = loadOK?3:2; + s._onbufferchange(0); + if (s._iO.onload) { + wrapCallback(s, function() { + s._iO.onload.apply(s, [loadOK]); + }); + } + return true; + }; + this._onbufferchange = function(nIsBuffering) { + if (s.playState === 0) { + return false; + } + if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) { + return false; + } + s.isBuffering = (nIsBuffering === 1); + if (s._iO.onbufferchange) { + s._iO.onbufferchange.apply(s); + } + return true; + }; + this._onsuspend = function() { + if (s._iO.onsuspend) { + s._iO.onsuspend.apply(s); + } + return true; + }; + this._onfailure = function(msg, level, code) { + s.failures++; + if (s._iO.onfailure && s.failures === 1) { + s._iO.onfailure(s, msg, level, code); + } else { + } + }; + this._onfinish = function() { + var io_onfinish = s._iO.onfinish; + s._onbufferchange(0); + s._resetOnPosition(0); + if (s.instanceCount) { + s.instanceCount--; + if (!s.instanceCount) { + detachOnPosition(); + s.playState = 0; + s.paused = false; + s.instanceCount = 0; + s.instanceOptions = {}; + s._iO = {}; + stop_html5_timer(); + if (s.isHTML5) { + s.position = 0; + } + } + if (!s.instanceCount || s._iO.multiShotEvents) { + if (io_onfinish) { + wrapCallback(s, function() { + io_onfinish.apply(s); + }); + } + } + } + }; + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + var instanceOptions = s._iO; + s.bytesLoaded = nBytesLoaded; + s.bytesTotal = nBytesTotal; + s.duration = Math.floor(nDuration); + s.bufferLength = nBufferLength; + if (!s.isHTML5 && !instanceOptions.isMovieStar) { + if (instanceOptions.duration) { + s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration; + } else { + s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10); + } + } else { + s.durationEstimate = s.duration; + } + if (!s.isHTML5) { + s.buffered = [{ + 'start': 0, + 'end': s.duration + }]; + } + if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) { + instanceOptions.whileloading.apply(s); + } + }; + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + var instanceOptions = s._iO, + eqLeft; + if (isNaN(nPosition) || nPosition === null) { + return false; + } + s.position = Math.max(0, nPosition); + s._processOnPosition(); + if (!s.isHTML5 && fV > 8) { + if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) { + s.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) { + s.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + if (instanceOptions.useEQData) { + if (oEQData !== _undefined && oEQData && oEQData.leftEQ) { + eqLeft = oEQData.leftEQ.split(','); + s.eqData = eqLeft; + s.eqData.left = eqLeft; + if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) { + s.eqData.right = oEQData.rightEQ.split(','); + } + } + } + } + if (s.playState === 1) { + if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) { + s._onbufferchange(0); + } + if (instanceOptions.whileplaying) { + instanceOptions.whileplaying.apply(s); + } + } + return true; + }; + this._oncaptiondata = function(oData) { + s.captiondata = oData; + if (s._iO.oncaptiondata) { + s._iO.oncaptiondata.apply(s, [oData]); + } + }; + this._onmetadata = function(oMDProps, oMDData) { + var oData = {}, i, j; + for (i = 0, j = oMDProps.length; i < j; i++) { + oData[oMDProps[i]] = oMDData[i]; + } + s.metadata = oData; + if (s._iO.onmetadata) { + s._iO.onmetadata.apply(s); + } + }; + this._onid3 = function(oID3Props, oID3Data) { + var oData = [], i, j; + for (i = 0, j = oID3Props.length; i < j; i++) { + oData[oID3Props[i]] = oID3Data[i]; + } + s.id3 = mixin(s.id3, oData); + if (s._iO.onid3) { + s._iO.onid3.apply(s); + } + }; + this._onconnect = function(bSuccess) { + bSuccess = (bSuccess === 1); + s.connected = bSuccess; + if (bSuccess) { + s.failures = 0; + if (idCheck(s.id)) { + if (s.getAutoPlay()) { + s.play(_undefined, s.getAutoPlay()); + } else if (s._iO.autoLoad) { + s.load(); + } + } + if (s._iO.onconnect) { + s._iO.onconnect.apply(s, [bSuccess]); + } + } + }; + this._ondataerror = function(sError) { + if (s.playState > 0) { + if (s._iO.ondataerror) { + s._iO.ondataerror.apply(s); + } + } + }; + }; + getDocument = function() { + return (doc.body || doc.getElementsByTagName('div')[0]); + }; + id = function(sID) { + return doc.getElementById(sID); + }; + mixin = function(oMain, oAdd) { + var o1 = (oMain || {}), o2, o; + o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd); + for (o in o2) { + if (o2.hasOwnProperty(o) && o1[o] === _undefined) { + if (typeof o2[o] !== 'object' || o2[o] === null) { + o1[o] = o2[o]; + } else { + o1[o] = mixin(o1[o], o2[o]); + } + } + } + return o1; + }; + wrapCallback = function(oSound, callback) { + if (!oSound.isHTML5 && fV === 8) { + window.setTimeout(callback, 0); + } else { + callback(); + } + }; + extraOptions = { + 'onready': 1, + 'ontimeout': 1, + 'defaultOptions': 1, + 'flash9Options': 1, + 'movieStarOptions': 1 + }; + assign = function(o, oParent) { + var i, + result = true, + hasParent = (oParent !== _undefined), + setupOptions = sm2.setupOptions, + bonusOptions = extraOptions; + for (i in o) { + if (o.hasOwnProperty(i)) { + if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) { + if (hasParent && bonusOptions[oParent] !== _undefined) { + sm2[oParent][i] = o[i]; + } else if (setupOptions[i] !== _undefined) { + sm2.setupOptions[i] = o[i]; + sm2[i] = o[i]; + } else if (bonusOptions[i] === _undefined) { + result = false; + } else { + if (sm2[i] instanceof Function) { + sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]])); + } else { + sm2[i] = o[i]; + } + } + } else { + if (bonusOptions[i] === _undefined) { + result = false; + } else { + return assign(o[i], i); + } + } + } + } + return result; + }; + function preferFlashCheck(kind) { + return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind])); + } + event = (function() { + var old = (window.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + function getArgs(oArgs) { + var args = slice.call(oArgs), + len = args.length; + if (old) { + args[1] = 'on' + args[1]; + if (len > 3) { + args.pop(); + } + } else if (len === 3) { + args.push(false); + } + return args; + } + function apply(args, sType) { + var element = args.shift(), + method = [evt[sType]]; + if (old) { + element[method](args[0], args[1]); + } else { + element[method].apply(element, args); + } + } + function add() { + apply(getArgs(arguments), 'add'); + } + function remove() { + apply(getArgs(arguments), 'remove'); + } + return { + 'add': add, + 'remove': remove + }; + }()); + function html5_event(oFn) { + return function(e) { + var s = this._s, + result; + if (!s || !s._a) { + result = null; + } else { + result = oFn.call(this, e); + } + return result; + }; + } + html5_events = { + abort: html5_event(function() { + }), + canplay: html5_event(function() { + var s = this._s, + position1K; + if (s._html5_canplay) { + return true; + } + s._html5_canplay = true; + s._onbufferchange(0); + position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null); + if (s.position && this.currentTime !== position1K) { + try { + this.currentTime = position1K; + } catch(ee) { + } + } + if (s._iO._oncanplay) { + s._iO._oncanplay(); + } + }), + canplaythrough: html5_event(function() { + var s = this._s; + if (!s.loaded) { + s._onbufferchange(0); + s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration()); + s._onload(true); + } + }), + ended: html5_event(function() { + var s = this._s; + s._onfinish(); + }), + error: html5_event(function() { + this._s._onload(false); + }), + loadeddata: html5_event(function() { + var s = this._s; + if (!s._loaded && !isSafari) { + s.duration = s._get_html5_duration(); + } + }), + loadedmetadata: html5_event(function() { + }), + loadstart: html5_event(function() { + this._s._onbufferchange(1); + }), + play: html5_event(function() { + this._s._onbufferchange(0); + }), + playing: html5_event(function() { + this._s._onbufferchange(0); + }), + progress: html5_event(function(e) { + var s = this._s, + i, j, progStr, buffered = 0, + isProgress = (e.type === 'progress'), + ranges = e.target.buffered, + loaded = (e.loaded||0), + total = (e.total||1); + s.buffered = []; + if (ranges && ranges.length) { + for (i=0, j=ranges.length; i= 0; i--) { + support['audio/'+aF[item].related[i]] = support[item]; + sm2.html5[aF[item].related[i]] = support[item]; + sm2.flash[aF[item].related[i]] = support[item]; + } + } + } + } + support.canPlayType = (a?cp:null); + sm2.html5 = mixin(sm2.html5, support); + sm2.html5.usingFlash = featureCheck(); + needsFlash = sm2.html5.usingFlash; + return true; + }; + strings = { + }; + str = function() { + }; + loopFix = function(sOpt) { + if (fV === 8 && sOpt.loops > 1 && sOpt.stream) { + sOpt.stream = false; + } + return sOpt; + }; + policyFix = function(sOpt, sPre) { + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + sOpt.usePolicyFile = true; + } + return sOpt; + }; + complain = function(sMsg) { + }; + doNothing = function() { + return false; + }; + disableObject = function(o) { + var oProp; + for (oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = doNothing; + } + } + oProp = null; + }; + failSafely = function(bNoDisable) { + if (bNoDisable === _undefined) { + bNoDisable = false; + } + if (disabled || bNoDisable) { + sm2.disable(bNoDisable); + } + }; + normalizeMovieURL = function(smURL) { + var urlParams = null, url; + if (smURL) { + if (smURL.match(/\.swf(\?.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + return smURL; + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + smURL += '/'; + } + } + url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL; + if (sm2.noSWFCache) { + url += ('?ts=' + new Date().getTime()); + } + return url; + }; + setVersionInfo = function() { + fV = parseInt(sm2.flashVersion, 10); + if (fV !== 8 && fV !== 9) { + sm2.flashVersion = fV = defaultFlashVersion; + } + var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf'); + if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) { + sm2.flashVersion = fV = 9; + } + sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + if (fV > 8) { + sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options); + sm2.features.buffering = true; + sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions); + sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + sm2.features.movieStar = true; + } else { + sm2.features.movieStar = false; + } + sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')]; + sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); + sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8); + }; + setPolling = function(bPolling, bHighPerformance) { + if (!flash) { + return false; + } + flash._setPolling(bPolling, bHighPerformance); + }; + initDebug = function() { + }; + idCheck = this.getSoundById; + getSWFCSS = function() { + var css = []; + if (sm2.debugMode) { + css.push(swfCSS.sm2Debug); + } + if (sm2.debugFlash) { + css.push(swfCSS.flashDebug); + } + if (sm2.useHighPerformance) { + css.push(swfCSS.highPerf); + } + return css.join(' '); + }; + flashBlockHandler = function() { + var name = str('fbHandler'), + p = sm2.getMoviePercent(), + css = swfCSS, + error = {type:'FLASHBLOCK'}; + if (sm2.html5Only) { + return false; + } + if (!sm2.ok()) { + if (needsFlash) { + sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); + } + sm2.didFlashBlock = true; + processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); + catchError(error); + } else { + if (sm2.oMC) { + sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); + } + } + }; + addOnEvent = function(sType, oMethod, oScope) { + if (on_queue[sType] === _undefined) { + on_queue[sType] = []; + } + on_queue[sType].push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + }; + processOnEvents = function(oOptions) { + if (!oOptions) { + oOptions = { + type: (sm2.ok() ? 'onready' : 'ontimeout') + }; + } + if (!didInit && oOptions && !oOptions.ignoreInit) { + return false; + } + if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) { + return false; + } + var status = { + success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled) + }, + srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]), + queue = [], i, j, + args = [status], + canRetry = (needsFlash && !sm2.ok()); + if (oOptions.error) { + args[0].error = oOptions.error; + } + for (i = 0, j = srcQueue.length; i < j; i++) { + if (srcQueue[i].fired !== true) { + queue.push(srcQueue[i]); + } + } + if (queue.length) { + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, args); + } else { + queue[i].method.apply(this, args); + } + if (!canRetry) { + queue[i].fired = true; + } + } + } + return true; + }; + initUserOnload = function() { + window.setTimeout(function() { + if (sm2.useFlashBlock) { + flashBlockHandler(); + } + processOnEvents(); + if (typeof sm2.onload === 'function') { + sm2.onload.apply(window); + } + if (sm2.waitForWindowLoad) { + event.add(window, 'load', initUserOnload); + } + },1); + }; + detectFlash = function() { + if (hasFlash !== _undefined) { + return hasFlash; + } + var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; + if (nP && nP.length) { + type = 'application/x-shockwave-flash'; + types = n.mimeTypes; + if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { + hasPlugin = true; + } + } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) { + try { + obj = new AX('ShockwaveFlash.ShockwaveFlash'); + } catch(e) { + obj = null; + } + hasPlugin = (!!obj); + obj = null; + } + hasFlash = hasPlugin; + return hasPlugin; + }; + featureCheck = function() { + var flashNeeded, + item, + formats = sm2.audioFormats, + isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i))); + if (isSpecial) { + sm2.hasHTML5 = false; + sm2.html5Only = true; + if (sm2.oMC) { + sm2.oMC.style.display = 'none'; + } + } else { + if (sm2.useHTML5Audio) { + if (!sm2.html5 || !sm2.html5.canPlayType) { + sm2.hasHTML5 = false; + } + } + } + if (sm2.useHTML5Audio && sm2.hasHTML5) { + canIgnoreFlash = true; + for (item in formats) { + if (formats.hasOwnProperty(item)) { + if (formats[item].required) { + if (!sm2.html5.canPlayType(formats[item].type)) { + canIgnoreFlash = false; + flashNeeded = true; + } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) { + flashNeeded = true; + } + } + } + } + } + if (sm2.ignoreFlash) { + flashNeeded = false; + canIgnoreFlash = true; + } + sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded); + return (!sm2.html5Only); + }; + parseURL = function(url) { + var i, j, urlResult = 0, result; + if (url instanceof Array) { + for (i=0, j=url.length; i= 0; i--) { + if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) { + sm2.sounds[sm2.soundIDs[i]]._onTimer(); + } + } + }; + catchError = function(options) { + options = (options !== _undefined ? options : {}); + if (typeof sm2.onerror === 'function') { + sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]); + } + if (options.fatal !== _undefined && options.fatal) { + sm2.disable(); + } + }; + badSafariFix = function() { + if (!isBadSafari || !detectFlash()) { + return false; + } + var aF = sm2.audioFormats, i, item; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + if (item === 'mp3' || item === 'mp4') { + sm2.html5[item] = false; + if (aF[item] && aF[item].related) { + for (i = aF[item].related.length-1; i >= 0; i--) { + sm2.html5[aF[item].related[i]] = false; + } + } + } + } + } + }; + this._setSandboxType = function(sandboxType) { + }; + this._externalInterfaceOK = function(swfVersion) { + if (sm2.swfLoaded) { + return false; + } + var e; + sm2.swfLoaded = true; + tryInitOnFocus = false; + if (isBadSafari) { + badSafariFix(); + } + setTimeout(init, isIE ? 100 : 1); + }; + createMovie = function(smID, smURL) { + if (didAppend && appendSuccess) { + return false; + } + function initMsg() { + } + if (sm2.html5Only) { + setVersionInfo(); + initMsg(); + sm2.oMC = id(sm2.movieID); + init(); + didAppend = true; + appendSuccess = true; + return false; + } + var remoteURL = (smURL || sm2.url), + localURL = (sm2.altURL || remoteURL), + swfTitle = 'JS/Flash audio component (SoundManager 2)', + oTarget = getDocument(), + extraClass = getSWFCSS(), + isRTL = null, + html = doc.getElementsByTagName('html')[0], + oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass; + isRTL = (html && html.dir && html.dir.match(/rtl/i)); + smID = (smID === _undefined?sm2.id:smID); + function param(name, value) { + return ''; + } + setVersionInfo(); + sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL); + smURL = sm2.url; + sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode); + if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { + messages.push(strings.spcWmode); + sm2.wmode = null; + } + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'quality': 'high', + 'allowScriptAccess': sm2.allowScriptAccess, + 'bgcolor': sm2.bgColor, + 'pluginspage': http+'www.macromedia.com/go/getflashplayer', + 'title': swfTitle, + 'type': 'application/x-shockwave-flash', + 'wmode': sm2.wmode, + 'hasPriority': 'true' + }; + if (sm2.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + if (!sm2.wmode) { + delete oEmbed.wmode; + } + if (isIE) { + oMovie = doc.createElement('div'); + movieHTML = [ + '', + param('movie', smURL), + param('AllowScriptAccess', sm2.allowScriptAccess), + param('quality', oEmbed.quality), + (sm2.wmode? param('wmode', sm2.wmode): ''), + param('bgcolor', sm2.bgColor), + param('hasPriority', 'true'), + (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), + '' + ].join(''); + } else { + oMovie = doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + } + initDebug(); + extraClass = getSWFCSS(); + oTarget = getDocument(); + if (oTarget) { + sm2.oMC = (id(sm2.movieID) || doc.createElement('div')); + if (!sm2.oMC.id) { + sm2.oMC.id = sm2.movieID; + sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass; + s = null; + oEl = null; + if (!sm2.useFlashBlock) { + if (sm2.useHighPerformance) { + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + if (isWebkit) { + sm2.oMC.style.zIndex = 10000; + } + if (!sm2.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + sm2.oMC.style[x] = s[x]; + } + } + } + try { + if (!isIE) { + sm2.oMC.appendChild(oMovie); + } + oTarget.appendChild(sm2.oMC); + if (isIE) { + oEl = sm2.oMC.appendChild(doc.createElement('div')); + oEl.className = swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + appendSuccess = true; + } catch(e) { + throw new Error(str('domError')+' \n'+e.toString()); + } + } else { + sClass = sm2.oMC.className; + sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + sm2.oMC.appendChild(oMovie); + if (isIE) { + oEl = sm2.oMC.appendChild(doc.createElement('div')); + oEl.className = swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + appendSuccess = true; + } + } + didAppend = true; + initMsg(); + return true; + }; + initMovie = function() { + if (sm2.html5Only) { + createMovie(); + return false; + } + if (flash) { + return false; + } + if (!sm2.url) { + return false; + } + flash = sm2.getMovie(sm2.id); + if (!flash) { + if (!oRemoved) { + createMovie(sm2.id, sm2.url); + } else { + if (!isIE) { + sm2.oMC.appendChild(oRemoved); + } else { + sm2.oMC.innerHTML = oRemovedHTML; + } + oRemoved = null; + didAppend = true; + } + flash = sm2.getMovie(sm2.id); + } + if (typeof sm2.oninitmovie === 'function') { + setTimeout(sm2.oninitmovie, 1); + } + return true; + }; + delayWaitForEI = function() { + setTimeout(waitForEI, 1000); + }; + rebootIntoHTML5 = function() { + window.setTimeout(function() { + sm2.setup({ + preferFlash: false + }).reboot(); + sm2.didFlashBlock = true; + sm2.beginDelayedInit(); + }, 1); + }; + waitForEI = function() { + var p, + loadIncomplete = false; + if (!sm2.url) { + return false; + } + if (waitingForEI) { + return false; + } + waitingForEI = true; + event.remove(window, 'load', delayWaitForEI); + if (hasFlash && tryInitOnFocus && !isFocused) { + return false; + } + if (!didInit) { + p = sm2.getMoviePercent(); + if (p > 0 && p < 100) { + loadIncomplete = true; + } + } + setTimeout(function() { + p = sm2.getMoviePercent(); + if (loadIncomplete) { + waitingForEI = false; + window.setTimeout(delayWaitForEI, 1); + return false; + } + if (!didInit && okToDisable) { + if (p === null) { + if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) { + if (sm2.useFlashBlock) { + flashBlockHandler(); + } + } else { + if (!sm2.useFlashBlock && canIgnoreFlash) { + rebootIntoHTML5(); + } else { + processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}}); + } + } + } else { + if (sm2.flashLoadTimeout === 0) { + } else { + if (!sm2.useFlashBlock && canIgnoreFlash) { + rebootIntoHTML5(); + } else { + failSafely(true); + } + } + } + } + }, sm2.flashLoadTimeout); + }; + handleFocus = function() { + function cleanup() { + event.remove(window, 'focus', handleFocus); + } + if (isFocused || !tryInitOnFocus) { + cleanup(); + return true; + } + okToDisable = true; + isFocused = true; + waitingForEI = false; + delayWaitForEI(); + cleanup(); + return true; + }; + flushMessages = function() { + }; + showSupport = function() { + }; + initComplete = function(bNoDisable) { + if (didInit) { + return false; + } + if (sm2.html5Only) { + didInit = true; + initUserOnload(); + return true; + } + var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()), + result = true, + error; + if (!wasTimeout) { + didInit = true; + } + error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; + if (disabled || bNoDisable) { + if (sm2.useFlashBlock && sm2.oMC) { + sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError); + } + processOnEvents({type:'ontimeout', error:error, ignoreInit: true}); + catchError(error); + result = false; + } else { + } + if (!disabled) { + if (sm2.waitForWindowLoad && !windowLoaded) { + event.add(window, 'load', initUserOnload); + } else { + initUserOnload(); + } + } + return result; + }; + setProperties = function() { + var i, + o = sm2.setupOptions; + for (i in o) { + if (o.hasOwnProperty(i)) { + if (sm2[i] === _undefined) { + sm2[i] = o[i]; + } else if (sm2[i] !== o[i]) { + sm2.setupOptions[i] = sm2[i]; + } + } + } + }; + init = function() { + if (didInit) { + return false; + } + function cleanup() { + event.remove(window, 'load', sm2.beginDelayedInit); + } + if (sm2.html5Only) { + if (!didInit) { + cleanup(); + sm2.enabled = true; + initComplete(); + } + return true; + } + initMovie(); + try { + flash._externalInterfaceTest(false); + setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50))); + if (!sm2.debugMode) { + flash._disableDebug(); + } + sm2.enabled = true; + if (!sm2.html5Only) { + event.add(window, 'unload', doNothing); + } + } catch(e) { + catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); + failSafely(true); + initComplete(); + return false; + } + initComplete(); + cleanup(); + return true; + }; + domContentLoaded = function() { + if (didDCLoaded) { + return false; + } + didDCLoaded = true; + setProperties(); + initDebug(); + if (!hasFlash && sm2.hasHTML5) { + sm2.setup({ + 'useHTML5Audio': true, + 'preferFlash': false + }); + } + testHTML5(); + if (!hasFlash && needsFlash) { + messages.push(strings.needFlash); + sm2.setup({ + 'flashLoadTimeout': 1 + }); + } + if (doc.removeEventListener) { + doc.removeEventListener('DOMContentLoaded', domContentLoaded, false); + } + initMovie(); + return true; + }; + domContentLoadedIE = function() { + if (doc.readyState === 'complete') { + domContentLoaded(); + doc.detachEvent('onreadystatechange', domContentLoadedIE); + } + return true; + }; + winOnLoad = function() { + windowLoaded = true; + event.remove(window, 'load', winOnLoad); + }; + preInit = function() { + if (mobileHTML5) { + sm2.setupOptions.useHTML5Audio = true; + sm2.setupOptions.preferFlash = false; + if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) { + if (is_iDevice) { + sm2.ignoreFlash = true; + } + useGlobalHTML5Audio = true; + } + } + }; + preInit(); + detectFlash(); + event.add(window, 'focus', handleFocus); + event.add(window, 'load', delayWaitForEI); + event.add(window, 'load', winOnLoad); + if (doc.addEventListener) { + doc.addEventListener('DOMContentLoaded', domContentLoaded, false); + } else if (doc.attachEvent) { + doc.attachEvent('onreadystatechange', domContentLoadedIE); + } else { + catchError({type:'NO_DOM2_EVENTS', fatal:true}); + } +} +// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading +if (window.SM2_DEFER === undefined || !SM2_DEFER) { + soundManager = new SoundManager(); +} +window.SoundManager = SoundManager; +window.soundManager = soundManager; +}(window)); diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js new file mode 100755 index 00000000..ddbe3420 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js @@ -0,0 +1,5989 @@ +/** @license + * + * SoundManager 2: JavaScript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code provided under the BSD License: + * http://schillmania.com/projects/soundmanager2/license.txt + * + * V2.97a.20131201 + */ + +/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */ +/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */ + +/** + * About this file + * ------------------------------------------------------------------------------------- + * This is the fully-commented source version of the SoundManager 2 API, + * recommended for use during development and testing. + * + * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.) + * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion + * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.) + * + * You may notice and comments in this source; these are delimiters for + * debug blocks which are removed in the -nodebug builds, further optimizing code size. + * + * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;) + */ + +(function(window, _undefined) { + +"use strict"; + +var soundManager = null; + +/** + * The SoundManager constructor. + * + * @constructor + * @param {string} smURL Optional: Path to SWF files + * @param {string} smID Optional: The ID to use for the SWF container element + * @this {SoundManager} + * @return {SoundManager} The new SoundManager instance + */ + +function SoundManager(smURL, smID) { + + /** + * soundManager configuration options list + * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion) + * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9}) + */ + + this.setupOptions = { + + 'url': (smURL || null), // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/ + 'flashVersion': 8, // flash build to use (8 or 9.) Some API features require 9. + 'debugMode': true, // enable debugging output (console.log() with HTML fallback) + 'debugFlash': false, // enable debugging output inside SWF, troubleshoot Flash/browser issues + 'useConsole': true, // use console.log() if available (otherwise, writes to #soundmanager-debug element) + 'consoleOnly': true, // if console is being used, do not create/write to #soundmanager-debug + 'waitForWindowLoad': false, // force SM2 to wait for window.onload() before trying to call soundManager.onload() + 'bgColor': '#ffffff', // SWF background color. N/A when wmode = 'transparent' + 'useHighPerformance': false, // position:fixed flash movie can help increase js/flash speed, minimize lag + 'flashPollingInterval': null, // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. + 'html5PollingInterval': null, // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used. + 'flashLoadTimeout': 1000, // msec to wait for flash movie to load before failing (0 = infinity) + 'wmode': null, // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work) + 'allowScriptAccess': 'always', // for scripting the SWF (object/embed property), 'always' or 'sameDomain' + 'useFlashBlock': false, // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. + 'useHTML5Audio': true, // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. + 'html5Test': /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. + 'preferFlash': false, // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky. + 'noSWFCache': false, // if true, appends ?ts={date} to break aggressive SWF caching. + 'idPrefix': 'sound' // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc. + + }; + + this.defaultOptions = { + + /** + * the default configuration for sound objects made with createSound() and related methods + * eg., volume, auto-load behaviour and so forth + */ + + 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) + 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) + 'from': null, // position to start playback within a sound (msec), default = beginning + 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) + 'onid3': null, // callback function for "ID3 data is added/available" + 'onload': null, // callback function for "load finished" + 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) + 'onplay': null, // callback for "play" start + 'onpause': null, // callback for "pause" + 'onresume': null, // callback for "resume" (pause toggle) + 'whileplaying': null, // callback during play (position update) + 'onposition': null, // object containing times and function callbacks for positions of interest + 'onstop': null, // callback for "user stop" + 'onfailure': null, // callback function for when playing fails + 'onfinish': null, // callback function for "sound finished playing" + 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time + 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled + 'position': null, // offset (milliseconds) to seek to within loaded sound data. + 'pan': 0, // "pan" settings, left-to-right, -100 to 100 + 'stream': true, // allows playing before entire file has loaded (recommended) + 'to': null, // position to end playback within a sound (msec), default = end + 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 + 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) + 'volume': 100 // self-explanatory. 0-100, the latter being the max. + + }; + + this.flash9Options = { + + /** + * flash 9-only options, + * merged into defaultOptions if flash 9 is being used + */ + + 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL + 'usePeakData': false, // enable left/right channel peak (level) data + 'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load. + 'useEQData': false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load. + 'onbufferchange': null, // callback for "isBuffering" property change + 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains) + + }; + + this.movieStarOptions = { + + /** + * flash 9.0r115+ MPEG4 audio options, + * merged into defaultOptions if flash 9+movieStar mode is enabled + */ + + 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) + 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants + 'onconnect': null, // rtmp: callback for connection to flash media server + 'duration': null // rtmp: song duration (msec) + + }; + + this.audioFormats = { + + /** + * determines HTML5 support + flash requirements. + * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start. + * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true) + */ + + 'mp3': { + 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], + 'required': true + }, + + 'mp4': { + 'related': ['aac','m4a','m4b'], // additional formats under the MP4 container + 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], + 'required': false + }, + + 'ogg': { + 'type': ['audio/ogg; codecs=vorbis'], + 'required': false + }, + + 'opus': { + 'type': ['audio/ogg; codecs=opus', 'audio/opus'], + 'required': false + }, + + 'wav': { + 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], + 'required': false + } + + }; + + // HTML attributes (id + class names) for the SWF container + + this.movieID = 'sm2-container'; + this.id = (smID || 'sm2movie'); + + this.debugID = 'soundmanager-debug'; + this.debugURLParam = /([#?&])debug=1/i; + + // dynamic attributes + + this.versionNumber = 'V2.97a.20131201'; + this.version = null; + this.movieURL = null; + this.altURL = null; + this.swfLoaded = false; + this.enabled = false; + this.oMC = null; + this.sounds = {}; + this.soundIDs = []; + this.muted = false; + this.didFlashBlock = false; + this.filePattern = null; + + this.filePatterns = { + + 'flash8': /\.mp3(\?.*)?$/i, + 'flash9': /\.mp3(\?.*)?$/i + + }; + + // support indicators, set at init + + this.features = { + + 'buffering': false, + 'peakData': false, + 'waveformData': false, + 'eqData': false, + 'movieStar': false + + }; + + // flash sandbox info, used primarily in troubleshooting + + this.sandbox = { + + // + 'type': null, + 'types': { + 'remote': 'remote (domain-based) rules', + 'localWithFile': 'local with file access (no internet access)', + 'localWithNetwork': 'local with network (internet access only, no local access)', + 'localTrusted': 'local, trusted (local+internet access)' + }, + 'description': null, + 'noRemote': null, + 'noLocal': null + // + + }; + + /** + * format support (html5/flash) + * stores canPlayType() results based on audioFormats. + * eg. { mp3: boolean, mp4: boolean } + * treat as read-only. + */ + + this.html5 = { + 'usingFlash': null // set if/when flash fallback is needed + }; + + // file type support hash + this.flash = {}; + + // determined at init time + this.html5Only = false; + + // used for special cases (eg. iPad/iPhone/palm OS?) + this.ignoreFlash = false; + + /** + * a few private internals (OK, a lot. :D) + */ + + var SMSound, + sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [], + canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, + is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)), + mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid), + isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159 + hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000, + emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs) + emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading + overHTTP = (doc.location?doc.location.protocol.match(/http/i):null), + http = (!overHTTP ? 'http:/'+'/' : ''), + // mp3, mp4, aac etc. + netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, + // Flash v9.0r115+ "moviestar" formats + netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'], + netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + + this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set + + // use altURL if not "online" + this.useAltURL = !overHTTP; + + swfCSS = { + + 'swfBox': 'sm2-object-box', + 'swfDefault': 'movieContainer', + 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) + 'swfTimedout': 'swf_timedout', + 'swfLoaded': 'swf_loaded', + 'swfUnblocked': 'swf_unblocked', // or loaded OK + 'sm2Debug': 'sm2_debug', + 'highPerf': 'high_performance', + 'flashDebug': 'flash_debug' + + }; + + /** + * basic HTML5 Audio() support test + * try...catch because of IE 9 "not implemented" nonsense + * https://github.com/Modernizr/Modernizr/issues/224 + */ + + this.hasHTML5 = (function() { + try { + // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise. + return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined); + } catch(e) { + return false; + } + }()); + + /** + * Public SoundManager API + * ----------------------- + */ + + /** + * Configures top-level soundManager properties. + * + * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' } + * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list. + */ + + this.setup = function(options) { + + var noURL = (!sm2.url); + + // warn if flash options have already been applied + + if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) { + complain(str('setupLate')); + } + + // TODO: defer: true? + + assign(options); + + // special case 1: "Late setup". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init. + + if (options) { + + if (noURL && didDCLoaded && options.url !== _undefined) { + sm2.beginDelayedInit(); + } + + // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP. + + if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') { + setTimeout(domContentLoaded, 1); + } + + } + + return sm2; + + }; + + this.ok = function() { + + return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5)); + + }; + + this.supported = this.ok; // legacy + + this.getMovie = function(smID) { + + // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version + return id(smID) || doc[smID] || window[smID]; + + }; + + /** + * Creates a SMSound sound object instance. + * + * @param {object} oOptions Sound options (at minimum, id and url parameters are required.) + * @return {object} SMSound The new SMSound object. + */ + + this.createSound = function(oOptions, _url) { + + var cs, cs_string, options, oSound = null; + + // + cs = sm + '.createSound(): '; + cs_string = cs + str(!didInit?'notReady':'notOK'); + // + + if (!didInit || !sm2.ok()) { + complain(cs_string); + return false; + } + + if (_url !== _undefined) { + // function overloading in JS! :) ..assume simple createSound(id, url) use case + oOptions = { + 'id': oOptions, + 'url': _url + }; + } + + // inherit from defaultOptions + options = mixin(oOptions); + + options.url = parseURL(options.url); + + // generate an id, if needed. + if (options.id === undefined) { + options.id = sm2.setupOptions.idPrefix + (idCounter++); + } + + // + if (options.id.toString().charAt(0).match(/^[0-9]$/)) { + sm2._wD(cs + str('badID', options.id), 2); + } + + sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1); + // + + if (idCheck(options.id, true)) { + sm2._wD(cs + options.id + ' exists', 1); + return sm2.sounds[options.id]; + } + + function make() { + + options = loopFix(options); + sm2.sounds[options.id] = new SMSound(options); + sm2.soundIDs.push(options.id); + return sm2.sounds[options.id]; + + } + + if (html5OK(options)) { + + oSound = make(); + sm2._wD(options.id + ': Using HTML5'); + oSound._setup_html5(options); + + } else { + + if (sm2.html5Only) { + sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.'); + return make(); + } + + // TODO: Move HTML5/flash checks into generic URL parsing/handling function. + + if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) { + // data: URIs not supported by Flash, either. + sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.'); + return make(); + } + + if (fV > 8) { + if (options.isMovieStar === null) { + // attempt to detect MPEG-4 formats + options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern))); + } + // + if (options.isMovieStar) { + sm2._wD(cs + 'using MovieStar handling'); + if (options.loops > 1) { + _wDS('noNSLoop'); + } + } + // + } + + options = policyFix(options, cs); + oSound = make(); + + if (fV === 8) { + flash._createSound(options.id, options.loops||1, options.usePolicyFile); + } else { + flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile); + if (!options.serverURL) { + // We are connected immediately + oSound.connected = true; + if (options.onconnect) { + options.onconnect.apply(oSound); + } + } + } + + if (!options.serverURL && (options.autoLoad || options.autoPlay)) { + // call load for non-rtmp streams + oSound.load(options); + } + + } + + // rtmp will play in onconnect + if (!options.serverURL && options.autoPlay) { + oSound.play(); + } + + return oSound; + + }; + + /** + * Destroys a SMSound sound object instance. + * + * @param {string} sID The ID of the sound to destroy + */ + + this.destroySound = function(sID, _bFromSound) { + + // explicitly destroy a sound before normal page unload, etc. + + if (!idCheck(sID)) { + return false; + } + + var oS = sm2.sounds[sID], i; + + // Disable all callbacks while the sound is being destroyed + oS._iO = {}; + + oS.stop(); + oS.unload(); + + for (i = 0; i < sm2.soundIDs.length; i++) { + if (sm2.soundIDs[i] === sID) { + sm2.soundIDs.splice(i, 1); + break; + } + } + + if (!_bFromSound) { + // ignore if being called from SMSound instance + oS.destruct(true); + } + + oS = null; + delete sm2.sounds[sID]; + + return true; + + }; + + /** + * Calls the load() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {object} oOptions Optional: Sound options + */ + + this.load = function(sID, oOptions) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].load(oOptions); + + }; + + /** + * Calls the unload() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + */ + + this.unload = function(sID) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].unload(); + + }; + + /** + * Calls the onPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPosition The position to watch for + * @param {function} oMethod The relevant callback to fire + * @param {object} oScope Optional: The scope to apply the callback to + * @return {SMSound} The SMSound object + */ + + this.onPosition = function(sID, nPosition, oMethod, oScope) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].onposition(nPosition, oMethod, oScope); + + }; + + // legacy/backwards-compability: lower-case method name + this.onposition = this.onPosition; + + /** + * Calls the clearOnPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPosition The position to watch for + * @param {function} oMethod Optional: The relevant callback to fire + * @return {SMSound} The SMSound object + */ + + this.clearOnPosition = function(sID, nPosition, oMethod) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].clearOnPosition(nPosition, oMethod); + + }; + + /** + * Calls the play() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.play = function(sID, oOptions) { + + var result = null, + // legacy function-overloading use case: play('mySound', '/path/to/some.mp3'); + overloaded = (oOptions && !(oOptions instanceof Object)); + + if (!didInit || !sm2.ok()) { + complain(sm + '.play(): ' + str(!didInit?'notReady':'notOK')); + return false; + } + + if (!idCheck(sID, overloaded)) { + + if (!overloaded) { + // no sound found for the given ID. Bail. + return false; + } + + if (overloaded) { + oOptions = { + url: oOptions + }; + } + + if (oOptions && oOptions.url) { + // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'}); + sm2._wD(sm + '.play(): Attempting to create "' + sID + '"', 1); + oOptions.id = sID; + result = sm2.createSound(oOptions).play(); + } + + } else if (overloaded) { + + // existing sound object case + oOptions = { + url: oOptions + }; + + } + + if (result === null) { + // default case + result = sm2.sounds[sID].play(oOptions); + } + + return result; + + }; + + this.start = this.play; // just for convenience + + /** + * Calls the setPosition() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nMsecOffset Position (milliseconds) + * @return {SMSound} The SMSound object + */ + + this.setPosition = function(sID, nMsecOffset) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setPosition(nMsecOffset); + + }; + + /** + * Calls the stop() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.stop = function(sID) { + + if (!idCheck(sID)) { + return false; + } + + sm2._wD(sm + '.stop(' + sID + ')', 1); + return sm2.sounds[sID].stop(); + + }; + + /** + * Stops all currently-playing sounds. + */ + + this.stopAll = function() { + + var oSound; + sm2._wD(sm + '.stopAll()', 1); + + for (oSound in sm2.sounds) { + if (sm2.sounds.hasOwnProperty(oSound)) { + // apply only to sound objects + sm2.sounds[oSound].stop(); + } + } + + }; + + /** + * Calls the pause() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.pause = function(sID) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].pause(); + + }; + + /** + * Pauses all currently-playing sounds. + */ + + this.pauseAll = function() { + + var i; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].pause(); + } + + }; + + /** + * Calls the resume() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.resume = function(sID) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].resume(); + + }; + + /** + * Resumes all currently-paused sounds. + */ + + this.resumeAll = function() { + + var i; + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].resume(); + } + + }; + + /** + * Calls the togglePause() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.togglePause = function(sID) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].togglePause(); + + }; + + /** + * Calls the setPan() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nPan The pan value (-100 to 100) + * @return {SMSound} The SMSound object + */ + + this.setPan = function(sID, nPan) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setPan(nPan); + + }; + + /** + * Calls the setVolume() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @param {number} nVol The volume value (0 to 100) + * @return {SMSound} The SMSound object + */ + + this.setVolume = function(sID, nVol) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].setVolume(nVol); + + }; + + /** + * Calls the mute() method of either a single SMSound object by ID, or all sound objects. + * + * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) + */ + + this.mute = function(sID) { + + var i = 0; + + if (sID instanceof String) { + sID = null; + } + + if (!sID) { + + sm2._wD(sm + '.mute(): Muting all sounds'); + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].mute(); + } + sm2.muted = true; + + } else { + + if (!idCheck(sID)) { + return false; + } + sm2._wD(sm + '.mute(): Muting "' + sID + '"'); + return sm2.sounds[sID].mute(); + + } + + return true; + + }; + + /** + * Mutes all sounds. + */ + + this.muteAll = function() { + + sm2.mute(); + + }; + + /** + * Calls the unmute() method of either a single SMSound object by ID, or all sound objects. + * + * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) + */ + + this.unmute = function(sID) { + + var i; + + if (sID instanceof String) { + sID = null; + } + + if (!sID) { + + sm2._wD(sm + '.unmute(): Unmuting all sounds'); + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].unmute(); + } + sm2.muted = false; + + } else { + + if (!idCheck(sID)) { + return false; + } + sm2._wD(sm + '.unmute(): Unmuting "' + sID + '"'); + return sm2.sounds[sID].unmute(); + + } + + return true; + + }; + + /** + * Unmutes all sounds. + */ + + this.unmuteAll = function() { + + sm2.unmute(); + + }; + + /** + * Calls the toggleMute() method of a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.toggleMute = function(sID) { + + if (!idCheck(sID)) { + return false; + } + return sm2.sounds[sID].toggleMute(); + + }; + + /** + * Retrieves the memory used by the flash plugin. + * + * @return {number} The amount of memory in use + */ + + this.getMemoryUse = function() { + + // flash-only + var ram = 0; + + if (flash && fV !== 8) { + ram = parseInt(flash._getMemoryUse(), 10); + } + + return ram; + + }; + + /** + * Undocumented: NOPs soundManager and all SMSound objects. + */ + + this.disable = function(bNoDisable) { + + // destroy all functions + var i; + + if (bNoDisable === _undefined) { + bNoDisable = false; + } + + if (disabled) { + return false; + } + + disabled = true; + _wDS('shutdown', 1); + + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + disableObject(sm2.sounds[sm2.soundIDs[i]]); + } + + // fire "complete", despite fail + initComplete(bNoDisable); + event.remove(window, 'load', initUserOnload); + + return true; + + }; + + /** + * Determines playability of a MIME type, eg. 'audio/mp3'. + */ + + this.canPlayMIME = function(sMIME) { + + var result; + + if (sm2.hasHTML5) { + result = html5CanPlay({type:sMIME}); + } + + if (!result && needsFlash) { + // if flash 9, test netStream (movieStar) types as well. + result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less "weird" (per JSLint) + } + + return result; + + }; + + /** + * Determines playability of a URL based on audio support. + * + * @param {string} sURL The URL to test + * @return {boolean} URL playability + */ + + this.canPlayURL = function(sURL) { + + var result; + + if (sm2.hasHTML5) { + result = html5CanPlay({url: sURL}); + } + + if (!result && needsFlash) { + result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null); + } + + return result; + + }; + + /** + * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support. + * + * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes + * @return {boolean} URL playability + */ + + this.canPlayLink = function(oLink) { + + if (oLink.type !== _undefined && oLink.type) { + if (sm2.canPlayMIME(oLink.type)) { + return true; + } + } + + return sm2.canPlayURL(oLink.href); + + }; + + /** + * Retrieves a SMSound object by ID. + * + * @param {string} sID The ID of the sound + * @return {SMSound} The SMSound object + */ + + this.getSoundById = function(sID, _suppressDebug) { + + if (!sID) { + return null; + } + + var result = sm2.sounds[sID]; + + // + if (!result && !_suppressDebug) { + sm2._wD(sm + '.getSoundById(): Sound "' + sID + '" not found.', 2); + } + // + + return result; + + }; + + /** + * Queues a callback for execution when SoundManager has successfully initialized. + * + * @param {function} oMethod The callback method to fire + * @param {object} oScope Optional: The scope to apply to the callback + */ + + this.onready = function(oMethod, oScope) { + + var sType = 'onready', + result = false; + + if (typeof oMethod === 'function') { + + // + if (didInit) { + sm2._wD(str('queue', sType)); + } + // + + if (!oScope) { + oScope = window; + } + + addOnEvent(sType, oMethod, oScope); + processOnEvents(); + + result = true; + + } else { + + throw str('needFunction', sType); + + } + + return result; + + }; + + /** + * Queues a callback for execution when SoundManager has failed to initialize. + * + * @param {function} oMethod The callback method to fire + * @param {object} oScope Optional: The scope to apply to the callback + */ + + this.ontimeout = function(oMethod, oScope) { + + var sType = 'ontimeout', + result = false; + + if (typeof oMethod === 'function') { + + // + if (didInit) { + sm2._wD(str('queue', sType)); + } + // + + if (!oScope) { + oScope = window; + } + + addOnEvent(sType, oMethod, oScope); + processOnEvents({type:sType}); + + result = true; + + } else { + + throw str('needFunction', sType); + + } + + return result; + + }; + + /** + * Writes console.log()-style debug output to a console or in-browser element. + * Applies when debugMode = true + * + * @param {string} sText The console message + * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped. + */ + + this._writeDebug = function(sText, sTypeOrObject) { + + // pseudo-private console.log()-style output + // + + var sDID = 'soundmanager-debug', o, oItem; + + if (!sm2.debugMode) { + return false; + } + + if (hasConsole && sm2.useConsole) { + if (sTypeOrObject && typeof sTypeOrObject === 'object') { + // object passed; dump to console. + console.log(sText, sTypeOrObject); + } else if (debugLevels[sTypeOrObject] !== _undefined) { + console[debugLevels[sTypeOrObject]](sText); + } else { + console.log(sText); + } + if (sm2.consoleOnly) { + return true; + } + } + + o = id(sDID); + + if (!o) { + return false; + } + + oItem = doc.createElement('div'); + + if (++wdCount % 2 === 0) { + oItem.className = 'sm2-alt'; + } + + if (sTypeOrObject === _undefined) { + sTypeOrObject = 0; + } else { + sTypeOrObject = parseInt(sTypeOrObject, 10); + } + + oItem.appendChild(doc.createTextNode(sText)); + + if (sTypeOrObject) { + if (sTypeOrObject >= 2) { + oItem.style.fontWeight = 'bold'; + } + if (sTypeOrObject === 3) { + oItem.style.color = '#ff3333'; + } + } + + // top-to-bottom + // o.appendChild(oItem); + + // bottom-to-top + o.insertBefore(oItem, o.firstChild); + + o = null; + // + + return true; + + }; + + // + // last-resort debugging option + if (wl.indexOf('sm2-debug=alert') !== -1) { + this._writeDebug = function(sText) { + window.alert(sText); + }; + } + // + + // alias + this._wD = this._writeDebug; + + /** + * Provides debug / state information on all SMSound objects. + */ + + this._debug = function() { + + // + var i, j; + _wDS('currentObj', 1); + + for (i = 0, j = sm2.soundIDs.length; i < j; i++) { + sm2.sounds[sm2.soundIDs[i]]._debug(); + } + // + + }; + + /** + * Restarts and re-initializes the SoundManager instance. + * + * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks. + * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2). + * @return {object} soundManager The soundManager instance. + */ + + this.reboot = function(resetEvents, excludeInit) { + + // reset some (or all) state, and re-init unless otherwise specified. + + // + if (sm2.soundIDs.length) { + sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...'); + } + // + + var i, j, k; + + for (i = sm2.soundIDs.length-1; i >= 0; i--) { + sm2.sounds[sm2.soundIDs[i]].destruct(); + } + + // trash ze flash (remove from the DOM) + + if (flash) { + + try { + + if (isIE) { + oRemovedHTML = flash.innerHTML; + } + + oRemoved = flash.parentNode.removeChild(flash); + + } catch(e) { + + // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue. + + _wDS('badRemove', 2); + + } + + } + + // actually, force recreate of movie. + + oRemovedHTML = oRemoved = needsFlash = flash = null; + + sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false; + + sm2.soundIDs = []; + sm2.sounds = {}; + + idCounter = 0; + + if (!resetEvents) { + // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init + for (i in on_queue) { + if (on_queue.hasOwnProperty(i)) { + for (j = 0, k = on_queue[i].length; j < k; j++) { + on_queue[i][j].fired = false; + } + } + } + } else { + // remove all callbacks entirely + on_queue = []; + } + + // + if (!excludeInit) { + sm2._wD(sm + ': Rebooting...'); + } + // + + // reset HTML5 and flash canPlay test results + + sm2.html5 = { + 'usingFlash': null + }; + + sm2.flash = {}; + + // reset device-specific HTML/flash mode switches + + sm2.html5Only = false; + sm2.ignoreFlash = false; + + window.setTimeout(function() { + + preInit(); + + // by default, re-init + + if (!excludeInit) { + sm2.beginDelayedInit(); + } + + }, 20); + + return sm2; + + }; + + this.reset = function() { + + /** + * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed. + * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit(). + * @return {object} soundManager The soundManager instance. + */ + + _wDS('reset'); + return sm2.reboot(true, true); + + }; + + /** + * Undocumented: Determines the SM2 flash movie's load progress. + * + * @return {number or null} Percent loaded, or if invalid/unsupported, null. + */ + + this.getMoviePercent = function() { + + /** + * Interesting syntax notes... + * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof "function" nor instanceof Function, but are still valid. + * Additionally, JSLint dislikes ('PercentLoaded' in flash)-style syntax and recommends hasOwnProperty(), which does not work in this case. + * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw "object doesn't support this property or method". + * Thus, 'in' syntax must be used. + */ + + return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); // Yes, JSLint. See nearby comment in source for explanation. + + }; + + /** + * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload(). + */ + + this.beginDelayedInit = function() { + + windowLoaded = true; + domContentLoaded(); + + setTimeout(function() { + + if (initPending) { + return false; + } + + createMovie(); + initMovie(); + initPending = true; + + return true; + + }, 20); + + delayWaitForEI(); + + }; + + /** + * Destroys the SoundManager instance and all SMSound instances. + */ + + this.destruct = function() { + + sm2._wD(sm + '.destruct()'); + sm2.disable(true); + + }; + + /** + * SMSound() (sound object) constructor + * ------------------------------------ + * + * @param {object} oOptions Sound options (id and url are required attributes) + * @return {SMSound} The new SMSound object + */ + + SMSound = function(oOptions) { + + var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted; + + lastHTML5State = { + // tracks duration + position (time) + duration: null, + time: null + }; + + this.id = oOptions.id; + + // legacy + this.sID = this.id; + + this.url = oOptions.url; + this.options = mixin(oOptions); + + // per-play-instance-specific options + this.instanceOptions = this.options; + + // short alias + this._iO = this.instanceOptions; + + // assign property defaults + this.pan = this.options.pan; + this.volume = this.options.volume; + + // whether or not this object is using HTML5 + this.isHTML5 = false; + + // internal HTML5 Audio() object reference + this._a = null; + + // for flash 8 special-case createSound() without url, followed by load/play with url case + urlOmitted = (this.url ? false : true); + + /** + * SMSound() public methods + * ------------------------ + */ + + this.id3 = {}; + + /** + * Writes SMSound object parameters to debug console + */ + + this._debug = function() { + + // + sm2._wD(s.id + ': Merged options:', s.options); + // + + }; + + /** + * Begins loading a sound per its *url*. + * + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.load = function(oOptions) { + + var oSound = null, instanceOptions; + + if (oOptions !== _undefined) { + s._iO = mixin(oOptions, s.options); + } else { + oOptions = s.options; + s._iO = oOptions; + if (lastURL && lastURL !== s.url) { + _wDS('manURL'); + s._iO.url = s.url; + s.url = null; + } + } + + if (!s._iO.url) { + s._iO.url = s.url; + } + + s._iO.url = parseURL(s._iO.url); + + // ensure we're in sync + s.instanceOptions = s._iO; + + // local shortcut + instanceOptions = s._iO; + + sm2._wD(s.id + ': load (' + instanceOptions.url + ')'); + + if (!instanceOptions.url && !s.url) { + sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2); + return s; + } + + // + if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) { + // flash 8 load() -> play() won't work before onload has fired. + sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1); + } + // + + if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) { + _wDS('onURL', 1); + // if loaded and an onload() exists, fire immediately. + if (s.readyState === 3 && instanceOptions.onload) { + // assume success based on truthy duration. + wrapCallback(s, function() { + instanceOptions.onload.apply(s, [(!!s.duration)]); + }); + } + return s; + } + + // reset a few state properties + + s.loaded = false; + s.readyState = 1; + s.playState = 0; + s.id3 = {}; + + // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio. + + if (html5OK(instanceOptions)) { + + oSound = s._setup_html5(instanceOptions); + + if (!oSound._called_load) { + + s._html5_canplay = false; + + // TODO: review called_load / html5_canplay logic + + // if url provided directly to load(), assign it here. + + if (s.url !== instanceOptions.url) { + + sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url); + + s._a.src = instanceOptions.url; + + // TODO: review / re-apply all relevant options (volume, loop, onposition etc.) + + // reset position for new URL + s.setPosition(0); + + } + + // given explicit load call, try to preload. + + // early HTML5 implementation (non-standard) + s._a.autobuffer = 'auto'; + + // standard property, values: none / metadata / auto + // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx + s._a.preload = 'auto'; + + s._a._called_load = true; + + } else { + + sm2._wD(s.id + ': Ignoring request to load again'); + + } + + } else { + + if (sm2.html5Only) { + sm2._wD(s.id + ': No flash support. Exiting.'); + return s; + } + + if (s._iO.url && s._iO.url.match(/data\:/i)) { + // data: URIs not supported by Flash, either. + sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.'); + return s; + } + + try { + s.isHTML5 = false; + s._iO = policyFix(loopFix(instanceOptions)); + // re-assign local shortcut + instanceOptions = s._iO; + if (fV === 8) { + flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile); + } else { + flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile); + } + } catch(e) { + _wDS('smError', 2); + debugTS('onload', false); + catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); + } + + } + + // after all of this, ensure sound url is up to date. + s.url = instanceOptions.url; + + return s; + + }; + + /** + * Unloads a sound, canceling any open HTTP requests. + * + * @return {SMSound} The SMSound object + */ + + this.unload = function() { + + // Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL + // Flash 9/AS3: Close stream, preventing further load + // HTML5: Most UAs will use empty URL + + if (s.readyState !== 0) { + + sm2._wD(s.id + ': unload()'); + + if (!s.isHTML5) { + + if (fV === 8) { + flash._unload(s.id, emptyURL); + } else { + flash._unload(s.id); + } + + } else { + + stop_html5_timer(); + + if (s._a) { + + s._a.pause(); + + // update empty URL, too + lastURL = html5Unload(s._a); + + } + + } + + // reset load/status flags + resetProperties(); + + } + + return s; + + }; + + /** + * Unloads and destroys a sound. + */ + + this.destruct = function(_bFromSM) { + + sm2._wD(s.id + ': Destruct'); + + if (!s.isHTML5) { + + // kill sound within Flash + // Disable the onfailure handler + s._iO.onfailure = null; + flash._destroySound(s.id); + + } else { + + stop_html5_timer(); + + if (s._a) { + s._a.pause(); + html5Unload(s._a); + if (!useGlobalHTML5Audio) { + remove_html5_events(); + } + // break obvious circular reference + s._a._s = null; + s._a = null; + } + + } + + if (!_bFromSM) { + // ensure deletion from controller + sm2.destroySound(s.id, true); + } + + }; + + /** + * Begins playing a sound. + * + * @param {object} oOptions Optional: Sound options + * @return {SMSound} The SMSound object + */ + + this.play = function(oOptions, _updatePlayState) { + + var fN, allowMulti, a, onready, + audioClone, onended, oncanplay, + startOK = true, + exit = null; + + // + fN = s.id + ': play(): '; + // + + // default to true + _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState); + + if (!oOptions) { + oOptions = {}; + } + + // first, use local URL (if specified) + if (s.url) { + s._iO.url = s.url; + } + + // mix in any options defined at createSound() + s._iO = mixin(s._iO, s.options); + + // mix in any options specific to this method + s._iO = mixin(oOptions, s._iO); + + s._iO.url = parseURL(s._iO.url); + + s.instanceOptions = s._iO; + + // RTMP-only + if (!s.isHTML5 && s._iO.serverURL && !s.connected) { + if (!s.getAutoPlay()) { + sm2._wD(fN +' Netstream not connected yet - setting autoPlay'); + s.setAutoPlay(true); + } + // play will be called in onconnect() + return s; + } + + if (html5OK(s._iO)) { + s._setup_html5(s._iO); + start_html5_timer(); + } + + if (s.playState === 1 && !s.paused) { + allowMulti = s._iO.multiShot; + if (!allowMulti) { + sm2._wD(fN + 'Already playing (one-shot)', 1); + if (s.isHTML5) { + // go back to original position. + s.setPosition(s._iO.position); + } + exit = s; + } else { + sm2._wD(fN + 'Already playing (multi-shot)', 1); + } + } + + if (exit !== null) { + return exit; + } + + // edge case: play() with explicit URL parameter + if (oOptions.url && oOptions.url !== s.url) { + + // special case for createSound() followed by load() / play() with url; avoid double-load case. + if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) { + + urlOmitted = false; + + } else { + + // load using merged options + s.load(s._iO); + + } + + } + + if (!s.loaded) { + + if (s.readyState === 0) { + + sm2._wD(fN + 'Attempting to load'); + + // try to get this sound playing ASAP + if (!s.isHTML5 && !sm2.html5Only) { + + // flash: assign directly because setAutoPlay() increments the instanceCount + s._iO.autoPlay = true; + s.load(s._iO); + + } else if (s.isHTML5) { + + // iOS needs this when recycling sounds, loading a new URL on an existing object. + s.load(s._iO); + + } else { + + sm2._wD(fN + 'Unsupported type. Exiting.'); + exit = s; + + } + + // HTML5 hack - re-set instanceOptions? + s.instanceOptions = s._iO; + + } else if (s.readyState === 2) { + + sm2._wD(fN + 'Could not load - exiting', 2); + exit = s; + + } else { + + sm2._wD(fN + 'Loading - attempting to play...'); + + } + + } else { + + // "play()" + sm2._wD(fN.substr(0, fN.lastIndexOf(':'))); + + } + + if (exit !== null) { + return exit; + } + + if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) { + // flash 9 needs a position reset if play() is called while at the end of a sound. + sm2._wD(fN + 'Sound at end, resetting to position:0'); + oOptions.position = 0; + } + + /** + * Streams will pause when their buffer is full if they are being loaded. + * In this case paused is true, but the song hasn't started playing yet. + * If we just call resume() the onplay() callback will never be called. + * So only call resume() if the position is > 0. + * Another reason is because options like volume won't have been applied yet. + * For normal sounds, just resume. + */ + + if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) { + + // https://gist.github.com/37b17df75cc4d7a90bf6 + sm2._wD(fN + 'Resuming from paused state', 1); + s.resume(); + + } else { + + s._iO = mixin(oOptions, s._iO); + + // apply from/to parameters, if they exist (and not using RTMP) + if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) { + + onready = function() { + // sound "canplay" or onload() + // re-apply from/to to instance options, and start playback + s._iO = mixin(oOptions, s._iO); + s.play(s._iO); + }; + + // HTML5 needs to at least have "canplay" fired before seeking. + if (s.isHTML5 && !s._html5_canplay) { + + // this hasn't been loaded yet. load it first, and then do this again. + sm2._wD(fN + 'Beginning load for from/to case'); + + s.load({ + // note: custom HTML5-only event added for from/to implementation. + _oncanplay: onready + }); + + exit = false; + + } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) { + + // to be safe, preload the whole thing in Flash. + + sm2._wD(fN + 'Preloading for from/to case'); + + s.load({ + onload: onready + }); + + exit = false; + + } + + if (exit !== null) { + return exit; + } + + // otherwise, we're ready to go. re-apply local options, and continue + + s._iO = applyFromTo(); + + } + + // sm2._wD(fN + 'Starting to play'); + + // increment instance counter, where enabled + supported + if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) { + s.instanceCount++; + } + + // if first play and onposition parameters exist, apply them now + if (s._iO.onposition && s.playState === 0) { + attachOnPosition(s); + } + + s.playState = 1; + s.paused = false; + + s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0); + + if (!s.isHTML5) { + s._iO = policyFix(loopFix(s._iO)); + } + + if (s._iO.onplay && _updatePlayState) { + s._iO.onplay.apply(s); + onplay_called = true; + } + + s.setVolume(s._iO.volume, true); + s.setPan(s._iO.pan, true); + + if (!s.isHTML5) { + + startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false); + + if (fV === 9 && !startOK) { + // edge case: no sound hardware, or 32-channel flash ceiling hit. + // applies only to Flash 9, non-NetStream/MovieStar sounds. + // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29 + sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2); + if (s._iO.onplayerror) { + s._iO.onplayerror.apply(s); + } + + } + + } else { + + if (s.instanceCount < 2) { + + // HTML5 single-instance case + + start_html5_timer(); + + a = s._setup_html5(); + + s.setPosition(s._iO.position); + + a.play(); + + } else { + + // HTML5 multi-shot case + + sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...'); + + audioClone = new Audio(s._iO.url); + + onended = function() { + event.remove(audioClone, 'ended', onended); + s._onfinish(s); + // cleanup + html5Unload(audioClone); + audioClone = null; + }; + + oncanplay = function() { + event.remove(audioClone, 'canplay', oncanplay); + try { + audioClone.currentTime = s._iO.position/msecScale; + } catch(err) { + complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position/msecScale)); + } + audioClone.play(); + }; + + event.add(audioClone, 'ended', onended); + + // apply volume to clones, too + if (s._iO.volume !== undefined) { + audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100)); + } + + // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it. + if (s.muted) { + audioClone.muted = true; + } + + if (s._iO.position) { + // HTML5 audio can't seek before onplay() event has fired. + // wait for canplay, then seek to position and start playback. + event.add(audioClone, 'canplay', oncanplay); + } else { + // begin playback at currentTime: 0 + audioClone.play(); + } + + } + + } + + } + + return s; + + }; + + // just for convenience + this.start = this.play; + + /** + * Stops playing a sound (and optionally, all sounds) + * + * @param {boolean} bAll Optional: Whether to stop all sounds + * @return {SMSound} The SMSound object + */ + + this.stop = function(bAll) { + + var instanceOptions = s._iO, + originalPosition; + + if (s.playState === 1) { + + sm2._wD(s.id + ': stop()'); + + s._onbufferchange(0); + s._resetOnPosition(0); + s.paused = false; + + if (!s.isHTML5) { + s.playState = 0; + } + + // remove onPosition listeners, if any + detachOnPosition(); + + // and "to" position, if set + if (instanceOptions.to) { + s.clearOnPosition(instanceOptions.to); + } + + if (!s.isHTML5) { + + flash._stop(s.id, bAll); + + // hack for netStream: just unload + if (instanceOptions.serverURL) { + s.unload(); + } + + } else { + + if (s._a) { + + originalPosition = s.position; + + // act like Flash, though + s.setPosition(0); + + // hack: reflect old position for onstop() (also like Flash) + s.position = originalPosition; + + // html5 has no stop() + // NOTE: pausing means iOS requires interaction to resume. + s._a.pause(); + + s.playState = 0; + + // and update UI + s._onTimer(); + + stop_html5_timer(); + + } + + } + + s.instanceCount = 0; + s._iO = {}; + + if (instanceOptions.onstop) { + instanceOptions.onstop.apply(s); + } + + } + + return s; + + }; + + /** + * Undocumented/internal: Sets autoPlay for RTMP. + * + * @param {boolean} autoPlay state + */ + + this.setAutoPlay = function(autoPlay) { + + sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off')); + s._iO.autoPlay = autoPlay; + + if (!s.isHTML5) { + flash._setAutoPlay(s.id, autoPlay); + if (autoPlay) { + // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) + if (!s.instanceCount && s.readyState === 1) { + s.instanceCount++; + sm2._wD(s.id + ': Incremented instance count to '+s.instanceCount); + } + } + } + + }; + + /** + * Undocumented/internal: Returns the autoPlay boolean. + * + * @return {boolean} The current autoPlay value + */ + + this.getAutoPlay = function() { + + return s._iO.autoPlay; + + }; + + /** + * Sets the position of a sound. + * + * @param {number} nMsecOffset Position (milliseconds) + * @return {SMSound} The SMSound object + */ + + this.setPosition = function(nMsecOffset) { + + if (nMsecOffset === _undefined) { + nMsecOffset = 0; + } + + var position, position1K, + // Use the duration from the instance options, if we don't have a track duration yet. + // position >= 0 and <= current available (loaded) duration + offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0))); + + s.position = offset; + position1K = s.position/msecScale; + s._resetOnPosition(s.position); + s._iO.position = offset; + + if (!s.isHTML5) { + + position = (fV === 9 ? s.position : position1K); + + if (s.readyState && s.readyState !== 2) { + // if paused or not playing, will not resume (by playing) + flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot); + } + + } else if (s._a) { + + // Set the position in the canplay handler if the sound is not ready yet + if (s._html5_canplay) { + + if (s._a.currentTime !== position1K) { + + /** + * DOM/JS errors/exceptions to watch out for: + * if seek is beyond (loaded?) position, "DOM exception 11" + * "INDEX_SIZE_ERR": DOM exception 1 + */ + sm2._wD(s.id + ': setPosition('+position1K+')'); + + try { + s._a.currentTime = position1K; + if (s.playState === 0 || s.paused) { + // allow seek without auto-play/resume + s._a.pause(); + } + } catch(e) { + sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2); + } + + } + + } else if (position1K) { + + // warn on non-zero seek attempts + sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2); + return s; + + } + + if (s.paused) { + + // if paused, refresh UI right away + // force update + s._onTimer(true); + + } + + } + + return s; + + }; + + /** + * Pauses sound playback. + * + * @return {SMSound} The SMSound object + */ + + this.pause = function(_bCallFlash) { + + if (s.paused || (s.playState === 0 && s.readyState !== 1)) { + return s; + } + + sm2._wD(s.id + ': pause()'); + s.paused = true; + + if (!s.isHTML5) { + if (_bCallFlash || _bCallFlash === _undefined) { + flash._pause(s.id, s._iO.multiShot); + } + } else { + s._setup_html5().pause(); + stop_html5_timer(); + } + + if (s._iO.onpause) { + s._iO.onpause.apply(s); + } + + return s; + + }; + + /** + * Resumes sound playback. + * + * @return {SMSound} The SMSound object + */ + + /** + * When auto-loaded streams pause on buffer full they have a playState of 0. + * We need to make sure that the playState is set to 1 when these streams "resume". + * When a paused stream is resumed, we need to trigger the onplay() callback if it + * hasn't been called already. In this case since the sound is being played for the + * first time, I think it's more appropriate to call onplay() rather than onresume(). + */ + + this.resume = function() { + + var instanceOptions = s._iO; + + if (!s.paused) { + return s; + } + + sm2._wD(s.id + ': resume()'); + s.paused = false; + s.playState = 1; + + if (!s.isHTML5) { + if (instanceOptions.isMovieStar && !instanceOptions.serverURL) { + // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition. + s.setPosition(s.position); + } + // flash method is toggle-based (pause/resume) + flash._pause(s.id, instanceOptions.multiShot); + } else { + s._setup_html5().play(); + start_html5_timer(); + } + + if (!onplay_called && instanceOptions.onplay) { + instanceOptions.onplay.apply(s); + onplay_called = true; + } else if (instanceOptions.onresume) { + instanceOptions.onresume.apply(s); + } + + return s; + + }; + + /** + * Toggles sound playback. + * + * @return {SMSound} The SMSound object + */ + + this.togglePause = function() { + + sm2._wD(s.id + ': togglePause()'); + + if (s.playState === 0) { + s.play({ + position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale) + }); + return s; + } + + if (s.paused) { + s.resume(); + } else { + s.pause(); + } + + return s; + + }; + + /** + * Sets the panning (L-R) effect. + * + * @param {number} nPan The pan value (-100 to 100) + * @return {SMSound} The SMSound object + */ + + this.setPan = function(nPan, bInstanceOnly) { + + if (nPan === _undefined) { + nPan = 0; + } + + if (bInstanceOnly === _undefined) { + bInstanceOnly = false; + } + + if (!s.isHTML5) { + flash._setPan(s.id, nPan); + } // else { no HTML5 pan? } + + s._iO.pan = nPan; + + if (!bInstanceOnly) { + s.pan = nPan; + s.options.pan = nPan; + } + + return s; + + }; + + /** + * Sets the volume. + * + * @param {number} nVol The volume value (0 to 100) + * @return {SMSound} The SMSound object + */ + + this.setVolume = function(nVol, _bInstanceOnly) { + + /** + * Note: Setting volume has no effect on iOS "special snowflake" devices. + * Hardware volume control overrides software, and volume + * will always return 1 per Apple docs. (iOS 4 + 5.) + * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html + */ + + if (nVol === _undefined) { + nVol = 100; + } + + if (_bInstanceOnly === _undefined) { + _bInstanceOnly = false; + } + + if (!s.isHTML5) { + flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol); + } else if (s._a) { + if (sm2.muted && !s.muted) { + s.muted = true; + s._a.muted = true; + } + // valid range: 0-1 + s._a.volume = Math.max(0, Math.min(1, nVol/100)); + } + + s._iO.volume = nVol; + + if (!_bInstanceOnly) { + s.volume = nVol; + s.options.volume = nVol; + } + + return s; + + }; + + /** + * Mutes the sound. + * + * @return {SMSound} The SMSound object + */ + + this.mute = function() { + + s.muted = true; + + if (!s.isHTML5) { + flash._setVolume(s.id, 0); + } else if (s._a) { + s._a.muted = true; + } + + return s; + + }; + + /** + * Unmutes the sound. + * + * @return {SMSound} The SMSound object + */ + + this.unmute = function() { + + s.muted = false; + var hasIO = (s._iO.volume !== _undefined); + + if (!s.isHTML5) { + flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume); + } else if (s._a) { + s._a.muted = false; + } + + return s; + + }; + + /** + * Toggles the muted state of a sound. + * + * @return {SMSound} The SMSound object + */ + + this.toggleMute = function() { + + return (s.muted?s.unmute():s.mute()); + + }; + + /** + * Registers a callback to be fired when a sound reaches a given position during playback. + * + * @param {number} nPosition The position to watch for + * @param {function} oMethod The relevant callback to fire + * @param {object} oScope Optional: The scope to apply the callback to + * @return {SMSound} The SMSound object + */ + + this.onPosition = function(nPosition, oMethod, oScope) { + + // TODO: basic dupe checking? + + onPositionItems.push({ + position: parseInt(nPosition, 10), + method: oMethod, + scope: (oScope !== _undefined ? oScope : s), + fired: false + }); + + return s; + + }; + + // legacy/backwards-compability: lower-case method name + this.onposition = this.onPosition; + + /** + * Removes registered callback(s) from a sound, by position and/or callback. + * + * @param {number} nPosition The position to clear callback(s) for + * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position + * @return {SMSound} The SMSound object + */ + + this.clearOnPosition = function(nPosition, oMethod) { + + var i; + + nPosition = parseInt(nPosition, 10); + + if (isNaN(nPosition)) { + // safety check + return false; + } + + for (i=0; i < onPositionItems.length; i++) { + + if (nPosition === onPositionItems[i].position) { + // remove this item if no method was specified, or, if the method matches + if (!oMethod || (oMethod === onPositionItems[i].method)) { + if (onPositionItems[i].fired) { + // decrement "fired" counter, too + onPositionFired--; + } + onPositionItems.splice(i, 1); + } + } + + } + + }; + + this._processOnPosition = function() { + + var i, item, j = onPositionItems.length; + + if (!j || !s.playState || onPositionFired >= j) { + return false; + } + + for (i=j-1; i >= 0; i--) { + item = onPositionItems[i]; + if (!item.fired && s.position >= item.position) { + item.fired = true; + onPositionFired++; + item.method.apply(item.scope, [item.position]); + j = onPositionItems.length; // reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop. + } + } + + return true; + + }; + + this._resetOnPosition = function(nPosition) { + + // reset "fired" for items interested in this position + var i, item, j = onPositionItems.length; + + if (!j) { + return false; + } + + for (i=j-1; i >= 0; i--) { + item = onPositionItems[i]; + if (item.fired && nPosition <= item.position) { + item.fired = false; + onPositionFired--; + } + } + + return true; + + }; + + /** + * SMSound() private internals + * -------------------------------- + */ + + applyFromTo = function() { + + var instanceOptions = s._iO, + f = instanceOptions.from, + t = instanceOptions.to, + start, end; + + end = function() { + + // end has been reached. + sm2._wD(s.id + ': "To" time of ' + t + ' reached.'); + + // detach listener + s.clearOnPosition(t, end); + + // stop should clear this, too + s.stop(); + + }; + + start = function() { + + sm2._wD(s.id + ': Playing "from" ' + f); + + // add listener for end + if (t !== null && !isNaN(t)) { + s.onPosition(t, end); + } + + }; + + if (f !== null && !isNaN(f)) { + + // apply to instance options, guaranteeing correct start position. + instanceOptions.position = f; + + // multiShot timing can't be tracked, so prevent that. + instanceOptions.multiShot = false; + + start(); + + } + + // return updated instanceOptions including starting position + return instanceOptions; + + }; + + attachOnPosition = function() { + + var item, + op = s._iO.onposition; + + // attach onposition things, if any, now. + + if (op) { + + for (item in op) { + if (op.hasOwnProperty(item)) { + s.onPosition(parseInt(item, 10), op[item]); + } + } + + } + + }; + + detachOnPosition = function() { + + var item, + op = s._iO.onposition; + + // detach any onposition()-style listeners. + + if (op) { + + for (item in op) { + if (op.hasOwnProperty(item)) { + s.clearOnPosition(parseInt(item, 10)); + } + } + + } + + }; + + start_html5_timer = function() { + + if (s.isHTML5) { + startTimer(s); + } + + }; + + stop_html5_timer = function() { + + if (s.isHTML5) { + stopTimer(s); + } + + }; + + resetProperties = function(retainPosition) { + + if (!retainPosition) { + onPositionItems = []; + onPositionFired = 0; + } + + onplay_called = false; + + s._hasTimer = null; + s._a = null; + s._html5_canplay = false; + s.bytesLoaded = null; + s.bytesTotal = null; + s.duration = (s._iO && s._iO.duration ? s._iO.duration : null); + s.durationEstimate = null; + s.buffered = []; + + // legacy: 1D array + s.eqData = []; + + s.eqData.left = []; + s.eqData.right = []; + + s.failures = 0; + s.isBuffering = false; + s.instanceOptions = {}; + s.instanceCount = 0; + s.loaded = false; + s.metadata = {}; + + // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success + s.readyState = 0; + + s.muted = false; + s.paused = false; + + s.peakData = { + left: 0, + right: 0 + }; + + s.waveformData = { + left: [], + right: [] + }; + + s.playState = 0; + s.position = null; + + s.id3 = {}; + + }; + + resetProperties(); + + /** + * Pseudo-private SMSound internals + * -------------------------------- + */ + + this._onTimer = function(bForce) { + + /** + * HTML5-only _whileplaying() etc. + * called from both HTML5 native events, and polling/interval-based timers + * mimics flash and fires only when time/duration change, so as to be polling-friendly + */ + + var duration, isNew = false, time, x = {}; + + if (s._hasTimer || bForce) { + + // TODO: May not need to track readyState (1 = loading) + + if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) { + + duration = s._get_html5_duration(); + + if (duration !== lastHTML5State.duration) { + + lastHTML5State.duration = duration; + s.duration = duration; + isNew = true; + + } + + // TODO: investigate why this goes wack if not set/re-set each time. + s.durationEstimate = s.duration; + + time = (s._a.currentTime * msecScale || 0); + + if (time !== lastHTML5State.time) { + + lastHTML5State.time = time; + isNew = true; + + } + + if (isNew || bForce) { + + s._whileplaying(time,x,x,x,x); + + } + + }/* else { + + // sm2._wD('_onTimer: Warn for "'+s.id+'": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK')); + + return false; + + }*/ + + return isNew; + + } + + }; + + this._get_html5_duration = function() { + + var instanceOptions = s._iO, + // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null + d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)), + result = (d && !isNaN(d) && d !== Infinity ? d : null); + + return result; + + }; + + this._apply_loop = function(a, nLoops) { + + /** + * boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop + * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified. + */ + + // + if (!a.loop && nLoops > 1) { + sm2._wD('Note: Native HTML5 looping is infinite.', 1); + } + // + + a.loop = (nLoops > 1 ? 'loop' : ''); + + }; + + this._setup_html5 = function(oOptions) { + + var instanceOptions = mixin(s._iO, oOptions), + a = useGlobalHTML5Audio ? globalHTML5Audio : s._a, + dURL = decodeURI(instanceOptions.url), + sameURL; + + /** + * "First things first, I, Poppa..." (reset the previous state of the old sound, if playing) + * Fixes case with devices that can only play one sound at a time + * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state + */ + + if (useGlobalHTML5Audio) { + + if (dURL === decodeURI(lastGlobalHTML5URL)) { + // global HTML5 audio: re-use of URL + sameURL = true; + } + + } else if (dURL === decodeURI(lastURL)) { + + // options URL is the same as the "last" URL, and we used (loaded) it + sameURL = true; + + } + + if (a) { + + if (a._s) { + + if (useGlobalHTML5Audio) { + + if (a._s && a._s.playState && !sameURL) { + + // global HTML5 audio case, and loading a new URL. stop the currently-playing one. + a._s.stop(); + + } + + } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) { + + // non-global HTML5 reuse case: same url, ignore request + s._apply_loop(a, instanceOptions.loops); + + return a; + + } + + } + + if (!sameURL) { + + // don't retain onPosition() stuff with new URLs. + + if (lastURL) { + resetProperties(false); + } + + // assign new HTML5 URL + + a.src = instanceOptions.url; + + s.url = instanceOptions.url; + + lastURL = instanceOptions.url; + + lastGlobalHTML5URL = instanceOptions.url; + + a._called_load = false; + + } + + } else { + + if (instanceOptions.autoLoad || instanceOptions.autoPlay) { + + s._a = new Audio(instanceOptions.url); + s._a.load(); + + } else { + + // null for stupid Opera 9.64 case + s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()); + + } + + // assign local reference + a = s._a; + + a._called_load = false; + + if (useGlobalHTML5Audio) { + + globalHTML5Audio = a; + + } + + } + + s.isHTML5 = true; + + // store a ref on the track + s._a = a; + + // store a ref on the audio + a._s = s; + + add_html5_events(); + + s._apply_loop(a, instanceOptions.loops); + + if (instanceOptions.autoLoad || instanceOptions.autoPlay) { + + s.load(); + + } else { + + // early HTML5 implementation (non-standard) + a.autobuffer = false; + + // standard ('none' is also an option.) + a.preload = 'auto'; + + } + + return a; + + }; + + add_html5_events = function() { + + if (s._a._added_events) { + return false; + } + + var f; + + function add(oEvt, oFn, bCapture) { + return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null; + } + + s._a._added_events = true; + + for (f in html5_events) { + if (html5_events.hasOwnProperty(f)) { + add(f, html5_events[f]); + } + } + + return true; + + }; + + remove_html5_events = function() { + + // Remove event listeners + + var f; + + function remove(oEvt, oFn, bCapture) { + return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null); + } + + sm2._wD(s.id + ': Removing event listeners'); + s._a._added_events = false; + + for (f in html5_events) { + if (html5_events.hasOwnProperty(f)) { + remove(f, html5_events[f]); + } + } + + }; + + /** + * Pseudo-private event internals + * ------------------------------ + */ + + this._onload = function(nSuccess) { + + var fN, + // check for duration to prevent false positives from flash 8 when loading from cache. + loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration); + + // + fN = s.id + ': '; + sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2)); + if (!loadOK && !s.isHTML5) { + if (sm2.sandbox.noRemote === true) { + sm2._wD(fN + str('noNet'), 1); + } + if (sm2.sandbox.noLocal === true) { + sm2._wD(fN + str('noLocal'), 1); + } + } + // + + s.loaded = loadOK; + s.readyState = loadOK?3:2; + s._onbufferchange(0); + + if (s._iO.onload) { + wrapCallback(s, function() { + s._iO.onload.apply(s, [loadOK]); + }); + } + + return true; + + }; + + this._onbufferchange = function(nIsBuffering) { + + if (s.playState === 0) { + // ignore if not playing + return false; + } + + if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) { + return false; + } + + s.isBuffering = (nIsBuffering === 1); + if (s._iO.onbufferchange) { + sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering); + s._iO.onbufferchange.apply(s); + } + + return true; + + }; + + /** + * Playback may have stopped due to buffering, or related reason. + * This state can be encountered on iOS < 6 when auto-play is blocked. + */ + + this._onsuspend = function() { + + if (s._iO.onsuspend) { + sm2._wD(s.id + ': Playback suspended'); + s._iO.onsuspend.apply(s); + } + + return true; + + }; + + /** + * flash 9/movieStar + RTMP-only method, should fire only once at most + * at this point we just recreate failed sounds rather than trying to reconnect + */ + + this._onfailure = function(msg, level, code) { + + s.failures++; + sm2._wD(s.id + ': Failures = ' + s.failures); + + if (s._iO.onfailure && s.failures === 1) { + s._iO.onfailure(s, msg, level, code); + } else { + sm2._wD(s.id + ': Ignoring failure'); + } + + }; + + this._onfinish = function() { + + // store local copy before it gets trashed... + var io_onfinish = s._iO.onfinish; + + s._onbufferchange(0); + s._resetOnPosition(0); + + // reset some state items + if (s.instanceCount) { + + s.instanceCount--; + + if (!s.instanceCount) { + + // remove onPosition listeners, if any + detachOnPosition(); + + // reset instance options + s.playState = 0; + s.paused = false; + s.instanceCount = 0; + s.instanceOptions = {}; + s._iO = {}; + stop_html5_timer(); + + // reset position, too + if (s.isHTML5) { + s.position = 0; + } + + } + + if (!s.instanceCount || s._iO.multiShotEvents) { + // fire onfinish for last, or every instance + if (io_onfinish) { + sm2._wD(s.id + ': onfinish()'); + wrapCallback(s, function() { + io_onfinish.apply(s); + }); + } + } + + } + + }; + + this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { + + var instanceOptions = s._iO; + + s.bytesLoaded = nBytesLoaded; + s.bytesTotal = nBytesTotal; + s.duration = Math.floor(nDuration); + s.bufferLength = nBufferLength; + + if (!s.isHTML5 && !instanceOptions.isMovieStar) { + + if (instanceOptions.duration) { + // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired. + s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration; + } else { + s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10); + } + + } else { + + s.durationEstimate = s.duration; + + } + + // for flash, reflect sequential-load-style buffering + if (!s.isHTML5) { + s.buffered = [{ + 'start': 0, + 'end': s.duration + }]; + } + + // allow whileloading to fire even if "load" fired under HTML5, due to HTTP range/partials + if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) { + instanceOptions.whileloading.apply(s); + } + + }; + + this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { + + var instanceOptions = s._iO, + eqLeft; + + if (isNaN(nPosition) || nPosition === null) { + // flash safety net + return false; + } + + // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0. + s.position = Math.max(0, nPosition); + + s._processOnPosition(); + + if (!s.isHTML5 && fV > 8) { + + if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) { + s.peakData = { + left: oPeakData.leftPeak, + right: oPeakData.rightPeak + }; + } + + if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) { + s.waveformData = { + left: oWaveformDataLeft.split(','), + right: oWaveformDataRight.split(',') + }; + } + + if (instanceOptions.useEQData) { + if (oEQData !== _undefined && oEQData && oEQData.leftEQ) { + eqLeft = oEQData.leftEQ.split(','); + s.eqData = eqLeft; + s.eqData.left = eqLeft; + if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) { + s.eqData.right = oEQData.rightEQ.split(','); + } + } + } + + } + + if (s.playState === 1) { + + // special case/hack: ensure buffering is false if loading from cache (and not yet started) + if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) { + s._onbufferchange(0); + } + + if (instanceOptions.whileplaying) { + // flash may call after actual finish + instanceOptions.whileplaying.apply(s); + } + + } + + return true; + + }; + + this._oncaptiondata = function(oData) { + + /** + * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature + * + * @param {object} oData + */ + + sm2._wD(s.id + ': Caption data received.'); + + s.captiondata = oData; + + if (s._iO.oncaptiondata) { + s._iO.oncaptiondata.apply(s, [oData]); + } + + }; + + this._onmetadata = function(oMDProps, oMDData) { + + /** + * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature + * RTMP may include song title, MovieStar content may include encoding info + * + * @param {array} oMDProps (names) + * @param {array} oMDData (values) + */ + + sm2._wD(s.id + ': Metadata received.'); + + var oData = {}, i, j; + + for (i = 0, j = oMDProps.length; i < j; i++) { + oData[oMDProps[i]] = oMDData[i]; + } + s.metadata = oData; + + if (s._iO.onmetadata) { + s._iO.onmetadata.apply(s); + } + + }; + + this._onid3 = function(oID3Props, oID3Data) { + + /** + * internal: flash 8 + flash 9 ID3 feature + * may include artist, song title etc. + * + * @param {array} oID3Props (names) + * @param {array} oID3Data (values) + */ + + sm2._wD(s.id + ': ID3 data received.'); + + var oData = [], i, j; + + for (i = 0, j = oID3Props.length; i < j; i++) { + oData[oID3Props[i]] = oID3Data[i]; + } + s.id3 = mixin(s.id3, oData); + + if (s._iO.onid3) { + s._iO.onid3.apply(s); + } + + }; + + // flash/RTMP-only + + this._onconnect = function(bSuccess) { + + bSuccess = (bSuccess === 1); + sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2)); + s.connected = bSuccess; + + if (bSuccess) { + + s.failures = 0; + + if (idCheck(s.id)) { + if (s.getAutoPlay()) { + // only update the play state if auto playing + s.play(_undefined, s.getAutoPlay()); + } else if (s._iO.autoLoad) { + s.load(); + } + } + + if (s._iO.onconnect) { + s._iO.onconnect.apply(s, [bSuccess]); + } + + } + + }; + + this._ondataerror = function(sError) { + + // flash 9 wave/eq data handler + // hack: called at start, and end from flash at/after onfinish() + if (s.playState > 0) { + sm2._wD(s.id + ': Data error: ' + sError); + if (s._iO.ondataerror) { + s._iO.ondataerror.apply(s); + } + } + + }; + + // + this._debug(); + // + + }; // SMSound() + + /** + * Private SoundManager internals + * ------------------------------ + */ + + getDocument = function() { + + return (doc.body || doc.getElementsByTagName('div')[0]); + + }; + + id = function(sID) { + + return doc.getElementById(sID); + + }; + + mixin = function(oMain, oAdd) { + + // non-destructive merge + var o1 = (oMain || {}), o2, o; + + // if unspecified, o2 is the default options object + o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd); + + for (o in o2) { + + if (o2.hasOwnProperty(o) && o1[o] === _undefined) { + + if (typeof o2[o] !== 'object' || o2[o] === null) { + + // assign directly + o1[o] = o2[o]; + + } else { + + // recurse through o2 + o1[o] = mixin(o1[o], o2[o]); + + } + + } + + } + + return o1; + + }; + + wrapCallback = function(oSound, callback) { + + /** + * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue + * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default). + * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case. + * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash. + * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player + */ + if (!oSound.isHTML5 && fV === 8) { + window.setTimeout(callback, 0); + } else { + callback(); + } + + }; + + // additional soundManager properties that soundManager.setup() will accept + + extraOptions = { + 'onready': 1, + 'ontimeout': 1, + 'defaultOptions': 1, + 'flash9Options': 1, + 'movieStarOptions': 1 + }; + + assign = function(o, oParent) { + + /** + * recursive assignment of properties, soundManager.setup() helper + * allows property assignment based on whitelist + */ + + var i, + result = true, + hasParent = (oParent !== _undefined), + setupOptions = sm2.setupOptions, + bonusOptions = extraOptions; + + // + + // if soundManager.setup() called, show accepted parameters. + + if (o === _undefined) { + + result = []; + + for (i in setupOptions) { + + if (setupOptions.hasOwnProperty(i)) { + result.push(i); + } + + } + + for (i in bonusOptions) { + + if (bonusOptions.hasOwnProperty(i)) { + + if (typeof sm2[i] === 'object') { + + result.push(i+': {...}'); + + } else if (sm2[i] instanceof Function) { + + result.push(i+': function() {...}'); + + } else { + + result.push(i); + + } + + } + + } + + sm2._wD(str('setup', result.join(', '))); + + return false; + + } + + // + + for (i in o) { + + if (o.hasOwnProperty(i)) { + + // if not an {object} we want to recurse through... + + if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) { + + // check "allowed" options + + if (hasParent && bonusOptions[oParent] !== _undefined) { + + // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } } + sm2[oParent][i] = o[i]; + + } else if (setupOptions[i] !== _undefined) { + + // special case: assign to setupOptions object, which soundManager property references + sm2.setupOptions[i] = o[i]; + + // assign directly to soundManager, too + sm2[i] = o[i]; + + } else if (bonusOptions[i] === _undefined) { + + // invalid or disallowed parameter. complain. + complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2); + + result = false; + + } else { + + /** + * valid extraOptions (bonusOptions) parameter. + * is it a method, like onready/ontimeout? call it. + * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]}); + */ + + if (sm2[i] instanceof Function) { + + sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]])); + + } else { + + // good old-fashioned direct assignment + sm2[i] = o[i]; + + } + + } + + } else { + + // recursion case, eg., { defaultOptions: { ... } } + + if (bonusOptions[i] === _undefined) { + + // invalid or disallowed parameter. complain. + complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2); + + result = false; + + } else { + + // recurse through object + return assign(o[i], i); + + } + + } + + } + + } + + return result; + + }; + + function preferFlashCheck(kind) { + + // whether flash should play a given type + return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind])); + + } + + /** + * Internal DOM2-level event helpers + * --------------------------------- + */ + + event = (function() { + + // normalize event methods + var old = (window.attachEvent), + evt = { + add: (old?'attachEvent':'addEventListener'), + remove: (old?'detachEvent':'removeEventListener') + }; + + // normalize "on" event prefix, optional capture argument + function getArgs(oArgs) { + + var args = slice.call(oArgs), + len = args.length; + + if (old) { + // prefix + args[1] = 'on' + args[1]; + if (len > 3) { + // no capture + args.pop(); + } + } else if (len === 3) { + args.push(false); + } + + return args; + + } + + function apply(args, sType) { + + // normalize and call the event method, with the proper arguments + var element = args.shift(), + method = [evt[sType]]; + + if (old) { + // old IE can't do apply(). + element[method](args[0], args[1]); + } else { + element[method].apply(element, args); + } + + } + + function add() { + + apply(getArgs(arguments), 'add'); + + } + + function remove() { + + apply(getArgs(arguments), 'remove'); + + } + + return { + 'add': add, + 'remove': remove + }; + + }()); + + /** + * Internal HTML5 event handling + * ----------------------------- + */ + + function html5_event(oFn) { + + // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds + + return function(e) { + + var s = this._s, + result; + + if (!s || !s._a) { + // + if (s && s.id) { + sm2._wD(s.id + ': Ignoring ' + e.type); + } else { + sm2._wD(h5 + 'Ignoring ' + e.type); + } + // + result = null; + } else { + result = oFn.call(this, e); + } + + return result; + + }; + + } + + html5_events = { + + // HTML5 event-name-to-handler map + + abort: html5_event(function() { + + sm2._wD(this._s.id + ': abort'); + + }), + + // enough has loaded to play + + canplay: html5_event(function() { + + var s = this._s, + position1K; + + if (s._html5_canplay) { + // this event has already fired. ignore. + return true; + } + + s._html5_canplay = true; + sm2._wD(s.id + ': canplay'); + s._onbufferchange(0); + + // position according to instance options + position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null); + + // set the position if position was set before the sound loaded + if (s.position && this.currentTime !== position1K) { + sm2._wD(s.id + ': canplay: Setting position to ' + position1K); + try { + this.currentTime = position1K; + } catch(ee) { + sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2); + } + } + + // hack for HTML5 from/to case + if (s._iO._oncanplay) { + s._iO._oncanplay(); + } + + }), + + canplaythrough: html5_event(function() { + + var s = this._s; + + if (!s.loaded) { + s._onbufferchange(0); + s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration()); + s._onload(true); + } + + }), + + // TODO: Reserved for potential use + /* + emptied: html5_event(function() { + + sm2._wD(this._s.id + ': emptied'); + + }), + */ + + ended: html5_event(function() { + + var s = this._s; + + sm2._wD(s.id + ': ended'); + + s._onfinish(); + + }), + + error: html5_event(function() { + + sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code); + /** + * HTML5 error codes, per W3C + * Error 1: Client aborted download at user's request. + * Error 2: Network error after load started. + * Error 3: Decoding issue. + * Error 4: Media (audio file) not supported. + * Reference: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#error-codes + */ + // call load with error state? + this._s._onload(false); + + }), + + loadeddata: html5_event(function() { + + var s = this._s; + + sm2._wD(s.id + ': loadeddata'); + + // safari seems to nicely report progress events, eventually totalling 100% + if (!s._loaded && !isSafari) { + s.duration = s._get_html5_duration(); + } + + }), + + loadedmetadata: html5_event(function() { + + sm2._wD(this._s.id + ': loadedmetadata'); + + }), + + loadstart: html5_event(function() { + + sm2._wD(this._s.id + ': loadstart'); + // assume buffering at first + this._s._onbufferchange(1); + + }), + + play: html5_event(function() { + + // sm2._wD(this._s.id + ': play()'); + // once play starts, no buffering + this._s._onbufferchange(0); + + }), + + playing: html5_event(function() { + + sm2._wD(this._s.id + ': playing'); + // once play starts, no buffering + this._s._onbufferchange(0); + + }), + + progress: html5_event(function(e) { + + // note: can fire repeatedly after "loaded" event, due to use of HTTP range/partials + + var s = this._s, + i, j, progStr, buffered = 0, + isProgress = (e.type === 'progress'), + ranges = e.target.buffered, + // firefox 3.6 implements e.loaded/total (bytes) + loaded = (e.loaded||0), + total = (e.total||1); + + // reset the "buffered" (loaded byte ranges) array + s.buffered = []; + + if (ranges && ranges.length) { + + // if loaded is 0, try TimeRanges implementation as % of load + // https://developer.mozilla.org/en/DOM/TimeRanges + + // re-build "buffered" array + // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5. + for (i=0, j=ranges.length; i + if (isProgress && ranges.length > 1) { + progStr = []; + j = ranges.length; + for (i=0; i + + } + + if (!isNaN(loaded)) { + + // if progress, likely not buffering + s._onbufferchange(0); + // TODO: prevent calls with duplicate values. + s._whileloading(loaded, total, s._get_html5_duration()); + if (loaded && total && loaded === total) { + // in case "onload" doesn't fire (eg. gecko 1.9.2) + html5_events.canplaythrough.call(this, e); + } + + } + + }), + + ratechange: html5_event(function() { + + sm2._wD(this._s.id + ': ratechange'); + + }), + + suspend: html5_event(function(e) { + + // download paused/stopped, may have finished (eg. onload) + var s = this._s; + + sm2._wD(this._s.id + ': suspend'); + html5_events.progress.call(this, e); + s._onsuspend(); + + }), + + stalled: html5_event(function() { + + sm2._wD(this._s.id + ': stalled'); + + }), + + timeupdate: html5_event(function() { + + this._s._onTimer(); + + }), + + waiting: html5_event(function() { + + var s = this._s; + + // see also: seeking + sm2._wD(this._s.id + ': waiting'); + + // playback faster than download rate, etc. + s._onbufferchange(1); + + }) + + }; + + html5OK = function(iO) { + + // playability test based on URL or MIME type + + var result; + + if (!iO || (!iO.type && !iO.url && !iO.serverURL)) { + + // nothing to check + result = false; + + } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) { + + // RTMP, or preferring flash + result = false; + + } else { + + // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er + result = ((iO.type ? html5CanPlay({type:iO.type}) : html5CanPlay({url:iO.url}) || sm2.html5Only || iO.url.match(/data\:/i))); + + } + + return result; + + }; + + html5Unload = function(oAudio) { + + /** + * Internal method: Unload media, and cancel any current/pending network requests. + * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download. + * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media + * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload. + * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL. + */ + + var url; + + if (oAudio) { + + // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME. + // Desktop Safari complains / fails on data: URI, so it gets about:blank. + url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL)); + + oAudio.src = url; + + // reset some state, too + if (oAudio._called_unload !== undefined) { + oAudio._called_load = false; + } + + } + + if (useGlobalHTML5Audio) { + + // ensure URL state is trashed, also + lastGlobalHTML5URL = null; + + } + + return url; + + }; + + html5CanPlay = function(o) { + + /** + * Try to find MIME, test and return truthiness + * o = { + * url: '/path/to/an.mp3', + * type: 'audio/mp3' + * } + */ + + if (!sm2.useHTML5Audio || !sm2.hasHTML5) { + return false; + } + + var url = (o.url || null), + mime = (o.type || null), + aF = sm2.audioFormats, + result, + offset, + fileExt, + item; + + // account for known cases like audio/mp3 + + if (mime && sm2.html5[mime] !== _undefined) { + return (sm2.html5[mime] && !preferFlashCheck(mime)); + } + + if (!html5Ext) { + html5Ext = []; + for (item in aF) { + if (aF.hasOwnProperty(item)) { + html5Ext.push(item); + if (aF[item].related) { + html5Ext = html5Ext.concat(aF[item].related); + } + } + } + html5Ext = new RegExp('\\.('+html5Ext.join('|')+')(\\?.*)?$','i'); + } + + // TODO: Strip URL queries, etc. + fileExt = (url ? url.toLowerCase().match(html5Ext) : null); + + if (!fileExt || !fileExt.length) { + if (!mime) { + result = false; + } else { + // audio/mp3 -> mp3, result should be known + offset = mime.indexOf(';'); + // strip "audio/X; codecs..." + fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); + } + } else { + // match the raw extension name - "mp3", for example + fileExt = fileExt[1]; + } + + if (fileExt && sm2.html5[fileExt] !== _undefined) { + // result known + result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt)); + } else { + mime = 'audio/'+fileExt; + result = sm2.html5.canPlayType({type:mime}); + sm2.html5[fileExt] = result; + // sm2._wD('canPlayType, found result: ' + result); + result = (result && sm2.html5[mime] && !preferFlashCheck(mime)); + } + + return result; + + }; + + testHTML5 = function() { + + /** + * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on + * assigns results to html5[] and flash[]. + */ + + if (!sm2.useHTML5Audio || !sm2.hasHTML5) { + // without HTML5, we need Flash. + sm2.html5.usingFlash = true; + needsFlash = true; + return false; + } + + // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/ + var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null), + item, lookup, support = {}, aF, i; + + function cp(m) { + + var canPlay, j, + result = false, + isOK = false; + + if (!a || typeof a.canPlayType !== 'function') { + return result; + } + + if (m instanceof Array) { + // iterate through all mime types, return any successes + for (i=0, j=m.length; i= 0; i--) { + + // eg. audio/m4a + support['audio/'+aF[item].related[i]] = support[item]; + sm2.html5[aF[item].related[i]] = support[item]; + sm2.flash[aF[item].related[i]] = support[item]; + + } + + } + + } + + } + + support.canPlayType = (a?cp:null); + sm2.html5 = mixin(sm2.html5, support); + + sm2.html5.usingFlash = featureCheck(); + needsFlash = sm2.html5.usingFlash; + + return true; + + }; + + strings = { + + // + notReady: 'Unavailable - wait until onready() has fired.', + notOK: 'Audio support is not available.', + domError: sm + 'exception caught while appending SWF to DOM.', + spcWmode: 'Removing wmode, preventing known SWF loading issue(s)', + swf404: smc + 'Verify that %s is a valid path.', + tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)', + checkSWF: 'See SWF output for more debug info.', + localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', + waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...', + waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...', + waitSWF: smc + 'Waiting for 100% SWF load...', + needFunction: smc + 'Function object expected for %s', + badID: 'Sound ID "%s" should be a string, starting with a non-numeric character', + currentObj: smc + '_debug(): Current sound objects', + waitOnload: smc + 'Waiting for window.onload()', + docLoaded: smc + 'Document already loaded', + onload: smc + 'initComplete(): calling soundManager.onload()', + onloadOK: sm + '.onload() complete', + didInit: smc + 'init(): Already called?', + secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', + badRemove: smc + 'Failed to remove Flash node.', + shutdown: sm + '.disable(): Shutting down', + queue: smc + 'Queueing %s handler', + smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', + fbTimeout: 'No flash response, applying .'+swfCSS.swfTimedout+' CSS...', + fbLoaded: 'Flash loaded', + fbHandler: smc + 'flashBlockHandler()', + manURL: 'SMSound.load(): Using manually-assigned URL', + onURL: sm + '.load(): current URL already assigned.', + badFV: sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', + as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', + noNSLoop: 'Note: Looping not implemented for MovieStar formats', + needfl9: 'Note: Switching to flash 9, required for MP4 formats.', + mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', + needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.', + gotFocus: smc + 'Got window focus.', + policy: 'Enabling usePolicyFile for data access', + setup: sm + '.setup(): allowed parameters: %s', + setupError: sm + '.setup(): "%s" cannot be assigned with this method.', + setupUndef: sm + '.setup(): Could not find option "%s"', + setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().', + noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.', + sm2Loaded: 'SoundManager 2: Ready.', + reset: sm + '.reset(): Removing event callbacks', + mobileUA: 'Mobile UA detected, preferring HTML5 by default.', + globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.' + // + + }; + + str = function() { + + // internal string replace helper. + // arguments: o [,items to replace] + // + + var args, + i, j, o, + sstr; + + // real array, please + args = slice.call(arguments); + + // first argument + o = args.shift(); + + sstr = (strings && strings[o] ? strings[o] : ''); + + if (sstr && args && args.length) { + for (i = 0, j = args.length; i < j; i++) { + sstr = sstr.replace('%s', args[i]); + } + } + + return sstr; + // + + }; + + loopFix = function(sOpt) { + + // flash 8 requires stream = false for looping to work + if (fV === 8 && sOpt.loops > 1 && sOpt.stream) { + _wDS('as2loop'); + sOpt.stream = false; + } + + return sOpt; + + }; + + policyFix = function(sOpt, sPre) { + + if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { + sm2._wD((sPre || '') + str('policy')); + sOpt.usePolicyFile = true; + } + + return sOpt; + + }; + + complain = function(sMsg) { + + // + if (hasConsole && console.warn !== _undefined) { + console.warn(sMsg); + } else { + sm2._wD(sMsg); + } + // + + }; + + doNothing = function() { + + return false; + + }; + + disableObject = function(o) { + + var oProp; + + for (oProp in o) { + if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { + o[oProp] = doNothing; + } + } + + oProp = null; + + }; + + failSafely = function(bNoDisable) { + + // general failure exception handler + + if (bNoDisable === _undefined) { + bNoDisable = false; + } + + if (disabled || bNoDisable) { + sm2.disable(bNoDisable); + } + + }; + + normalizeMovieURL = function(smURL) { + + var urlParams = null, url; + + if (smURL) { + if (smURL.match(/\.swf(\?.*)?$/i)) { + urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); + if (urlParams) { + // assume user knows what they're doing + return smURL; + } + } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { + // append trailing slash, if needed + smURL += '/'; + } + } + + url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL; + + if (sm2.noSWFCache) { + url += ('?ts=' + new Date().getTime()); + } + + return url; + + }; + + setVersionInfo = function() { + + // short-hand for internal use + + fV = parseInt(sm2.flashVersion, 10); + + if (fV !== 8 && fV !== 9) { + sm2._wD(str('badFV', fV, defaultFlashVersion)); + sm2.flashVersion = fV = defaultFlashVersion; + } + + // debug flash movie, if applicable + + var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf'); + + if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) { + sm2._wD(str('needfl9')); + sm2.flashVersion = fV = 9; + } + + sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); + + // set up default options + if (fV > 8) { + // +flash 9 base options + sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options); + sm2.features.buffering = true; + // +moviestar support + sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions); + sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); + sm2.features.movieStar = true; + } else { + sm2.features.movieStar = false; + } + + // regExp for flash canPlay(), etc. + sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')]; + + // if applicable, use _debug versions of SWFs + sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); + + sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8); + + }; + + setPolling = function(bPolling, bHighPerformance) { + + if (!flash) { + return false; + } + + flash._setPolling(bPolling, bHighPerformance); + + }; + + initDebug = function() { + + // starts debug mode, creating output
    for UAs without console object + + // allow force of debug mode via URL + // + if (sm2.debugURLParam.test(wl)) { + sm2.debugMode = true; + } + + if (id(sm2.debugID)) { + return false; + } + + var oD, oDebug, oTarget, oToggle, tmp; + + if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) { + + oD = doc.createElement('div'); + oD.id = sm2.debugID + '-toggle'; + + oToggle = { + 'position': 'fixed', + 'bottom': '0px', + 'right': '0px', + 'width': '1.2em', + 'height': '1.2em', + 'lineHeight': '1.2em', + 'margin': '2px', + 'textAlign': 'center', + 'border': '1px solid #999', + 'cursor': 'pointer', + 'background': '#fff', + 'color': '#333', + 'zIndex': 10001 + }; + + oD.appendChild(doc.createTextNode('-')); + oD.onclick = toggleDebug; + oD.title = 'Toggle SM2 debug console'; + + if (ua.match(/msie 6/i)) { + oD.style.position = 'absolute'; + oD.style.cursor = 'hand'; + } + + for (tmp in oToggle) { + if (oToggle.hasOwnProperty(tmp)) { + oD.style[tmp] = oToggle[tmp]; + } + } + + oDebug = doc.createElement('div'); + oDebug.id = sm2.debugID; + oDebug.style.display = (sm2.debugMode?'block':'none'); + + if (sm2.debugMode && !id(oD.id)) { + try { + oTarget = getDocument(); + oTarget.appendChild(oD); + } catch(e2) { + throw new Error(str('domError')+' \n'+e2.toString()); + } + oTarget.appendChild(oDebug); + } + + } + + oTarget = null; + // + + }; + + idCheck = this.getSoundById; + + // + _wDS = function(o, errorLevel) { + + return (!o ? '' : sm2._wD(str(o), errorLevel)); + + }; + + toggleDebug = function() { + + var o = id(sm2.debugID), + oT = id(sm2.debugID + '-toggle'); + + if (!o) { + return false; + } + + if (debugOpen) { + // minimize + oT.innerHTML = '+'; + o.style.display = 'none'; + } else { + oT.innerHTML = '-'; + o.style.display = 'block'; + } + + debugOpen = !debugOpen; + + }; + + debugTS = function(sEventType, bSuccess, sMessage) { + + // troubleshooter debug hooks + + if (window.sm2Debugger !== _undefined) { + try { + sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); + } catch(e) { + // oh well + return false; + } + } + + return true; + + }; + // + + getSWFCSS = function() { + + var css = []; + + if (sm2.debugMode) { + css.push(swfCSS.sm2Debug); + } + + if (sm2.debugFlash) { + css.push(swfCSS.flashDebug); + } + + if (sm2.useHighPerformance) { + css.push(swfCSS.highPerf); + } + + return css.join(' '); + + }; + + flashBlockHandler = function() { + + // *possible* flash block situation. + + var name = str('fbHandler'), + p = sm2.getMoviePercent(), + css = swfCSS, + error = {type:'FLASHBLOCK'}; + + if (sm2.html5Only) { + // no flash, or unused + return false; + } + + if (!sm2.ok()) { + + if (needsFlash) { + // make the movie more visible, so user can fix + sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); + sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : '')); + } + + sm2.didFlashBlock = true; + + // fire onready(), complain lightly + processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); + catchError(error); + + } else { + + // SM2 loaded OK (or recovered) + + // + if (sm2.didFlashBlock) { + sm2._wD(name + ': Unblocked'); + } + // + + if (sm2.oMC) { + sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); + } + + } + + }; + + addOnEvent = function(sType, oMethod, oScope) { + + if (on_queue[sType] === _undefined) { + on_queue[sType] = []; + } + + on_queue[sType].push({ + 'method': oMethod, + 'scope': (oScope || null), + 'fired': false + }); + + }; + + processOnEvents = function(oOptions) { + + // if unspecified, assume OK/error + + if (!oOptions) { + oOptions = { + type: (sm2.ok() ? 'onready' : 'ontimeout') + }; + } + + if (!didInit && oOptions && !oOptions.ignoreInit) { + // not ready yet. + return false; + } + + if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) { + // invalid case + return false; + } + + var status = { + success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled) + }, + + // queue specified by type, or none + srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]), + + queue = [], i, j, + args = [status], + canRetry = (needsFlash && !sm2.ok()); + + if (oOptions.error) { + args[0].error = oOptions.error; + } + + for (i = 0, j = srcQueue.length; i < j; i++) { + if (srcQueue[i].fired !== true) { + queue.push(srcQueue[i]); + } + } + + if (queue.length) { + // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's')); + for (i = 0, j = queue.length; i < j; i++) { + if (queue[i].scope) { + queue[i].method.apply(queue[i].scope, args); + } else { + queue[i].method.apply(this, args); + } + if (!canRetry) { + // useFlashBlock and SWF timeout case doesn't count here. + queue[i].fired = true; + } + } + } + + return true; + + }; + + initUserOnload = function() { + + window.setTimeout(function() { + + if (sm2.useFlashBlock) { + flashBlockHandler(); + } + + processOnEvents(); + + // call user-defined "onload", scoped to window + + if (typeof sm2.onload === 'function') { + _wDS('onload', 1); + sm2.onload.apply(window); + _wDS('onloadOK', 1); + } + + if (sm2.waitForWindowLoad) { + event.add(window, 'load', initUserOnload); + } + + },1); + + }; + + detectFlash = function() { + + // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt + + if (hasFlash !== _undefined) { + // this work has already been done. + return hasFlash; + } + + var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; + + if (nP && nP.length) { + type = 'application/x-shockwave-flash'; + types = n.mimeTypes; + if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { + hasPlugin = true; + } + } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) { + // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM. + try { + obj = new AX('ShockwaveFlash.ShockwaveFlash'); + } catch(e) { + // oh well + obj = null; + } + hasPlugin = (!!obj); + // cleanup, because it is ActiveX after all + obj = null; + } + + hasFlash = hasPlugin; + + return hasPlugin; + + }; + + featureCheck = function() { + + var flashNeeded, + item, + formats = sm2.audioFormats, + // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works. + isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i))); + + if (isSpecial) { + + // has Audio(), but is broken; let it load links directly. + sm2.hasHTML5 = false; + + // ignore flash case, however + sm2.html5Only = true; + + // hide the SWF, if present + if (sm2.oMC) { + sm2.oMC.style.display = 'none'; + } + + } else { + + if (sm2.useHTML5Audio) { + + if (!sm2.html5 || !sm2.html5.canPlayType) { + sm2._wD('SoundManager: No HTML5 Audio() support detected.'); + sm2.hasHTML5 = false; + } + + // + if (isBadSafari) { + sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ?' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1); + } + // + + } + + } + + if (sm2.useHTML5Audio && sm2.hasHTML5) { + + // sort out whether flash is optional, required or can be ignored. + + // innocent until proven guilty. + canIgnoreFlash = true; + + for (item in formats) { + if (formats.hasOwnProperty(item)) { + if (formats[item].required) { + if (!sm2.html5.canPlayType(formats[item].type)) { + // 100% HTML5 mode is not possible. + canIgnoreFlash = false; + flashNeeded = true; + } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) { + // flash may be required, or preferred for this format. + flashNeeded = true; + } + } + } + } + + } + + // sanity check... + if (sm2.ignoreFlash) { + flashNeeded = false; + canIgnoreFlash = true; + } + + sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded); + + return (!sm2.html5Only); + + }; + + parseURL = function(url) { + + /** + * Internal: Finds and returns the first playable URL (or failing that, the first URL.) + * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects. + */ + + var i, j, urlResult = 0, result; + + if (url instanceof Array) { + + // find the first good one + for (i=0, j=url.length; i= 0; i--) { + + if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) { + + sm2.sounds[sm2.soundIDs[i]]._onTimer(); + + } + + } + + }; + + catchError = function(options) { + + options = (options !== _undefined ? options : {}); + + if (typeof sm2.onerror === 'function') { + sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]); + } + + if (options.fatal !== _undefined && options.fatal) { + sm2.disable(); + } + + }; + + badSafariFix = function() { + + // special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4 + if (!isBadSafari || !detectFlash()) { + // doesn't apply + return false; + } + + var aF = sm2.audioFormats, i, item; + + for (item in aF) { + if (aF.hasOwnProperty(item)) { + if (item === 'mp3' || item === 'mp4') { + sm2._wD(sm + ': Using flash fallback for ' + item + ' format'); + sm2.html5[item] = false; + // assign result to related formats, too + if (aF[item] && aF[item].related) { + for (i = aF[item].related.length-1; i >= 0; i--) { + sm2.html5[aF[item].related[i]] = false; + } + } + } + } + } + + }; + + /** + * Pseudo-private flash/ExternalInterface methods + * ---------------------------------------------- + */ + + this._setSandboxType = function(sandboxType) { + + // + var sb = sm2.sandbox; + + sb.type = sandboxType; + sb.description = sb.types[(sb.types[sandboxType] !== _undefined?sandboxType:'unknown')]; + + if (sb.type === 'localWithFile') { + + sb.noRemote = true; + sb.noLocal = false; + _wDS('secNote', 2); + + } else if (sb.type === 'localWithNetwork') { + + sb.noRemote = false; + sb.noLocal = true; + + } else if (sb.type === 'localTrusted') { + + sb.noRemote = false; + sb.noLocal = false; + + } + // + + }; + + this._externalInterfaceOK = function(swfVersion) { + + // flash callback confirming flash loaded, EI working etc. + // swfVersion: SWF build string + + if (sm2.swfLoaded) { + return false; + } + + var e; + + debugTS('swf', true); + debugTS('flashtojs', true); + sm2.swfLoaded = true; + tryInitOnFocus = false; + + if (isBadSafari) { + badSafariFix(); + } + + // complain if JS + SWF build/version strings don't match, excluding +DEV builds + // + if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== sm2.versionNumber.replace(/\+dev/i, '')) { + + e = sm + ': Fatal: JavaScript file build "' + sm2.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + sm2.url + '. Ensure both are up-to-date.'; + + // escape flash -> JS stack so this error fires in window. + setTimeout(function versionMismatch() { + throw new Error(e); + }, 0); + + // exit, init will fail with timeout + return false; + + } + // + + // IE needs a larger timeout + setTimeout(init, isIE ? 100 : 1); + + }; + + /** + * Private initialization helpers + * ------------------------------ + */ + + createMovie = function(smID, smURL) { + + if (didAppend && appendSuccess) { + // ignore if already succeeded + return false; + } + + function initMsg() { + + // + + var options = [], + title, + msg = [], + delimiter = ' + '; + + title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : ''); + + if (!sm2.html5Only) { + + if (sm2.preferFlash) { + options.push('preferFlash'); + } + + if (sm2.useHighPerformance) { + options.push('useHighPerformance'); + } + + if (sm2.flashPollingInterval) { + options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)'); + } + + if (sm2.html5PollingInterval) { + options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)'); + } + + if (sm2.wmode) { + options.push('wmode (' + sm2.wmode + ')'); + } + + if (sm2.debugFlash) { + options.push('debugFlash'); + } + + if (sm2.useFlashBlock) { + options.push('flashBlock'); + } + + } else { + + if (sm2.html5PollingInterval) { + options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)'); + } + + } + + if (options.length) { + msg = msg.concat([options.join(delimiter)]); + } + + sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1); + + showSupport(); + + // + + } + + if (sm2.html5Only) { + + // 100% HTML5 mode + setVersionInfo(); + + initMsg(); + sm2.oMC = id(sm2.movieID); + init(); + + // prevent multiple init attempts + didAppend = true; + + appendSuccess = true; + + return false; + + } + + // flash path + var remoteURL = (smURL || sm2.url), + localURL = (sm2.altURL || remoteURL), + swfTitle = 'JS/Flash audio component (SoundManager 2)', + oTarget = getDocument(), + extraClass = getSWFCSS(), + isRTL = null, + html = doc.getElementsByTagName('html')[0], + oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass; + + isRTL = (html && html.dir && html.dir.match(/rtl/i)); + smID = (smID === _undefined?sm2.id:smID); + + function param(name, value) { + return ''; + } + + // safety check for legacy (change to Flash 9 URL) + setVersionInfo(); + sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL); + smURL = sm2.url; + + sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode); + + if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { + /** + * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here + * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout + * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?) + */ + messages.push(strings.spcWmode); + sm2.wmode = null; + } + + oEmbed = { + 'name': smID, + 'id': smID, + 'src': smURL, + 'quality': 'high', + 'allowScriptAccess': sm2.allowScriptAccess, + 'bgcolor': sm2.bgColor, + 'pluginspage': http+'www.macromedia.com/go/getflashplayer', + 'title': swfTitle, + 'type': 'application/x-shockwave-flash', + 'wmode': sm2.wmode, + // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html + 'hasPriority': 'true' + }; + + if (sm2.debugFlash) { + oEmbed.FlashVars = 'debug=1'; + } + + if (!sm2.wmode) { + // don't write empty attribute + delete oEmbed.wmode; + } + + if (isIE) { + + // IE is "special". + oMovie = doc.createElement('div'); + movieHTML = [ + '', + param('movie', smURL), + param('AllowScriptAccess', sm2.allowScriptAccess), + param('quality', oEmbed.quality), + (sm2.wmode? param('wmode', sm2.wmode): ''), + param('bgcolor', sm2.bgColor), + param('hasPriority', 'true'), + (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), + '' + ].join(''); + + } else { + + oMovie = doc.createElement('embed'); + for (tmp in oEmbed) { + if (oEmbed.hasOwnProperty(tmp)) { + oMovie.setAttribute(tmp, oEmbed[tmp]); + } + } + + } + + initDebug(); + extraClass = getSWFCSS(); + oTarget = getDocument(); + + if (oTarget) { + + sm2.oMC = (id(sm2.movieID) || doc.createElement('div')); + + if (!sm2.oMC.id) { + + sm2.oMC.id = sm2.movieID; + sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass; + s = null; + oEl = null; + + if (!sm2.useFlashBlock) { + if (sm2.useHighPerformance) { + // on-screen at all times + s = { + 'position': 'fixed', + 'width': '8px', + 'height': '8px', + // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. + 'bottom': '0px', + 'left': '0px', + 'overflow': 'hidden' + }; + } else { + // hide off-screen, lower priority + s = { + 'position': 'absolute', + 'width': '6px', + 'height': '6px', + 'top': '-9999px', + 'left': '-9999px' + }; + if (isRTL) { + s.left = Math.abs(parseInt(s.left,10))+'px'; + } + } + } + + if (isWebkit) { + // soundcloud-reported render/crash fix, safari 5 + sm2.oMC.style.zIndex = 10000; + } + + if (!sm2.debugFlash) { + for (x in s) { + if (s.hasOwnProperty(x)) { + sm2.oMC.style[x] = s[x]; + } + } + } + + try { + if (!isIE) { + sm2.oMC.appendChild(oMovie); + } + oTarget.appendChild(sm2.oMC); + if (isIE) { + oEl = sm2.oMC.appendChild(doc.createElement('div')); + oEl.className = swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + appendSuccess = true; + } catch(e) { + throw new Error(str('domError')+' \n'+e.toString()); + } + + } else { + + // SM2 container is already in the document (eg. flashblock use case) + sClass = sm2.oMC.className; + sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:''); + sm2.oMC.appendChild(oMovie); + if (isIE) { + oEl = sm2.oMC.appendChild(doc.createElement('div')); + oEl.className = swfCSS.swfBox; + oEl.innerHTML = movieHTML; + } + appendSuccess = true; + + } + + } + + didAppend = true; + initMsg(); + // sm2._wD(sm + ': Trying to load ' + smURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1); + + return true; + + }; + + initMovie = function() { + + if (sm2.html5Only) { + createMovie(); + return false; + } + + // attempt to get, or create, movie (may already exist) + if (flash) { + return false; + } + + if (!sm2.url) { + + /** + * Something isn't right - we've reached init, but the soundManager url property has not been set. + * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time. + * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case. + */ + + _wDS('noURL'); + return false; + + } + + // inline markup case + flash = sm2.getMovie(sm2.id); + + if (!flash) { + if (!oRemoved) { + // try to create + createMovie(sm2.id, sm2.url); + } else { + // try to re-append removed movie after reboot() + if (!isIE) { + sm2.oMC.appendChild(oRemoved); + } else { + sm2.oMC.innerHTML = oRemovedHTML; + } + oRemoved = null; + didAppend = true; + } + flash = sm2.getMovie(sm2.id); + } + + if (typeof sm2.oninitmovie === 'function') { + setTimeout(sm2.oninitmovie, 1); + } + + // + flushMessages(); + // + + return true; + + }; + + delayWaitForEI = function() { + + setTimeout(waitForEI, 1000); + + }; + + rebootIntoHTML5 = function() { + + // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled. + + window.setTimeout(function() { + + complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...'); + + sm2.setup({ + preferFlash: false + }).reboot(); + + // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true. + sm2.didFlashBlock = true; + + sm2.beginDelayedInit(); + + }, 1); + + }; + + waitForEI = function() { + + var p, + loadIncomplete = false; + + if (!sm2.url) { + // No SWF url to load (noURL case) - exit for now. Will be retried when url is set. + return false; + } + + if (waitingForEI) { + return false; + } + + waitingForEI = true; + event.remove(window, 'load', delayWaitForEI); + + if (hasFlash && tryInitOnFocus && !isFocused) { + // Safari won't load flash in background tabs, only when focused. + _wDS('waitFocus'); + return false; + } + + if (!didInit) { + p = sm2.getMoviePercent(); + if (p > 0 && p < 100) { + loadIncomplete = true; + } + } + + setTimeout(function() { + + p = sm2.getMoviePercent(); + + if (loadIncomplete) { + // special case: if movie *partially* loaded, retry until it's 100% before assuming failure. + waitingForEI = false; + sm2._wD(str('waitSWF')); + window.setTimeout(delayWaitForEI, 1); + return false; + } + + // + if (!didInit) { + + sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ':'') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash?' ' + str('checkSWF'):''), 2); + + if (!overHTTP && p) { + + _wDS('localFail', 2); + + if (!sm2.debugFlash) { + _wDS('tryDebug', 2); + } + + } + + if (p === 0) { + + // if 0 (not null), probably a 404. + sm2._wD(str('swf404', sm2.url), 1); + + } + + debugTS('flashtojs', false, ': Timed out' + overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); + + } + // + + // give up / time-out, depending + + if (!didInit && okToDisable) { + + if (p === null) { + + // SWF failed to report load progress. Possibly blocked. + + if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) { + + if (sm2.useFlashBlock) { + + flashBlockHandler(); + + } + + _wDS('waitForever'); + + } else { + + // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load. + + if (!sm2.useFlashBlock && canIgnoreFlash) { + + rebootIntoHTML5(); + + } else { + + _wDS('waitForever'); + + // fire any regular registered ontimeout() listeners. + processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}}); + + } + + } + + } else { + + // SWF loaded? Shouldn't be a blocking issue, then. + + if (sm2.flashLoadTimeout === 0) { + + _wDS('waitForever'); + + } else { + + if (!sm2.useFlashBlock && canIgnoreFlash) { + + rebootIntoHTML5(); + + } else { + + failSafely(true); + + } + + } + + } + + } + + }, sm2.flashLoadTimeout); + + }; + + handleFocus = function() { + + function cleanup() { + event.remove(window, 'focus', handleFocus); + } + + if (isFocused || !tryInitOnFocus) { + // already focused, or not special Safari background tab case + cleanup(); + return true; + } + + okToDisable = true; + isFocused = true; + _wDS('gotFocus'); + + // allow init to restart + waitingForEI = false; + + // kick off ExternalInterface timeout, now that the SWF has started + delayWaitForEI(); + + cleanup(); + return true; + + }; + + flushMessages = function() { + + // + + // SM2 pre-init debug messages + if (messages.length) { + sm2._wD('SoundManager 2: ' + messages.join(' '), 1); + messages = []; + } + + // + + }; + + showSupport = function() { + + // + + flushMessages(); + + var item, tests = []; + + if (sm2.useHTML5Audio && sm2.hasHTML5) { + for (item in sm2.audioFormats) { + if (sm2.audioFormats.hasOwnProperty(item)) { + tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)': (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); + } + } + sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1); + } + + // + + }; + + initComplete = function(bNoDisable) { + + if (didInit) { + return false; + } + + if (sm2.html5Only) { + // all good. + _wDS('sm2Loaded'); + didInit = true; + initUserOnload(); + debugTS('onload', true); + return true; + } + + var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()), + result = true, + error; + + if (!wasTimeout) { + didInit = true; + } + + error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; + + sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ')', disabled ? 2: 1); + + if (disabled || bNoDisable) { + if (sm2.useFlashBlock && sm2.oMC) { + sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError); + } + processOnEvents({type:'ontimeout', error:error, ignoreInit: true}); + debugTS('onload', false); + catchError(error); + result = false; + } else { + debugTS('onload', true); + } + + if (!disabled) { + if (sm2.waitForWindowLoad && !windowLoaded) { + _wDS('waitOnload'); + event.add(window, 'load', initUserOnload); + } else { + // + if (sm2.waitForWindowLoad && windowLoaded) { + _wDS('docLoaded'); + } + // + initUserOnload(); + } + } + + return result; + + }; + + /** + * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion) + * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup(). + */ + + setProperties = function() { + + var i, + o = sm2.setupOptions; + + for (i in o) { + + if (o.hasOwnProperty(i)) { + + // assign local property if not already defined + + if (sm2[i] === _undefined) { + + sm2[i] = o[i]; + + } else if (sm2[i] !== o[i]) { + + // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync + sm2.setupOptions[i] = sm2[i]; + + } + + } + + } + + }; + + + init = function() { + + // called after onload() + + if (didInit) { + _wDS('didInit'); + return false; + } + + function cleanup() { + event.remove(window, 'load', sm2.beginDelayedInit); + } + + if (sm2.html5Only) { + if (!didInit) { + // we don't need no steenking flash! + cleanup(); + sm2.enabled = true; + initComplete(); + } + return true; + } + + // flash path + initMovie(); + + try { + + // attempt to talk to Flash + flash._externalInterfaceTest(false); + + // apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling + // (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates) + setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50))); + + if (!sm2.debugMode) { + // stop the SWF from making debug output calls to JS + flash._disableDebug(); + } + + sm2.enabled = true; + debugTS('jstoflash', true); + + if (!sm2.html5Only) { + // prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead + // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/ + event.add(window, 'unload', doNothing); + } + + } catch(e) { + + sm2._wD('js/flash exception: ' + e.toString()); + debugTS('jstoflash', false); + catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); + // don't disable, for reboot() + failSafely(true); + initComplete(); + + return false; + + } + + initComplete(); + + // disconnect events + cleanup(); + + return true; + + }; + + domContentLoaded = function() { + + if (didDCLoaded) { + return false; + } + + didDCLoaded = true; + + // assign top-level soundManager properties eg. soundManager.url + setProperties(); + + initDebug(); + + /** + * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1 + * Ditto for sm2-preferFlash, too. + */ + // + (function(){ + + var a = 'sm2-usehtml5audio=', + a2 = 'sm2-preferflash=', + b = null, + b2 = null, + l = wl.toLowerCase(); + + if (l.indexOf(a) !== -1) { + b = (l.charAt(l.indexOf(a)+a.length) === '1'); + if (hasConsole) { + console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); + } + sm2.setup({ + 'useHTML5Audio': b + }); + } + + if (l.indexOf(a2) !== -1) { + b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1'); + if (hasConsole) { + console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter'); + } + sm2.setup({ + 'preferFlash': b2 + }); + } + + }()); + // + + if (!hasFlash && sm2.hasHTML5) { + sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1); + sm2.setup({ + 'useHTML5Audio': true, + // make sure we aren't preferring flash, either + // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak. + 'preferFlash': false + }); + } + + testHTML5(); + + if (!hasFlash && needsFlash) { + messages.push(strings.needFlash); + // TODO: Fatal here vs. timeout approach, etc. + // hack: fail sooner. + sm2.setup({ + 'flashLoadTimeout': 1 + }); + } + + if (doc.removeEventListener) { + doc.removeEventListener('DOMContentLoaded', domContentLoaded, false); + } + + initMovie(); + + return true; + + }; + + domContentLoadedIE = function() { + + if (doc.readyState === 'complete') { + domContentLoaded(); + doc.detachEvent('onreadystatechange', domContentLoadedIE); + } + + return true; + + }; + + winOnLoad = function() { + + // catch edge case of initComplete() firing after window.load() + windowLoaded = true; + event.remove(window, 'load', winOnLoad); + + }; + + /** + * miscellaneous run-time, pre-init stuff + */ + + preInit = function() { + + if (mobileHTML5) { + + // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point. + + // + if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) { + // notify that defaults are being changed. + messages.push(strings.mobileUA); + } + // + + sm2.setupOptions.useHTML5Audio = true; + sm2.setupOptions.preferFlash = false; + + if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) { + // iOS and Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence. + // common use case: exiting sound onfinish() -> createSound() -> play() + // + messages.push(strings.globalHTML5); + // + if (is_iDevice) { + sm2.ignoreFlash = true; + } + useGlobalHTML5Audio = true; + } + + } + + }; + + preInit(); + + // sniff up-front + detectFlash(); + + // focus and window load, init (primarily flash-driven) + event.add(window, 'focus', handleFocus); + event.add(window, 'load', delayWaitForEI); + event.add(window, 'load', winOnLoad); + + if (doc.addEventListener) { + + doc.addEventListener('DOMContentLoaded', domContentLoaded, false); + + } else if (doc.attachEvent) { + + doc.attachEvent('onreadystatechange', domContentLoadedIE); + + } else { + + // no add/attachevent support - safe to assume no JS -> Flash either + debugTS('onload', false); + catchError({type:'NO_DOM2_EVENTS', fatal:true}); + + } + +} // SoundManager() + +// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading + +if (window.SM2_DEFER === undefined || !SM2_DEFER) { + soundManager = new SoundManager(); +} + +/** + * SoundManager public interfaces + * ------------------------------ + */ + +window.SoundManager = SoundManager; // constructor +window.soundManager = soundManager; // public API, flash callbacks etc. + +}(window)); diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as new file mode 100755 index 00000000..6527594e --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as @@ -0,0 +1,421 @@ +/** + * SoundManager 2: Javascript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code licensed under the BSD License: + * http://www.schillmania.com/projects/soundmanager2/license.txt + * + * Flash 8 / ActionScript 2 version + * + * Compiling AS to Flash 8 SWF using MTASC (free compiler - http://www.mtasc.org/): + * mtasc -swf soundmanager2.swf -main -header 16:16:30 SoundManager2.as -version 8 + * + * ActionScript Sound class reference (Macromedia), documentation download: + * http://livedocs.macromedia.com/flash/8/ + * Previously-live URL: + * http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002668.html + * + * *** NOTE ON LOCAL FILE SYSTEM ACCESS *** + * + * Flash security allows local OR network access, but not both + * unless explicitly whitelisted/allowed by the flash player's + * security settings. + * + * To enable in-flash messaging for troubleshooting, pass debug=1 in FlashVars (within object/embed code) + * SM2 will do this by default when soundManager.debugFlash = true. + * + */ + +import flash.external.ExternalInterface; // woo + +class SoundManager2 { + + static var app: SoundManager2; + + function SoundManager2() { + + var version = "V2.97a.20131201"; + var version_as = "(AS2/Flash 8)"; + + /** + * Cross-domain security options + * HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work. + * // allow_xdomain_scripting = true; + * // xdomain = "foo.com"; + * For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*"); + * When loading from HTTPS, use System.security.allowInsecureDomain(); + * See "allowDomain (security.allowDomain method)" in Flash 8/AS2 liveDocs documentation (AS2 reference -> classes -> security) + * download from http://livedocs.macromedia.com/flash/8/ + * Related AS3 documentation: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain%28%29 + */ + + var allow_xdomain_scripting = false; + var xdomain = "*"; + + if (allow_xdomain_scripting && xdomain) { + System.security.allowDomain(xdomain); + version_as += ' - cross-domain enabled'; + } + + // externalInterface references (for Javascript callbacks) + var baseJSController = "soundManager"; + var baseJSObject = baseJSController + ".sounds"; + + // internal objects + var sounds = []; // indexed string array + var soundObjects = []; // associative Sound() object array + var timer = null; + var pollingEnabled = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call + var debugEnabled = true; // Flash debug output enabled by default, disabled by JS call + var flashDebugEnabled = false; // debug output to flash movie, off by default + var didSandboxMessage = false; + var caughtFatal = false; + + // for flash text output, debugging etc. + var _messages = []; + var _messageObj = null; + flashDebugEnabled = (_root.debug == 1); + + // display stuffs + Stage.scaleMode = 'noScale'; + Stage.align = 'TL'; + + // context menu item with version info + + var doNothing = function() {} + + var sm2Menu:ContextMenu = new ContextMenu(); + var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as, doNothing); + sm2MenuItem.enabled = false; + sm2Menu.customItems.push(sm2MenuItem); + _root.menu = sm2Menu; + + var writeDebug = function(s, logLevel) { + // + if (!debugEnabled) return false; + ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, (logLevel || 0)); + // + } + + var flashDebug = function(messageText) { + // + _messages.push(messageText); + if (!flashDebugEnabled) { + return false; + } + var sans = new TextFormat(); + sans.size = 12; + sans.font = "Arial"; + + // 320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.) + var w = Stage.width?Stage.width:320; + var h = Stage.height?Stage.height:240; + if (!_messageObj) { + _messageObj = _root.createTextField("_messageObj", 0, 0, 0, w, h); + _messageObj.x = 0; + _messageObj.y = 0; + _messageObj.multiline = true; + _messageObj.html = true; + _messageObj.wordWrap = true; + _messageObj.align = 'left'; + _messageObj.autoSize = false; + } + _messageObj.htmlText = _messages.join('\n'); + _messageObj.setTextFormat(sans); + _messageObj.width = w; + _messageObj.height = h; + // + } + + var _externalInterfaceTest = function(isFirstCall) { + var sandboxType = System.security['sandboxType']; + try { + if (isFirstCall) { + flashDebug('Testing Flash -> JS...') + if (!didSandboxMessage && sandboxType != 'remote' && sandboxType != 'localTrusted') { + didSandboxMessage = true; + flashDebug('
    Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".
    Additional security permissions need to be granted.
    See flash security settings panel for non-HTTP, eg. file:// use.

    http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html

    You may also be able to right-click this movie and choose from the menu:
    "Global Settings" -> "Advanced" tab -> "Trusted Location Settings"
    '); + } + ExternalInterface.call(baseJSController + "._externalInterfaceOK", version); + if (!didSandboxMessage) { + flashDebug('Flash -> JS OK'); + flashDebug('Waiting for JS -> Flash...'); + } + } else { + // writeDebug('SM2 SWF ' + version + ' ' + version_as, 1); + ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType); + flashDebug('JS -> Flash OK'); + } + } catch(e) { + flashDebug(e.toString()); + if (!caughtFatal) { + caughtFatal = true; + } + return false; + } + return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.) + } + + var _disableDebug = function() { + // prevent future debug calls from Flash going to client (maybe improve performance) + writeDebug('_disableDebug()'); + debugEnabled = false; + } + + var checkProgress = function() { + var bL = 0; + var bT = 0; + var nD = 0; + var nP = 0; + var oSound = null; + for (var i = 0, j = sounds.length; i < j; i++) { + oSound = soundObjects[sounds[i]]; + bL = oSound.getBytesLoaded(); + bT = oSound.getBytesTotal(); + nD = oSound.duration || 0; // can sometimes be null with short MP3s? Wack. + nP = oSound.position; + if (bL && bT && bL != oSound.lastValues.bytes) { + oSound.lastValues.bytes = bL; + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", bL, bT, nD); + } + if (typeof nP != 'undefined' && nP != oSound.lastValues.position) { + oSound.lastValues.position = nP; + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileplaying", nP); + // if position changed, check for near-end + } + } + } + + var onLoad = function(bSuccess) { + checkProgress(); // ensure progress stats are up-to-date + // force duration update (doesn't seem to be always accurate) + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.getBytesLoaded(), this.getBytesTotal(), this.duration); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", this.duration > 0 ? 1 : 0); // bSuccess doesn't always seem to work, so check MP3 duration instead. + } + + var onID3 = function() { + // --- NOTE: BUGGY? --- + // -------------------- + // TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) + // ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) + // iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. + // May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33 + var id3Data = []; + var id3Props = []; + for (var prop in this.id3) { + id3Props.push(prop); + id3Data.push(this.id3[prop]); + // writeDebug('id3['+prop+']: '+this.id3[prop]); + } + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onid3", id3Props, id3Data); + // unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) + // Therefore if ID3V2 data is received, ID3V1 is ignored. + soundObjects[this.sID].onID3 = null; + } + + var registerOnComplete = function(sID) { + soundObjects[sID].onSoundComplete = function() { + checkProgress(); + ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); + } + } + + var _setPosition = function(sID, nSecOffset, isPaused, _allowMultiShot) { + // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. + var s = soundObjects[sID]; + // writeDebug('_setPosition()'); + s.lastValues.position = s.position; + if (s.lastValues.loops > 1 && nSecOffset != 0) { + writeDebug('Warning: Looping functionality being disabled due to Flash limitation.', 240); + s.lastValues.loops = 1; + } + s.start(nSecOffset, s.lastValues.nLoops || 1); // start playing at new position + if (isPaused) { + s.stop(); + } + } + + var _load = function(sID, sURL, bStream, bAutoPlay, bCheckPolicyFile) { + // writeDebug('_load(): '+sID+', '+sURL+', '+bStream+', '+bAutoPlay+', '+bCheckPolicyFile); + if (typeof bAutoPlay == 'undefined') { + bAutoPlay = false; + } + if (typeof bStream == 'undefined') { + bStream = true; + } + if (typeof bCheckPolicyFile == 'undefined') { + bCheckPolicyFile = false; + } + // writeDebug('bStream: '+bStream); + // writeDebug('bAutoPlay: '+bAutoPlay); + // checkProgress(); + var s = soundObjects[sID]; + s.onID3 = onID3; + s.onLoad = onLoad; + s.loaded = true; + s.checkPolicyFile = bCheckPolicyFile; + s.loadSound(sURL, bStream); + if (bAutoPlay != true) { + s.stop(); // prevent default auto-play behaviour + } else { + writeDebug('auto-play allowed'); + } + registerOnComplete(sID); + } + + var _unload = function(sID, sURL) { + // effectively "stop" loading by loading a tiny MP3 + var s = soundObjects[sID]; + s.onID3 = null; + s.onLoad = null; + s.loaded = false; + // ensure position is reset, if unload fails + s.start(0,1); + s.stop(); + s.loadSound(sURL, true); + s.stop(); // prevent auto-play + } + + var _createSound = function(sID, loops, checkPolicyFile) { + var s = new Sound(); + if (!soundObjects[sID]) { + sounds.push(sID); + } + soundObjects[sID] = s; + s.setVolume(100); + s.sID = sID; + s.paused = false; + s.loaded = false; + s.checkPolicyFile = checkPolicyFile; + s.lastValues = { + bytes: 0, + position: 0, + nLoops: loops||1 + }; + } + + var _destroySound = function(sID) { + // for the power of garbage collection! .. er, Greyskull! + var s = (soundObjects[sID] || null); + if (!s) { + return false; + } + for (var i = 0; i < sounds.length; i++) { + if (sounds[i] == sID) { + sounds.splice(i, 1); + break; + } + } + s = null; + delete soundObjects[sID]; + } + + var _stop = function(sID, bStopAll) { + // stop this particular instance (or "all", based on parameter) + if (bStopAll) { + _root.stop(); + } else { + soundObjects[sID].stop(); + soundObjects[sID].paused = false; + } + } + + var _start = function(sID, nLoops, nMsecOffset, _allowMultiShot) { + // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. + // writeDebug('_start: ' + sID + ', loops: ' + nLoops + ', nMsecOffset: ' + nMsecOffset); + registerOnComplete(); + var s = soundObjects[sID]; + s.lastValues.paused = false; // reset pause if applicable + s.lastValues.nLoops = (nLoops || 1); + s.start(nMsecOffset, nLoops); + return true; + } + + var _pause = function(sID, _allowMultiShot) { + // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. + // writeDebug('_pause()'); + var s = soundObjects[sID]; + if (!s.paused) { + // reference current position, stop sound + s.paused = true; + s.lastValues.position = s.position; + // writeDebug('_pause(): position: '+s.lastValues.position); + s.stop(); + } else { + // resume playing from last position + // writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.nLoops+' times'); + s.paused = false; + s.start(s.lastValues.position / 1000, s.lastValues.nLoops); + } + } + + var _setPan = function(sID, nPan) { + soundObjects[sID].setPan(nPan); + } + + var _setVolume = function(sID, nVol) { + soundObjects[sID].setVolume(nVol); + } + + var _setPolling = function(bPolling, timerInterval) { + if (typeof timerInterval === 'undefined') { + timerInterval = 50; + } + pollingEnabled = bPolling; + if (timer == null && pollingEnabled) { + flashDebug('Enabling polling, ' + timerInterval + ' ms interval'); + timer = setInterval(checkProgress, timerInterval); + } else if (timer && !pollingEnabled) { + flashDebug('Disabling polling'); + clearInterval(timer); + timer = null; + } + } + + var _init = function() { + + // OK now stuff should be available + try { + flashDebug('Adding ExternalInterface callbacks...'); + ExternalInterface.addCallback('_load', this, _load); + ExternalInterface.addCallback('_unload', this, _unload); + ExternalInterface.addCallback('_stop', this, _stop); + ExternalInterface.addCallback('_start', this, _start); + ExternalInterface.addCallback('_pause', this, _pause); + ExternalInterface.addCallback('_setPosition', this, _setPosition); + ExternalInterface.addCallback('_setPan', this, _setPan); + ExternalInterface.addCallback('_setVolume', this, _setVolume); + ExternalInterface.addCallback('_setPolling', this, _setPolling); + ExternalInterface.addCallback('_externalInterfaceTest', this, _externalInterfaceTest); + ExternalInterface.addCallback('_disableDebug', this, _disableDebug); + ExternalInterface.addCallback('_createSound', this, _createSound); + ExternalInterface.addCallback('_destroySound', this, _destroySound); + } catch(e) { + flashDebug('Fatal: ExternalInterface error: ' + e.toString()); + } + // try to talk to JS, do init etc. + _externalInterfaceTest(true); + // flashDebug('Init OK'); + } + + flashDebug('SM2 SWF ' + version + ' ' + version_as); + + if (ExternalInterface.available) { + flashDebug('ExternalInterface available'); + _init(); + } else { + // d'oh! - may be from a corrupt install, ancient (pre-Netscape 6?) browser etc. + flashDebug('Fatal: ExternalInterface (Flash <-> JS) not available'); + } + + + } // SoundManager2() + + // entry point + static function main(mc) { + app = new SoundManager2(); + } + +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as new file mode 100755 index 00000000..6568129e --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as @@ -0,0 +1,925 @@ +/** + * SoundManager 2: Javascript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code licensed under the BSD License: + * http://www.schillmania.com/projects/soundmanager2/license.txt + * + * Flash 9 / ActionScript 3 version + */ + +package { + + import flash.display.Sprite; + import flash.events.Event; + import flash.events.IOErrorEvent; + import flash.events.MouseEvent; + import flash.events.SecurityErrorEvent; + import flash.events.AsyncErrorEvent; + import flash.events.NetStatusEvent; + import flash.events.TimerEvent; + import flash.external.ExternalInterface; // woo + import flash.media.Sound; + import flash.media.SoundChannel; + import flash.media.SoundMixer; + import flash.net.URLLoader; + import flash.net.URLRequest; + import flash.system.Security; + import flash.system.System; + import flash.text.TextField; + import flash.text.TextFormat; + import flash.text.TextFieldAutoSize; + import flash.ui.ContextMenu; + import flash.ui.ContextMenuItem; + import flash.utils.setInterval; + import flash.utils.clearInterval; + import flash.utils.Dictionary; + import flash.utils.Timer; + + public class SoundManager2_AS3 extends Sprite { + + public var version:String = "V2.97a.20131201"; + public var version_as:String = "(AS3/Flash 9)"; + + /** + * Cross-domain security options + * HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work. + * // allow_xdomain_scripting = true; + * // xdomain = "foo.com"; + * For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*"); + * When loading from HTTPS, use System.security.allowInsecureDomain(); + * See http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain() + */ + public var allow_xdomain_scripting:Boolean = false; + public var xdomain:String = "*"; + + // externalInterface references (for Javascript callbacks) + public var baseJSController:String = "soundManager"; + public var baseJSObject:String = baseJSController + ".sounds"; + + // internal objects + public var sounds:Array = []; // indexed string array + public var soundObjects: Dictionary = new Dictionary(); // associative Sound() object Dictionary type + public var timer: Timer = null; + public var pollingEnabled: Boolean = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call + public var debugEnabled: Boolean = true; // Flash debug output enabled by default, disabled by JS call + public var flashDebugEnabled: Boolean = false; // Flash internal debug output (write to visible SWF in browser) + public var loaded: Boolean = false; + public var currentObject: SoundManager2_SMSound_AS3 = null; + public var paramList:Object = null; + public var messages:Array = []; + public var textField: TextField = null; + public var textStyle: TextFormat = new TextFormat(); + public var didSandboxMessage: Boolean = false; + public var caughtFatal: Boolean = false; + + public function SoundManager2_AS3() { + + if (allow_xdomain_scripting && xdomain) { + Security.allowDomain(xdomain); + version_as += ' - cross-domain enabled'; + } + + this.paramList = this.root.loaderInfo.parameters; + + // + if (this.paramList['debug'] == 1) { + this.flashDebugEnabled = true; + } + + if (this.flashDebugEnabled) { + var canvas: Sprite = new Sprite(); + canvas.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); + addChild(canvas); + } + // + + flashDebug('SM2 SWF ' + version + ' ' + version_as); + + // context menu item with version info + + var sm2Menu:ContextMenu = new ContextMenu(); + var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as); + sm2MenuItem.enabled = false; + sm2Menu.customItems.push(sm2MenuItem); + contextMenu = sm2Menu; + + if (ExternalInterface.available) { + flashDebug('ExternalInterface available'); + try { + flashDebug('Adding ExternalInterface callbacks...'); + ExternalInterface.addCallback('_load', _load); + ExternalInterface.addCallback('_unload', _unload); + ExternalInterface.addCallback('_stop', _stop); + ExternalInterface.addCallback('_start', _start); + ExternalInterface.addCallback('_pause', _pause); + ExternalInterface.addCallback('_setPosition', _setPosition); + ExternalInterface.addCallback('_setPan', _setPan); + ExternalInterface.addCallback('_setVolume', _setVolume); + ExternalInterface.addCallback('_setPolling', _setPolling); + ExternalInterface.addCallback('_externalInterfaceTest', _externalInterfaceTest); + ExternalInterface.addCallback('_disableDebug', _disableDebug); + ExternalInterface.addCallback('_getMemoryUse', _getMemoryUse); + ExternalInterface.addCallback('_createSound', _createSound); + ExternalInterface.addCallback('_destroySound', _destroySound); + ExternalInterface.addCallback('_setAutoPlay', _setAutoPlay); + } catch(e: Error) { + flashDebug('Fatal: ExternalInterface error: ' + e.toString()); + } + } else { + flashDebug('Fatal: ExternalInterface (Flash <-> JS) not available'); + }; + + // call after delay, to be safe (ensure callbacks are registered by the time JS is called below) + var timer: Timer = new Timer(20, 0); + timer.addEventListener(TimerEvent.TIMER, function() : void { + timer.reset(); + _externalInterfaceTest(true); + // timer.reset(); + // flashDebug('Init OK'); + }); + timer.start(); + // delayed, see above + // _externalInterfaceTest(true); + } // SoundManager2() + + public function flashDebug (txt:String) : void { + // + messages.push(txt); + if (this.flashDebugEnabled) { + var didCreate: Boolean = false; + textStyle.font = 'Arial'; + textStyle.size = 12; + // 320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.) + var w:Number = this.stage.width?this.stage.width:320; + var h:Number = this.stage.height?this.stage.height:240; + if (textField == null) { + didCreate = true; + textField = new TextField(); + textField.autoSize = TextFieldAutoSize.LEFT; + textField.x = 0; + textField.y = 0; + textField.multiline = true; + textField.textColor = 0; + textField.wordWrap = true; + } + textField.htmlText = messages.join('\n'); + textField.setTextFormat(textStyle); + textField.width = w; + textField.height = h; + if (didCreate) { + this.addChild(textField); + } + } + // + } + + public function _setAutoPlay(sID:String, autoPlay:Boolean) : void { + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (s) { + s.setAutoPlay(autoPlay); + } + } + + // methods + // ----------------------------------- + + public function writeDebug (s:String, logLevel:Number = 0) : Boolean { + if (!debugEnabled) { + return false; + } + // + ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, null, logLevel); + // + return true; + } + + public function _externalInterfaceTest(isFirstCall: Boolean) : Boolean { + var sandboxType:String = flash.system.Security['sandboxType']; + if (!didSandboxMessage && sandboxType != 'localTrusted' && sandboxType != 'remote') { + didSandboxMessage = true; + flashDebug('
    Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".
    Additional security permissions need to be granted.
    See flash security settings panel for non-HTTP, eg., file:// use.

    http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html

    You may also be able to right-click this movie and choose from the menu:
    "Global Settings" -> "Advanced" tab -> "Trusted Location Settings"
    '); + } + try { + if (isFirstCall == true) { + flashDebug('Testing Flash -> JS...'); + ExternalInterface.call(baseJSController + "._externalInterfaceOK", version); + flashDebug('Flash -> JS OK'); + flashDebug('Waiting for JS -> Flash...'); + } else { + // writeDebug('SM2 SWF ' + version + ' ' + version_as, 1); + ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType); + flashDebug('JS -> Flash OK'); + } + } catch(e: Error) { + flashDebug('Fatal: Flash <-> JS error: ' + e.toString()); + writeDebug('_externalInterfaceTest: Error: ' + e.toString(), 2); + if (!caughtFatal) { + caughtFatal = true; + } + return false; + } + return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.) + } + + public function _disableDebug() : void { + // prevent future debug calls from Flash going to client (maybe improve performance) + writeDebug('_disableDebug()'); + debugEnabled = false; + } + + public function checkLoadProgress(e: Event) : void { + try { + var oSound:Object = e.target; + var bL: int = oSound.bytesLoaded; + var bT: int = oSound.bytesTotal; + var nD: int = oSound.length || oSound.duration || 0; + var sMethod:String = baseJSObject + "['" + oSound.sID + "']._whileloading"; + ExternalInterface.call(sMethod, bL, bT, nD); + if (bL && bT && bL != oSound.lastValues.bytes) { + oSound.lastValues.bytes = bL; + ExternalInterface.call(sMethod, bL, bT, nD); + } + } catch(e: Error) { + writeDebug('checkLoadProgress(): ' + e.toString()); + } + } + + public function checkSoundProgress(oSound:SoundManager2_SMSound_AS3, forceCheck:Boolean = false, forceEndCheck:Boolean = false) : void { + var bL: int = 0; + var bT: int = 0; + var nD: int = 0; + var nP: int = 0; + var bufferLength: int = 0; + var lP:Number = 0; + var rP:Number = 0; + var isBuffering:Object = null; + var oSoundChannel: flash.media.SoundChannel = null; + var sMethod:String = null; + var newPeakData: Boolean = false; + var newWaveformData: Boolean = false; + var newEQData: Boolean = false; + var areSoundsInaccessible: Boolean = SoundMixer.areSoundsInaccessible(); + var isPlaying: Boolean = true; // special case for NetStream when ending + var hasNew:Boolean = false; + var hasNewLoaded:Boolean = false; + + if (!oSound || !oSound.useEvents || oSound.failed || !oSound.connected) { + // edge cases for ignoring: if sounds are destructed within event handlers while checkProgress() is running, may be null + return; + } + + sMethod = baseJSObject + "['" + oSound.sID + "']._whileloading"; + + if (oSound.useNetstream) { + + // Don't do anything if there is no NetStream object yet + if (!oSound.ns) { + return; + } + + // stream + bufferLength = oSound.ns.bufferLength; + bL = oSound.ns.bytesLoaded; + bT = oSound.ns.bytesTotal; + nD = int(oSound.duration || 0); // can sometimes be null with short MP3s? Wack. + nP = oSound.ns.time * 1000; + + if (oSound.paused) { + // special case: paused netStreams don't update if setPosition() is called while they are paused. + // instead, return lastValues.position which should reflect setPosition() call. + // writeDebug('paused case, setting nP of '+nP+' to -1'); + // writeDebug('lastValues: '+oSound.lastValues.position); + nP = oSound.lastValues.position; + } + + if (nP >= 0 && nP != oSound.lastValues.position) { + oSound.lastValues.position = nP; + hasNew = true; + } + if (nD > oSound.lastValues.duration) { + oSound.lastValues.duration = nD; + hasNew = true; + } + if (bL > oSound.lastValues.bytesLoaded) { + oSound.lastValues.bytesLoaded = bL; + hasNew = true; + } + if (bT > oSound.lastValues.bytes) { + oSound.lastValues.bytes = bT; + hasNew = true; + } + if (bufferLength != oSound.lastValues.bufferLength) { + oSound.lastValues.bufferLength = bufferLength; + hasNew = true; + } + + // Don't set loaded for streams because bytesLoaded and bytesTotal are always 0 + // writeDebug('ns: time/duration, bytesloaded/total: '+nP+'/'+nD+', '+bL+'/'+bT); + if (oSound.loaded != true && nD > 0 && bL == bT && bL != 0 && bT != 0) { + // non-MP3 has loaded + oSound.loaded = true; + try { + ExternalInterface.call(sMethod, bL, bT, nD, bufferLength); + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", oSound.duration > 0 ? 1 : 0); + } catch(e: Error) { + writeDebug('_whileLoading/_onload error: ' + e.toString(), 2); + } + } else if (oSound.loaded != true && hasNew) { + ExternalInterface.call(sMethod, bL, bT, nD, bufferLength); + } + + } else { + + // MP3 sound + oSoundChannel = oSound.soundChannel; + bL = oSound.bytesLoaded; + bT = oSound.bytesTotal; + nD = int(oSound.length || 0); // can sometimes be null with short MP3s? Wack. + isBuffering = oSound.isBuffering; + + if (oSoundChannel) { + nP = (oSoundChannel.position || 0); + if (oSound.lastValues.loops > 1 && nP > oSound.length) { + // round down to nearest loop + var playedLoops:Number = Math.floor(nP/oSound.length); + nP = nP - (oSound.length*playedLoops); + } + if (oSound.usePeakData) { + lP = int((oSoundChannel.leftPeak) * 1000) / 1000; + rP = int((oSoundChannel.rightPeak) * 1000) / 1000; + } else { + lP = 0; + rP = 0; + } + } else { + // stopped, not loaded or feature not used + nP = 0; + } + + if (forceEndCheck) { + // sound finish case: Ensure position is at end (sound duration), as flash 9 does not always correctly match the two. + if (nP < nD) { + writeDebug('correcting sound ' + oSound.sID + ' end position ('+nP+') to length: '+ nD, 2); + nP = nD; + } + } + + if (nP != oSound.lastValues.position && nP !== 0 && !oSound.didFinish) { // once "completed", sound is locked via didFinish so no more position-type events fire. + oSound.lastValues.position = nP; + hasNew = true; + } + + if (nD > oSound.lastValues.duration) { // original sound duration * number of sound loops + oSound.lastValues.duration = nD; + hasNew = true; + } + + if (bL > oSound.lastValues.bytesLoaded) { + oSound.lastValues.bytesLoaded = bL; + hasNew = true; + } + + if (bT > oSound.lastValues.bytes) { + oSound.lastValues.bytes = bT; + hasNew = true; + hasNewLoaded = true; + } + + // loading progress + if (hasNewLoaded) { + oSound.lastValues.bytes = bL; + ExternalInterface.call(sMethod, bL, bT, nD); + } + + } + + // peak data + if (oSoundChannel && oSound.usePeakData) { + if (lP != oSound.lastValues.leftPeak) { + oSound.lastValues.leftPeak = lP; + newPeakData = true; + } + if (rP != oSound.lastValues.rightPeak) { + oSound.lastValues.rightPeak = rP; + newPeakData = true; + } + } + + var newDataError:Boolean = false; + var dataError:String; + + // special case: Netstream may try to fire whileplaying() after finishing. check that stop hasn't fired. + isPlaying = (oSound.didLoad && !oSound.paused && (!oSound.useNetstream || (oSound.useNetstream && oSound.lastNetStatus != "NetStream.Play.Stop"))); // don't update if stream has ended + + // raw waveform + EQ spectrum data + if (isPlaying && (oSoundChannel || oSound.useNetstream)) { + + if (oSound.useWaveformData) { + if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) { + try { + oSound.getWaveformData(); + } catch(e: Error) { + if (!oSound.handledDataError) { + writeDebug('getWaveformData() (waveform data) '+e.toString()); + } + // oSound.useWaveformData = false; + newDataError = true; + dataError = e.toString(); + } + } + } + + if (oSound.useEQData) { + if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) { + try { + oSound.getEQData(); + } catch(e: Error) { + if (!oSound.handledDataError) { + writeDebug('computeSpectrum() (EQ data) '+e.toString()); + } + // oSound.useEQData = false; + newDataError = true; + dataError = e.toString(); + } + } + } + + if (oSound.waveformDataArray != oSound.lastValues.waveformDataArray) { + oSound.lastValues.waveformDataArray = oSound.waveformDataArray; + newWaveformData = true; + } + + if (oSound.eqDataArray != oSound.lastValues.eqDataArray) { + oSound.lastValues.eqDataArray = oSound.eqDataArray; + newEQData = true; + } + + if (newDataError && !oSound.handledDataError) { + sMethod = baseJSObject + "['" + oSound.sID + "']._ondataerror"; + ExternalInterface.call(sMethod, 'data unavailable: ' + dataError); + oSound.handledDataError = true; + } + + } + + if (typeof nP != 'undefined' && (hasNew && (oSound.soundChannel || oSound.useNetstream || forceCheck || forceEndCheck))) { // && isPlaying - removed to allow updates while paused, eg. from setPosition() calls. Also be more liberal if we're using netStream. + + // oSound.lastValues.position = nP; + sMethod = baseJSObject + "['" + oSound.sID + "']._whileplaying"; + var waveDataLeft:String = (newWaveformData ? oSound.waveformDataArray.slice(0, 256).join(',') : null); + var waveDataRight:String = (newWaveformData ? oSound.waveformDataArray.slice(256).join(',') : null); + var eqDataLeft:String = (newEQData ? oSound.eqDataArray.slice(0, 256).join(',') : null); + var eqDataRight:String = (newEQData ? oSound.eqDataArray.slice(256).join(',') : null); + ExternalInterface.call(sMethod, nP, (newPeakData ? { + leftPeak: lP, + rightPeak: rP + } : null), waveDataLeft, waveDataRight, (newEQData ? { + leftEQ: eqDataLeft, + rightEQ: eqDataRight + } : null)); + } + + // check isBuffering + if (!oSound.useNetstream && oSound.isBuffering != oSound.lastValues.isBuffering) { + // property has changed + oSound.lastValues.isBuffering = oSound.isBuffering; + sMethod = baseJSObject + "['" + oSound.sID + "']._onbufferchange"; + ExternalInterface.call(sMethod, oSound.isBuffering ? 1 : 0); + } + + } + + public function checkProgress() : void { + for (var i: int = 0, j: int = sounds.length; i < j; i++) { + checkSoundProgress(soundObjects[sounds[i]]); + } + } + + public function onLoadError(oSound:Object) : void { + // something went wrong. 404, bad format etc. + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", 0); + } + + public function onLoad(e: Event) : void { + var oSound:Object = e.target; + checkSoundProgress(soundObjects[oSound.sID]); // ensure progress stats are up-to-date + if (!oSound.useNetstream) { // FLV must also have metadata + oSound.loaded = true; + // force duration update (doesn't seem to be always accurate) + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", oSound.bytesLoaded, oSound.bytesTotal, oSound.length || oSound.duration); + // duration > 0 means a valid sound was loaded. + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", (oSound.length || oSound.duration ? 1 : 0)); + } + } + + public function onID3(e: Event) : void { + + // --- NOTE: BUGGY (Flash 8 only? Haven't really checked 9 + 10.) --- + // TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) + // ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) + // iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. + // May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33 + try { + var oSound:Object = e.target; + + var id3Data:Array = []; + var id3Props:Array = []; + for (var prop:String in oSound.id3) { + id3Props.push(prop); + id3Data.push(oSound.id3[prop]); + // writeDebug('id3['+prop+']: '+oSound.id3[prop]); + } + ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onid3", id3Props, id3Data); + // unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) + // Therefore if ID3V2 data is received, ID3V1 is ignored. + // soundObjects[oSound.sID].onID3 = null; + } catch(e: Error) { + writeDebug('onID3(): Unable to get ID3 info for ' + oSound.sID + '.'); + } + oSound.removeEventListener(Event.ID3, onID3); + } + + public function registerOnComplete(sID:String) : void { + var oSound: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (oSound && oSound.soundChannel) { + oSound.didFinish = false; // reset this flag + oSound.soundChannel.addEventListener(Event.SOUND_COMPLETE, function() : void { + if (oSound) { + // force progress check, catching special end-of-sound case where position may not match duration. + checkSoundProgress(oSound, true, true); + try { + oSound.ignoreDataError = true; // workaround: avoid data error handling for this manual step.. + // oSound.soundChannel.stop(); + oSound.didFinish = true; // "lock" sound, prevent extra whileplaying() position-type updates + // call onfinish first (with end position)... + ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); + // then reset sound so it can be played again. + // oSound.start(0, 1); // go back to 0 + } catch(e: Error) { + writeDebug('Could not set position on ' + sID + ': ' + e.toString()); + } + oSound.ignoreDataError = false; // ..and reset + oSound.handledDataError = false; // reset this flag + } else { + // safety net + ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); + } + }); + } + } + + public function doSecurityError(oSound: SoundManager2_SMSound_AS3, e: SecurityErrorEvent) : void { + writeDebug('securityError: ' + e.text); + // when this happens, you don't have security rights on the server containing the FLV file + // a crossdomain.xml file would fix the problem easily + } + + public function _setPosition(sID:String, nSecOffset:Number, isPaused: Boolean, allowMultiShot: Boolean) : void { + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (!s) return void; + // writeDebug('_setPosition()'); + + // stop current channel, start new one. + if (s.lastValues) { + s.lastValues.position = nSecOffset; // s.soundChannel.position; + } + if (s.useNetstream) { + // Minimize the buffer so playback starts ASAP + s.ns.bufferTime = s.bufferTime; + writeDebug('setPosition ('+ sID + '): setting buffer to '+s.ns.bufferTime+' secs'); + + nSecOffset = nSecOffset > 0 ? nSecOffset / 1000 : 0; + s.ns.seek(nSecOffset); + checkSoundProgress(s); // force UI update + } else { + if (s.soundChannel) { + s.soundChannel.stop(); + } + writeDebug('setPosition ('+ sID + '): ' + nSecOffset); // +', '+(s.lastValues.loops?s.lastValues.loops:1)); + if (s.lastValues.loops > 1 && nSecOffset != 0) { + writeDebug('Warning: Looping functionality being disabled due to Flash limitation.'); + s.lastValues.loops = 1; + } + try { + s.start(nSecOffset, s.lastValues.loops || 1, allowMultiShot); // start playing at new position + } catch(e: Error) { + writeDebug('Warning: Could not set position on ' + sID + ': ' + e.toString()); + } + checkSoundProgress(s); // force UI update + try { + registerOnComplete(sID); + } catch(e: Error) { + writeDebug('_setPosition(): Could not register onComplete'); + } + if (isPaused && s.soundChannel) { + // writeDebug('_setPosition: stopping (paused) sound'); + // writeDebug('last position: '+s.lastValues.position+' vs '+s.soundChannel.position); + s.soundChannel.stop(); + } + } + } + + public function _load(sID:String, sURL:String, bStream: Boolean, bAutoPlay: Boolean, nLoops: Number, bAutoLoad: Boolean, bCheckPolicyFile: Boolean) : void { + // writeDebug('_load()'); + if (typeof bAutoPlay == 'undefined') bAutoPlay = false; + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (!s) return void; + var didRecreate: Boolean = false; + if (s.didLoad == true) { + // need to recreate sound + didRecreate = true; + writeDebug('recreating sound ' + sID + ' in order to load ' + sURL); + var ns:Object = new Object(); + ns.sID = s.sID; + ns.loops = nLoops||1; + ns.usePeakData = s.usePeakData; + ns.useWaveformData = s.useWaveformData; + ns.useEQData = s.useEQData; + ns.useNetstream = s.useNetstream; + ns.bufferTime = s.bufferTime; + ns.serverUrl = s.serverUrl; + ns.duration = s.duration; + ns.checkPolicyFile = s.checkPolicyFile; + ns.useEvents = true; + _destroySound(s.sID); + _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, bAutoPlay, ns.useEvents, bAutoLoad, ns.checkPolicyFile); + s = soundObjects[sID]; + // writeDebug('Sound object replaced'); + } + checkSoundProgress(s); + + if (!s.didLoad) { + try { + s.addEventListener(Event.ID3, onID3); + s.addEventListener(Event.COMPLETE, onLoad); + } catch(e: Error) { + writeDebug('_load(): could not assign ID3/complete event handlers'); + } + } + + // don't try to load if same request already made + s.sURL = sURL; + + try { + if (!s.useNetstream) { + s.addEventListener(IOErrorEvent.IO_ERROR, function(e: IOErrorEvent) : void { + s.doIOError(e); + }); + } + s.loadSound(sURL); + } catch(e: Error) { + // oh well + writeDebug('_load: Error loading ' + sURL + '. Flash error detail: ' + e.toString()); + } + + } + + public function _unload(sID:String) : void { + var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null); + if (!s) return void; + var sURL:String = s.sURL; // save existing sound URL for object recreation + try { + removeEventListener(Event.ID3, onID3); + removeEventListener(Event.COMPLETE, onLoad); + } catch(e: Error) { + writeDebug('_unload() warn: Could not remove ID3/complete events'); + } + s.paused = false; + if (s.soundChannel) { + s.soundChannel.stop(); + } + try { + if (s.didLoad && !s.loaded && !s.useNetstream) { + s.close(); // close stream only if still loading? + } + } catch(e: Error) { + // stream may already have closed if sound loaded, etc. + writeDebug(sID + '._unload(): Note: Unable to close stream: ' + e.toString()); + // oh well + } + // destroy and recreate Flash sound object, try to reclaim memory + // writeDebug('sound._unload(): recreating sound '+sID+' to free memory'); + if (s.useNetstream) { + // writeDebug('_unload(): closing netStream stuff'); + try { + s.removeNetstreamEvents(); + s.ns.close(); + s.nc.close(); + // s.nc = null; + // s.ns = null; + } catch(e: Error) { + // oh well + writeDebug('_unload(): caught exception during netConnection/netStream close'); + } + } + var ns:Object = new Object(); + ns.sID = s.sID; + ns.loops = s.loops; + ns.usePeakData = s.usePeakData; + ns.useWaveformData = s.useWaveformData; + ns.useEQData = s.useEQData; + ns.useNetstream = s.useNetstream; + ns.bufferTime = s.bufferTime; + ns.serverUrl = s.serverUrl; + ns.duration = s.duration; + ns.autoPlay = s.autoPlay; + ns.autoLoad = s.autoLoad; + ns.checkPolicyFile = s.checkPolicyFile; + _destroySound(s.sID); + _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, ns.autoPlay, false, ns.autoLoad, ns.checkPolicyFile); // false: don't allow events just yet + soundObjects[sID].connected = true; // fake it? + writeDebug(s.sID + '.unload(): ok'); + } + + public function _createSound(sID:String, sURL:String, usePeakData: Boolean, useWaveformData: Boolean, useEQData: Boolean, useNetstream: Boolean, bufferTime:Number, loops:Number, serverUrl:String, duration:Number, autoPlay:Boolean, useEvents:Boolean, autoLoad:Boolean, checkPolicyFile:Boolean) : void { + var s: SoundManager2_SMSound_AS3 = new SoundManager2_SMSound_AS3(this, sID, sURL, usePeakData, useWaveformData, useEQData, useNetstream, bufferTime, serverUrl, duration, autoPlay, useEvents, autoLoad, checkPolicyFile); + if (!soundObjects[sID]) { + sounds.push(sID); + } + soundObjects[sID] = s; + this.currentObject = s; + s.sID = sID; + s.sURL = sURL; + s.paused = false; + s.loaded = false; + s.checkPolicyFile = checkPolicyFile; + s.lastValues = { + bytes: 0, + duration: 0, + position: 0, + loops: loops||1, + leftPeak: 0, + rightPeak: 0, + bufferLength: 0 + }; + } + + public function _destroySound(sID:String) : void { + // for the power of garbage collection! .. er, Greyskull! + var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null); + if (!s) return void; + // try to unload the sound + for (var i: int = 0, j: int = sounds.length; i < j; i++) { + if (sounds[i] == sID) { + sounds.splice(i, 1); + break; + } + } + if (s.soundChannel) { + s.soundChannel.stop(); + } + // if is a movie, remove that as well. + if (s.useNetstream) { + // s.nc.client = null; + try { + s.removeNetstreamEvents(); + // s.nc.removeEventListener(NetStatusEvent.NET_STATUS, s.doNetStatus); + } catch(e: Error) { + writeDebug('_destroySound(): Events already removed from netStream/netConnection?'); + } + if (s.didLoad) { + // TODO: figure out if stream is still open first, can't close an already-closed stream. + try { + s.ns.close(); + s.nc.close(); + } catch(e: Error) { + // oh well + writeDebug('_destroySound(): caught exception: '+e.toString()); + } + } + } else if (s.didLoad) { + // non-netstream case + try { + s.close(); // close stream only if still loading? + } catch(e: Error) { + // oh well + } + } + s = null; + soundObjects[sID] = null; + delete soundObjects[sID]; + } + + public function _stop(sID:String, bStopAll: Boolean) : void { + // stop this particular instance (or "all", based on parameter) + if (bStopAll) { + SoundMixer.stopAll(); + } else { + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (!s) return void; + if (s.useNetstream && s.ns) { + s.ns.pause(); + } else if (s.soundChannel) { + s.soundChannel.stop(); + } + s.paused = false; + } + } + + public function _start(sID:String, nLoops: int, nMsecOffset: int, allowMultiShot: Boolean) : Boolean { + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + var result: Boolean; + if (!s) return true; + writeDebug('start (' + sID + '): ' + nMsecOffset + (nLoops > 1 ? ', loops: ' + nLoops : '')); + s.lastValues.paused = false; // reset pause if applicable + s.lastValues.loops = (nLoops || 1); + if (!s.useNetstream) { + s.lastValues.position = nMsecOffset; + } + s.handledDataError = false; // reset this flag + try { + result = s.start(nMsecOffset, nLoops, allowMultiShot); + } catch(e: Error) { + writeDebug('Could not start ' + sID + ': ' + e.toString()); + } + try { + registerOnComplete(sID); + } catch(e: Error) { + writeDebug('_start(): registerOnComplete failed'); + } + return result; + } + + public function _pause(sID:String, allowMultiShot: Boolean) : void { + // writeDebug('_pause(): ' + sID); + var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; + if (!s) return void; + // writeDebug('s.paused: '+s.paused); + if (!s.paused) { + // reference current position, stop sound + s.paused = true; + // writeDebug('_pause(): position: '+s.lastValues.position); + if (s.useNetstream) { + if (s.ns) { + s.lastValues.position = s.ns.time*1000; + s.ns.pause(); + } else if (s.autoPlay) { + s.setAutoPlay(false); + } + } else { + if (s.soundChannel) { + s.lastValues.position = s.soundChannel.position; + s.soundChannel.stop(); + } + } + } else { + // resume playing from last position + // writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.loops+' times'); + s.paused = false; + if (s.useNetstream) { + s.ns.resume(); + } else { + s.start(s.lastValues.position, s.lastValues.loops, allowMultiShot); + } + try { + registerOnComplete(sID); + } catch(e: Error) { + writeDebug('_pause(): registerOnComplete() failed'); + } + } + } + + public function _setPan(sID:String, nPan:Number) : void { + if (soundObjects[sID]) { + soundObjects[sID].setPan(nPan); + } + } + + public function _setVolume(sID:String, nVol:Number) : void { + // writeDebug('_setVolume: '+nVol); + if (soundObjects[sID]) { + soundObjects[sID].setVolume(nVol); + } + } + + public function _setPolling(bPolling: Boolean = false, nTimerInterval: uint = 50) : void { + pollingEnabled = bPolling; + if (timer == null && pollingEnabled) { + flashDebug('Enabling polling, ' + nTimerInterval + ' ms interval'); + timer = new Timer(nTimerInterval, 0); + timer.addEventListener(TimerEvent.TIMER, function() : void { + checkProgress(); + }); // direct reference eg. checkProgress doesn't work? .. odd. + timer.start(); + } else if (timer && !pollingEnabled) { + flashDebug('Disabling polling'); + // flash.utils.clearInterval(timer); + timer.reset(); + } + } + + public function _getMemoryUse() : String { + return System.totalMemory.toString(); + } + + // ----------------------------------- + // end methods + + } + + // package + +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as new file mode 100755 index 00000000..d240bc5b --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as @@ -0,0 +1,585 @@ +/** + * SoundManager 2: Javascript Sound for the Web + * ---------------------------------------------- + * http://schillmania.com/projects/soundmanager2/ + * + * Copyright (c) 2007, Scott Schiller. All rights reserved. + * Code licensed under the BSD License: + * http://www.schillmania.com/projects/soundmanager2/license.txt + * + * Flash 9 / ActionScript 3 version + */ + +package { + + import flash.external.*; + import flash.events.*; + import flash.media.Sound; + import flash.media.SoundChannel; + import flash.media.SoundLoaderContext; + import flash.media.SoundTransform; + import flash.media.SoundMixer; + import flash.net.URLRequest; + import flash.utils.ByteArray; + import flash.utils.getTimer; + import flash.net.NetConnection; + import flash.net.NetStream; + import flash.net.Responder; + + public class SoundManager2_SMSound_AS3 extends Sound { + + public var sm: SoundManager2_AS3 = null; + // externalInterface references (for Javascript callbacks) + public var baseJSController: String = "soundManager"; + public var baseJSObject: String = baseJSController + ".sounds"; + public var soundChannel: SoundChannel = new SoundChannel(); + public var urlRequest: URLRequest; + public var soundLoaderContext: SoundLoaderContext; + public var waveformData: ByteArray = new ByteArray(); + public var waveformDataArray: Array = []; + public var eqData: ByteArray = new ByteArray(); + public var eqDataArray: Array = []; + public var usePeakData: Boolean = false; + public var useWaveformData: Boolean = false; + public var useEQData: Boolean = false; + public var sID: String; + public var sURL: String; + public var didFinish: Boolean; + public var loaded: Boolean; + public var connected: Boolean; + public var failed: Boolean; + public var paused: Boolean; + public var finished: Boolean; + public var duration: Number; + public var handledDataError: Boolean = false; + public var ignoreDataError: Boolean = false; + public var autoPlay: Boolean = false; + public var autoLoad: Boolean = false; + public var pauseOnBufferFull: Boolean = false; // only applies to RTMP + public var loops: Number = 1; + public var lastValues: Object = { + bytes: 0, + position: 0, + duration: 0, + volume: 100, + pan: 0, + loops: 1, + leftPeak: 0, + rightPeak: 0, + waveformDataArray: null, + eqDataArray: null, + isBuffering: null, + bufferLength: 0 + }; + public var didLoad: Boolean = false; + public var useEvents: Boolean = false; + public var sound: Sound = new Sound(); + + public var cc: Object; + public var nc: NetConnection; + public var ns: NetStream = null; + public var st: SoundTransform; + public var useNetstream: Boolean; + public var bufferTime: Number = 3; // previously 0.1 + public var lastNetStatus: String = null; + public var serverUrl: String = null; + + public var checkPolicyFile:Boolean = false; + + public function SoundManager2_SMSound_AS3(oSoundManager: SoundManager2_AS3, sIDArg: String = null, sURLArg: String = null, usePeakData: Boolean = false, useWaveformData: Boolean = false, useEQData: Boolean = false, useNetstreamArg: Boolean = false, netStreamBufferTime: Number = 1, serverUrl: String = null, duration: Number = 0, autoPlay: Boolean = false, useEvents: Boolean = false, autoLoad: Boolean = false, checkPolicyFile: Boolean = false) { + this.sm = oSoundManager; + this.sID = sIDArg; + this.sURL = sURLArg; + this.usePeakData = usePeakData; + this.useWaveformData = useWaveformData; + this.useEQData = useEQData; + this.urlRequest = new URLRequest(sURLArg); + this.didFinish = false; + this.loaded = false; + this.connected = false; + this.failed = false; + this.finished = false; + this.soundChannel = null; + this.lastNetStatus = null; + this.useNetstream = useNetstreamArg; + this.serverUrl = serverUrl; + this.duration = duration; + this.useEvents = useEvents; + this.autoLoad = autoLoad; + if (netStreamBufferTime) { + this.bufferTime = netStreamBufferTime; + } + this.checkPolicyFile = checkPolicyFile; + + writeDebug('SoundManager2_SMSound_AS3: Got duration: '+duration+', autoPlay: '+autoPlay); + + if (this.useNetstream) { + // Pause on buffer full if auto-loading an RTMP stream + if (this.serverUrl && this.autoLoad) { + this.pauseOnBufferFull = true; + } + + this.cc = new Object(); + this.nc = new NetConnection(); + + // Handle FMS bandwidth check callback. + // @see onBWDone + // @see http://www.adobe.com/devnet/flashmediaserver/articles/dynamic_stream_switching_04.html + // @see http://www.johncblandii.com/index.php/2007/12/fms-a-quick-fix-for-missing-onbwdone-onfcsubscribe-etc.html + this.nc.client = this; + + // TODO: security/IO error handling + // this.nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doSecurityError); + nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); + + if (this.serverUrl != null) { + writeDebug('SoundManager2_SMSound_AS3: NetConnection: connecting to server ' + this.serverUrl + '...'); + } + this.nc.connect(serverUrl); + } else { + this.connected = true; + } + + } + + public function rtmpResponder(result:Object):void { + // callback from Flash Media Server (RTMP) for 'getStreamLength' server-side method - result should be a floating-point. + // http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html + writeDebug('RTMP server getStreamLength() response: ' + result); + // we now know the duration. type cast to floating-point - this will update JS-land during whileloading() / whileplaying(). + this.duration = Number(result) * 1000; + } + + public function netStatusHandler(event:NetStatusEvent):void { + + if (this.useEvents) { + writeDebug('netStatusHandler: '+event.info.code); + } + + switch (event.info.code) { + + case "NetConnection.Connect.Success": + try { + this.ns = new NetStream(this.nc); + this.ns.checkPolicyFile = this.checkPolicyFile; + // bufferTime reference: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/NetStream.html#bufferTime + this.ns.bufferTime = this.bufferTime; // set to 0.1 or higher. 0 is reported to cause playback issues with static files. + this.st = new SoundTransform(); + this.cc.onMetaData = this.onMetaData; + this.cc.setCaption = this.captionHandler; + this.ns.client = this.cc; + this.ns.receiveAudio(true); + this.addNetstreamEvents(); + this.connected = true; + // RTMP-only + if (this.serverUrl && this.useEvents) { + var responder:Responder = new Responder(rtmpResponder); + // call a method on server to get the length of the stream (like onMetaData, but Flash Media Server-specific) + // Red5 and other RTMP servers appear to provide duration via onMetaData event(s) in the stream. + // http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html + nc.call('getStreamLength', responder, this.sURL); + writeDebug('NetConnection: connected'); + writeDebug('firing _onconnect for '+this.sID); + ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._onconnect", 1); + } + } catch(e: Error) { + this.failed = true; + writeDebug('netStream error: ' + e.toString()); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code); + } + break; + + case "NetStream.Play.StreamNotFound": + this.failed = true; + writeDebug("NetConnection: Stream not found!"); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Stream not found!', event.info.level, event.info.code); + break; + + // This is triggered when the sound loses the connection with the server. + // In some cases one could just try to reconnect to the server and resume playback. + // However for streams protected by expiring tokens, I don't think that will work. + // + // Flash says that this is not an error code, but a status code... + // should this call the onFailure handler? + case "NetConnection.Connect.Closed": + this.failed = true; + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection closed!', event.info.level, event.info.code); + writeDebug("NetConnection: Connection closed!"); + break; + + // Couldn't establish a connection with the server. Attempts to connect to the server + // can also fail if the permissible number of socket connections on either the client + // or the server computer is at its limit. This also happens when the internet + // connection is lost. + case "NetConnection.Connect.Failed": + this.failed = true; + writeDebug("NetConnection: Connection failed! Lost internet connection? Try again... Description: " + event.info.description); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code); + break; + + // A change has occurred to the network status. This could mean that the network + // connection is back, or it could mean that it has been lost...just try to resume + // playback. + + // KJV: Can't use this yet because by the time you get your connection back the + // song has reached it's maximum retries, so it doesn't retry again. We need + // a new _ondisconnect handler. + //case "NetConnection.Connect.NetworkChange": + // this.failed = true; + // writeDebug("NetConnection: Network connection status changed"); + // ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Reconnecting...'); + // break; + + // Consider everything else a failure... + default: + this.failed = true; + writeDebug("NetConnection: got unhandled code '" + event.info.code + "'! Description: " + event.info.description); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', event.info.level, event.info.code); + break; + } + + } + + public function writeDebug (s: String, logLevel: Number = 0) : Boolean { + return this.sm.writeDebug (s,logLevel); // defined in main SM object + } + + public function onMetaData(infoObject: Object) : void { + var prop:String; + if (sm.debugEnabled) { + var data:String = new String(); + for (prop in infoObject) { + data += prop+': '+infoObject[prop]+' \n'; + } + writeDebug('Metadata: '+data); + } + this.duration = infoObject.duration * 1000; + if (!this.loaded) { + // writeDebug('not loaded yet: '+this.ns.bytesLoaded+', '+this.ns.bytesTotal+', '+infoObject.duration*1000); + // TODO: investigate loaded/total values + // ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.ns.bytesLoaded, this.ns.bytesTotal, infoObject.duration*1000); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.bytesLoaded, this.bytesTotal, (this.duration || infoObject.duration)) + } + var metaData:Array = []; + var metaDataProps:Array = []; + for (prop in infoObject) { + metaData.push(prop); + metaDataProps.push(infoObject[prop]); + } + // pass infoObject to _onmetadata, too + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onmetadata", metaData, metaDataProps); + // this handler may fire multiple times, eg., when a song changes while playing an RTMP stream. + if (!this.serverUrl) { + // disconnect for non-RTMP cases, since multiple firings may mess up duration. + this.cc.onMetaData = function(infoObject: Object) : void {} + } + } + + public function captionHandler(infoObject: Object) : void { + + if (sm.debugEnabled) { + var data:String = new String(); + for (var prop:* in infoObject) { + data += prop+': '+infoObject[prop]+' \n'; + } + writeDebug('Caption: '+data); + } + + // null this out for the duration of this object's existence. + // it may be called multiple times. + // this.cc.setCaption = function(infoObject: Object) : void {} + + // writeDebug('Caption\n'+infoObject['dynamicMetadata']); + // writeDebug('firing _oncaptiondata for '+this.sID); + + ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._oncaptiondata", infoObject['dynamicMetadata']); + + } + + public function getWaveformData() : void { + // http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum() + SoundMixer.computeSpectrum(this.waveformData, false, 0); // sample wave data at 44.1 KHz + this.waveformDataArray = []; + for (var i: int = 0, j: int = this.waveformData.length / 4; i < j; i++) { // get all 512 values (256 per channel) + this.waveformDataArray.push(int(this.waveformData.readFloat() * 1000) / 1000); + } + } + + public function getEQData() : void { + // http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum() + SoundMixer.computeSpectrum(this.eqData, true, 0); // sample EQ data at 44.1 KHz + this.eqDataArray = []; + for (var i: int = 0, j: int = this.eqData.length / 4; i < j; i++) { // get all 512 values (256 per channel) + this.eqDataArray.push(int(this.eqData.readFloat() * 1000) / 1000); + } + } + + public function start(nMsecOffset: int, nLoops: int, allowMultiShot:Boolean) : Boolean { + + this.useEvents = true; + + if (this.useNetstream) { + + writeDebug("SMSound::start nMsecOffset "+ nMsecOffset+ ' nLoops '+nLoops + ' current bufferTime '+this.ns.bufferTime+' current bufferLength '+this.ns.bufferLength+ ' this.lastValues.position '+this.lastValues.position); + + // mark for later Netstream.Play.Stop / sound completion + this.finished = false; + + this.cc.onMetaData = this.onMetaData; + + // Don't seek if we don't have to because it destroys the buffer + var set_position:Boolean = this.lastValues.position != null && this.lastValues.position != nMsecOffset; + + if (set_position) { + // Minimize the buffer so playback starts ASAP + this.ns.bufferTime = this.bufferTime; + } + + if (this.paused) { + writeDebug('start: resuming from paused state'); + this.ns.resume(); // get the sound going again + if (!this.didLoad) { + this.didLoad = true; + } + this.paused = false; + } else if (!this.didLoad) { + writeDebug('start: !didLoad - playing '+this.sURL); + this.ns.play(this.sURL); + this.pauseOnBufferFull = false; // SAS: playing behaviour overrides buffering behaviour + this.didLoad = true; + this.paused = false; + } else { + // previously loaded, perhaps stopped/finished. play again? + writeDebug('playing again (not paused, didLoad = true)'); + this.pauseOnBufferFull = false; + this.ns.play(this.sURL); + } + + // KJV seek after calling play otherwise some streams get a NetStream.Seek.Failed + // Should only apply to the !didLoad case, but do it for all for simplicity. + // nMsecOffset is in milliseconds for streams but in seconds for progressive + // download. + if (set_position) { + this.ns.seek(this.serverUrl ? nMsecOffset / 1000 : nMsecOffset); + this.lastValues.position = nMsecOffset; // https://gist.github.com/1de8a3113cf33d0cff67 + } + + // this.ns.addEventListener(Event.SOUND_COMPLETE, _onfinish); + this.applyTransform(); + + } else { + // writeDebug('start: seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); + if (!this.soundChannel || allowMultiShot) { + this.soundChannel = this.play(nMsecOffset, nLoops); + this.addEventListener(Event.SOUND_COMPLETE, _onfinish); + this.applyTransform(); + } else { + // writeDebug('start: was already playing, no-multishot case. Seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); + // already playing and no multi-shot allowed, so re-start and set position + if (this.soundChannel) { + this.soundChannel.stop(); + } + this.soundChannel = this.play(nMsecOffset, nLoops); // start playing at new position + this.addEventListener(Event.SOUND_COMPLETE, _onfinish); + this.applyTransform(); + } + } + + // if soundChannel is null (and not a netStream), there is no sound card (or 32-channel ceiling has been hit.) + // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29 + return (!this.useNetstream && this.soundChannel === null ? false : true); + + } + + private function _onfinish() : void { + this.removeEventListener(Event.SOUND_COMPLETE, _onfinish); + } + + public function loadSound(sURL: String) : void { + if (this.useNetstream) { + this.useEvents = true; + if (this.didLoad != true) { + this.ns.play(this.sURL); // load streams by playing them + if (!this.autoPlay) { + this.pauseOnBufferFull = true; + } + this.paused = false; + } + // this.addEventListener(Event.SOUND_COMPLETE, _onfinish); + this.applyTransform(); + } else { + try { + this.didLoad = true; + this.urlRequest = new URLRequest(sURL); + this.soundLoaderContext = new SoundLoaderContext(1000, this.checkPolicyFile); // check for policy (crossdomain.xml) file on remote domains - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundLoaderContext.html + this.load(this.urlRequest, this.soundLoaderContext); + } catch(e: Error) { + writeDebug('error during loadSound(): ' + e.toString()); + } + } + } + + // Set the value of autoPlay + public function setAutoPlay(autoPlay: Boolean) : void { + if (!this.serverUrl) { + this.autoPlay = autoPlay; + } else { + this.autoPlay = autoPlay; + if (this.autoPlay) { + this.pauseOnBufferFull = false; + } else if (!this.autoPlay) { + this.pauseOnBufferFull = true; + } + } + } + + public function setVolume(nVolume: Number) : void { + this.lastValues.volume = nVolume / 100; + this.applyTransform(); + } + + public function setPan(nPan: Number) : void { + this.lastValues.pan = nPan / 100; + this.applyTransform(); + } + + public function applyTransform() : void { + var st: SoundTransform = new SoundTransform(this.lastValues.volume, this.lastValues.pan); + if (this.useNetstream) { + if (this.ns) { + this.ns.soundTransform = st; + } else { + // writeDebug('applyTransform(): Note: No active netStream'); + } + } else if (this.soundChannel) { + this.soundChannel.soundTransform = st; // new SoundTransform(this.lastValues.volume, this.lastValues.pan); + } + } + + // Handle FMS bandwidth check callback. + // @see http://www.adobe.com/devnet/flashmediaserver/articles/dynamic_stream_switching_04.html + // @see http://www.johncblandii.com/index.php/2007/12/fms-a-quick-fix-for-missing-onbwdone-onfcsubscribe-etc.html + public function onBWDone() : void { + // writeDebug('onBWDone: called and ignored'); + } + + // NetStream client callback. Invoked when the song is complete. + public function onPlayStatus(info:Object):void { + writeDebug('onPlayStatus called with '+info); + switch(info.code) { + case "NetStream.Play.Complete": + writeDebug('Song has finished!'); + break; + } + } + + public function doIOError(e: IOErrorEvent) : void { + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", 0); // call onload, assume it failed. + // there was a connection drop, a loss of internet connection, or something else wrong. 404 error too. + } + + public function doAsyncError(e: AsyncErrorEvent) : void { + writeDebug('asyncError: ' + e.text); + } + + public function doNetStatus(e: NetStatusEvent) : void { + + // Handle failures + if (e.info.code == "NetStream.Failed" + || e.info.code == "NetStream.Play.FileStructureInvalid" + || e.info.code == "NetStream.Play.StreamNotFound") { + + this.lastNetStatus = e.info.code; + writeDebug('netStatusEvent: ' + e.info.code); + this.failed = true; + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', e.info.level, e.info.code); + return; + } + + writeDebug('netStatusEvent: ' + e.info.code); // KJV we like to see all events + + // When streaming, Stop is called when buffering stops, not when the stream is actually finished. + // @see http://www.actionscript.org/forums/archive/index.php3/t-159194.html + if (e.info.code == "NetStream.Play.Stop") { + + if (!this.finished && (!this.useNetstream || !this.serverUrl)) { + + // finished playing, and not RTMP + writeDebug('calling onfinish for a sound'); + // reset the sound? Move back to position 0? + this.sm.checkProgress(); + this.finished = true; // will be reset via JS callback + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish"); + + } + + } else if (e.info.code == "NetStream.Play.Start" || e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Buffer.Full") { + + // RTMP case.. + // We wait for the buffer to fill up before pausing the just-loaded song because only if the + // buffer is full will the song continue to buffer until the user hits play. + if (this.serverUrl && e.info.code == "NetStream.Buffer.Full" && this.pauseOnBufferFull) { + this.ns.pause(); + this.paused = true; + this.pauseOnBufferFull = false; + // Call pause in JS. This will call back to us to pause again, but + // that should be harmless. + writeDebug('Pausing on buffer full'); + ExternalInterface.call(baseJSObject + "['" + this.sID + "'].pause", false); + } + + var isNetstreamBuffering: Boolean = (e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Play.Start"); + // assume buffering when we start playing, eg. initial load. + if (isNetstreamBuffering != this.lastValues.isBuffering) { + this.lastValues.isBuffering = isNetstreamBuffering; + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onbufferchange", this.lastValues.isBuffering ? 1 : 0); + } + + // We can detect the end of the stream when Play.Stop is called followed by Buffer.Empty. + // However, if you pause and let the whole song buffer, Buffer.Flush is called followed by + // Buffer.Empty, so handle that case too. + // + // Ignore this event if we are more than 3 seconds from the end of the song. + if (e.info.code == "NetStream.Buffer.Empty" && (this.lastNetStatus == 'NetStream.Play.Stop' || this.lastNetStatus == 'NetStream.Buffer.Flush')) { + if (this.duration && (this.ns.time * 1000) < (this.duration - 3000)) { + writeDebug('Ignoring Buffer.Empty because this is too early to be the end of the stream! (sID: '+this.sID+', time: '+(this.ns.time*1000)+', duration: '+this.duration+')'); + } else if (!this.finished) { + this.finished = true; + writeDebug('calling onfinish for sound '+this.sID); + this.sm.checkProgress(); + ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish"); + } + + } else if (e.info.code == "NetStream.Buffer.Empty") { + // The buffer is empty. Start from the smallest buffer again. + this.ns.bufferTime = this.bufferTime; + } + } + + // Remember the last NetStatus event + this.lastNetStatus = e.info.code; + } + + // KJV The sound adds some of its own netstatus handlers so we don't need to do it here. + public function addNetstreamEvents() : void { + ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError); + ns.addEventListener(NetStatusEvent.NET_STATUS, doNetStatus); + ns.addEventListener(IOErrorEvent.IO_ERROR, doIOError); + } + + public function removeNetstreamEvents() : void { + ns.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError); + ns.removeEventListener(NetStatusEvent.NET_STATUS, doNetStatus); + ns.addEventListener(NetStatusEvent.NET_STATUS, dummyNetStatusHandler); + ns.removeEventListener(IOErrorEvent.IO_ERROR, doIOError); + // KJV Stop listening for NetConnection events on the sound + nc.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); + } + + // Prevents possible 'Unhandled NetStatusEvent' condition if a sound is being + // destroyed and interacted with at the same time. + public function dummyNetStatusHandler(e: NetStatusEvent) : void { + // Don't do anything + } + } +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat new file mode 100755 index 00000000..fcab4234 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat @@ -0,0 +1,5 @@ +@REM this builds the soundmanager 2 SWF from source + +mtasc -swf ../swf/soundmanager2_debug.swf -main -header 16:16:30 SoundManager2.as -version 8 +@pause + diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh new file mode 100755 index 00000000..8857d152 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh @@ -0,0 +1,2 @@ +#!/bin/bash +/Applications/mtasc/mtasc -swf ../swf/soundmanager2_debug.swf -main -header 16:16:30 SoundManager2.as -version 8 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat new file mode 100755 index 00000000..ed63934a --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat @@ -0,0 +1,4 @@ +@REM this builds the soundmanager 2 SWF from source +@REM using mxmlc from the Adobe open-source Flex SDK + +c:\progra~1\flexsdk\bin\mxmlc -debug=true -use-network=false -static-link-runtime-shared-libraries=true -optimize=true -o ../swf/soundmanager2_flash9_debug.swf -file-specs SoundManager2_AS3.as diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh new file mode 100755 index 00000000..ec6041c1 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh @@ -0,0 +1,2 @@ +#!/bin/bash +/Applications/flexsdk/bin/mxmlc -debug=true -static-link-runtime-shared-libraries=true -optimize=true -o ../swf/soundmanager2_flash9_debug.swf -file-specs SoundManager2_AS3.as diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf new file mode 100755 index 0000000000000000000000000000000000000000..e900766a8250814f69718b07c18fa252ffd71bb2 GIT binary patch literal 2908 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 Gjdg9jBfGT# literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf new file mode 100755 index 0000000000000000000000000000000000000000..a6809121ff0b315591d2f031302b9749497c5b2d GIT binary patch literal 3282 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf new file mode 100755 index 0000000000000000000000000000000000000000..3d4222a345f039a12aad81b24c2b74017bc21074 GIT binary patch literal 8758 zcmV-6BFWuDS5poZKL7xD+PynzcwEJiT|IAJ&zl)(Mq^vHC5*=)B-@N7+2*nX#g-?x8OpQ~RV)zwwi)m7C!aD*v8W~}}(#ufqVZdlA1d+)qA zfw3!d33L7K?%wc`bSjfykFBfPl7+(9`i_pnhYzDO=$mZI0NkTGbA{jZgb^;L?E5=fz z`J|C6FF24j3y1X_uAD7q64f=Uh%_ypGiZqo#mu2h_OOjn?xXRPo*60XBgTfF9dfMF zmQ3pfV?(zQ53i1d*L1F4YcocjS9Z)%zSD#Ixq)>Df9AT9b@7>*nd`hR+;9~^(H?wd z0i(Z_Ex&$dGa5k2J3yRo*E6_YZq3l9fwk=A`Cq=0F&t!OPEQ-FS&+3eH(LWp<`vGA z@$6_q9Vp~RGb3ViHk&f^jJl(kju|<>+@f}4oc7h-L!ZU7=?`p|ZCXc-#ts_sLTJE< z7jvV9iJn|8o0D_=Tcg#6Ycx|(idZz9#cBNxqcBj=3&p&|3~WNnj8|vY+1w;X^J6J} zLLC^xRSYq1n_*ZNu{f?@H+iNdcJNs((dS`$>DV?7V4=~_VCb=L^iFD zW`-PPqv%c#tPIBVywN|PXkoVcl77L@P zytjKaPW!3nCftS5w2^b~p|XAqspHB$89kOV68?k{E0!A#a(Z`7kDAKr2_sR5%FUrN z>}9ku9k+DbXujY{8~Hr)m)8o$kwWjNkxF=N7O1W5DR;`@fx<+}@X9`U@){DOi2*&6 zh-Hs#x5@b8dT}IK=+z5)%3I~dKa@8Ln~H_(PTT?SVcG!M-#CP{j9f-fZO!1<)Z@k; zBVVW+!p$P?B~k;Pu=t^ED8|lQb|i-jg=CMkgK}4$>?*f>*$m-J8&K`KJDb_sy*89H zMo?-a7tM5K(_<;4U<4A`S*9m>-I>jglIq<?mrWJZhR-H0_pfef#3*bx(%Ia^-n`*#eA-Bi>TXGr z=hL=nbS3pn#z^@GY8qbjpu3HC7Lf(bo|!QU-o3lGIh`RnlLR+%WRa-n(7;(;esZYf zMZ0msw9OL*Lt11*ZMW=EjdxPrXMbdu4<+1b=!d8yfc5>gq_Ewyi)ya?)@~(_d}(Ma zy`vfQhFUy}62uE=o2EWWCMva+@R)KKD~V!G`p_WCnm`01B=;sTI+Drej7r<1J2oXN zBwB-{70qlenx>KKEv8cLR5m-7_o9vp`}7p*Mj$7IDw(uhlvEav$9X1Rht8zSW)L~x znY<>w3+{WG=L_{xhkJ5*CQq{ZkpvFs<*+v<*Q7IAN2^u5l9o4e=vMaTQUTjavly5r zdQtScTp>NS+sKb)Gq@?iOnJr@DR<7B&1^RcI*D5!*QIZFMgnL$vlNbPTj6eLf!a_u zW2;jm!Fm6$BUT(uVQ^5!iut53UL{@c1V+c{ zHT2B&ewsdxM}n5}p(49b(wH7Udn1p>-L`AK^&A#a^Xe>^(Hq043ST-p@n?T zml&NtEB>vw<6q0{&Tji_M+edc>e9$9osA^9)bU)58#ZF|pCEExZ4R(rGE3un0gph= zm$#$Fo{2HTpUTGd)SetF7F_|^O2Jsres*ApUZWshD%eggbf7xlH=6Gq&E*TEEER1Z zPl7Loo-8jtUBWBtd$Jgi)Rd7KDJ1#zZNav|_MyW`Jb`2)=!@MF%SnPpj~KZHn9a#n zerraL$1$di;->iRBfd@2Q79&R#+*puC6ZYgCXgfB{UBjwyIx4TP4q!IPs%V0%(eB=35%_Y2a};5>>%y zCrGe7`Wgcw%E9btMkNkP|#B{*PxmaoFL?W?rW{7#!qHL2%!7>E7# z$KE+V;#EAomMGVJB$*5q&U-!OLC@CcP|xn&(cL0u z@2eIoyIeIRS++Y!!eFdxb~Nx|VA^fiDTX_q%I48I(;Ws+HLkV^LzxV2ct-N*xIHl^ zkEqW`_aG0-I9mCDbeFyYnY^7|1m+ySx>+Z+;jDAr`1bBV9hVWqHHL|PJT;0Wy*qmL z3=Qnrv}f;taH6_a31TLDGvWp=xT%;J%~CY8)n%WoI$Qk?MW;o% zLNRBAs=+yIrw_}NQS|Wc6uO#}63-@#2AftmlP!czT6bCPB&pcMvL&15_!lE>D)GL}P+ zkam)Qx^e~c+_AhuxDAe~Y^_pHATg2A)1&e24z&PArm-R>tz$?pS4`vLdZHKo6cR_# z6!KX0`B`br!a35HQ{`Z_-xlY>If!J%*e=EkxKmp*XpN(Z`DdvT^OMGEr|l}+d(vZt zi3MkMQwHZj8Kvc)J*ziG5q8tSfgN4;xod8OMzyhFQGH{$G17R=B2VKkH(LmeABM(z z!E*u{Pl6jSu}$?&&p^|&(DWQMJr7Nv#?B^B({Zl&gFdKlP(t(OFKAo{;PV1sXEz&rs91S}M=NI;W-^8_pr zaK3=0!o5tu1;TxyfEEE431}72CSbXM6#`ZYxLByG1hfmaLqMm1)dJQCSS#QX0hbE6 zOu*#=t`M+Jz%1Z)?u zLx`w=okH6!U_gjH0`>~`J^}j$Tr1#!fa?TYFW?3Ng92_8FeG4DfG!{=ATA&wFxLQ6 zz=(jPfKdSl1soEP5|9><5s(!yCbV}7$O$bkpddt1z_@_J0*(ln5b!PmeL0@I!yp2W;P+94$3XDM@%seAlL((eIE5siLUuXzaac8!oMN> zJ80vewSo34V);Kn`wgv*mhcufe~0jUZ2l)`*MW9DXg7d%7_c0(IJs13TE?jpYdBh4wM7y~m~9!|}L&oNKyE8^qct zx%L2eX%Awr?=htLIB#}o32dCg2A*%<(+JNXJd0F5jqn1;ox_PQV*N8*y9+1ZO(Z|d zaYOL?GS@tOy?jaoS#khQC3j)z;tKNsxWMINoDcy040C~sZ7=uYpWP{(5n0$>oN*4S zhcN}Xg6P<#F@_F^yIj<^*Qu9n>`@5GMyo8ZxNr$qg&Cw%E@=r4E}vwA6K|EjdggaX zIut#1e*E(~e=e8b53X{{;k*uct%z!O31UzKq=qKcFd$uL@#yJ~Uw22q9d<>z#-7#V{YsW>|nFYh-L8Tg2F6*2Gw|-+!J&TO!Nz zWw}(AVa8Oye;I1n@4tZNT*z39-+vKft*lLAESKd9V6K(Gl#7A6Bf!*Ez(hMRPX{oq z6PR~3Fy9(r{@tEWmk7GhKjF|rJJ!H*2`EQ+rrpZ*3Z~AY#Z^qooYL%7L`oyl;tj2 z?xvXoRP4bvBWc-QD)v#apNea#IDq!Tu9H))m*owz9F*mavK%6lat))7m@YeFvWzpf znI)*#V9aDAj3xd4QN|9kLqs@*vlLgFcFmuWWmZlb19rhXfnA82Y{>y@%>!#I09#%J zwqhLE%EQ1eJ_0N<0c_Q~fVKY_u#R^F>wFKe)qf6b&3l2ZJqo}sxe1F)C$YHfW-Km$ z9~M_I7G``Y_|df1fvPZAkLKgiTvlfv8WIPuw|@8-L~j8$7-@}00DIBgy@96?WBUPZBDx^%bXv%8%`t_So>JA(HdObznCQ#QR4z@u(iLHB`>nJGRq8&uMFYQU16E? z#zVMe!|w;IMn3?6BpMU3 za02I?=)VKt=pB&e2BdhK{vkw4fq5r=c=RrS8}F7q$-80r!(e^{Lf^n;KMawLmU(&f zqrj=Y$uh4f*SjtA9p!qDWnNjX_gdyv<@(i@d0DyMXPFzy^(~fpb-BLPGB=j%ms)0| zT))gRSC#Aimbs~1-)x!d%JnYGTwkuQwak@N58^4dI;T3XV=GUu?7TP)OFSs@U~|j- z7S`X)X&X>Z*YL-{JPsQndJm9BT+wmXhq3fm{I~q$a4)z%0SprYb{{Z)2e4y!OqbCsF!PrStP}Lhdc~E+L(iNGE5cPKK8^Ah$OzZ%r<5+p@&tYTW`|`NJeQe*gt{ zu?JCZ&IAX|D^QHKuPL#|?;Y8$RI1yKo>zFznQ(|u9SeeEH zfWoebDOmAgWx8ZO2Ik|W1oXkwnARVM*^`0+5)*}t3uos=A1t^RJ_#fl)4ZxT@PQEN zKd#V`JeF=WV0n6>tS*w}Vp%rHvf0_A5}lc8GMg5bR%Gdxr7BAyOAnQJ8L~fKI`AUx zqfbxTFUi#z(3Y;JB0xnDH~$IfeG=Gsy1{_fbclNAQ8AzP_xQ>NkG=O`#%de;#%mgT zkB2an^%>wORCex`Dy0RnaVWHuGg%vHuu<)X`6%|eZg7-9B^fU2ro^*ii{UMC8&e*W|4A}jmg*~@26tp=Ol|kId5VIK@rUCsK zAT6K*QmTXW2-Mf2sQM!n6vaV#Xf}$XKU6_+J1CFOMscIrlud$w{Yi3#_ql_AY(wlKnUT5f8EQa0IEeJPqM*6PaB95Fp;w{Cf0XKmlt zo$3KxE`%ve3rq&_?BE8J54qJDQ>3Z89aDD)*E%BD468O97(be&OE}l!K@TtQS+{Mg zvR-Qsv#sGdIEOhr54Opt{Grb|cHlQZU32Wy<=uY)S^(8pS8Ef`!Ly-unl}6*)O4Qg z{R}{n&S*_1eilCbP?=sdbQ#T)?D@^lN|Qv!@N-fgNN3=4vj@CEX{@z}HmKS?lCCSX zKJ&o5$ z5FHQo%9)z8(&uL%6ixrUTnW8e%IlzfVK$0a|3Vq1Exo|86uowl{iw6na^nzsy2X_S zqWQ~>bmUv8>~V6FDN2tP*aQAabcb4H#^iWt80^(|hHj92G}P|Nb+wJ_kB8RTtVRng z*j_$VP(D=l47?98l7N`!Dd_zorUU6lJaBS&*Z*aeV$CZ2|FX(9N4Z~udGl+Oiv#+X zqzoAd#3GzI)FS{;cL1apr z{yQ8mgS!ywC=>0Ttcg&ECMWF_fRd4#x@!{mDgbA%U9v+LHUs3kY%yEdMMrt>mw`vV z1HE4XI2OdTDtt_aZHc+KjA`S+T)f2+FIb_t+_($ z3}ZsQI3MPUo`wL72@pknp z$Se0(@v7=&e~Fh>FZ&u^SH0}(cwzOj*YL{fW#7OYOJRS7*H(pn6ECiUy^dGc9`-G~ zymIz!VD&Ec*LaC_vA@AZ*ILd_~}B%h})J^_H_Y@q){7AvLfif1cG@jk;4Z3&oh*!lY*KqO2m_TQSph(psWNxvEX9WPT4C@J3o{ z)xQr_GL>YOl3+@KDgT|U=D(zNWiI;Hsd5s=t7zkIvsaAODVTfT>*U_yqYKX<#1+iE z-42WU7>$^AS_#$#~V9root-gu&Jtp*FlZGvg5+buM$i zh7&Pm8aZ%PQ)|`9H`LOw+x!9IuZ{i?IfQvf-Yv82dWCy^$>CQZbPZ#J9aw2?jdr-` zt6wk6J-E!UTxIx2xX5pTTnhxz(YP2P4;t27CYKGMdHQ#i z?^fZXDkbeQeaEenhk$Nr_U*Uo0J+&c9$F-i6yAyV*gYuM-^0dwx*7H{{v$jFoZ(^M zDhtxJ&b|OPC_=0I4bp-W_Y1R2_#!NB;pN&2si6?L{V;n!Q*H=r7=EB?qaTcR@^vj=$Xo z+RIo|(M!M?g_=>ifzcAQ^mr`~ef(~C5}uZKs#oDPc-_8Tg*f+mJ;OhNspxy@3Oq01 z^#(qn$lI33*%FU^E%Kgqv5F~_Y{uM_X2w*?C}ScmBL78UX1<&Dr;QM1Z6zh|9_LEa zMmb!{W9qH*7lVwWl=q2#!R+N^cH%L2>yLudaF>%^Y^na>0 z4(Z>kHd6Y}s*Q~P&(+2Ona??mtp0P^Xw`oKmd#Fdy{vgn$rhJYdwtVh*|gU*?bS?s z9n+0ufOfHLiZtJQ+rp+l&jSnn8UhX_&HNYG7%CHz&kskSN&{+W^zjE>FT1|#BIEg?>t^Ns3e~*! zar;;K{P1rSblAUR%yF?_Va!q3uQBGh*neQmaj~CZ%u(5IFy^?}Z!zWwHb05{aSk~whf%-~y45&A9QcGH#_o7JOIxm%Um^!+6~ih`aVs?9DC}g)W{0`9p$1hna zeaS%SOSVa0GE4fBMbejyk-lVy^u0mFBHi@7~)Xd*Q8=pmRpSANBIS}4%qdt=S1h34kNgJoa4ayT?~VmZ z`ampzJ4D6OSRhufXJdiLD|nNOBoMwvm4h))^~7VEhFz~y@l`DL3Vj$oR-;SR>V5!! z(tKLj87I+*EA*p7CZ}5<`rl|m=#pP`p==AjKQlAea1MpK9V2)&hY;&u%AmsZri4rDt;rHPEu%gdp9?H@-9D|R*J#s^yhtI+n?X6iz zubTTP$579d=-F-f35fm=62F>+tGskdO-#${8JYdGIWkVj_>KMnk?W}{MV_`rp2odF z{Vu{3rtT=}w=J&Dikg`Gwr-)Q)u#UuWZ0bLoGE}dI01E922@N5V(#fuOz9nWjmOou zdH0(W)hhilbqnv^y-(Wa!Hg7ovEtVJFT$+1Tt~wF4cDU(t@?fxHnc`cNEe7{Isw5ZTM_e|8QtcmL1Ig#kWNW4MA}i_4EEwZaC%z4EKJKNUc%U2 zD+~&$IKn7>a33D5N9?_8;+UH>RivPcvr{cak8+C0&3^*pCW&z#fY+-Ic1AlHww5T0 z*MEot_?gaX#J1$G1m{_1Q}|T*M~d^tLv2WGu$er*d}dEJA%gS9ejddGY(~dfa51gf zRQYw|yyIjhG0{HJ*wnY9V{U}8kz^&Rj+p@(0ReXV?2CBcq4EFT*uw=J2cuoH` zEZI*##cXpL+o`d`vK`6S%HHHI-jayi&B>*-K#e2WAC4RdM_z-l?Na>7VQX-6|7Mnq z(=R$x$u6su+-*%K2hh_dqnLXocUmzuxyu^to9^#}WUtkh+=H+bVK2fyglnxZvKCIJ zt(Zt2vSL~?W5vA516ItRj9Ia|(=O6zrlRA)apz})8!Z`A zk_l_j>^E7`uuQ|!Z^x}MhU?5b@cT}Cr!rwQS)^gawCIO81nud2QG*w_xGI9Ez(HlI zSF!E?0QO(#R)qgGrJ8=<$({V$GGiG2SrBiInl+e2qWwwGM=TTnW%aE5VoGcc9_&BJ z^ij)9SY}SYi_1!0zne>pgk*E1HTq!=R&)}OAAN7Fkg@U5mGTkrPQ)AQzmtPx0hf#1 zD|3F!9H4uQyy0}&cN~lE%AepT&}Gx3>gGAWk>C;^;gws5Wqy>Oh}?&8zkCHTKgP}D zmD)Y@GmEms;|gvhIa~F8)vJ_Th9;gk=ft4*+_N4!_pI-*bIv+9lfehhJqyk`32(bW z!+Cm;y=Nj1^XVp)t}a2$BO@oB76g}L>k+5L$p=Orby_a+ko3sfqR@j!i{f!LkI&2~ zzx>0@cm6ozotfDb zYzi%~RdoyPMP9MMV`P6=x*aR*GM9v+(n5GYXV{OCoTQn=I37Wb&>dv@d^yW`5#^C5 zxO`HPw?ed&$dmlU37ok`aW#A!FU-ikbcW`A+&&1FxwN6v`Teb`*q7;h3cH>{pr2AI zua)=lN&D56uI+RUl3%5UvlX*BOS#Iw)|MZL9p2IxxkHlNK8NHEBDwuflU%8|Rq2!4+sqGJTFxl1Q;15I}K{wc@-&jGYm&@K* z9gQiJMap)DR-Uq-8t~Lj73C9yIXtDGH2@W#x{o6@M) z5?9T&ucMapgJk7#^b+9ZB`k23P|&!UykftAagtvrm-$eW0CZ=b4Zup8x3G( zYG0ho;+N)jyo5YoLI*QLzjV~k9+|A9AvccG1>dso1Gx5nGL|{(f0>_XBTb%jE#zkW zbcxL2Nj`5iksB`QPx3irzDr+1Is3V|ma_bv%(8zyvwxML##d0BC{aEzZvWC?Rqiv` zchTn;KJ+vtjlnjl&;K0(H{jn z=^Sx#(3>i4dQ7s+_uB8U>~fm9YtGEK=FFVce&1P? gcZ<#V?^>YCgi22Y^XNYwJo|rbMq6b63p682+o5zV$^ZZW literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf new file mode 100755 index 0000000000000000000000000000000000000000..c1a129d8871b60f8cc09f42c5c6ac7534f6d28e5 GIT binary patch literal 17258 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 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css new file mode 100755 index 00000000..5bccf9a9 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css @@ -0,0 +1,119 @@ +/* SM2 troubleshooting CSS */ + +#sm2-test { + position:relative; + background:#f6f6f6; + border:1px solid #eee; + padding:3px; +} + +#sm2-test, +#sm2-test ul.items { + border-radius:3px; +} + +#sm2-test ul.items { + position:relative; + background:#fff; + list-style-type:none; + margin:0px; + padding:0px; + border:1px solid #ccc; +} + +#sm2-test ul.items li { + position:relative; + margin-left:0.5em; + padding-left:0.5em; + margin-right:0.5em; + padding-right:0.5em; +} + +#sm2-test ul.items li h3 { + padding-top:0.3em; + margin-top:0px; + border-bottom:1px solid #ccc; + border-top: none; +} + +#sm2-test ul.items li:last-child h3 { + border-bottom:none; +} + +#sm2-test ul.items li div.details { + border-bottom:1px solid #ccc; +} + +#sm2-test ul.items li:hover div.details { + border-bottom:1px solid #ccc; +} + +#sm2-test ul.items li.open:last-child h3, +#sm2-test ul.items li.fail:last-child h3, +#sm2-test ul.items li:last-child div.details:last-child { + border-bottom:1px solid #fff; +} + +#sm2-test ul.items li div.details { + display:none; +} + +#sm2-test ul.items li.open div.details, +#sm2-test ul.items li.unknown div.details, +#sm2-test ul.items li.fail div.details { + display:block; +} + +#sm2-test ul.items li span.yay, +#sm2-test ul.items li span.boo, +#sm2-test ul.items li span.default, +#sm2-test ul.items li span.unknown { + display:none; +} + +#sm2-test ul.items li span.yay, +#sm2-test ul.items li.pass span.msg { + color:green; +} + +#sm2-test ul.items li span.boo, +#sm2-test ul.items li.fail span.msg { + color:red; +} + +#sm2-test ul.items li span.default, +#sm2-test ul.items li.default span.msg { + color:#ccc; +} + +#sm2-test ul.items li span.unknown, +#sm2-test ul.items li.unknown span.msg { + color:#666; +} + +#sm2-test ul.items li.default span.msg { + display:none; /* hide messages in the event a reset occurs */ +} + +#sm2-test ul.items li.pass span.yay, +#sm2-test ul.items li.fail span.boo, +#sm2-test ul.items li.default span.default, +#sm2-test ul.items li.unknown span.unknown { + float:right; + display:inline; +} + +#sm2-container.flash_debug { + /* flash movie, when soundManager.debugFlash = true */ + position:relative; + width:auto; + height:300px; + width:100%; + background:#f6f6f6; + border:1px solid #ccc; +} + +#sm2-container.flash_debug object, +#sm2-container.flash_debug embed { + border:1px solid #fff; +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js new file mode 100755 index 00000000..8b0f851a --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js @@ -0,0 +1,187 @@ +// SoundManager 2 start-up troubleshooting tool + +// FlashDetect, by Carl Yestrau +// http://www.featureblend.com/license.txt +var FlashDetect=new function(){var self=this;self.installed=false;self.raw="";self.major=-1;self.minor=-1;self.revision=-1;self.revisionStr="";var activeXDetectRules=[{"name":"ShockwaveFlash.ShockwaveFlash.7","version":function(obj){return getActiveXVersion(obj);}},{"name":"ShockwaveFlash.ShockwaveFlash.6","version":function(obj){var version="6,0,21";try{obj.AllowScriptAccess="always";version=getActiveXVersion(obj);}catch(err){} +return version;}},{"name":"ShockwaveFlash.ShockwaveFlash","version":function(obj){return getActiveXVersion(obj);}}];var getActiveXVersion=function(activeXObj){var version=-1;try{version=activeXObj.GetVariable("$version");}catch(err){} +return version;};var getActiveXObject=function(name){var obj=-1;try{obj=new ActiveXObject(name);}catch(err){} +return obj;};var parseActiveXVersion=function(str){var versionArray=str.split(",");return{"raw":str,"major":parseInt(versionArray[0].split(" ")[1],10),"minor":parseInt(versionArray[1],10),"revision":parseInt(versionArray[2],10),"revisionStr":versionArray[2]};};var parseStandardVersion=function(str){var descParts=str.split(/ +/);var majorMinor=descParts[2].split(/\./);var revisionStr=descParts[3];return{"raw":str,"major":parseInt(majorMinor[0],10),"minor":parseInt(majorMinor[1],10),"revisionStr":revisionStr,"revision":parseRevisionStrToInt(revisionStr)};};var parseRevisionStrToInt=function(str){return parseInt(str.replace(/[a-zA-Z]/g,""),10)||self.revision;};self.majorAtLeast=function(version){return self.major>=version;};self.FlashDetect=function(){if(navigator.plugins&&navigator.plugins.length>0){var type='application/x-shockwave-flash';var mimeTypes=navigator.mimeTypes;if(mimeTypes&&mimeTypes[type]&&mimeTypes[type].enabledPlugin&&mimeTypes[type].enabledPlugin.description){var version=mimeTypes[type].enabledPlugin.description;var versionObj=parseStandardVersion(version);self.raw=versionObj.raw;self.major=versionObj.major;self.minor=versionObj.minor;self.revisionStr=versionObj.revisionStr;self.revision=versionObj.revision;self.installed=true;}}else if(navigator.appVersion.indexOf("Mac")==-1&&window.execScript){var version=-1;for(var i=0;i'+soundManager.url+''; + if (soundManager.getMoviePercent() == 100) { + // SWF may have already loaded + fOnComplete(true,msg); + } else { + try { + xhr.open("HEAD",sURL,true); + xhr.onreadystatechange = function() { + if (xhr.readyState == 4) { + if (xhr.status == '200') { + fOnComplete(true,msg); + } else if (xhr.status == '404') { + fOnComplete(false,msg); + } else { + // some other response + fOnComplete('unknown',(xhr.status != '0'?'HTTP response: '+xhr.status+', ':'')+msg); // safari returns 0 when offline + } + } + } + xhr.send(null); + + } catch(e) { + // fail (cross-domain, or no XHR) unless offline + fOnComplete('unknown',msg); + return false; + } + } + } + + this.handleEvent = function(sEventType,bSuccess,sMessage) { + var o = elements[sEventType]; + if (o) { + o.className = (bSuccess == true?'pass':(bSuccess != false?bSuccess:'fail')); // true = pass, className as argument, or false == fail + if (sMessage) { + var oSpan = o.getElementsByTagName('span')[4]; + if (oSpan) { + oSpan.innerHTML = (oSpan.innerHTML +' '+sMessage+''); + } else { + o.title = sMessage; + } + } + // associated events + if (sEventType == 'onload') { + if (bSuccess) { + self.doSoundTest(); + } else { + self.testURL(soundManager.url,function(bSuccess,sMessage) { + if (typeof sMessage == 'undefined') { + sMessage = null; + } + self.handleEvent('swf',bSuccess,sMessage); + }); + } + } else if (sEventType == 'swf') { + if (bSuccess == false) { + // don't show flashtojs at all if SWF failed to load + self.handleEvent('flashtojs','default'); // reset to N/A status + } + } else if (sEventType == 'flashtojs') { + if (bSuccess != true) { + // online or offline help messages + if (soundManager._overHTTP) { + document.getElementById('d-flashtojs-offline').style.display = 'none'; + } else { + document.getElementById('d-flashtojs-online').style.display = 'none'; + } + } + } + } else { + soundManager._writeDebug('SM2 debugger warning: Undefined event type "'+sEventType+'"',1); + } + } + + this.doSoundTest = function() { + var foo = soundManager.createSound({ + id: 'sm2TestSound', + url: ('http://www.schillmania.com/projects/soundmanager2/demo/_mp3/mouseover.mp3') + }); + if (!soundManager._disabled) { + foo.play(); + // looks to be OK.. + if (!soundManager._disabled) { + // still OK.. + self.handleEvent('soundtest',true); + } else { + self.handleEvent('soundtest',false,': Failed after play()'); + } + } else { + self.handleEvent('soundtest',false,': Failed after createSound()'); + } + } + + this.init = function() { + // map event elements to DOM nodes - eg. elements.flashtojs = document.getElementById('d-flashtojs'); + for (var i=elementIDs.length; i--;) { + elements[elementIDs[i]] = document.getElementById('d-'+elementIDs[i]); + } + self.doFlashTest(); + } + + this.doFlashTest = function() { + var fd = FlashDetect; + var hasFlash = fd.installed; + var fv = soundManager.setupOptions.flashVersion; + var isSupported = (hasFlash && fd.major >= fv); + var flashVersion = fd.major+'.'+fd.minor+'.'+fd.revisionStr; + var flashInfo = ' version '+(!isSupported?'unsupported ('+flashVersion+', SWF version '+fv+')':flashVersion); + document.getElementById('d-flashversion').innerHTML = 'soundManager.flashVersion = '+fv+';'; + if (hasFlash) { + self.handleEvent('hasflash',isSupported,hasFlash?flashInfo:null); + } else { + self.handleEvent('hasflash','default',hasFlash?flashInfo:null); + } + } + + soundManager.setup({ + debugFlash: true // try to get flash debug output, as well + }); + + this.init(); + +} + +function sm2DebugInit() { + sm2Debugger = new SM2Debugger(); +} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png new file mode 100755 index 0000000000000000000000000000000000000000..78e827102aed043c6f33f11820128fbf898e6017 GIT binary patch literal 21317 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 AtN;K2 literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png new file mode 100755 index 0000000000000000000000000000000000000000..df005d4c15d25fc083093e04940bc2820da900ae GIT binary patch literal 20131 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 z zN@L~Qs-yOhVJd`_#+Ub1kHL^ymb>i3wE$ffcf$0LT9%ItDe?7u2Diku03r2yX^&ys z)$$<~^=47AHte5^el_QH+j-j;-YPY1w;DB_QNh(uP}NNfom2rXq%vKKGPza6?q$>q z^|rghh5pt^SuX+zDJ{Fkt@=~FSyZfz`RANp?a=GyZ(vqUH+({@v16etiT8|5&UY^n zQq{J*!i6M%O0*SbgFaXfr4OkyUo{`D9?qx!% z)OJ_+`+xD+rBN%~2fw5e%D0ApF8bA+*UjI+teUQK!i5&Ps(8=ITcmoIhbIz}J=ymfElU36-Pv~3dJibd_Cg-|$YTB!|-4(9jQ?J|`F_-`o=M?~y zXgoHA6uW!h?bI<1fKUttKyge@NZr%|0&q!~e!>V04Y?C>fTRE<1xQL#fTRFPNeYk@ zfTRFPNecK^QjY*s)%&CXMvxRBDd1a@0vMvZ?@8?d!>pu|Yyk5lxso~n20H + + +SoundManager 2 Start-up Test / Troubleshooting Tool + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Flash options: Flash 8 (default), Flash 9 (normal) or Flash 9 + highPerformance + fastPolling modes.

    + +
    +
      + +
    • +

      OKFAILN/AUnknownSoundManager 2 start-up

      +
      +

      soundManager onready() or ontimeout() events are ultimately called when start-up completes.

      +

      If you're seeing a failure, refer to the below for troubleshooting details for common causes.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash

      +
      +

      Flash 8 or 9 may be required for SoundManager 2 to start, depending on HTML5 support. You are currently using [unknown].

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash SWF

      +
      +

      SoundManager 2 must load a flash movie before initialisation can proceed. If you have errors here, check that soundManager.url is correctly defined and that the URL being loaded is correct.

      +

      If the Flash movie URL is OK, Flash security or flash blockers are the likely cause. Check the section below.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownFlash -> JS

      +
      +

      Once the flash component of SM2 has loaded, it tries to make a call to Javascript-land. This is a common point of failure, for security reasons:

      +
        +
      • +

        Have a flash blocker? Check that the SM2 flash movie (below) is loading and is not being blocked.

        +
      • +
      • + Is your browser URL at file:// or c:/path/ or otherwise not using HTTP? Flash security "whitelisting" is required to allow Flash + JS to work when offline, placing it in the "LocalTrusted" Flash security sandbox rather than "localWithFile". + +
        +

        Offline viewing: Adding a "trusted location" to the Flash Security Settings Panel

        +

        The Flash Player Global Security Settings Panel is a web-based control panel which allows you to configure Flash security. You will need to add the path of the SoundManager 2 project in order for it to work "offline" (ie., when viewing via file:// or c:/)

        +

        Show me how: Adding a "trusted location"

        + +

        Launch the Flash Security Settings Panel

        +
        + +
      • +
      • Flash blockers (FlashBlock, "click to flash" etc.) preventing flash load and start-up - need whitelisting/"allow this domain" to work smoothly. If you suspect blocking is the issue, try the SoundManager 2 Flashblock demo.
      • +
      • Online viewing (HTTP/S): Same-domain security rules apply to HTML + Flash content by default (crossdomain.xml/allowDomain() in .AS source required to override.)
      • +
      +

      See Flash debug output for more security error details.

      + +
      +

      Online viewing: Cross-domain security restrictions

      +

      HTML page on domain A loading .SWF from domain B: Flash security prevents JS + Flash when a cross-domain XML permission file is not available on domain B, and/or flash movie was not compiled with allowDomain('domainA') or allowDomain('*') - note that the SWF distributed with SM2 does not use this by default; try using the cross-domain version of the SWF, or compile your own which whitelists your own domain(s).

      + +

      Flash Blockers

      +

      Browser extensions/add-ons like "FlashBlock" and "click to flash" can prevent the .SWF from loading, and this will mean SM2 will time-out and fail waiting for a response from Flash. For development, it's best to whitelist the domain(s) or the .SWF for SM2 to allow it to work.

      +

      Have a flash blocker installed? Want to test it? Try the SoundManager 2 Flashblock demo.

      + +
      + +
      +
    • + +
    • +

      OKErrorN/AUnknownJS -> Flash

      +
      +

      At this point, Javascript attempts to respond to Flash's initial outgoing Flash -> JS call, completing the test for JS/flash communication. If SM2 does not receive a response from flash, it will eventually fail.

      +

      Offline viewing conditions and cross-domain security rules will prevent Flash <-> JS communication. See the details of Flash -> JS for information.

      +

      Special Firefox Note: Some versions of Firefox (9.0 and newer?) may break JS/Flash in the file:// or offline case even when the path has been whitelisted in the Flash player security settings panel. IE, Chrome, Safari and Opera do not have this issue.

      +
      +
    • + +
    • +

      OKErrorN/AUnknownSound test

      +
      +

      Here, a simple createSound() call is made to test SM2's actual operation. A sound should load and play provided SM2 was able to start successfully.

      +
      +
    • + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + + + +
    + + diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/metamaps/Metamaps.Backbone.js index d75814c6..5c326970 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Backbone.js +++ b/app/assets/javascripts/metamaps/Metamaps.Backbone.js @@ -21,6 +21,14 @@ Metamaps.Backbone.Mapper = Backbone.Model.extend({ toJSON: function (options) { return _.omit(this.attributes, this.blacklist); }, + prepareLiForFilter: function () { + var li = ''; + li += '
  • ';       + li += '';       + li += '

    ' + this.get('name') + '

  • '; + return li; + } }); Metamaps.Backbone.MapperCollection = Backbone.Collection.extend({ model: Metamaps.Backbone.Mapper, diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 3e517193..3e3acd36 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -83,7 +83,6 @@ Metamaps.GlobalUI = { // initialize global backbone models and collections Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper); - Metamaps.Mappers = new Metamaps.Backbone.MapperCollection([Metamaps.Active.Mapper]); Metamaps.Maps = new Metamaps.Backbone.MapsCollection(); }, openLightbox: function (which) { diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js~ b/app/assets/javascripts/metamaps/Metamaps.Router.js~ deleted file mode 100644 index 812b9108..00000000 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js~ +++ /dev/null @@ -1,35 +0,0 @@ -(function () { - var Router = Backbone.Router.extend({ - routes: { - "": "home", // #home - "explore/:section": "explore", // #explore/active - "maps/:id": "maps" // #maps/7 - }, - explore: function (section) { - console.log(section); - }, - maps: function (id) { - console.log(id); - } - }); - Metamaps.Router = new Router(); - Metamaps.Router.init = function () { - Backbone.history.start({ - pushState: true, - root: '' - }); - console.log('router started'); - $(document).on("click", "a:not([data-bypass])", function (evt) { - var href = { - prop: $(this).prop("href"), - attr: $(this).attr("href") - }; - var root = location.protocol + "//" + location.host + Backbone.history.options.root; - - if (href.prop && href.prop.slice(0, root.length) === root) { - evt.preventDefault(); - Backbone.history.navigate(href.attr, true); - } - }); - } -})(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index d84b47a9..f42342c1 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -83,11 +83,25 @@ Metamaps.Backbone.init = function () { var image = new Image(); image.src = this.get('icon'); this.set('image',image); + }, + prepareLiForFilter: function () { + var li = ''; + li += '
  • ';       + li += '';       + li += '

    ' + this.get('name').toLowerCase() + '

  • '; + return li; } + }); self.MetacodeCollection = Backbone.Collection.extend({ model: this.Metacode, url: '/metacodes', + comparator: function (a, b) { + a = a.get('name').toLowerCase(); + b = b.get('name').toLowerCase(); + return a > b ? 1 : a < b ? -1 : 0; + } }); self.Topic = Backbone.Model.extend({ @@ -105,6 +119,8 @@ Metamaps.Backbone.init = function () { "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons' }); } + + this.on('change:metacode_id', Metamaps.Filter.checkMetacodes, this); }, authorizeToEdit: function (mapper) { if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; @@ -132,13 +148,6 @@ Metamaps.Backbone.init = function () { topic_id: this.isNew() ? this.cid : this.id }); }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('topic_id', this.id); - } - }, createNode: function () { var mapping; var node = { @@ -196,6 +205,15 @@ Metamaps.Backbone.init = function () { "category": "from-to" }); } + this.on('change:desc', Metamaps.Filter.checkSynapses, this); + }, + prepareLiForFilter: function () { + var li = ''; + li += '
  • ';       + li += '
  • '; + return li; }, authorizeToEdit: function (mapper) { if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; @@ -229,13 +247,6 @@ Metamaps.Backbone.init = function () { synapse_id: this.isNew() ? this.cid : this.id }); }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('synapse_id', this.id); - } - }, createEdge: function () { var mapping, mappingID; var synapseID = this.isNew() ? this.cid : this.id; @@ -316,11 +327,28 @@ Metamaps.Backbone.init = function () { Metamaps.Topics = new self.TopicCollection(Metamaps.Topics); + Metamaps.Topics.on("add remove", function(topic){ + Metamaps.Filter.checkMetacodes(); + Metamaps.Filter.checkMappers(); + }); + Metamaps.Synapses = new self.SynapseCollection(Metamaps.Synapses); - Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); + Metamaps.Synapses.on("add remove", function(synapse){ + Metamaps.Filter.checkSynapses(); + Metamaps.Filter.checkMappers(); + }); + + Metamaps.Mappers = new self.MapperCollection(Metamaps.Mappers) if (Metamaps.Active.Map) { + Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); + + Metamaps.Mappings.on("add remove", function(synapse){ + Metamaps.Filter.checkMetacodes(); + Metamaps.Filter.checkMappers(); + }); + Metamaps.Active.Map = new self.Map(Metamaps.Active.Map); Metamaps.Maps.add(Metamaps.Active.Map); } @@ -1707,6 +1735,8 @@ Metamaps.Control = { setTimeout(function () { Metamaps.Visualize.mGraph.graph.removeNode(nodeid); }, 500); + Metamaps.Filter.checkMetacodes(); + Metamaps.Filter.checkMappers(); }, selectEdge: function (edge) { if (Metamaps.Selected.Edges.indexOf(edge) != -1) return; @@ -1822,6 +1852,8 @@ Metamaps.Control = { setTimeout(function () { Metamaps.Visualize.mGraph.graph.removeAdjacence(from, to); }, 500); + Metamaps.Filter.checkSynapses(); + Metamaps.Filter.checkMappers(); }, updateSelectedPermissions: function (permission) { @@ -1878,9 +1910,14 @@ Metamaps.Control = { Metamaps.Filter = { filters: { name: "", - metacode: [], + metacodes: [], mappers: [], - synapseTypes: [] + synapses: [] + }, + visible: { + metacodes: [], + mappers: [], + synapses: [] }, isOpen: false, timeOut: null, @@ -1890,24 +1927,19 @@ Metamaps.Filter = { $(".sidebarFilter").hover(self.open, self.close); - // initialize scroll bar for filter by metacode, then hide it and position it correctly again - $("#filter_by_metacode").mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - $('.sidebarFilterBox').hide().css({ - position: 'absolute', - top: '45px', - right: '-36px' - }); - - $('.sidebarFilterBox .showAll').click(self.filterNoMetacodes); - $('.sidebarFilterBox .hideAll').click(self.filterAllMetacodes); + $('.sidebarFilterBox .showAllMetacodes').click(self.filterNoMetacodes); + $('.sidebarFilterBox .showAllSynapses').click(self.filterNoSynapses); + $('.sidebarFilterBox .showAllMappers').click(self.filterNoMappers); + $('.sidebarFilterBox .hideAllMetacodes').click(self.filterAllMetacodes); + $('.sidebarFilterBox .hideAllSynapses').click(self.filterAllSynapses); + $('.sidebarFilterBox .hideAllMappers').click(self.filterAllMappers); // toggle visibility of topics with metacodes based on status in the filters list $('#filter_by_metacode ul li').click(self.toggleMetacode); + $('#filter_by_mapper ul li').click(self.toggleMapper); + $('#filter_by_synapse ul li').click(self.toggleSynapse); + + self.getFilterData(); }, open: function () { var self = Metamaps.Filter; @@ -1936,72 +1968,280 @@ Metamaps.Filter = { } }, 500); }, - filterNoMetacodes: function (e) { - - $('#filter_by_metacode ul li').removeClass('toggledOff'); - - // TODO - /* - showAll(); - - for (var catVis in categoryVisible) { - categoryVisible[catVis] = true; + checkMetacodes: function () { + var self = Metamaps.Filter; + + var newMetacodeList = []; + var removedMetacodes = []; + var addedMetacodes = []; + + Metamaps.Topics.each(function(topic) { + if (newMetacodeList.indexOf(topic.get('metacode_id')) === -1) { + newMetacodeList.push(topic.get('metacode_id').toString()); + } + }); + + removedMetacodes = _.difference(self.filters.metacodes, newMetacodeList); + addedMetacodes = _.difference(newMetacodeList, self.filters.metacodes); + + _.each(removedMetacodes, function(metacode_id) { + $('#filter_by_metacode li[data-id="' + metacode_id + '"]').fadeOut('fast',function(){ + $(this).remove(); + }); + }); + + var synapse, li, jQueryLi; + function sortAlpha(a,b){ + console.log(a.childNodes); + return a.childNodes[1].innerText.toLowerCase() > b.childNodes[1].innerText.toLowerCase() ? 1 : -1; } - */ + _.each(addedMetacodes, function(metacode_id) { + metacode = Metamaps.Metacodes.get(metacode_id); + li = metacode.prepareLiForFilter(); + jQueryLi = $(li).hide(); + $('li', '#filter_by_metacode ul').add(jQueryLi.fadeIn("fast")) + .sort(sortAlpha).appendTo('#filter_by_metacode ul'); + }); + self.filters.metacodes = newMetacodeList; + }, + checkMappers: function () { + var self = Metamaps.Filter; + + var newMappersList = []; + var removedMappersList = []; + var addedMappers = []; + + Metamaps.Topics.each(function(topic) { + if (newMappersList.indexOf(topic.get('user_id')) === -1) { + newMappersList.push(topic.get('user_id').toString()); + } + }); + Metamaps.Synapses.each(function(synapse) { + if (newMappersList.indexOf(synapse.get('user_id')) === -1) { + newMappersList.push(synapse.get('user_id').toString()); + } + }); + + + removedMappersList = _.difference(self.filters.mappers, newMappersList); + addedMappers = _.difference(newMappersList, self.filters.mappers); + + _.each(removedMappersList, function(user_id) { + $('#filter_by_mapper li[data-id="' + user_id + '"]').fadeOut('fast',function(){ + $(this).remove(); + }); + }); + + var mapper, li, jQueryLi; + function sortAlpha(a,b){ + return a.childNodes[1].innerText.toLowerCase() > b.childNodes[1].innerText.toLowerCase() ? 1 : -1; + } + _.each(addedMappers, function(user_id) { + mapper = Metamaps.Mapper.get(user_id); + li = mapper.prepareLiForFilter(); + jQueryLi = $(li).hide(); + $('li', '#filter_by_mapper ul').add(jQueryLi.fadeIn("fast")) + .sort(sortAlpha).appendTo('#filter_by_mapper ul'); + }); + + self.filters.mappers = newMappersList; + + }, + checkSynapses: function () { + var self = Metamaps.Filter; + + var newSynapsesList = []; + var removedSynapses = []; + var addedSynapses = []; + + Metamaps.Synapses.each(function(synapse) { + if (newSynapsesList.indexOf(synapse.get('desc')) === -1) { + newSynapsesList.push(synapse.get('desc').toString()); + } + }); + + removedSynapses = _.difference(self.filters.synapses, newSynapsesList); + addedSynapses = _.difference(newSynapsesList, self.filters.synapses); + + _.each(removedSynapses, function(synapse_desc) { + $('#filter_by_synapse li[data-id="' + synapse_desc + '"]').fadeOut('fast',function(){ + $(this).remove(); + }); + }); + + var synapse, li, jQueryLi; + function sortAlpha(a,b){ + return a.innerHTML.toLowerCase() > b.innerHTML.toLowerCase() ? 1 : -1; + } + _.each(addedSynapses, function(synapse_desc) { + synapse = Metamaps.Synapses.findWhere({desc:synapse_desc}); + li = synapse.prepareLiForFilter(); + jQueryLi = $(li).hide(); + $('li', '#filter_by_synapse ul').add(jQueryLi.fadeIn("fast")) + .sort(sortAlpha).appendTo('#filter_by_synapse ul'); + }); + + self.filters.synapses = newSynapsesList; }, filterAllMetacodes: function (e) { - + var self = Metamaps.Filter; $('#filter_by_metacode ul li').addClass('toggledOff'); + self.visible.metacodes = []; + self.passFilters(); + }, + filterNoMetacodes: function (e) { + var self = Metamaps.Filter; + $('#filter_by_metacode ul li').removeClass('toggledOff'); + self.visible.metacodes = self.filters.metacodes.slice(); + self.passFilters(); + }, + filterAllMappers: function (e) { + var self = Metamaps.Filter; + $('#filter_by_mapper ul li').addClass('toggledOff'); + self.visible.mappers = []; + self.passFilters(); + }, + filterNoMappers: function (e) { + var self = Metamaps.Filter; + $('#filter_by_mapper ul li').removeClass('toggledOff'); + self.visible.mappers = self.filters.mappers.slice(); + self.passFilters(); + }, + filterAllSynapses: function (e) { + var self = Metamaps.Filter; + $('#filter_by_synapse ul li').addClass('toggledOff'); + self.visible.synapses = []; + self.passFilters(); + }, + filterNoSynapses: function (e) { + var self = Metamaps.Filter; + $('#filter_by_synapse ul li').removeClass('toggledOff'); + self.visible.synapses = self.filters.synapses.slice(); + self.passFilters(); - // TODO - /* - hideAll(); - for (var catVis in categoryVisible) { - categoryVisible[catVis] = false; - } - */ + + }, + /* + Most of this data essentially depends on the ruby function which are happening for filter inside view filterBox + But what these function do is load this data into three accessible array within java : metacodes, mappers and synapses + */ + getFilterData: function () { + var self = Metamaps.Filter; + + var metacode, mapper, synapse; + + $('#filter_by_metacode li').each(function() { + metacode = $( this ).find('img').attr('data-id'); + self.filters.metacodes.push(metacode); + self.visible.metacodes.push(metacode); + }); + + $('#filter_by_mapper li').each(function() { + mapper = ($( this ).find('img').attr('data-id')); + self.filters.mappers.push(mapper); + self.visible.mappers.push(mapper); + }); + + $('#filter_by_synapse li').each(function() { + synapse = ($( this ).find('p').text()); + self.filters.synapses.push(synapse); + self.visible.synapses.push(synapse); + }); }, toggleMetacode: function () { + var self = Metamaps.Filter, index; - var category = $(this).children('img').attr('alt'); - - // TODO - /*switchVisible(category); - - // toggle the image and the boolean array value - if (categoryVisible[category] == true) { - $(this).addClass('toggledOff'); - categoryVisible[category] = false; - } else if (categoryVisible[category] == false) { + var metacode_id = $(this).attr("data-id"); + if (self.visible.metacodes.indexOf(metacode_id) == -1) { + self.visible.metacodes.push(metacode_id); $(this).removeClass('toggledOff'); - categoryVisible[category] = true; - }*/ + } + else { + index = self.visible.metacodes.indexOf(metacode_id); + self.visible.metacodes.splice(index, 1); + $(this).addClass('toggledOff'); + } + self.passFilters(); }, - passFilters: function (topic) { - var self = Metamaps.Find; - var filters = self.filters; + toggleMapper: function () { + var self = Metamaps.Filter, index; - var passesName = filters.name == "" ? true : false, - passesType = filters.type == [] ? true : false; - - //filter by name - if (topic.get('1')[1][0].toLowerCase().indexOf(filters.name) !== -1) { - passesName = true; + var user_id = $(this).attr("data-id"); + if (self.visible.mappers.indexOf(user_id) == -1) { + self.visible.mappers.push(user_id); + $(this).removeClass('toggledOff'); } - // filter by type - if (!filters.type == []) { - // get the array of types that your topic 'is' - var metacodes = topic.get('2') ? topic.get('2')[1] : []; - if (_.intersection(filters.type, metacodes).length == 0) passesType = true; + else { + index = self.visible.mappers.indexOf(user_id); + self.visible.mappers.splice(index, 1); + $(this).addClass('toggledOff'); } + self.passFilters(); + }, + toggleSynapse: function () { + var self = Metamaps.Filter, index; - if (passesName && passesType) { - return true; - } else { - return false; + var synapse_desc = $(this).attr("data-id"); + if (self.visible.synapses.indexOf(synapse_desc) == -1) { + self.visible.synapses.push(synapse_desc); + $(this).removeClass('toggledOff'); } - + else { + index = self.visible.synapses.indexOf(synapse_desc); + self.visible.synapses.splice(index, 1); + $(this).addClass('toggledOff'); + } + self.passFilters(); + }, + passFilters: function () { + var self = Metamaps.Filter; + var visible = self.visible; + var passesMetacode, passesMapper, passesSynapse; + + Metamaps.Topics.each(function(topic) { + var n = topic.get('node'); + var metacode_id = topic.get("metacode_id").toString(); + var user_id = topic.get("user_id").toString(); + + if (visible.metacodes.indexOf(metacode_id) == -1) passesMetacode = false; + else passesMetacode = true; + + if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; + else passesMapper = true; + + if (passesMetacode && passesMapper) { + n.setData('alpha', 1, 'end'); + } + else { + n.setData('alpha', 0.0, 'end'); + } + }); + Metamaps.Synapses.each(function(synapse) { + var e = synapse.get('edge'); + var desc = synapse.get("desc"); + var user_id = synapse.get("user_id").toString(); + + if (visible.synapses.indexOf(desc) == -1) passesSynapse = false; + else passesSynapse = true; + + if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; + else passesMapper = true; + + if (passesSynapse && passesMapper) { + e.setData('alpha', 1, 'end'); + } + else { + e.setData('alpha', 0.0, 'end'); + } + }); + + // run the animation + Metamaps.Visualize.mGraph.fx.animate({ + modes: ['node-property:alpha', + 'edge-property:alpha'], + duration: 500 + }); } }; // end Metamaps.Filter @@ -2264,7 +2504,7 @@ Metamaps.Topic = { Metamaps.Visualize.mGraph.loadJSON(newnode); nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); topic.set('node', nodeOnViz); - topic.updateNode(); // links the topic and the mapping to the node + topic.updateNode(); // links the topic and the mapping to the node nodeOnViz.setData("dim", 1, "start"); nodeOnViz.setData("dim", 25, "end"); @@ -2285,9 +2525,8 @@ Metamaps.Topic = { if (topic.isNew()) { topic.save(null, { success: function (topicModel, response) { - topicModel.updateMapping(); if (Metamaps.Active.Map) { - mapping.save(); + mapping.save({ topic_id: topicModel.id }); } }, error: function (model, response) { @@ -2403,9 +2642,8 @@ Metamaps.Synapse = { if (synapse.isNew()) { synapse.save(null, { success: function (synapseModel, response) { - synapseModel.updateMapping(); if (Metamaps.Active.Map) { - mapping.save(); + mapping.save({ synapse_id: synapseModel.id }); } }, error: function (model, response) { diff --git a/app/assets/javascripts/metamaps/Metamaps.js~ b/app/assets/javascripts/metamaps/Metamaps.js~ deleted file mode 100644 index cc796c14..00000000 --- a/app/assets/javascripts/metamaps/Metamaps.js~ +++ /dev/null @@ -1,2711 +0,0 @@ -var labelType, useGradients, nativeTextSupport, animate; - -(function () { - var ua = navigator.userAgent, - iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i), - typeOfCanvas = typeof HTMLCanvasElement, - nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'), - textSupport = nativeCanvasSupport && (typeof document.createElement('canvas').getContext('2d').fillText == 'function'); - //I'm setting this based on the fact that ExCanvas provides text support for IE - //and that as of today iPhone/iPad current text support is lame - labelType = (!nativeCanvasSupport || (textSupport && !iStuff)) ? 'Native' : 'HTML'; - nativeTextSupport = labelType == 'Native'; - useGradients = nativeCanvasSupport; - animate = !(iStuff || !nativeCanvasSupport); -})(); - -// TODO eliminate these 4 global variables -var panningInt; // this variable is used to store a 'setInterval' for the Metamaps.JIT.SmoothPanning() function, so that it can be cleared with window.clearInterval -var tempNode = null, - tempInit = false, - tempNode2 = null; - -Metamaps.Settings = { - embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages - sandbox: false, // puts the app into a mode (when true) where it only creates data locally, and isn't writing it to the database - colors: { - background: '#344A58', - synapses: { - normal: '#222222', - hover: '#222222', - selected: '#FFFFFF' - }, - topics: { - selected: '#FFFFFF' - }, - labels: { - background: '#18202E', - text: '#DDD' - } - } -}; - -Metamaps.Touch = { - touchPos: null, // this stores the x and y values of a current touch event - touchDragNode: null // this stores a reference to a JIT node that is being dragged -}; - -Metamaps.Mouse = { - didPan: false, - changeInX: 0, - changeInY: 0, - edgeHoveringOver: false, - boxStartCoordinates: false, - boxEndCoordinates: false, - synapseStartCoordinates: [], - synapseEndCoordinates: null, - lastNodeClick: 0, - lastCanvasClick: 0, - DOUBLE_CLICK_TOLERANCE: 300 -}; - -Metamaps.Selected = { - Nodes: [], - Edges: [] -}; - -Metamaps.Metacodes = {}; // will be initialized in Metamaps.Backbone.init as a MetacodeCollection -Metamaps.Topics = {}; // will be initialized in Metamaps.Backbone.init as a TopicCollection -Metamaps.Synapses = {}; // will be initialized in Metamaps.Backbone.init as a SynapseCollection -Metamaps.Mappings = {}; // will be initialized in Metamaps.Backbone.init as a MappingCollection - - -/* - * - * BACKBONE - * - */ -Metamaps.Backbone.init = function () { - var self = Metamaps.Backbone; - - self.Metacode = Backbone.Model.extend({ - initialize: function () { - var image = new Image(); - image.src = this.get('icon'); - this.set('image',image); - } - }); - self.MetacodeCollection = Backbone.Collection.extend({ - model: this.Metacode, - url: '/metacodes', - }); - - self.Topic = Backbone.Model.extend({ - urlRoot: '/topics', - blacklist: ['node', 'created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "desc": '', - "link": '', - "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons' - }); - } - }, - authorizeToEdit: function (mapper) { - if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; - else return false; - }, - authorizePermissionChange: function (mapper) { - if (mapper && this.get('user_id') === mapper.get('id')) return true; - else return false; - }, - getDate: function () { - - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getMetacode: function () { - return Metamaps.Metacodes.get(this.get('metacode_id')); - }, - getMapping: function () { - - if (!Metamaps.Active.Map) return false; - - return Metamaps.Mappings.findWhere({ - map_id: Metamaps.Active.Map.id, - topic_id: this.isNew() ? this.cid : this.id - }); - }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('topic_id', this.id); - } - }, - createNode: function () { - var mapping; - var node = { - adjacencies: [], - id: this.isNew() ? this.cid : this.id, - name: this.get('name') - }; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - node.data = { - $mapping: null, - $mappingID: mapping.id - }; - } - - return node; - }, - updateNode: function () { - var mapping; - var node = this.get('node'); - node.setData('topic', this); - node.id = this.isNew() ? this.cid : this.id; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - node.setData('mapping', mapping); - } - - return node; - }, - }); - - self.TopicCollection = Backbone.Collection.extend({ - model: self.Topic, - url: '/topics', - comparator: function (a, b) { - a = a.get('name').toLowerCase(); - b = b.get('name').toLowerCase(); - return a > b ? 1 : a < b ? -1 : 0; - } - }); - - self.Synapse = Backbone.Model.extend({ - urlRoot: '/synapses', - blacklist: ['edge', 'created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons', - "category": "from-to" - }); - } - }, - authorizeToEdit: function (mapper) { - if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; - else return false; - }, - authorizePermissionChange: function (mapper) { - if (mapper && this.get('user_id') === mapper.get('id')) return true; - else return false; - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getTopic1: function () { - return Metamaps.Topic.get(this.get('node1_id')); - }, - getTopic2: function () { - return Metamaps.Topic.get(this.get('node2_id')); - }, - getDirection: function () { - return [ - this.get('node1_id'), - this.get('node2_id') - ]; - }, - getMapping: function () { - - if (!Metamaps.Active.Map) return false; - - return Metamaps.Mappings.findWhere({ - map_id: Metamaps.Active.Map.id, - synapse_id: this.isNew() ? this.cid : this.id - }); - }, - updateMapping: function () { - var mapping = this.getMapping(); - - if (mapping) { - mapping.set('synapse_id', this.id); - } - }, - createEdge: function () { - var mapping, mappingID; - var synapseID = this.isNew() ? this.cid : this.id; - - var edge = { - nodeFrom: this.get('node1_id'), - nodeTo: this.get('node2_id'), - data: { - $synapses: [], - $synapseIDs: [synapseID], - } - }; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - mappingID = mapping.isNew() ? mapping.cid : mapping.id; - edge.data.$mappings = []; - edge.data.$mappingIDs = [mappingID]; - } - - return edge; - }, - updateEdge: function () { - var mapping; - var edge = this.get('edge'); - edge.getData('synapses').push(this); - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - edge.getData('mappings').push(mapping); - } - - return edge; - }, - }); - - self.SynapseCollection = Backbone.Collection.extend({ - model: self.Synapse, - url: '/synapses' - }); - - self.Mapping = Backbone.Model.extend({ - urlRoot: '/mappings', - blacklist: ['created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "map_id": Metamaps.Active.Map ? Metamaps.Active.Map.id : null - }); - } - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getMap: function () { - return Metamaps.Map.get(this.get('map_id')); - }, - getTopic: function () { - if (this.get('category') === 'Topic') return Metamaps.Topic.get(this.get('topic_id')); - else return false; - }, - getSynapse: function () { - if (this.get('category') === 'Synapse') return Metamaps.Synapse.get(this.get('synapse_id')); - else return false; - } - }); - - self.MappingCollection = Backbone.Collection.extend({ - model: self.Mapping, - url: '/mappings' - }); - - Metamaps.Metacodes = new self.MetacodeCollection(Metamaps.Metacodes); - - Metamaps.Topics = new self.TopicCollection(Metamaps.Topics); - - Metamaps.Synapses = new self.SynapseCollection(Metamaps.Synapses); - - Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); - - if (Metamaps.Active.Map) { - Metamaps.Active.Map = new self.Map(Metamaps.Active.Map); - Metamaps.Maps.add(Metamaps.Active.Map); - } - - if (Metamaps.Active.Topic) Metamaps.Active.Topic = new self.Topic(Metamaps.Active.Topic); -}; // end Metamaps.Backbone.init - - -/* - * - * CREATE - * - */ -Metamaps.Create = { - isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open - metacodeScrollerInit: false, // indicates whether the scrollbar in the custom metacode set space has been init - selectedMetacodeSet: null, - selectedMetacodeSetIndex: null, - selectedMetacodeNames: [], - newSelectedMetacodeNames: [], - selectedMetacodes: [], - newSelectedMetacodes: [], - init: function () { - var self = Metamaps.Create; - self.newTopic.init(); - self.newSynapse.init(); - - ////// - ////// - //// SWITCHING METACODE SETS - - $('#metacodeSwitchTabs').tabs({ - selected: self.selectedMetacodeSetIndex - }).addClass("ui-tabs-vertical ui-helper-clearfix"); - $("#metacodeSwitchTabs .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); - $('.customMetacodeList li').click(self.toggleMetacodeSelected); // within the custom metacode set tab - }, - toggleMetacodeSelected: function () { - var self = Metamaps.Create; - - if ($(this).attr('class') != 'toggledOff') { - $(this).addClass('toggledOff'); - var value_to_remove = $(this).attr('id'); - var name_to_remove = $(this).attr('data-name'); - self.newSelectedMetacodes.splice(self.newSelectedMetacodes.indexOf(value_to_remove), 1); - self.newSelectedMetacodeNames.splice(self.newSelectedMetacodeNames.indexOf(name_to_remove), 1); - } else if ($(this).attr('class') == 'toggledOff') { - $(this).removeClass('toggledOff'); - self.newSelectedMetacodes.push($(this).attr('id')); - self.newSelectedMetacodeNames.push($(this).attr('data-name')); - } - }, - updateMetacodeSet: function (set, index, custom) { - - if (custom && Metamaps.Create.newSelectedMetacodes.length == 0) { - alert('Please select at least one metacode to use!'); - return false; - } - - var codesToSwitchTo; - Metamaps.Create.selectedMetacodeSetIndex = index; - Metamaps.Create.selectedMetacodeSet = "metacodeset-" + set; - - if (!custom) { - codesToSwitchTo = $('#metacodeSwitchTabs' + set).attr('data-metacodes').split(','); - $('.customMetacodeList li').addClass('toggledOff'); - Metamaps.Create.selectedMetacodes = []; - Metamaps.Create.selectedMetacodeNames = []; - Metamaps.Create.newSelectedMetacodes = []; - Metamaps.Create.newSelectedMetacodeNames = []; - } - if (custom) { - // uses .slice to avoid setting the two arrays to the same actual array - Metamaps.Create.selectedMetacodes = Metamaps.Create.newSelectedMetacodes.slice(0); - Metamaps.Create.selectedMetacodeNames = Metamaps.Create.newSelectedMetacodeNames.slice(0); - codesToSwitchTo = Metamaps.Create.selectedMetacodeNames.slice(0); - } - - // sort by name - codesToSwitchTo.sort(); - codesToSwitchTo.reverse(); - - $('#metacodeImg, #metacodeImgTitle').empty(); - $('#metacodeImg').removeData('cloudcarousel'); - var newMetacodes = ""; - var metacode; - for (var i = 0; i < codesToSwitchTo.length; i++) { - metacode = Metamaps.Metacodes.findWhere({ name: codesToSwitchTo[i] }); - newMetacodes += '' + metacode.get('name') + ''; - }; - $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({ - titleBox: $('#metacodeImgTitle'), - yRadius: 40, - xPos: 150, - yPos: 40, - speed: 0.3, - mouseWheel: true, - bringToFront: true - }); - - Metamaps.GlobalUI.closeLightbox(); - $('#topic_name').focus(); - - var mdata = { - "metacodes": { - "value": custom ? Metamaps.Create.selectedMetacodes.toString() : Metamaps.Create.selectedMetacodeSet - } - }; - $.ajax({ - type: "POST", - dataType: 'json', - url: "/user/updatemetacodes", - data: mdata, - success: function (data) { - console.log('selected metacodes saved'); - }, - error: function () { - console.log('failed to save selected metacodes'); - } - }); - }, - - cancelMetacodeSetSwitch: function () { - var self = Metamaps.Create; - self.isSwitchingSet = false; - - if (self.selectedMetacodeSet != "metacodeset-custom") { - $('.customMetacodeList li').addClass('toggledOff'); - self.selectedMetacodes = []; - self.selectedMetacodeNames = []; - self.newSelectedMetacodes = []; - self.newSelectedMetacodeNames = []; - } else { // custom set is selected - // reset it to the current actual selection - $('.customMetacodeList li').addClass('toggledOff'); - for (var i = 0; i < self.selectedMetacodes.length; i++) { - $('#' + self.selectedMetacodes[i]).removeClass('toggledOff'); - }; - // uses .slice to avoid setting the two arrays to the same actual array - self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0); - self.newSelectedMetacodes = self.selectedMetacodes.slice(0); - } - $('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex); - $('#topic_name').focus(); - }, - newTopic: { - init: function () { - $('#new_topic').bind('contextmenu', function (e) { - return false; - }); - - $('#topic_name').keyup(function () { - Metamaps.Create.newTopic.name = $(this).val(); - }); - - // initialize the autocomplete results for the metacode spinner - $('#topic_name').typeahead([ - { - name: 'topic_autocomplete', - limit: 8, - template: $('#topicAutocompleteTemplate').html(), - remote: { - url: '/topics/autocomplete_topic?term=%QUERY' - }, - engine: Hogan - } - ]); - - // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete - $('#topic_name').bind('typeahead:selected', function (event, datum, dataset) { - Metamaps.Topic.getTopicFromAutocomplete(datum.id); - }); - - // initialize metacode spinner and then hide it - $("#metacodeImg").CloudCarousel({ - titleBox: $('#metacodeImgTitle'), - yRadius: 40, - xPos: 150, - yPos: 40, - speed: 0.3, - mouseWheel: true, - bringToFront: true - }); - $('.new_topic').hide(); - }, - name: null, - newId: 1, - beingCreated: false, - metacode: null, - x: null, - y: null, - addSynapse: false, - open: function () { - $('#new_topic').fadeIn('fast', function () { - $('#topic_name').focus(); - }); - Metamaps.Create.newTopic.beingCreated = true; - }, - hide: function () { - $('#new_topic').fadeOut('fast'); - $("#topic_name").typeahead('setQuery', ''); - Metamaps.Create.newTopic.beingCreated = false; - } - }, - newSynapse: { - init: function () { - var self = Metamaps.Create.newSynapse; - - // keep the right click menu from opening - $('#new_synapse').bind('contextmenu', function (e) { - return false; - }); - - $('#synapse_desc').keyup(function () { - Metamaps.Create.newSynapse.description = $(this).val(); - }); - - // initialize the autocomplete results for synapse creation - $('#synapse_desc').typeahead([ - { - name: 'synapse_autocomplete', - template: "
    {{label}}
    ", - remote: { - url: '/search/synapses?term=%QUERY' - }, - engine: Hogan - }, - { - name: 'existing_synapses', - limit: 50, - template: $('#synapseAutocompleteTemplate').html(), - remote: { - url: '/search/synapses', - replace: function () { - return self.getSearchQuery(); - } - }, - engine: Hogan, - header: "

    Existing Synapses

    " - } - ]); - - $('#synapse_desc').bind('typeahead:selected', function (event, datum, dataset) { - if (datum.id) { // if they clicked on an existing synapse get it - Metamaps.Synapse.getSynapseFromAutocomplete(datum.id); - } - }); - }, - beingCreated: false, - description: null, - topic1id: null, - topic2id: null, - newSynapseId: null, - open: function () { - $('#new_synapse').fadeIn('fast', function () { - $('#synapse_desc').focus(); - }); - Metamaps.Create.newSynapse.beingCreated = true; - }, - hide: function () { - $('#new_synapse').fadeOut('fast'); - $("#synapse_desc").typeahead('setQuery', ''); - Metamaps.Create.newSynapse.beingCreated = false; - Metamaps.Create.newTopic.addSynapse = false; - Metamaps.Create.newSynapse.topic1id = 0; - Metamaps.Create.newSynapse.topic2id = 0; - }, - getSearchQuery: function () { - var self = Metamaps.Create.newSynapse; - - if (Metamaps.Selected.Nodes.length < 2) { - return '/search/synapses?topic1id=' + self.topic1id + '&topic2id=' + self.topic2id; - } else return ''; - } - } -}; // end Metamaps.Create - - -////////////////// TOPIC AND SYNAPSE CARDS ////////////////////////// - - -/* - * - * TOPICCARD - * - */ -Metamaps.TopicCard = { - openTopicCard: null, //stores the JIT local ID of the topic with the topic card open - init: function () { - - // initialize best_in_place editing - $('.authenticated div.permission.canEdit .best_in_place').best_in_place(); - - Metamaps.TopicCard.generateShowcardHTML = Hogan.compile($('#topicCardTemplate').html()); - - // initialize topic card draggability and resizability - $('.showcard').draggable({ - handle: ".metacodeImage" - }); - $('#showcard').resizable({ - maxHeight: 500, - maxWidth: 500, - minHeight: 320, - minWidth: 226, - resize: function (event, ui) { - var p = $('#showcard').find('.scroll'); - p.height(p.height()).mCustomScrollbar('update'); - } - }).css({ - display: 'none', - top: '300px', - left: '100px' - }); - }, - fadeInShowCard: function (topic) { - $('.showcard').fadeIn('fast'); - Metamaps.TopicCard.openTopicCard = topic.isNew() ? topic.cid : topic.id; - }, - /** - * Will open the Topic Card for the node that it's passed - * @param {$jit.Graph.Node} node - */ - showCard: function (node) { - - var topic = node.getData('topic'); - - //populate the card that's about to show with the right topics data - Metamaps.TopicCard.populateShowCard(topic); - Metamaps.TopicCard.fadeInShowCard(topic); - }, - hideCard: function () { - $('.showcard').fadeOut('fast'); - Metamaps.TopicCard.openTopicCard = null; - }, - bindShowCardListeners: function (topic) { - var self = Metamaps.TopicCard; - var showCard = document.getElementById('showcard'); - - var selectingMetacode = false; - // attach the listener that shows the metacode title when you hover over the image - $('.showcard .metacodeImage').mouseenter(function () { - $('.showcard .icon').css('z-index', '4'); - $('.showcard .metacodeTitle').show(); - }); - $('.showcard .linkItem.icon').mouseleave(function () { - if (!selectingMetacode) { - $('.showcard .metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - } - }); - - $('.showcard .metacodeTitle').click(function () { - if (!selectingMetacode) { - selectingMetacode = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - $('.metacodeSelect').show(); - // add the scroll bar to the list of metacode select options if it isn't already there - if (!$('.metacodeSelect ul').hasClass('mCustomScrollbar')) { - $('.metacodeSelect ul').mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - - $('.metacodeSelect li').click(function () { - selectingMetacode = false; - var metacodeName = $(this).find('.mSelectName').text(); - var metacode = Metamaps.Metacodes.findWhere({ - name: metacodeName - }); - $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) - .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); - $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); - topic.save({ - metacode_id: metacode.id - }); - Metamaps.Visualize.mGraph.plot(); - $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - setTimeout(function () { - $('.metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - }, 500); - }); - } - } else { - selectingMetacode = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - } - }); - - - // ability to change permission - var selectingPermission = false; - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('.showcard .yourTopic .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('.permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - topic.save({ - permission: permission - }); - $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('.permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.permissionSelect').remove(); - } - }); - } - - // when you're typing a description, resize the scroll box to have space - $('.best_in_place_desc textarea').bind('keyup', function () { - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - }); - - //bind best_in_place ajax callbacks - $(showCard).find('.best_in_place_name').bind("ajax:success", function () { - - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - - var name = $(this).html(); - topic.set("name", Metamaps.Util.decodeEntities(name)); - Metamaps.Visualize.mGraph.plot(); - }); - - $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { - this.innerHTML = this.innerHTML.replace(/\r/g, '') - - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - - var desc = $(this).html(); - topic.set("desc", desc); - }); - - $(showCard).find('.best_in_place_link').bind("ajax:success", function () { - var link = $(this).html(); - $(showCard).find('.go-link').attr('href', link); - topic.set("link", link); - }); - }, - populateShowCard: function (topic) { - var self = Metamaps.TopicCard; - - var showCard = document.getElementById('showcard'); - - $(showCard).find('.permission').remove(); - - var html = self.generateShowcardHTML.render(self.buildObject(topic)); - - if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { - var perm = document.createElement('div'); - - var string = 'permission canEdit'; - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) string += ' yourTopic'; - perm.className = string; - perm.innerHTML = html; - showCard.appendChild(perm); - } else { - var perm = document.createElement('div'); - perm.className = 'permission cannotEdit'; - perm.innerHTML = html; - showCard.appendChild(perm); - } - - Metamaps.TopicCard.bindShowCardListeners(topic); - }, - generateShowcardHTML: null, // will be initialized into a Hogan template within init function - //generateShowcardHTML - buildObject: function (topic) { - var nodeValues = {}; - var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); - - //link is rendered differently if user is logged out or in - var go_link, a_tag, close_a_tag; - if (!authorized) { - go_link = ''; - if (topic.get("link") != "") { - a_tag = ''; - close_a_tag = ''; - } else { - a_tag = ''; - close_a_tag = ''; - } - } else { - go_link = ''; - a_tag = ''; - close_a_tag = ''; - } - - var desc_nil = "Click to add description..."; - var link_nil = "Click to add link..."; - - nodeValues.permission = topic.get("permission"); - nodeValues.mk_permission = topic.get("permission").substring(0, 2); - //nodeValues.map_count = topic.get("inmaps").length; - //nodeValues.synapse_count = topic.get("synapseCount"); - nodeValues.id = topic.isNew() ? topic.cid : topic.id; - nodeValues.metacode = topic.getMetacode().get("name"); - nodeValues.metacode_class = 'mbg' + topic.getMetacode().get("name").replace(/\s/g, ''); - nodeValues.imgsrc = topic.getMetacode().get("icon"); - nodeValues.name = topic.get("name"); - nodeValues.userid = topic.get("user_id"); - nodeValues.username = topic.getUser().get("name"); - nodeValues.date = topic.getDate(); - - // the code for this is stored in /views/main/_metacodeOptions.html.erb - nodeValues.metacode_select = $('#metacodeOptions').html(); - nodeValues.go_link = go_link; - nodeValues.a_tag = a_tag; - nodeValues.close_a_tag = close_a_tag; - nodeValues.link_nil = link_nil; - nodeValues.link = (topic.get("link") == "" && authorized) ? link_nil : topic.get("link"); - nodeValues.desc_nil = desc_nil; - nodeValues.desc = (topic.get("desc") == "" && authorized) ? desc_nil : topic.get("desc"); - return nodeValues; - } -}; // end Metamaps.TopicCard - - -/* - * - * SYNAPSECARD - * - */ -Metamaps.SynapseCard = { - openSynapseCard: null, - showCard: function (edge, e) { - var self = Metamaps.SynapseCard; - - //reset so we don't interfere with other edges, but first, save its x and y - var myX = $('#edit_synapse').css('left'); - var myY = $('#edit_synapse').css('top'); - $('#edit_synapse').remove(); - - //so label is missing while editing - Metamaps.Control.deselectEdge(edge); - - var synapse = edge.getData('synapses')[0]; // for now, just get the first synapse - - //create the wrapper around the form elements, including permissions - //classes to make best_in_place happy - var edit_div = document.createElement('div'); - edit_div.setAttribute('id', 'edit_synapse'); - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - edit_div.className = 'permission canEdit'; - edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : ''; - } else { - edit_div.className = 'permission cannotEdit'; - } - $('.main .wrapper').append(edit_div); - - self.populateShowCard(synapse); - - //drop it in the right spot, activate it - $('#edit_synapse').css('position', 'absolute'); - if (e) { - $('#edit_synapse').css('left', e.clientX); - $('#edit_synapse').css('top', e.clientY); - } else { - $('#edit_synapse').css('left', myX); - $('#edit_synapse').css('top', myY); - } - //$('#edit_synapse_name').click(); //required in case name is empty - //$('#edit_synapse_name input').focus(); - $('#edit_synapse').show(); - - self.openSynapseCard = synapse.isNew() ? synapse.cid : synapse.id; - }, - - hideCard: function () { - $('#edit_synapse').remove(); - Metamaps.SynapseCard.openSynapseCard = null; - }, - - populateShowCard: function (synapse) { - var self = Metamaps.SynapseCard; - - self.add_name_form(synapse); - self.add_user_info(synapse); - self.add_perms_form(synapse); - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - self.add_direction_form(synapse); - } - }, - - add_name_form: function (synapse) { - var data_nil = 'Click to add description.'; - - // TODO make it so that this would work even in sandbox mode, - // currently with Best_in_place it won't - - //name editing form - $('#edit_synapse').append('
    '); - $('#edit_synapse_name').attr('class', 'best_in_place best_in_place_desc'); - $('#edit_synapse_name').attr('data-object', 'synapse'); - $('#edit_synapse_name').attr('data-attribute', 'desc'); - $('#edit_synapse_name').attr('data-type', 'textarea'); - $('#edit_synapse_name').attr('data-nil', data_nil); - $('#edit_synapse_name').attr('data-url', '/synapses/' + synapse.id); - $('#edit_synapse_name').html(synapse.get("desc")); - - //if edge data is blank or just whitespace, populate it with data_nil - if ($('#edit_synapse_name').html().trim() == '') { - $('#edit_synapse_name').html(data_nil); - } - - $('#edit_synapse_name').bind("ajax:success", function () { - var desc = $(this).html(); - if (desc == data_nil) { - synapse.set("desc", ''); - } else { - synapse.set("desc", desc); - } - Metamaps.Control.selectEdge(synapse.get('edge')); - Metamaps.Visualize.mGraph.plot(); - }); - }, - - add_user_info: function (synapse) { - var u = '
    '; - u += '
    Created by ' + synapse.getUser().get("name") + '
    '; - $('#edit_synapse').append(u); - }, - - add_perms_form: function (synapse) { - //permissions - if owner, also allow permission editing - $('#edit_synapse').append('
    '); - - // ability to change permission - var selectingPermission = false; - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('#edit_synapse.yourEdge .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('#edit_synapse .permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - synapse.save({ - permission: permission, - }); - $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('#edit_synapse .permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('#edit_synapse .permissionSelect').remove(); - } - }); - } - }, //add_perms_form - - add_direction_form: function (synapse) { - //directionality checkboxes - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - - var edge = synapse.get('edge'); - - //determine which node is to the left and the right - //if directly in a line, top is left - if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || - edge.nodeFrom.pos.x == edge.nodeTo.pos.x && - edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { - var left = edge.nodeTo; - var right = edge.nodeFrom; - } else { - var left = edge.nodeFrom; - var right = edge.nodeTo; - } - - /* - * One node is actually on the left onscreen. Call it left, & the other right. - * If category is from-to, and that node is first, check the 'right' checkbox. - * Else check the 'left' checkbox since the arrow is incoming. - */ - - var directionCat = synapse.get('category'); //both, none, from-to - if (directionCat == 'from-to') { - var from_to = synapse.getDirection(); - if (from_to[0] == left.id) { - //check left checkbox - $('#edit_synapse_left').prop('checked', true); - } else { - //check right checkbox - $('#edit_synapse_right').prop('checked', true); - } - } else if (directionCat == 'both') { - //check both checkboxes - $('#edit_synapse_left').prop('checked', true); - $('#edit_synapse_right').prop('checked', true); - } - $('#edit_synapse_left, #edit_synapse_right').click(function () { - var leftChecked = $('#edit_synapse_left').is(':checked'); - var rightChecked = $('#edit_synapse_right').is(':checked'); - - var dir = synapse.getDirection(); - var dirCat = 'none'; - if (leftChecked && rightChecked) { - dirCat = 'both'; - } else if (!leftChecked && rightChecked) { - dirCat = 'from-to'; - dir = [right.id, left.id]; - } else if (leftChecked && !rightChecked) { - dirCat = 'from-to'; - dir = [left.id, right.id]; - } - - synapse.save({ - category: dirCat, - node1_id: dir[0], - node2_id: dir[1] - }); - Metamaps.Visualize.mGraph.plot(); - }); - } //add_direction_form -}; // end Metamaps.SynapseCard - - -////////////////////// END TOPIC AND SYNAPSE CARDS ////////////////////////////////// - - - - -/* - * - * VISUALIZE - * - */ -Metamaps.Visualize = { - mGraph: {}, // a reference to the graph object. - cameraPosition: null, // stores the camera position when using a 3D visualization - type: "ForceDirected", // the type of graph we're building, could be "RGraph", "ForceDirected", or "ForceDirected3D" - savedLayout: true, // indicates whether the map has a saved layout or not - loadLater: false, // indicates whether there is JSON that should be loaded right in the offset, or whether to wait till the first topic is created - target: null, // the selector representing the location to render the graph - init: function () { - var self = Metamaps.Visualize; - // disable awkward dragging of the canvas element that would sometimes happen - $('#infovis-canvas').on('dragstart', function (event) { - event.preventDefault(); - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchstart', function (event) { - event.preventDefault(); - self.mGraph.events.touched = true; - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchmove', function (event) { - //Metamaps.JIT.touchPanZoomHandler(event); - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchend touchcancel', function (event) { - lastDist = 0; - if (!self.mGraph.events.touchMoved && !Metamaps.Touch.touchDragNode) Metamaps.TopicCard.hideCurrentCard(); - self.mGraph.events.touched = self.mGraph.events.touchMoved = false; - Metamaps.Touch.touchDragNode = false; - }); - }, - render: function (targetID, vizData) { - var self = Metamaps.Visualize; - self.mGraph = {}; - self.target = targetID; - self.__buildGraph(vizData); - }, - computePositions: function () { - var self = Metamaps.Visualize, - mapping; - - if (self.type == "RGraph") { - self.mGraph.graph.eachNode(function (n) { - topic = Metamaps.Topics.get(n.id); - topic.set('node', n); - topic.updateNode(); - - n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); - } - }); - - var pos = n.getPos(); - pos.setc(-200, -200); - }); - self.mGraph.compute('end'); - } else if (self.type == "ForceDirected" && self.savedLayout) { - var i, l, startPos, endPos, topic, synapse; - - self.mGraph.graph.eachNode(function (n) { - topic = Metamaps.Topics.get(n.id); - topic.set('node', n); - topic.updateNode(); - mapping = topic.getMapping(); - - n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); - } - }); - - startPos = new $jit.Complex(0, 0); - endPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); - n.setPos(startPos, 'start'); - n.setPos(endPos, 'end'); - }); - } else if (self.type == "ForceDirected3D" || !self.savedLayout) { - self.mGraph.compute(); - } - }, - /** - * __buildGraph does the heavy lifting of creating the engine that renders the graph with the properties we desire - * - * @param vizData a json structure containing the data to be rendered. - */ - __buildGraph: function (vizData) { - var self = Metamaps.Visualize - RGraphSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); - - if (self.type == "RGraph") { - $jit.RGraph.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); - $jit.RGraph.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); - - RGraphSettings.background = Metamaps.JIT.RGraph.background; - RGraphSettings.levelDistance = Metamaps.JIT.RGraph.levelDistance; - - self.mGraph = new $jit.RGraph(RGraphSettings); - } else if (self.type == "ForceDirected") { - $jit.ForceDirected.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); - $jit.ForceDirected.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); - self.mGraph = new $jit.ForceDirected(Metamaps.JIT.ForceDirected.graphSettings); - } else if (self.type == "ForceDirected3D") { - // init ForceDirected3D - self.mGraph = new $jit.ForceDirected3D(Metamaps.JIT.ForceDirected3D.graphSettings); - self.cameraPosition = self.mGraph.canvas.canvases[0].camera.position; - } - - // load JSON data, if it's not empty - if (!self.loadLater) { - //load JSON data. - self.mGraph.loadJSON(vizData); - //compute positions and plot. - self.computePositions(); - if (self.type == "RGraph") { - self.mGraph.fx.animate(Metamaps.JIT.RGraph.animate); - } else if (self.type == "ForceDirected" && self.savedLayout) { - Metamaps.Organize.loadSavedLayout(); - } else if (self.type == "ForceDirected3D" || !self.savedLayout) { - self.mGraph.animate(Metamaps.JIT.ForceDirected.animateFDLayout); - } - } - } -}; // end Metamaps.Visualize - - -/* - * - * UTIL - * - */ -Metamaps.Util = { - // helper function to determine how many lines are needed - // Line Splitter Function - // copyright Stephen Chapman, 19th April 2006 - // you may copy this code but please keep the copyright notice as well - splitLine: function (st, n) { - var b = ''; - var s = st; - while (s.length > n) { - var c = s.substring(0, n); - var d = c.lastIndexOf(' '); - var e = c.lastIndexOf('\n'); - if (e != -1) d = e; - if (d == -1) d = n; - b += c.substring(0, d) + '\n'; - s = s.substring(d + 1); - } - return b + s; - }, - decodeEntities: function (desc) { - var str, temp = document.createElement('p'); - temp.innerHTML = desc; //browser handles the topics - str = temp.textContent || temp.innerText; - temp = null; //delete the element; - return str; - }, //decodeEntities - getDistance: function (p1, p2) { - return Math.sqrt(Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)); - }, - generateOptionsList: function (data) { - var newlist = ""; - for (var i = 0; i < data.length; i++) { - newlist = newlist + ''; - } - return newlist; - }, - checkURLisImage: function (url) { - // when the page reloads the following regular expression will be screwed up - // please replace it with this one before you save: /*backslashhere*.(jpeg|jpg|gif|png)$/ - return (url.match(/\.(jpeg|jpg|gif|png)$/) != null); - }, - checkURLisYoutubeVideo: function (url) { - return (url.match(/^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null); - } -}; // end Metamaps.Util - -/* - * - * REALTIME - * - */ -Metamaps.Realtime = { - // this is for the heroku staging environment - //Metamaps.Realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); - // this is for metamaps.cc - //Metamaps.Realtime.socket = io.connect('http://metamaps.cc:5001'); - // this is for localhost development - //Metamaps.Realtime.socket = io.connect('http://localhost:5001'); - socket: null, - isOpen: false, - timeOut: null, - changing: false, - mappersOnMap: {}, - status: true, // stores whether realtime is True/On or False/Off - init: function () { - var self = Metamaps.Realtime; - - $(".realtimeOnOff").click(self.toggle); - - $(".sidebarCollaborate").hover(self.open, self.close); - - var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - - if (mapperm) { - self.socket = io.connect('http://localhost:5001'); - self.socket.on('connect', function () { - console.log('socket connected'); - self.setupSocket(); - }); - } - }, - toggle: function () { - var self = Metamaps.Realtime; - - if (!self.status) { - self.sendRealtimeOn(); - $(this).html('ON').removeClass('rtOff').addClass('rtOn'); - $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); - } else { - self.sendRealtimeOff(); - $(this).html('OFF').removeClass('rtOn').addClass('rtOff'); - $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); - } - self.status = !self.status; - $(".sidebarCollaborateIcon").toggleClass("blue"); - }, - open: function () { - var self = Metamaps.Realtime; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing) { - self.changing = true; - $('.sidebarCollaborateBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.Realtime; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - $('.sidebarCollaborateBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - setupSocket: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - var myId = Metamaps.Active.Mapper.id; - - socket.emit('newMapperNotify', { - userid: myId, - username: Metamaps.Active.Mapper.get("name"), - mapid: Metamaps.Active.Map.id - }); - - // if you're the 'new guy' update your list with who's already online - socket.on(myId + '-' + Metamaps.Active.Map.id + '-UpdateMapperList', self.updateMapperList); - - // receive word that there's a new mapper on the map - socket.on('maps-' + Metamaps.Active.Map.id + '-newmapper', self.newPeerOnMap); - - // receive word that a mapper left the map - socket.on('maps-' + Metamaps.Active.Map.id + '-lostmapper', self.lostPeerOnMap); - - // receive word that there's a mapper turned on realtime - socket.on('maps-' + Metamaps.Active.Map.id + '-newrealtime', self.newCollaborator); - - // receive word that there's a mapper turned on realtime - socket.on('maps-' + Metamaps.Active.Map.id + '-lostrealtime', self.lostCollaborator); - - socket.on('maps-' + Metamaps.Active.Map.id, self.contentUpdate); - }, - sendRealtimeOn: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // send this new mapper back your details, and the awareness that you're online - var update = { - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - mapid: Metamaps.Active.Map.id - }; - socket.emit('notifyStartRealtime', update); - }, - sendRealtimeOff: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // send this new mapper back your details, and the awareness that you're online - var update = { - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - mapid: Metamaps.Active.Map.id - }; - socket.emit('notifyStopRealtime', update); - }, - updateMapperList: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - // data.userrealtime - - self.mappersOnMap[data.userid] = { - name: data.username, - realtime: data.userrealtime - }; - - var onOff = data.userrealtime ? "On" : "Off"; - var mapperListItem = '
  • ' + data.username + '
  • '; - - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); - }, - newPeerOnMap: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid] = { - name: data.username, - realtime: true - }; - - var mapperListItem = '
  • ' + data.username + '
  • '; - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); - - Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); - - // send this new mapper back your details, and the awareness that you've loaded the map - var update = { - userToNotify: data.userid, - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - userrealtime: self.status, - mapid: Metamaps.Active.Map.id - }; - socket.emit('updateNewMapperList', update); - }, - lostPeerOnMap: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - delete self.mappersOnMap[data.userid]; - - $('#mapper' + data.userid).remove(); - - Metamaps.GlobalUI.notifyUser(data.username + ' just left the map'); - }, - newCollaborator: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid].realtime = true; - - $('#mapper' + data.userid).removeClass('littleRtOff').addClass('littleRtOn'); - - Metamaps.GlobalUI.notifyUser(data.username + ' just turned on realtime'); - }, - lostCollaborator: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid].realtime = false; - - $('#mapper' + data.userid).removeClass('littleRtOn').addClass('littleRtOff'); - - Metamaps.GlobalUI.notifyUser(data.username + ' just turned off realtime'); - }, - contentUpdate: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - var graph = Metamaps.Visualize.mGraph.graph; - - //as long as you weren't the origin of the changes, update your map - if (data.origin != Metamaps.Active.Mapper.id && self.status) { - if (data.resource == 'Topic') { - topic = $.parseJSON(data.obj); - - if (data.action == 'create') { - self.addTopicToMap(topic); - } else if (data.action == 'update' && graph.getNode(topic.id) != 'undefined') { - self.updateTopicOnMap(topic); - } else if (data.action == 'destroy' && graph.getNode(topic.id) != 'undefined') { - Metamaps.Control.hideNode(topic.id) - } - - return; - } else if (data.resource == 'Synapse') { - synapse = $.parseJSON(data.obj); - - if (data.action == 'create') { - self.addSynapseToMap(synapse); - } else if (data.action == 'update' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - self.updateSynapseOnMap(synapse); - } else if (data.action == 'destroy' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - var edge = graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']); - Metamaps.Control.hideEdge(edge); - } - - return; - } - } - }, - addTopicToMap: function (topic) { - - // TODO - var newPos, tempForT; - Metamaps.Visualize.mGraph.graph.addNode(topic); - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.setData('dim', 1, 'start'); - tempForT.setData('dim', 25, 'end'); - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - Metamaps.Visualize.mGraph.fx.plotNode(tempForT, Metamaps.Visualize.mGraph.canvas); - }, - updateTopicOnMap: function (topic) { - - // TODO - var newPos, tempForT; - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.data = topic.data; - tempForT.name = topic.name; - if (MetamapsModel.showcardInUse === topic.id) { - populateShowCard(tempForT); - } - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 - }); - }, - addSynapseToMap: function (synapse) { - - // TODO - var Node1, Node2, tempForS; - Node1 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[0]); - Node2 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[1]); - Metamaps.Visualize.mGraph.graph.addAdjacence(Node1, Node2, {}); - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(Node1.id, Node2.id); - tempForS.setDataset('start', { - lineWidth: 0.4 - }); - tempForS.setDataset('end', { - lineWidth: 2 - }); - tempForS.data = synapse.data; - Metamaps.Visualize.mGraph.fx.plotLine(tempForS, Metamaps.Visualize.mGraph.canvas); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 - }); - }, - updateSynapseOnMap: function (synapse) { - - // TODO - var k, tempForS, v, wasShowDesc, _ref; - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(synapse.data.$direction[0], synapse.data.$direction[1]); - wasShowDesc = tempForS.data.$showDesc; - _ref = synapse.data; - for (k in _ref) { - v = _ref[k]; - tempForS.data[k] = v; - } - tempForS.data.$showDesc = wasShowDesc; - if (MetamapsModel.edgecardInUse === synapse.data.$id) { // TODO - editEdge(tempForS, false); - } - return Metamaps.Visualize.mGraph.plot(); - } -}; // end Metamaps.Realtime - - -/* - * - * CONTROL - * - */ -Metamaps.Control = { - init: function () { - - }, - selectNode: function (node) { - if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; - node.selected = true; - node.setData('dim', 30, 'current'); - node.eachAdjacency(function (adj) { - Metamaps.Control.selectEdge(adj); - }); - Metamaps.Selected.Nodes.push(node); - }, - deselectAllNodes: function () { - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - var node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.deselectNode(node); - } - Metamaps.Visualize.mGraph.plot(); - }, - deselectNode: function (node) { - delete node.selected; - node.eachAdjacency(function (adj) { - Metamaps.Control.deselectEdge(adj); - }); - node.setData('dim', 25, 'current'); - - //remove the node - Metamaps.Selected.Nodes.splice( - Metamaps.Selected.Nodes.indexOf(node), 1); - }, - deleteSelectedNodes: function () { // refers to deleting topics permanently - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - var node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.deleteNode(node.id); - } - }, - deleteNode: function (nodeid) { // refers to deleting topics permanently - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var id = node.getData('id'); - Metamaps.Control.deselectNode(node); - Metamaps.Topics.get(id).destroy(); - Metamaps.Control.hideNode(nodeid); - }, - removeSelectedNodes: function () { // refers to removing topics permanently from a map - var l = Metamaps.Selected.Nodes.length, - i, - node, - mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - - if (mapperm) { - for (i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.removeNode(node.id); - } - } - }, - removeNode: function (nodeid) { // refers to removing topics permanently from a map - var mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var mappingid = node.getData("mapping").id; - - if (mapperm) { - Metamaps.Control.deselectNode(node); - Metamaps.Mappings.get(mappingid).destroy(); - Metamaps.Control.hideNode(nodeid); - } - }, - hideSelectedNodes: function () { - var l = Metamaps.Selected.Nodes.length, - i, - node; - - for (i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.hideNode(node.id); - } - }, - hideNode: function (nodeid) { - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - if (nodeid == Metamaps.Visualize.mGraph.root) { // && Metamaps.Visualize.type === "RGraph" - alert("You can't hide this topic, it is the root of your graph."); - return; - } - - Metamaps.Control.deselectNode(node); - - node.setData('alpha', 0, 'end'); - node.eachAdjacency(function (adj) { - adj.setData('alpha', 0, 'end'); - }); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha' - ], - duration: 500 - }); - setTimeout(function () { - Metamaps.Visualize.mGraph.graph.removeNode(nodeid); - }, 500); - }, - selectEdge: function (edge) { - if (Metamaps.Selected.Edges.indexOf(edge) != -1) return; - edge.setData('showDesc', true, 'current'); - if (!Metamaps.Settings.embed) { - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.selected, - alpha: 1 - }); - } else if (Metamaps.Settings.embed) { - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.selected, - alpha: 1 - }); - } - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:lineWidth:color:alpha'], - duration: 100 - }); - Metamaps.Selected.Edges.push(edge); - }, - deselectAllEdges: function () { - var l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - var edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.deselectEdge(edge); - } - Metamaps.Visualize.mGraph.plot(); - }, - deselectEdge: function (edge) { - edge.setData('showDesc', false, 'current'); - edge.setDataset('end', { - lineWidth: 2, - color: Metamaps.Settings.colors.synapses.normal, - alpha: 0.4 - }); - - if (Metamaps.Mouse.edgeHoveringOver == edge) { - edge.setData('showDesc', true, 'current'); - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.hover, - alpha: 1 - }); - } - - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:lineWidth:color:alpha'], - duration: 100 - }); - - //remove the edge - Metamaps.Selected.Edges.splice( - Metamaps.Selected.Edges.indexOf(edge), 1); - }, - deleteSelectedEdges: function () { // refers to deleting topics permanently - var edge, - l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.deleteEdge(edge); - } - }, - deleteEdge: function (edge) { - - // TODO make it so that you select which one, of multiple possible synapses you want to delete - - //var id = edge.getData("id"); - //Metamaps.Synapses.get(id).destroy(); - //Metamaps.Control.hideEdge(edge); - }, - removeSelectedEdges: function () { - var l = Metamaps.Selected.Edges.length, - i, - edge; - - if (Metamaps.Active.Map) { - for (i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.removeEdge(edge); - } - Metamaps.Selected.Edges = new Array(); - } - }, - removeEdge: function (edge) { - - // TODO make it so that you select which one, of multiple possible synapses you want - - //var mappingid = edge.getData("mappingid"); - //Metamaps.Mappings.get(mappingid).destroy(); - //Metamaps.Control.hideEdge(edge); - }, - hideSelectedEdges: function () { - var edge, - l = Metamaps.Selected.Edges.length, - i; - for (i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.hideEdge(edge); - } - Metamaps.Selected.Edges = new Array(); - }, - hideEdge: function (edge) { - var from = edge.nodeFrom.id; - var to = edge.nodeTo.id; - edge.setData('alpha', 0, 'end'); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:alpha'], - duration: 500 - }); - setTimeout(function () { - Metamaps.Visualize.mGraph.graph.removeAdjacence(from, to); - }, 500); - }, - updateSelectedPermissions: function (permission) { - - var edge, synapse, node, topic; - - Metamaps.GlobalUI.notifyUser('Working...'); - - // variables to keep track of how many nodes and synapses you had the ability to change the permission of - var nCount = 0, - sCount = 0; - - // change the permission of the selected synapses, if logged in user is the original creator - var l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - synapse = edge.getData('synapses')[0]; - - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - synapse.save({ - permission: permission - }); - sCount++; - } - } - - // change the permission of the selected topics, if logged in user is the original creator - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - topic = node.getData('topic'); - - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { - topic.save({ - permission: permission - }); - nCount++; - } - } - - var nString = nCount == 1 ? (nCount.toString() + ' topic and ') : (nCount.toString() + ' topics and '); - var sString = sCount == 1 ? (sCount.toString() + ' synapse') : (sCount.toString() + ' synapses'); - - var message = nString + sString + ' you created updated to ' + permission; - Metamaps.GlobalUI.notifyUser(message); - }, -}; // end Metamaps.Control - - -/* - * - * FILTER - * - */ -Metamaps.Filter = { - filters: { - name: "", - metacode: [], - mappers: [], - synapseTypes: [] - }, - isOpen: false, - timeOut: null, - changing: false, - init: function () { - var self = Metamaps.Filter; - - $(".sidebarFilter").hover(self.open, self.close); - - // initialize scroll bar for filter by metacode, then hide it and position it correctly again - $("#filter_by_metacode").mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - $('.sidebarFilterBox').hide().css({ - position: 'absolute', - top: '45px', - right: '-36px' - }); - - $('.sidebarFilterBox .showAll').click(self.filterNoMetacodes); - $('.sidebarFilterBox .hideAll').click(self.filterAllMetacodes); - - // toggle visibility of topics with metacodes based on status in the filters list - $('#filter_by_metacode ul li').click(self.toggleMetacode); - }, - open: function () { - var self = Metamaps.Filter; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing) { - self.changing = true; - - $('.sidebarFilterBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.Filter; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - - $('.sidebarFilterBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - filterNoMetacodes: function (e) { - - $('#filter_by_metacode ul li').removeClass('toggledOff'); - - // TODO - /* - showAll(); - - for (var catVis in categoryVisible) { - categoryVisible[catVis] = true; - } - */ - }, - filterAllMetacodes: function (e) { - - $('#filter_by_metacode ul li').addClass('toggledOff'); - - // TODO - /* - hideAll(); - for (var catVis in categoryVisible) { - categoryVisible[catVis] = false; - } - */ - }, - toggleMetacode: function () { - - var category = $(this).children('img').attr('alt'); - - // TODO - /*switchVisible(category); - - // toggle the image and the boolean array value - if (categoryVisible[category] == true) { - $(this).addClass('toggledOff'); - categoryVisible[category] = false; - } else if (categoryVisible[category] == false) { - $(this).removeClass('toggledOff'); - categoryVisible[category] = true; - }*/ - }, - passFilters: function (topic) { - var self = Metamaps.Find; - var filters = self.filters; - - var passesName = filters.name == "" ? true : false, - passesType = filters.type == [] ? true : false; - - //filter by name - if (topic.get('1')[1][0].toLowerCase().indexOf(filters.name) !== -1) { - passesName = true; - } - // filter by type - if (!filters.type == []) { - // get the array of types that your topic 'is' - var metacodes = topic.get('2') ? topic.get('2')[1] : []; - if (_.intersection(filters.type, metacodes).length == 0) passesType = true; - } - - if (passesName && passesType) { - return true; - } else { - return false; - } - } -}; // end Metamaps.Filter - - -/* - * - * LISTENERS - * - */ -Metamaps.Listeners = { - - init: function () { - - $(document).on('keydown', function (e) { - switch (e.which) { - case 13: - Metamaps.JIT.enterKeyHandler(); - e.preventDefault(); - break; - case 27: - Metamaps.JIT.escKeyHandler(); - break; - default: - break; //alert(e.which); - } - }); - - //$(window).resize(function () { - // Metamaps.Visualize.mGraph.canvas.resize($(window).width(), $(window).height()); - //}); - } -}; // end Metamaps.Listeners - - -/* - * - * ORGANIZE - * - */ -Metamaps.Organize = { - init: function () { - - }, - arrange: function (layout, centerNode) { - - - // first option for layout to implement is 'grid', will do an evenly spaced grid with its center at the 0,0 origin - if (layout == 'grid') { - var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); // this will always be an integer, the # of nodes on your graph visualization - var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid - var GRIDSPACE = 400; - var row = 0; - var column = 0; - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (column == numColumns) { - column = 0; - row += 1; - } - var newPos = new $jit.Complex(); - newPos.x = column * GRIDSPACE; - newPos.y = row * GRIDSPACE; - n.setPos(newPos, 'end'); - column += 1; - }); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - } else if (layout == 'grid_full') { - - // this will always be an integer, the # of nodes on your graph visualization - var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); - //var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid - //var GRIDSPACE = 400; - var height = Metamaps.Visualize.mGraph.canvas.getSize(0).height; - var width = Metamaps.Visualize.mGraph.canvas.getSize(0).width; - var totalArea = height * width; - var cellArea = totalArea / numNodes; - var ratio = height / width; - var cellWidth = sqrt(cellArea / ratio); - var cellHeight = cellArea / cellWidth; - var row = floor(height / cellHeight); - var column = floor(width / cellWidth); - var totalCells = row * column; - - if (totalCells) - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (column == numColumns) { - column = 0; - row += 1; - } - var newPos = new $jit.Complex(); - newPos.x = column * GRIDSPACE; - newPos.y = row * GRIDSPACE; - n.setPos(newPos, 'end'); - column += 1; - }); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - } else if (layout == 'radial') { - - var centerX = centerNode.getPos().x; - var centerY = centerNode.getPos().y; - centerNode.setPos(centerNode.getPos(), 'end'); - - console.log(centerNode.adjacencies); - var lineLength = 200; - var usedNodes = {}; - usedNodes[centerNode.id] = centerNode; - var radial = function (node, level, degree) { - if (level == 1) { - var numLinksTemp = _.size(node.adjacencies); - var angleTemp = 2 * Math.PI / numLinksTemp; - } else { - angleTemp = 2 * Math.PI / 20 - }; - node.eachAdjacency(function (a) { - var isSecondLevelNode = (centerNode.adjacencies[a.nodeTo.id] != undefined && level > 1); - if (usedNodes[a.nodeTo.id] == undefined && !isSecondLevelNode) { - var newPos = new $jit.Complex(); - newPos.x = level * lineLength * Math.sin(degree) + centerX; - newPos.y = level * lineLength * Math.cos(degree) + centerY; - a.nodeTo.setPos(newPos, 'end'); - usedNodes[a.nodeTo.id] = a.nodeTo; - - radial(a.nodeTo, level + 1, degree); - degree += angleTemp; - }; - }); - }; - radial(centerNode, 1, 0); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - - } else if (layout == 'center_viewport') { - - var lowX = 0, - lowY = 0, - highX = 0, - highY = 0; - var oldOriginX = Metamaps.Visualize.mGraph.canvas.translateOffsetX; - var oldOriginY = Metamaps.Visualize.mGraph.canvas.translateOffsetY; - - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (n.id === 1) { - lowX = n.getPos().x; - lowY = n.getPos().y; - highX = n.getPos().x; - highY = n.getPos().y; - }; - if (n.getPos().x < lowX) lowX = n.getPos().x; - if (n.getPos().y < lowY) lowY = n.getPos().y; - if (n.getPos().x > highX) highX = n.getPos().x; - if (n.getPos().y > highY) highY = n.getPos().y; - }); - console.log(lowX, lowY, highX, highY); - var newOriginX = (lowX + highX) / 2; - var newOriginY = (lowY + highY) / 2; - - } else alert('please call function with a valid layout dammit!'); - }, - loadSavedLayout: function (id) { - Metamaps.Visualize.computePositions(); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - }, -}; // end Metamaps.Organize - - -/* - * - * TOPIC - * - */ -Metamaps.Topic = { - // this function is to retrieve a topic JSON object from the database - // @param id = the id of the topic to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Topics.get(id) == undefined) { - //console.log("Ajax call!"); - if (!callback) { - var e = $.ajax({ - url: "/topics/" + id + ".json", - async: false - }); - Metamaps.Topics.add($.parseJSON(e.responseText)); - return Metamaps.Topics.get(id); - } else { - return $.ajax({ - url: "/topics/" + id + ".json", - success: function (data) { - Metamaps.Topics.add(data); - callback(Metamaps.Topics.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Topics.get(id); - } else { - return callback(Metamaps.Topics.get(id)); - } - } - }, - - /* - * - * - */ - renderTopic: function (mapping, topic, createNewInDB) { - var self = Metamaps.Topic; - - var nodeOnViz, tempPos; - - var newnode = topic.createNode(); - - if (!$.isEmptyObject(Metamaps.Visualize.mGraph.graph.nodes)) { - Metamaps.Visualize.mGraph.graph.addNode(newnode); - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - n.setData("dim", 25, "start"); - n.setData("dim", 25, "end"); - }); - nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - topic.set('node', nodeOnViz); - topic.updateNode(); // links the topic and the mapping to the node - - - nodeOnViz.setData("dim", 1, "start"); - nodeOnViz.setData("dim", 25, "end"); - if (Metamaps.Visualize.type === "RGraph") { - tempPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); - tempPos = tempPos.toPolar(); - nodeOnViz.setPos(tempPos, "current"); - nodeOnViz.setPos(tempPos, "start"); - nodeOnViz.setPos(tempPos, "end"); - } else if (Metamaps.Visualize.type === "ForceDirected") { - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); - } - if (Metamaps.Create.newTopic.addSynapse) { - Metamaps.Create.newSynapse.topic1id = tempNode.id; - Metamaps.Create.newSynapse.topic2id = nodeOnViz.id; - Metamaps.Create.newSynapse.open(); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - tempNode = null; - tempNode2 = null; - tempInit = false; - } - }); - } else { - Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - - } - }); - } - } else { - Metamaps.Visualize.mGraph.loadJSON(newnode); - nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - mapping.set('node', nodeOnViz); - mapping.updateNode(); // links the topic and the mapping to the node - - nodeOnViz.setData("dim", 1, "start"); - nodeOnViz.setData("dim", 25, "end"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); - Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - - } - }); - } - - if (!Metamaps.Settings.sandbox && createNewInDB) { - if (topic.isNew()) { - topic.save(null, { - success: function (topicModel, response) { - topicModel.updateMapping(); - if (Metamaps.Active.Map) { - mapping.save(); - } - }, - error: function (model, response) { - console.log('error saving topic to database'); - } - }); - } else if (!topic.isNew() && Metamaps.Active.Map) { - mapping.save(); - } - } - }, - createTopicLocally: function () { - var self = Metamaps.Topic; - - var metacode = Metamaps.Metacodes.findWhere({ - name: Metamaps.Create.newTopic.metacode - }); - - var topic = new Metamaps.Backbone.Topic({ - name: Metamaps.Create.newTopic.name, - metacode_id: metacode.id - }); - Metamaps.Topics.add(topic); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Topic", - xloc: Metamaps.Create.newTopic.x, - yloc: Metamaps.Create.newTopic.y, - topic_id: topic.cid - }); - Metamaps.Mappings.add(mapping); - - //these can't happen until the value is retrieved, which happens in the line above - Metamaps.Create.newTopic.hide(); - - self.renderTopic(mapping, topic, true); // this function also includes the creation of the topic in the database - }, - getTopicFromAutocomplete: function (id) { - var self = Metamaps.Topic; - - Metamaps.Create.newTopic.hide(); - - var topic = self.get(id); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Topic", - xloc: Metamaps.Create.newTopic.x, - yloc: Metamaps.Create.newTopic.y, - topic_id: topic.id - }); - Metamaps.Mappings.add(mapping); - - self.renderTopic(mapping, topic, false); - } -}; // end Metamaps.Topic - - -/* - * - * SYNAPSE - * - */ -Metamaps.Synapse = { - // this function is to retrieve a synapse JSON object from the database - // @param id = the id of the synapse to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Synapses.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/synapses/" + id + ".json", - async: false - }); - Metamaps.Synapses.add($.parseJSON(e.responseText)); - return Metamaps.Synapses.get(id); - } else { - return $.ajax({ - url: "/synapses/" + id + ".json", - success: function (data) { - Metamaps.Synapses.add(data); - callback(Metamaps.Synapses.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Synapses.get(id); - } else { - return callback(Metamaps.Synapses.get(id)); - } - } - }, - /* - * - * - */ - renderSynapse: function (mapping, synapse, node1, node2, createNewInDB) { - var self = Metamaps.Synapse; - - var edgeOnViz; - - var newedge = synapse.createEdge(); - - Metamaps.Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data); - edgeOnViz = Metamaps.Visualize.mGraph.graph.getAdjacence(node1.id, node2.id); - synapse.set('edge', edgeOnViz); - synapse.updateEdge(); // links the topic and the mapping to the node - - Metamaps.Visualize.mGraph.fx.plotLine(edgeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Control.selectEdge(edgeOnViz); - - if (!Metamaps.Settings.sandbox && createNewInDB) { - if (synapse.isNew()) { - synapse.save(null, { - success: function (synapseModel, response) { - synapseModel.updateMapping(); - if (Metamaps.Active.Map) { - mapping.save(); - } - }, - error: function (model, response) { - console.log('error saving synapse to database'); - } - }); - } else if (!synapse.isNew() && Metamaps.Active.Map) { - mapping.save(); - } - } - }, - createSynapseLocally: function () { - var self = Metamaps.Synapse, - topic1, - topic2, - node1, - node2, - synapse, - mapping; - - //for each node in this array we will create a synapse going to the position2 node. - var synapsesToCreate = []; - - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); - topic2 = node2.getData('topic'); - - var len = Metamaps.Selected.Nodes.length; - if (len == 0) { - synapsesToCreate[0] = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); - } else if (len > 0) { - synapsesToCreate = Metamaps.Selected.Nodes; - } - - for (var i = 0; i < synapsesToCreate.length; i++) { - node1 = synapsesToCreate[i]; - topic1 = node1.getData('topic'); - synapse = new Metamaps.Backbone.Synapse({ - desc: Metamaps.Create.newSynapse.description, - node1_id: topic1.isNew() ? topic1.cid : topic1.id, - node2_id: topic2.isNew() ? topic2.cid : topic2.id, - }); - Metamaps.Synapses.add(synapse); - - mapping = new Metamaps.Backbone.Mapping({ - category: "Synapse", - synapse_id: synapse.cid - }); - Metamaps.Mappings.add(mapping); - - // this function also includes the creation of the synapse in the database - self.renderSynapse(mapping, synapse, node1, node2, true); - } // for each in synapsesToCreate - - Metamaps.Create.newSynapse.hide(); - }, - getSynapseFromAutocomplete: function (id) { - var self = Metamaps.Synapse, - node1, - node2; - - Metamaps.Create.newSynapse.hide(); - - var synapse = self.get(id); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Synapse", - synapse_id: synapse.id - }); - Metamaps.Mappings.add(mapping); - - node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); - - self.renderSynapse(mapping, synapse, node1, node2, false); - } -}; // end Metamaps.Synapse - - -/* - * - * MAP - * - */ -Metamaps.Map = { - init: function () { - var self = Metamaps.Map; - - // prevent right clicks on the main canvas, so as to not get in the way of our right clicks - $('#center-container').bind('contextmenu', function (e) { - return false; - }); - - $('.sidebarFork').click(function () { - self.fork(); - }); - - Metamaps.GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html(); - - self.InfoBox.init(); - self.CheatSheet.init(); - }, - // this function is to retrieve a map JSON object from the database - // @param id = the id of the map to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Maps.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/maps/" + id + ".json", - async: false - }); - Metamaps.Maps.add($.parseJSON(e.responseText)); - return Metamaps.Maps.get(id); - } else { - return $.ajax({ - url: "/users/" + id + ".json", - success: function (data) { - Metamaps.Maps.add(data); - callback(Metamaps.Maps.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Maps.get(id); - } else { - return callback(Metamaps.Maps.get(id)); - } - } - }, - fork: function () { - Metamaps.GlobalUI.openLightbox('forkmap'); - - var nodes_data = "", - synapses_data = ""; - var synapses_array = new Array(); - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - //don't add to the map if it was filtered out - // TODO - //if (categoryVisible[n.getData('metacode')] == false) { - // return; - //} - - var x, y; - if (n.pos.x && n.pos.y) { - x = n.pos.x; - y = n.pos.y; - } else { - var x = Math.cos(n.pos.theta) * n.pos.rho; - var y = Math.sin(n.pos.theta) * n.pos.rho; - } - nodes_data += n.id + '/' + x + '/' + y + ','; - n.eachAdjacency(function (adj) { - synapses_array.push(adj.getData("synapses")[0].id); // TODO - }); - }); - - //get unique values only - synapses_array = $.grep(synapses_array, function (value, key) { - return $.inArray(value, synapses_array) === key; - }); - - synapses_data = synapses_array.join(); - nodes_data = nodes_data.slice(0, -1); - - Metamaps.GlobalUI.CreateMap.topicsToMap = nodes_data; - Metamaps.GlobalUI.CreateMap.synapsesToMap = synapses_data; - } -}; - - -/* - * - * CHEATSHEET - * - */ -Metamaps.Map.CheatSheet = { - init: function () { - // tab the cheatsheet - $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); - $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); - } -}; // end Metamaps.Map.CheatSheet - - -/* - * - * INFOBOX - * - */ -Metamaps.Map.InfoBox = { - isOpen: false, - timeOut: null, - changing: false, - selectingPermission: false, - init: function () { - var self = Metamaps.Map.InfoBox; - - // because anyone who can edit the map can change the map title - $('.mapInfoName .best_in_place_name').bind("ajax:success", function () { - var name = $(this).html(); - $('.mapName').html(name); - Metamaps.Active.Map.set('name', name); - }); - - $('.yourMap .mapPermission').click(self.onPermissionClick); - - $("div.index").hover(self.open, self.close); - }, - open: function (event) { - var self = Metamaps.GlobalUI.Account; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing && event.target.className != "openCheatsheet openLightbox") { - self.changing = true; - $('.mapInfoBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.GlobalUI.Account; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - $('.mapInfoBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - onPermissionClick: function () { - var self = Metamaps.Map.InfoBox; - - if (!self.selectingPermission) { - self.selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('commons')) { - $(this).append('
    '); - } else if ($(this).hasClass('public')) { - $(this).append('
    '); - } else if ($(this).hasClass('private')) { - $(this).append('
    '); - } - $('.mapPermission .permissionSelect li').click(self.selectPermission); - } else { - self.selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.mapPermission .permissionSelect').remove(); - } - }, - selectPermission: function () { - var self = Metamaps.Map.InfoBox; - - self.selectingPermission = false; - var permission = $(this).attr('class'); - Metamaps.Active.Map.save({ - permission: permission - }); - $('.mapPermission').removeClass('commons public private minimize').addClass(permission); - $('.mapPermission .permissionSelect').remove(); - event.stopPropagation(); - } -}; // end Metamaps.Map.InfoBox - - -/* - * - * MAPPER - * - */ -Metamaps.Mapper = { - // this function is to retrieve a mapper JSON object from the database - // @param id = the id of the mapper to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Mappers.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/users/" + id + ".json", - async: false - }); - Metamaps.Mappers.add($.parseJSON(e.responseText)); - return Metamaps.Mappers.get(id); - } else { - return $.ajax({ - url: "/users/" + id + ".json", - success: function (data) { - Metamaps.Mappers.add(data); - callback(Metamaps.Mappers.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Mappers.get(id); - } else { - return callback(Metamaps.Mappers.get(id)); - } - } - }, -}; // end Metamaps.Mapper \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/codeleft.js b/app/assets/javascripts/metamaps/codeleft.js index 12230b3c..ba192b80 100644 --- a/app/assets/javascripts/metamaps/codeleft.js +++ b/app/assets/javascripts/metamaps/codeleft.js @@ -48,142 +48,4 @@ function centerOn(nodeid) { } }); } -} - - - -function MconsoleReset() { - - var tX = Mconsole.canvas.translateOffsetX; - var tY = Mconsole.canvas.translateOffsetY; - Mconsole.canvas.translate(-tX, -tY); - - var mX = Mconsole.canvas.scaleOffsetX; - var mY = Mconsole.canvas.scaleOffsetY; - Mconsole.canvas.scale((1 / mX), (1 / mY)); -} - - -// create filters for maps - -function switchVisible(category, duration) { - if (categoryVisible[category] == true) { - hideCategory(category, duration); - } - else if (categoryVisible[category] == false) { - showCategory(category, duration); - } -} - -function hideCategory(category, duration) { - if (duration == null) duration = 500; - Mconsole.graph.eachNode( function (n) { - if (n.getData('metacode') == category) { - n.setData('alpha', 0.4, 'end'); - n.eachAdjacency(function(adj) { - adj.setData('alpha', 0.4, 'end'); - }); - } - }); - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: duration - }); -} - -function showCategory(category, duration) { - if (duration == null) duration = 500; - Mconsole.graph.eachNode( function (n) { - if (n.getData('metacode') == category) { - n.setData('alpha', 1, 'end'); - n.eachAdjacency(function(adj) { - adj.setData('alpha', 1, 'end'); - }); - } - }); - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: duration - }); -} - -// These functions toggle ALL nodes and synapses on the page -function hideAll(duration) { - if (duration == null) duration = 500; - Mconsole.graph.eachNode( function (n) { - n.setData('alpha', 0.4, 'end'); - n.eachAdjacency(function(adj) { - adj.setData('alpha', 0.2, 'end'); - }); - }); - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: duration - }); -} -function showAll(duration) { - if (duration == null) duration = 500; - Mconsole.graph.eachNode( function (n) { - n.setData('alpha', 1, 'end'); - n.eachAdjacency(function(adj) { - adj.setData('alpha', 0.4, 'end'); - }); - }); - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: duration - }); -} - -function filterTopicsByMap(mapID) { - Mconsole.graph.eachNode(function (n) { - if (n.getData('inmaps').indexOf(parseInt(mapID)) !== -1) { - n.setData('alpha', 1, 'end'); - } - else { - n.setData('alpha', 0.4, 'end'); - } - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: 500 - }); - }); -} // filterTopicsByName - -function filterTopicsByMapper(mapperID) { - Mconsole.graph.eachNode(function (n) { - if (n.getData('userid').toString() == mapperID) { - n.setData('alpha', 1, 'end'); - } - else { - n.setData('alpha', 0.4, 'end'); - } - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: 500 - }); - }); -} // filterTopicsByName - -function filterTopicsByName(searchQuery) { - Mconsole.graph.eachNode(function (n) { - nodeName = n.name.toLowerCase(); - if (nodeName.indexOf(searchQuery) !== -1 && searchQuery != "") { - n.setData('alpha', 1, 'end'); - } - else { - n.setData('alpha', 0.4, 'end'); - } - Mconsole.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha'], - duration: 500 - }); - }); -} // filterTopicsByName \ No newline at end of file +} \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/metamaps.js b/app/assets/javascripts/metamaps/metamaps.js deleted file mode 100644 index ea0addf8..00000000 --- a/app/assets/javascripts/metamaps/metamaps.js +++ /dev/null @@ -1,2695 +0,0 @@ -var labelType, useGradients, nativeTextSupport, animate; - -(function () { - var ua = navigator.userAgent, - iStuff = ua.match(/iPhone/i) || ua.match(/iPad/i), - typeOfCanvas = typeof HTMLCanvasElement, - nativeCanvasSupport = (typeOfCanvas == 'object' || typeOfCanvas == 'function'), - textSupport = nativeCanvasSupport && (typeof document.createElement('canvas').getContext('2d').fillText == 'function'); - //I'm setting this based on the fact that ExCanvas provides text support for IE - //and that as of today iPhone/iPad current text support is lame - labelType = (!nativeCanvasSupport || (textSupport && !iStuff)) ? 'Native' : 'HTML'; - nativeTextSupport = labelType == 'Native'; - useGradients = nativeCanvasSupport; - animate = !(iStuff || !nativeCanvasSupport); -})(); - -// TODO eliminate these 4 global variables -var panningInt; // this variable is used to store a 'setInterval' for the Metamaps.JIT.SmoothPanning() function, so that it can be cleared with window.clearInterval -var tempNode = null, - tempInit = false, - tempNode2 = null; - -Metamaps.Settings = { - embed: false, // indicates that the app is on a page that is optimized for embedding in iFrames on other web pages - sandbox: false, // puts the app into a mode (when true) where it only creates data locally, and isn't writing it to the database - colors: { - background: '#344A58', - synapses: { - normal: '#222222', - hover: '#222222', - selected: '#FFFFFF' - }, - topics: { - selected: '#FFFFFF' - }, - labels: { - background: '#18202E', - text: '#DDD' - } - } -}; - -Metamaps.Touch = { - touchPos: null, // this stores the x and y values of a current touch event - touchDragNode: null // this stores a reference to a JIT node that is being dragged -}; - -Metamaps.Mouse = { - didPan: false, - changeInX: 0, - changeInY: 0, - edgeHoveringOver: false, - boxStartCoordinates: false, - boxEndCoordinates: false, - synapseStartCoordinates: [], - synapseEndCoordinates: null, - lastNodeClick: 0, - lastCanvasClick: 0, - DOUBLE_CLICK_TOLERANCE: 300 -}; - -Metamaps.Selected = { - Nodes: [], - Edges: [] -}; - -Metamaps.Metacodes = {}; // will be initialized in Metamaps.Backbone.init as a MetacodeCollection -Metamaps.Topics = {}; // will be initialized in Metamaps.Backbone.init as a TopicCollection -Metamaps.Synapses = {}; // will be initialized in Metamaps.Backbone.init as a SynapseCollection -Metamaps.Mappings = {}; // will be initialized in Metamaps.Backbone.init as a MappingCollection - - -/* - * - * BACKBONE - * - */ -Metamaps.Backbone.init = function () { - var self = Metamaps.Backbone; - - self.Metacode = Backbone.Model.extend({ - initialize: function () { - var image = new Image(); - image.src = this.get('icon'); - this.set('image',image); - } - }); - self.MetacodeCollection = Backbone.Collection.extend({ - model: this.Metacode, - url: '/metacodes', - }); - - self.Topic = Backbone.Model.extend({ - urlRoot: '/topics', - blacklist: ['node', 'created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "desc": '', - "link": '', - "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons' - }); - } - }, - authorizeToEdit: function (mapper) { - if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; - else return false; - }, - authorizePermissionChange: function (mapper) { - if (mapper && this.get('user_id') === mapper.get('id')) return true; - else return false; - }, - getDate: function () { - - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getMetacode: function () { - return Metamaps.Metacodes.get(this.get('metacode_id')); - }, - getMapping: function () { - - if (!Metamaps.Active.Map) return false; - - return Metamaps.Mappings.findWhere({ - map_id: Metamaps.Active.Map.id, - topic_id: this.isNew() ? this.cid : this.id - }); - }, - createNode: function () { - var mapping; - var node = { - adjacencies: [], - id: this.isNew() ? this.cid : this.id, - name: this.get('name') - }; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - node.data = { - $mapping: null, - $mappingID: mapping.id - }; - } - - return node; - }, - updateNode: function () { - var mapping; - var node = this.get('node'); - node.setData('topic', this); - node.id = this.isNew() ? this.cid : this.id; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - node.setData('mapping', mapping); - } - - return node; - }, - }); - - self.TopicCollection = Backbone.Collection.extend({ - model: self.Topic, - url: '/topics', - comparator: function (a, b) { - a = a.get('name').toLowerCase(); - b = b.get('name').toLowerCase(); - return a > b ? 1 : a < b ? -1 : 0; - } - }); - - self.Synapse = Backbone.Model.extend({ - urlRoot: '/synapses', - blacklist: ['edge', 'created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "permission": Metamaps.Active.Map ? Metamaps.Active.Map.get('permission') : 'commons', - "category": "from-to" - }); - } - }, - authorizeToEdit: function (mapper) { - if (mapper && (this.get('permission') === "commons" || this.get('user_id') === mapper.get('id'))) return true; - else return false; - }, - authorizePermissionChange: function (mapper) { - if (mapper && this.get('user_id') === mapper.get('id')) return true; - else return false; - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getTopic1: function () { - return Metamaps.Topic.get(this.get('node1_id')); - }, - getTopic2: function () { - return Metamaps.Topic.get(this.get('node2_id')); - }, - getDirection: function () { - return [ - this.get('node1_id'), - this.get('node2_id') - ]; - }, - getMapping: function () { - - if (!Metamaps.Active.Map) return false; - - return Metamaps.Mappings.findWhere({ - map_id: Metamaps.Active.Map.id, - synapse_id: this.isNew() ? this.cid : this.id - }); - }, - createEdge: function () { - var mapping, mappingID; - var synapseID = this.isNew() ? this.cid : this.id; - - var edge = { - nodeFrom: this.get('node1_id'), - nodeTo: this.get('node2_id'), - data: { - $synapses: [], - $synapseIDs: [synapseID], - } - }; - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - mappingID = mapping.isNew() ? mapping.cid : mapping.id; - edge.data.$mappings = []; - edge.data.$mappingIDs = [mappingID]; - } - - return edge; - }, - updateEdge: function () { - var mapping; - var edge = this.get('edge'); - edge.getData('synapses').push(this); - - if (Metamaps.Active.Map) { - mapping = this.getMapping(); - edge.getData('mappings').push(mapping); - } - - return edge; - }, - }); - - self.SynapseCollection = Backbone.Collection.extend({ - model: self.Synapse, - url: '/synapses' - }); - - self.Mapping = Backbone.Model.extend({ - urlRoot: '/mappings', - blacklist: ['created_at', 'updated_at'], - toJSON: function (options) { - return _.omit(this.attributes, this.blacklist); - }, - initialize: function () { - if (this.isNew()) { - this.set({ - "user_id": Metamaps.Active.Mapper.id, - "map_id": Metamaps.Active.Map ? Metamaps.Active.Map.id : null - }); - } - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, - getMap: function () { - return Metamaps.Map.get(this.get('map_id')); - }, - getTopic: function () { - if (this.get('category') === 'Topic') return Metamaps.Topic.get(this.get('topic_id')); - else return false; - }, - getSynapse: function () { - if (this.get('category') === 'Synapse') return Metamaps.Synapse.get(this.get('synapse_id')); - else return false; - } - }); - - self.MappingCollection = Backbone.Collection.extend({ - model: self.Mapping, - url: '/mappings' - }); - - Metamaps.Metacodes = new self.MetacodeCollection(Metamaps.Metacodes); - - Metamaps.Topics = new self.TopicCollection(Metamaps.Topics); - - Metamaps.Synapses = new self.SynapseCollection(Metamaps.Synapses); - - Metamaps.Mappings = new self.MappingCollection(Metamaps.Mappings); - - if (Metamaps.Active.Map) { - Metamaps.Active.Map = new self.Map(Metamaps.Active.Map); - Metamaps.Maps.add(Metamaps.Active.Map); - } - - if (Metamaps.Active.Topic) Metamaps.Active.Topic = new self.Topic(Metamaps.Active.Topic); -}; // end Metamaps.Backbone.init - - -/* - * - * CREATE - * - */ -Metamaps.Create = { - isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open - metacodeScrollerInit: false, // indicates whether the scrollbar in the custom metacode set space has been init - selectedMetacodeSet: null, - selectedMetacodeSetIndex: null, - selectedMetacodeNames: [], - newSelectedMetacodeNames: [], - selectedMetacodes: [], - newSelectedMetacodes: [], - init: function () { - var self = Metamaps.Create; - self.newTopic.init(); - self.newSynapse.init(); - - ////// - ////// - //// SWITCHING METACODE SETS - - $('#metacodeSwitchTabs').tabs({ - selected: self.selectedMetacodeSetIndex - }).addClass("ui-tabs-vertical ui-helper-clearfix"); - $("#metacodeSwitchTabs .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); - $('.customMetacodeList li').click(self.toggleMetacodeSelected); // within the custom metacode set tab - }, - toggleMetacodeSelected: function () { - var self = Metamaps.Create; - - if ($(this).attr('class') != 'toggledOff') { - $(this).addClass('toggledOff'); - var value_to_remove = $(this).attr('id'); - var name_to_remove = $(this).attr('data-name'); - self.newSelectedMetacodes.splice(self.newSelectedMetacodes.indexOf(value_to_remove), 1); - self.newSelectedMetacodeNames.splice(self.newSelectedMetacodeNames.indexOf(name_to_remove), 1); - } else if ($(this).attr('class') == 'toggledOff') { - $(this).removeClass('toggledOff'); - self.newSelectedMetacodes.push($(this).attr('id')); - self.newSelectedMetacodeNames.push($(this).attr('data-name')); - } - }, - updateMetacodeSet: function (set, index, custom) { - - if (custom && Metamaps.Create.newSelectedMetacodes.length == 0) { - alert('Please select at least one metacode to use!'); - return false; - } - - var codesToSwitchTo; - Metamaps.Create.selectedMetacodeSetIndex = index; - Metamaps.Create.selectedMetacodeSet = "metacodeset-" + set; - - if (!custom) { - codesToSwitchTo = $('#metacodeSwitchTabs' + set).attr('data-metacodes').split(','); - $('.customMetacodeList li').addClass('toggledOff'); - Metamaps.Create.selectedMetacodes = []; - Metamaps.Create.selectedMetacodeNames = []; - Metamaps.Create.newSelectedMetacodes = []; - Metamaps.Create.newSelectedMetacodeNames = []; - } - if (custom) { - // uses .slice to avoid setting the two arrays to the same actual array - Metamaps.Create.selectedMetacodes = Metamaps.Create.newSelectedMetacodes.slice(0); - Metamaps.Create.selectedMetacodeNames = Metamaps.Create.newSelectedMetacodeNames.slice(0); - codesToSwitchTo = Metamaps.Create.selectedMetacodeNames.slice(0); - } - - // sort by name - codesToSwitchTo.sort(); - codesToSwitchTo.reverse(); - - $('#metacodeImg, #metacodeImgTitle').empty(); - $('#metacodeImg').removeData('cloudcarousel'); - var newMetacodes = ""; - var metacode; - for (var i = 0; i < codesToSwitchTo.length; i++) { - metacode = Metamaps.Metacodes.findWhere({ name: codesToSwitchTo[i] }); - newMetacodes += '' + metacode.get('name') + ''; - }; - $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({ - titleBox: $('#metacodeImgTitle'), - yRadius: 40, - xPos: 150, - yPos: 40, - speed: 0.3, - mouseWheel: true, - bringToFront: true - }); - - Metamaps.GlobalUI.closeLightbox(); - $('#topic_name').focus(); - - var mdata = { - "metacodes": { - "value": custom ? Metamaps.Create.selectedMetacodes.toString() : Metamaps.Create.selectedMetacodeSet - } - }; - $.ajax({ - type: "POST", - dataType: 'json', - url: "/user/updatemetacodes", - data: mdata, - success: function (data) { - console.log('selected metacodes saved'); - }, - error: function () { - console.log('failed to save selected metacodes'); - } - }); - }, - - cancelMetacodeSetSwitch: function () { - var self = Metamaps.Create; - self.isSwitchingSet = false; - - if (self.selectedMetacodeSet != "metacodeset-custom") { - $('.customMetacodeList li').addClass('toggledOff'); - self.selectedMetacodes = []; - self.selectedMetacodeNames = []; - self.newSelectedMetacodes = []; - self.newSelectedMetacodeNames = []; - } else { // custom set is selected - // reset it to the current actual selection - $('.customMetacodeList li').addClass('toggledOff'); - for (var i = 0; i < self.selectedMetacodes.length; i++) { - $('#' + self.selectedMetacodes[i]).removeClass('toggledOff'); - }; - // uses .slice to avoid setting the two arrays to the same actual array - self.newSelectedMetacodeNames = self.selectedMetacodeNames.slice(0); - self.newSelectedMetacodes = self.selectedMetacodes.slice(0); - } - $('#metacodeSwitchTabs').tabs("select", self.selectedMetacodeSetIndex); - $('#topic_name').focus(); - }, - newTopic: { - init: function () { - $('#new_topic').bind('contextmenu', function (e) { - return false; - }); - - $('#topic_name').keyup(function () { - Metamaps.Create.newTopic.name = $(this).val(); - }); - - // initialize the autocomplete results for the metacode spinner - $('#topic_name').typeahead([ - { - name: 'topic_autocomplete', - limit: 8, - template: $('#topicAutocompleteTemplate').html(), - remote: { - url: '/topics/autocomplete_topic?term=%QUERY' - }, - engine: Hogan - } - ]); - - // tell the autocomplete to submit the form with the topic you clicked on if you pick from the autocomplete - $('#topic_name').bind('typeahead:selected', function (event, datum, dataset) { - Metamaps.Topic.getTopicFromAutocomplete(datum.id); - }); - - // initialize metacode spinner and then hide it - $("#metacodeImg").CloudCarousel({ - titleBox: $('#metacodeImgTitle'), - yRadius: 40, - xPos: 150, - yPos: 40, - speed: 0.3, - mouseWheel: true, - bringToFront: true - }); - $('.new_topic').hide(); - }, - name: null, - newId: 1, - beingCreated: false, - metacode: null, - x: null, - y: null, - addSynapse: false, - open: function () { - $('#new_topic').fadeIn('fast', function () { - $('#topic_name').focus(); - }); - Metamaps.Create.newTopic.beingCreated = true; - }, - hide: function () { - $('#new_topic').fadeOut('fast'); - $("#topic_name").typeahead('setQuery', ''); - Metamaps.Create.newTopic.beingCreated = false; - } - }, - newSynapse: { - init: function () { - var self = Metamaps.Create.newSynapse; - - // keep the right click menu from opening - $('#new_synapse').bind('contextmenu', function (e) { - return false; - }); - - $('#synapse_desc').keyup(function () { - Metamaps.Create.newSynapse.description = $(this).val(); - }); - - // initialize the autocomplete results for synapse creation - $('#synapse_desc').typeahead([ - { - name: 'synapse_autocomplete', - template: "
    {{label}}
    ", - remote: { - url: '/search/synapses?term=%QUERY' - }, - engine: Hogan - }, - { - name: 'existing_synapses', - limit: 50, - template: $('#synapseAutocompleteTemplate').html(), - remote: { - url: '/search/synapses', - replace: function () { - return self.getSearchQuery(); - } - }, - engine: Hogan, - header: "

    Existing Synapses

    " - } - ]); - - $('#synapse_desc').bind('typeahead:selected', function (event, datum, dataset) { - if (datum.id) { // if they clicked on an existing synapse get it - Metamaps.Synapse.getSynapseFromAutocomplete(datum.id); - } - }); - }, - beingCreated: false, - description: null, - topic1id: null, - topic2id: null, - newSynapseId: null, - open: function () { - $('#new_synapse').fadeIn('fast', function () { - $('#synapse_desc').focus(); - }); - Metamaps.Create.newSynapse.beingCreated = true; - }, - hide: function () { - $('#new_synapse').fadeOut('fast'); - $("#synapse_desc").typeahead('setQuery', ''); - Metamaps.Create.newSynapse.beingCreated = false; - Metamaps.Create.newTopic.addSynapse = false; - Metamaps.Create.newSynapse.topic1id = 0; - Metamaps.Create.newSynapse.topic2id = 0; - }, - getSearchQuery: function () { - var self = Metamaps.Create.newSynapse; - - if (Metamaps.Selected.Nodes.length < 2) { - return '/search/synapses?topic1id=' + self.topic1id + '&topic2id=' + self.topic2id; - } else return ''; - } - } -}; // end Metamaps.Create - - -////////////////// TOPIC AND SYNAPSE CARDS ////////////////////////// - - -/* - * - * TOPICCARD - * - */ -Metamaps.TopicCard = { - openTopicCard: null, //stores the JIT local ID of the topic with the topic card open - init: function () { - - // initialize best_in_place editing - $('.authenticated div.permission.canEdit .best_in_place').best_in_place(); - - Metamaps.TopicCard.generateShowcardHTML = Hogan.compile($('#topicCardTemplate').html()); - - // initialize topic card draggability and resizability - $('.showcard').draggable({ - handle: ".metacodeImage" - }); - $('#showcard').resizable({ - maxHeight: 500, - maxWidth: 500, - minHeight: 320, - minWidth: 226, - resize: function (event, ui) { - var p = $('#showcard').find('.scroll'); - p.height(p.height()).mCustomScrollbar('update'); - } - }).css({ - display: 'none', - top: '300px', - left: '100px' - }); - }, - fadeInShowCard: function (topic) { - $('.showcard').fadeIn('fast'); - Metamaps.TopicCard.openTopicCard = topic.isNew() ? topic.cid : topic.id; - }, - /** - * Will open the Topic Card for the node that it's passed - * @param {$jit.Graph.Node} node - */ - showCard: function (node) { - - var topic = node.getData('topic'); - - //populate the card that's about to show with the right topics data - Metamaps.TopicCard.populateShowCard(topic); - Metamaps.TopicCard.fadeInShowCard(topic); - }, - hideCard: function () { - $('.showcard').fadeOut('fast'); - Metamaps.TopicCard.openTopicCard = null; - }, - bindShowCardListeners: function (topic) { - var self = Metamaps.TopicCard; - var showCard = document.getElementById('showcard'); - - var selectingMetacode = false; - // attach the listener that shows the metacode title when you hover over the image - $('.showcard .metacodeImage').mouseenter(function () { - $('.showcard .icon').css('z-index', '4'); - $('.showcard .metacodeTitle').show(); - }); - $('.showcard .linkItem.icon').mouseleave(function () { - if (!selectingMetacode) { - $('.showcard .metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - } - }); - - $('.showcard .metacodeTitle').click(function () { - if (!selectingMetacode) { - selectingMetacode = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - $('.metacodeSelect').show(); - // add the scroll bar to the list of metacode select options if it isn't already there - if (!$('.metacodeSelect ul').hasClass('mCustomScrollbar')) { - $('.metacodeSelect ul').mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - - $('.metacodeSelect li').click(function () { - selectingMetacode = false; - var metacodeName = $(this).find('.mSelectName').text(); - var metacode = Metamaps.Metacodes.findWhere({ - name: metacodeName - }); - $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) - .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); - $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); - topic.save({ - metacode_id: metacode.id - }); - Metamaps.Visualize.mGraph.plot(); - $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - setTimeout(function () { - $('.metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - }, 500); - }); - } - } else { - selectingMetacode = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - } - }); - - - // ability to change permission - var selectingPermission = false; - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('.showcard .yourTopic .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('.permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - topic.save({ - permission: permission - }); - $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('.permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.permissionSelect').remove(); - } - }); - } - - // when you're typing a description, resize the scroll box to have space - $('.best_in_place_desc textarea').bind('keyup', function () { - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - }); - - //bind best_in_place ajax callbacks - $(showCard).find('.best_in_place_name').bind("ajax:success", function () { - - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - - var name = $(this).html(); - topic.set("name", Metamaps.Util.decodeEntities(name)); - Metamaps.Visualize.mGraph.plot(); - }); - - $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { - this.innerHTML = this.innerHTML.replace(/\r/g, '') - - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - - var desc = $(this).html(); - topic.set("desc", desc); - }); - - $(showCard).find('.best_in_place_link').bind("ajax:success", function () { - var link = $(this).html(); - $(showCard).find('.go-link').attr('href', link); - topic.set("link", link); - }); - }, - populateShowCard: function (topic) { - var self = Metamaps.TopicCard; - - var showCard = document.getElementById('showcard'); - - $(showCard).find('.permission').remove(); - - var html = self.generateShowcardHTML.render(self.buildObject(topic)); - - if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { - var perm = document.createElement('div'); - - var string = 'permission canEdit'; - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) string += ' yourTopic'; - perm.className = string; - perm.innerHTML = html; - showCard.appendChild(perm); - } else { - var perm = document.createElement('div'); - perm.className = 'permission cannotEdit'; - perm.innerHTML = html; - showCard.appendChild(perm); - } - - Metamaps.TopicCard.bindShowCardListeners(topic); - }, - generateShowcardHTML: null, // will be initialized into a Hogan template within init function - //generateShowcardHTML - buildObject: function (topic) { - var nodeValues = {}; - var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); - - //link is rendered differently if user is logged out or in - var go_link, a_tag, close_a_tag; - if (!authorized) { - go_link = ''; - if (topic.get("link") != "") { - a_tag = ''; - close_a_tag = ''; - } else { - a_tag = ''; - close_a_tag = ''; - } - } else { - go_link = ''; - a_tag = ''; - close_a_tag = ''; - } - - var desc_nil = "Click to add description..."; - var link_nil = "Click to add link..."; - - nodeValues.permission = topic.get("permission"); - nodeValues.mk_permission = topic.get("permission").substring(0, 2); - //nodeValues.map_count = topic.get("inmaps").length; - //nodeValues.synapse_count = topic.get("synapseCount"); - nodeValues.id = topic.isNew() ? topic.cid : topic.id; - nodeValues.metacode = topic.getMetacode().get("name"); - nodeValues.metacode_class = 'mbg' + topic.getMetacode().get("name").replace(/\s/g, ''); - nodeValues.imgsrc = topic.getMetacode().get("icon"); - nodeValues.name = topic.get("name"); - nodeValues.userid = topic.get("user_id"); - nodeValues.username = topic.getUser().get("name"); - nodeValues.date = topic.getDate(); - - // the code for this is stored in /views/main/_metacodeOptions.html.erb - nodeValues.metacode_select = $('#metacodeOptions').html(); - nodeValues.go_link = go_link; - nodeValues.a_tag = a_tag; - nodeValues.close_a_tag = close_a_tag; - nodeValues.link_nil = link_nil; - nodeValues.link = (topic.get("link") == "" && authorized) ? link_nil : topic.get("link"); - nodeValues.desc_nil = desc_nil; - nodeValues.desc = (topic.get("desc") == "" && authorized) ? desc_nil : topic.get("desc"); - return nodeValues; - } -}; // end Metamaps.TopicCard - - -/* - * - * SYNAPSECARD - * - */ -Metamaps.SynapseCard = { - openSynapseCard: null, - showCard: function (edge, e) { - var self = Metamaps.SynapseCard; - - //reset so we don't interfere with other edges, but first, save its x and y - var myX = $('#edit_synapse').css('left'); - var myY = $('#edit_synapse').css('top'); - $('#edit_synapse').remove(); - - //so label is missing while editing - Metamaps.Control.deselectEdge(edge); - - var synapse = edge.getData('synapses')[0]; // for now, just get the first synapse - - //create the wrapper around the form elements, including permissions - //classes to make best_in_place happy - var edit_div = document.createElement('div'); - edit_div.setAttribute('id', 'edit_synapse'); - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - edit_div.className = 'permission canEdit'; - edit_div.className += synapse.authorizePermissionChange(Metamaps.Active.Mapper) ? ' yourEdge' : ''; - } else { - edit_div.className = 'permission cannotEdit'; - } - $('.main .wrapper').append(edit_div); - - self.populateShowCard(synapse); - - //drop it in the right spot, activate it - $('#edit_synapse').css('position', 'absolute'); - if (e) { - $('#edit_synapse').css('left', e.clientX); - $('#edit_synapse').css('top', e.clientY); - } else { - $('#edit_synapse').css('left', myX); - $('#edit_synapse').css('top', myY); - } - //$('#edit_synapse_name').click(); //required in case name is empty - //$('#edit_synapse_name input').focus(); - $('#edit_synapse').show(); - - self.openSynapseCard = synapse.isNew() ? synapse.cid : synapse.id; - }, - - hideCard: function () { - $('#edit_synapse').remove(); - Metamaps.SynapseCard.openSynapseCard = null; - }, - - populateShowCard: function (synapse) { - var self = Metamaps.SynapseCard; - - self.add_name_form(synapse); - self.add_user_info(synapse); - self.add_perms_form(synapse); - if (synapse.authorizeToEdit(Metamaps.Active.Mapper)) { - self.add_direction_form(synapse); - } - }, - - add_name_form: function (synapse) { - var data_nil = 'Click to add description.'; - - // TODO make it so that this would work even in sandbox mode, - // currently with Best_in_place it won't - - //name editing form - $('#edit_synapse').append('
    '); - $('#edit_synapse_name').attr('class', 'best_in_place best_in_place_desc'); - $('#edit_synapse_name').attr('data-object', 'synapse'); - $('#edit_synapse_name').attr('data-attribute', 'desc'); - $('#edit_synapse_name').attr('data-type', 'textarea'); - $('#edit_synapse_name').attr('data-nil', data_nil); - $('#edit_synapse_name').attr('data-url', '/synapses/' + synapse.id); - $('#edit_synapse_name').html(synapse.get("desc")); - - //if edge data is blank or just whitespace, populate it with data_nil - if ($('#edit_synapse_name').html().trim() == '') { - $('#edit_synapse_name').html(data_nil); - } - - $('#edit_synapse_name').bind("ajax:success", function () { - var desc = $(this).html(); - if (desc == data_nil) { - synapse.set("desc", ''); - } else { - synapse.set("desc", desc); - } - Metamaps.Control.selectEdge(synapse.get('edge')); - Metamaps.Visualize.mGraph.plot(); - }); - }, - - add_user_info: function (synapse) { - var u = '
    '; - u += '
    Created by ' + synapse.getUser().get("name") + '
    '; - $('#edit_synapse').append(u); - }, - - add_perms_form: function (synapse) { - //permissions - if owner, also allow permission editing - $('#edit_synapse').append('
    '); - - // ability to change permission - var selectingPermission = false; - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('#edit_synapse.yourEdge .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('#edit_synapse .permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - synapse.save({ - permission: permission, - }); - $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('#edit_synapse .permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('#edit_synapse .permissionSelect').remove(); - } - }); - } - }, //add_perms_form - - add_direction_form: function (synapse) { - //directionality checkboxes - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - $('#edit_synapse').append(''); - - var edge = synapse.get('edge'); - - //determine which node is to the left and the right - //if directly in a line, top is left - if (edge.nodeFrom.pos.x < edge.nodeTo.pos.x || - edge.nodeFrom.pos.x == edge.nodeTo.pos.x && - edge.nodeFrom.pos.y < edge.nodeTo.pos.y) { - var left = edge.nodeTo; - var right = edge.nodeFrom; - } else { - var left = edge.nodeFrom; - var right = edge.nodeTo; - } - - /* - * One node is actually on the left onscreen. Call it left, & the other right. - * If category is from-to, and that node is first, check the 'right' checkbox. - * Else check the 'left' checkbox since the arrow is incoming. - */ - - var directionCat = synapse.get('category'); //both, none, from-to - if (directionCat == 'from-to') { - var from_to = synapse.getDirection(); - if (from_to[0] == left.id) { - //check left checkbox - $('#edit_synapse_left').prop('checked', true); - } else { - //check right checkbox - $('#edit_synapse_right').prop('checked', true); - } - } else if (directionCat == 'both') { - //check both checkboxes - $('#edit_synapse_left').prop('checked', true); - $('#edit_synapse_right').prop('checked', true); - } - $('#edit_synapse_left, #edit_synapse_right').click(function () { - var leftChecked = $('#edit_synapse_left').is(':checked'); - var rightChecked = $('#edit_synapse_right').is(':checked'); - - var dir = synapse.getDirection(); - var dirCat = 'none'; - if (leftChecked && rightChecked) { - dirCat = 'both'; - } else if (!leftChecked && rightChecked) { - dirCat = 'from-to'; - dir = [right.id, left.id]; - } else if (leftChecked && !rightChecked) { - dirCat = 'from-to'; - dir = [left.id, right.id]; - } - - synapse.save({ - category: dirCat, - node1_id: dir[0], - node2_id: dir[1] - }); - Metamaps.Visualize.mGraph.plot(); - }); - } //add_direction_form -}; // end Metamaps.SynapseCard - - -////////////////////// END TOPIC AND SYNAPSE CARDS ////////////////////////////////// - - - - -/* - * - * VISUALIZE - * - */ -Metamaps.Visualize = { - mGraph: {}, // a reference to the graph object. - cameraPosition: null, // stores the camera position when using a 3D visualization - type: "ForceDirected", // the type of graph we're building, could be "RGraph", "ForceDirected", or "ForceDirected3D" - savedLayout: true, // indicates whether the map has a saved layout or not - loadLater: false, // indicates whether there is JSON that should be loaded right in the offset, or whether to wait till the first topic is created - target: null, // the selector representing the location to render the graph - init: function () { - var self = Metamaps.Visualize; - // disable awkward dragging of the canvas element that would sometimes happen - $('#infovis-canvas').on('dragstart', function (event) { - event.preventDefault(); - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchstart', function (event) { - event.preventDefault(); - self.mGraph.events.touched = true; - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchmove', function (event) { - //Metamaps.JIT.touchPanZoomHandler(event); - }); - - // prevent touch events on the canvas from default behaviour - $("#infovis-canvas").bind('touchend touchcancel', function (event) { - lastDist = 0; - if (!self.mGraph.events.touchMoved && !Metamaps.Touch.touchDragNode) Metamaps.TopicCard.hideCurrentCard(); - self.mGraph.events.touched = self.mGraph.events.touchMoved = false; - Metamaps.Touch.touchDragNode = false; - }); - }, - render: function (targetID, vizData) { - var self = Metamaps.Visualize; - self.mGraph = {}; - self.target = targetID; - self.__buildGraph(vizData); - }, - computePositions: function () { - var self = Metamaps.Visualize, - mapping; - - if (self.type == "RGraph") { - self.mGraph.graph.eachNode(function (n) { - topic = Metamaps.Topics.get(n.id); - topic.set('node', n); - topic.updateNode(); - - n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); - } - }); - - var pos = n.getPos(); - pos.setc(-200, -200); - }); - self.mGraph.compute('end'); - } else if (self.type == "ForceDirected" && self.savedLayout) { - var i, l, startPos, endPos, topic, synapse; - - self.mGraph.graph.eachNode(function (n) { - topic = Metamaps.Topics.get(n.id); - topic.set('node', n); - topic.updateNode(); - mapping = topic.getMapping(); - - n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); - } - }); - - startPos = new $jit.Complex(0, 0); - endPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); - n.setPos(startPos, 'start'); - n.setPos(endPos, 'end'); - }); - } else if (self.type == "ForceDirected3D" || !self.savedLayout) { - self.mGraph.compute(); - } - }, - /** - * __buildGraph does the heavy lifting of creating the engine that renders the graph with the properties we desire - * - * @param vizData a json structure containing the data to be rendered. - */ - __buildGraph: function (vizData) { - var self = Metamaps.Visualize - RGraphSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); - - if (self.type == "RGraph") { - $jit.RGraph.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); - $jit.RGraph.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); - - RGraphSettings.background = Metamaps.JIT.RGraph.background; - RGraphSettings.levelDistance = Metamaps.JIT.RGraph.levelDistance; - - self.mGraph = new $jit.RGraph(RGraphSettings); - } else if (self.type == "ForceDirected") { - $jit.ForceDirected.Plot.NodeTypes.implement(Metamaps.JIT.ForceDirected.nodeSettings); - $jit.ForceDirected.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); - self.mGraph = new $jit.ForceDirected(Metamaps.JIT.ForceDirected.graphSettings); - } else if (self.type == "ForceDirected3D") { - // init ForceDirected3D - self.mGraph = new $jit.ForceDirected3D(Metamaps.JIT.ForceDirected3D.graphSettings); - self.cameraPosition = self.mGraph.canvas.canvases[0].camera.position; - } - - // load JSON data, if it's not empty - if (!self.loadLater) { - //load JSON data. - self.mGraph.loadJSON(vizData); - //compute positions and plot. - self.computePositions(); - if (self.type == "RGraph") { - self.mGraph.fx.animate(Metamaps.JIT.RGraph.animate); - } else if (self.type == "ForceDirected" && self.savedLayout) { - Metamaps.Organize.loadSavedLayout(); - } else if (self.type == "ForceDirected3D" || !self.savedLayout) { - self.mGraph.animate(Metamaps.JIT.ForceDirected.animateFDLayout); - } - } - } -}; // end Metamaps.Visualize - - -/* - * - * UTIL - * - */ -Metamaps.Util = { - // helper function to determine how many lines are needed - // Line Splitter Function - // copyright Stephen Chapman, 19th April 2006 - // you may copy this code but please keep the copyright notice as well - splitLine: function (st, n) { - var b = ''; - var s = st; - while (s.length > n) { - var c = s.substring(0, n); - var d = c.lastIndexOf(' '); - var e = c.lastIndexOf('\n'); - if (e != -1) d = e; - if (d == -1) d = n; - b += c.substring(0, d) + '\n'; - s = s.substring(d + 1); - } - return b + s; - }, - decodeEntities: function (desc) { - var str, temp = document.createElement('p'); - temp.innerHTML = desc; //browser handles the topics - str = temp.textContent || temp.innerText; - temp = null; //delete the element; - return str; - }, //decodeEntities - getDistance: function (p1, p2) { - return Math.sqrt(Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)); - }, - generateOptionsList: function (data) { - var newlist = ""; - for (var i = 0; i < data.length; i++) { - newlist = newlist + ''; - } - return newlist; - }, - checkURLisImage: function (url) { - // when the page reloads the following regular expression will be screwed up - // please replace it with this one before you save: /*backslashhere*.(jpeg|jpg|gif|png)$/ - return (url.match(/\.(jpeg|jpg|gif|png)$/) != null); - }, - checkURLisYoutubeVideo: function (url) { - return (url.match(/^http:\/\/(?:www\.)?youtube.com\/watch\?(?=[^?]*v=\w+)(?:[^\s?]+)?$/) != null); - } -}; // end Metamaps.Util - -/* - * - * REALTIME - * - */ -Metamaps.Realtime = { - // this is for the heroku staging environment - //Metamaps.Realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); - // this is for metamaps.cc - //Metamaps.Realtime.socket = io.connect('http://metamaps.cc:5001'); - // this is for localhost development - //Metamaps.Realtime.socket = io.connect('http://localhost:5001'); - socket: null, - isOpen: false, - timeOut: null, - changing: false, - mappersOnMap: {}, - status: true, // stores whether realtime is True/On or False/Off - init: function () { - var self = Metamaps.Realtime; - - $(".realtimeOnOff").click(self.toggle); - - $(".sidebarCollaborate").hover(self.open, self.close); - - var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - - if (mapperm) { - self.socket = io.connect('http://localhost:5001'); - self.socket.on('connect', function () { - console.log('socket connected'); - self.setupSocket(); - }); - } - }, - toggle: function () { - var self = Metamaps.Realtime; - - if (!self.status) { - self.sendRealtimeOn(); - $(this).html('ON').removeClass('rtOff').addClass('rtOn'); - $(".rtMapperSelf").removeClass('littleRtOff').addClass('littleRtOn'); - } else { - self.sendRealtimeOff(); - $(this).html('OFF').removeClass('rtOn').addClass('rtOff'); - $(".rtMapperSelf").removeClass('littleRtOn').addClass('littleRtOff'); - } - self.status = !self.status; - $(".sidebarCollaborateIcon").toggleClass("blue"); - }, - open: function () { - var self = Metamaps.Realtime; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing) { - self.changing = true; - $('.sidebarCollaborateBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.Realtime; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - $('.sidebarCollaborateBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - setupSocket: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - var myId = Metamaps.Active.Mapper.id; - - socket.emit('newMapperNotify', { - userid: myId, - username: Metamaps.Active.Mapper.get("name"), - mapid: Metamaps.Active.Map.id - }); - - // if you're the 'new guy' update your list with who's already online - socket.on(myId + '-' + Metamaps.Active.Map.id + '-UpdateMapperList', self.updateMapperList); - - // receive word that there's a new mapper on the map - socket.on('maps-' + Metamaps.Active.Map.id + '-newmapper', self.newPeerOnMap); - - // receive word that a mapper left the map - socket.on('maps-' + Metamaps.Active.Map.id + '-lostmapper', self.lostPeerOnMap); - - // receive word that there's a mapper turned on realtime - socket.on('maps-' + Metamaps.Active.Map.id + '-newrealtime', self.newCollaborator); - - // receive word that there's a mapper turned on realtime - socket.on('maps-' + Metamaps.Active.Map.id + '-lostrealtime', self.lostCollaborator); - - socket.on('maps-' + Metamaps.Active.Map.id, self.contentUpdate); - }, - sendRealtimeOn: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // send this new mapper back your details, and the awareness that you're online - var update = { - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - mapid: Metamaps.Active.Map.id - }; - socket.emit('notifyStartRealtime', update); - }, - sendRealtimeOff: function () { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // send this new mapper back your details, and the awareness that you're online - var update = { - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - mapid: Metamaps.Active.Map.id - }; - socket.emit('notifyStopRealtime', update); - }, - updateMapperList: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - // data.userrealtime - - self.mappersOnMap[data.userid] = { - name: data.username, - realtime: data.userrealtime - }; - - var onOff = data.userrealtime ? "On" : "Off"; - var mapperListItem = '
  • ' + data.username + '
  • '; - - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); - }, - newPeerOnMap: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid] = { - name: data.username, - realtime: true - }; - - var mapperListItem = '
  • ' + data.username + '
  • '; - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); - - Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); - - // send this new mapper back your details, and the awareness that you've loaded the map - var update = { - userToNotify: data.userid, - username: Metamaps.Active.Mapper.get("name"), - userid: Metamaps.Active.Mapper.id, - userrealtime: self.status, - mapid: Metamaps.Active.Map.id - }; - socket.emit('updateNewMapperList', update); - }, - lostPeerOnMap: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - delete self.mappersOnMap[data.userid]; - - $('#mapper' + data.userid).remove(); - - Metamaps.GlobalUI.notifyUser(data.username + ' just left the map'); - }, - newCollaborator: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid].realtime = true; - - $('#mapper' + data.userid).removeClass('littleRtOff').addClass('littleRtOn'); - - Metamaps.GlobalUI.notifyUser(data.username + ' just turned on realtime'); - }, - lostCollaborator: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - - // data.userid - // data.username - - self.mappersOnMap[data.userid].realtime = false; - - $('#mapper' + data.userid).removeClass('littleRtOn').addClass('littleRtOff'); - - Metamaps.GlobalUI.notifyUser(data.username + ' just turned off realtime'); - }, - contentUpdate: function (data) { - var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - var graph = Metamaps.Visualize.mGraph.graph; - - //as long as you weren't the origin of the changes, update your map - if (data.origin != Metamaps.Active.Mapper.id && self.status) { - if (data.resource == 'Topic') { - topic = $.parseJSON(data.obj); - - if (data.action == 'create') { - self.addTopicToMap(topic); - } else if (data.action == 'update' && graph.getNode(topic.id) != 'undefined') { - self.updateTopicOnMap(topic); - } else if (data.action == 'destroy' && graph.getNode(topic.id) != 'undefined') { - Metamaps.Control.hideNode(topic.id) - } - - return; - } else if (data.resource == 'Synapse') { - synapse = $.parseJSON(data.obj); - - if (data.action == 'create') { - self.addSynapseToMap(synapse); - } else if (data.action == 'update' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - self.updateSynapseOnMap(synapse); - } else if (data.action == 'destroy' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - var edge = graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']); - Metamaps.Control.hideEdge(edge); - } - - return; - } - } - }, - addTopicToMap: function (topic) { - - // TODO - var newPos, tempForT; - Metamaps.Visualize.mGraph.graph.addNode(topic); - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.setData('dim', 1, 'start'); - tempForT.setData('dim', 25, 'end'); - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - Metamaps.Visualize.mGraph.fx.plotNode(tempForT, Metamaps.Visualize.mGraph.canvas); - }, - updateTopicOnMap: function (topic) { - - // TODO - var newPos, tempForT; - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.data = topic.data; - tempForT.name = topic.name; - if (MetamapsModel.showcardInUse === topic.id) { - populateShowCard(tempForT); - } - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 - }); - }, - addSynapseToMap: function (synapse) { - - // TODO - var Node1, Node2, tempForS; - Node1 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[0]); - Node2 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[1]); - Metamaps.Visualize.mGraph.graph.addAdjacence(Node1, Node2, {}); - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(Node1.id, Node2.id); - tempForS.setDataset('start', { - lineWidth: 0.4 - }); - tempForS.setDataset('end', { - lineWidth: 2 - }); - tempForS.data = synapse.data; - Metamaps.Visualize.mGraph.fx.plotLine(tempForS, Metamaps.Visualize.mGraph.canvas); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 - }); - }, - updateSynapseOnMap: function (synapse) { - - // TODO - var k, tempForS, v, wasShowDesc, _ref; - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(synapse.data.$direction[0], synapse.data.$direction[1]); - wasShowDesc = tempForS.data.$showDesc; - _ref = synapse.data; - for (k in _ref) { - v = _ref[k]; - tempForS.data[k] = v; - } - tempForS.data.$showDesc = wasShowDesc; - if (MetamapsModel.edgecardInUse === synapse.data.$id) { // TODO - editEdge(tempForS, false); - } - return Metamaps.Visualize.mGraph.plot(); - } -}; // end Metamaps.Realtime - - -/* - * - * CONTROL - * - */ -Metamaps.Control = { - init: function () { - - }, - selectNode: function (node) { - if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; - node.selected = true; - node.setData('dim', 30, 'current'); - node.eachAdjacency(function (adj) { - Metamaps.Control.selectEdge(adj); - }); - Metamaps.Selected.Nodes.push(node); - }, - deselectAllNodes: function () { - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - var node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.deselectNode(node); - } - Metamaps.Visualize.mGraph.plot(); - }, - deselectNode: function (node) { - delete node.selected; - node.eachAdjacency(function (adj) { - Metamaps.Control.deselectEdge(adj); - }); - node.setData('dim', 25, 'current'); - - //remove the node - Metamaps.Selected.Nodes.splice( - Metamaps.Selected.Nodes.indexOf(node), 1); - }, - deleteSelectedNodes: function () { // refers to deleting topics permanently - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - var node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.deleteNode(node.id); - } - }, - deleteNode: function (nodeid) { // refers to deleting topics permanently - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var id = node.getData('id'); - Metamaps.Control.deselectNode(node); - Metamaps.Topics.get(id).destroy(); - Metamaps.Control.hideNode(nodeid); - }, - removeSelectedNodes: function () { // refers to removing topics permanently from a map - var l = Metamaps.Selected.Nodes.length, - i, - node, - mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - - if (mapperm) { - for (i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.removeNode(node.id); - } - } - }, - removeNode: function (nodeid) { // refers to removing topics permanently from a map - var mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var mappingid = node.getData("mapping").id; - - if (mapperm) { - Metamaps.Control.deselectNode(node); - Metamaps.Mappings.get(mappingid).destroy(); - Metamaps.Control.hideNode(nodeid); - } - }, - hideSelectedNodes: function () { - var l = Metamaps.Selected.Nodes.length, - i, - node; - - for (i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - Metamaps.Control.hideNode(node.id); - } - }, - hideNode: function (nodeid) { - var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - if (nodeid == Metamaps.Visualize.mGraph.root) { // && Metamaps.Visualize.type === "RGraph" - alert("You can't hide this topic, it is the root of your graph."); - return; - } - - Metamaps.Control.deselectNode(node); - - node.setData('alpha', 0, 'end'); - node.eachAdjacency(function (adj) { - adj.setData('alpha', 0, 'end'); - }); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['node-property:alpha', - 'edge-property:alpha' - ], - duration: 500 - }); - setTimeout(function () { - Metamaps.Visualize.mGraph.graph.removeNode(nodeid); - }, 500); - }, - selectEdge: function (edge) { - if (Metamaps.Selected.Edges.indexOf(edge) != -1) return; - edge.setData('showDesc', true, 'current'); - if (!Metamaps.Settings.embed) { - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.selected, - alpha: 1 - }); - } else if (Metamaps.Settings.embed) { - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.selected, - alpha: 1 - }); - } - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:lineWidth:color:alpha'], - duration: 100 - }); - Metamaps.Selected.Edges.push(edge); - }, - deselectAllEdges: function () { - var l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - var edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.deselectEdge(edge); - } - Metamaps.Visualize.mGraph.plot(); - }, - deselectEdge: function (edge) { - edge.setData('showDesc', false, 'current'); - edge.setDataset('end', { - lineWidth: 2, - color: Metamaps.Settings.colors.synapses.normal, - alpha: 0.4 - }); - - if (Metamaps.Mouse.edgeHoveringOver == edge) { - edge.setData('showDesc', true, 'current'); - edge.setDataset('end', { - lineWidth: 4, - color: Metamaps.Settings.colors.synapses.hover, - alpha: 1 - }); - } - - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:lineWidth:color:alpha'], - duration: 100 - }); - - //remove the edge - Metamaps.Selected.Edges.splice( - Metamaps.Selected.Edges.indexOf(edge), 1); - }, - deleteSelectedEdges: function () { // refers to deleting topics permanently - var edge, - l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.deleteEdge(edge); - } - }, - deleteEdge: function (edge) { - - // TODO make it so that you select which one, of multiple possible synapses you want to delete - - //var id = edge.getData("id"); - //Metamaps.Synapses.get(id).destroy(); - //Metamaps.Control.hideEdge(edge); - }, - removeSelectedEdges: function () { - var l = Metamaps.Selected.Edges.length, - i, - edge; - - if (Metamaps.Active.Map) { - for (i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.removeEdge(edge); - } - Metamaps.Selected.Edges = new Array(); - } - }, - removeEdge: function (edge) { - - // TODO make it so that you select which one, of multiple possible synapses you want - - //var mappingid = edge.getData("mappingid"); - //Metamaps.Mappings.get(mappingid).destroy(); - //Metamaps.Control.hideEdge(edge); - }, - hideSelectedEdges: function () { - var edge, - l = Metamaps.Selected.Edges.length, - i; - for (i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - Metamaps.Control.hideEdge(edge); - } - Metamaps.Selected.Edges = new Array(); - }, - hideEdge: function (edge) { - var from = edge.nodeFrom.id; - var to = edge.nodeTo.id; - edge.setData('alpha', 0, 'end'); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ['edge-property:alpha'], - duration: 500 - }); - setTimeout(function () { - Metamaps.Visualize.mGraph.graph.removeAdjacence(from, to); - }, 500); - }, - updateSelectedPermissions: function (permission) { - - var edge, synapse, node, topic; - - Metamaps.GlobalUI.notifyUser('Working...'); - - // variables to keep track of how many nodes and synapses you had the ability to change the permission of - var nCount = 0, - sCount = 0; - - // change the permission of the selected synapses, if logged in user is the original creator - var l = Metamaps.Selected.Edges.length; - for (var i = l - 1; i >= 0; i -= 1) { - edge = Metamaps.Selected.Edges[i]; - synapse = edge.getData('synapses')[0]; - - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - synapse.save({ - permission: permission - }); - sCount++; - } - } - - // change the permission of the selected topics, if logged in user is the original creator - var l = Metamaps.Selected.Nodes.length; - for (var i = l - 1; i >= 0; i -= 1) { - node = Metamaps.Selected.Nodes[i]; - topic = node.getData('topic'); - - if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { - topic.save({ - permission: permission - }); - nCount++; - } - } - - var nString = nCount == 1 ? (nCount.toString() + ' topic and ') : (nCount.toString() + ' topics and '); - var sString = sCount == 1 ? (sCount.toString() + ' synapse') : (sCount.toString() + ' synapses'); - - var message = nString + sString + ' you created updated to ' + permission; - Metamaps.GlobalUI.notifyUser(message); - }, -}; // end Metamaps.Control - - -/* - * - * FILTER - * - */ -Metamaps.Filter = { - filters: { - name: "", - metacode: [], - mappers: [], - synapseTypes: [] - }, - isOpen: false, - timeOut: null, - changing: false, - init: function () { - var self = Metamaps.Filter; - - $(".sidebarFilter").hover(self.open, self.close); - - // initialize scroll bar for filter by metacode, then hide it and position it correctly again - $("#filter_by_metacode").mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } - }); - $('.sidebarFilterBox').hide().css({ - position: 'absolute', - top: '45px', - right: '-36px' - }); - - $('.sidebarFilterBox .showAll').click(self.filterNoMetacodes); - $('.sidebarFilterBox .hideAll').click(self.filterAllMetacodes); - - // toggle visibility of topics with metacodes based on status in the filters list - $('#filter_by_metacode ul li').click(self.toggleMetacode); - }, - open: function () { - var self = Metamaps.Filter; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing) { - self.changing = true; - - $('.sidebarFilterBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.Filter; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - - $('.sidebarFilterBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - filterNoMetacodes: function (e) { - - $('#filter_by_metacode ul li').removeClass('toggledOff'); - - // TODO - /* - showAll(); - - for (var catVis in categoryVisible) { - categoryVisible[catVis] = true; - } - */ - }, - filterAllMetacodes: function (e) { - - $('#filter_by_metacode ul li').addClass('toggledOff'); - - // TODO - /* - hideAll(); - for (var catVis in categoryVisible) { - categoryVisible[catVis] = false; - } - */ - }, - toggleMetacode: function () { - - var category = $(this).children('img').attr('alt'); - - // TODO - /*switchVisible(category); - - // toggle the image and the boolean array value - if (categoryVisible[category] == true) { - $(this).addClass('toggledOff'); - categoryVisible[category] = false; - } else if (categoryVisible[category] == false) { - $(this).removeClass('toggledOff'); - categoryVisible[category] = true; - }*/ - }, - passFilters: function (topic) { - var self = Metamaps.Find; - var filters = self.filters; - - var passesName = filters.name == "" ? true : false, - passesType = filters.type == [] ? true : false; - - //filter by name - if (topic.get('1')[1][0].toLowerCase().indexOf(filters.name) !== -1) { - passesName = true; - } - // filter by type - if (!filters.type == []) { - // get the array of types that your topic 'is' - var metacodes = topic.get('2') ? topic.get('2')[1] : []; - if (_.intersection(filters.type, metacodes).length == 0) passesType = true; - } - - if (passesName && passesType) { - return true; - } else { - return false; - } - } -}; // end Metamaps.Filter - - -/* - * - * LISTENERS - * - */ -Metamaps.Listeners = { - - init: function () { - - $(document).on('keydown', function (e) { - switch (e.which) { - case 13: - Metamaps.JIT.enterKeyHandler(); - e.preventDefault(); - break; - case 27: - Metamaps.JIT.escKeyHandler(); - break; - default: - break; //alert(e.which); - } - }); - - //$(window).resize(function () { - // Metamaps.Visualize.mGraph.canvas.resize($(window).width(), $(window).height()); - //}); - } -}; // end Metamaps.Listeners - - -/* - * - * ORGANIZE - * - */ -Metamaps.Organize = { - init: function () { - - }, - arrange: function (layout, centerNode) { - - - // first option for layout to implement is 'grid', will do an evenly spaced grid with its center at the 0,0 origin - if (layout == 'grid') { - var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); // this will always be an integer, the # of nodes on your graph visualization - var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid - var GRIDSPACE = 400; - var row = 0; - var column = 0; - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (column == numColumns) { - column = 0; - row += 1; - } - var newPos = new $jit.Complex(); - newPos.x = column * GRIDSPACE; - newPos.y = row * GRIDSPACE; - n.setPos(newPos, 'end'); - column += 1; - }); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - } else if (layout == 'grid_full') { - - // this will always be an integer, the # of nodes on your graph visualization - var numNodes = _.size(Metamaps.Visualize.mGraph.graph.nodes); - //var numColumns = Math.floor(Math.sqrt(numNodes)); // the number of columns to make an even grid - //var GRIDSPACE = 400; - var height = Metamaps.Visualize.mGraph.canvas.getSize(0).height; - var width = Metamaps.Visualize.mGraph.canvas.getSize(0).width; - var totalArea = height * width; - var cellArea = totalArea / numNodes; - var ratio = height / width; - var cellWidth = sqrt(cellArea / ratio); - var cellHeight = cellArea / cellWidth; - var row = floor(height / cellHeight); - var column = floor(width / cellWidth); - var totalCells = row * column; - - if (totalCells) - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (column == numColumns) { - column = 0; - row += 1; - } - var newPos = new $jit.Complex(); - newPos.x = column * GRIDSPACE; - newPos.y = row * GRIDSPACE; - n.setPos(newPos, 'end'); - column += 1; - }); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - } else if (layout == 'radial') { - - var centerX = centerNode.getPos().x; - var centerY = centerNode.getPos().y; - centerNode.setPos(centerNode.getPos(), 'end'); - - console.log(centerNode.adjacencies); - var lineLength = 200; - var usedNodes = {}; - usedNodes[centerNode.id] = centerNode; - var radial = function (node, level, degree) { - if (level == 1) { - var numLinksTemp = _.size(node.adjacencies); - var angleTemp = 2 * Math.PI / numLinksTemp; - } else { - angleTemp = 2 * Math.PI / 20 - }; - node.eachAdjacency(function (a) { - var isSecondLevelNode = (centerNode.adjacencies[a.nodeTo.id] != undefined && level > 1); - if (usedNodes[a.nodeTo.id] == undefined && !isSecondLevelNode) { - var newPos = new $jit.Complex(); - newPos.x = level * lineLength * Math.sin(degree) + centerX; - newPos.y = level * lineLength * Math.cos(degree) + centerY; - a.nodeTo.setPos(newPos, 'end'); - usedNodes[a.nodeTo.id] = a.nodeTo; - - radial(a.nodeTo, level + 1, degree); - degree += angleTemp; - }; - }); - }; - radial(centerNode, 1, 0); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - - } else if (layout == 'center_viewport') { - - var lowX = 0, - lowY = 0, - highX = 0, - highY = 0; - var oldOriginX = Metamaps.Visualize.mGraph.canvas.translateOffsetX; - var oldOriginY = Metamaps.Visualize.mGraph.canvas.translateOffsetY; - - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - if (n.id === 1) { - lowX = n.getPos().x; - lowY = n.getPos().y; - highX = n.getPos().x; - highY = n.getPos().y; - }; - if (n.getPos().x < lowX) lowX = n.getPos().x; - if (n.getPos().y < lowY) lowY = n.getPos().y; - if (n.getPos().x > highX) highX = n.getPos().x; - if (n.getPos().y > highY) highY = n.getPos().y; - }); - console.log(lowX, lowY, highX, highY); - var newOriginX = (lowX + highX) / 2; - var newOriginY = (lowY + highY) / 2; - - } else alert('please call function with a valid layout dammit!'); - }, - loadSavedLayout: function (id) { - Metamaps.Visualize.computePositions(); - Metamaps.Visualize.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); - }, -}; // end Metamaps.Organize - - -/* - * - * TOPIC - * - */ -Metamaps.Topic = { - // this function is to retrieve a topic JSON object from the database - // @param id = the id of the topic to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Topics.get(id) == undefined) { - //console.log("Ajax call!"); - if (!callback) { - var e = $.ajax({ - url: "/topics/" + id + ".json", - async: false - }); - Metamaps.Topics.add($.parseJSON(e.responseText)); - return Metamaps.Topics.get(id); - } else { - return $.ajax({ - url: "/topics/" + id + ".json", - success: function (data) { - Metamaps.Topics.add(data); - callback(Metamaps.Topics.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Topics.get(id); - } else { - return callback(Metamaps.Topics.get(id)); - } - } - }, - - /* - * - * - */ - renderTopic: function (mapping, topic, createNewInDB) { - var self = Metamaps.Topic; - - var nodeOnViz, tempPos; - - var newnode = topic.createNode(); - - if (!$.isEmptyObject(Metamaps.Visualize.mGraph.graph.nodes)) { - Metamaps.Visualize.mGraph.graph.addNode(newnode); - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - n.setData("dim", 25, "start"); - n.setData("dim", 25, "end"); - }); - nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - topic.set('node', nodeOnViz); - topic.updateNode(); // links the topic and the mapping to the node - - - nodeOnViz.setData("dim", 1, "start"); - nodeOnViz.setData("dim", 25, "end"); - if (Metamaps.Visualize.type === "RGraph") { - tempPos = new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')); - tempPos = tempPos.toPolar(); - nodeOnViz.setPos(tempPos, "current"); - nodeOnViz.setPos(tempPos, "start"); - nodeOnViz.setPos(tempPos, "end"); - } else if (Metamaps.Visualize.type === "ForceDirected") { - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); - } - if (Metamaps.Create.newTopic.addSynapse) { - Metamaps.Create.newSynapse.topic1id = tempNode.id; - Metamaps.Create.newSynapse.topic2id = nodeOnViz.id; - Metamaps.Create.newSynapse.open(); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - tempNode = null; - tempNode2 = null; - tempInit = false; - } - }); - } else { - Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - - } - }); - } - } else { - Metamaps.Visualize.mGraph.loadJSON(newnode); - nodeOnViz = Metamaps.Visualize.mGraph.graph.getNode(newnode.id); - topic.set('node', nodeOnViz); - topic.updateNode(); // links the topic and the mapping to the node - - nodeOnViz.setData("dim", 1, "start"); - nodeOnViz.setData("dim", 25, "end"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "current"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); - nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); - Metamaps.Visualize.mGraph.fx.plotNode(nodeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Visualize.mGraph.fx.animate({ - modes: ["node-property:dim"], - duration: 500, - onComplete: function () { - - } - }); - } - - if (!Metamaps.Settings.sandbox && createNewInDB) { - if (topic.isNew()) { - topic.save(null, { - success: function (topicModel, response) { - if (Metamaps.Active.Map) { - mapping.save({ topic_id: topicModel.id }); - } - }, - error: function (model, response) { - console.log('error saving topic to database'); - } - }); - } else if (!topic.isNew() && Metamaps.Active.Map) { - mapping.save(); - } - } - }, - createTopicLocally: function () { - var self = Metamaps.Topic; - - var metacode = Metamaps.Metacodes.findWhere({ - name: Metamaps.Create.newTopic.metacode - }); - - var topic = new Metamaps.Backbone.Topic({ - name: Metamaps.Create.newTopic.name, - metacode_id: metacode.id - }); - Metamaps.Topics.add(topic); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Topic", - xloc: Metamaps.Create.newTopic.x, - yloc: Metamaps.Create.newTopic.y, - topic_id: topic.cid - }); - Metamaps.Mappings.add(mapping); - - //these can't happen until the value is retrieved, which happens in the line above - Metamaps.Create.newTopic.hide(); - - self.renderTopic(mapping, topic, true); // this function also includes the creation of the topic in the database - }, - getTopicFromAutocomplete: function (id) { - var self = Metamaps.Topic; - - Metamaps.Create.newTopic.hide(); - - var topic = self.get(id); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Topic", - xloc: Metamaps.Create.newTopic.x, - yloc: Metamaps.Create.newTopic.y, - topic_id: topic.id - }); - Metamaps.Mappings.add(mapping); - - self.renderTopic(mapping, topic, false); - } -}; // end Metamaps.Topic - - -/* - * - * SYNAPSE - * - */ -Metamaps.Synapse = { - // this function is to retrieve a synapse JSON object from the database - // @param id = the id of the synapse to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Synapses.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/synapses/" + id + ".json", - async: false - }); - Metamaps.Synapses.add($.parseJSON(e.responseText)); - return Metamaps.Synapses.get(id); - } else { - return $.ajax({ - url: "/synapses/" + id + ".json", - success: function (data) { - Metamaps.Synapses.add(data); - callback(Metamaps.Synapses.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Synapses.get(id); - } else { - return callback(Metamaps.Synapses.get(id)); - } - } - }, - /* - * - * - */ - renderSynapse: function (mapping, synapse, node1, node2, createNewInDB) { - var self = Metamaps.Synapse; - - var edgeOnViz; - - var newedge = synapse.createEdge(); - - Metamaps.Visualize.mGraph.graph.addAdjacence(node1, node2, newedge.data); - edgeOnViz = Metamaps.Visualize.mGraph.graph.getAdjacence(node1.id, node2.id); - synapse.set('edge', edgeOnViz); - synapse.updateEdge(); // links the topic and the mapping to the node - - Metamaps.Visualize.mGraph.fx.plotLine(edgeOnViz, Metamaps.Visualize.mGraph.canvas); - Metamaps.Control.selectEdge(edgeOnViz); - - if (!Metamaps.Settings.sandbox && createNewInDB) { - if (synapse.isNew()) { - synapse.save(null, { - success: function (synapseModel, response) { - if (Metamaps.Active.Map) { - mapping.save({ synapse_id: synapseModel.id }); - } - }, - error: function (model, response) { - console.log('error saving synapse to database'); - } - }); - } else if (!synapse.isNew() && Metamaps.Active.Map) { - mapping.save(); - } - } - }, - createSynapseLocally: function () { - var self = Metamaps.Synapse, - topic1, - topic2, - node1, - node2, - synapse, - mapping; - - //for each node in this array we will create a synapse going to the position2 node. - var synapsesToCreate = []; - - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); - topic2 = node2.getData('topic'); - - var len = Metamaps.Selected.Nodes.length; - if (len == 0) { - synapsesToCreate[0] = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); - } else if (len > 0) { - synapsesToCreate = Metamaps.Selected.Nodes; - } - - for (var i = 0; i < synapsesToCreate.length; i++) { - node1 = synapsesToCreate[i]; - topic1 = node1.getData('topic'); - synapse = new Metamaps.Backbone.Synapse({ - desc: Metamaps.Create.newSynapse.description, - node1_id: topic1.isNew() ? topic1.cid : topic1.id, - node2_id: topic2.isNew() ? topic2.cid : topic2.id, - }); - Metamaps.Synapses.add(synapse); - - mapping = new Metamaps.Backbone.Mapping({ - category: "Synapse", - synapse_id: synapse.cid - }); - Metamaps.Mappings.add(mapping); - - // this function also includes the creation of the synapse in the database - self.renderSynapse(mapping, synapse, node1, node2, true); - } // for each in synapsesToCreate - - Metamaps.Create.newSynapse.hide(); - }, - getSynapseFromAutocomplete: function (id) { - var self = Metamaps.Synapse, - node1, - node2; - - Metamaps.Create.newSynapse.hide(); - - var synapse = self.get(id); - - var mapping = new Metamaps.Backbone.Mapping({ - category: "Synapse", - synapse_id: synapse.id - }); - Metamaps.Mappings.add(mapping); - - node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); - - self.renderSynapse(mapping, synapse, node1, node2, false); - } -}; // end Metamaps.Synapse - - -/* - * - * MAP - * - */ -Metamaps.Map = { - init: function () { - var self = Metamaps.Map; - - // prevent right clicks on the main canvas, so as to not get in the way of our right clicks - $('#center-container').bind('contextmenu', function (e) { - return false; - }); - - $('.sidebarFork').click(function () { - self.fork(); - }); - - Metamaps.GlobalUI.CreateMap.emptyForkMapForm = $('#fork_map').html(); - - self.InfoBox.init(); - self.CheatSheet.init(); - }, - // this function is to retrieve a map JSON object from the database - // @param id = the id of the map to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Maps.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/maps/" + id + ".json", - async: false - }); - Metamaps.Maps.add($.parseJSON(e.responseText)); - return Metamaps.Maps.get(id); - } else { - return $.ajax({ - url: "/users/" + id + ".json", - success: function (data) { - Metamaps.Maps.add(data); - callback(Metamaps.Maps.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Maps.get(id); - } else { - return callback(Metamaps.Maps.get(id)); - } - } - }, - fork: function () { - Metamaps.GlobalUI.openLightbox('forkmap'); - - var nodes_data = "", - synapses_data = ""; - var synapses_array = new Array(); - Metamaps.Visualize.mGraph.graph.eachNode(function (n) { - //don't add to the map if it was filtered out - // TODO - //if (categoryVisible[n.getData('metacode')] == false) { - // return; - //} - - var x, y; - if (n.pos.x && n.pos.y) { - x = n.pos.x; - y = n.pos.y; - } else { - var x = Math.cos(n.pos.theta) * n.pos.rho; - var y = Math.sin(n.pos.theta) * n.pos.rho; - } - nodes_data += n.id + '/' + x + '/' + y + ','; - n.eachAdjacency(function (adj) { - synapses_array.push(adj.getData("synapses")[0].id); // TODO - }); - }); - - //get unique values only - synapses_array = $.grep(synapses_array, function (value, key) { - return $.inArray(value, synapses_array) === key; - }); - - synapses_data = synapses_array.join(); - nodes_data = nodes_data.slice(0, -1); - - Metamaps.GlobalUI.CreateMap.topicsToMap = nodes_data; - Metamaps.GlobalUI.CreateMap.synapsesToMap = synapses_data; - } -}; - - -/* - * - * CHEATSHEET - * - */ -Metamaps.Map.CheatSheet = { - init: function () { - // tab the cheatsheet - $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); - $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); - } -}; // end Metamaps.Map.CheatSheet - - -/* - * - * INFOBOX - * - */ -Metamaps.Map.InfoBox = { - isOpen: false, - timeOut: null, - changing: false, - selectingPermission: false, - init: function () { - var self = Metamaps.Map.InfoBox; - - // because anyone who can edit the map can change the map title - $('.mapInfoName .best_in_place_name').bind("ajax:success", function () { - var name = $(this).html(); - $('.mapName').html(name); - Metamaps.Active.Map.set('name', name); - }); - - $('.yourMap .mapPermission').click(self.onPermissionClick); - - $("div.index").hover(self.open, self.close); - }, - open: function (event) { - var self = Metamaps.GlobalUI.Account; - - clearTimeout(self.timeOut); - if (!self.isOpen && !self.changing && event.target.className != "openCheatsheet openLightbox") { - self.changing = true; - $('.mapInfoBox').fadeIn(200, function () { - self.changing = false; - self.isOpen = true; - }); - } - }, - close: function () { - var self = Metamaps.GlobalUI.Account; - - self.timeOut = setTimeout(function () { - if (!self.changing) { - self.changing = true; - $('.mapInfoBox').fadeOut(200, function () { - self.changing = false; - self.isOpen = false; - }); - } - }, 500); - }, - onPermissionClick: function () { - var self = Metamaps.Map.InfoBox; - - if (!self.selectingPermission) { - self.selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('commons')) { - $(this).append('
    '); - } else if ($(this).hasClass('public')) { - $(this).append('
    '); - } else if ($(this).hasClass('private')) { - $(this).append('
    '); - } - $('.mapPermission .permissionSelect li').click(self.selectPermission); - } else { - self.selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.mapPermission .permissionSelect').remove(); - } - }, - selectPermission: function () { - var self = Metamaps.Map.InfoBox; - - self.selectingPermission = false; - var permission = $(this).attr('class'); - Metamaps.Active.Map.save({ - permission: permission - }); - $('.mapPermission').removeClass('commons public private minimize').addClass(permission); - $('.mapPermission .permissionSelect').remove(); - event.stopPropagation(); - } -}; // end Metamaps.Map.InfoBox - - -/* - * - * MAPPER - * - */ -Metamaps.Mapper = { - // this function is to retrieve a mapper JSON object from the database - // @param id = the id of the mapper to retrieve - get: function (id, callback) { - // if the desired topic is not yet in the local topic repository, fetch it - if (Metamaps.Mappers.get(id) == undefined) { - if (!callback) { - var e = $.ajax({ - url: "/users/" + id + ".json", - async: false - }); - Metamaps.Mappers.add($.parseJSON(e.responseText)); - return Metamaps.Mappers.get(id); - } else { - return $.ajax({ - url: "/users/" + id + ".json", - success: function (data) { - Metamaps.Mappers.add(data); - callback(Metamaps.Mappers.get(id)); - } - }); - } - } else { - if (!callback) { - return Metamaps.Mappers.get(id); - } else { - return callback(Metamaps.Mappers.get(id)); - } - } - }, -}; // end Metamaps.Mapper \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index cb55f04c..9d17ce88 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -810,38 +810,33 @@ li.accountInvite span { position: fixed; top: -1000px; right: -1000px; - display: block; - /* - position:absolute; - top: 35px; - right:-72px; - display:none; - */ - height: auto; - width: 260px; - background: #000; + position:absolute; + top: 35px; + right:-150px; + display:none; + height: 400px; + width: 320px; + background: #f5f5f5; padding: 10px; border: 1px solid black; font-family: 'LatoLight', helvetica, sans-serif; text-align: center; + color:#3e3e3e; + overflow: scroll; + } -h3.filterByMetacode { - margin-bottom: 10px; +h3.filterBox { text-align: left; float: left; } .sidebarFilterBox span { - float: left; + float: right; background: #15bad4; padding: 1px 4px; border-radius: 2px; margin-left: 5px; cursor: pointer; } -.sidebarFilterBox #filter_by_metacode { - height: 270px; - overflow: hidden; -} .sidebarFilterBox ul { list-style: none; } @@ -852,9 +847,10 @@ h3.filterByMetacode { cursor: pointer; } .sidebarFilterBox li:hover { - background-color: rgba(255, 255, 255, 0.1); + background: #000; } .sidebarFilterBox li img { + background-color: rgba(255, 255, 255, 0.1); width: 45px; height: 45px; margin: 0 auto; @@ -867,6 +863,22 @@ h3.filterByMetacode { .sidebarFilterBox li.toggledOff { opacity: 0.4; } +.sidebarFilterBox h3 { + text-align: left; + text-transform: uppercase; + font-weight: bold; +} +#filter_by_metacode { + border-bottom: 1px solid black; + margin: 5px; +} +#filter_by_mapper { + margin: 5px auto; +} +#filter_by_synapse { + margin: 5px auto; + border-bottom: 1px solid black; +} /* end filter by metacode */ /* collaborate */ @@ -2524,4 +2536,4 @@ span.blue { } .templates { display: none; -} \ No newline at end of file +} diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index a3a1da03..2e2b5e25 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -64,13 +64,14 @@ class MapsController < ApplicationController redirect_to root_url and return end + @allmappers = @map.contributors @alltopics = @map.topics # should limit to topics visible to user @allsynapses = @map.synapses # should also be limited @allmappings = @map.mappings @allmetacodes = Metacode.all respond_to do |format| - format.html { respond_with(@allmetacodes, @allmappings, @allsynapses, @alltopics, @map, @user) } + format.html { respond_with(@allmappers, @allmetacodes, @allmappings, @allsynapses, @alltopics, @map, @user) } format.json { render json: @map } end end diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 82d5cf52..19924710 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -73,6 +73,7 @@ diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb index f74d3c4a..bc2cb821 100644 --- a/app/views/shared/_filterBox.html.erb +++ b/app/views/shared/_filterBox.html.erb @@ -1,6 +1,6 @@ <%# # @file - # this code generates the list of icons in the filter by metacode box in the upper right menu area + # this code generates the list of icons in the filter box in the upper right menu area #%> <% @@ -10,35 +10,76 @@ @metacodelist = '' @mapperlist = '' @synapselist = '' +# There are essentially three functions happening here one to fill data to +#@mappers with all people who have mapped on the selected map, which +#actually gets checked twice once for topics or within @metacodes and once +#for synapses on the map. @synapses get filled with all synapses on the map +#and metacodes is filled with all the metacodes that are being used on the map. + @map.topics.each_with_index do |topic, index| - if @metacodes.index(topic.metacode_id) == nil - @metacodes.push(topic.metacode_id) - @metacodelist += '
  • ' + topic.metacode.id.to_s + '

    ' + topic.metacode.name.downcase + '

  • ' + if @metacodes.index(topic.metacode) == nil + @metacodes.push(topic.metacode) + end + if @mappers.index(topic.user) == nil + @mappers.push(topic.user) end end - - @map.synapses.each_with_index do |synapses, index| - if @synapses.index(synapses.synapse_id) == nil - @synapses.push(synapses.synapse_id) - @synapselist += '
  • ' + synapse.id.to_s + '

    ' + synapse.name.downcase + '

  • ' + @map.synapses.each_with_index do |synapse, index| + if @synapses.index{|s| s.desc == synapse.desc} == nil + @synapses.push(synapse) end - - end -%> + if @mappers.index(synapse.user) == nil + @mappers.push(synapse.user) + end + end -

    Filter By Metacode

    allnone -
    + @metacodes.sort! {|x,y| x.name <=> y.name } + @synapses.sort! {|x,y| x.desc <=> y.desc } + @mappers.sort! {|x,y| x.name <=> y.name } + + @metacodes.each_with_index do |metacode, index| + @metacodelist += '
  • ' + @metacodelist += '' + metacode.name + '' + @metacodelist += '

    ' + metacode.name.downcase + '

  • ' + end + @synapses.each_with_index do |synapse, index| + @synapselist += '
  • ' + @synapselist += 'synapse icon

    ' + synapse.desc + @synapselist += '

  • ' + end + @mappers.each_with_index do |mapper, index| + @mapperlist += '
  • ' + @mapperlist += '' + mapper.name + '' + @mapperlist += '

    ' + mapper.name + '

  • ' + end +%> +
    + +
    +

    metacodes

    all none +
      <%= @metacodelist.html_safe %> -
    +
    - -
    +
    +
    +

    synapses

    all none +
      <%= @synapselist.html_safe %> -
    +
    +
    +
    +

    mappers

    all none +
    +
      + <%= @mapperlist.html_safe %> +
    +
    +
    + +
    -
    -
    diff --git a/app/views/shared/_filterBox.html.erb~ b/app/views/shared/_filterBox.html.erb~ deleted file mode 100644 index e909651a..00000000 --- a/app/views/shared/_filterBox.html.erb~ +++ /dev/null @@ -1,42 +0,0 @@ -<%# - # @file - # this code generates the list of icons in the filter by metacode box in the upper right menu area - #%> - -<% - @mappers = [] - @synapses = [] - @metacodes = [] - @metacodelist = '' - @mapperlist = '' - @synapselist = '' - @map.topics.each_with_index do |topic, index| - if @metacodes.index(topic.metacode_id) == nil - @metacodes.push(topic.metacode_id) - @metacodelist += '
  • ' + topic.metacode.id.to_s + '

    ' + topic.metacode.name.downcase + '

  • ' - end - end - - @map.synapses.each_with_index do |synapses, index| - if @synapses.index(synapses.synapse_id) == nil - @synapses.push(synapses.synapse_id) - @synapselist += '
  • ' + synapse.id.to_s + '

    ' + synapse.name.downcase + '

  • ' - end - - end -%> - -

    Filter By Metacode

    allnone -
    -
    -
      - <%= @metacodelist.html_safe %> -
    -
    - -
    -
      - <%= @synapselist.html_safe %> -
    -
    -
    diff --git a/app/views/shared/_filterbymetacode.html.erb b/app/views/shared/_filterbymetacode.html.erb deleted file mode 100644 index 41ea33f5..00000000 --- a/app/views/shared/_filterbymetacode.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -<%# - # @file - # this code generates the list of icons in the filter by metacode box in the upper right menu area - #%> - - - -
    -
      - <%= @list.html_safe %> -
    -
    -
    \ No newline at end of file From f75c2c1f8a90287cf93e4bbc4903e86ed31c2bfa Mon Sep 17 00:00:00 2001 From: Robert Best Date: Wed, 6 Aug 2014 04:22:06 -0400 Subject: [PATCH 023/600] Added Recenter map, zoom in, zoom out, Zoom to extents and buttons for each. Also, renamed selection function to just SelectWithBox() --- .../javascripts/metamaps/Metamaps.JIT.js | 100 ++++++- app/assets/javascripts/metamaps/Metamaps.js | 2 +- app/assets/stylesheets/application.css | 41 +++ app/views/maps/show.html.erb | 5 + db/schema.rb | 258 +++++++++--------- 5 files changed, 271 insertions(+), 135 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.JIT.js b/app/assets/javascripts/metamaps/Metamaps.JIT.js index 8c6cb11e..41ff23ba 100644 --- a/app/assets/javascripts/metamaps/Metamaps.JIT.js +++ b/app/assets/javascripts/metamaps/Metamaps.JIT.js @@ -8,6 +8,10 @@ Metamaps.JIT = { var self = Metamaps.JIT; self.prepareVizData(); + $(".zoomIn").click(self.zoomIn); + $(".zoomOut").click(self.zoomOut); + $(".centerMap").click(self.centerMap); + $(".zoomExtents").click(self.zoomExtents); }, /** * convert our topic JSON into something JIT can use @@ -307,7 +311,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.selectNodesWithBox(e); + Metamaps.JIT.selectWithBox(e); return; } @@ -331,7 +335,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.selectNodesWithBox(e); + Metamaps.JIT.selectWithBox(e); return; } @@ -897,7 +901,7 @@ Metamaps.JIT = { } return 'nothing'; //case 4? }, // handleSelectionBeforeDragging - selectNodesWithBox: function (e) { + selectWithBox: function (e) { var sX = Metamaps.Mouse.boxStartCoordinates.x, sY = Metamaps.Mouse.boxStartCoordinates.y, @@ -1025,7 +1029,7 @@ Metamaps.JIT = { Metamaps.Mouse.boxStartCoordinates = false; Metamaps.Mouse.boxEndCoordinates = false; Metamaps.Visualize.mGraph.plot(); - }, // selectNodesWithBox + }, // selectWithBox drawSelectBox: function (eventInfo, e) { var ctx = Metamaps.Visualize.mGraph.canvas.getCtx(); @@ -1425,5 +1429,91 @@ Metamaps.JIT = { y: posChild.y }, 13, inv, canvas, 0.3); } - } //renderEdgeArrows + }, //renderEdgeArrows + zoomIn: function () { + Metamaps.Visualize.mGraph.canvas.scale(1.25,1.25); + }, + zoomOut: function () { + Metamaps.Visualize.mGraph.canvas.scale(0.8,0.8); + }, + centerMap: function () { + var canvas = Metamaps.Visualize.mGraph.canvas; + var offsetScale = canvas.scaleOffsetX; + + canvas.scale(1/offsetScale,1/offsetScale); + + var offsetX = canvas.translateOffsetX; + var offsetY = canvas.translateOffsetY; + + canvas.translate(-1*offsetX,-1*offsetY); + }, + zoomExtents: function () { + Metamaps.JIT.centerMap(); + var height = $(document).height(), + width = $(document).width(), + maxX, minX, maxY, minY, counter = 0; + + var nodes = Metamaps.Visualize.mGraph.graph; + + + if(Object.keys(nodes).length >1){ + + + nodes.eachNode(function (n) { + var x = n.pos.x, + y = n.pos.y; + + if (counter == 0){ + maxX = x; + minX = x; + maxY = y; + minY = y; + } + + maxX = Math.max(x,maxX); + maxY = Math.max(y,maxY); + minX = Math.min(x,minX); + minY = Math.min(y,minY); + + counter++; + }); + + var spanX = maxX - minX; + var spanY = maxY - minY; + var ratioX = spanX / width; + var ratioY = spanY / height; + + var newRatio = Math.max(ratioX,ratioY); + + var canvas = Metamaps.Visualize.mGraph.canvas; + + canvas.scale(1/newRatio*0.9,1/newRatio*0.9); + + counter = 0; + + nodes.eachNode(function (n) { + var x = n.pos.x, + y = n.pos.y; + + if (counter == 0){ + maxX = x; + minX = x; + maxY = y; + minY = y; + } + + maxX = Math.max(x,maxX); + maxY = Math.max(y,maxY); + minX = Math.min(x,minX); + minY = Math.min(y,minY); + + counter++; + }); + + var cogX = (maxX + minX)/2; + var cogY = (maxY + minY)/2; + + canvas.translate(-1* cogX, -1* cogY); + } + } }; \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 61dd77f5..820c6395 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -2060,7 +2060,7 @@ Metamaps.Filter = { var addedSynapses = []; Metamaps.Synapses.each(function(synapse) { - if (newSynapsesList.indexOf(synapse.get('desc')) === -1) { + if (synapse.get('desc') && newSynapsesList.indexOf(synapse.get('desc')) === -1) { newSynapsesList.push(synapse.get('desc').toString()); } }); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 9d17ce88..d7b824bb 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -791,6 +791,47 @@ li.accountInvite span { width: 35px; height: 35px; } + +.zoomIn { + position: absolute; + bottom: 100px; + right: 20px; + z-index: 200; + width: 35px; + height: 35px; + background: blue; +} + +.zoomOut { + position: absolute; + bottom: 60px; + right: 20px; + z-index: 200; + width: 35px; + height: 35px; + background: blue; +} + +.centerMap { + position: absolute; + bottom: 140px; + right: 20px; + z-index: 200; + width: 35px; + height: 35px; + background: blue; +} + +.zoomExtents { + position: absolute; + bottom: 180px; + right: 20px; + z-index: 200; + width: 35px; + height: 35px; + background: blue; +} + .sidebarFilter.loggedout { right: 35px; } diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 19924710..77cb06f9 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -42,6 +42,11 @@
    +
    +
    +
    -
    +
    C
    +
    E
    +
    diff --git a/db/schema.rb b/db/schema.rb index ec86b421..c3fce2b2 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,129 +1,129 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140707161810) do - - create_table "in_metacode_sets", :force => true do |t| - t.integer "metacode_id" - t.integer "metacode_set_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" - add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" - - create_table "mappings", :force => true do |t| - t.text "category" - t.integer "xloc" - t.integer "yloc" - t.integer "topic_id" - t.integer "synapse_id" - t.integer "map_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "maps", :force => true do |t| - t.text "name" - t.boolean "arranged" - t.text "desc" - t.text "permission" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "featured" - end - - create_table "metacode_sets", :force => true do |t| - t.string "name" - t.text "desc" - t.integer "user_id" - t.boolean "mapperContributed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" - - create_table "metacodes", :force => true do |t| - t.text "name" - t.string "icon" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "synapses", :force => true do |t| - t.text "desc" - t.text "category" - t.text "weight" - t.text "permission" - t.integer "node1_id" - t.integer "node2_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "topics", :force => true do |t| - t.text "name" - t.text "desc" - t.text "link" - t.text "permission" - t.integer "user_id" - t.integer "metacode_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - t.string "audio_file_name" - t.string "audio_content_type" - t.integer "audio_file_size" - t.datetime "audio_updated_at" - end - - create_table "users", :force => true do |t| - t.string "name" - t.string "email" - t.text "settings" - t.string "code", :limit => 8 - t.string "joinedwithcode", :limit => 8 - t.string "crypted_password" - t.string "password_salt" - t.string "persistence_token" - t.string "perishable_token" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "encrypted_password", :limit => 128, :default => "" - t.string "remember_token" - t.datetime "remember_created_at" - t.string "reset_password_token" - t.datetime "last_sign_in_at" - t.string "last_sign_in_ip" - t.integer "sign_in_count", :default => 0 - t.datetime "current_sign_in_at" - t.string "current_sign_in_ip" - t.datetime "reset_password_sent_at" - t.boolean "admin" - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - end - - add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true - -end +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140707161810) do + + create_table "in_metacode_sets", :force => true do |t| + t.integer "metacode_id" + t.integer "metacode_set_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" + add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" + + create_table "mappings", :force => true do |t| + t.text "category" + t.integer "xloc" + t.integer "yloc" + t.integer "topic_id" + t.integer "synapse_id" + t.integer "map_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "maps", :force => true do |t| + t.text "name" + t.boolean "arranged" + t.text "desc" + t.text "permission" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "featured" + end + + create_table "metacode_sets", :force => true do |t| + t.string "name" + t.text "desc" + t.integer "user_id" + t.boolean "mapperContributed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" + + create_table "metacodes", :force => true do |t| + t.text "name" + t.string "icon" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "synapses", :force => true do |t| + t.text "desc" + t.text "category" + t.text "weight" + t.text "permission" + t.integer "node1_id" + t.integer "node2_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "topics", :force => true do |t| + t.text "name" + t.text "desc" + t.text "link" + t.text "permission" + t.integer "user_id" + t.integer "metacode_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + t.string "audio_file_name" + t.string "audio_content_type" + t.integer "audio_file_size" + t.datetime "audio_updated_at" + end + + create_table "users", :force => true do |t| + t.string "name" + t.string "email" + t.text "settings" + t.string "code", :limit => 8 + t.string "joinedwithcode", :limit => 8 + t.string "crypted_password" + t.string "password_salt" + t.string "persistence_token" + t.string "perishable_token" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "encrypted_password", :limit => 128, :default => "" + t.string "remember_token" + t.datetime "remember_created_at" + t.string "reset_password_token" + t.datetime "last_sign_in_at" + t.string "last_sign_in_ip" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.string "current_sign_in_ip" + t.datetime "reset_password_sent_at" + t.boolean "admin" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + end + + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + +end From e7a445423dd6dec34f398be4017389422e4976de Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 6 Aug 2014 10:09:01 -0400 Subject: [PATCH 024/600] work in progress on explore maps pages --- .../javascripts/metamaps/Metamaps.GlobalUI.js | 8 +++-- .../javascripts/metamaps/Metamaps.Router.js | 25 +++++++++---- .../javascripts/metamaps/Metamaps.Views.js | 26 ++++++++++++++ app/assets/javascripts/metamaps/metamaps.js | 6 ++-- app/controllers/maps_controller.rb | 8 ++--- app/views/layouts/_templates.html.erb | 35 ++++++++++++++++++- app/views/layouts/application.html.erb | 2 +- app/views/main/home.html.erb | 2 +- app/views/maps/index.html.erb | 8 ++--- config/routes.rb | 6 ++-- 10 files changed, 100 insertions(+), 26 deletions(-) create mode 100644 app/assets/javascripts/metamaps/Metamaps.Views.js diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 3e517193..33a1d5e0 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -82,9 +82,13 @@ Metamaps.GlobalUI = { $('.alert.metamaps').delay(10000).fadeOut('fast'); // initialize global backbone models and collections - Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper); + if (Metamaps.Active.Mapper) Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper); Metamaps.Mappers = new Metamaps.Backbone.MapperCollection([Metamaps.Active.Mapper]); - Metamaps.Maps = new Metamaps.Backbone.MapsCollection(); + Metamaps.Maps = {}; + Metamps.Maps.Mine = new Metamaps.Backbone.MapsCollection(); + Metamps.Maps.Featured = new Metamaps.Backbone.MapsCollection(); + Metamps.Maps.Active = new Metamaps.Backbone.MapsCollection(); + Metamps.Maps.New = new Metamaps.Backbone.MapsCollection(); }, openLightbox: function (which) { var self = Metamaps.GlobalUI; diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 7ecb49b3..f1dfe1ec 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -5,18 +5,29 @@ "explore/:section": "explore", // #explore/active "maps/:id": "maps" // #maps/7 }, + home: function () { + + document.title = 'My Maps | Metamaps'; + $('#cards').show(); + }, explore: function (section) { - console.log(section); + + var capitalize = section.charAt(0).toUpperCase() + section.slice(1); + + document.title = 'Explore ' + capitalize + ' Maps | Metamaps'; + //$('#cards').hide(); }, maps: function (id) { - console.log(id); + + document.title = 'Map ' + id + ' | Metamaps'; + $('#cards').hide(); } }); Metamaps.Router = new Router(); Metamaps.Router.init = function () { - /*Backbone.history.start({ + Backbone.history.start({ pushState: true, - root: '' + root: '/' }); console.log('router started'); $(document).on("click", "a:not([data-bypass])", function (evt) { @@ -25,11 +36,13 @@ attr: $(this).attr("href") }; var root = location.protocol + "//" + location.host + Backbone.history.options.root; - + + if (href.prop && href.prop === root) href.attr = "" + if (href.prop && href.prop.slice(0, root.length) === root) { evt.preventDefault(); Backbone.history.navigate(href.attr, true); } - });*/ + }); } })(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/Metamaps.Views.js b/app/assets/javascripts/metamaps/Metamaps.Views.js new file mode 100644 index 00000000..396f6beb --- /dev/null +++ b/app/assets/javascripts/metamaps/Metamaps.Views.js @@ -0,0 +1,26 @@ +(function () { + Metamaps.Views = {}; + + Metamaps.Views.MapCard = Backbone.View.extend({ + + tagName: "div", + + className: "map", + + events: { + "click .icon": "open", + "click .button.edit": "openEditDialog", + "click .button.delete": "destroy" + }, + + initialize: function () { + this.listenTo(this.model, "change", this.render); + }, + + render: function () { + + } + + }); + +})(); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/metamaps.js b/app/assets/javascripts/metamaps/metamaps.js index ea0addf8..08b594d5 100644 --- a/app/assets/javascripts/metamaps/metamaps.js +++ b/app/assets/javascripts/metamaps/metamaps.js @@ -1632,9 +1632,8 @@ Metamaps.Control = { }, deleteNode: function (nodeid) { // refers to deleting topics permanently var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var id = node.getData('id'); Metamaps.Control.deselectNode(node); - Metamaps.Topics.get(id).destroy(); + Metamaps.Topics.get(nodeid).destroy(); Metamaps.Control.hideNode(nodeid); }, removeSelectedNodes: function () { // refers to removing topics permanently from a map @@ -1653,11 +1652,10 @@ Metamaps.Control = { removeNode: function (nodeid) { // refers to removing topics permanently from a map var mapperm = Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); var node = Metamaps.Visualize.mGraph.graph.getNode(nodeid); - var mappingid = node.getData("mapping").id; if (mapperm) { Metamaps.Control.deselectNode(node); - Metamaps.Mappings.get(mappingid).destroy(); + node.getData('mapping').destroy(); Metamaps.Control.hideNode(nodeid); } }, diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index a3a1da03..35dea28e 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -12,22 +12,22 @@ class MapsController < ApplicationController # GET /maps/mappers/:id def index - if request.path == "/maps" + if request.path == "/explore" redirect_to activemaps_url and return end @current = current_user @user = nil - if request.path =="/maps/active" + if request.path =="/explore/active" @maps = Map.order("updated_at DESC").limit(20) @request = "active" - elsif request.path =="/maps/featured" + elsif request.path =="/explore/featured" @maps = Map.order("name ASC").find_all_by_featured(true) @request = "featured" - elsif request.path == "/maps/new" + elsif request.path == "/explore/new" @maps = Map.order("created_at DESC").limit(20) @request = "new" diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index fc6b241f..85392e8c 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -4,7 +4,40 @@ #%>
    - + + + + - - - -<%= csrf_meta_tags %> - + + + <%=h yield(:title) %> + <%= csrf_meta_tags %> + + + <%= stylesheet_link_tag "application", :media => "all" %> + <%= javascript_include_tag "application" %> + <%= javascript_include_tag "compileMapPages" %> + + + + + + + + + + + + + + + + + + + -" > + + <% if notice %>

    <%= notice %>

    @@ -33,37 +50,37 @@ <%= content_tag :div, class: authenticated? ? "main authenticated" : "main unauthenticated" do %> -
    " id="wrapper"> - -
    - -
    - -
    -
    - -
    -
    + <% classes = action_name == "home" ? "homePage" : "" + classes += action_name == "home" && authenticated? ? " explorePage" : "" + classes += controller_name == "maps" && action_name == "index" ? " explorePage" : "" + classes += controller_name == "maps" && action_name == "show" ? " mapPage" : "" + %> -
    -
    - <% if user && user.image %><%= image_tag user.image.url(:thumb), :size => "35x35" %><% end %> -
    -
    - <%= render :partial => 'layouts/account' %> -
    -
    +
    + + <%= render :partial => 'layouts/upperelements' %> + <%= render :partial => 'layouts/exploremaps' %> +
    <%= yield %>
    + + +
    <% if authenticated? %> -
    + <% # for creating and pulling in topics and synapses %> + <%= render :partial => 'maps/newtopic' %> + <%= render :partial => 'maps/newsynapse' %> + <% # for populating the change metacode list on the topic card %> + <%= render :partial => 'shared/metacodeoptions' %> <% end %> + <%= render :partial => 'layouts/lowermapelements' %> - <%= yield %> +
    +
    -
    - - -
    <% elsif authenticated? %> -
    - Displaying: - -
    -
    + <% content_for :title, "My Maps | Metamaps" %> -
    -
    - <% @maps.each do |map| %> - <%= render map %> - <% end %> -
    -
    -
    - - -<% end %> - \ No newline at end of file + +<% end %> \ No newline at end of file diff --git a/app/views/maps/_mapinfobox.html (copy).erb b/app/views/maps/_mapinfobox.html (copy).erb new file mode 100644 index 00000000..1c808a4e --- /dev/null +++ b/app/views/maps/_mapinfobox.html (copy).erb @@ -0,0 +1,52 @@ +<%# + # Partial rendering form for a new topic on a map + # This code is called when viewing a metamap in show.html.erb in the views/maps folder + #%> +
    <%= @map.authorize_to_edit(user) ? " canEdit" : "" %>"> + +
    <%= best_in_place @map, :name, :type => :input, :classes => 'best_in_place_name' %>
    + +
    +
    + <%= @map.contributors.count %> + <% contributorList = '' + @map.contributors.each_with_index do |c, index| + comma = (index+1) == @map.contributors.count ? '' : ', ' + contributorList += c.name + comma + end + if @map.contributors.count == 0 + contributorList = 'No one has added anything yet.' + end %> +
    <%= contributorList %>
    +
    +
    + <%= @map.topics.count %> +
    +
    + <%= @map.synapses.count %> +
    +
    + <% if @map.user == user %> +
    As the creator, you can change the permission of this map, but the permissions of the topics and synapses on it must be changed independently.
    + <% end %> +
    +
    +
    + + <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%> +
    + <%= best_in_place @map, :desc, :type => :textarea, :nil => "Click to add description.", :classes => 'best_in_place_desc' %> +
    + <% end %> + +
    +

    Created by <%= @map.user == user ? "you" : @map.user.name %> on <%= @map.created_at.strftime("%m/%d/%Y") %>

    +

    Last edited <%= @map.updated_at.strftime("%m/%d/%Y") %>

    +
    + +
    + <% if @map.user == user %> + <%= link_to 'Delete', map_path(@map), :class => 'delete', :confirm => 'Delete this map (nodes and synapses will remain)?', :method => :delete %> + <% end %> +
    +
    diff --git a/app/views/maps/_mapinfobox.html.erb b/app/views/maps/_mapinfobox.html.erb index 1c808a4e..0d7da05a 100644 --- a/app/views/maps/_mapinfobox.html.erb +++ b/app/views/maps/_mapinfobox.html.erb @@ -2,7 +2,8 @@ # Partial rendering form for a new topic on a map # This code is called when viewing a metamap in show.html.erb in the views/maps folder #%> -
    <%= @map.authorize_to_edit(user) ? " canEdit" : "" %>"> +<% if @map %> +
    <%= @map.authorize_to_edit(user) ? " canEdit" : "" %>">
    <%= best_in_place @map, :name, :type => :input, :classes => 'best_in_place_name' %>
    @@ -50,3 +51,39 @@ <% end %>
    + +<% else %> +
    + +
    {{name}}
    + +
    +
    + {{contributor_count}} +
    {{contributor_list}}
    +
    +
    + {{topic_count}} +
    +
    + {{synapse_count}} +
    +
    + {{map_creator_tip}} +
    +
    +
    +
    + {{desc}} +
    + +
    +

    Created by {{user_name}} on {{created_at}}

    +

    Last edited {{updated_at}}

    +
    + +
    + {{delete}} +
    +
    +<% end %> \ No newline at end of file diff --git a/app/views/maps/_newsynapse.html.erb b/app/views/maps/_newsynapse.html.erb index 10f77fd3..1c190324 100644 --- a/app/views/maps/_newsynapse.html.erb +++ b/app/views/maps/_newsynapse.html.erb @@ -1,10 +1,3 @@ -<%# - # @file - # partial generating a new synapse - # TODO: Where is this code used? - #%> -
    - <%= form_for Synapse.new, url: synapses_url, remote: true do |form| %> - <%= form.text_field :desc, :placeholder => "describe the connection..." %> - <% end %> -
    +<%= form_for Synapse.new, url: synapses_url, remote: true do |form| %> +<%= form.text_field :desc, :placeholder => "describe the connection..." %> +<% end %> diff --git a/app/views/maps/_newtopic.html.erb b/app/views/maps/_newtopic.html.erb index de307a22..048f453f 100644 --- a/app/views/maps/_newtopic.html.erb +++ b/app/views/maps/_newtopic.html.erb @@ -1,8 +1,3 @@ -<%# - # Partial rendering form for a new topic on a map - # This code is called when viewing a metamap in show.html.erb in the views/maps folder - #%> -
    <%= form_for Topic.new, url: topics_url, remote: true do |form| %>
    @@ -35,4 +30,3 @@ <% end %> <% end %> -
    diff --git a/app/views/maps/index.html.erb b/app/views/maps/index.html.erb index 3c9adeea..92f17142 100644 --- a/app/views/maps/index.html.erb +++ b/app/views/maps/index.html.erb @@ -6,55 +6,21 @@ <% content_for :title, "Explore Maps | Metamaps" %> -
    - Displaying: -
    - <% if @request == "other" %> - By <%= @user.name %> / - <% end %> - <% if @request == "topic" %> - Maps Containing Topic <%= @topic.id.to_s %>: "<%= @topic.name.truncate(30) %>" - <% end %> - - <% if @request != "topic" %> - <% if authenticated? %> - ">My Maps / - <% end %> - ">Recently Active / - ">Featured / - ">Newest First - <% end %> -
    -
    -
    - -
    -
    - <% @maps.each do |map| %> - <%= render map %> - <% end %> -
    -
    -
    - diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 77cb06f9..8379f429 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -6,77 +6,9 @@ <% content_for :title, @map.name + " | Metamaps" %> -
    - -
    - - -<% if authenticated? %> -
    -
    -
    -
    -
    -<% if @map.permission == "commons" || @map.user == user %> -
    -
    -
    -

    Realtime:

    - ON -
    -
    -
      -
    • - <%= user.name %> (me) -
    • -
    -
    -
    -
    -<% end %> -<% end %> -
    -
    -
    - <%= render :partial => 'shared/filterBox' %> -
    -
    - -
    +
    -
    -
    -
    C
    -
    E
    - -
    -
    - -
    - <%= render :partial => 'maps/mapinfobox' %> -
    - -
    -
    -
    -
    -
    -
    -
    - -<% if authenticated? %> - -<% # add these if you have edit permissions on the map %> -<% if @map.permission == "commons" || @map.user == user %> -<% # for creating and pulling in topics and synapses %> -<%= render :partial => 'newtopic' %> -<%= render :partial => 'newsynapse' %> -<% end %> - -<% # for populating the change metacode list on the topic card %> -<%= render :partial => 'shared/metacodeoptions' %> -<% end %> - - \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index c3fce2b2..ec86b421 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,129 +1,129 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140707161810) do - - create_table "in_metacode_sets", :force => true do |t| - t.integer "metacode_id" - t.integer "metacode_set_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" - add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" - - create_table "mappings", :force => true do |t| - t.text "category" - t.integer "xloc" - t.integer "yloc" - t.integer "topic_id" - t.integer "synapse_id" - t.integer "map_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "maps", :force => true do |t| - t.text "name" - t.boolean "arranged" - t.text "desc" - t.text "permission" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "featured" - end - - create_table "metacode_sets", :force => true do |t| - t.string "name" - t.text "desc" - t.integer "user_id" - t.boolean "mapperContributed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" - - create_table "metacodes", :force => true do |t| - t.text "name" - t.string "icon" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "synapses", :force => true do |t| - t.text "desc" - t.text "category" - t.text "weight" - t.text "permission" - t.integer "node1_id" - t.integer "node2_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "topics", :force => true do |t| - t.text "name" - t.text "desc" - t.text "link" - t.text "permission" - t.integer "user_id" - t.integer "metacode_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - t.string "audio_file_name" - t.string "audio_content_type" - t.integer "audio_file_size" - t.datetime "audio_updated_at" - end - - create_table "users", :force => true do |t| - t.string "name" - t.string "email" - t.text "settings" - t.string "code", :limit => 8 - t.string "joinedwithcode", :limit => 8 - t.string "crypted_password" - t.string "password_salt" - t.string "persistence_token" - t.string "perishable_token" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "encrypted_password", :limit => 128, :default => "" - t.string "remember_token" - t.datetime "remember_created_at" - t.string "reset_password_token" - t.datetime "last_sign_in_at" - t.string "last_sign_in_ip" - t.integer "sign_in_count", :default => 0 - t.datetime "current_sign_in_at" - t.string "current_sign_in_ip" - t.datetime "reset_password_sent_at" - t.boolean "admin" - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - end - - add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true - -end +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140707161810) do + + create_table "in_metacode_sets", :force => true do |t| + t.integer "metacode_id" + t.integer "metacode_set_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" + add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" + + create_table "mappings", :force => true do |t| + t.text "category" + t.integer "xloc" + t.integer "yloc" + t.integer "topic_id" + t.integer "synapse_id" + t.integer "map_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "maps", :force => true do |t| + t.text "name" + t.boolean "arranged" + t.text "desc" + t.text "permission" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "featured" + end + + create_table "metacode_sets", :force => true do |t| + t.string "name" + t.text "desc" + t.integer "user_id" + t.boolean "mapperContributed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" + + create_table "metacodes", :force => true do |t| + t.text "name" + t.string "icon" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "synapses", :force => true do |t| + t.text "desc" + t.text "category" + t.text "weight" + t.text "permission" + t.integer "node1_id" + t.integer "node2_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "topics", :force => true do |t| + t.text "name" + t.text "desc" + t.text "link" + t.text "permission" + t.integer "user_id" + t.integer "metacode_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + t.string "audio_file_name" + t.string "audio_content_type" + t.integer "audio_file_size" + t.datetime "audio_updated_at" + end + + create_table "users", :force => true do |t| + t.string "name" + t.string "email" + t.text "settings" + t.string "code", :limit => 8 + t.string "joinedwithcode", :limit => 8 + t.string "crypted_password" + t.string "password_salt" + t.string "persistence_token" + t.string "perishable_token" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "encrypted_password", :limit => 128, :default => "" + t.string "remember_token" + t.datetime "remember_created_at" + t.string "reset_password_token" + t.datetime "last_sign_in_at" + t.string "last_sign_in_ip" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.string "current_sign_in_ip" + t.datetime "reset_password_sent_at" + t.boolean "admin" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + end + + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + +end From 341f9b9bdd3a70f8584a9860ac6ac4deb87b542b Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:13:25 -0400 Subject: [PATCH 035/600] home page styling --- .../javascripts/metamaps/Metamaps.Router.js | 16 ++- app/assets/javascripts/src/main.js | 50 ++++++++ app/assets/stylesheets/clean.css | 61 +++++++++- app/views/layouts/application.html.erb | 2 +- app/views/main/home.html.erb | 111 ++++-------------- app/views/main/requestinvite.html.erb | 3 +- config/application.rb | 2 + 7 files changed, 146 insertions(+), 99 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 30cbe567..d40666c1 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -22,10 +22,12 @@ // all this only for the logged in home page if (Metamaps.Active.Mapper) { + + Metamaps.Famous.yield.hide(); + Metamaps.Famous.explore.set('mine'); Metamaps.Famous.explore.show(); - $('.yield').fadeOut(300); $('.mapsWrapper').fadeIn(300); Metamaps.GlobalUI.Search.open(); @@ -41,12 +43,14 @@ } // logged out home page else { + + Metamaps.Famous.yield.show(); + Metamaps.Famous.explore.hide(); Metamaps.GlobalUI.Search.unlock(); Metamaps.GlobalUI.Search.close(0, true); - $('.yield').fadeIn(300); $('.mapsWrapper').fadeOut(300); } @@ -79,8 +83,9 @@ Metamaps.GlobalUI.Search.open(); Metamaps.GlobalUI.Search.lock(); - - $('.yield').fadeOut(300); + + Metamaps.Famous.yield.hide(); + $('.mapsWrapper').fadeIn(300); Metamaps.Famous.explore.set(section); @@ -103,9 +108,8 @@ $('.wrapper').removeClass('homePage explorePage'); $('.wrapper').addClass('mapPage'); - $('.yield').fadeOut(300); + Metamaps.Famous.yield.hide(); $('.mapsWrapper').fadeOut(300); - Metamaps.Famous.explore.hide(); // clear the visualization, if there was one, before showing its div again diff --git a/app/assets/javascripts/src/main.js b/app/assets/javascripts/src/main.js index b3f7c6b8..05f5e160 100644 --- a/app/assets/javascripts/src/main.js +++ b/app/assets/javascripts/src/main.js @@ -56,6 +56,56 @@ define(function(require, exports, module) { }; f.mainContext.add(f.viz.mod).add(f.viz.surf); + + // CONTENT / OTHER PAGES + f.yield = {}; + f.yield.surf = new Surface({ + size: [true, true], + classes: [], + properties: { + display: 'none' + } + }); + var loadYield = function () { + f.loadYield(); + f.yield.surf.removeListener('deploy',loadYield); + }; + if (!(Metamaps.currentSection === "map" || + Metamaps.currentSection === "explore" || + (Metamaps.currentSection === "" && Metamaps.Active.Mapper) )) { + f.yield.surf.on('deploy', loadYield); + } + f.yield.mod = new Modifier({ + origin: [0.5, 0.5], + opacity: 0 + }); + f.yield.show = function () { + f.yield.surf.setProperties({ "display":"block" }); + f.yield.mod.setOpacity( + 1, + { duration: 300 } + ); + }; + f.yield.hide = function () { + f.yield.mod.setOpacity( + 0, + { duration: 300 }, + function() { + f.yield.surf.setProperties({"display": "none"}); + } + ); + }; + f.mainContext.add(f.yield.mod).add(f.yield.surf); + + f.loadYield = function () { + Metamaps.Loading.loader.hide(); + var yield = document.getElementById('yield').innerHTML; + f.yield.surf.setContent(yield); + f.yield.surf.deploy(f.yield.surf._currTarget); + f.yield.show(); + }; + + // EXPLORE MAPS BAR f.explore = {}; f.explore.surf = new Surface({ diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index d46a1d4e..ea67b21b 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -22,7 +22,7 @@ margin:0; } -.yield { +#yield { display:none; } @@ -485,6 +485,65 @@ /* end upperRightUI */ + +/* homepage */ + +.homeWrapper { + width: 560px; + margin: 0 auto; + color: #424242; +} + +.homeTitle { + font-size: 48px; + line-height: 48px; + text-align: center; + margin-bottom: 20px; +} + +.homeIntro { + font-size: 23px; + line-height: 26px; + text-align: justify; + margin-bottom: 20px; +} + +.homeWrapper .green { + color: #4fc059; +} + +.homeVideo { + margin-bottom: 20px; +} + +.callToAction a { + display: block; + width: 220px; + height: 12px; + padding: 16px 0; + text-align: center; + border-radius: 2px; + font-size: 12px; + box-shadow: 0px 1px 1.5px rgba(0,0,0,0.12), 0 1px 1px rgba(0,0,0,0.24); + margin: 0 auto; + color: #FFFFFF; +} +.callToAction .requestInviteCTA { + background-color: #4fc059; + margin-bottom: 15px; +} +.callToAction .requestInviteCTA:hover { + background-color: #49ad4e; +} +.callToAction .exploreFeaturedCTA { + background-color: #a354cd; +} +.callToAction .exploreFeaturedCTA:hover { + background-color: #9150bc; +} + +/* end home page */ + /* infoAndHelp */ .infoAndHelp { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 7099fce3..dda7faf1 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -61,7 +61,7 @@ <%= render :partial => 'layouts/upperelements' %> <%= render :partial => 'layouts/exploremaps' %> -
    <%= yield %>
    + <%= yield %>
    diff --git a/app/views/main/home.html.erb b/app/views/main/home.html.erb index 95b0a7d2..993edbc2 100644 --- a/app/views/main/home.html.erb +++ b/app/views/main/home.html.erb @@ -5,100 +5,31 @@ #%> <% if !authenticated? %> - -<% content_for :title, "Home | Metamaps" %> - -
    - Image 01 -
    - -
    - -
    -
    -
    - Welcome to Metamaps -
    - - -
    - a home on the web for -
      -
    • building shared knowledge
    • -
    • learning
    • -
    • visioning
    • -
    • conversing
    • -
    • collaborating
    • -
    • sensemaking
    • -
    • innovating
    • -
    • designing
    • -
    • playing
    • -
    • exploring
    • -
    -
    -
    -
    -
    - -

    - Request Invite - Explore Featured -

    - explore featured maps from our community -
    -

    - -
    -
    -
    - <% @maps.each_with_index do |map, index| %> - <% first = index == 0 ? true : false %> - <%= render :partial => 'main/homemap', :locals => { :map => map, :first => first } %> - <% end %> -
    -
    -
    -
    -
    -
    - - - + <% content_for :title, "Home | Metamaps" %> +
    +
    +
    EXPERIENCE METAMAPS
    +
    + metamaps.cc is a free and open source platform. It enables individuals, communities, and organizations to build and visualize their shared knowledge and unlock their collective intelligence... +
    + + +
    +
    + <% elsif authenticated? %> - <% content_for :title, "My Maps | Metamaps" %> - - + <% end %> \ No newline at end of file diff --git a/app/views/main/requestinvite.html.erb b/app/views/main/requestinvite.html.erb index b7f0841a..4f0f2b18 100644 --- a/app/views/main/requestinvite.html.erb +++ b/app/views/main/requestinvite.html.erb @@ -6,11 +6,12 @@ <% content_for :title, "Request Invite | Metamaps" %> +
    +
    diff --git a/config/application.rb b/config/application.rb index c87ef5b7..d84d0c62 100644 --- a/config/application.rb +++ b/config/application.rb @@ -53,6 +53,8 @@ module Metamaps # Enable the asset pipeline config.assets.enabled = true config.assets.initialize_on_precompile = false + + config.assets.paths << "#{Rails.root}/app/assets/javascripts/src" # Version of your assets, change this if you want to expire all your assets config.assets.version = '2.0' From afed3657c205063e440a146a3f655da33c3ac7e8 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:15:01 -0400 Subject: [PATCH 036/600] removed vendor plugins --- .../assets/images/ui-bg_flat_0_aaaaaa_40x100.png | Bin .../assets/images/ui-bg_flat_75_ffffff_40x100.png | Bin .../assets/images/ui-bg_glass_55_fbf9ee_1x400.png | Bin .../assets/images/ui-bg_glass_65_ffffff_1x400.png | Bin .../assets/images/ui-bg_glass_75_dadada_1x400.png | Bin .../assets/images/ui-bg_glass_75_e6e6e6_1x400.png | Bin .../assets/images/ui-bg_glass_95_fef1ec_1x400.png | Bin .../images/ui-bg_highlight-soft_75_cccccc_1x100.png | Bin .../assets/images/ui-icons_222222_256x240.png | Bin .../assets/images/ui-icons_2e83ff_256x240.png | Bin .../assets/images/ui-icons_454545_256x240.png | Bin .../assets/images/ui-icons_888888_256x240.png | Bin .../assets/images/ui-icons_cd0a0a_256x240.png | Bin vendor/assets/javascripts/.gitkeep | 0 vendor/assets/stylesheets/.gitkeep | 0 vendor/plugins/.gitkeep | 0 16 files changed, 0 insertions(+), 0 deletions(-) rename {vendor => app}/assets/images/ui-bg_flat_0_aaaaaa_40x100.png (100%) rename {vendor => app}/assets/images/ui-bg_flat_75_ffffff_40x100.png (100%) rename {vendor => app}/assets/images/ui-bg_glass_55_fbf9ee_1x400.png (100%) rename {vendor => app}/assets/images/ui-bg_glass_65_ffffff_1x400.png (100%) rename {vendor => app}/assets/images/ui-bg_glass_75_dadada_1x400.png (100%) rename {vendor => app}/assets/images/ui-bg_glass_75_e6e6e6_1x400.png (100%) rename {vendor => app}/assets/images/ui-bg_glass_95_fef1ec_1x400.png (100%) rename {vendor => app}/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png (100%) rename {vendor => app}/assets/images/ui-icons_222222_256x240.png (100%) rename {vendor => app}/assets/images/ui-icons_2e83ff_256x240.png (100%) rename {vendor => app}/assets/images/ui-icons_454545_256x240.png (100%) rename {vendor => app}/assets/images/ui-icons_888888_256x240.png (100%) rename {vendor => app}/assets/images/ui-icons_cd0a0a_256x240.png (100%) delete mode 100644 vendor/assets/javascripts/.gitkeep delete mode 100644 vendor/assets/stylesheets/.gitkeep delete mode 100644 vendor/plugins/.gitkeep diff --git a/vendor/assets/images/ui-bg_flat_0_aaaaaa_40x100.png b/app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png similarity index 100% rename from vendor/assets/images/ui-bg_flat_0_aaaaaa_40x100.png rename to app/assets/images/ui-bg_flat_0_aaaaaa_40x100.png diff --git a/vendor/assets/images/ui-bg_flat_75_ffffff_40x100.png b/app/assets/images/ui-bg_flat_75_ffffff_40x100.png similarity index 100% rename from vendor/assets/images/ui-bg_flat_75_ffffff_40x100.png rename to app/assets/images/ui-bg_flat_75_ffffff_40x100.png diff --git a/vendor/assets/images/ui-bg_glass_55_fbf9ee_1x400.png b/app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png similarity index 100% rename from vendor/assets/images/ui-bg_glass_55_fbf9ee_1x400.png rename to app/assets/images/ui-bg_glass_55_fbf9ee_1x400.png diff --git a/vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png b/app/assets/images/ui-bg_glass_65_ffffff_1x400.png similarity index 100% rename from vendor/assets/images/ui-bg_glass_65_ffffff_1x400.png rename to app/assets/images/ui-bg_glass_65_ffffff_1x400.png diff --git a/vendor/assets/images/ui-bg_glass_75_dadada_1x400.png b/app/assets/images/ui-bg_glass_75_dadada_1x400.png similarity index 100% rename from vendor/assets/images/ui-bg_glass_75_dadada_1x400.png rename to app/assets/images/ui-bg_glass_75_dadada_1x400.png diff --git a/vendor/assets/images/ui-bg_glass_75_e6e6e6_1x400.png b/app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png similarity index 100% rename from vendor/assets/images/ui-bg_glass_75_e6e6e6_1x400.png rename to app/assets/images/ui-bg_glass_75_e6e6e6_1x400.png diff --git a/vendor/assets/images/ui-bg_glass_95_fef1ec_1x400.png b/app/assets/images/ui-bg_glass_95_fef1ec_1x400.png similarity index 100% rename from vendor/assets/images/ui-bg_glass_95_fef1ec_1x400.png rename to app/assets/images/ui-bg_glass_95_fef1ec_1x400.png diff --git a/vendor/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png similarity index 100% rename from vendor/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png rename to app/assets/images/ui-bg_highlight-soft_75_cccccc_1x100.png diff --git a/vendor/assets/images/ui-icons_222222_256x240.png b/app/assets/images/ui-icons_222222_256x240.png similarity index 100% rename from vendor/assets/images/ui-icons_222222_256x240.png rename to app/assets/images/ui-icons_222222_256x240.png diff --git a/vendor/assets/images/ui-icons_2e83ff_256x240.png b/app/assets/images/ui-icons_2e83ff_256x240.png similarity index 100% rename from vendor/assets/images/ui-icons_2e83ff_256x240.png rename to app/assets/images/ui-icons_2e83ff_256x240.png diff --git a/vendor/assets/images/ui-icons_454545_256x240.png b/app/assets/images/ui-icons_454545_256x240.png similarity index 100% rename from vendor/assets/images/ui-icons_454545_256x240.png rename to app/assets/images/ui-icons_454545_256x240.png diff --git a/vendor/assets/images/ui-icons_888888_256x240.png b/app/assets/images/ui-icons_888888_256x240.png similarity index 100% rename from vendor/assets/images/ui-icons_888888_256x240.png rename to app/assets/images/ui-icons_888888_256x240.png diff --git a/vendor/assets/images/ui-icons_cd0a0a_256x240.png b/app/assets/images/ui-icons_cd0a0a_256x240.png similarity index 100% rename from vendor/assets/images/ui-icons_cd0a0a_256x240.png rename to app/assets/images/ui-icons_cd0a0a_256x240.png diff --git a/vendor/assets/javascripts/.gitkeep b/vendor/assets/javascripts/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/assets/stylesheets/.gitkeep b/vendor/assets/stylesheets/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/vendor/plugins/.gitkeep b/vendor/plugins/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 8fdae123d2ec36e9f12802ce60257dddc7c2b43f Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:17:32 -0400 Subject: [PATCH 037/600] application.css issue --- app/assets/stylesheets/application.css | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 649f2e2c..20201b97 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -9,7 +9,6 @@ * compiled file, but it's generally better to create a new file per style scope. * *= require_self - *= require_tree ../../../vendor/assets/stylesheets *= require_tree . *= require base *= require ForceDirected From 465b95753c39b355343cbaa1987075c2715ad40d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:24:39 -0400 Subject: [PATCH 038/600] reorganize for functional famous operation --- app/views/layouts/application.html.erb | 2 +- {app/assets/javascripts/src => public}/main.js | 0 {app/assets/javascripts/src => public}/templates.js | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename {app/assets/javascripts/src => public}/main.js (100%) rename {app/assets/javascripts/src => public}/templates.js (100%) diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index dda7faf1..43150673 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -34,7 +34,7 @@ diff --git a/app/assets/javascripts/src/main.js b/public/main.js similarity index 100% rename from app/assets/javascripts/src/main.js rename to public/main.js diff --git a/app/assets/javascripts/src/templates.js b/public/templates.js similarity index 100% rename from app/assets/javascripts/src/templates.js rename to public/templates.js From b5962287820d8dad6204be64364630fef5fd52e6 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:35:18 -0400 Subject: [PATCH 039/600] restructuring for famous --- app/views/layouts/application.html.erb | 2 +- public/famous/main.js | 205 +++++++++++++++++++++++++ public/famous/templates.js | 86 +++++++++++ 3 files changed, 292 insertions(+), 1 deletion(-) create mode 100644 public/famous/main.js create mode 100644 public/famous/templates.js diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 43150673..37d9284d 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -34,7 +34,7 @@ diff --git a/public/famous/main.js b/public/famous/main.js new file mode 100644 index 00000000..05f5e160 --- /dev/null +++ b/public/famous/main.js @@ -0,0 +1,205 @@ +define(function(require, exports, module) { + // import dependencies + var Engine = require('famous/core/Engine'); + var Modifier = require('famous/core/Modifier'); + var Transform = require('famous/core/Transform'); + var Surface = require('famous/core/Surface'); + var Timer = require('famous/utilities/Timer'); + + var templates = require('templates'); + + // create the main context + var famous = document.getElementById('famousOverlay'); + + Metamaps.Famous = {}; + var f = Metamaps.Famous; + + f.mainContext = Engine.createContext(famous); + + + // INFOVIS + f.viz = {}; + f.viz.surf = new Surface({ + size: [undefined, undefined], + classes: [], + properties: { + display: 'none' + } + }); + var prepare = function () { + f.viz.show(); + Metamaps.JIT.prepareVizData(); + f.viz.surf.removeListener('deploy',prepare); + }; + if (Metamaps.currentSection === "map") { + f.viz.surf.on('deploy', prepare); + } + f.viz.mod = new Modifier({ + origin: [0.5, 0.5], + opacity: 0 + }); + f.viz.show = function () { + f.viz.surf.setProperties({ "display":"block" }); + f.viz.mod.setOpacity( + 1, + { duration: 300 } + ); + }; + f.viz.hide = function () { + f.viz.mod.setOpacity( + 0, + { duration: 300 }, + function() { + f.viz.surf.setProperties({"display": "none"}); + } + ); + }; + f.mainContext.add(f.viz.mod).add(f.viz.surf); + + + // CONTENT / OTHER PAGES + f.yield = {}; + f.yield.surf = new Surface({ + size: [true, true], + classes: [], + properties: { + display: 'none' + } + }); + var loadYield = function () { + f.loadYield(); + f.yield.surf.removeListener('deploy',loadYield); + }; + if (!(Metamaps.currentSection === "map" || + Metamaps.currentSection === "explore" || + (Metamaps.currentSection === "" && Metamaps.Active.Mapper) )) { + f.yield.surf.on('deploy', loadYield); + } + f.yield.mod = new Modifier({ + origin: [0.5, 0.5], + opacity: 0 + }); + f.yield.show = function () { + f.yield.surf.setProperties({ "display":"block" }); + f.yield.mod.setOpacity( + 1, + { duration: 300 } + ); + }; + f.yield.hide = function () { + f.yield.mod.setOpacity( + 0, + { duration: 300 }, + function() { + f.yield.surf.setProperties({"display": "none"}); + } + ); + }; + f.mainContext.add(f.yield.mod).add(f.yield.surf); + + f.loadYield = function () { + Metamaps.Loading.loader.hide(); + var yield = document.getElementById('yield').innerHTML; + f.yield.surf.setContent(yield); + f.yield.surf.deploy(f.yield.surf._currTarget); + f.yield.show(); + }; + + + // EXPLORE MAPS BAR + f.explore = {}; + f.explore.surf = new Surface({ + size: [undefined, 94], + content: templates.mineContent, + classes: ['exploreMapsBar', 'exploreElement'] + }); + f.explore.mod = new Modifier({ + origin: [0.5, 0], + transform: Transform.translate(0, -94, 0) + }); + f.explore.show = function () { + f.explore.mod.setTransform( + Transform.translate(0, 0, 0), + { duration: 300, curve: 'easeOut' } + ); + }; + f.explore.hide = function () { + f.explore.mod.setTransform( + Transform.translate(0, -94, 0), + { duration: 300, curve: 'easeIn' } + ); + }; + f.explore.set = function (section) { + var loggedIn = Metamaps.Active.Mapper ? 'Auth' : ''; + f.explore.surf.setContent(templates[section + loggedIn + 'Content']); + }; + f.mainContext.add(f.explore.mod).add(f.explore.surf); + + // LOGO + f.logo = {}; + f.logo.surf = new Surface({ + size: [258, 56], + content: templates.logoContent, + classes: [] + }); + + f.logo.mod = new Modifier({ + origin: [0.5, 1], + transform: Transform.translate(0, 56, 0) + }); + f.logo.show = function () { + f.logo.mod.setTransform( + Transform.translate(0, 0, 0), + { duration: 300, curve: 'easeOut' } + ); + }; + f.logo.hide = function () { + f.logo.mod.setTransform( + Transform.translate(0, 56, 0), + { duration: 300, curve: 'easeIn' } + ); + }; + f.mainContext.add(f.logo.mod).add(f.logo.surf); + + + // TOAST + f.toast = {}; + f.toast.surf = new Surface({ + size: [true, 42], + content: '', + classes: ['toast'] + }); + f.toast.mod = new Modifier({ + origin: [0, 1], + opacity: 0, + transform: Transform.translate(24, -24, 0) + }); + f.toast.show = function () { + f.toast.mod.setOpacity( + 1, + { duration: 300 } + ); + }; + f.toast.hide = function () { + f.toast.mod.setOpacity( + 0, + { duration: 300 } + ); + }; + f.mainContext.add(f.toast.mod).add(f.toast.surf); + + f.logo.show(); + if (Metamaps.currentSection === "explore") { + Metamaps.Loading.loader.hide(); + f.explore.set(Metamaps.currentPage); + f.explore.show(); + } + else if (Metamaps.currentSection === "") { + Metamaps.Loading.loader.hide(); + if (Metamaps.Active.Mapper) { + f.explore.set('mine'); + f.explore.show(); + } + else f.explore.set('featured'); + } +}); \ No newline at end of file diff --git a/public/famous/templates.js b/public/famous/templates.js new file mode 100644 index 00000000..c3649711 --- /dev/null +++ b/public/famous/templates.js @@ -0,0 +1,86 @@ +define(function(require, exports, module) { + +var t = {}; + +t.logoContent = ''; +t.logoContent += ''; + +/* logged out explore maps bars */ +t.activeContent = '
    '; + t.activeContent += '
    '; + t.activeContent += 'My Maps'; + t.activeContent += 'Recently Active'; + t.activeContent += 'Featured'; + t.activeContent += 'New'; + t.activeContent += '
    '; + t.activeContent += ' Date: Sun, 10 Aug 2014 19:44:53 -0400 Subject: [PATCH 040/600] little fix for Util.splitLine --- app/assets/javascripts/metamaps/Metamaps.js | 2 +- config/application.rb | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index b3d3b2b6..a069af54 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -1265,7 +1265,7 @@ Metamaps.Util = { // you may copy this code but please keep the copyright notice as well splitLine: function (st, n) { var b = ''; - var s = st; + var s = st ? st : ''; while (s.length > n) { var c = s.substring(0, n); var d = c.lastIndexOf(' '); diff --git a/config/application.rb b/config/application.rb index d84d0c62..d9f5f0f1 100644 --- a/config/application.rb +++ b/config/application.rb @@ -54,8 +54,6 @@ module Metamaps config.assets.enabled = true config.assets.initialize_on_precompile = false - config.assets.paths << "#{Rails.root}/app/assets/javascripts/src" - # Version of your assets, change this if you want to expire all your assets config.assets.version = '2.0' end From 39140a06e66cc55425992dfed5340d8294b73116 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 10 Aug 2014 19:52:39 -0400 Subject: [PATCH 041/600] moved famous files --- app/assets/javascripts/metamaps/Metamaps.js | 2 +- public/main.js | 205 -------------------- public/templates.js | 86 -------- 3 files changed, 1 insertion(+), 292 deletions(-) delete mode 100644 public/main.js delete mode 100644 public/templates.js diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index a069af54..14fea45f 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -1332,7 +1332,7 @@ Metamaps.Realtime = { var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); if (mapperm) { - self.socket = io.connect('http://localhost:5001'); + self.socket = io.connect('http://localhost:5001'); self.socket.on('connect', function () { console.log('socket connected'); self.setupSocket(); diff --git a/public/main.js b/public/main.js deleted file mode 100644 index 05f5e160..00000000 --- a/public/main.js +++ /dev/null @@ -1,205 +0,0 @@ -define(function(require, exports, module) { - // import dependencies - var Engine = require('famous/core/Engine'); - var Modifier = require('famous/core/Modifier'); - var Transform = require('famous/core/Transform'); - var Surface = require('famous/core/Surface'); - var Timer = require('famous/utilities/Timer'); - - var templates = require('templates'); - - // create the main context - var famous = document.getElementById('famousOverlay'); - - Metamaps.Famous = {}; - var f = Metamaps.Famous; - - f.mainContext = Engine.createContext(famous); - - - // INFOVIS - f.viz = {}; - f.viz.surf = new Surface({ - size: [undefined, undefined], - classes: [], - properties: { - display: 'none' - } - }); - var prepare = function () { - f.viz.show(); - Metamaps.JIT.prepareVizData(); - f.viz.surf.removeListener('deploy',prepare); - }; - if (Metamaps.currentSection === "map") { - f.viz.surf.on('deploy', prepare); - } - f.viz.mod = new Modifier({ - origin: [0.5, 0.5], - opacity: 0 - }); - f.viz.show = function () { - f.viz.surf.setProperties({ "display":"block" }); - f.viz.mod.setOpacity( - 1, - { duration: 300 } - ); - }; - f.viz.hide = function () { - f.viz.mod.setOpacity( - 0, - { duration: 300 }, - function() { - f.viz.surf.setProperties({"display": "none"}); - } - ); - }; - f.mainContext.add(f.viz.mod).add(f.viz.surf); - - - // CONTENT / OTHER PAGES - f.yield = {}; - f.yield.surf = new Surface({ - size: [true, true], - classes: [], - properties: { - display: 'none' - } - }); - var loadYield = function () { - f.loadYield(); - f.yield.surf.removeListener('deploy',loadYield); - }; - if (!(Metamaps.currentSection === "map" || - Metamaps.currentSection === "explore" || - (Metamaps.currentSection === "" && Metamaps.Active.Mapper) )) { - f.yield.surf.on('deploy', loadYield); - } - f.yield.mod = new Modifier({ - origin: [0.5, 0.5], - opacity: 0 - }); - f.yield.show = function () { - f.yield.surf.setProperties({ "display":"block" }); - f.yield.mod.setOpacity( - 1, - { duration: 300 } - ); - }; - f.yield.hide = function () { - f.yield.mod.setOpacity( - 0, - { duration: 300 }, - function() { - f.yield.surf.setProperties({"display": "none"}); - } - ); - }; - f.mainContext.add(f.yield.mod).add(f.yield.surf); - - f.loadYield = function () { - Metamaps.Loading.loader.hide(); - var yield = document.getElementById('yield').innerHTML; - f.yield.surf.setContent(yield); - f.yield.surf.deploy(f.yield.surf._currTarget); - f.yield.show(); - }; - - - // EXPLORE MAPS BAR - f.explore = {}; - f.explore.surf = new Surface({ - size: [undefined, 94], - content: templates.mineContent, - classes: ['exploreMapsBar', 'exploreElement'] - }); - f.explore.mod = new Modifier({ - origin: [0.5, 0], - transform: Transform.translate(0, -94, 0) - }); - f.explore.show = function () { - f.explore.mod.setTransform( - Transform.translate(0, 0, 0), - { duration: 300, curve: 'easeOut' } - ); - }; - f.explore.hide = function () { - f.explore.mod.setTransform( - Transform.translate(0, -94, 0), - { duration: 300, curve: 'easeIn' } - ); - }; - f.explore.set = function (section) { - var loggedIn = Metamaps.Active.Mapper ? 'Auth' : ''; - f.explore.surf.setContent(templates[section + loggedIn + 'Content']); - }; - f.mainContext.add(f.explore.mod).add(f.explore.surf); - - // LOGO - f.logo = {}; - f.logo.surf = new Surface({ - size: [258, 56], - content: templates.logoContent, - classes: [] - }); - - f.logo.mod = new Modifier({ - origin: [0.5, 1], - transform: Transform.translate(0, 56, 0) - }); - f.logo.show = function () { - f.logo.mod.setTransform( - Transform.translate(0, 0, 0), - { duration: 300, curve: 'easeOut' } - ); - }; - f.logo.hide = function () { - f.logo.mod.setTransform( - Transform.translate(0, 56, 0), - { duration: 300, curve: 'easeIn' } - ); - }; - f.mainContext.add(f.logo.mod).add(f.logo.surf); - - - // TOAST - f.toast = {}; - f.toast.surf = new Surface({ - size: [true, 42], - content: '', - classes: ['toast'] - }); - f.toast.mod = new Modifier({ - origin: [0, 1], - opacity: 0, - transform: Transform.translate(24, -24, 0) - }); - f.toast.show = function () { - f.toast.mod.setOpacity( - 1, - { duration: 300 } - ); - }; - f.toast.hide = function () { - f.toast.mod.setOpacity( - 0, - { duration: 300 } - ); - }; - f.mainContext.add(f.toast.mod).add(f.toast.surf); - - f.logo.show(); - if (Metamaps.currentSection === "explore") { - Metamaps.Loading.loader.hide(); - f.explore.set(Metamaps.currentPage); - f.explore.show(); - } - else if (Metamaps.currentSection === "") { - Metamaps.Loading.loader.hide(); - if (Metamaps.Active.Mapper) { - f.explore.set('mine'); - f.explore.show(); - } - else f.explore.set('featured'); - } -}); \ No newline at end of file diff --git a/public/templates.js b/public/templates.js deleted file mode 100644 index c3649711..00000000 --- a/public/templates.js +++ /dev/null @@ -1,86 +0,0 @@ -define(function(require, exports, module) { - -var t = {}; - -t.logoContent = ''; -t.logoContent += ''; - -/* logged out explore maps bars */ -t.activeContent = '
    '; - t.activeContent += '
    '; - t.activeContent += 'My Maps'; - t.activeContent += 'Recently Active'; - t.activeContent += 'Featured'; - t.activeContent += 'New'; - t.activeContent += '
    '; - t.activeContent += ' Date: Mon, 11 Aug 2014 09:21:58 -0400 Subject: [PATCH 042/600] Update templates.js --- public/famous/templates.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/public/famous/templates.js b/public/famous/templates.js index c3649711..220d32cd 100644 --- a/public/famous/templates.js +++ b/public/famous/templates.js @@ -13,7 +13,6 @@ t.logoContent += ''; /* logged out explore maps bars */ t.activeContent = '
    '; t.activeContent += '
    '; - t.activeContent += 'My Maps'; t.activeContent += 'Recently Active'; t.activeContent += 'Featured'; t.activeContent += 'New'; @@ -23,7 +22,6 @@ t.activeContent += '
    '; t.featuredContent = '
    '; t.featuredContent += '
    '; - t.featuredContent += 'My Maps'; t.featuredContent += 'Recently Active'; t.featuredContent += 'Featured'; t.featuredContent += 'New'; @@ -33,7 +31,6 @@ t.featuredContent += '
    '; t.newContent = '
    '; t.newContent += '
    '; - t.newContent += 'My Maps'; t.newContent += 'Recently Active'; t.newContent += 'Featured'; t.newContent += 'New'; @@ -83,4 +80,4 @@ t.newAuthContent = '
    '; t.newAuthContent += '
    '; module.exports = t; -}); \ No newline at end of file +}); From 8bc1e0c9eecab754f6e41d4975def41406fdf1a9 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 11 Aug 2014 11:03:00 -0400 Subject: [PATCH 043/600] added background file --- app/assets/images/shattered_@2X.png | Bin 0 -> 190781 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/assets/images/shattered_@2X.png diff --git a/app/assets/images/shattered_@2X.png b/app/assets/images/shattered_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..19322777cf5693b3b6fb542615b35fde5502b3d4 GIT binary patch literal 190781 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 Date: Mon, 11 Aug 2014 12:04:06 -0400 Subject: [PATCH 044/600] reseting the filter box when you switch dynamically between maps --- .../javascripts/metamaps/Metamaps.GlobalUI.js | 5 +-- app/assets/javascripts/metamaps/Metamaps.js | 36 ++++++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 12f9e6ea..0fe15bed 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -545,12 +545,13 @@ Metamaps.GlobalUI.Search = { var win; if (dataset == "topics") { win = window.open('/topics/' + datum.id, '_blank'); + win.focus(); } else if (dataset == "maps") { - win = window.open('/maps/' + datum.id, '_blank'); + Metamaps.Router.maps(datum.id); } else if (dataset == "mappers") { win = window.open('/maps/mappers/' + datum.id, '_blank'); + win.focus(); } - win.focus(); } }, initSearchOptions: function () { diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 14fea45f..e8a4efc7 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -1989,6 +1989,36 @@ Metamaps.Filter = { } }, time); }, + reset: function () { + var self = Metamaps.Filter; + + self.filters.metacodes = []; + self.filters.mappers = []; + self.filters.synapses = []; + self.visible.metacodes = []; + self.visible.mappers = []; + self.visible.synapses = []; + + $('#filter_by_metacode ul').empty(); + $('#filter_by_mapper ul').empty(); + $('#filter_by_synapse ul').empty(); + }, + initializeFilterData: function () { + var self = Metamaps.Filter; + + var check = function (filtersToUse, topicsOrSynapses, propertyToCheck) { + Metamaps[topicsOrSynapses].each(function(model) { + var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; + if (prop && self.visible[filtersToUse].indexOf(prop) === -1) { + self.visible[filtersToUse].push(prop); + } + }); + }; + check('metacodes', 'Topics', 'metacode_id'); + check('mappers', 'Topics', 'user_id'); + check('mappers', 'Synapses', 'user_id'); + check('synapses', 'Synapses', 'desc'); + }, /* Most of this data essentially depends on the ruby function which are happening for filter inside view filterBox But what these function do is load this data into three accessible array within java : metacodes, mappers and synapses @@ -2720,9 +2750,13 @@ Metamaps.Map = { Metamaps.JIT.prepareVizData(); // update filters - Metamaps.Filter.checkMappers(); + Metamaps.Filter.reset(); + Metamaps.Filter.initializeFilterData(); // this sets all the visible filters to true + + // these three update the actual filter box with the right list items Metamaps.Filter.checkMetacodes(); Metamaps.Filter.checkSynapses(); + Metamaps.Filter.checkMappers(); } $.ajax({ From f4cbd9b25d7d7c466bed18872a4c9c858b6d9ee6 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 11 Aug 2014 12:12:46 -0400 Subject: [PATCH 045/600] added background --- app/assets/stylesheets/application.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 20201b97..148c20c2 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -83,7 +83,7 @@ html { } body { - background: #d8d9da; + background: #d8d9da url(/assets/shattered_@2X.png); font-family: 'din-medium', helvetica, sans-serif; color: #424242; } From 85bfce0237b99b084837946b117466314fd3f541 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Mon, 11 Aug 2014 18:55:53 -0400 Subject: [PATCH 046/600] part way through add links to topic cards --- .../jquery.embedly.min.js | 6 ++ app/assets/javascripts/metamaps/Metamaps.js | 91 ++++++++++--------- app/assets/stylesheets/base.css | 82 +++++++++++------ app/assets/stylesheets/clean.css | 3 + app/views/layouts/_templates.html.erb | 4 +- 5 files changed, 114 insertions(+), 72 deletions(-) create mode 100644 app/assets/javascripts/librariesForAllPages/jquery.embedly.min.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.embedly.min.js b/app/assets/javascripts/librariesForAllPages/jquery.embedly.min.js new file mode 100644 index 00000000..85d9aa08 --- /dev/null +++ b/app/assets/javascripts/librariesForAllPages/jquery.embedly.min.js @@ -0,0 +1,6 @@ +/*! Embedly jQuery - v3.1.1 - 2013-06-05 + * https://github.com/embedly/embedly-jquery + * Copyright (c) 2013 Sean Creeley + * Licensed BSD + */ +(function(t){var e={key:null,endpoint:"oembed",secure:null,query:{},method:"replace",addImageStyles:!0,wrapElement:"div",className:"embed",batch:20,urlRe:null},i=/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/,r=function(t){return null===t||void 0===t},n=function(e,i){var r=[],n=[];return t.each(e,function(t,e){n.push(e),n.length===i&&(r.push(n),n=[])}),0!==n.length&&r.push(n),r},s=function(e){return r(e)?[]:t.isArray(e)?e:[e]},o=function(e){return t.map(e[0],function(i,r){return[t.map(e,function(t){return t[r]})]})},a=function(t,e,i){this.init(t,e,i)};a.prototype={init:function(e){this.urls=e,this.count=0,this.results={},this._deferred=t.Deferred()},notify:function(e){if(this.results[e.original_url]=e,this.count++,this._deferred.notify.apply(this._deferred,[e]),this.count===this.urls.length){var i=this,r=t.map(this.urls,function(t){return i.results[t]});this._deferred.resolve(r)}return this},state:function(){return this._deferred.state.apply(this._deferred,arguments)}},window.Keeper=a;var l=function(){};l.prototype={defaults:{},log:function(t,e){r(window.console)||r(window.console[t])||window.console[t].apply(window.console,[e])},build:function(e,i,n){n=r(n)?{}:n;var s=n.secure;r(s)&&(s="https:"===window.location.protocol?!0:!1);var o=(s?"https":"http")+"://api.embed.ly/"+("objectify"===e?"2/":"1/")+e,a=r(n.query)?{}:n.query;return a.key=n.key,o+="?"+t.param(a),o+="&urls="+t.map(i,encodeURIComponent).join(",")},ajax:function(l,h,u){if(u=t.extend({},e,t.embedly.defaults,"object"==typeof u&&u),r(u.key))return this.log("error","Embedly jQuery requires an API Key. Please sign up for one at http://embed.ly"),null;h=s(h);var d,p=new a(h),c=[],f=[];t.each(h,function(t,e){d=!1,i.test(e)&&(d=!0,null!==u.urlRe&&u.urlRe.test&&!u.urlRe.test(e)&&(d=!1)),d===!0?c.push(e):f.push({url:e,original_url:e,error:!0,invalid:!0,type:"error",error_message:'Invalid URL "'+e+'"'})});var y=n(c,u.batch),m=this;return t.each(y,function(e,i){t.ajax({url:m.build(l,i,u),dataType:"jsonp",success:function(e){t.each(o([i,e]),function(t,e){var i=e[1];i.original_url=e[0],i.invalid=!1,p.notify(i)})}})}),f.length&&setTimeout(function(){t.each(f,function(t,e){p.notify(e)})},1),p._deferred},oembed:function(t,e){return this.ajax("oembed",t,e)},preview:function(t,e){return this.ajax("preview",t,e)},objectify:function(t,e){return this.ajax("objectify",t,e)},extract:function(t,e){return this.ajax("extract",t,e)}};var h=function(){};h.prototype={build:function(e,i,n){n=t.extend({},t.embedly.defaults,"object"==typeof n&&n);var s=n.secure;r(s)&&(s="https:"===window.location.protocol?!0:!1);var o=(s?"https":"http")+"://i.embed.ly/"+("display"===e?"1/":"1/display/")+e,a=r(n.query)?{}:n.query;return a.key=n.key,o+="?"+t.param(a),o+="&url="+encodeURIComponent(i)},display:function(t,e){return this.build("display",t,e)},resize:function(t,e){return this.build("resize",t,e)},fill:function(t,e){return this.build("fill",t,e)},crop:function(t,e){return this.build("crop",t,e)}};var u=function(t,e,i){this.init(t,e,i)};u.prototype={init:function(e,i,r){this.elem=e,this.$elem=t(e),this.original_url=i,this.options=r,this.loaded=t.Deferred();var n=this;this.loaded.done(function(){n.$elem.trigger("loaded",[n])}),this.$elem.trigger("initialized",[this])},progress:function(e){t.extend(this,e),this.options.display?this.options.display.apply(this.elem,[this,this.elem]):"oembed"===this.options.endpoint&&this.display(),this.loaded.resolve(this)},imageStyle:function(){var t,e=[];return this.options.addImageStyles&&(this.options.query.maxwidth&&(t=isNaN(parseInt(this.options.query.maxwidth,10))?"":"px",e.push("max-width: "+this.options.query.maxwidth+t)),this.options.query.maxheight&&(t=isNaN(parseInt(this.options.query.maxheight,10))?"":"px",e.push("max-height: "+this.options.query.maxheight+t))),e.join(";")},display:function(){if("error"===this.type)return!1;this.style=this.imageStyle();var t;"photo"===this.type?(t="",t+=""+this.title+""):"video"===this.type||"rich"===this.type?t=this.html:(this.title=this.title||this.url,t=this.thumbnail_url?"":"",t+=""+this.title+"",t+=this.provider_name?""+this.provider_name+"":"",t+=this.description?'
    '+this.description+"
    ":""),this.options.wrapElement&&(t="<"+this.options.wrapElement+' class="'+this.options.className+'">'+t+""),this.code=t,"replace"===this.options.method?this.$elem.replaceWith(this.code):"after"===this.options.method?this.$elem.after(this.code):"afterParent"===this.options.method?this.$elem.parent().after(this.code):"replaceParent"===this.options.method&&this.$elem.parent().replaceWith(this.code),this.$elem.trigger("displayed",[this])}},t.embedly=new l,t.embedly.display=new h,t.fn.embedly=function(i){if(void 0===i||"object"==typeof i){if(i=t.extend({},e,t.embedly.defaults,"object"==typeof i&&i),r(i.key))return t.embedly.log("error","Embedly jQuery requires an API Key. Please sign up for one at http://embed.ly"),this.each(t.noop);var n={},s=function(e){if(!t.data(t(e),"embedly")){var r=t(e).attr("href"),s=new u(e,r,i);t.data(e,"embedly",s),n.hasOwnProperty(r)?n[r].push(s):n[r]=[s]}},o=this.each(function(){r(t(this).attr("href"))?t(this).find("a").each(function(){r(t(this).attr("href"))||s(this)}):s(this)}),a=t.embedly.ajax(i.endpoint,t.map(n,function(t,e){return e}),i).progress(function(e){t.each(n[e.original_url],function(t,i){i.progress(e)})});return i.progress&&a.progress(i.progress),i.done&&a.done(i.done),o}},t.expr[":"].embedly=function(e){return!r(t(e).data("embedly"))},t.fn.display=function(i,n){if(r(i)&&(i="display"),void 0===n||"object"==typeof n){if(n=t.extend({},e,t.embedly.defaults,"object"==typeof n&&n),r(n.key))return t.embedly.log("error","Embedly jQuery requires an API Key. Please sign up for one at http://embed.ly/display"),this.each(t.noop);var s=function(e){var r=t(e);if(!r.data("display")){var s=r.data("src")||r.attr("href"),o={original_url:s,url:t.embedly.display.build(i,s,n)};r.data("display",o),r.trigger("initialized",[e]);var a="";r.is("a")?r.append(a):r.replaceWith(a)}},o=function(e){return r(t(e).data("src"))&&r(t(e).attr("href"))?!1:!0},a=this.each(function(){o(this)?s(this):t(this).find("img,a").each(function(){o(this)&&s(this)})});return a}},t.expr[":"].display=function(e){return!r(t(e).data("display"))}})(jQuery,window); \ No newline at end of file diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index b3d3b2b6..6b608034 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -639,20 +639,6 @@ Metamaps.TopicCard = { $('.showcard').draggable({ handle: ".metacodeImage" }); - $('#showcard').resizable({ - maxHeight: 500, - maxWidth: 500, - minHeight: 320, - minWidth: 226, - resize: function (event, ui) { - var p = $('#showcard').find('.scroll'); - p.height(p.height()).mCustomScrollbar('update'); - } - }).css({ - display: 'none', - top: '300px', - left: '100px' - }); }, fadeInShowCard: function (topic) { $('.showcard').fadeIn('fast'); @@ -678,6 +664,38 @@ Metamaps.TopicCard = { var self = Metamaps.TopicCard; var showCard = document.getElementById('showcard'); + + // starting embed.ly + if (false && topic.get('link')) { + $('.showcard .attachments a').embedly({ + query: {maxwidth: 300}, + key: '7983300f4c1f48569ca242e3d6bff1e9' + }); + } + + var addLinkFunc = function () { + var addLinkDiv =''; + var addLinkDesc ='Enter or paste a link'; + addLinkDiv+=''; + $('.addAttachment').hide(); + $('.attachments').append(addLinkDiv); + $('.showcard #addLinkBack').click(backFunc); + $('.showcard #addLinkReset').click(resetFunc); + }; + var backFunc = function () { + $('.addLink').remove(); + $('.addAttachment').show(); + }; + var resetFunc = function () { + $('#addLinkInput input').val(''); + $('#addLinkInput input').focus(); + }; + + $('.showcard #addlink').click(addLinkFunc); + + var selectingMetacode = false; // attach the listener that shows the metacode title when you hover over the image $('.showcard .metacodeImage').mouseenter(function () { @@ -792,12 +810,6 @@ Metamaps.TopicCard = { var desc = $(this).html(); topic.set("desc", desc); }); - - $(showCard).find('.best_in_place_link').bind("ajax:success", function () { - var link = $(this).html(); - $(showCard).find('.go-link').attr('href', link); - topic.set("link", link); - }); }, populateShowCard: function (topic) { var self = Metamaps.TopicCard; @@ -806,7 +818,8 @@ Metamaps.TopicCard = { $(showCard).find('.permission').remove(); - var html = self.generateShowcardHTML.render(self.buildObject(topic)); + var topicForTemplate = self.buildObject(topic); + var html = self.generateShowcardHTML.render(topicForTemplate); if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { var perm = document.createElement('div'); @@ -828,29 +841,29 @@ Metamaps.TopicCard = { generateShowcardHTML: null, // will be initialized into a Hogan template within init function //generateShowcardHTML buildObject: function (topic) { + var nodeValues = {}; + var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); - //link is rendered differently if user is logged out or in - var go_link, a_tag, close_a_tag; if (!authorized) { - go_link = ''; - if (topic.get("link") != "") { - a_tag = ''; - close_a_tag = ''; - } else { - a_tag = ''; - close_a_tag = ''; - } + } else { - go_link = ''; - a_tag = ''; - close_a_tag = ''; + } var desc_nil = "Click to add description..."; - var link_nil = "Click to add link..."; + + if (false && topic.get('link')) { + nodeValues.attachments = ''+topic.get('link')+''; + } + else { + nodeValues.attachments = '
    '; + nodeValues.attachments+= '
    photo
    '; + nodeValues.attachments+= ''; + nodeValues.attachments+= '
    audio
    '; + nodeValues.attachments+= '
    upload
    '; + } nodeValues.permission = topic.get("permission"); nodeValues.mk_permission = topic.get("permission").substring(0, 2); @@ -864,14 +877,8 @@ Metamaps.TopicCard = { nodeValues.userid = topic.get("user_id"); nodeValues.username = topic.getUser().get("name"); nodeValues.date = topic.getDate(); - // the code for this is stored in /views/main/_metacodeOptions.html.erb nodeValues.metacode_select = $('#metacodeOptions').html(); - nodeValues.go_link = go_link; - nodeValues.a_tag = a_tag; - nodeValues.close_a_tag = close_a_tag; - nodeValues.link_nil = link_nil; - nodeValues.link = (topic.get("link") == "" && authorized) ? link_nil : topic.get("link"); nodeValues.desc_nil = desc_nil; nodeValues.desc = (topic.get("desc") == "" && authorized) ? desc_nil : topic.get("desc"); return nodeValues; diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 2f3e626c..cce83474 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -6,24 +6,24 @@ color:#444; } -.showcard, #showcard { +.showcard { position:absolute; - display:block; - top:-1000px; - left:-1000px; + display:none; + top:300px; + left:100px; margin-top: -181px; - width:226px; - height:320px; + width:300px; + height:360px; color:#FFF; text-align: left; overflow: visible; z-index:14000; background: #FFF; - border-radius:5px; + border-radius:2px; box-shadow: 6px 6px 8px rgba(0,0,0,0.4); } -#showcard .contributor { +.showcard .contributor { font-size:14px; } @@ -358,7 +358,7 @@ float:left; } -.CardOnGraph .link { +.CardOnGraph .attachments { -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ -moz-box-flex: 1; /* OLD - Firefox 19- */ -webkit-flex: 1; /* Chrome */ @@ -378,12 +378,10 @@ float:left; flex-direction: row; border-top: 1px solid #AAAAAA; width:100%; - max-height:34px; - background: url(MMCCicon_link.png) no-repeat 6px 5px; - background-size:24px 24px; + max-height:48px; } -.CardOnGraph .best_in_place_link { +.attachments a { -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ -moz-box-flex: 1; /* OLD - Firefox 19- */ -webkit-flex: 1; /* Chrome */ @@ -399,30 +397,58 @@ float:left; line-height: 16px; } -.best_in_place_link input{ +.addAttachment div { + display: inline-block; + width: 72px; + height: 23px; + text-align: center; + padding-top: 25px; + font-size: 12px; + color: #9e9e9e; + cursor: pointer; +} + +.addAttachment div:hover { + color: #616161; +} + +.addLink div { + display: inline-block; +} + +#addLinkBack { + height: 48px; + width: 48px; + cursor: pointer; +} +#addLinkInput { + height: 32px; + width: 236px; + padding: 8px 16px 8px 0; + position: relative; +} + +#addLinkInput input{ +padding: 7px 31px 7px 31px; height: 16px; -margin: -1px 0 0 0; -border: 0; +width: 172px; +margin: 0 0 0 0; +border: 1px solid #EFEFEF; outline: none; font-size: 16px; line-height: 16px; -line-height: 16px; background: white; color: black; font-family: 'LatoLight'; } -.CardOnGraph .go-link { - max-width: 34px; - height: 34px; - background: url(MMCCicon_go.png) no-repeat center center; - background-size: 20px 20px; - -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: 1; /* OLD - Firefox 19- */ - -webkit-flex: 1; /* Chrome */ - -ms-flex: 1; /* IE 10 */ - flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */ - margin-right:12px; +#addLinkReset { + position: absolute; + top: 8px; + right: 16px; + width: 32px; + height: 32px; + cursor: pointer; } .cardSettings { diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index d46a1d4e..bb137d21 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -46,6 +46,9 @@ .mapPage .mapElement { display: block; } +.mapPage .mapElementHidden { + display:none; +} /* loading */ diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 98769ad4..6171700b 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -179,8 +179,8 @@
    - From 4541196ffe386b7aa98c98009fab5566ae0f8297 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Mon, 11 Aug 2014 18:56:03 -0400 Subject: [PATCH 047/600] part way through add links to topic cards --- app/views/maps/show.html.erb~ | 133 ---------------------------------- 1 file changed, 133 deletions(-) delete mode 100644 app/views/maps/show.html.erb~ diff --git a/app/views/maps/show.html.erb~ b/app/views/maps/show.html.erb~ deleted file mode 100644 index 474a6c1a..00000000 --- a/app/views/maps/show.html.erb~ +++ /dev/null @@ -1,133 +0,0 @@ -<%# - # @file - # Code to display a map - # /maps/:id - #%> - -<% content_for :title, @map.name + " | Metamaps" %> - -
    - -
    - - -<% if authenticated? %> - <% if @map.permission == "commons" || @map.user == user %> -
    -
    -
    Save Layout
    -
    -
    -
    - <% end %> -
    -
    -
    Save To New Map
    -
    -
    -
    - <% if @map.permission == "commons" || @map.user == user %> -
    -
    -
    -

    Realtime:

    - OFF -
    -
    -
      -
    • - <%= user.name %> (me) -
    • -
    -
    -
    -
    - <% end %> -<% end %> -
    -
    -
    -

    Filter By Metacode

    allnone -
    - <%= render :partial => 'main/filterbymetacode' %> -
    -
    - -
    -
    - - <%= @map.name %> - -
    - <%= render :partial => 'maps/mapinfobox' %> -
    - -
    -
    -
    -
    -
    -
    -
    - -<% if authenticated? %> - - <% # add these if you have edit permissions on the map %> - <% if @map.permission == "commons" || @map.user == user %> - - <% # for creating and pulling in topics and synapses %> - <%= render :partial => 'newtopic' %> - <%= render :partial => 'newsynapse' %> - - <% # for saving the layout of the map %> - <%= form_for @map, :url => savelayout_path(@map), :html => { :class => "saveMapLayout", :id => "saveMapLayout"}, remote: true do |form| %> - <%= form.hidden_field "coordinates", :value => "" %> - <% end %> - - <% end %> - - <% # for populating the change metacode list on the topic card %> - <%= render :partial => 'main/metacodeoptions' %> -<% end %> - - - \ No newline at end of file From bbc50d1305bbd666fecf12e7636e184d007bcc57 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 11 Aug 2014 18:57:34 -0400 Subject: [PATCH 048/600] got radial view working --- .../javascripts/metamaps/Metamaps.Backbone.js | 33 ++++++++++- .../javascripts/metamaps/Metamaps.GlobalUI.js | 3 +- .../javascripts/metamaps/Metamaps.Router.js | 31 ++++++++++ app/assets/javascripts/metamaps/Metamaps.js | 56 +++++++++++++++---- app/assets/stylesheets/clean.css | 4 ++ app/controllers/maps_controller.rb | 25 ++++++++- app/controllers/topics_controller.rb | 31 ++++++++-- app/views/layouts/application.html.erb | 5 +- app/views/main/_homemap.html.erb | 32 ----------- app/views/maps/show.html.erb | 3 +- app/views/topics/show.html.erb | 41 +------------- config/routes.rb | 2 + public/famous/main.js | 11 +++- 13 files changed, 177 insertions(+), 100 deletions(-) delete mode 100644 app/views/main/_homemap.html.erb diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/metamaps/Metamaps.Backbone.js index c85f08c2..d73623de 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Backbone.js +++ b/app/assets/javascripts/metamaps/Metamaps.Backbone.js @@ -1,7 +1,7 @@ Metamaps.Backbone = {}; Metamaps.Backbone.Map = Backbone.Model.extend({ urlRoot: '/maps', - blacklist: ['created_at', 'updated_at', 'map', 'topics', 'synapses', 'mappings', 'mappers'], + blacklist: ['created_at', 'updated_at', 'topics', 'synapses', 'mappings', 'mappers'], toJSON: function (options) { return _.omit(this.attributes, this.blacklist); }, @@ -12,18 +12,45 @@ Metamaps.Backbone.Map = Backbone.Model.extend({ getUser: function () { return Metamaps.Mapper.get(this.get('user_id')); }, + fetchContained: function () { + var bb = Metamaps.Backbone; + var start = function (data) { + this.set('mappers', new bb.MapperCollection(data.mappers)); + this.set('topics', new bb.TopicCollection(data.topics)); + this.set('synapses', new bb.SynapseCollection(data.synapses)); + this.set('mappings', new bb.MappingCollection(data.mappings)); + } + + $.ajax({ + url: "/maps/" + this.id + "/contains", + success: start, + async: false + }); + }, getTopics: function () { if (!this.get('topics')) { - this.fetch({async: false}); + this.fetchContained(); } return this.get('topics'); }, getSynapses: function () { if (!this.get('synapses')) { - this.fetch({async: false}); + this.fetchContained(); } return this.get('synapses'); }, + getMappings: function () { + if (!this.get('mappings')) { + this.fetchContained(); + } + return this.get('mappings'); + }, + getMappers: function () { + if (!this.get('mappers')) { + this.fetchContained(); + } + return this.get('mappers'); + }, attrForCards: function () { var obj = { id: this.id, diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 0fe15bed..61dbd435 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -544,8 +544,7 @@ Metamaps.GlobalUI.Search = { self.close(0, true); var win; if (dataset == "topics") { - win = window.open('/topics/' + datum.id, '_blank'); - win.focus(); + Metamaps.Router.topics(datum.id); } else if (dataset == "maps") { Metamaps.Router.maps(datum.id); } else if (dataset == "mappers") { diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index d40666c1..43c2482b 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -56,6 +56,7 @@ Metamaps.Famous.viz.hide(); Metamaps.Active.Map = null; + Metamaps.Active.Topic = null; setTimeout(function(){ Metamaps.Router.navigate(""); @@ -93,6 +94,7 @@ Metamaps.Famous.viz.hide(); Metamaps.Active.Map = null; + Metamaps.Active.Topic = null; setTimeout(function(){ Metamaps.Router.navigate("/explore/" + section); @@ -119,11 +121,40 @@ Metamaps.JIT.centerMap(); } Metamaps.Famous.viz.show(); + Metamaps.Active.Topic = null; Metamaps.GlobalUI.Search.unlock(); Metamaps.GlobalUI.Search.close(0, true); Metamaps.Map.launch(id); + }, + topics: function (id) { + + document.title = 'Topic ' + id + ' | Metamaps'; + + Metamaps.currentSection = "topic"; + Metamaps.currentPage = id; + + $('.wrapper').removeClass('homePage explorePage'); + $('.wrapper').addClass('mapPage'); + + Metamaps.Famous.yield.hide(); + $('.mapsWrapper').fadeOut(300); + Metamaps.Famous.explore.hide(); + + // clear the visualization, if there was one, before showing its div again + if (Metamaps.Visualize.mGraph) { + Metamaps.Visualize.mGraph.graph.empty(); + Metamaps.Visualize.mGraph.plot(); + Metamaps.JIT.centerMap(); + } + Metamaps.Famous.viz.show(); + Metamaps.Active.Map = null; + + Metamaps.GlobalUI.Search.unlock(); + Metamaps.GlobalUI.Search.close(0, true); + + Metamaps.Topic.launch(id); } }); diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index e8a4efc7..3471b1da 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -177,12 +177,7 @@ Metamaps.Backbone.init = function () { self.TopicCollection = Backbone.Collection.extend({ model: self.Topic, - url: '/topics', - comparator: function (a, b) { - a = a.get('name').toLowerCase(); - b = b.get('name').toLowerCase(); - return a > b ? 1 : a < b ? -1 : 0; - } + url: '/topics' }); self.Synapse = Backbone.Model.extend({ @@ -1189,7 +1184,7 @@ Metamaps.Visualize = { render: function () { var self = Metamaps.Visualize, RGraphSettings, FDSettings; - if (self.type == "RGraph" && !self.mGraph) { + if (self.type == "RGraph" && (!self.mGraph || self.mGraph instanceof $jit.ForceDirected)) { RGraphSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); @@ -1197,13 +1192,13 @@ Metamaps.Visualize = { $jit.RGraph.Plot.EdgeTypes.implement(Metamaps.JIT.ForceDirected.edgeSettings); RGraphSettings.width = $(document).width(); - RgraphSettings.height = $(document).height(); + RGraphSettings.height = $(document).height(); RGraphSettings.background = Metamaps.JIT.RGraph.background; RGraphSettings.levelDistance = Metamaps.JIT.RGraph.levelDistance; self.mGraph = new $jit.RGraph(RGraphSettings); - } else if (self.type == "ForceDirected" && !self.mGraph) { + } else if (self.type == "ForceDirected" && (!self.mGraph || self.mGraph instanceof $jit.RGraph)) { FDSettings = $.extend(true, {}, Metamaps.JIT.ForceDirected.graphSettings); @@ -1228,11 +1223,18 @@ Metamaps.Visualize = { // load JSON data, if it's not empty if (!self.loadLater) { //load JSON data. - self.mGraph.loadJSON(Metamaps.JIT.vizData); + var rootIndex = 0; + if (Metamaps.Active.Topic) { + var node = _.find(Metamaps.JIT.vizData, function(node){ + return node.id === Metamaps.Active.Topic.id; + }); + rootIndex = _.indexOf(Metamaps.JIT.vizData, node); + } + self.mGraph.loadJSON(Metamaps.JIT.vizData, rootIndex); //compute positions and plot. self.computePositions(); if (self.type == "RGraph") { - self.mGraph.animate(Metamaps.JIT.RGraph.animate); + self.mGraph.fx.animate(Metamaps.JIT.RGraph.animate); } else if (self.type == "ForceDirected") { self.mGraph.animate(Metamaps.JIT.ForceDirected.animateSavedLayout); } else if (self.type == "ForceDirected3D") { @@ -1243,10 +1245,14 @@ Metamaps.Visualize = { // update the url now that the map is ready setTimeout(function(){ var m = Metamaps.Active.Map; + var t = Metamaps.Active.Topic; if (m && window.location.pathname !== "/maps/" + m.id) { Metamaps.Router.navigate("/maps/" + m.id); } + else if (t && window.location.pathname !== "/topics/" + t.id) { + Metamaps.Router.navigate("/topics/" + t.id); + } }, 800); } @@ -2433,7 +2439,32 @@ Metamaps.Topic = { } } }, + launch: function (id) { + var bb = Metamaps.Backbone; + var start = function (data) { + Metamaps.Active.Topic = new bb.Topic(data.topic); + Metamaps.Topics = new bb.TopicCollection([data.topic].concat(data.relatives)); + Metamaps.Synapses = new bb.SynapseCollection(data.synapses); + // build and render the visualization + Metamaps.Visualize.type = "RGraph"; + Metamaps.JIT.prepareVizData(); + + // update filters + Metamaps.Filter.reset(); + Metamaps.Filter.initializeFilterData(); // this sets all the visible filters to true + + // these three update the actual filter box with the right list items + Metamaps.Filter.checkMetacodes(); + Metamaps.Filter.checkSynapses(); + Metamaps.Filter.checkMappers(); + } + + $.ajax({ + url: "/topics/" + id + "/network.json", + success: start + }); + }, /* * * @@ -2747,6 +2778,7 @@ Metamaps.Map = { Metamaps.Mappings = new bb.MappingCollection(data.mappings); // build and render the visualization + Metamaps.Visualize.type = "ForceDirected"; Metamaps.JIT.prepareVizData(); // update filters @@ -2760,7 +2792,7 @@ Metamaps.Map = { } $.ajax({ - url: "/maps/" + id + ".json", + url: "/maps/" + id + "/contains.json", success: start }); }, diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index ea67b21b..e1ac6446 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -26,6 +26,10 @@ display:none; } +#toast { + display: none; +} + /*.animations { -webkit-transition-duration: .5s; -moz-transition-duration: .5s; diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index b8ab6f79..933f29e1 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -76,6 +76,29 @@ class MapsController < ApplicationController redirect_to root_url and return end + respond_to do |format| + format.html { + @allmappers = @map.contributors + @alltopics = @map.topics # should limit to topics visible to user + @allsynapses = @map.synapses # should also be limited + @allmappings = @map.mappings + + respond_with(@allmappers, @allmappings, @allsynapses, @alltopics, @map) + } + format.json { render json: @map } + end + end + + # GET maps/:id/contains + def contains + + @current = current_user + @map = Map.find(params[:id]).authorize_to_show(@current) + + if not @map + redirect_to root_url and return + end + @allmappers = @map.contributors @alltopics = @map.topics # should limit to topics visible to user @allsynapses = @map.synapses # should also be limited @@ -89,11 +112,11 @@ class MapsController < ApplicationController @json['mappers'] = @allmappers respond_to do |format| - format.html { respond_with(@allmappers, @allmappings, @allsynapses, @alltopics, @map, @user) } format.json { render json: @json } end end + # GET maps/:id/embed def embed @current = current_user diff --git a/app/controllers/topics_controller.rb b/app/controllers/topics_controller.rb index dc7ee02d..c1672290 100644 --- a/app/controllers/topics_controller.rb +++ b/app/controllers/topics_controller.rb @@ -32,13 +32,36 @@ class TopicsController < ApplicationController redirect_to root_url and return end - @alltopics = [@topic] + @topic.relatives # should limit to topics visible to user + respond_to do |format| + format.html { + @alltopics = [@topic] + @topic.relatives # should limit to topics visible to user + @allsynapses = @topic.synapses # should also be limited + + respond_with(@allsynapses, @alltopics, @topic) + } + format.json { render json: @topic } + end + end + + # GET topics/:id/network + def network + @current = current_user + @topic = Topic.find(params[:id]).authorize_to_show(@current) + + if not @topic + redirect_to root_url and return + end + + @alltopics = @topic.relatives # should limit to topics visible to user @allsynapses = @topic.synapses # should also be limited - @allmetacodes = Metacode.all + + @json = Hash.new() + @json['topic'] = @topic + @json['relatives'] = @alltopics + @json['synapses'] = @allsynapses respond_to do |format| - format.html { respond_with(@allmetacodes, @allsynapses, @alltopics, @topic, @user) } - format.json { render json: @topic } + format.json { render json: @json } end end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 37d9284d..ef50717c 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -42,10 +42,7 @@ <% if notice %> -

    <%= notice %>

    - <% end %> - <% if alert %> -

    <%= alert %>

    +

    <%= notice %>

    <% end %> <%= content_tag :div, class: authenticated? ? "main authenticated" : "main unauthenticated" do %> diff --git a/app/views/main/_homemap.html.erb b/app/views/main/_homemap.html.erb deleted file mode 100644 index 554783b6..00000000 --- a/app/views/main/_homemap.html.erb +++ /dev/null @@ -1,32 +0,0 @@ -<%# - # @file - # Shows a map as a card. - # Any list of maps uses this rendering. - #%> -
    "> - -
    - -
    - - <%= map.name %> - - -
    - <%= map.desc %> -
    -
    - <%= pluralize(map.topics.count, 'topic') %> - <%= pluralize(map.synapses.count, 'synapse') %> -
    -
    - -
    -
    -
    diff --git a/app/views/maps/show.html.erb b/app/views/maps/show.html.erb index 8379f429..0c5e4f97 100644 --- a/app/views/maps/show.html.erb +++ b/app/views/maps/show.html.erb @@ -5,14 +5,13 @@ #%> <% content_for :title, @map.name + " | Metamaps" %> - diff --git a/app/views/topics/show.html.erb b/app/views/topics/show.html.erb index 1aba87c0..efe18fcf 100644 --- a/app/views/topics/show.html.erb +++ b/app/views/topics/show.html.erb @@ -15,48 +15,11 @@ #%> <% content_for :title, @topic.name + " | Metamaps" %> - -<% if authenticated? %> -
    -
    -
    -
    -
    -<% end %> -
    -
    -
    -

    Filter By Metacode

    allnone -
    - <%= render :partial => 'shared/filterbymetacode' %> -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -<% if authenticated? %> -<%= render :partial => 'topics/new' %> -<%= render :partial => 'synapses/new' %> -<%= render :partial => 'shared/metacodeoptions' %> -<% end %> - \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 930e3a5e..9fba7ba7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -18,6 +18,7 @@ Metamaps::Application.routes.draw do resources :topics, except: [:index, :new, :edit] do get :autocomplete_topic, :on => :collection end + match 'topics/:id/network', to: 'topics#network', via: :get, as: :network match 'explore/active', to: 'maps#index', via: :get, as: :activemaps match 'explore/featured', to: 'maps#index', via: :get, as: :featuredmaps @@ -27,6 +28,7 @@ Metamaps::Application.routes.draw do match 'maps/topics/:id', to: 'maps#index', via: :get, as: :topicmaps resources :maps, except: [:new, :edit] match 'maps/:id/embed', to: 'maps#embed', via: :get, as: :embed + match 'maps/:id/contains', to: 'maps#contains', via: :get, as: :contains devise_for :users, :controllers => { :registrations => "registrations" }, :path_names => { :sign_in => 'login', :sign_out => 'logout' } devise_scope :user do diff --git a/public/famous/main.js b/public/famous/main.js index 05f5e160..3a8c0f91 100644 --- a/public/famous/main.js +++ b/public/famous/main.js @@ -31,7 +31,7 @@ define(function(require, exports, module) { Metamaps.JIT.prepareVizData(); f.viz.surf.removeListener('deploy',prepare); }; - if (Metamaps.currentSection === "map") { + if (Metamaps.currentSection === "map" || Metamaps.currentSection === "topic") { f.viz.surf.on('deploy', prepare); } f.viz.mod = new Modifier({ @@ -71,6 +71,7 @@ define(function(require, exports, module) { f.yield.surf.removeListener('deploy',loadYield); }; if (!(Metamaps.currentSection === "map" || + Metamaps.currentSection === "topic" || Metamaps.currentSection === "explore" || (Metamaps.currentSection === "" && Metamaps.Active.Mapper) )) { f.yield.surf.on('deploy', loadYield); @@ -169,6 +170,14 @@ define(function(require, exports, module) { content: '', classes: ['toast'] }); + initialToast = function () { + var message = document.getElementById('toast') ? document.getElementById('toast').innerHTML : false; + if (message) { + Metamaps.GlobalUI.notifyUser(message); + f.toast.surf.deploy(f.toast.surf._currTarget); + } + }; + f.toast.surf.on('deploy', initialToast); f.toast.mod = new Modifier({ origin: [0, 1], opacity: 0, From 65c8cb2ea7320bc1668708f8f789d1830483f722 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Mon, 11 Aug 2014 21:59:02 -0400 Subject: [PATCH 049/600] embed attachments --- app/assets/javascripts/metamaps/Metamaps.js | 85 ++++++++++++++++----- app/views/layouts/_templates.html.erb | 3 + 2 files changed, 71 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 9e1700b3..94db1fcd 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -622,7 +622,9 @@ Metamaps.Create = { * */ Metamaps.TopicCard = { - openTopicCard: null, //stores the JIT local ID of the topic with the topic card open + openTopicCard: null, //stores the JIT local ID of the topic with the topic card open + linkActionsString: '
    share
    remove
    ', + init: function () { // initialize best_in_place editing @@ -661,13 +663,6 @@ Metamaps.TopicCard = { // starting embed.ly - if (false && topic.get('link')) { - $('.showcard .attachments a').embedly({ - query: {maxwidth: 300}, - key: '7983300f4c1f48569ca242e3d6bff1e9' - }); - } - var addLinkFunc = function () { var addLinkDiv =''; var addLinkDesc ='Enter or paste a link'; @@ -678,6 +673,9 @@ Metamaps.TopicCard = { $('.attachments').append(addLinkDiv); $('.showcard #addLinkBack').click(backFunc); $('.showcard #addLinkReset').click(resetFunc); + $('.showcard #addLinkInput input').bind("paste keyup",inputEmbedFunc); + + $('#addLinkInput input').focus(); }; var backFunc = function () { $('.addLink').remove(); @@ -687,7 +685,52 @@ Metamaps.TopicCard = { $('#addLinkInput input').val(''); $('#addLinkInput input').focus(); }; - + var inputEmbedFunc = function (event) { + + var element = this; + setTimeout(function () { + var text = $(element).val(); + if (event.type=="paste" || (event.type=="keyup" && event.which==13)){ + topic.save({ + link: text + }); + var embedlyEl = $('', { + id: 'embedlyLink', + href: text + }); + embedlyEl.embedly({ + query: {maxwidth: 300}, + key: '7983300f4c1f48569ca242e3d6bff1e9' + }); + $('.addLink').remove(); + $('.embeds').append(embedlyEl); + $('.attachments').append(self.linkActionsString); + bindLinkActionListeners(); + } + }, 100); + }; + var shareLinkFunc = function () { + + }; + var removeLinkFunc = function () { + topic.save({ + link: null + }); + $('.embeds').empty(); + $('.linkActions').remove(); + $('.addAttachment').show(); + }; + var bindLinkActionListeners = function () { + $('#linkremove').click(removeLinkFunc); + $('#linkshare').click(shareLinkFunc); + }; + if (topic.get('link')) { + $('#embedlyLink').embedly({ + query: {maxwidth: 300}, + key: '7983300f4c1f48569ca242e3d6bff1e9' + }); + bindLinkActionListeners(); + } $('.showcard #addlink').click(addLinkFunc); @@ -836,7 +879,8 @@ Metamaps.TopicCard = { generateShowcardHTML: null, // will be initialized into a Hogan template within init function //generateShowcardHTML buildObject: function (topic) { - + var self=Metamaps.TopicCard; + var nodeValues = {}; var authorized = topic.authorizeToEdit(Metamaps.Active.Mapper); @@ -848,17 +892,24 @@ Metamaps.TopicCard = { } var desc_nil = "Click to add description..."; + var addAttachmentHidden=''; - if (false && topic.get('link')) { - nodeValues.attachments = ''+topic.get('link')+''; + nodeValues.attachments = ''; + if (topic.get('link') && topic.get('link')!=='') { + nodeValues.embeds = ''; + nodeValues.embeds += topic.get('link'); + nodeValues.embeds += ''; + addAttachmentHidden='hidden'; + nodeValues.attachments += self.linkActionsString; } else { - nodeValues.attachments = '
    '; - nodeValues.attachments+= '
    photo
    '; - nodeValues.attachments+= ''; - nodeValues.attachments+= '
    audio
    '; - nodeValues.attachments+= '
    upload
    '; + nodeValues.embeds = ''; } + nodeValues.attachments += '
    '; + nodeValues.attachments+= '
    photo
    '; + nodeValues.attachments+= ''; + nodeValues.attachments+= '
    audio
    '; + nodeValues.attachments+= '
    upload
    '; nodeValues.permission = topic.get("permission"); nodeValues.mk_permission = topic.get("permission").substring(0, 2); diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 6171700b..23d9fd19 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -179,6 +179,9 @@
    +
    + {{{embeds}}} +
    {{{attachments}}}
    From 278b6213bbdf3b044ede2be8a7a4ad390230bfbe Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 11 Aug 2014 22:31:28 -0400 Subject: [PATCH 050/600] improved explore maps pages --- .../javascripts/metamaps/Metamaps.Backbone.js | 18 +++++++++++++----- .../javascripts/metamaps/Metamaps.Router.js | 11 +++-------- .../javascripts/metamaps/Metamaps.Views.js | 10 +++++++--- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/metamaps/Metamaps.Backbone.js index d73623de..98f9060f 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Backbone.js +++ b/app/assets/javascripts/metamaps/Metamaps.Backbone.js @@ -14,15 +14,16 @@ Metamaps.Backbone.Map = Backbone.Model.extend({ }, fetchContained: function () { var bb = Metamaps.Backbone; + var that = this; var start = function (data) { - this.set('mappers', new bb.MapperCollection(data.mappers)); - this.set('topics', new bb.TopicCollection(data.topics)); - this.set('synapses', new bb.SynapseCollection(data.synapses)); - this.set('mappings', new bb.MappingCollection(data.mappings)); + that.set('mappers', new bb.MapperCollection(data.mappers)); + that.set('topics', new bb.TopicCollection(data.topics)); + that.set('synapses', new bb.SynapseCollection(data.synapses)); + that.set('mappings', new bb.MappingCollection(data.mappings)); } $.ajax({ - url: "/maps/" + this.id + "/contains", + url: "/maps/" + this.id + "/contains.json", success: start, async: false }); @@ -78,10 +79,17 @@ Metamaps.Backbone.MapsCollection = Backbone.Collection.extend({ comparator: function (a, b) { a = a.get(this.sortBy); b = b.get(this.sortBy); + var temp; if (this.sortBy === 'name') { a = a ? a.toLowerCase() : ""; b = b ? b.toLowerCase() : ""; } + else { + // this is for updated_at and created_at + temp = a; + a = b; + b = temp; + } return a > b ? 1 : a < b ? -1 : 0; }, getMaps: function () { diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 43c2482b..a14e9bdc 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -52,15 +52,14 @@ Metamaps.GlobalUI.Search.close(0, true); $('.mapsWrapper').fadeOut(300); + setTimeout(function(){ + Metamaps.Router.navigate(""); + }, 500); } Metamaps.Famous.viz.hide(); Metamaps.Active.Map = null; Metamaps.Active.Topic = null; - - setTimeout(function(){ - Metamaps.Router.navigate(""); - }, 500); }, explore: function (section) { @@ -95,10 +94,6 @@ Metamaps.Famous.viz.hide(); Metamaps.Active.Map = null; Metamaps.Active.Topic = null; - - setTimeout(function(){ - Metamaps.Router.navigate("/explore/" + section); - }, 500); }, maps: function (id) { diff --git a/app/assets/javascripts/metamaps/Metamaps.Views.js b/app/assets/javascripts/metamaps/Metamaps.Views.js index fc4da130..4dbcc251 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Views.js +++ b/app/assets/javascripts/metamaps/Metamaps.Views.js @@ -47,8 +47,6 @@ Metamaps.Views.init = function () { }, render: function () { - Metamaps.Loading.loader.hide(); - var that = this; this.$el.empty(); @@ -57,12 +55,18 @@ Metamaps.Views.init = function () { that.$el.append( view.render().el ); }); + + Metamaps.Loading.loader.hide(); + setTimeout(function(){ + var path = Metamaps.currentSection == "" ? "" : "/explore/" + Metamaps.currentPage; + Metamaps.Router.navigate(path); + }, 500); }, handleSuccess: function () { this.render(); }, handleError: function () { - alert('error!'); + console.log('error loading maps!'); //TODO } }); From 9d6cf2c3c8a9a848b8d52c86400326f5a9317e9c Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 11 Aug 2014 22:47:38 -0400 Subject: [PATCH 051/600] further improved explore maps switching --- app/assets/javascripts/metamaps/Metamaps.Backbone.js | 2 -- app/assets/javascripts/metamaps/Metamaps.Router.js | 5 ++++- app/assets/stylesheets/base.css | 5 +++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/metamaps/Metamaps.Backbone.js index 98f9060f..61921ffb 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Backbone.js +++ b/app/assets/javascripts/metamaps/Metamaps.Backbone.js @@ -94,8 +94,6 @@ Metamaps.Backbone.MapsCollection = Backbone.Collection.extend({ }, getMaps: function () { - Metamaps.Loading.loader.show(); - var self = this; this.fetch({ diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index a14e9bdc..3702400c 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -75,7 +75,10 @@ Metamaps.Views.exploreMaps.setCollection( Metamaps.Maps[capitalize] ); if (Metamaps.Maps[capitalize].length === 0) { - Metamaps.Maps[capitalize].getMaps(); // this will trigger an explore maps render + Metamaps.Loading.loader.show(); + setTimeout(function(){ + Metamaps.Maps[capitalize].getMaps(); // this will trigger an explore maps render + }, 1000); // wait 500 milliseconds till the other animations are done to do the fetch } else { Metamaps.Views.exploreMaps.render(); diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index cce83474..a1915205 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -413,7 +413,7 @@ float:left; } .addLink div { - display: inline-block; + float: left; } #addLinkBack { @@ -433,7 +433,7 @@ padding: 7px 31px 7px 31px; height: 16px; width: 172px; margin: 0 0 0 0; -border: 1px solid #EFEFEF; +border: 1px solid #BDBDBD; outline: none; font-size: 16px; line-height: 16px; @@ -449,6 +449,7 @@ font-family: 'LatoLight'; width: 32px; height: 32px; cursor: pointer; + float:none; } .cardSettings { From e1fb72c2dfff5d14f9f3db9d81792e03755f3531 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 11:09:53 -0400 Subject: [PATCH 052/600] fixed user model and map models up --- .../javascripts/metamaps/Metamaps.Backbone.js | 10 +++++----- .../javascripts/metamaps/Metamaps.GlobalUI.js | 4 ---- app/assets/stylesheets/application.css | 7 +------ app/models/map.rb | 16 ++++++++++++++++ app/models/user.rb | 7 +++++++ app/views/layouts/_account.html.erb | 7 ++++--- app/views/users/edit.html.erb | 4 +++- app/views/users/passwords/edit.html.erb | 5 ++--- app/views/users/passwords/new.html.erb | 4 ++-- app/views/users/registrations/new.html.erb | 7 +++---- app/views/users/sessions/new.html.erb | 10 +++++----- public/famous/main.js | 10 ++++++---- 12 files changed, 54 insertions(+), 37 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/metamaps/Metamaps.Backbone.js index 61921ffb..f322ef9f 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Backbone.js +++ b/app/assets/javascripts/metamaps/Metamaps.Backbone.js @@ -1,7 +1,7 @@ Metamaps.Backbone = {}; Metamaps.Backbone.Map = Backbone.Model.extend({ urlRoot: '/maps', - blacklist: ['created_at', 'updated_at', 'topics', 'synapses', 'mappings', 'mappers'], + blacklist: ['created_at', 'updated_at', 'user_name', 'topic_count', 'synapse_count', 'topics', 'synapses', 'mappings', 'mappers'], toJSON: function (options) { return _.omit(this.attributes, this.blacklist); }, @@ -57,11 +57,11 @@ Metamaps.Backbone.Map = Backbone.Model.extend({ id: this.id, name: this.get('name'), desc: this.get('desc'), - username: this.getUser().get('name'), - mkPermission: this.get("permission") ? this.get("permission").substring(0, 2) : "commons", + username: this.get('user_name'), + mkPermission: this.get("permission") ? this.get("permission").substring(0, 2) : "co", editPermission: this.authorizeToEdit(Metamaps.Active.Mapper) ? 'canEdit' : 'cannotEdit', - topicCount: this.getTopics().length, - synapseCount: this.getSynapses().length, + topicCount: this.get('topic_count'), + synapseCount: this.get('synapse_count'), createdAt: this.get('created_at') }; return obj; diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 4ecec60b..dccd5b29 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -75,10 +75,6 @@ Metamaps.GlobalUI = { }); $('#lightbox_screen, #lightbox_close').click(self.closeLightbox); - - // hide notices after 10 seconds - $('.notice.metamaps').delay(10000).fadeOut('fast'); - $('.alert.metamaps').delay(10000).fadeOut('fast'); // initialize global backbone models and collections if (Metamaps.Active.Mapper) Metamaps.Active.Mapper = new Metamaps.Backbone.Mapper(Metamaps.Active.Mapper); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 148c20c2..6a8411ce 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -201,15 +201,10 @@ input[type="submit"]:hover { .forgotPassword { display: block; width: 250px; - position: absolute; - left: 50%; - top: 0; - margin: 100px 0 0 -145px; - background: url(bg.png); + background-color: #E0E0E0; padding: 20px; border-radius: 5px; color: black; - border: 1px solid #000; box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); } .centerGreyForm input[type="text"], diff --git a/app/models/map.rb b/app/models/map.rb index abac522f..2bfcd663 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -32,6 +32,22 @@ end return contributors end + + def topic_count + self.topics.length + end + + def synapse_count + self.synapses.length + end + + def user_name + self.user.name + end + + def as_json(options={}) + super(:methods =>[:user_name, :topic_count, :synapse_count]) + end ##### PERMISSIONS ###### diff --git a/app/models/user.rb b/app/models/user.rb index b5921fa2..c5bb0969 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -38,6 +38,13 @@ has_many :mappings trans << '( +clone -flop ) -compose multiply -composite ' trans << ') -alpha off -compose copy_opacity -composite ' end + + def as_json(options={}) + { :name =>self.name, + :email => self.email, + :image => self.image.url + } + end if ActiveRecord::Base.connection.table_exists? 'users' codes = ActiveRecord::Base.connection.execute("SELECT code FROM users").map {|user| user["code"] } diff --git a/app/views/layouts/_account.html.erb b/app/views/layouts/_account.html.erb index d4912682..c44f0a78 100644 --- a/app/views/layouts/_account.html.erb +++ b/app/views/layouts/_account.html.erb @@ -5,7 +5,7 @@ <% if authenticated? %> <% account = current_user %> -

    Hello <%= account.name.split[0...1][0] %>!

    +

    <%= account.name.split[0...1][0] %>

    • <%= link_to "Account", edit_user_url(account), :data => { :bypass => 'true'} %>
    • @@ -38,8 +38,9 @@ <% end %> <% end %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 3f4fe420..738d5c62 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -4,7 +4,8 @@ # User edit form #%> -<% content_for :title, @user.name + "'s Settings | Metamaps" %> +<% content_for :title, @user.name + "'s Settings | Metamaps" %> +
      <%= formula_form_for @user, url: user_url do |form| %>

      Edit Account

      @@ -15,4 +16,5 @@ <%= form.input :password, label: "Password", class: "password", :autocomplete => :off %> <%= form.submit "Update", class: "update" %> <% end %> +
      diff --git a/app/views/users/passwords/edit.html.erb b/app/views/users/passwords/edit.html.erb index a62d33f4..2cec4812 100644 --- a/app/views/users/passwords/edit.html.erb +++ b/app/views/users/passwords/edit.html.erb @@ -1,7 +1,6 @@ <% content_for :title, "Change Password | Metamaps" %> -

      Change Password

      - +
      <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :put, :class => "forgotPassword centerGreyForm" }) do |f| %> <%= devise_error_messages! %> <%= f.hidden_field :reset_password_token %> @@ -17,5 +16,5 @@
      <%= f.submit "Change my password" %>
      <% end %> - +
      diff --git a/app/views/users/passwords/new.html.erb b/app/views/users/passwords/new.html.erb index 2fa7b099..bdd7a8bc 100644 --- a/app/views/users/passwords/new.html.erb +++ b/app/views/users/passwords/new.html.erb @@ -1,7 +1,6 @@ <% content_for :title, "Password Reset | Metamaps" %> -

      Password Reset

      - +
      <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post, :class => "forgotPassword centerGreyForm" }) do |f| %> <%= devise_error_messages! %> @@ -13,5 +12,6 @@
      <%= f.submit "Send me reset password instructions" %>
      <% end %> +
      diff --git a/app/views/users/registrations/new.html.erb b/app/views/users/registrations/new.html.erb index ec61da36..e7c08256 100644 --- a/app/views/users/registrations/new.html.erb +++ b/app/views/users/registrations/new.html.erb @@ -1,7 +1,6 @@ <% content_for :title, "Sign Up | Metamaps" %> -

      Sign Up

      - +
      <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :post, :class => "new_user centerGreyForm" }) do |f| %> <%= devise_error_messages! %> @@ -24,7 +23,7 @@
      <%= f.submit "Sign up" %>
      -

      Don't have an access code?
      Request an Invite
      +

      Don't have an access code?
      Request an Invite
      <% end %> - +
      diff --git a/app/views/users/sessions/new.html.erb b/app/views/users/sessions/new.html.erb index ef9866f5..6f55203b 100644 --- a/app/views/users/sessions/new.html.erb +++ b/app/views/users/sessions/new.html.erb @@ -1,7 +1,6 @@ <% content_for :title, "Sign In | Metamaps" %> -

      Sign In

      - +
      <%= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :method => :post, :class => "new_user centerGreyForm" }) do |f| %>

      Sign in

      @@ -19,10 +18,11 @@
      <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot your password?", new_password_path(resource_name) %>
      + <%= link_to "Forgot your password?", new_password_path(resource_name), + :data => { :bypass => 'true'} %>
      <% end -%>
      -
      Don't have an account?
      Request an Invite
      +
      Don't have an account?
      Request an Invite
      <% end %> - +
      diff --git a/public/famous/main.js b/public/famous/main.js index 3a8c0f91..beaf6bca 100644 --- a/public/famous/main.js +++ b/public/famous/main.js @@ -100,10 +100,12 @@ define(function(require, exports, module) { f.loadYield = function () { Metamaps.Loading.loader.hide(); - var yield = document.getElementById('yield').innerHTML; - f.yield.surf.setContent(yield); - f.yield.surf.deploy(f.yield.surf._currTarget); - f.yield.show(); + var yield = document.getElementById('yield') ? document.getElementById('yield').innerHTML : false; + if (yield) { + f.yield.surf.setContent(yield); + f.yield.surf.deploy(f.yield.surf._currTarget); + f.yield.show(); + } }; From f0eb4da6a94ad03b9b8766446352d730ab2e99dd Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 11:10:32 -0400 Subject: [PATCH 053/600] realtime for heroku --- app/assets/javascripts/metamaps/Metamaps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 94db1fcd..a14f9640 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -1396,7 +1396,7 @@ Metamaps.Realtime = { var mapperm = Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper); if (mapperm) { - self.socket = io.connect('http://localhost:5001'); + self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); self.socket.on('connect', function () { console.log('socket connected'); self.setupSocket(); From 173179d682e3620dac1f4ce4a03eab35d6163966 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 12:01:01 -0400 Subject: [PATCH 054/600] fixed filters, updated ruby models further for returning json --- app/assets/javascripts/metamaps/Metamaps.js | 15 +++------------ app/controllers/main_controller.rb | 10 +--------- app/models/map.rb | 6 +++++- app/models/mapping.rb | 12 ++++++++++++ app/models/synapse.rb | 12 ++++++++++++ app/models/topic.rb | 14 +++++++++++++- app/models/user.rb | 3 ++- 7 files changed, 48 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index a14f9640..a33a0989 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -126,9 +126,6 @@ Metamaps.Backbone.init = function () { }, getDate: function () { - }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); }, getMetacode: function () { return Metamaps.Metacodes.get(this.get('metacode_id')); @@ -212,9 +209,6 @@ Metamaps.Backbone.init = function () { if (mapper && this.get('user_id') === mapper.get('id')) return true; else return false; }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, getTopic1: function () { return Metamaps.Topic.get(this.get('node1_id')); }, @@ -291,9 +285,6 @@ Metamaps.Backbone.init = function () { }); } }, - getUser: function () { - return Metamaps.Mapper.get(this.get('user_id')); - }, getMap: function () { return Metamaps.Map.get(this.get('map_id')); }, @@ -921,7 +912,7 @@ Metamaps.TopicCard = { nodeValues.imgsrc = topic.getMetacode().get("icon"); nodeValues.name = topic.get("name"); nodeValues.userid = topic.get("user_id"); - nodeValues.username = topic.getUser().get("name"); + nodeValues.username = topic.get("user_name"); nodeValues.date = topic.getDate(); // the code for this is stored in /views/main/_metacodeOptions.html.erb nodeValues.metacode_select = $('#metacodeOptions').html(); @@ -1033,7 +1024,7 @@ Metamaps.SynapseCard = { add_user_info: function (synapse) { var u = '
      '; - u += '
      Created by ' + synapse.getUser().get("name") + '
      '; + u += '
      Created by ' + synapse.get("user_name") + '
    '; $('#edit_synapse').append(u); }, @@ -2180,7 +2171,7 @@ Metamaps.Filter = { }, checkMappers: function () { var self = Metamaps.Filter; - self.updateFilters('both', 'user_id', 'Mapper', 'mappers', 'mapper'); + self.updateFilters('both', 'user_id', 'Mappers', 'mappers', 'mapper'); }, checkSynapses: function () { var self = Metamaps.Filter; diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index eac994fa..fe7de0fe 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -9,17 +9,9 @@ class MainController < ApplicationController # home page def home @current = current_user - - if !authenticated? - @maps = Map.find_all_by_featured(true).shuffle! - @maps = @maps.slice(0,3) - elsif authenticated? - #@maps = Map.order("updated_at DESC").where("permission != ?", "private").limit(3) - @maps = Map.order("name ASC").find_all_by_user_id(@current.id) - end respond_to do |format| - format.html { respond_with(@maps, @current) } + format.html { respond_with(@current) } end end diff --git a/app/models/map.rb b/app/models/map.rb index 2bfcd663..cc86b6d3 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -45,8 +45,12 @@ end self.user.name end + def user_image + self.user.image.url + end + def as_json(options={}) - super(:methods =>[:user_name, :topic_count, :synapse_count]) + super(:methods =>[:user_name, :user_image, :topic_count, :synapse_count]) end ##### PERMISSIONS ###### diff --git a/app/models/mapping.rb b/app/models/mapping.rb index ada72cf9..0de78e09 100644 --- a/app/models/mapping.rb +++ b/app/models/mapping.rb @@ -5,6 +5,18 @@ belongs_to :synapse, :class_name => "Synapse", :foreign_key => "synapse_id" belongs_to :map, :class_name => "Map", :foreign_key => "map_id" belongs_to :user + + def user_name + self.user.name + end + + def user_image + self.user.image.url + end + + def as_json(options={}) + super(:methods =>[:user_name, :user_image]) + end # sends push updates through redis to websockets for realtime updates def message action, origin_user_id diff --git a/app/models/synapse.rb b/app/models/synapse.rb index 1415997e..f7dc58c6 100644 --- a/app/models/synapse.rb +++ b/app/models/synapse.rb @@ -8,6 +8,18 @@ belongs_to :topic2, :class_name => "Topic", :foreign_key => "node2_id" has_many :mappings has_many :maps, :through => :mappings + def user_name + self.user.name + end + + def user_image + self.user.image.url + end + + def as_json(options={}) + super(:methods =>[:user_name, :user_image]) + end + # sends push updates through redis to websockets for realtime updates def message action, origin_user_id diff --git a/app/models/topic.rb b/app/models/topic.rb index 668c94fe..79183195 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -37,7 +37,19 @@ has_many :maps, :through => :mappings topics1 + topics2 end -belongs_to :metacode + belongs_to :metacode + + def user_name + self.user.name + end + + def user_image + self.user.image.url + end + + def as_json(options={}) + super(:methods =>[:user_name, :user_image]) + end # sends push updates through redis to websockets for realtime updates def message action, origin_user_id diff --git a/app/models/user.rb b/app/models/user.rb index c5bb0969..bf2ddd9a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -40,7 +40,8 @@ has_many :mappings end def as_json(options={}) - { :name =>self.name, + { :id => self.id, + :name => self.name, :email => self.email, :image => self.image.url } From f8e6be70e1f7793770250a936c6e5c002140e653 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Tue, 12 Aug 2014 12:56:13 -0400 Subject: [PATCH 055/600] fixed topic card css --- app/assets/javascripts/metamaps/Metamaps.js | 3 ++ app/assets/stylesheets/base.css | 58 ++------------------- 2 files changed, 7 insertions(+), 54 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 94db1fcd..73ea1044 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -691,6 +691,9 @@ Metamaps.TopicCard = { setTimeout(function () { var text = $(element).val(); if (event.type=="paste" || (event.type=="keyup" && event.which==13)){ + if (text.slice(0, 4) !== 'http') { + text='http://'+text; + } topic.save({ link: text }); diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index cce83474..39dca589 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -9,11 +9,10 @@ .showcard { position:absolute; display:none; - top:300px; + top:100px; left:100px; - margin-top: -181px; width:300px; - height:360px; + min-height:360px; color:#FFF; text-align: left; overflow: visible; @@ -48,28 +47,11 @@ height:100%; color:#000; z-index: 25; - display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ - display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */ - display: -ms-flexbox; /* TWEENER - IE 10 */ - display: -webkit-flex; /* NEW - Chrome */ - display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */ - -webkit-box-orient: vertical; - -moz-box-orient: vertical; - -webkit-box-direction: normal; - -moz-box-direction: normal; - -ms-flex-direction: column; - -webkit-flex-direction: column; - flex-direction: column; } .CardOnGraph .scroll { display:block; - padding:5px 0 0 10px; - -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: 1; /* OLD - Firefox 19- */ - -webkit-flex: 1; /* Chrome */ - -ms-flex: 1; /* IE 10 */ - flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */ + padding:5px 0 10px 10px; } .CardOnGraph .type { @@ -89,11 +71,6 @@ padding:5px; font-weight: bold; text-align: center; - -webkit-box-flex: none; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: none; /* OLD - Firefox 19- */ - -webkit-flex: none; /* Chrome */ - -ms-flex: none; /* IE 10 */ - flex: none; /* NEW, Spec - Opera 12.1, Firefox 20+ */ } .best_in_place_name { @@ -157,11 +134,6 @@ font-family: 'LatoLight'; position:relative; border-bottom: 1px solid #AAAAAA; border-top: 1px solid #AAAAAA; - -webkit-box-flex: none; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: none; /* OLD - Firefox 19- */ - -webkit-flex: none; /* Chrome */ - -ms-flex: none; /* IE 10 */ - flex: none; /* NEW, Spec - Opera 12.1, Firefox 20+ */ } .linkItem { @@ -359,34 +331,12 @@ float:left; .CardOnGraph .attachments { - -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: 1; /* OLD - Firefox 19- */ - -webkit-flex: 1; /* Chrome */ - -ms-flex: 1; /* IE 10 */ - flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */ - display: -webkit-box; /* OLD - iOS 6-, Safari 3.1-6 */ - display: -moz-box; /* OLD - Firefox 19- (buggy but mostly works) */ - display: -ms-flexbox; /* TWEENER - IE 10 */ - display: -webkit-flex; /* NEW - Chrome */ - display: flex; /* NEW, Spec - Opera 12.1, Firefox 20+ */ - -webkit-box-orient: horizontal; - -moz-box-orient: horizontal; - -webkit-box-direction: normal; - -moz-box-direction: normal; - -ms-flex-direction: row; - -webkit-flex-direction: row; - flex-direction: row; border-top: 1px solid #AAAAAA; width:100%; - max-height:48px; + height:48px; } .attachments a { - -webkit-box-flex: 1; /* OLD - iOS 6-, Safari 3.1-6 */ - -moz-box-flex: 1; /* OLD - Firefox 19- */ - -webkit-flex: 1; /* Chrome */ - -ms-flex: 1; /* IE 10 */ - flex: 1; /* NEW, Spec - Opera 12.1, Firefox 20+ */ white-space: nowrap; overflow: hidden; text-overflow: ellipsis; From c989b321c1bf830253de6150577f0420a84a898d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 13:22:29 -0400 Subject: [PATCH 056/600] switched filter box to be by who added something to the map, not who created the topic or synapse --- app/assets/javascripts/metamaps/Metamaps.js | 49 +++++++++++---------- app/views/shared/_filterBox.html.erb | 11 +++-- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 64bc4991..e1ffbcbc 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -2073,8 +2073,7 @@ Metamaps.Filter = { }); }; check('metacodes', 'Topics', 'metacode_id'); - check('mappers', 'Topics', 'user_id'); - check('mappers', 'Synapses', 'user_id'); + check('mappers', 'Mappings', 'user_id'); check('synapses', 'Synapses', 'desc'); }, /* @@ -2115,26 +2114,19 @@ Metamaps.Filter = { /* @param */ - updateFilters: function (topicsSynapsesOrBoth, propertyToCheck, correlatedModel, filtersToUse, listToModify) { + updateFilters: function (collection, propertyToCheck, correlatedModel, filtersToUse, listToModify) { var self = Metamaps.Filter; var newList = []; var removed = []; var added = []; - var check = function (topicsOrSynapses) { - Metamaps[topicsOrSynapses].each(function(model) { - var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; - if (prop && newList.indexOf(prop) === -1) { - newList.push(prop); - } - }); - } - if (topicsSynapsesOrBoth === "both") { - check('Synapses'); - check('Topics'); - } - else check(topicsSynapsesOrBoth); + Metamaps[collection].each(function(model) { + var prop = model.get(propertyToCheck) ? model.get(propertyToCheck).toString() : false; + if (prop && newList.indexOf(prop) === -1) { + newList.push(prop); + } + }); removed = _.difference(self.filters[filtersToUse], newList); added = _.difference(newList, self.filters[filtersToUse]); @@ -2174,7 +2166,7 @@ Metamaps.Filter = { }, checkMappers: function () { var self = Metamaps.Filter; - self.updateFilters('both', 'user_id', 'Mappers', 'mappers', 'mapper'); + self.updateFilters('Mappings', 'user_id', 'Mappers', 'mappers', 'mapper'); }, checkSynapses: function () { var self = Metamaps.Filter; @@ -2251,18 +2243,26 @@ Metamaps.Filter = { var self = Metamaps.Filter; var visible = self.visible; - var passesMetacode, passesMapper, passesSynapse; + var passesMetacode, passesMapper, passesSynapse; + var onMap; + + if (Metamaps.Active.Map) { + onMap = true; + passesMapper = true; + } Metamaps.Topics.each(function(topic) { var n = topic.get('node'); var metacode_id = topic.get("metacode_id").toString(); - var user_id = topic.get("user_id").toString(); if (visible.metacodes.indexOf(metacode_id) == -1) passesMetacode = false; else passesMetacode = true; - if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; - else passesMapper = true; + if (onMap) { + var user_id = topic.getMapping().get("user_id").toString(); + if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; + else passesMapper = true; + } if (passesMetacode && passesMapper) { n.setData('alpha', 1, 'end'); @@ -2279,8 +2279,11 @@ Metamaps.Filter = { if (visible.synapses.indexOf(desc) == -1) passesSynapse = false; else passesSynapse = true; - if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; - else passesMapper = true; + if (onMap) { + var user_id = synapse.getMapping().get("user_id").toString(); + if (visible.mappers.indexOf(user_id) == -1) passesMapper = false; + else passesMapper = true; + } if (passesSynapse && passesMapper) { e.setData('alpha', 1, 'end'); diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb index 984303bf..b5dbf416 100644 --- a/app/views/shared/_filterBox.html.erb +++ b/app/views/shared/_filterBox.html.erb @@ -21,16 +21,15 @@ if @metacodes.index(topic.metacode) == nil @metacodes.push(topic.metacode) end - if @mappers.index(topic.user) == nil - @mappers.push(topic.user) - end end @map.synapses.each_with_index do |synapse, index| if @synapses.index{|s| s.desc == synapse.desc} == nil @synapses.push(synapse) - end - if @mappers.index(synapse.user) == nil - @mappers.push(synapse.user) + end + end + @map.mappings.each_with_index do |mapping, index| + if @mappers.index(mapping.user) == nil + @mappers.push(mapping.user) end end From 6bdc6ec3975e85597de365ccad647d4013f44dd2 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 13:30:56 -0400 Subject: [PATCH 057/600] fix for filtering when no edge or node is returned from the topic or synapse --- app/assets/javascripts/metamaps/Metamaps.js | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index e1ffbcbc..be08684d 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -2265,10 +2265,16 @@ Metamaps.Filter = { } if (passesMetacode && passesMapper) { - n.setData('alpha', 1, 'end'); + if (n) { + n.setData('alpha', 1, 'end'); + } + else console.log(topic); } else { - n.setData('alpha', 0, 'end'); + if (n) { + n.setData('alpha', 0, 'end'); + } + else console.log(topic); } }); Metamaps.Synapses.each(function(synapse) { @@ -2286,10 +2292,16 @@ Metamaps.Filter = { } if (passesSynapse && passesMapper) { - e.setData('alpha', 1, 'end'); + if (e) { + e.setData('alpha', 1, 'end'); + } + else console.log(synapse); } else { - e.setData('alpha', 0, 'end'); + if (e) { + e.setData('alpha', 0, 'end'); + } + else console.log(synapse); } }); From 35835fcc80e47de336f6bafbed783081c4671090 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 13:45:29 -0400 Subject: [PATCH 058/600] fixed home page difference between being logged in and logged out --- app/assets/javascripts/metamaps/Metamaps.js | 4 ++-- app/controllers/main_controller.rb | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index be08684d..067ba7b0 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -2248,8 +2248,8 @@ Metamaps.Filter = { if (Metamaps.Active.Map) { onMap = true; - passesMapper = true; - } + } + else passesMapper = true; // for when you're on a topic page Metamaps.Topics.each(function(topic) { var n = topic.get('node'); diff --git a/app/controllers/main_controller.rb b/app/controllers/main_controller.rb index fe7de0fe..a055f11a 100644 --- a/app/controllers/main_controller.rb +++ b/app/controllers/main_controller.rb @@ -11,7 +11,14 @@ class MainController < ApplicationController @current = current_user respond_to do |format| - format.html { respond_with(@current) } + format.html { + if authenticated? + @maps = Map.order("name ASC").find_all_by_user_id(@current.id) + respond_with(@maps, @current) + else + respond_with(@current) + end + } end end From 6422b54dc0c996772af430aa83797b42a41f662c Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 12 Aug 2014 18:14:04 -0400 Subject: [PATCH 059/600] clickable map cards --- .../javascripts/metamaps/Metamaps.Router.js | 2 +- app/assets/stylesheets/ForceDirected.css | 23 - .../stylesheets/{users.css.scss => admin.css} | 3 - app/assets/stylesheets/animate.css | 3263 ----------------- app/assets/stylesheets/application.css | 10 - app/assets/stylesheets/base.css | 9 +- app/assets/stylesheets/clean.css | 13 +- app/assets/stylesheets/synapses.css.scss | 57 - app/controllers/mappings_controller.rb | 2 - app/controllers/synapses_controller.rb | 2 +- app/controllers/users_controller.rb | 6 +- app/helpers/topics_helper.rb | 100 +- app/models/map.rb | 76 +- app/models/mapping.rb | 8 +- app/models/synapse.rb | 94 +- app/models/topic.rb | 193 +- app/models/user.rb | 9 +- app/views/layouts/_templates.html.erb | 11 +- app/views/layouts/_upperelements.html.erb | 2 +- app/views/maps/_map.html.erb | 10 +- config/routes.rb | 12 +- public/famous/main.js | 20 +- public/famous/templates.js | 85 +- 23 files changed, 137 insertions(+), 3873 deletions(-) delete mode 100644 app/assets/stylesheets/ForceDirected.css rename app/assets/stylesheets/{users.css.scss => admin.css} (81%) delete mode 100644 app/assets/stylesheets/animate.css delete mode 100644 app/assets/stylesheets/synapses.css.scss diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/metamaps/Metamaps.Router.js index 3702400c..0f044dca 100644 --- a/app/assets/javascripts/metamaps/Metamaps.Router.js +++ b/app/assets/javascripts/metamaps/Metamaps.Router.js @@ -78,7 +78,7 @@ Metamaps.Loading.loader.show(); setTimeout(function(){ Metamaps.Maps[capitalize].getMaps(); // this will trigger an explore maps render - }, 1000); // wait 500 milliseconds till the other animations are done to do the fetch + }, 300); // wait 300 milliseconds till the other animations are done to do the fetch } else { Metamaps.Views.exploreMaps.render(); diff --git a/app/assets/stylesheets/ForceDirected.css b/app/assets/stylesheets/ForceDirected.css deleted file mode 100644 index d0fd0f50..00000000 --- a/app/assets/stylesheets/ForceDirected.css +++ /dev/null @@ -1,23 +0,0 @@ -#inner-details { - -} - -.label { - display:block; - white-space: nowrap; - padding: 2px 4px; - background:#ddd; - opacity:0.8; - border-radius:5px; -} - -span.name { - cursor: pointer; - position: absolute; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} diff --git a/app/assets/stylesheets/users.css.scss b/app/assets/stylesheets/admin.css similarity index 81% rename from app/assets/stylesheets/users.css.scss rename to app/assets/stylesheets/admin.css index 829f76f8..70e68127 100644 --- a/app/assets/stylesheets/users.css.scss +++ b/app/assets/stylesheets/admin.css @@ -1,6 +1,3 @@ -// Place all the styles related to the users controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ .allMetacodes { diff --git a/app/assets/stylesheets/animate.css b/app/assets/stylesheets/animate.css deleted file mode 100644 index 274c303e..00000000 --- a/app/assets/stylesheets/animate.css +++ /dev/null @@ -1,3263 +0,0 @@ -@charset "UTF-8"; -/* -Animate.css - http://daneden.me/animate -Licensed under the ☺ license (http://licence.visualidiot.com/) - -Copyright (c) 2012 Dan Eden - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ -body { /* Addresses a small issue in webkit: http://bit.ly/NEdoDq */ - -webkit-backface-visibility: hidden; -} -.animated { - -webkit-animation-duration: 1s; - -moz-animation-duration: 1s; - -o-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - -moz-animation-fill-mode: both; - -o-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animated.hinge { - -webkit-animation-duration: 2s; - -moz-animation-duration: 2s; - -o-animation-duration: 2s; - animation-duration: 2s; -} - -@-webkit-keyframes flash { - 0%, 50%, 100% {opacity: 1;} - 25%, 75% {opacity: 0;} -} - -@-moz-keyframes flash { - 0%, 50%, 100% {opacity: 1;} - 25%, 75% {opacity: 0;} -} - -@-o-keyframes flash { - 0%, 50%, 100% {opacity: 1;} - 25%, 75% {opacity: 0;} -} - -@keyframes flash { - 0%, 50%, 100% {opacity: 1;} - 25%, 75% {opacity: 0;} -} - -.flash { - -webkit-animation-name: flash; - -moz-animation-name: flash; - -o-animation-name: flash; - animation-name: flash; -} -@-webkit-keyframes shake { - 0%, 100% {-webkit-transform: translateX(0);} - 10%, 30%, 50%, 70%, 90% {-webkit-transform: translateX(-10px);} - 20%, 40%, 60%, 80% {-webkit-transform: translateX(10px);} -} - -@-moz-keyframes shake { - 0%, 100% {-moz-transform: translateX(0);} - 10%, 30%, 50%, 70%, 90% {-moz-transform: translateX(-10px);} - 20%, 40%, 60%, 80% {-moz-transform: translateX(10px);} -} - -@-o-keyframes shake { - 0%, 100% {-o-transform: translateX(0);} - 10%, 30%, 50%, 70%, 90% {-o-transform: translateX(-10px);} - 20%, 40%, 60%, 80% {-o-transform: translateX(10px);} -} - -@keyframes shake { - 0%, 100% {transform: translateX(0);} - 10%, 30%, 50%, 70%, 90% {transform: translateX(-10px);} - 20%, 40%, 60%, 80% {transform: translateX(10px);} -} - -.shake { - -webkit-animation-name: shake; - -moz-animation-name: shake; - -o-animation-name: shake; - animation-name: shake; -} -@-webkit-keyframes bounce { - 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} - 40% {-webkit-transform: translateY(-30px);} - 60% {-webkit-transform: translateY(-15px);} -} - -@-moz-keyframes bounce { - 0%, 20%, 50%, 80%, 100% {-moz-transform: translateY(0);} - 40% {-moz-transform: translateY(-30px);} - 60% {-moz-transform: translateY(-15px);} -} - -@-o-keyframes bounce { - 0%, 20%, 50%, 80%, 100% {-o-transform: translateY(0);} - 40% {-o-transform: translateY(-30px);} - 60% {-o-transform: translateY(-15px);} -} -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} - 40% {transform: translateY(-30px);} - 60% {transform: translateY(-15px);} -} - -.bounce { - -webkit-animation-name: bounce; - -moz-animation-name: bounce; - -o-animation-name: bounce; - animation-name: bounce; -} -@-webkit-keyframes tada { - 0% {-webkit-transform: scale(1);} - 10%, 20% {-webkit-transform: scale(0.9) rotate(-3deg);} - 30%, 50%, 70%, 90% {-webkit-transform: scale(1.1) rotate(3deg);} - 40%, 60%, 80% {-webkit-transform: scale(1.1) rotate(-3deg);} - 100% {-webkit-transform: scale(1) rotate(0);} -} - -@-moz-keyframes tada { - 0% {-moz-transform: scale(1);} - 10%, 20% {-moz-transform: scale(0.9) rotate(-3deg);} - 30%, 50%, 70%, 90% {-moz-transform: scale(1.1) rotate(3deg);} - 40%, 60%, 80% {-moz-transform: scale(1.1) rotate(-3deg);} - 100% {-moz-transform: scale(1) rotate(0);} -} - -@-o-keyframes tada { - 0% {-o-transform: scale(1);} - 10%, 20% {-o-transform: scale(0.9) rotate(-3deg);} - 30%, 50%, 70%, 90% {-o-transform: scale(1.1) rotate(3deg);} - 40%, 60%, 80% {-o-transform: scale(1.1) rotate(-3deg);} - 100% {-o-transform: scale(1) rotate(0);} -} - -@keyframes tada { - 0% {transform: scale(1);} - 10%, 20% {transform: scale(0.9) rotate(-3deg);} - 30%, 50%, 70%, 90% {transform: scale(1.1) rotate(3deg);} - 40%, 60%, 80% {transform: scale(1.1) rotate(-3deg);} - 100% {transform: scale(1) rotate(0);} -} - -.tada { - -webkit-animation-name: tada; - -moz-animation-name: tada; - -o-animation-name: tada; - animation-name: tada; -} -@-webkit-keyframes swing { - 20%, 40%, 60%, 80%, 100% { -webkit-transform-origin: top center; } - 20% { -webkit-transform: rotate(15deg); } - 40% { -webkit-transform: rotate(-10deg); } - 60% { -webkit-transform: rotate(5deg); } - 80% { -webkit-transform: rotate(-5deg); } - 100% { -webkit-transform: rotate(0deg); } -} - -@-moz-keyframes swing { - 20% { -moz-transform: rotate(15deg); } - 40% { -moz-transform: rotate(-10deg); } - 60% { -moz-transform: rotate(5deg); } - 80% { -moz-transform: rotate(-5deg); } - 100% { -moz-transform: rotate(0deg); } -} - -@-o-keyframes swing { - 20% { -o-transform: rotate(15deg); } - 40% { -o-transform: rotate(-10deg); } - 60% { -o-transform: rotate(5deg); } - 80% { -o-transform: rotate(-5deg); } - 100% { -o-transform: rotate(0deg); } -} - -@keyframes swing { - 20% { transform: rotate(15deg); } - 40% { transform: rotate(-10deg); } - 60% { transform: rotate(5deg); } - 80% { transform: rotate(-5deg); } - 100% { transform: rotate(0deg); } -} - -.swing { - -webkit-transform-origin: top center; - -moz-transform-origin: top center; - -o-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - -moz-animation-name: swing; - -o-animation-name: swing; - animation-name: swing; -} -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes wobble { - 0% { -webkit-transform: translateX(0%); } - 15% { -webkit-transform: translateX(-25%) rotate(-5deg); } - 30% { -webkit-transform: translateX(20%) rotate(3deg); } - 45% { -webkit-transform: translateX(-15%) rotate(-3deg); } - 60% { -webkit-transform: translateX(10%) rotate(2deg); } - 75% { -webkit-transform: translateX(-5%) rotate(-1deg); } - 100% { -webkit-transform: translateX(0%); } -} - -@-moz-keyframes wobble { - 0% { -moz-transform: translateX(0%); } - 15% { -moz-transform: translateX(-25%) rotate(-5deg); } - 30% { -moz-transform: translateX(20%) rotate(3deg); } - 45% { -moz-transform: translateX(-15%) rotate(-3deg); } - 60% { -moz-transform: translateX(10%) rotate(2deg); } - 75% { -moz-transform: translateX(-5%) rotate(-1deg); } - 100% { -moz-transform: translateX(0%); } -} - -@-o-keyframes wobble { - 0% { -o-transform: translateX(0%); } - 15% { -o-transform: translateX(-25%) rotate(-5deg); } - 30% { -o-transform: translateX(20%) rotate(3deg); } - 45% { -o-transform: translateX(-15%) rotate(-3deg); } - 60% { -o-transform: translateX(10%) rotate(2deg); } - 75% { -o-transform: translateX(-5%) rotate(-1deg); } - 100% { -o-transform: translateX(0%); } -} - -@keyframes wobble { - 0% { transform: translateX(0%); } - 15% { transform: translateX(-25%) rotate(-5deg); } - 30% { transform: translateX(20%) rotate(3deg); } - 45% { transform: translateX(-15%) rotate(-3deg); } - 60% { transform: translateX(10%) rotate(2deg); } - 75% { transform: translateX(-5%) rotate(-1deg); } - 100% { transform: translateX(0%); } -} - -.wobble { - -webkit-animation-name: wobble; - -moz-animation-name: wobble; - -o-animation-name: wobble; - animation-name: wobble; -} -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes pulse { - 0% { -webkit-transform: scale(1); } - 50% { -webkit-transform: scale(1.1); } - 100% { -webkit-transform: scale(1); } -} -@-moz-keyframes pulse { - 0% { -moz-transform: scale(1); } - 50% { -moz-transform: scale(1.1); } - 100% { -moz-transform: scale(1); } -} -@-o-keyframes pulse { - 0% { -o-transform: scale(1); } - 50% { -o-transform: scale(1.1); } - 100% { -o-transform: scale(1); } -} -@keyframes pulse { - 0% { transform: scale(1); } - 50% { transform: scale(1.1); } - 100% { transform: scale(1); } -} - -.pulse { - -webkit-animation-name: pulse; - -moz-animation-name: pulse; - -o-animation-name: pulse; - animation-name: pulse; -} -@-webkit-keyframes flip { - 0% { - -webkit-transform: perspective(400px) rotateY(0); - -webkit-animation-timing-function: ease-out; - } - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg); - -webkit-animation-timing-function: ease-out; - } - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -webkit-animation-timing-function: ease-in; - } - 80% { - -webkit-transform: perspective(400px) rotateY(360deg) scale(.95); - -webkit-animation-timing-function: ease-in; - } - 100% { - -webkit-transform: perspective(400px) scale(1); - -webkit-animation-timing-function: ease-in; - } -} -@-moz-keyframes flip { - 0% { - -moz-transform: perspective(400px) rotateY(0); - -moz-animation-timing-function: ease-out; - } - 40% { - -moz-transform: perspective(400px) translateZ(150px) rotateY(170deg); - -moz-animation-timing-function: ease-out; - } - 50% { - -moz-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -moz-animation-timing-function: ease-in; - } - 80% { - -moz-transform: perspective(400px) rotateY(360deg) scale(.95); - -moz-animation-timing-function: ease-in; - } - 100% { - -moz-transform: perspective(400px) scale(1); - -moz-animation-timing-function: ease-in; - } -} -@-o-keyframes flip { - 0% { - -o-transform: perspective(400px) rotateY(0); - -o-animation-timing-function: ease-out; - } - 40% { - -o-transform: perspective(400px) translateZ(150px) rotateY(170deg); - -o-animation-timing-function: ease-out; - } - 50% { - -o-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -o-animation-timing-function: ease-in; - } - 80% { - -o-transform: perspective(400px) rotateY(360deg) scale(.95); - -o-animation-timing-function: ease-in; - } - 100% { - -o-transform: perspective(400px) scale(1); - -o-animation-timing-function: ease-in; - } -} -@keyframes flip { - 0% { - transform: perspective(400px) rotateY(0); - animation-timing-function: ease-out; - } - 40% { - transform: perspective(400px) translateZ(150px) rotateY(170deg); - animation-timing-function: ease-out; - } - 50% { - transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - animation-timing-function: ease-in; - } - 80% { - transform: perspective(400px) rotateY(360deg) scale(.95); - animation-timing-function: ease-in; - } - 100% { - transform: perspective(400px) scale(1); - animation-timing-function: ease-in; - } -} - -.flip { - -webkit-backface-visibility: visible !important; - -webkit-animation-name: flip; - -moz-backface-visibility: visible !important; - -moz-animation-name: flip; - -o-backface-visibility: visible !important; - -o-animation-name: flip; - backface-visibility: visible !important; - animation-name: flip; -} -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} -@-moz-keyframes flipInX { - 0% { - -moz-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - -moz-transform: perspective(400px) rotateX(-10deg); - } - - 70% { - -moz-transform: perspective(400px) rotateX(10deg); - } - - 100% { - -moz-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} -@-o-keyframes flipInX { - 0% { - -o-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - -o-transform: perspective(400px) rotateX(-10deg); - } - - 70% { - -o-transform: perspective(400px) rotateX(10deg); - } - - 100% { - -o-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} -@keyframes flipInX { - 0% { - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - transform: perspective(400px) rotateX(-10deg); - } - - 70% { - transform: perspective(400px) rotateX(10deg); - } - - 100% { - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} - -.flipInX { - -webkit-backface-visibility: visible !important; - -webkit-animation-name: flipInX; - -moz-backface-visibility: visible !important; - -moz-animation-name: flipInX; - -o-backface-visibility: visible !important; - -o-animation-name: flipInX; - backface-visibility: visible !important; - animation-name: flipInX; -} -@-webkit-keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - 100% { - -webkit-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -@-moz-keyframes flipOutX { - 0% { - -moz-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - 100% { - -moz-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -@-o-keyframes flipOutX { - 0% { - -o-transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - 100% { - -o-transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -@keyframes flipOutX { - 0% { - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - 100% { - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -.flipOutX { - -webkit-animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - -moz-animation-name: flipOutX; - -moz-backface-visibility: visible !important; - -o-animation-name: flipOutX; - -o-backface-visibility: visible !important; - animation-name: flipOutX; - backface-visibility: visible !important; -} -@-webkit-keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateY(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateY(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} -@-moz-keyframes flipInY { - 0% { - -moz-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - -moz-transform: perspective(400px) rotateY(-10deg); - } - - 70% { - -moz-transform: perspective(400px) rotateY(10deg); - } - - 100% { - -moz-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} -@-o-keyframes flipInY { - 0% { - -o-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - -o-transform: perspective(400px) rotateY(-10deg); - } - - 70% { - -o-transform: perspective(400px) rotateY(10deg); - } - - 100% { - -o-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} -@keyframes flipInY { - 0% { - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - transform: perspective(400px) rotateY(-10deg); - } - - 70% { - transform: perspective(400px) rotateY(10deg); - } - - 100% { - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} - -.flipInY { - -webkit-backface-visibility: visible !important; - -webkit-animation-name: flipInY; - -moz-backface-visibility: visible !important; - -moz-animation-name: flipInY; - -o-backface-visibility: visible !important; - -o-animation-name: flipInY; - backface-visibility: visible !important; - animation-name: flipInY; -} -@-webkit-keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - 100% { - -webkit-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -@-moz-keyframes flipOutY { - 0% { - -moz-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - 100% { - -moz-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -@-o-keyframes flipOutY { - 0% { - -o-transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - 100% { - -o-transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} -@keyframes flipOutY { - 0% { - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - 100% { - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} - -.flipOutY { - -webkit-backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - -moz-backface-visibility: visible !important; - -moz-animation-name: flipOutY; - -o-backface-visibility: visible !important; - -o-animation-name: flipOutY; - backface-visibility: visible !important; - animation-name: flipOutY; -} -@-webkit-keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -@-moz-keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -@-o-keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -@keyframes fadeIn { - 0% {opacity: 0;} - 100% {opacity: 1;} -} - -.fadeIn { - -webkit-animation-name: fadeIn; - -moz-animation-name: fadeIn; - -o-animation-name: fadeIn; - animation-name: fadeIn; -} -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} - -@-moz-keyframes fadeInUp { - 0% { - opacity: 0; - -moz-transform: translateY(20px); - } - - 100% { - opacity: 1; - -moz-transform: translateY(0); - } -} - -@-o-keyframes fadeInUp { - 0% { - opacity: 0; - -o-transform: translateY(20px); - } - - 100% { - opacity: 1; - -o-transform: translateY(0); - } -} - -@keyframes fadeInUp { - 0% { - opacity: 0; - transform: translateY(20px); - } - - 100% { - opacity: 1; - transform: translateY(0); - } -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - -moz-animation-name: fadeInUp; - -o-animation-name: fadeInUp; - animation-name: fadeInUp; -} -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} - -@-moz-keyframes fadeInDown { - 0% { - opacity: 0; - -moz-transform: translateY(-20px); - } - - 100% { - opacity: 1; - -moz-transform: translateY(0); - } -} - -@-o-keyframes fadeInDown { - 0% { - opacity: 0; - -o-transform: translateY(-20px); - } - - 100% { - opacity: 1; - -o-transform: translateY(0); - } -} - -@keyframes fadeInDown { - 0% { - opacity: 0; - transform: translateY(-20px); - } - - 100% { - opacity: 1; - transform: translateY(0); - } -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - -moz-animation-name: fadeInDown; - -o-animation-name: fadeInDown; - animation-name: fadeInDown; -} -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes fadeInLeft { - 0% { - opacity: 0; - -moz-transform: translateX(-20px); - } - - 100% { - opacity: 1; - -moz-transform: translateX(0); - } -} - -@-o-keyframes fadeInLeft { - 0% { - opacity: 0; - -o-transform: translateX(-20px); - } - - 100% { - opacity: 1; - -o-transform: translateX(0); - } -} - -@keyframes fadeInLeft { - 0% { - opacity: 0; - transform: translateX(-20px); - } - - 100% { - opacity: 1; - transform: translateX(0); - } -} - -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - -moz-animation-name: fadeInLeft; - -o-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes fadeInRight { - 0% { - opacity: 0; - -moz-transform: translateX(20px); - } - - 100% { - opacity: 1; - -moz-transform: translateX(0); - } -} - -@-o-keyframes fadeInRight { - 0% { - opacity: 0; - -o-transform: translateX(20px); - } - - 100% { - opacity: 1; - -o-transform: translateX(0); - } -} - -@keyframes fadeInRight { - 0% { - opacity: 0; - transform: translateX(20px); - } - - 100% { - opacity: 1; - transform: translateX(0); - } -} - -.fadeInRight { - -webkit-animation-name: fadeInRight; - -moz-animation-name: fadeInRight; - -o-animation-name: fadeInRight; - animation-name: fadeInRight; -} -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} - -@-moz-keyframes fadeInUpBig { - 0% { - opacity: 0; - -moz-transform: translateY(2000px); - } - - 100% { - opacity: 1; - -moz-transform: translateY(0); - } -} - -@-o-keyframes fadeInUpBig { - 0% { - opacity: 0; - -o-transform: translateY(2000px); - } - - 100% { - opacity: 1; - -o-transform: translateY(0); - } -} - -@keyframes fadeInUpBig { - 0% { - opacity: 0; - transform: translateY(2000px); - } - - 100% { - opacity: 1; - transform: translateY(0); - } -} - -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - -moz-animation-name: fadeInUpBig; - -o-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - } -} - -@-moz-keyframes fadeInDownBig { - 0% { - opacity: 0; - -moz-transform: translateY(-2000px); - } - - 100% { - opacity: 1; - -moz-transform: translateY(0); - } -} - -@-o-keyframes fadeInDownBig { - 0% { - opacity: 0; - -o-transform: translateY(-2000px); - } - - 100% { - opacity: 1; - -o-transform: translateY(0); - } -} - -@keyframes fadeInDownBig { - 0% { - opacity: 0; - transform: translateY(-2000px); - } - - 100% { - opacity: 1; - transform: translateY(0); - } -} - -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - -moz-animation-name: fadeInDownBig; - -o-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} -@-moz-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -moz-transform: translateX(-2000px); - } - - 100% { - opacity: 1; - -moz-transform: translateX(0); - } -} -@-o-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -o-transform: translateX(-2000px); - } - - 100% { - opacity: 1; - -o-transform: translateX(0); - } -} -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - transform: translateX(-2000px); - } - - 100% { - opacity: 1; - transform: translateX(0); - } -} - -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - -moz-animation-name: fadeInLeftBig; - -o-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes fadeInRightBig { - 0% { - opacity: 0; - -moz-transform: translateX(2000px); - } - - 100% { - opacity: 1; - -moz-transform: translateX(0); - } -} - -@-o-keyframes fadeInRightBig { - 0% { - opacity: 0; - -o-transform: translateX(2000px); - } - - 100% { - opacity: 1; - -o-transform: translateX(0); - } -} - -@keyframes fadeInRightBig { - 0% { - opacity: 0; - transform: translateX(2000px); - } - - 100% { - opacity: 1; - transform: translateX(0); - } -} - -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - -moz-animation-name: fadeInRightBig; - -o-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} -@-webkit-keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -@-moz-keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -@-o-keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -@keyframes fadeOut { - 0% {opacity: 1;} - 100% {opacity: 0;} -} - -.fadeOut { - -webkit-animation-name: fadeOut; - -moz-animation-name: fadeOut; - -o-animation-name: fadeOut; - animation-name: fadeOut; -} -@-webkit-keyframes fadeOutUp { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-20px); - } -} -@-moz-keyframes fadeOutUp { - 0% { - opacity: 1; - -moz-transform: translateY(0); - } - - 100% { - opacity: 0; - -moz-transform: translateY(-20px); - } -} -@-o-keyframes fadeOutUp { - 0% { - opacity: 1; - -o-transform: translateY(0); - } - - 100% { - opacity: 0; - -o-transform: translateY(-20px); - } -} -@keyframes fadeOutUp { - 0% { - opacity: 1; - transform: translateY(0); - } - - 100% { - opacity: 0; - transform: translateY(-20px); - } -} - -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - -moz-animation-name: fadeOutUp; - -o-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} -@-webkit-keyframes fadeOutDown { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(20px); - } -} - -@-moz-keyframes fadeOutDown { - 0% { - opacity: 1; - -moz-transform: translateY(0); - } - - 100% { - opacity: 0; - -moz-transform: translateY(20px); - } -} - -@-o-keyframes fadeOutDown { - 0% { - opacity: 1; - -o-transform: translateY(0); - } - - 100% { - opacity: 0; - -o-transform: translateY(20px); - } -} - -@keyframes fadeOutDown { - 0% { - opacity: 1; - transform: translateY(0); - } - - 100% { - opacity: 0; - transform: translateY(20px); - } -} - -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - -moz-animation-name: fadeOutDown; - -o-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} -@-webkit-keyframes fadeOutLeft { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-20px); - } -} - -@-moz-keyframes fadeOutLeft { - 0% { - opacity: 1; - -moz-transform: translateX(0); - } - - 100% { - opacity: 0; - -moz-transform: translateX(-20px); - } -} - -@-o-keyframes fadeOutLeft { - 0% { - opacity: 1; - -o-transform: translateX(0); - } - - 100% { - opacity: 0; - -o-transform: translateX(-20px); - } -} - -@keyframes fadeOutLeft { - 0% { - opacity: 1; - transform: translateX(0); - } - - 100% { - opacity: 0; - transform: translateX(-20px); - } -} - -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - -moz-animation-name: fadeOutLeft; - -o-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} -@-webkit-keyframes fadeOutRight { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(20px); - } -} - -@-moz-keyframes fadeOutRight { - 0% { - opacity: 1; - -moz-transform: translateX(0); - } - - 100% { - opacity: 0; - -moz-transform: translateX(20px); - } -} - -@-o-keyframes fadeOutRight { - 0% { - opacity: 1; - -o-transform: translateX(0); - } - - 100% { - opacity: 0; - -o-transform: translateX(20px); - } -} - -@keyframes fadeOutRight { - 0% { - opacity: 1; - transform: translateX(0); - } - - 100% { - opacity: 0; - transform: translateX(20px); - } -} - -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - -moz-animation-name: fadeOutRight; - -o-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} -@-webkit-keyframes fadeOutUpBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - } -} - -@-moz-keyframes fadeOutUpBig { - 0% { - opacity: 1; - -moz-transform: translateY(0); - } - - 100% { - opacity: 0; - -moz-transform: translateY(-2000px); - } -} - -@-o-keyframes fadeOutUpBig { - 0% { - opacity: 1; - -o-transform: translateY(0); - } - - 100% { - opacity: 0; - -o-transform: translateY(-2000px); - } -} - -@keyframes fadeOutUpBig { - 0% { - opacity: 1; - transform: translateY(0); - } - - 100% { - opacity: 0; - transform: translateY(-2000px); - } -} - -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - -moz-animation-name: fadeOutUpBig; - -o-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} -@-webkit-keyframes fadeOutDownBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - } -} - -@-moz-keyframes fadeOutDownBig { - 0% { - opacity: 1; - -moz-transform: translateY(0); - } - - 100% { - opacity: 0; - -moz-transform: translateY(2000px); - } -} - -@-o-keyframes fadeOutDownBig { - 0% { - opacity: 1; - -o-transform: translateY(0); - } - - 100% { - opacity: 0; - -o-transform: translateY(2000px); - } -} - -@keyframes fadeOutDownBig { - 0% { - opacity: 1; - transform: translateY(0); - } - - 100% { - opacity: 0; - transform: translateY(2000px); - } -} - -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - -moz-animation-name: fadeOutDownBig; - -o-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} -@-webkit-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - } -} - -@-moz-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - -moz-transform: translateX(0); - } - - 100% { - opacity: 0; - -moz-transform: translateX(-2000px); - } -} - -@-o-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - -o-transform: translateX(0); - } - - 100% { - opacity: 0; - -o-transform: translateX(-2000px); - } -} - -@keyframes fadeOutLeftBig { - 0% { - opacity: 1; - transform: translateX(0); - } - - 100% { - opacity: 0; - transform: translateX(-2000px); - } -} - -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - -moz-animation-name: fadeOutLeftBig; - -o-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} -@-webkit-keyframes fadeOutRightBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - } -} -@-moz-keyframes fadeOutRightBig { - 0% { - opacity: 1; - -moz-transform: translateX(0); - } - - 100% { - opacity: 0; - -moz-transform: translateX(2000px); - } -} -@-o-keyframes fadeOutRightBig { - 0% { - opacity: 1; - -o-transform: translateX(0); - } - - 100% { - opacity: 0; - -o-transform: translateX(2000px); - } -} -@keyframes fadeOutRightBig { - 0% { - opacity: 1; - transform: translateX(0); - } - - 100% { - opacity: 0; - transform: translateX(2000px); - } -} - -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - -moz-animation-name: fadeOutRightBig; - -o-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} -@-webkit-keyframes bounceIn { - 0% { - opacity: 0; - -webkit-transform: scale(.3); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.05); - } - - 70% { - -webkit-transform: scale(.9); - } - - 100% { - -webkit-transform: scale(1); - } -} - -@-moz-keyframes bounceIn { - 0% { - opacity: 0; - -moz-transform: scale(.3); - } - - 50% { - opacity: 1; - -moz-transform: scale(1.05); - } - - 70% { - -moz-transform: scale(.9); - } - - 100% { - -moz-transform: scale(1); - } -} - -@-o-keyframes bounceIn { - 0% { - opacity: 0; - -o-transform: scale(.3); - } - - 50% { - opacity: 1; - -o-transform: scale(1.05); - } - - 70% { - -o-transform: scale(.9); - } - - 100% { - -o-transform: scale(1); - } -} - -@keyframes bounceIn { - 0% { - opacity: 0; - transform: scale(.3); - } - - 50% { - opacity: 1; - transform: scale(1.05); - } - - 70% { - transform: scale(.9); - } - - 100% { - transform: scale(1); - } -} - -.bounceIn { - -webkit-animation-name: bounceIn; - -moz-animation-name: bounceIn; - -o-animation-name: bounceIn; - animation-name: bounceIn; -} -@-webkit-keyframes bounceInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(-30px); - } - - 80% { - -webkit-transform: translateY(10px); - } - - 100% { - -webkit-transform: translateY(0); - } -} -@-moz-keyframes bounceInUp { - 0% { - opacity: 0; - -moz-transform: translateY(2000px); - } - - 60% { - opacity: 1; - -moz-transform: translateY(-30px); - } - - 80% { - -moz-transform: translateY(10px); - } - - 100% { - -moz-transform: translateY(0); - } -} - -@-o-keyframes bounceInUp { - 0% { - opacity: 0; - -o-transform: translateY(2000px); - } - - 60% { - opacity: 1; - -o-transform: translateY(-30px); - } - - 80% { - -o-transform: translateY(10px); - } - - 100% { - -o-transform: translateY(0); - } -} - -@keyframes bounceInUp { - 0% { - opacity: 0; - transform: translateY(2000px); - } - - 60% { - opacity: 1; - transform: translateY(-30px); - } - - 80% { - transform: translateY(10px); - } - - 100% { - transform: translateY(0); - } -} - -.bounceInUp { - -webkit-animation-name: bounceInUp; - -moz-animation-name: bounceInUp; - -o-animation-name: bounceInUp; - animation-name: bounceInUp; -} -@-webkit-keyframes bounceInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(30px); - } - - 80% { - -webkit-transform: translateY(-10px); - } - - 100% { - -webkit-transform: translateY(0); - } -} - -@-moz-keyframes bounceInDown { - 0% { - opacity: 0; - -moz-transform: translateY(-2000px); - } - - 60% { - opacity: 1; - -moz-transform: translateY(30px); - } - - 80% { - -moz-transform: translateY(-10px); - } - - 100% { - -moz-transform: translateY(0); - } -} - -@-o-keyframes bounceInDown { - 0% { - opacity: 0; - -o-transform: translateY(-2000px); - } - - 60% { - opacity: 1; - -o-transform: translateY(30px); - } - - 80% { - -o-transform: translateY(-10px); - } - - 100% { - -o-transform: translateY(0); - } -} - -@keyframes bounceInDown { - 0% { - opacity: 0; - transform: translateY(-2000px); - } - - 60% { - opacity: 1; - transform: translateY(30px); - } - - 80% { - transform: translateY(-10px); - } - - 100% { - transform: translateY(0); - } -} - -.bounceInDown { - -webkit-animation-name: bounceInDown; - -moz-animation-name: bounceInDown; - -o-animation-name: bounceInDown; - animation-name: bounceInDown; -} -@-webkit-keyframes bounceInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(30px); - } - - 80% { - -webkit-transform: translateX(-10px); - } - - 100% { - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes bounceInLeft { - 0% { - opacity: 0; - -moz-transform: translateX(-2000px); - } - - 60% { - opacity: 1; - -moz-transform: translateX(30px); - } - - 80% { - -moz-transform: translateX(-10px); - } - - 100% { - -moz-transform: translateX(0); - } -} - -@-o-keyframes bounceInLeft { - 0% { - opacity: 0; - -o-transform: translateX(-2000px); - } - - 60% { - opacity: 1; - -o-transform: translateX(30px); - } - - 80% { - -o-transform: translateX(-10px); - } - - 100% { - -o-transform: translateX(0); - } -} - -@keyframes bounceInLeft { - 0% { - opacity: 0; - transform: translateX(-2000px); - } - - 60% { - opacity: 1; - transform: translateX(30px); - } - - 80% { - transform: translateX(-10px); - } - - 100% { - transform: translateX(0); - } -} - -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - -moz-animation-name: bounceInLeft; - -o-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} -@-webkit-keyframes bounceInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(-30px); - } - - 80% { - -webkit-transform: translateX(10px); - } - - 100% { - -webkit-transform: translateX(0); - } -} - -@-moz-keyframes bounceInRight { - 0% { - opacity: 0; - -moz-transform: translateX(2000px); - } - - 60% { - opacity: 1; - -moz-transform: translateX(-30px); - } - - 80% { - -moz-transform: translateX(10px); - } - - 100% { - -moz-transform: translateX(0); - } -} - -@-o-keyframes bounceInRight { - 0% { - opacity: 0; - -o-transform: translateX(2000px); - } - - 60% { - opacity: 1; - -o-transform: translateX(-30px); - } - - 80% { - -o-transform: translateX(10px); - } - - 100% { - -o-transform: translateX(0); - } -} - -@keyframes bounceInRight { - 0% { - opacity: 0; - transform: translateX(2000px); - } - - 60% { - opacity: 1; - transform: translateX(-30px); - } - - 80% { - transform: translateX(10px); - } - - 100% { - transform: translateX(0); - } -} - -.bounceInRight { - -webkit-animation-name: bounceInRight; - -moz-animation-name: bounceInRight; - -o-animation-name: bounceInRight; - animation-name: bounceInRight; -} -@-webkit-keyframes bounceOut { - 0% { - -webkit-transform: scale(1); - } - - 25% { - -webkit-transform: scale(.95); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.1); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.3); - } -} - -@-moz-keyframes bounceOut { - 0% { - -moz-transform: scale(1); - } - - 25% { - -moz-transform: scale(.95); - } - - 50% { - opacity: 1; - -moz-transform: scale(1.1); - } - - 100% { - opacity: 0; - -moz-transform: scale(.3); - } -} - -@-o-keyframes bounceOut { - 0% { - -o-transform: scale(1); - } - - 25% { - -o-transform: scale(.95); - } - - 50% { - opacity: 1; - -o-transform: scale(1.1); - } - - 100% { - opacity: 0; - -o-transform: scale(.3); - } -} - -@keyframes bounceOut { - 0% { - transform: scale(1); - } - - 25% { - transform: scale(.95); - } - - 50% { - opacity: 1; - transform: scale(1.1); - } - - 100% { - opacity: 0; - transform: scale(.3); - } -} - -.bounceOut { - -webkit-animation-name: bounceOut; - -moz-animation-name: bounceOut; - -o-animation-name: bounceOut; - animation-name: bounceOut; -} -@-webkit-keyframes bounceOutUp { - 0% { - -webkit-transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - } -} - -@-moz-keyframes bounceOutUp { - 0% { - -moz-transform: translateY(0); - } - - 20% { - opacity: 1; - -moz-transform: translateY(20px); - } - - 100% { - opacity: 0; - -moz-transform: translateY(-2000px); - } -} - -@-o-keyframes bounceOutUp { - 0% { - -o-transform: translateY(0); - } - - 20% { - opacity: 1; - -o-transform: translateY(20px); - } - - 100% { - opacity: 0; - -o-transform: translateY(-2000px); - } -} - -@keyframes bounceOutUp { - 0% { - transform: translateY(0); - } - - 20% { - opacity: 1; - transform: translateY(20px); - } - - 100% { - opacity: 0; - transform: translateY(-2000px); - } -} - -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - -moz-animation-name: bounceOutUp; - -o-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} -@-webkit-keyframes bounceOutDown { - 0% { - -webkit-transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - } -} - -@-moz-keyframes bounceOutDown { - 0% { - -moz-transform: translateY(0); - } - - 20% { - opacity: 1; - -moz-transform: translateY(-20px); - } - - 100% { - opacity: 0; - -moz-transform: translateY(2000px); - } -} - -@-o-keyframes bounceOutDown { - 0% { - -o-transform: translateY(0); - } - - 20% { - opacity: 1; - -o-transform: translateY(-20px); - } - - 100% { - opacity: 0; - -o-transform: translateY(2000px); - } -} - -@keyframes bounceOutDown { - 0% { - transform: translateY(0); - } - - 20% { - opacity: 1; - transform: translateY(-20px); - } - - 100% { - opacity: 0; - transform: translateY(2000px); - } -} - -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - -moz-animation-name: bounceOutDown; - -o-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} -@-webkit-keyframes bounceOutLeft { - 0% { - -webkit-transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - } -} - -@-moz-keyframes bounceOutLeft { - 0% { - -moz-transform: translateX(0); - } - - 20% { - opacity: 1; - -moz-transform: translateX(20px); - } - - 100% { - opacity: 0; - -moz-transform: translateX(-2000px); - } -} - -@-o-keyframes bounceOutLeft { - 0% { - -o-transform: translateX(0); - } - - 20% { - opacity: 1; - -o-transform: translateX(20px); - } - - 100% { - opacity: 0; - -o-transform: translateX(-2000px); - } -} - -@keyframes bounceOutLeft { - 0% { - transform: translateX(0); - } - - 20% { - opacity: 1; - transform: translateX(20px); - } - - 100% { - opacity: 0; - transform: translateX(-2000px); - } -} - -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - -moz-animation-name: bounceOutLeft; - -o-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} -@-webkit-keyframes bounceOutRight { - 0% { - -webkit-transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - } -} - -@-moz-keyframes bounceOutRight { - 0% { - -moz-transform: translateX(0); - } - - 20% { - opacity: 1; - -moz-transform: translateX(-20px); - } - - 100% { - opacity: 0; - -moz-transform: translateX(2000px); - } -} - -@-o-keyframes bounceOutRight { - 0% { - -o-transform: translateX(0); - } - - 20% { - opacity: 1; - -o-transform: translateX(-20px); - } - - 100% { - opacity: 0; - -o-transform: translateX(2000px); - } -} - -@keyframes bounceOutRight { - 0% { - transform: translateX(0); - } - - 20% { - opacity: 1; - transform: translateX(-20px); - } - - 100% { - opacity: 0; - transform: translateX(2000px); - } -} - -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - -moz-animation-name: bounceOutRight; - -o-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} -@-webkit-keyframes rotateIn { - 0% { - -webkit-transform-origin: center center; - -webkit-transform: rotate(-200deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: center center; - -webkit-transform: rotate(0); - opacity: 1; - } -} -@-moz-keyframes rotateIn { - 0% { - -moz-transform-origin: center center; - -moz-transform: rotate(-200deg); - opacity: 0; - } - - 100% { - -moz-transform-origin: center center; - -moz-transform: rotate(0); - opacity: 1; - } -} -@-o-keyframes rotateIn { - 0% { - -o-transform-origin: center center; - -o-transform: rotate(-200deg); - opacity: 0; - } - - 100% { - -o-transform-origin: center center; - -o-transform: rotate(0); - opacity: 1; - } -} -@keyframes rotateIn { - 0% { - transform-origin: center center; - transform: rotate(-200deg); - opacity: 0; - } - - 100% { - transform-origin: center center; - transform: rotate(0); - opacity: 1; - } -} - -.rotateIn { - -webkit-animation-name: rotateIn; - -moz-animation-name: rotateIn; - -o-animation-name: rotateIn; - animation-name: rotateIn; -} -@-webkit-keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(0); - opacity: 1; - } -} - -@-moz-keyframes rotateInUpLeft { - 0% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(0); - opacity: 1; - } -} - -@-o-keyframes rotateInUpLeft { - 0% { - -o-transform-origin: left bottom; - -o-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -o-transform-origin: left bottom; - -o-transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInUpLeft { - 0% { - transform-origin: left bottom; - transform: rotate(90deg); - opacity: 0; - } - - 100% { - transform-origin: left bottom; - transform: rotate(0); - opacity: 1; - } -} - -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - -moz-animation-name: rotateInUpLeft; - -o-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} -@-webkit-keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(0); - opacity: 1; - } -} - -@-moz-keyframes rotateInDownLeft { - 0% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(0); - opacity: 1; - } -} - -@-o-keyframes rotateInDownLeft { - 0% { - -o-transform-origin: left bottom; - -o-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -o-transform-origin: left bottom; - -o-transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInDownLeft { - 0% { - transform-origin: left bottom; - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - transform-origin: left bottom; - transform: rotate(0); - opacity: 1; - } -} - -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - -moz-animation-name: rotateInDownLeft; - -o-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} -@-webkit-keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(0); - opacity: 1; - } -} - -@-moz-keyframes rotateInUpRight { - 0% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(0); - opacity: 1; - } -} - -@-o-keyframes rotateInUpRight { - 0% { - -o-transform-origin: right bottom; - -o-transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -o-transform-origin: right bottom; - -o-transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInUpRight { - 0% { - transform-origin: right bottom; - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - transform-origin: right bottom; - transform: rotate(0); - opacity: 1; - } -} - -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - -moz-animation-name: rotateInUpRight; - -o-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} -@-webkit-keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(0); - opacity: 1; - } -} - -@-moz-keyframes rotateInDownRight { - 0% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(0); - opacity: 1; - } -} - -@-o-keyframes rotateInDownRight { - 0% { - -o-transform-origin: right bottom; - -o-transform: rotate(90deg); - opacity: 0; - } - - 100% { - -o-transform-origin: right bottom; - -o-transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInDownRight { - 0% { - transform-origin: right bottom; - transform: rotate(90deg); - opacity: 0; - } - - 100% { - transform-origin: right bottom; - transform: rotate(0); - opacity: 1; - } -} - -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - -moz-animation-name: rotateInDownRight; - -o-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} -@-webkit-keyframes rotateOut { - 0% { - -webkit-transform-origin: center center; - -webkit-transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: center center; - -webkit-transform: rotate(200deg); - opacity: 0; - } -} - -@-moz-keyframes rotateOut { - 0% { - -moz-transform-origin: center center; - -moz-transform: rotate(0); - opacity: 1; - } - - 100% { - -moz-transform-origin: center center; - -moz-transform: rotate(200deg); - opacity: 0; - } -} - -@-o-keyframes rotateOut { - 0% { - -o-transform-origin: center center; - -o-transform: rotate(0); - opacity: 1; - } - - 100% { - -o-transform-origin: center center; - -o-transform: rotate(200deg); - opacity: 0; - } -} - -@keyframes rotateOut { - 0% { - transform-origin: center center; - transform: rotate(0); - opacity: 1; - } - - 100% { - transform-origin: center center; - transform: rotate(200deg); - opacity: 0; - } -} - -.rotateOut { - -webkit-animation-name: rotateOut; - -moz-animation-name: rotateOut; - -o-animation-name: rotateOut; - animation-name: rotateOut; -} -@-webkit-keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - opacity: 0; - } -} - -@-moz-keyframes rotateOutUpLeft { - 0% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(0); - opacity: 1; - } - - 100% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(-90deg); - opacity: 0; - } -} - -@-o-keyframes rotateOutUpLeft { - 0% { - -o-transform-origin: left bottom; - -o-transform: rotate(0); - opacity: 1; - } - - 100% { - -o-transform-origin: left bottom; - -o-transform: rotate(-90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpLeft { - 0% { - transform-origin: left bottom; - transform: rotate(0); - opacity: 1; - } - - 100% { - transform-origin: left bottom; - transform: rotate(-90deg); - opacity: 0; - } -} - -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - -moz-animation-name: rotateOutUpLeft; - -o-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} -@-webkit-keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - -webkit-transform: rotate(90deg); - opacity: 0; - } -} - -@-moz-keyframes rotateOutDownLeft { - 0% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(0); - opacity: 1; - } - - 100% { - -moz-transform-origin: left bottom; - -moz-transform: rotate(90deg); - opacity: 0; - } -} - -@-o-keyframes rotateOutDownLeft { - 0% { - -o-transform-origin: left bottom; - -o-transform: rotate(0); - opacity: 1; - } - - 100% { - -o-transform-origin: left bottom; - -o-transform: rotate(90deg); - opacity: 0; - } -} - -@keyframes rotateOutDownLeft { - 0% { - transform-origin: left bottom; - transform: rotate(0); - opacity: 1; - } - - 100% { - transform-origin: left bottom; - transform: rotate(90deg); - opacity: 0; - } -} - -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - -moz-animation-name: rotateOutDownLeft; - -o-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} -@-webkit-keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(90deg); - opacity: 0; - } -} - -@-moz-keyframes rotateOutUpRight { - 0% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(0); - opacity: 1; - } - - 100% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(90deg); - opacity: 0; - } -} - -@-o-keyframes rotateOutUpRight { - 0% { - -o-transform-origin: right bottom; - -o-transform: rotate(0); - opacity: 1; - } - - 100% { - -o-transform-origin: right bottom; - -o-transform: rotate(90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpRight { - 0% { - transform-origin: right bottom; - transform: rotate(0); - opacity: 1; - } - - 100% { - transform-origin: right bottom; - transform: rotate(90deg); - opacity: 0; - } -} - -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - -moz-animation-name: rotateOutUpRight; - -o-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} -@-webkit-keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - opacity: 0; - } -} - -@-moz-keyframes rotateOutDownRight { - 0% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(0); - opacity: 1; - } - - 100% { - -moz-transform-origin: right bottom; - -moz-transform: rotate(-90deg); - opacity: 0; - } -} - -@-o-keyframes rotateOutDownRight { - 0% { - -o-transform-origin: right bottom; - -o-transform: rotate(0); - opacity: 1; - } - - 100% { - -o-transform-origin: right bottom; - -o-transform: rotate(-90deg); - opacity: 0; - } -} - -@keyframes rotateOutDownRight { - 0% { - transform-origin: right bottom; - transform: rotate(0); - opacity: 1; - } - - 100% { - transform-origin: right bottom; - transform: rotate(-90deg); - opacity: 0; - } -} - -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - -moz-animation-name: rotateOutDownRight; - -o-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} -@-webkit-keyframes hinge { - 0% { -webkit-transform: rotate(0); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } - 20%, 60% { -webkit-transform: rotate(80deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } - 40% { -webkit-transform: rotate(60deg); -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } - 80% { -webkit-transform: rotate(60deg) translateY(0); opacity: 1; -webkit-transform-origin: top left; -webkit-animation-timing-function: ease-in-out; } - 100% { -webkit-transform: translateY(700px); opacity: 0; } -} - -@-moz-keyframes hinge { - 0% { -moz-transform: rotate(0); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } - 20%, 60% { -moz-transform: rotate(80deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } - 40% { -moz-transform: rotate(60deg); -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } - 80% { -moz-transform: rotate(60deg) translateY(0); opacity: 1; -moz-transform-origin: top left; -moz-animation-timing-function: ease-in-out; } - 100% { -moz-transform: translateY(700px); opacity: 0; } -} - -@-o-keyframes hinge { - 0% { -o-transform: rotate(0); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } - 20%, 60% { -o-transform: rotate(80deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } - 40% { -o-transform: rotate(60deg); -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } - 80% { -o-transform: rotate(60deg) translateY(0); opacity: 1; -o-transform-origin: top left; -o-animation-timing-function: ease-in-out; } - 100% { -o-transform: translateY(700px); opacity: 0; } -} - -@keyframes hinge { - 0% { transform: rotate(0); transform-origin: top left; animation-timing-function: ease-in-out; } - 20%, 60% { transform: rotate(80deg); transform-origin: top left; animation-timing-function: ease-in-out; } - 40% { transform: rotate(60deg); transform-origin: top left; animation-timing-function: ease-in-out; } - 80% { transform: rotate(60deg) translateY(0); opacity: 1; transform-origin: top left; animation-timing-function: ease-in-out; } - 100% { transform: translateY(700px); opacity: 0; } -} - -.hinge { - -webkit-animation-name: hinge; - -moz-animation-name: hinge; - -o-animation-name: hinge; - animation-name: hinge; -} -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollIn { - 0% { opacity: 0; -webkit-transform: translateX(-100%) rotate(-120deg); } - 100% { opacity: 1; -webkit-transform: translateX(0px) rotate(0deg); } -} - -@-moz-keyframes rollIn { - 0% { opacity: 0; -moz-transform: translateX(-100%) rotate(-120deg); } - 100% { opacity: 1; -moz-transform: translateX(0px) rotate(0deg); } -} - -@-o-keyframes rollIn { - 0% { opacity: 0; -o-transform: translateX(-100%) rotate(-120deg); } - 100% { opacity: 1; -o-transform: translateX(0px) rotate(0deg); } -} - -@keyframes rollIn { - 0% { opacity: 0; transform: translateX(-100%) rotate(-120deg); } - 100% { opacity: 1; transform: translateX(0px) rotate(0deg); } -} - -.rollIn { - -webkit-animation-name: rollIn; - -moz-animation-name: rollIn; - -o-animation-name: rollIn; - animation-name: rollIn; -} -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollOut { - 0% { - opacity: 1; - -webkit-transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(100%) rotate(120deg); - } -} - -@-moz-keyframes rollOut { - 0% { - opacity: 1; - -moz-transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - -moz-transform: translateX(100%) rotate(120deg); - } -} - -@-o-keyframes rollOut { - 0% { - opacity: 1; - -o-transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - -o-transform: translateX(100%) rotate(120deg); - } -} - -@keyframes rollOut { - 0% { - opacity: 1; - transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - transform: translateX(100%) rotate(120deg); - } -} - -.rollOut { - -webkit-animation-name: rollOut; - -moz-animation-name: rollOut; - -o-animation-name: rollOut; - animation-name: rollOut; -} - -/* originally authored by Angelo Rohit - https://github.com/angelorohit */ - -@-webkit-keyframes lightSpeedIn { - 0% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } - 60% { -webkit-transform: translateX(-20%) skewX(30deg); opacity: 1; } - 80% { -webkit-transform: translateX(0%) skewX(-15deg); opacity: 1; } - 100% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } -} - -@-moz-keyframes lightSpeedIn { - 0% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } - 60% { -moz-transform: translateX(-20%) skewX(30deg); opacity: 1; } - 80% { -moz-transform: translateX(0%) skewX(-15deg); opacity: 1; } - 100% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } -} - -@-o-keyframes lightSpeedIn { - 0% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } - 60% { -o-transform: translateX(-20%) skewX(30deg); opacity: 1; } - 80% { -o-transform: translateX(0%) skewX(-15deg); opacity: 1; } - 100% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } -} - -@keyframes lightSpeedIn { - 0% { transform: translateX(100%) skewX(-30deg); opacity: 0; } - 60% { transform: translateX(-20%) skewX(30deg); opacity: 1; } - 80% { transform: translateX(0%) skewX(-15deg); opacity: 1; } - 100% { transform: translateX(0%) skewX(0deg); opacity: 1; } -} - -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - -moz-animation-name: lightSpeedIn; - -o-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - - -webkit-animation-timing-function: ease-out; - -moz-animation-timing-function: ease-out; - -o-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -.animated.lightSpeedIn { - -webkit-animation-duration: 0.5s; - -moz-animation-duration: 0.5s; - -o-animation-duration: 0.5s; - animation-duration: 0.5s; -} - -/* originally authored by Angelo Rohit - https://github.com/angelorohit */ - -@-webkit-keyframes lightSpeedOut { - 0% { -webkit-transform: translateX(0%) skewX(0deg); opacity: 1; } - 100% { -webkit-transform: translateX(100%) skewX(-30deg); opacity: 0; } -} - -@-moz-keyframes lightSpeedOut { - 0% { -moz-transform: translateX(0%) skewX(0deg); opacity: 1; } - 100% { -moz-transform: translateX(100%) skewX(-30deg); opacity: 0; } -} - -@-o-keyframes lightSpeedOut { - 0% { -o-transform: translateX(0%) skewX(0deg); opacity: 1; } - 100% { -o-transform: translateX(100%) skewX(-30deg); opacity: 0; } -} - -@keyframes lightSpeedOut { - 0% { transform: translateX(0%) skewX(0deg); opacity: 1; } - 100% { transform: translateX(100%) skewX(-30deg); opacity: 0; } -} - -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - -moz-animation-name: lightSpeedOut; - -o-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - - -webkit-animation-timing-function: ease-in; - -moz-animation-timing-function: ease-in; - -o-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -.animated.lightSpeedOut { - -webkit-animation-duration: 0.25s; - -moz-animation-duration: 0.25s; - -o-animation-duration: 0.25s; - animation-duration: 0.25s; -} - -/* originally authored by Angelo Rohit - https://github.com/angelorohit */ - -@-webkit-keyframes wiggle { - 0% { -webkit-transform: skewX(9deg); } - 10% { -webkit-transform: skewX(-8deg); } - 20% { -webkit-transform: skewX(7deg); } - 30% { -webkit-transform: skewX(-6deg); } - 40% { -webkit-transform: skewX(5deg); } - 50% { -webkit-transform: skewX(-4deg); } - 60% { -webkit-transform: skewX(3deg); } - 70% { -webkit-transform: skewX(-2deg); } - 80% { -webkit-transform: skewX(1deg); } - 90% { -webkit-transform: skewX(0deg); } - 100% { -webkit-transform: skewX(0deg); } -} - -@-moz-keyframes wiggle { - 0% { -moz-transform: skewX(9deg); } - 10% { -moz-transform: skewX(-8deg); } - 20% { -moz-transform: skewX(7deg); } - 30% { -moz-transform: skewX(-6deg); } - 40% { -moz-transform: skewX(5deg); } - 50% { -moz-transform: skewX(-4deg); } - 60% { -moz-transform: skewX(3deg); } - 70% { -moz-transform: skewX(-2deg); } - 80% { -moz-transform: skewX(1deg); } - 90% { -moz-transform: skewX(0deg); } - 100% { -moz-transform: skewX(0deg); } -} - -@-o-keyframes wiggle { - 0% { -o-transform: skewX(9deg); } - 10% { -o-transform: skewX(-8deg); } - 20% { -o-transform: skewX(7deg); } - 30% { -o-transform: skewX(-6deg); } - 40% { -o-transform: skewX(5deg); } - 50% { -o-transform: skewX(-4deg); } - 60% { -o-transform: skewX(3deg); } - 70% { -o-transform: skewX(-2deg); } - 80% { -o-transform: skewX(1deg); } - 90% { -o-transform: skewX(0deg); } - 100% { -o-transform: skewX(0deg); } -} - -@keyframes wiggle { - 0% { transform: skewX(9deg); } - 10% { transform: skewX(-8deg); } - 20% { transform: skewX(7deg); } - 30% { transform: skewX(-6deg); } - 40% { transform: skewX(5deg); } - 50% { transform: skewX(-4deg); } - 60% { transform: skewX(3deg); } - 70% { transform: skewX(-2deg); } - 80% { transform: skewX(1deg); } - 90% { transform: skewX(0deg); } - 100% { transform: skewX(0deg); } -} - -.wiggle { - -webkit-animation-name: wiggle; - -moz-animation-name: wiggle; - -o-animation-name: wiggle; - animation-name: wiggle; - - -webkit-animation-timing-function: ease-in; - -moz-animation-timing-function: ease-in; - -o-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -.animated.wiggle { - -webkit-animation-duration: 0.75s; - -moz-animation-duration: 0.75s; - -o-animation-duration: 0.75s; - animation-duration: 0.75s; -} \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 6a8411ce..cff4c709 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -11,10 +11,8 @@ *= require_self *= require_tree . *= require base - *= require ForceDirected *= require jquery.mCustomScrollbar *= require jquery-ui - *= require animate */ /* clear styles */ @@ -1767,14 +1765,6 @@ div.mapInfoStat { } /* --- styling the logo button ---*/ -.footer { - display: block; - position: fixed; - bottom: 10px; - left: 50%; - margin-left: -55px; - z-index: 15000; -} .home_bg { display: block; height: 100%; diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 37414fce..6173e034 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -546,13 +546,14 @@ font-family: 'LatoLight'; .map { display:inline-block; - width:226px; - height:320px; + width:220px; + height:308px; + padding: 16px 0; color:#FFF; text-align: left; overflow: visible; - background: #FFF; - border-radius:5px; + background: #424242; + border-radius:2px; box-shadow: 6px 6px 8px rgba(0,0,0,0.4); margin:16px 16px 16px 19px; } diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index d8bd7550..d69db4f2 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -71,6 +71,11 @@ /* logo */ + +.footer { + z-index: 3; +} + .logo { color: #6B6B6B; font-family: "vinyl", sans-serif; @@ -653,8 +658,7 @@ } .exploreMapsCenter { - width: 700px; - margin: 0 auto; + z-index: 3; } .exploreMapsCenter a { @@ -664,9 +668,9 @@ font-family: 'din-medium'; font-size: 14px; height: 14px; - padding-top: 16px; + padding: 14px; display: inline-block; - padding-bottom: 12px; + cursor: pointer; } .exploreMapsCenter a.active { text-decoration: none; @@ -680,6 +684,7 @@ .mapsWrapper { margin: 100px 60px 0 60px; display: none; + z-index: 1; } .explorePage .mapsWrapper { display:block; diff --git a/app/assets/stylesheets/synapses.css.scss b/app/assets/stylesheets/synapses.css.scss deleted file mode 100644 index af453b29..00000000 --- a/app/assets/stylesheets/synapses.css.scss +++ /dev/null @@ -1,57 +0,0 @@ -// Place all the styles related to the synapses controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ - - -.synapse { - display:block; - position:relative; - width:215px; - height:320px; - float:left; - margin: 30px 0 30px 50px; -} - -.synapseTopic1 { - position:absolute; - top:0; -} - -.topic1desc { -display: block; -width: 190px; -background: url("bg.png") repeat; -position: relative; -margin-left: 25px; -border-radius: 15px; -padding: 10px 5px 10px 28px; -color: #000; -} - -.synapseTopic1 img { - position:absolute; - top: 15px; - z-index: 30; -} - -.synapseTopic2 { - position:absolute; - bottom:0; -} - -.synapseTopic2 img { - position:absolute; - top:-24px; - z-index:30; -} - -.topic2desc { -display: block; -width: 190px; -background: url("bg.png") repeat; -position: relative; -margin-left: 25px; -border-radius: 15px; -padding: 10px 5px 10px 28px; -color: #000; -} \ No newline at end of file diff --git a/app/controllers/mappings_controller.rb b/app/controllers/mappings_controller.rb index 566c58a8..97225fa6 100644 --- a/app/controllers/mappings_controller.rb +++ b/app/controllers/mappings_controller.rb @@ -4,8 +4,6 @@ class MappingsController < ApplicationController respond_to :json - #skip_before_filter :verify_authenticity_token, :only => [:create] - # GET /mappings/1.json def show @mapping = Mapping.find(params[:id]) diff --git a/app/controllers/synapses_controller.rb b/app/controllers/synapses_controller.rb index 25a49ffe..f30fa3d5 100644 --- a/app/controllers/synapses_controller.rb +++ b/app/controllers/synapses_controller.rb @@ -64,7 +64,7 @@ class SynapsesController < ApplicationController @synapse.delete if @synapse respond_to do |format| - format.json { render :json => "success" } + format.json { head :no_content } end end end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index e8837510..26085e6b 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -9,16 +9,16 @@ class UsersController < ApplicationController @user = User.find(params[:id]) render json: @user - end + end - # GET /user/edit + # GET /users/:id/edit def edit @user = current_user respond_with(@user) end - # PUT /user + # PUT /users/:id def update @user = current_user @user.attributes = params[:user] diff --git a/app/helpers/topics_helper.rb b/app/helpers/topics_helper.rb index d89f1c9c..f6587c4c 100644 --- a/app/helpers/topics_helper.rb +++ b/app/helpers/topics_helper.rb @@ -22,7 +22,7 @@ module TopicsHelper return temp end -#find all nodes in any given nodes network + #find all nodes in any given nodes network def network(node, array, count) # recurse starting with a node to find all connected nodes and return an array of topics that constitutes the starting nodes network @@ -55,102 +55,4 @@ module TopicsHelper return array end end - - #return a json object containing all of a users added synapses - def synapses_as_json(current, synapses) - Jbuilder.encode do |json| - @topics = Array.new - - synapses.each do |synapse| - @topics.push(synapse.topic1) if (not @topics.include?(synapse.topic1)) && synapse.topic1.authorize_to_view(current) - @topics.push(synapse.topic2) if (not @topics.include?(synapse.topic2)) && synapse.topic2.authorize_to_view(current) - end - - json.array!(@topics) do |topic| - json.adjacencies topic.synapses2.delete_if{|synapse| not @topics.include?(Topic.find_by_id(synapse.node1_id))} do |json, synapse| - json.nodeTo synapse.node1_id - json.nodeFrom synapse.node2_id - - @synapsedata = Hash.new - @synapsedata['$desc'] = synapse.desc - @synapsedata['$showDesc'] = false - @synapsedata['$category'] = synapse.category - @synapsedata['$id'] = synapse.id - @synapsedata['$userid'] = synapse.user.id - @synapsedata['$username'] = synapse.user.name - @synapsedata['$direction'] = [synapse.node1_id.to_s(), synapse.node2_id.to_s()] - @synapsedata['$permission'] = synapse.permission - json.data @synapsedata - end - - @inmaps = Array.new - topic.maps.each do |map| - @inmaps.push(map.id) - end - - @topicdata = Hash.new - @topicdata['$desc'] = topic.desc - @topicdata['$link'] = topic.link - @topicdata['$metacode'] = topic.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$userid'] = topic.user.id - @topicdata['$username'] = topic.user.name - @topicdata['$permission'] = topic.permission - json.data @topicdata - json.id topic.id - json.name topic.name - end - end - end - - def all_as_json(current, user) - - # current is current user - - Jbuilder.encode do |json| - if user.nil? - @topics = Topic.visibleToUser(current, nil) - @synapses = Synapse.visibleToUser(current, nil) - else - @topics = Topic.visibleToUser(current, user) - @synapses = Synapse.visibleToUser(current, user) - end - - json.array!(@topics) do |topic| - json.adjacencies topic.synapses2.delete_if{|synapse| (not @topics.include?(Topic.find_by_id(synapse.node1_id))) || (not @synapses.include?(synapse))} do |json, synapse| - json.nodeTo synapse.node1_id - json.nodeFrom synapse.node2_id - - @synapsedata = Hash.new - @synapsedata['$desc'] = synapse.desc - @synapsedata['$showDesc'] = false - @synapsedata['$category'] = synapse.category - @synapsedata['$id'] = synapse.id - @synapsedata['$userid'] = synapse.user.id - @synapsedata['$username'] = synapse.user.name - @synapsedata['$direction'] = [synapse.node1_id.to_s(), synapse.node2_id.to_s()] - @synapsedata['$permission'] = synapse.permission - json.data @synapsedata - end - - @inmaps = Array.new - topic.maps.each do |map| - @inmaps.push(map.id) - end - - @topicdata = Hash.new - @topicdata['$desc'] = topic.desc - @topicdata['$link'] = topic.link - @topicdata['$metacode'] = topic.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$userid'] = topic.user.id - @topicdata['$username'] = topic.user.name - @topicdata['$permission'] = topic.permission - json.data @topicdata - json.id topic.id - json.name topic.name - end - end - end - end diff --git a/app/models/map.rb b/app/models/map.rb index cc86b6d3..75857c8f 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -1,26 +1,26 @@ class Map < ActiveRecord::Base -belongs_to :user + belongs_to :user -has_many :topicmappings, :class_name => 'Mapping', :conditions => {:category => 'Topic'} -has_many :synapsemappings, :class_name => 'Mapping', :conditions => {:category => 'Synapse'} + has_many :topicmappings, :class_name => 'Mapping', :conditions => {:category => 'Topic'} + has_many :synapsemappings, :class_name => 'Mapping', :conditions => {:category => 'Synapse'} -has_many :topics, :through => :topicmappings -has_many :synapses, :through => :synapsemappings + has_many :topics, :through => :topicmappings + has_many :synapses, :through => :synapsemappings -def mappings - topicmappings + synapsemappings -end - -def mk_permission - if self.permission == "commons" - "co" - elsif self.permission == "public" - "pu" - elsif self.permission == "private" - "pr" + def mappings + topicmappings + synapsemappings + end + + def mk_permission + if self.permission == "commons" + "co" + elsif self.permission == "public" + "pu" + elsif self.permission == "private" + "pr" + end end -end #return an array of the contributors to the map def contributors @@ -55,44 +55,30 @@ end ##### PERMISSIONS ###### - scope :visibleToUser, lambda { |current, user| - if user != nil - if user != current - Map.find_all_by_user_id_and_permission(user.id, "commons") | Map.find_all_by_user_id_and_permission(user.id, "public") - elsif user == current - Map.find_all_by_user_id_and_permission(user.id, "commons") | Map.find_all_by_user_id_and_permission(user.id, "public") | current.maps.where(:permission => "private") - end - elsif (current != nil && user == nil) - Map.find_all_by_permission("commons") | Map.find_all_by_permission("public") | current.maps.where(:permission => "private") - elsif (current == nil) - Map.find_all_by_permission("commons") | Map.find_all_by_permission("public") - end - } - # returns false if user not allowed to 'show' Topic, Synapse, or Map def authorize_to_show(user) - if (self.permission == "private" && self.user != user) - return false - end - return self + if (self.permission == "private" && self.user != user) + return false + end + return self end # returns false if user not allowed to 'edit' Topic, Synapse, or Map def authorize_to_edit(user) - if (self.permission == "private" && self.user != user) - return false - elsif (self.permission == "public" && self.user != user) - return false - end - return self + if (self.permission == "private" && self.user != user) + return false + elsif (self.permission == "public" && self.user != user) + return false + end + return self end # returns Boolean if user allowed to view Topic, Synapse, or Map def authorize_to_view(user) - if (self.permission == "private" && self.user != user) - return false - end - return true + if (self.permission == "private" && self.user != user) + return false + end + return true end end diff --git a/app/models/mapping.rb b/app/models/mapping.rb index 0de78e09..55df39d1 100644 --- a/app/models/mapping.rb +++ b/app/models/mapping.rb @@ -1,10 +1,10 @@ class Mapping < ActiveRecord::Base -belongs_to :topic, :class_name => "Topic", :foreign_key => "topic_id" -belongs_to :synapse, :class_name => "Synapse", :foreign_key => "synapse_id" -belongs_to :map, :class_name => "Map", :foreign_key => "map_id" + belongs_to :topic, :class_name => "Topic", :foreign_key => "topic_id" + belongs_to :synapse, :class_name => "Synapse", :foreign_key => "synapse_id" + belongs_to :map, :class_name => "Map", :foreign_key => "map_id" -belongs_to :user + belongs_to :user def user_name self.user.name diff --git a/app/models/synapse.rb b/app/models/synapse.rb index f7dc58c6..b11f6ad3 100644 --- a/app/models/synapse.rb +++ b/app/models/synapse.rb @@ -1,12 +1,12 @@ class Synapse < ActiveRecord::Base -belongs_to :user + belongs_to :user -belongs_to :topic1, :class_name => "Topic", :foreign_key => "node1_id" -belongs_to :topic2, :class_name => "Topic", :foreign_key => "node2_id" + belongs_to :topic1, :class_name => "Topic", :foreign_key => "node1_id" + belongs_to :topic2, :class_name => "Topic", :foreign_key => "node2_id" -has_many :mappings -has_many :maps, :through => :mappings + has_many :mappings + has_many :maps, :through => :mappings def user_name self.user.name @@ -38,83 +38,9 @@ has_many :maps, :through => :mappings $redis.publish 'maps', msg.to_json end end - - ##### JSON ###### - - def self_as_json - Jbuilder.encode do |json| - @synapsedata = Hash.new - @synapsedata['$desc'] = self.desc - @synapsedata['$showDesc'] = false - @synapsedata['$category'] = self.category - @synapsedata['$id'] = self.id - @synapsedata['$userid'] = self.user.id - @synapsedata['$username'] = self.user.name - @synapsedata['$direction'] = [self.node1_id.to_s(), self.node2_id.to_s()] - @synapsedata['$permission'] = self.permission - json.data @synapsedata - end - end - - def selfplusnodes_as_json - Jbuilder.encode do |json| - @topics = Array.new - @topics.push(self.topic1) - @topics.push(self.topic2) - - json.array!(@topics) do |topic| - json.adjacencies topic.synapses1.delete_if{|synapse| not @topics.include?(Topic.find_by_id(synapse.node2_id))} do |json, synapse| - json.nodeTo synapse.node2_id - json.nodeFrom synapse.node1_id - - @synapsedata = Hash.new - @synapsedata['$desc'] = synapse.desc - @synapsedata['$showDesc'] = false - @synapsedata['$category'] = synapse.category - @synapsedata['$id'] = synapse.id - @synapsedata['$userid'] = synapse.user.id - @synapsedata['$username'] = synapse.user.name - @synapsedata['$direction'] = [synapse.node1_id.to_s(), synapse.node2_id.to_s()] - @synapsedata['$permission'] = synapse.permission - json.data @synapsedata - end - - @inmaps = Array.new - topic.maps.each do |map| - @inmaps.push(map.id) - end - - @topicdata = Hash.new - @topicdata['$desc'] = topic.desc - @topicdata['$link'] = topic.link - @topicdata['$metacode'] = topic.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$userid'] = topic.user.id - @topicdata['$username'] = topic.user.name - @topicdata['$permission'] = topic.permission - json.data @topicdata - json.id topic.id - json.name topic.name - end - end - end ##### PERMISSIONS ###### - scope :visibleToUser, lambda { |current, user| - if user != nil - if user != current - Synapse.find_all_by_user_id_and_permission(user.id, "commons") | Synapse.find_all_by_user_id_and_permission(user.id, "public") - elsif user == current - Synapse.find_all_by_user_id_and_permission(user.id, "commons") | Synapse.find_all_by_user_id_and_permission(user.id, "public") | current.synapses.where(:permission => "private") - end - elsif (current != nil && user == nil) - Synapse.find_all_by_permission("commons") | Synapse.find_all_by_permission("public") | current.synapses.where(:permission => "private") - elsif (current == nil) - Synapse.find_all_by_permission("commons") | Synapse.find_all_by_permission("public") - end - } - # returns false if user not allowed to 'show' Topic, Synapse, or Map def authorize_to_show(user) if (self.permission == "private" && self.user != user) @@ -140,15 +66,5 @@ has_many :maps, :through => :mappings end return true end - - # returns Boolean based on whether user has permissions to edit or not - def authorize_linkto_edit(user) - if (self.user == user) - return true - elsif (self.permission == "commons") - return true - end - return false - end end diff --git a/app/models/topic.rb b/app/models/topic.rb index 79183195..e2a44ba4 100644 --- a/app/models/topic.rb +++ b/app/models/topic.rb @@ -1,16 +1,15 @@ class Topic < ActiveRecord::Base + include TopicsHelper -include TopicsHelper + belongs_to :user -belongs_to :user + has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id' + has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id' + has_many :topics1, :through => :synapses2, :source => :topic1 + has_many :topics2, :through => :synapses1, :source => :topic2 -has_many :synapses1, :class_name => 'Synapse', :foreign_key => 'node1_id' -has_many :synapses2, :class_name => 'Synapse', :foreign_key => 'node2_id' -has_many :topics1, :through => :synapses2, :source => :topic1 -has_many :topics2, :through => :synapses1, :source => :topic2 - -has_many :mappings -has_many :maps, :through => :mappings + has_many :mappings + has_many :maps, :through => :mappings # This method associates the attribute ":image" with a file attachment has_attached_file :image @@ -86,168 +85,17 @@ has_many :maps, :through => :mappings # has no viewable synapses helper function def has_viewable_synapses(current) - result = false - self.synapses.each do |synapse| - if synapse.authorize_to_view(current) - result = true - end - end - return result - end - - ###### JSON ###### - - def self_as_json - Jbuilder.encode do |json| - @inmaps = Array.new - @mapsString = "" - self.maps.each_with_index do |map, index| - @inmaps.push(map.id) - @mapsString += map.name - @mapsString += (index+1) == self.maps.count ? "" : ", " - end - - @topicdata = Hash.new - @topicdata['$desc'] = self.desc - @topicdata['$link'] = self.link - @topicdata['$metacode'] = self.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$inmapsString'] = @mapsString - @topicdata['$synapseCount'] = self.synapses.count - @topicdata['$userid'] = self.user.id - @topicdata['$username'] = self.user.name - @topicdata['$permission'] = self.permission - @topicdata['$date'] = self.created_at.strftime("%m/%d/%Y") - json.data @topicdata - json.id self.id - json.name self.name - end - end - - def selfonmap_as_json(mapid) - Jbuilder.encode do |json| - @inmaps = Array.new - @mapsString = "" - self.maps.each_with_index do |map, index| - @inmaps.push(map.id) - @mapsString += map.name - @mapsString += (index+1) == self.maps.count ? "" : ", " - end - - @topicdata = Hash.new - @topicdata['$desc'] = self.desc - @topicdata['$link'] = self.link - @topicdata['$metacode'] = self.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$inmapsString'] = @mapsString - @topicdata['$synapseCount'] = self.synapses.count - @topicdata['$userid'] = self.user.id - @topicdata['$username'] = self.user.name - @mapping = Mapping.find_by_topic_id_and_map_id(self.id,mapid) - @topicdata['$xloc'] = @mapping.xloc - @topicdata['$yloc'] = @mapping.yloc - @topicdata['$mappingid'] = @mapping.id - @topicdata['$permission'] = self.permission - @topicdata['$date'] = self.created_at.strftime("%m/%d/%Y") - json.data @topicdata - json.id self.id - json.name self.name - end - end - - #build a json object of everything connected to a specified node - def network_as_json(current) - Jbuilder.encode do |json| - @topics = network(self,nil,1) - - if @topics.count > 1 - json.array!(@topics.delete_if{|topic| (not topic.authorize_to_view(current)) || (not topic.has_viewable_synapses(current))}) do |topic| - - json.adjacencies topic.synapses1.delete_if{|synapse| (not @topics.include?(synapse.topic2)) || (not synapse.authorize_to_view(current)) || (not synapse.topic2.authorize_to_view(current)) } do |json, synapse| - json.nodeTo synapse.node2_id - json.nodeFrom synapse.node1_id - - @synapsedata = Hash.new - @synapsedata['$alpha'] = 0.4 - @synapsedata['$desc'] = synapse.desc - @synapsedata['$showDesc'] = false - @synapsedata['$category'] = synapse.category - @synapsedata['$id'] = synapse.id - @synapsedata['$userid'] = synapse.user.id - @synapsedata['$username'] = synapse.user.name - @synapsedata['$direction'] = [synapse.node1_id.to_s(), synapse.node2_id.to_s()] - @synapsedata['$permission'] = synapse.permission - json.data @synapsedata - end - - @inmaps = Array.new - @mapsString = "" - topic.maps.each_with_index do |map, index| - @inmaps.push(map.id) - @mapsString += map.name - @mapsString += (index+1) == topic.maps.count ? "" : ", " - end - - @topicdata = Hash.new - @topicdata['$desc'] = topic.desc - @topicdata['$link'] = topic.link - @topicdata['$metacode'] = topic.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$inmapsString'] = @mapsString - @topicdata['$synapseCount'] = topic.synapses.count - @topicdata['$userid'] = topic.user.id - @topicdata['$username'] = topic.user.name - @topicdata['$permission'] = topic.permission - @topicdata['$date'] = topic.created_at.strftime("%m/%d/%Y") - json.data @topicdata - json.id topic.id - json.name topic.name - end - elsif @topics.count == 1 - json.array!(@topics) do |topic| - @inmaps = Array.new - @mapsString = "" - topic.maps.each_with_index do |map, index| - @inmaps.push(map.id) - @mapsString += map.name - @mapsString += (index+1) == topic.maps.count ? "" : ", " - end - - @topicdata = Hash.new - @topicdata['$desc'] = topic.desc - @topicdata['$link'] = topic.link - @topicdata['$metacode'] = topic.metacode.name - @topicdata['$inmaps'] = @inmaps - @topicdata['$inmapsString'] = @mapsString - @topicdata['$synapseCount'] = topic.synapses.count - @topicdata['$userid'] = topic.user.id - @topicdata['$username'] = topic.user.name - @topicdata['$permission'] = topic.permission - @topicdata['$date'] = topic.created_at.strftime("%m/%d/%Y") - json.data @topicdata - json.id topic.id - json.name topic.name - end - end - end + result = false + self.synapses.each do |synapse| + if synapse.authorize_to_view(current) + result = true + end + end + return result end ##### PERMISSIONS ###### - scope :visibleToUser, lambda { |current, user| - if user != nil - if user != current - Topic.find_all_by_user_id_and_permission(user.id, "commons") | Topic.find_all_by_user_id_and_permission(user.id, "public") - elsif user == current - Topic.find_all_by_user_id_and_permission(user.id, "commons") | Topic.find_all_by_user_id_and_permission(user.id, "public") | current.topics.where(:permission => "private") - end - elsif (current != nil && user == nil) - Topic.find_all_by_permission("commons") | Topic.find_all_by_permission("public") | current.topics.where(:permission => "private") - elsif (current == nil) - Topic.find_all_by_permission("commons") | Topic.find_all_by_permission("public") - end - } - # returns false if user not allowed to 'show' Topic, Synapse, or Map def authorize_to_show(user) if (self.permission == "private" && self.user != user) @@ -273,15 +121,4 @@ has_many :maps, :through => :mappings end return true end - - # returns Boolean based on whether user has permissions to edit or not - def authorize_linkto_edit(user) - if (self.user == user) - return true - elsif (self.permission == "commons") - return true - end - return false - end - end diff --git a/app/models/user.rb b/app/models/user.rb index bf2ddd9a..bfdf8fae 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,10 +2,10 @@ require 'open-uri' class User < ActiveRecord::Base -has_many :topics -has_many :synapses -has_many :maps -has_many :mappings + has_many :topics + has_many :synapses + has_many :maps + has_many :mappings before_create :generate_code @@ -42,7 +42,6 @@ has_many :mappings def as_json(options={}) { :id => self.id, :name => self.name, - :email => self.email, :image => self.image.url } end diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 23d9fd19..a71b1a50 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -7,23 +7,19 @@ @@ -43,15 +43,15 @@
    - {{name}} + {{name}}
    - {{desc}} -
    + {{desc}} +
    + +
    +

    GET INVOLVED!

    + +

    Want to help is with design, code, marketing and management for Methamaps? We are an open value network, which for us means that we want to invite and empower peers to participate in creating value together.

    + +

    We welcome

    + +
    +

    Tutorial

    From f49f45e856cb9688206d7a5d71d04d1cba83d4de Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 10 Sep 2014 18:12:21 -0400 Subject: [PATCH 093/600] about, invite, getInvolved --- app/assets/stylesheets/application.css | 35 +++++++++++++------- app/views/layouts/_lightboxes.html.erb | 45 ++++++++++++++++++++------ realtime/realtime-server.js | 8 ++--- 3 files changed, 63 insertions(+), 25 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 5459a53f..f852bea9 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1466,11 +1466,26 @@ float: left; } /* about, getInvolved */ -#about > p, #getInvolved > p { +#aboutParms { + margin: 30px auto; + width: 215px; + font-family: 'din-medium', helvetica, sans-serif; +} +#leftAboutParms { + text-align: left; + float: left; + margin-right: 30px; +} +#rightAboutParms { + text-align: left; + float: left; +} + +#about > p, #getInvolved > p, #invite > p { /* color: #000; font-size: 16px;*/ margin: 10px 0; - line-height: 24px; + line-height: 20px; } #about ul { list-style: none; @@ -1478,19 +1493,17 @@ float: left; #about ul li { display: inline-block; } + /* invite */ -#invite { - color: black; -} -#invite p { - margin: 10px 0; - line-height: 24px; -} -#invite .green { +.joinCodes { text-align: center; display: block; - color: #097A51; + color: #424242; + font-family: 'din-medium', helvetica, sans-serif; +} +#joinCodesBox { + margin-top: 30px; } /* new map */ diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index d14d064f..63a31af2 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -11,7 +11,23 @@

    About Metamaps.cc

    - +
    +
    +

    STATUS:

    +

    VERSION:

    +

    LAST UPDATE:

    +
    + +
    +

    PRIVATE BETA

    +

    2.6

    +

    Aug 31, 2014

    +
    +
    +
    +
    + +

    Metamaps.cc is a free and open source web platform for changemakers, innovators, educators and students. It enables individuals and communities to build and visualize their shared knowledge and unlock their collective intelligence.

    We're creating tools to help connect people, resources and ideas with rich detail and weave those relationships into actionable insights and stories. The platform is evolving for a range of applications amidst a growing network of designers, developers, practitioners, entrepreneurs, and artists.

    @@ -55,10 +71,15 @@

    GET INVOLVED!

    +
    -

    Want to help is with design, code, marketing and management for Methamaps? We are an open value network, which for us means that we want to invite and empower peers to participate in creating value together.

    +

    Want to help is with design, code, marketing and management for Metamaps? We are an open value network, which for us means that we want to invite and empower peers to participate in creating value together.

    -

    We welcome

    +

    We welcome contributions in many forms. One of the easiest and best things you can do is to keep on mapping your ideas into the commons on the platform!

    + +

    We welcome people of all skillsets to contribute to the project in different ways. Designers, researchers, academics, strategists, and facilitators can get in touch about opportunities to contribute to the project. If you're a developer, help us advance the code and take a look around out Github.

    + +

    Financial contributions are greatly appreciated in support of our work. All financial contributions are transparently governed and recorded in our value account system.

    @@ -74,13 +95,17 @@ <% if authenticated? %>
    -

    Send Invites

    -

    You can invite others to the Metamaps platform. Send them this link

    -

    http://metamaps.cc/join

    -

    and give them the access code shown below.

    - <% mapper = current_user %> -

    <%= mapper.code %>

    -

    We invite you to be conscious as to who you invite to this platform, because much of the collaborative editing is based on trust. We want to cultivate a community here that is fun, wise, creative, and flourishing. Can you help us build a community like that?

    +

    SHARE INVITE

    + +
    +

    The Metamaps platform is currently in an invite-only beta with the express purpose of creating a high value knowledge ecosystem, as well as buidling a community of contributers. As a valued beta tester, you have the ability to invite your peer, colleagues and collaborators onto the platform.

    +

    Copy and send the link + access code below, or enter an email to send an invite. The access code below is your personal code and can be used multiple times.

    +
    +

    HTTP://METAMAPS.CC/JOIN

    + <% mapper = current_user %> +

    ACCESS CODE: <%= mapper.code %>

    +
    +
    <% # this is the create new map form %> diff --git a/realtime/realtime-server.js b/realtime/realtime-server.js index 741f56b5..fe6524cc 100644 --- a/realtime/realtime-server.js +++ b/realtime/realtime-server.js @@ -20,25 +20,25 @@ app.configure(function() { //redis = require('redis').createClient(rtg.port, rtg.hostname, {no_ready_check: true}); var io = require('socket.io').listen(5001); -var redis = require('redis').createClient(); +//var redis = require('redis').createClient(); //redis.auth(rtg.auth.split(":")[1], function() { // start(); //}); function start() { - redis.subscribe('maps'); + //redis.subscribe('maps'); io.on('connection', function (socket) { // this will ping everyone on a map with updates to the map - redis.on('message', function (channel, message) { + /*redis.on('message', function (channel, message) { console.log(message); var m = JSON.parse(message); var room = 'maps-' + m.mapid; socket.emit(room, m); - }); + });*/ // this will ping a new person with awareness of who's already on the map socket.on('updateNewMapperList', function (data) { From 90f24775661b812de86e8c827734151290b14d93 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 11 Sep 2014 08:35:16 -0400 Subject: [PATCH 094/600] fixed map update controller --- app/controllers/maps_controller.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/app/controllers/maps_controller.rb b/app/controllers/maps_controller.rb index 28af22b2..72d81656 100644 --- a/app/controllers/maps_controller.rb +++ b/app/controllers/maps_controller.rb @@ -193,15 +193,14 @@ class MapsController < ApplicationController @current = current_user @map = Map.find(params[:id]).authorize_to_edit(@current) - if @map - @map.name = params[:name] if params[:name] - @map.desc = params[:desc] if params[:desc] - @map.permission = params[:permission] if params[:permission] - @map.save - end - respond_to do |format| - format.json { render :json => @map } + if !@map + format.json { render json: "unauthorized" } + elsif @map.update_attributes(params[:map]) + format.json { head :no_content } + else + format.json { render json: @map.errors, status: :unprocessable_entity } + end end end From 0941b433918607243283821d55dacca386672a6b Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 11 Sep 2014 08:39:56 -0400 Subject: [PATCH 095/600] fixed spacing on abuot lightbox --- app/assets/stylesheets/application.css | 2 +- app/views/layouts/_lightboxes.html.erb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f852bea9..0333d7ff 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1468,7 +1468,7 @@ float: left; #aboutParms { margin: 30px auto; - width: 215px; + width: 218px; font-family: 'din-medium', helvetica, sans-serif; } #leftAboutParms { diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 63a31af2..a0d531f6 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -73,11 +73,11 @@

    GET INVOLVED!

    -

    Want to help is with design, code, marketing and management for Metamaps? We are an open value network, which for us means that we want to invite and empower peers to participate in creating value together.

    +

    Want to help us with design, code, marketing and management for Metamaps? We are an open value network, which for us means that we want to invite and empower peers to participate in creating value together.

    We welcome contributions in many forms. One of the easiest and best things you can do is to keep on mapping your ideas into the commons on the platform!

    -

    We welcome people of all skillsets to contribute to the project in different ways. Designers, researchers, academics, strategists, and facilitators can get in touch about opportunities to contribute to the project. If you're a developer, help us advance the code and take a look around out Github.

    +

    We welcome people of all skillsets to contribute to the project in different ways. Designers, researchers, academics, strategists, and facilitators can get in touch about opportunities to contribute to the project. If you're a developer, help us advance the code and take a look around our Github.

    Financial contributions are greatly appreciated in support of our work. All financial contributions are transparently governed and recorded in our value account system.

    From b722dc911b0ee92c9cec2142cd0da1a101581e3d Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Fri, 12 Sep 2014 11:45:53 -0400 Subject: [PATCH 096/600] help qr tutorials --- app/assets/javascripts/metamaps/Metamaps.js | 22 +++++++- app/assets/stylesheets/application.css | 61 +++++++++++++++++++-- app/views/shared/_cheatsheet.html.erb | 29 ++++++---- 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index 9288d125..89909267 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -3112,8 +3112,26 @@ Metamaps.Map = { Metamaps.Map.CheatSheet = { init: function () { // tab the cheatsheet - $('#cheatSheet').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); - $("#cheatSheet .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + $('#cheatSheet').tabs(); + $('#quickReference').tabs().addClass("ui-tabs-vertical ui-helper-clearfix"); + $("#quickReference .ui-tabs-nav li").removeClass("ui-corner-top").addClass("ui-corner-left"); + + // id = the id of a vimeo video + var switchVideo = function (element, id) { + $('.tutorialItem').removeClass("active"); + $(element).addClass("active"); + $('#tutorialVideo').attr('src','//player.vimeo.com/video/'+id); + }; + + $('#gettingStarted').click(function() { + switchVideo(this,'88334167'); + }); + $('#upYourSkillz').click(function() { + switchVideo(this,'100118167'); + }); + $('#advancedMapping').click(function() { + switchVideo(this,'88334167'); + }); } }; // end Metamaps.Map.CheatSheet diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f852bea9..21fa9b64 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1374,7 +1374,7 @@ float: left; display: none !important; } .ui-tabs-vertical { - width: 55em; + } .ui-tabs-vertical .ui-tabs-nav { float: left; @@ -1387,16 +1387,14 @@ float: left; .ui-tabs-vertical .ui-tabs-nav li { clear: left; width: 100%; - border-top: none !important; - border-left: none !important; - border-bottom: none !important; + border: none !important; background: none !important; margin: 0 0 .2em 0 !important; white-space: normal !important; } .ui-tabs-vertical .ui-tabs-nav li.ui-state-active, .ui-tabs-vertical .ui-tabs-nav li.ui-state-hover { - border-right: 1px solid #000; + border-right: none; } .ui-tabs-vertical .ui-tabs-nav li a { display: block; @@ -1684,6 +1682,8 @@ float: left; font-size: 17px; line-height: 21px; border: none; + background: none; + padding: 0; } #cheatSheet .sectionTitle { font-weight: bold; @@ -1703,6 +1703,57 @@ float: left; #cheatSheet .indented { margin-left: 15px; } + +#helpWrapper { + background: none; + border: none; + border-bottom: 1px solid #BDBDBD; + border-radius: 0; +} +#helpWrapper li { + border: none; + background: none; + padding: 0; + margin: 0 30px 0 0; + border-bottom: 2px solid rgba(0,0,0,0); +} +#helpWrapper li:hover, #helpWrapper li.ui-state-active { + border-bottom: 2px solid #00BCD4; +} +#helpWrapper li a { + padding: 0; + font-family: 'din-medium', helvetica, sans-serif; + font-size: 14px; +} +#quickReference { + padding: 32px 0 0 0; +} +#quickReference ul { + width: 150px; +} +#quickReference li.ui-state-active a { + color: #00BCD4; +} +#tutorials { + padding: 16px 0 0 0; +} +.tutorialItem { + margin-top: 16px; + display: inline-block; + font-size: 14px; + font-family: 'din-medium', helvetica, sans-serif; + cursor: pointer; + color: #757575; +} +.tutorialItem:hover { + color: #424242; +} +.tutorialItem.active { + color: #00bcd4; +} +#upYourSkillz { + margin: 0 70px; +} /* Admin Pages */ #wrapper > div.blackBox { diff --git a/app/views/shared/_cheatsheet.html.erb b/app/views/shared/_cheatsheet.html.erb index a774091b..361d615b 100644 --- a/app/views/shared/_cheatsheet.html.erb +++ b/app/views/shared/_cheatsheet.html.erb @@ -3,9 +3,16 @@ # The inner HTML of the cheatsheet #%> -

    Quick Reference Guide

    - +

    HELP

    +
    + + +
    -

    Topic View

    Alt + click on topic icon: recenter topics around chosen topic
    Right-click + 'center this topic': recenter topics around chosen topic
    -

    Creating Topics

    Double-click on canvas: Bring up the metacode spinner
    Scroll: change metacode spinner selection
    Tab: rotate spinner counter-clockwise
    @@ -35,7 +40,6 @@
    -

    Editing Topics

    Open topic card: double-click on topic icon
    @@ -67,7 +71,6 @@
    -

    Creating Synapses

    Right-click & drag from one topic to another: open create synapse prompt
    Enter: Create synapse
    *You do not have to add a description
    @@ -77,7 +80,6 @@
    -

    Editing Synapses

    Open synapse card:double-click on synapse
    Edit synapse description: click on current description text
    Save synapse description: hit enter
    @@ -88,14 +90,12 @@
    -

    Navigation

    Click + drag: move around canvas
    Scroll: zoom in/out
    Refresh page: center map
    -

    Selection

    Click on topic icon: select/deselect topic
    Click on synapse: select/deselect synapse
    Shift + click: select multiple topics / synapses
    @@ -108,7 +108,6 @@
    -

    Search

    Ctrl + /: open search prompt
    Esc: close search prompt
    Type into the search prompt: search for topics, maps, & mappers
    @@ -122,4 +121,12 @@
    -
    +
    + +
    1. GETTING STARTED
    +
    2. UP YOUR SKILLZ
    +
    3. ADVANCED MAPPING
    +
    + + +
    \ No newline at end of file From b6893d8f92ad542ba9e9d6450b9eaa4eadc7d7cc Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 15 Sep 2014 21:57:34 -0400 Subject: [PATCH 097/600] fixed admin panels --- app/assets/javascripts/application.js | 18 +- app/assets/javascripts/lib/Countable.js | 379 + .../WebSocketMain.swf | Bin .../WebSocketMainInsecure.swf | Bin .../{librariesForAllPages => lib}/bip.js | 0 .../canvasloader.min.js | 0 .../cloudcarousel.js | 0 .../hogan-2.0.0.js | 0 .../jquery-ui-1.8.23.custom.min.js | 0 .../jquery.lettering.js | 0 .../jquery.mCustomScrollbar.min.js | 0 .../jquery.mousewheel.min.js | 0 .../jquery.purr.js | 0 .../jquery.roundabout.min.js | 0 .../jquery.typing-0.2.0.min.js | 0 .../mCSB_buttons.png | Bin .../socket.io.js | 0 .../typeahead.js | 0 .../soundmanagerv297a-20131201/README.rdoc | 71 - .../demo/360-player/360 button - large.psd | Bin 31168 -> 0 bytes .../demo/360-player/360 button.psd | Bin 38695 -> 0 bytes .../360-player/360-button-pause-light.gif | Bin 329 -> 0 bytes .../360-player/360-button-pause-light.png | Bin 422 -> 0 bytes .../demo/360-player/360-button-pause.gif | Bin 329 -> 0 bytes .../demo/360-player/360-button-pause.png | Bin 339 -> 0 bytes .../demo/360-player/360-button-play-light.gif | Bin 441 -> 0 bytes .../demo/360-player/360-button-play-light.png | Bin 477 -> 0 bytes .../demo/360-player/360-button-play.gif | Bin 441 -> 0 bytes .../demo/360-player/360-button-play.png | Bin 368 -> 0 bytes .../360-player/360-button-vis-pause-light.gif | Bin 889 -> 0 bytes .../360-player/360-button-vis-pause-light.png | Bin 1304 -> 0 bytes .../demo/360-player/360-button-vis-pause.gif | Bin 881 -> 0 bytes .../demo/360-player/360-button-vis-pause.png | Bin 1293 -> 0 bytes .../360-player/360-button-vis-play-light.gif | Bin 1009 -> 0 bytes .../360-player/360-button-vis-play-light.png | Bin 1441 -> 0 bytes .../demo/360-player/360-button-vis-play.gif | Bin 1001 -> 0 bytes .../demo/360-player/360-button-vis-play.png | Bin 1380 -> 0 bytes .../360-player/360player-visualization.css | 156 - .../demo/360-player/360player.css | 271 - .../canvas-visualization-basic.html | 132 - .../demo/360-player/canvas-visualization.html | 359 - .../demo/360-player/demo-slider-controls.css | 179 - .../demo/360-player/demo-slider-controls.js | 750 - .../demo/360-player/demo.css | 64 - .../demo/360-player/icon_loading_dots.gif | Bin 1379 -> 0 bytes .../demo/360-player/icon_loading_spinner.gif | Bin 493 -> 0 bytes .../icon_loading_spinner_bigger.gif | Bin 2506 -> 0 bytes .../demo/360-player/index.html | 173 - .../demo/360-player/script/360player.js | 1410 -- .../360-player/script/berniecode-animator.js | 674 - .../demo/360-player/script/excanvas.js | 17 - .../demo/_image/360ui-screenshot1.png | Bin 11385 -> 0 bytes .../demo/_image/360ui-screenshot2.png | Bin 12003 -> 0 bytes .../demo/_image/360ui-screenshot3.png | Bin 8983 -> 0 bytes .../demo/_image/360ui-screenshot4.png | Bin 20034 -> 0 bytes .../demo/_image/armor-alley-screenshot.png | Bin 64663 -> 0 bytes .../_image/cassette-tape-ui-screenshot.jpg | Bin 49436 -> 0 bytes .../_image/cassette-tape-ui-screenshot.png | Bin 119618 -> 0 bytes .../demo/_image/christmas-lights.jpg | Bin 23588 -> 0 bytes .../demo/_image/christmas-lights.png | Bin 119590 -> 0 bytes .../demo/_image/chunk-webfont.svg | 127 - .../demo/_image/chunk-webfont.ttf | Bin 20496 -> 0 bytes .../demo/_image/chunk-webfont.woff | Bin 13660 -> 0 bytes .../demo/_image/dejavusansmono-webfont.eot | Bin 19626 -> 0 bytes .../demo/_image/dejavusansmono-webfont.woff | Bin 23040 -> 0 bytes .../demo/_image/fitter-happier-waveform.jpg | Bin 12510 -> 0 bytes .../demo/_image/fitter-happier-waveform.png | Bin 25212 -> 0 bytes .../demo/_image/flash9-dark.png | Bin 201 -> 0 bytes .../demo/_image/flash9.png | Bin 233 -> 0 bytes .../demo/_image/getsatisfaction-icon.gif | Bin 89 -> 0 bytes ...phish-dot-com-icons-and-android-sprite.png | Bin 1895 -> 0 bytes .../demo/_image/hue_thumb.png | Bin 102 -> 0 bytes .../demo/_image/logo-sprite.png | Bin 33987 -> 0 bytes .../demo/_image/mpc-screenshot.png | Bin 2781 -> 0 bytes .../demo/_image/muxtape-logo.png | Bin 3224 -> 0 bytes .../demo/_image/new-bw.png | Bin 180 -> 0 bytes .../demo/_image/new-dark.png | Bin 168 -> 0 bytes .../demo/_image/new.png | Bin 205 -> 0 bytes .../demo/_image/noise-dark.png | Bin 7659 -> 0 bytes .../demo/_image/noise.png | Bin 7613 -> 0 bytes .../demo/_image/picker_thumb.png | Bin 107 -> 0 bytes .../demo/_image/slider-1.png | Bin 855 -> 0 bytes .../demo/_image/slider-bar.gif | Bin 101 -> 0 bytes .../demo/_image/slider.png | Bin 549 -> 0 bytes .../demo/_image/soundmanager2-speaker.png | Bin 34378 -> 0 bytes .../demo/_image/speaker.png | Bin 5913 -> 0 bytes .../demo/_image/survivor-screenshot.png | Bin 4433 -> 0 bytes .../demo/_image/tiny_grid.png | Bin 168 -> 0 bytes .../demo/_image/wedge.png | Bin 832 -> 0 bytes .../demo/_image/wheelsofsteel-full-ui.jpg | Bin 13063 -> 0 bytes .../demo/_image/wheelsofsteel-full-ui.png | Bin 53650 -> 0 bytes .../_image/wheelsofsteel-single-deck-256.jpg | Bin 14946 -> 0 bytes .../demo/_mp3/1hz-10khz-sweep.mp3 | Bin 157987 -> 0 bytes .../demo/_mp3/440hz.mp3 | Bin 40541 -> 0 bytes .../demo/_mp3/880hz.mp3 | Bin 40541 -> 0 bytes .../demo/_mp3/background0.mp3 | Bin 2160 -> 0 bytes .../demo/_mp3/background1.mp3 | Bin 2592 -> 0 bytes .../demo/_mp3/background2.mp3 | Bin 2592 -> 0 bytes .../demo/_mp3/bass.mp3 | Bin 106161 -> 0 bytes .../demo/_mp3/button-0.mp3 | Bin 10240 -> 0 bytes .../demo/_mp3/button-1.mp3 | Bin 10240 -> 0 bytes .../demo/_mp3/click-high.mp3 | Bin 4224 -> 0 bytes .../demo/_mp3/click-low.mp3 | Bin 4224 -> 0 bytes .../demo/_mp3/coins.mp3 | Bin 59349 -> 0 bytes .../demo/_mp3/fancy-beer-bottle-pop.mp3 | Bin 113266 -> 0 bytes .../demo/_mp3/going_outside.mp3 | Bin 225416 -> 0 bytes .../demo/_mp3/mak.mp3 | Bin 34271 -> 0 bytes .../demo/_mp3/mouseover.mp3 | Bin 1353 -> 0 bytes .../demo/_mp3/mouseover2.mp3 | Bin 2991 -> 0 bytes .../demo/_mp3/mouseover3.mp3 | Bin 1274 -> 0 bytes .../demo/_mp3/office_lobby.mp3 | Bin 158958 -> 0 bytes .../demo/_mp3/rain.mp3 | Bin 131357 -> 0 bytes .../demo/_mp3/select.mp3 | Bin 10557 -> 0 bytes .../_mp3/sine, square, sawtooth, rando.mp3 | Bin 105742 -> 0 bytes .../demo/_mp3/walking.mp3 | Bin 64072 -> 0 bytes .../demo/animation-1/css/animation.css | 74 - .../demo/animation-1/image/ball.gif | Bin 348 -> 0 bytes .../demo/animation-1/index.html | 46 - .../demo/animation-1/script/animation.js | 190 - .../demo/animation-2a/bg-land.png | Bin 326 -> 0 bytes .../demo/animation-2a/bg-sky.png | Bin 492 -> 0 bytes .../demo/animation-2a/cursor-10.cur | Bin 2238 -> 0 bytes .../demo/animation-2a/cursor-11.cur | Bin 2998 -> 0 bytes .../demo/animation-2a/cursor-3.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-4.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-5.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-6.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-7.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-8.cur | Bin 4286 -> 0 bytes .../demo/animation-2a/cursor-9.cur | Bin 2238 -> 0 bytes .../demo/animation-2a/cursor-shadow.png | Bin 404 -> 0 bytes .../demo/animation-2a/dot.png | Bin 420 -> 0 bytes .../demo/animation-2a/index.html | 361 - .../demo/animation-2b/audio/bonk.mp3 | Bin 3342 -> 0 bytes .../demo/animation-2b/audio/fingerplop.mp3 | Bin 3760 -> 0 bytes .../demo/animation-2b/audio/fingerplop2.mp3 | Bin 2088 -> 0 bytes .../demo/animation-2b/css/animation.css | 36 - .../demo/animation-2b/image/ball.gif | Bin 348 -> 0 bytes .../demo/animation-2b/image/point.png | Bin 625 -> 0 bytes .../demo/animation-2b/index.html | 21 - .../demo/animation-2b/script/animation.js | 97 - .../demo/animation/audio/bonk.mp3 | Bin 3342 -> 0 bytes .../demo/animation/audio/fingerplop.mp3 | Bin 2507 -> 0 bytes .../demo/animation/audio/fingerplop2.mp3 | Bin 1253 -> 0 bytes .../demo/animation/index.html | 55 - .../demo/api/index.html | 993 -- .../css/cassette-tape-ui-blur-nojs.css | 30 - .../css/cassette-tape-ui-blur.css | 395 - .../cassette-tape/css/cassette-tape-ui.css | 832 -- .../demo/cassette-tape/css/demo.css | 368 - .../font/JustAnotherHand_ttf_font_LICENSE.txt | 202 - .../font/justanotherhand-webfont.eot | Bin 30204 -> 0 bytes .../font/justanotherhand-webfont.ttf | Bin 57652 -> 0 bytes .../font/justanotherhand-webfont.woff | Bin 31064 -> 0 bytes .../font/ostrich-rounded-webfont.eot | Bin 9430 -> 0 bytes .../font/ostrich-rounded-webfont.svg | 141 - .../font/ostrich-rounded-webfont.ttf | Bin 21428 -> 0 bytes .../font/ostrich-rounded-webfont.woff | Bin 10692 -> 0 bytes .../image/_src/MA-R90 metal pattern.png | Bin 2296 -> 0 bytes .../image/_src/TDK MA-R90 body.psd | Bin 2044227 -> 0 bytes .../cassette-tape/image/_src/Tape Mask.psd | Bin 696404 -> 0 bytes .../cassette-tape/image/_src/metalspool.psd | Bin 39322 -> 0 bytes .../image/_src/metalspoolblack.psd | Bin 39399 -> 0 bytes .../image/_src/rail-middle-outline-edited.psd | Bin 45427 -> 0 bytes .../image/_src/tape-screw-dark.psd | Bin 5980 -> 0 bytes .../cassette-tape/image/_src/tape-screw.psd | Bin 5179 -> 0 bytes .../demo/cassette-tape/image/black-micro.png | Bin 91 -> 0 bytes .../image/body-texture-strips.png | Bin 79 -> 0 bytes .../image/demo_backgrounds/sfatnight_1600.jpg | Bin 801553 -> 0 bytes .../demo/cassette-tape/image/gradient.png | Bin 799 -> 0 bytes .../cassette-tape/image/ma-r90-body-skin.png | Bin 25615 -> 0 bytes .../demo/cassette-tape/image/ma-r90-mask.png | Bin 3988 -> 0 bytes .../image/ma-r90-metal-pattern-v2.png | Bin 785 -> 0 bytes .../image/rail-middle-outline.png | Bin 2938 -> 0 bytes .../cassette-tape/image/spool-metal-black.png | Bin 5196 -> 0 bytes .../demo/cassette-tape/image/spool-metal.png | Bin 5384 -> 0 bytes .../demo/cassette-tape/image/spool-spokes.png | Bin 7524 -> 0 bytes .../demo/cassette-tape/image/tape-guide.png | Bin 1017 -> 0 bytes .../cassette-tape/image/tape-screw-dark.png | Bin 405 -> 0 bytes .../demo/cassette-tape/image/tape-screw.png | Bin 315 -> 0 bytes .../demo/cassette-tape/image/tape-texture.png | Bin 37292 -> 0 bytes .../demo/cassette-tape/index.html | 143 - .../demo/cassette-tape/more.html | 414 - .../cassette-tape/script/cassette-tape-ui.js | 1198 -- .../demo/cassette-tape/script/demo.js | 145 - .../demo/christmas-lights/christmaslights.css | 147 - .../demo/christmas-lights/christmaslights.js | 785 -- .../christmas-lights/image/bg-strip-dark.png | Bin 201 -> 0 bytes .../demo/christmas-lights/image/blank.png | Bin 88 -> 0 bytes .../image/bulbs-32x32-bottom.png | Bin 8956 -> 0 bytes .../image/bulbs-32x32-left.png | Bin 8377 -> 0 bytes .../image/bulbs-32x32-right.png | Bin 8203 -> 0 bytes .../image/bulbs-32x32-top.png | Bin 8910 -> 0 bytes .../image/bulbs-50x50-bottom.png | Bin 23406 -> 0 bytes .../image/bulbs-50x50-fragments.png | Bin 9582 -> 0 bytes .../image/bulbs-50x50-left.png | Bin 25841 -> 0 bytes .../image/bulbs-50x50-right.png | Bin 25209 -> 0 bytes .../image/bulbs-50x50-top.png | Bin 23903 -> 0 bytes .../christmas-lights/image/bulbs-50x50.png | Bin 5993 -> 0 bytes .../image/bulbs-64x64-bottom.png | Bin 25457 -> 0 bytes .../image/bulbs-64x64-left.png | Bin 21886 -> 0 bytes .../image/bulbs-64x64-right.png | Bin 21570 -> 0 bytes .../image/bulbs-64x64-top.png | Bin 25882 -> 0 bytes .../image/bulbs-72x72-bottom.png | Bin 30470 -> 0 bytes .../image/bulbs-72x72-left.png | Bin 26189 -> 0 bytes .../image/bulbs-72x72-right.png | Bin 25582 -> 0 bytes .../image/bulbs-72x72-top.png | Bin 30512 -> 0 bytes .../image/bulbs-96x96-bottom.png | Bin 41029 -> 0 bytes .../image/bulbs-96x96-left.png | Bin 34443 -> 0 bytes .../image/bulbs-96x96-right.png | Bin 34280 -> 0 bytes .../image/bulbs-96x96-top.png | Bin 41276 -> 0 bytes .../christmas-lights/image/noise-pattern.png | Bin 2416 -> 0 bytes .../demo/christmas-lights/index.html | 37 - .../demo/christmas-lights/sound/glass0.mp3 | Bin 8149 -> 0 bytes .../demo/christmas-lights/sound/glass1.mp3 | Bin 8985 -> 0 bytes .../demo/christmas-lights/sound/glass2.mp3 | Bin 16416 -> 0 bytes .../demo/christmas-lights/sound/glass3.mp3 | Bin 23730 -> 0 bytes .../demo/christmas-lights/sound/glass4.mp3 | Bin 46111 -> 0 bytes .../demo/christmas-lights/sound/glass5.mp3 | Bin 19008 -> 0 bytes .../soundmanagerv297a-20131201/demo/debug.css | 23 - .../demo/flashblock/basic.html | 37 - .../demo/flashblock/flashblock.css | 130 - .../demo/flashblock/index.html | 134 - .../demo/flashblock/method1/flashblock.css | 61 - .../demo/flashblock/method1/flashblock.js | 90 - .../demo/flashblock/method1/index.html | 85 - .../demo/index-rollup.css | 39 - .../demo/index-rollup.js | 200 - .../soundmanagerv297a-20131201/demo/index.css | 2926 ---- .../demo/index.html | 28 - .../soundmanagerv297a-20131201/demo/index.js | 621 - .../demo/mp3-player-button/basic.html | 56 - .../css/mp3-player-button.css | 117 - .../image/arrow-right-black.gif | Bin 66 -> 0 bytes .../image/arrow-right-black.png | Bin 147 -> 0 bytes .../image/arrow-right-white.gif | Bin 60 -> 0 bytes .../image/arrow-right-white.png | Bin 146 -> 0 bytes .../demo/mp3-player-button/index.html | 195 - .../script/mp3-player-button.js | 260 - .../demo/mpc/acoustic-drumkit.xml | 33 - .../demo/mpc/audio/AMB_BD_1.mp3 | Bin 12416 -> 0 bytes .../demo/mpc/audio/AMB_FTM2.mp3 | Bin 15174 -> 0 bytes .../demo/mpc/audio/AMB_HHCL.mp3 | Bin 5642 -> 0 bytes .../demo/mpc/audio/AMB_HHOP.mp3 | Bin 45139 -> 0 bytes .../demo/mpc/audio/AMB_HHPD.mp3 | Bin 7523 -> 0 bytes .../demo/mpc/audio/AMB_HTM.mp3 | Bin 15986 -> 0 bytes .../demo/mpc/audio/AMB_LTM2.mp3 | Bin 20062 -> 0 bytes .../demo/mpc/audio/AMB_MTM.mp3 | Bin 18808 -> 0 bytes .../demo/mpc/audio/AMB_RIM1.mp3 | Bin 5955 -> 0 bytes .../demo/mpc/audio/AMB_SN13.mp3 | Bin 17554 -> 0 bytes .../demo/mpc/audio/AMB_SN_5.mp3 | Bin 15046 -> 0 bytes .../demo/mpc/audio/CHINA_1.mp3 | Bin 46393 -> 0 bytes .../demo/mpc/audio/CRASH_1.mp3 | Bin 61440 -> 0 bytes .../demo/mpc/audio/CRASH_5.mp3 | Bin 53603 -> 0 bytes .../demo/mpc/audio/CRASH_6.mp3 | Bin 44512 -> 0 bytes .../demo/mpc/audio/RIDE_1.mp3 | Bin 49841 -> 0 bytes .../demo/mpc/audio/RIDE_3.mp3 | Bin 38243 -> 0 bytes .../demo/mpc/audio/SPLASH_1.mp3 | Bin 24764 -> 0 bytes .../demo/mpc/css/mpc.css | 158 - .../demo/mpc/image/progress.png | Bin 1452 -> 0 bytes .../demo/mpc/index.html | 72 - .../demo/mpc/script/mpc.js | 134 - .../demo/page-player/basic.html | 82 - .../demo/page-player/css/demo.css | 124 - .../page-player/css/optional-annotations.css | 162 - .../demo/page-player/css/optional-themes.css | 200 - .../demo/page-player/css/page-player.css | 307 - .../demo/page-player/image/divot-bottom.png | Bin 153 -> 0 bytes .../demo/page-player/image/divot.png | Bin 159 -> 0 bytes .../demo/page-player/image/top-highlight.png | Bin 153 -> 0 bytes .../demo/page-player/index.html | 379 - .../script/optional-page-player-metadata.js | 142 - .../demo/page-player/script/page-player.js | 1078 -- .../demo/page-player/xbm-test.html | 23 - .../demo/play-mp3-links/basic.html | 61 - .../demo/play-mp3-links/css/inlineplayer.css | 210 - .../demo/play-mp3-links/image/icon_pause.gif | Bin 189 -> 0 bytes .../demo/play-mp3-links/image/icon_pause.png | Bin 182 -> 0 bytes .../demo/play-mp3-links/image/icon_play.gif | Bin 193 -> 0 bytes .../demo/play-mp3-links/image/icon_play.png | Bin 220 -> 0 bytes .../demo/play-mp3-links/image/test.gif | Bin 213 -> 0 bytes .../demo/play-mp3-links/index.html | 227 - .../play-mp3-links/script/inlineplayer.js | 256 - .../demo/template/deferred-example.html | 243 - .../demo/template/html5-dtd-test.html | 87 - .../demo/template/index.html | 206 - .../demo/template/sm2_defer-example.html | 128 - .../demo/template/template.css | 162 - .../demo/template/xhtml-test.xhtml | 143 - .../doc/download/archive.html | 2041 --- .../doc/download/index.html | 1452 -- .../doc/generated/SoundManager2_AS.html | 938 -- .../doc/generated/SoundManager2_AS3.html | 2026 --- .../generated/SoundManager2_SMSound_AS3.html | 1302 -- .../doc/generated/docco.css | 508 - .../doc/generated/public/fonts/aller-bold.eot | Bin 29804 -> 0 bytes .../doc/generated/public/fonts/aller-bold.ttf | Bin 66836 -> 0 bytes .../generated/public/fonts/aller-bold.woff | Bin 33244 -> 0 bytes .../generated/public/fonts/aller-light.eot | Bin 29509 -> 0 bytes .../generated/public/fonts/aller-light.ttf | Bin 68620 -> 0 bytes .../generated/public/fonts/aller-light.woff | Bin 33124 -> 0 bytes .../generated/public/fonts/novecento-bold.eot | Bin 18190 -> 0 bytes .../generated/public/fonts/novecento-bold.ttf | Bin 48136 -> 0 bytes .../public/fonts/novecento-bold.woff | Bin 20576 -> 0 bytes .../public/stylesheets/normalize.css | 375 - .../doc/generated/soundmanager2.html | 11613 ---------------- .../doc/getstarted/index.html | 563 - .../soundmanagerv297a-20131201/doc/index.html | 1934 --- .../doc/resources/index.html | 243 - .../doc/technotes/index.html | 508 - .../soundmanagerv297a-20131201/index.html | 691 - .../soundmanagerv297a-20131201/license.txt | 29 - .../script/soundmanager2-jsmin.js | 110 - .../script/soundmanager2-nodebug-jsmin.js | 81 - .../script/soundmanager2-nodebug.js | 2660 ---- .../script/soundmanager2.js | 5989 -------- .../src/SoundManager2.as | 421 - .../src/SoundManager2_AS3.as | 925 -- .../src/SoundManager2_SMSound_AS3.as | 585 - .../src/make-flash8.bat | 5 - .../src/make-flash8.sh | 2 - .../src/make-flash9.bat | 4 - .../src/make-flash9.sh | 2 - .../swf/soundmanager2.swf | Bin 2908 -> 0 bytes .../swf/soundmanager2_debug.swf | Bin 3282 -> 0 bytes .../swf/soundmanager2_flash9.swf | Bin 8758 -> 0 bytes .../swf/soundmanager2_flash9_debug.swf | Bin 17258 -> 0 bytes .../swf/soundmanager2_flash_xdomain.zip | Bin 33064 -> 0 bytes .../troubleshoot/debug.css | 119 - .../troubleshoot/debug.js | 187 - .../troubleshoot/fpgss-add-location.png | Bin 21317 -> 0 bytes .../troubleshoot/fpgss-added-location.png | Bin 20131 -> 0 bytes .../troubleshoot/index.html | 154 - .../javascripts/{metamaps => src}/JIT.js | 0 .../{metamaps => src}/Metamaps.Backbone.js | 0 .../{metamaps => src}/Metamaps.GlobalUI.js | 0 .../{metamaps => src}/Metamaps.JIT.js | 0 .../{metamaps => src}/Metamaps.Router.js | 0 .../{metamaps => src}/Metamaps.Views.js | 0 .../javascripts/{metamaps => src}/Metamaps.js | 148 +- .../javascripts/{metamaps => src}/codeleft.js | 0 app/assets/stylesheets/application.css | 9 +- app/assets/stylesheets/base.css | 57 +- app/assets/stylesheets/gh-fork-ribbon.css | 140 + app/views/admin/_adminpanel.html.erb | 8 +- app/views/layouts/_lightboxes.html.erb | 8 +- app/views/layouts/_templates.html.erb | 7 +- app/views/layouts/_upperelements.html.erb | 2 +- app/views/main/home.html.erb | 9 +- app/views/metacode_sets/_form.html.erb | 24 +- app/views/metacode_sets/edit.html.erb | 55 +- app/views/metacode_sets/index.html.erb | 73 +- app/views/metacode_sets/new.html.erb | 52 +- app/views/metacode_sets/show.html.erb | 15 - app/views/metacodes/_form.html.erb | 2 +- app/views/metacodes/edit.html.erb | 10 +- app/views/metacodes/index.html.erb | 51 +- app/views/metacodes/new.html.erb | 6 +- app/views/metacodes/show.html.erb | 15 - app/views/shared/_cheatsheet.html.erb | 2 +- app/views/shared/_metacodeoptions.html.erb | 31 +- public/famous/main.js | 6 +- 362 files changed, 818 insertions(+), 56488 deletions(-) create mode 100644 app/assets/javascripts/lib/Countable.js rename app/assets/javascripts/{librariesForMapPages => lib}/WebSocketMain.swf (100%) rename app/assets/javascripts/{librariesForMapPages => lib}/WebSocketMainInsecure.swf (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/bip.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/canvasloader.min.js (100%) rename app/assets/javascripts/{librariesForMapPages => lib}/cloudcarousel.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/hogan-2.0.0.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery-ui-1.8.23.custom.min.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.lettering.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.mCustomScrollbar.min.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.mousewheel.min.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.purr.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.roundabout.min.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/jquery.typing-0.2.0.min.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/mCSB_buttons.png (100%) rename app/assets/javascripts/{librariesForMapPages => lib}/socket.io.js (100%) rename app/assets/javascripts/{librariesForAllPages => lib}/typeahead.js (100%) delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause-light.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause-light.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause-light.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause-light.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-pause.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_dots.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner_bigger.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/berniecode-animator.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot4.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/armor-alley-screenshot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9-dark.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/getsatisfaction-icon.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/mpc-screenshot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/noise-dark.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/noise.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider-1.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider-bar.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/soundmanager2-speaker.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/speaker.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/survivor-screenshot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/1hz-10khz-sweep.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/440hz.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/button-0.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/button-1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/click-high.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/click-low.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/coins.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/fancy-beer-bottle-pop.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/going_outside.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mak.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/mouseover3.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/office_lobby.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/rain.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/select.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/sine, square, sawtooth, rando.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/walking.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/css/animation.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/image/ball.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-1/script/animation.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/bg-land.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/bg-sky.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-10.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-11.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-3.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-4.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-5.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-6.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-7.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-8.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-9.cur delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/cursor-shadow.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/dot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2a/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/bonk.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/fingerplop.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/audio/fingerplop2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/css/animation.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/image/ball.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/image/point.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation-2b/script/animation.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/bonk.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/fingerplop.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/audio/fingerplop2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/animation/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/api/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui-blur-nojs.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui-blur.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/cassette-tape-ui.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/css/demo.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/JustAnotherHand_ttf_font_LICENSE.txt delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/justanotherhand-webfont.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.svg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/font/ostrich-rounded-webfont.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/MA-R90 metal pattern.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/TDK MA-R90 body.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/Tape Mask.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/metalspool.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/metalspoolblack.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/rail-middle-outline-edited.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/tape-screw-dark.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/_src/tape-screw.psd delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/black-micro.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/body-texture-strips.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/demo_backgrounds/sfatnight_1600.jpg delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/gradient.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-body-skin.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-mask.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/ma-r90-metal-pattern-v2.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/rail-middle-outline.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-metal-black.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-metal.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/spool-spokes.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-guide.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-screw-dark.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-screw.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/image/tape-texture.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/more.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/script/cassette-tape-ui.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/cassette-tape/script/demo.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/christmaslights.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/christmaslights.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bg-strip-dark.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/blank.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-left.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-right.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-32x32-top.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-fragments.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-left.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-right.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50-top.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-50x50.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-left.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-right.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-64x64-top.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-left.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-right.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-72x72-top.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-left.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-right.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/bulbs-96x96-top.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/image/noise-pattern.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass0.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass3.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass4.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/christmas-lights/sound/glass5.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/debug.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/basic.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/flashblock.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/flashblock.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/flashblock.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/flashblock/method1/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index-rollup.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index-rollup.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_FTM2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_6.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/SPLASH_1.mp3 delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/basic.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/top-highlight.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/page-player.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/test.gif delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.ttf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.woff delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash_xdomain.zip delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png delete mode 100755 app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/index.html rename app/assets/javascripts/{metamaps => src}/JIT.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.Backbone.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.GlobalUI.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.JIT.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.Router.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.Views.js (100%) rename app/assets/javascripts/{metamaps => src}/Metamaps.js (94%) rename app/assets/javascripts/{metamaps => src}/codeleft.js (100%) create mode 100644 app/assets/stylesheets/gh-fork-ribbon.css delete mode 100644 app/views/metacode_sets/show.html.erb delete mode 100644 app/views/metacodes/show.html.erb diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 685f46cb..20672dd2 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,13 +15,11 @@ //= require jquery_ujs //= require ./orderedLibraries/underscore //= require ./orderedLibraries/backbone -//= require_directory ./librariesForAllPages -//= require ./metamaps/Metamaps.GlobalUI -//= require ./metamaps/Metamaps.Router -//= require ./metamaps/Metamaps.Backbone -//= require ./metamaps/Metamaps.Views -//= require ./librariesForMapPages/cloudcarousel -//= require ./librariesForMapPages/socket.io -//= require ./metamaps/JIT -//= require ./metamaps/Metamaps -//= require ./metamaps/Metamaps.JIT \ No newline at end of file +//= require_directory ./lib +//= require ./src/Metamaps.GlobalUI +//= require ./src/Metamaps.Router +//= require ./src/Metamaps.Backbone +//= require ./src/Metamaps.Views +//= require ./src/JIT +//= require ./src/Metamaps +//= require ./src/Metamaps.JIT \ No newline at end of file diff --git a/app/assets/javascripts/lib/Countable.js b/app/assets/javascripts/lib/Countable.js new file mode 100644 index 00000000..524c4ff8 --- /dev/null +++ b/app/assets/javascripts/lib/Countable.js @@ -0,0 +1,379 @@ +/** + * Countable is a script to allow for live paragraph-, word- and character- + * counting on an HTML element. + * + * @author Sacha Schmid () + * @version 2.0.2 + * @license MIT + * @see + */ + +/** + * Note: For the purpose of this internal documentation, arguments of the type + * {Nodes} are to be interpreted as either {NodeList} or {Element}. + */ + +;(function (global) { + 'use strict' + + /** + * @private + * + * `_liveElements` holds all elements that have the live-counting + * functionality bound to them. + * + * `_event` holds the event to handle the live counting, based on the + * browser's capabilities. + */ + + var _liveElements = [], + _event = 'oninput' in document ? 'input' : 'keyup' + + /** + * `String.trim()` polyfill for non-supporting browsers. This is the + * recommended polyfill on MDN. + * + * @see + * @see + * + * @return {String} The original string with leading and trailing whitespace + * removed. + */ + + if (!String.prototype.trim) { + String.prototype.trim = function () { + return this.replace(/^\s+|\s+$/g, '') + } + } + + /** + * `ucs2decode` function from the punycode.js library. + * + * Creates an array containing the decimal code points of each Unicode + * character in the string. While JavaScript uses UCS-2 internally, this + * function will convert a pair of surrogate halves (each of which UCS-2 + * exposes as separate characters) into a single code point, matching + * UTF-16. + * + * @see + * @see + * + * @param {String} string The Unicode input string (UCS-2). + * + * @return {Array} The new array of code points. + */ + + function _decode (string) { + var output = [], + counter = 0, + length = string.length, + value, extra + + while (counter < length) { + value = string.charCodeAt(counter++) + + if ((value & 0xF800) == 0xD800 && counter < length) { + + // High surrogate, and there is a next character. + + extra = string.charCodeAt(counter++) + + if ((extra & 0xFC00) == 0xDC00) { + + // Low surrogate. + + output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000) + } else { + output.push(value, extra) + } + } else { + output.push(value) + } + } + + return output + } + + /** + * `_validateArguments` validates the arguments given to each function call. + * Errors are logged to the console as warnings, but Countable fails silently. + * + * @private + * + * @param {Nodes} elements The (collection of) element(s) to + * validate. + * + * @param {Function} callback The callback function to validate. + * + * @return {Boolean} Returns whether all arguments are vaild. + */ + + function _validateArguments (elements, callback) { + var elementsValid = elements && ((Object.prototype.toString.call(elements) === '[object NodeList]' && elements.length) || (elements.nodeType === 1)), + callbackValid = callback && typeof callback === 'function' + + if ('console' in window && 'warn' in console) { + if (!elementsValid) console.warn('Countable: No valid elements were found') + if (!callbackValid) console.warn('Countable: "' + callback + '" is not a valid callback function') + } + + return elementsValid && callbackValid + } + + /** + * `_extendDefaults` is a function to extend a set of default options with the + * ones given in the function call. Available options are described below. + * + * {Boolean} hardReturns Use two returns to seperate a paragraph instead + * of one. + * {Boolean} stripTags Strip HTML tags before counting the values. + * {Boolean} ignoreReturns Ignore returns when calculating the `all` + * property. + * + * @private + * + * @param {Object} options Countable allows the options described above. + * They can be used in a function call to override + * the default behaviour. + * + * @return {Object} The new options object. + */ + + function _extendDefaults (options) { + var defaults = { hardReturns: false, stripTags: false, ignoreReturns: false } + + for (var prop in options) { + if (defaults.hasOwnProperty(prop)) defaults[prop] = options[prop] + } + + return defaults + } + + /** + * `_count` trims an element's value, optionally strips HTML tags and counts + * paragraphs, words, characters and characters plus spaces. + * + * @private + * + * @param {Element} element The element whose value is to be counted. + * + * @param {Object} options The options to use for the counting. + * + * @return {Object} The object containing the number of paragraphs, + * words, characters and characters plus spaces. + */ + + function _count (element, options) { + var original = 'value' in element ? element.value : element.innerText || element.textContent, + trimmed + + /** + * The initial implementation to allow for HTML tags stripping was created + * @craniumslows while the current one was created by @Rob--W. + * + * @see + * @see + */ + + if (options.stripTags) original = original.replace(/<\/?[a-z][^>]*>/gi, '') + + trimmed = original.trim() + + /** + * Most of the performance improvements are based on the works of @epmatsw. + * + * @see + */ + + return { + paragraphs: trimmed ? (trimmed.match(options.hardReturns ? /\n{2,}/g : /\n+/g) || []).length + 1 : 0, + words: trimmed ? (trimmed.replace(/['";:,.?¿\-!¡]+/g, '').match(/\S+/g) || []).length : 0, + characters: trimmed ? _decode(trimmed.replace(/\s/g, '')).length : 0, + all: _decode(options.ignoreReturns ? original.replace(/[\n\r]/g, '') : original).length + } + } + + /** + * `_loop` is a helper function to iterate over a collection, e.g. a NodeList + * or an Array. The callback receives the current element as the single + * parameter. + * + * @private + * + * @param {Array} which The collection to iterate over. + * + * @param {Function} callback The callback function to call on each + * iteration. + */ + + function _loop (which, callback) { + var len = which.length + + if (typeof len !== 'undefined') { + while (len--) { + callback(which[len]) + } + } else { + callback(which) + } + } + + /** + * This is the main object that will later be exposed to other scripts. It + * holds all the public methods that can be used to enable the Countable + * functionality. + */ + + var Countable = { + + /** + * The `live` method binds the counting handler to all given elements. The + * event is either `oninput` or `onkeydown`, based on the capabilities of + * the browser. + * + * @param {Nodes} elements All elements that should receive the + * Countable functionality. + * + * @param {Function} callback The callback to fire whenever the + * element's value changes. The callback is + * called with the relevant element bound to + * `this` and the counted values as the + * single parameter. + * + * @param {Object} [options] An object to modify Countable's + * behaviour. Refer to `_extendDefaults` for + * a list of available options. + * + * @return {Object} Returns the Countable object to allow for chaining. + */ + + live: function (elements, callback, options) { + var ops = _extendDefaults(options), + bind = function (element) { + var handler = function () { + callback.call(element, _count(element, ops)) + } + + _liveElements.push({ element: element, handler: handler }) + + handler() + + if (element.addEventListener) { + element.addEventListener(_event, handler, false) + } else if (element.attachEvent) { + element.attachEvent('on' + _event, handler) + } + } + + if (!_validateArguments(elements, callback)) return + + if (elements.length) { + _loop(elements, bind) + } else { + bind(elements) + } + + return this + }, + + /** + * The `die` method removes the Countable functionality from all given + * elements. + * + * @param {Nodes} elements All elements whose Countable functionality + * should be unbound. + * + * @return {Object} Returns the Countable object to allow for chaining. + */ + + die: function (elements) { + if (!_validateArguments(elements, function () {})) return + + _loop(elements, function (element) { + var liveElement + + _loop(_liveElements, function (live) { + if (live.element === element) liveElement = live + }) + + if (!liveElement) return + + if (element.removeEventListener) { + element.removeEventListener(_event, liveElement.handler, false) + } else if (element.detachEvent) { + element.detachEvent('on' + _event, liveElement.handler) + } + + _liveElements.splice(_liveElements.indexOf(liveElement), 1) + }) + + return this + }, + + /** + * The `once` method works mostly like the `live` method, but no events are + * bound, the functionality is only executed once. + * + * @param {Nodes} elements All elements that should receive the + * Countable functionality. + * + * @param {Function} callback The callback to fire whenever the + * element's value changes. The callback is + * called with the relevant element bound to + * `this` and the counted values as the + * single parameter. + * + * @param {Object} [options] An object to modify Countable's + * behaviour. Refer to `_extendDefaults` + * for a list of available options. + * + * @return {Object} Returns the Countable object to allow for chaining. + */ + + once: function (elements, callback, options) { + if (!_validateArguments(elements, callback)) return + + _loop(elements, function (element) { + callback.call(element, _count(element, _extendDefaults(options))) + }) + + return this + }, + + /** + * The `enabled` method checks if the live-counting functionality is bound + * to an element. + * + * @param {Element} element A single Element. + * + * @return {Boolean} A boolean value representing whether Countable + * functionality is bound to the given element. + */ + + enabled: function (element) { + var isEnabled = false + + if (element && element.nodeType === 1) { + _loop(_liveElements, function (live) { + if (live.element === element) isEnabled = true + }) + } + + return isEnabled + } + + } + + /** + * Expose Countable depending on the module system used across the + * application. (Node / CommonJS, AMD, global) + */ + + if (typeof exports === 'object') { + module.exports = Countable + } else if (typeof define === 'function' && define.amd) { + define(function () { return Countable }) + } else { + global.Countable = Countable + } +}(this)) diff --git a/app/assets/javascripts/librariesForMapPages/WebSocketMain.swf b/app/assets/javascripts/lib/WebSocketMain.swf similarity index 100% rename from app/assets/javascripts/librariesForMapPages/WebSocketMain.swf rename to app/assets/javascripts/lib/WebSocketMain.swf diff --git a/app/assets/javascripts/librariesForMapPages/WebSocketMainInsecure.swf b/app/assets/javascripts/lib/WebSocketMainInsecure.swf similarity index 100% rename from app/assets/javascripts/librariesForMapPages/WebSocketMainInsecure.swf rename to app/assets/javascripts/lib/WebSocketMainInsecure.swf diff --git a/app/assets/javascripts/librariesForAllPages/bip.js b/app/assets/javascripts/lib/bip.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/bip.js rename to app/assets/javascripts/lib/bip.js diff --git a/app/assets/javascripts/librariesForAllPages/canvasloader.min.js b/app/assets/javascripts/lib/canvasloader.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/canvasloader.min.js rename to app/assets/javascripts/lib/canvasloader.min.js diff --git a/app/assets/javascripts/librariesForMapPages/cloudcarousel.js b/app/assets/javascripts/lib/cloudcarousel.js similarity index 100% rename from app/assets/javascripts/librariesForMapPages/cloudcarousel.js rename to app/assets/javascripts/lib/cloudcarousel.js diff --git a/app/assets/javascripts/librariesForAllPages/hogan-2.0.0.js b/app/assets/javascripts/lib/hogan-2.0.0.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/hogan-2.0.0.js rename to app/assets/javascripts/lib/hogan-2.0.0.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery-ui-1.8.23.custom.min.js b/app/assets/javascripts/lib/jquery-ui-1.8.23.custom.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery-ui-1.8.23.custom.min.js rename to app/assets/javascripts/lib/jquery-ui-1.8.23.custom.min.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.lettering.js b/app/assets/javascripts/lib/jquery.lettering.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.lettering.js rename to app/assets/javascripts/lib/jquery.lettering.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.mCustomScrollbar.min.js b/app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.mCustomScrollbar.min.js rename to app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.mousewheel.min.js b/app/assets/javascripts/lib/jquery.mousewheel.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.mousewheel.min.js rename to app/assets/javascripts/lib/jquery.mousewheel.min.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.purr.js b/app/assets/javascripts/lib/jquery.purr.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.purr.js rename to app/assets/javascripts/lib/jquery.purr.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.roundabout.min.js b/app/assets/javascripts/lib/jquery.roundabout.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.roundabout.min.js rename to app/assets/javascripts/lib/jquery.roundabout.min.js diff --git a/app/assets/javascripts/librariesForAllPages/jquery.typing-0.2.0.min.js b/app/assets/javascripts/lib/jquery.typing-0.2.0.min.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/jquery.typing-0.2.0.min.js rename to app/assets/javascripts/lib/jquery.typing-0.2.0.min.js diff --git a/app/assets/javascripts/librariesForAllPages/mCSB_buttons.png b/app/assets/javascripts/lib/mCSB_buttons.png similarity index 100% rename from app/assets/javascripts/librariesForAllPages/mCSB_buttons.png rename to app/assets/javascripts/lib/mCSB_buttons.png diff --git a/app/assets/javascripts/librariesForMapPages/socket.io.js b/app/assets/javascripts/lib/socket.io.js similarity index 100% rename from app/assets/javascripts/librariesForMapPages/socket.io.js rename to app/assets/javascripts/lib/socket.io.js diff --git a/app/assets/javascripts/librariesForAllPages/typeahead.js b/app/assets/javascripts/lib/typeahead.js similarity index 100% rename from app/assets/javascripts/librariesForAllPages/typeahead.js rename to app/assets/javascripts/lib/typeahead.js diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc deleted file mode 100755 index 60f1529d..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/README.rdoc +++ /dev/null @@ -1,71 +0,0 @@ -== SoundManager 2: JavaScript Sound for the Web - -By wrapping and extending HTML5 and Flash Audio APIs, SoundManager 2 brings reliable cross-platform audio to JavaScript. - -== HTML5 Audio() Support - - * 100% Flash-free MP3 + MP4/AAC where supported - * Compatible with Apple iPad 3.2, iPhone/iOS 4 and newer - * Fallback to Flash for MP3/MP4 support, as needed - * SM2 API is transparent; HTML5/flash switching handled internally - * HTML5 API support approximates Flash 8 API features - * Some other formats (WAV/OGG) supported via HTML5, depending on browser - * See "useHTML5Audio" property for implementation details - -== Basic API Features (Flash 8) - - * Load, stop, play, pause, mute, seek, pan and volume control of sounds from Javascript - * Events: onload, whileloading, whileplaying, onfinish and more - * ID3V1 and ID3V2 tag support for MP3s (title, artist, genre etc.) - -== Shiny Flash 9 Features - - * RTMP / Flash Media Server streaming support (new, experimental) - * MPEG-4 (AAC, HE-AAC, H.264) audio support - * "MultiShot" play (layered/chorusing effects) - * Waveform/frequency spectrum data - * Peak (L/R channel volume) data - * Audio buffering state/event handling - -== General Tech Stuff - - * Full API Documentation with examples and notes - * console.log()-style debug output and troubleshooting tools - * Community-based discussion/support - -== As Heard On The Internets - -A few nifty sites that have implemented SM2 for driving audio: - - * SoundCloud / The Cloud Player - * last.fm - * Opera (media player component) - * 8tracks - * Discogs - * The Hype Machine - * nyan.cat - * turntable.fm - * AudioGalaxy - -== Project home, documentation, live demos etc.: - -http://www.schillmania.com/projects/soundmanager2/ - -== Compiling JS builds (-nodebug, -jsmin) and Flash components, AS2/AS3 to SWF - -An Ant build file defines the tasks for compiling JS and SWF components, useful if you make changes to the SM2 source and want to recompile. -Google's Closure Compiler is used for the JS. AS2 compilation is done by MTASC, and AS3 is handled by Adobe's Open Source Flex SDK (mxmlc) compiler. -Refer to the build.xml file for compiler downloads and path definitions. - -== Versioning / Development Notes - -Releases are versioned by date, e.g., V2.97a.20110424 and are tagged as such.* -The latest official release is always on trunk/master. -Post-release development builds may be available on the appropriate +DEV branch, eg., V2.97a.20110801+DEV - -== Forks and Pull Requests - -Firstly, thank you for wanting to contribute! Bug fixes and tweaks are welcomed, particularly if they follow the general coding style of the project. -If making a pull request, use the project's current +DEV development branch as the merge target instead of "master", if possible (please and thank-you.) - -* SoundManager 2 has been at "version" 2.97 for a long time, because 2.97 was arguably the best llama-ass-whipping version of WinAmp. (WinAmp 3 was not as good, and WinAmp 5 was "the best of 2 and 3 combined.") This MP3 player was my favourite Windows app during the 90's, and is missed as there's nothing quite like it on OS X where I spend most of my time these days. diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button - large.psd deleted file mode 100755 index 930b41e016d6612c10e1f929221fd940e52a1c7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31168 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 Cn)0Cl diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360 button.psd deleted file mode 100755 index afd049802bfbec740516eb1df5cca5cfa3c7cac2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38695 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 aD1QMQ^cUopsrZvP-+hwbC8*DjHXkcit zVy)K-qZyDe2N{BcgoFo9CKwbGjE#&Gh+L9eGZB`TmMU5t6%+<)7@-($1{4(>C5i!T ztQ-N5Bo%gddUz`hS#uE-M;ZtSN58!c5q>Bc63G$@3dzjM5*alk0uu)o*xB0H2NQB6 b8xIQvvB}G3^Y- z-9)XLs|D_#KWk)Tfa@pjb!RYf9EVw!b;V-!Q6n2Sz$+_-ZWspJY&KWiJ-pY*#trbw z4o@>pvliR}yt3=2*tY!!!EU#k1U&Fco099g3tp@5cKwEc2j1R(vET2XeBb}_Jdg43 zUZ8;%o>3j{a5&75$Kxx1vp$4oKDp5cL9jZX&-&?fA{;6pn8VuSM*pXuAAxo0DbHau Q+5i9m07*qoM6N<$g7a*}nE(I) diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-pause.gif deleted file mode 100755 index 5317ded4d391b067b842361991de53d3dcb633db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329 zcmV-P0k-}}Nk%w1VHN-u0Q4OI-QC^e`1tel^FBU4L_|b6IXUFy zEGYq?d|RE?(WXc&gkgq@bK{Q@$uN$*hWT1`T6C5i)V ztQ-T7Bo%gddUz`hS#uE-M;ZtSN58!c5q>Bc63G$?3CYaL5*alk1QQDu*xB0H3lnlA b8x9HqG=V5s(dUecQ8&N7N7GJ5oG!YkAK``P z*CGB<|MQ@PGSXzoF~e6GZ(kFm9oC-W1kye>^{;UaGCp=k z)Y14VC%aZmu)Gp4%ujIu1+ghGZ#=X16h&|wdW^Tm6KhW~4nAO(^CB(}zPe;F%JCkN zV=?kS3M;$CY>vl@S=lX>P-UYUtfos;ca~U9t3jo{G()UAAFpeKc+**{Z~XKq+4OdL lYqpM=o!<1~fBv|?#Gmi$dodS~>(u}N002ovPDHLkV1fYhn|A;J diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.gif deleted file mode 100755 index 22be94f866c4d384a0a1bad0f20b8efef42edac4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmZ?wbhEHb6k`x$_^Qcp_wL<)|NcFG{P^3qZ(qND{qf_6SL7Lw@Kc{Ze}3}h$<3QL zor8{i`t<4h_wO%XzI^-kt-asD`}glB`U>d{1<*W z-l}TyE~;EAix&$CFImBrit?Nr`szR!ovpOig8f@-&r4ZoY?#`rEex0@C8|-l_yUGb(T?|M~mx m50`_BlG6c4CPofnC7%Zm;ubQgIoVVQtUKTkEz!)tU=09hue758 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play-light.png deleted file mode 100755 index fc30c5f42fc3c9f1b0739227ac7cdfc5f65371fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 477 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6>jHd2T!HjEFnICe#e)YAfXr8~ zUIEF+j~@fcw{PD9$(Ju*-n(}X$awSS4Ul~L^y&Tk_aWR5A3l8k{Q1k5FWyL9Q& zuV24Defs1Tc?KwZ^XAPTKYslD`Sbnz_fMWYvG+Up{rmU3ckcrAe*E|mXkAj?(cH?b z&Ot}wvW_I?o?5%%+}^{lj-PpZ_Tsy9=gxVApSp45Mq$mh;`-}LSDpg8XT{p9?F;`k z09`Cv666=mz~$=Z5f&a9GkyB%HS5owy?X8X$B&$UUi|_pIO*x)7*Y{8_e}WaLka?I zi2;EVJ32jl``>;ckh|L^itH+ zP3Og@-;dF{To#u-<;-LIwDilnR+y%Xed{#QOH^s}F>P6Y{f24l8U6{YUwvl%)aWe6 zRrU0)t@ZUx!6MzQ-}$!ay`J#%rNyrAa`k@;xs;3k-J>Np7)kn&DSM4T8XNAY5 zpC@KqlW4s8ZN`mr0b6w1=4WV3dyzEjuFFjk)ekjWZ@x8KZRr;NgPAo&KGHhW<~-0- N44$rjF6*2UngBu_6tMsR diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.gif deleted file mode 100755 index d150c0d61f0f1b855f35f9fb9b5ed80def9ba2b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmZ?wbhEHb6k`x$_^Qcp_wL<)|NedZ_U--q_g}w${qf_6y}iAyt?lQ}pPxK=a`Wa* zb93`gpFVy6{{8LSxA*VgfBEvIiHXUnQ>T_JSrQQuk&==U6%}>l$dN^h7G-2)WM^lu zTD5BD&YfXlVej6(d;IwEix)3GeE9J3F3X%U%q@fckbM;U%&qU|Ia`% zQ2fcl%D|w>paU`qZ%h>}rnxi=Fee%* zN-S(#ks@NdrTa&d(LpgPVhspjWl~aWac1V=4PcwjCMx5t zs>bZ1%B8Y+v6%Fd6_7&UA?tRLrrei?pBovKGwdpQ)9G+fs* zbzjh6+U%kFg%P~$fV|EQ6RAHfJ3xIGXsM)0P}9D?*IS* diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-play.png deleted file mode 100755 index 8fd7c4c6672eb898091338d60d436c2a8b91169b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmV-$0gwKPP)9j8h4ppr~PVF!2L*H%?;0?CxZ84kUmbpiK%%CGgVHhJVZBdsw); zhAs~ByMgz)hsyyK|MMb;Jn~6W#w5SN1Wldnt$e8f$gBr^|j}Y(Cb O0000FDU_@bK{S^YiNJ>h$#V@9*#I?CkaR_5A$&{r&y-_xJkx`uO64nr!Qu=yh>)P0Q=6 zx7e&{osBS)5pFs^&IPk;dU_nqh7b`%CKHPVTa6Gl8YR=of(EOT4DvRMb}|#|QA{TF zq*X%49V8NuYaIk~8cTIg932({7D#=5kdQ|}i;Wy(O*0)65nykTprA+_S9=#t7>NQC zMxm~eMsa(XJgO5NpRc-pxU!cnJ)5^i#Kp$PM#3G2EEgIUok7Uc)MpljWgHsB^MoDxasQa?CtGT%O~30?)CQV;p4Q<5f*^=0PAglhD}7OZE6B4beE4D1`Pym z{g_B`Vu6bVC}PZ5vEwEJ8piMg*|FnBjTlS+cBE3!Tql(kPg+a~b0VpD2XEQfX~Td| z13iE89J)#0!D~Z#{sdZMY0{m~jA}#rw5d?5KC9Ml^59RHeOBbt<2sg{r)>6cbpshi?4*DNtS52+FLx`YHs;qhKWDc(_rCh~-p}*>@&0^X@7Isd^Zjyz=>E3WE3FX( zu??X52E%jfe;39a?#v#n7(vYPgJ=xDg@pxJ`QOs%bY5Ow2?+^oHoLH}aBOUBVq!w2 zQVkCeOC%Bsh2r7i5f~WQ_oeiDJ?wUMb+K41p-?E5N;Miyd3m`)p^(XBWHOo0=L3&Y zshpgg6pO_pBO@Ih9a^mxrqpURaQ652gCewCE*IDUKp+rAA`x&73=9kn4FR~gxL7Wi zgEWAFc64-fe0;pSyBqKg4Gqw?w6xUJ)G(RMoSYoMKrR@st*r%qc!ybleWil7v$GRS z78MnN$;QS;umR(+($>}n_~z#3!NEa@(A(P!D(&s&4 zGcynkkialEHwVbs+1aV7DF_12!6E1Z5=?$QN&5Xc1W_Z13PFYt8%<1+0Xd*G7z|*; zbWO4u{3Wo0=^=<23Tfw44NSYhm2M|j0s(3aN6<4o-g8#{6-KKd{gXC3otg^;M| zh`*Dot*{+4VhCZJ(Vit?7->*-_jCQK7nzY5mmchWhRLQRR422}t=#;YE%h~SZ#Q!S3DLVJtEVYAKkR;&47B6_1aWwC<3+qZVLk9|D71kM1%yapEdm zZ>ZLVxbbfAp1S-|l0@b&i#Fob$x*$S_SlSoHLMHj{F5ZhCaZgI#Mj+U4Q#>fT>RZ7 zubQ=%jVEQx^PQy!o&Fq@KKh$xa1!!M1`cO8qnX|j5By%o7@4Q5R2WSU0!rU z(AOuL1%`(q{>qCFcT+lB&9_GhB9!EloEPy!Ww~hY@H`9B`^{V5va^K(PI4vMYURrN zNoUP=5qBcm=ah3c+k+ADj=UwlxJdb;=6Zir)}qJ1g$hx)J+$TnOx|i|L0SiV*MrLs*P6XAQg0--JjDOV_nf&tBgoRB z9q}no6^=^krud5aZ<)FFH*b=>Xc6&s^~*u%!_Tbrk5rdWd6W0_OY!~G*gMuvw;V&3 zIlAiS<2P|WPXldL9|3}}LRo4CE!!RnjOZIj>v2bT)K0fZM z;hw$h>&A@4dXsH4X42Eso@~ICUoB13jUTz|@QBYhKFHvmIrFUP#F5y~Q?B$^S@t+y RlO6m?NPr*Rw{$-+9>r#>V#c_PDsXadC0f)YKdt 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play-light.png deleted file mode 100755 index 599b0c67b3b67888b07833908b2f9faeaf4010ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1441 zcmZvbdo+}J7{^~@XqW~~HYy#L)K)6Fv^AAXMX?8sODNH#?XohPHtVu0(P3&NMF~mD z8Zou#qOjx^oidUk#>^Oo8FSOPjd@Kt_SyY=pL5>d?>*1&`~CdB&wI|xp!ggj7_Krz z5QO0A;pPYXwtpX-F0536K^21N$SGa{?u(0y(D~mQA0Kyea$+)>VzF4MR3;@Q(P*@< zU%w6y4^K=?kVqsD$Ye4GgCUhlg+if9rRweN<@5Ql78e)85sSqFJ(Nf!YHMp#C=>u0 z8XB6MoGdIX1WQj(54ftUs|N-KBoYai%Z0lD3qTM@M@P4`wDk4$0RcMi-@gYjpsK2> zAOK_rJ&(te%jI@LGBTMwI5_C-?G47Uu`x&mdZ2Z5bc~FQ zz$ukV1ypx;Hze%r?1brH*rukY=H_OI3YLtF4Ct4Xlyr4pM_Nw6uUF-xVR{_5(v!->#XQ1g{vr41$-5hUExR+$Vs} z=(JkX&y&8XlZZqTxdPQ_&|42B8Lv@$X(JEP)1v)+{1F`tR(FXWPG76HEcY{Ri9B`A zK=n6)by`3P^ff9ccK2kieqk6sZ*pq;pxv#AfU>!JZ}Ij=YRY|j1?EbF{O4MIoK@hs zVx{E-uGWyl;}>(hYOpxG-;uN&UPwTy%J#(8FvHA~q&dzrN*V3rD1uWLfTQK)X|3lu+2OI_bEHqIG3{-(pyuq>blS!iqtwTQ z4PJCR#!ra3E<(%-*-J3bSRQ;&5-~7c!-Yq71Y+`NJ=-k-X^|tr*vFm?aM6R9ZAGZ5w43mA69ivGv=xY}n& z=q2fd_zTb0IuOn+(9JIVX#e>$uJu)8n|?i3@BaM|%I`W=&O3BA`BJA$Os^nu=ZHCt zm_DI3YlZL%WsS*h9?1qN5ApkJOqDn{&~&?&M8-b0JZb$)_>yVV^&&o)yntD8j=pBu zNMHg&58AwRdz2K#^PHWwkL0CvV?6e(k`^U<^st4(hR#1@Y?5W944iZ9&&@x)d+Msb z!pAMo*?AwwR(p{Ra^uaS$OddLr(i3Wf(GV1^5)Z}#yI!G0^j*2=h^Jt-=_zej>~&q zlxRb{UP=5hTAXZMd8lzj;qk7keHED)tYd4o_m;7=*YWO!WP2U%bG|6|L00gr#vISK z45BwAP>h&vd*kx@Ry(c?GH$p2ka;^{mbJYwGVSCoi|lo>BwI_DX2-@vY}ZnL|8EZ1 zOoDkW_sa)IpKBIFvv=w*6N%ndWfiDxC+T4wmx|S>@?JU^*hE@mncRM-*rUl7sC z^5x4NJ9fNy@uIo8SxiiQLUcG<+{_EGTZ{EE5^XJdszkk1f|NiUOuiw9a|M>Ca=g*)2 z|NjSCM+s2;$->CMpv9mAG6du&2DbkWQwuzF#5_-^Tso0s)qCRN3zxM)OHVJ~<~eJY zkLHveAwr9T?qBZMlDm4Bx^UM8$r77+0UYt~1p?Hva`Jo%5=-S&Gs1%lHC5%x(wkab zVv9;yH2V@$QqsFMSthAvPt8}?RAg4nm^*L7hV+EhYt@@`gEi%38~QgMIFO-HK3h3g zWhJv*+QD-h(e>$(#+fterc9# zH=o0=DQX)#)YnJeJhinUe7%@gfoyc@^kb91pXmF0%IvV(*06hXuTB?RC%Uadm}Qgp z_pnVuEK4}#d?L7-4tEGEI|S}9VBF~8H-*EYp<&+X8OHKA&g}f$$TrhBoR8t>k`4wL zhZS*WXKih|z9BLD$Aw*H?F>rK7X6sO(9m)JKr_3!!=4?C9D*&{|9KS-vft&dyOWHq27CCV!6(qQ`$CSN%Iz6E+lAT?tCE$s`y8?y-MipCLKAT-|tn)YnLr8^> zqVj?Xv)HG#K6^fY#!(g~_MSlHKu*pAfkS3JRYFYcoDR#5#y9Kz;&VvB89E=}=yB6k2Z1QKQJF`jL zzqsVWYn3;1j96rfE+n$cReeZ2F5hVK`i)>*!$lwaV?mqV3J01T5*0hp=gqcG$g@Y9 Hg~1vCNyN$s diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360-button-vis-play.png deleted file mode 100755 index a36478d84a3ecb49aea79559e0051b9a42e6d461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1380 zcmZvbdsLEl7{^~x6GZV+=VXl~o#V_#rVg93EU7fL07*sbxG9p&U20aM zbaR%nY0gV!L6%N5JzWe%lMofJc>%#2I(0kl+5dabc`wiN`~JS)&-0%5&0^4f%uP3& zA_!vc=j#;!cjy03v>{wseV94~F%UDTLEdX?YtZ@ML#NY~m6fU0>ZGKk(a}*7i8MVu z9TgQdK0eN3v3h!XXf#?(ObnS!o|&1cuC5*!7|6=XqEIMGrE+3of=DD*R8&k&O^HMz zl}ZKu*49=i!R^zhPav+VtDBsh?C$Q?YPFCuHZ}(S#l^+o-`w0hG&BSN(2+-A8A26Dl9ad8n)fe^L;7>o~-f-~6icszwdv9z=V7yyIA;UErz z_mX;O(05ITZv)TUrl|$eX6%#-YL<~?yh9<`7b<0*A z=py4ulL|D$6pL9UaLkQ@>(^N~Y>GgC@z^xzxJ~IURqyF;OTJUSRvdJsr&6s$F9)Yr zP2tGlvYB3SE&K0)@@z)vPFuUaDkbI)brqY(?CUbkmleLC%e3iXOycTO#3%$oP}6>1 z`-0-b3izCxN{IdQv25pS*tLH9E$mUd~^9Uj~ISt5~#yk3g9wU@XY{ZYRi!57ZPa>SQv z#qNdd*Sjl-*_T|YkqYNX0W0da-ygha4v=h7F~Ssq!Kue^fjRqJNatzC{5jlIWlMWu zaE?EfEs<<-AX4eqLJHQI<)+TA2<#8lESeN`2n8$d3!Ct^w$raNU4&a}=3WhSx=Xq9 zW$CeTm=ZE!H2R0F2}C!G(9J&R+@x!+&qQZlH|cYN@s5K%Ik6LHyhU%e1My&zi{oiS zkMT-I#Ok;C^OR>w?AA7g`FHg-cQ^KZJoS8#we%*?u8~5&r^)#K*}ia3ejcLL9d|4u zn3=uJ$Sb~WmEz$}IEvbkQ9g8%w}xce#2iiH6LPHV@t5P@`98_sXn)-$3*$iv{D%0K zaVzg_1j02n7_dH(^DArK$=p>Co5oe3O>wHLZcb8ViVX>+sgHcAFZvOCcsoblw!6^q zc||Gztic}~nK18_D)Hx$av|x=2eVLN)yhw4P9_Z%(a~fHhDl4DVPicTRSJlq@kl9krJ`8Vis=w^+Lsp? zmj1wbHR?5Gc`rCB? diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css deleted file mode 100755 index 6bef9969..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player-visualization.css +++ /dev/null @@ -1,156 +0,0 @@ -/* larger canvas, spectrum + EQ visualization and other items */ - -.ui360-vis, -.ui360-vis .sm2-360ui, -.sm2-inline-list .ui360-vis { - /* size of the container for the circle, etc. */ - width:256px; - height:256px; -} - -.ui360-vis { - position:relative; - /* a little extra spacing */ - padding-top:1px; - padding-bottom:1px; - margin-bottom:-18px; /* approximate "line height" we want */ - padding-left:248px; - margin-left:0px; - background-position:22.6% 50%; /* (~109px) initial play button position */ -} - -.sm2-inline-list .ui360-vis { - cursor:pointer -} - -.ui360-vis a { - font:14px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; - white-space:nowrap; - text-indent:0px; /* undo inline style */ - top:46%; /* ehh. */ -} - -.sm2-inline-list .ui360-vis a { - line-height:256px; - top:auto; -} - -.ui360-vis .sm2-360ui { - margin-left:-256px; -} - -.ui360-vis .sm2-timing { - font:bold 24px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; - color:#333; - text-align:center; - line-height:256px; - text-indent:0px; -} - -.sm2-inline-list .ui360-vis, -.sm2-inline-list .ui360-vis .sm2-360ui { - margin-left:0px; -} - -.sm2-inline-list .ui360-vis { - margin:8px 13px 7px 0px; - padding-left:0px; - background-position:50% 50%; /* initial play button position */ -} - -.sm2-inline-list .ui360-vis .sm2-360ui { - border:1px solid #eee; - /* offset the border */ - margin-left:-1px; - margin-top:-1px; -} - -.sm2-inline-list .ui360-vis a { - position:absolute; - display:inline; - left:0px; - bottom:0px; - top:1px; - width:100%; /* 2px padding in box */ - height:99%; /* dumb vertical hack */ - *height:256px; /* IE is dumb. */ - overflow:hidden; - font-size:small; - font-weight:300; - color:#333; - margin:0px; - padding:0px; - line-height:488px; /* bottom vertical alignment for text */ - *line-height:480px; /* IE again */ - text-align:center; - border-radius:0px; -} - -.sm2-inline-list .ui360 a:hover { - background-color:transparent; /* reset */ -} - -.sm2-inline-list .ui360-vis:hover .sm2-360ui, -.sm2-inline-list .ui360-vis a.sm2_link:hover, -.sm2-inline-list .ui360-vis a.sm2_link:active, -.sm2-inline-list .ui360-vis a.sm2_link:focus { - background-color:transparent; -} - -.sm2-inline-list .ui360-vis:hover a.sm2_link { - background-color:#fafafa; - *background-color:transparent; /* eh, screw IE. */ -} - -/* Use a bigger loading image for this layout */ - -.ui360-vis .sm2-360btn, -.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn, -.ui360-vis .sm2-360ui.sm2_playing .sm2-360btn { - width:48px; - height:48px; - margin-left:-24px; - margin-top:-24px; - border-radius: none; -} - -.ui360-vis, -.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn, -.ui360-vis .sm2-360btn-default { - background:transparent url(360-button-vis-play.png) no-repeat 50% 50%; - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAABuVBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADv7++lpaXr6+uAgIDk5OQzMzPt7e1tbW3n5+dgYGDW1tZNTU10dHQ5OTnw8PCvr6/e3t6JiYlAQEDb29vo6OgrKyuqqqrq6uq4uLjf399AQEDGxsbq6uqAgIDY2Nje3t61tbXp6enU1NTu7u7r6+vl5eXt7e2fn5/n5+fDw8Ph4eHv7+/t7e3CwsLW1tbu7u7b29vw8PDm5uYgICDp6enY2Nji4uLo6Ojm5uakpKTS0tLPz8/h4eHw8PDs7Ozj4+Pa2trg4ODx8fHT09Pk5OTPz8/S0tLBwcGmpqawsLCOjo7h4eHn5+fo6OgAAADY2NjNzc3n5+cAAADd3d3Gxsbu7u7t7e0AAADX19fl5eXi4uLf39/Hx8fn5+fs7Ozg4ODR0dHX19e4uLjv7+/z8/P09PTy8vL19fXv7+/n5+fx8fH29vbs7Ozq6urm5ubo6Ojw8PDu7u7p6enr6+sAAAB/f3/Z2dn39/fh4eGOjo4ODg7t7e3l5eWWlpba2tqjo6NVVVXk5OTe3t65ubnMzMzExMTf39/GxsampqZiYmJNcTiZAAAAbXRSTlMAAQIEAwcFCAb5EdAImAXpB6oIUAoLCfsgZQ0EVrsGEr4ZYQgbsgpUYxikNd/aatQQli+R7rlUUdas6+8I+VaFruoOOV/S8Nq5sWL8UqmKUFsuHyTcrtsJm0z7C49V3NMKkdKXuk7S7oVeVSv7tAAEVwAAAu5JREFUeF6llmVz3DwURmNLsr1pmJmZmZmxzMwsybS8gXJfhl9cKXbHEK+TmZ4P/nDnOXN1NbalHD8CQ7QRGDmhnIQhBDYQnkhheRECSVIQQrLMHookAciUkHhBw1zVwuLShcJIpPDC0uJC1VxDQTaFx1srSvM3DUxU1TRVlWBjM7+0opUrQaupLSnrLK7ELIepwaCYmbiyuLOspJY38eeLykdGxzDhYQfKCmOjI+VFPkMQYF7NZD0l2DgFJrR+siYPegxBzBvqeoQxpgGw8qOuoTz3HGw9udUPCaFZIORhdS5blZOHjXWDBIdABusanb0S4MpqEw4XcNPqCrQFQQTN+XwPQ8CY5jcDUbB3KLdlg6hnQDZacqEgWA3a2rF6Jri9zWohwI6dXXK2QHZ3OqBw0qC7B6vnAPd0sxZMkHr7VNPD34YZgNrXK3EBSgPU9HJ4eIQDDDogQS4ow4QJxy4+MmKs4oYJZFhhggjQuMoKHoHzn3bsQx1HQOTClOkXLP6lviZTtjCjmn7B5g/izqszliBHTB+HDhl3PSJbwnxSS3n45HDkVLXkvCWg5Uws7eHgJ98/uKqxzLI9w3o6oXuwhd+OPNVEet0WtnU9/sWNJfz1u6cY1/VtLghQuRgk/PmBmT7hogJPXo3L8YQed3Nw8PWfuB89Eb8scUGUrl33DfH/N93BGeH6NUnkArh1O5FOuNETp2GR27cAE/iaJu6mz8HdCQnan+i96XQmdgaZ9PQ9+xMVoPJgNhrNhBKNzj5Q+E/AavH4SSz6OZRo7Mlj3oDDp7jyPJoKJfr8CpvAOUrQi6eppJaVZOrpCwTdP1cgr93UjKxoN9dka2KX8ealZtBADO3lG2+e7xRAd7Y0igOg2tYdBKD/CBIBenf/lYGJD2y8uv8OgaBDDkry3v57SlQXhL7f35OlwJOXGUBBl571JykmzCIE02T/s0tIASyf/R6Arr59fcM62G+8fnsVhdwFwq4Ov345Of/15wd0RYY81HHUTQAAAABJRU5ErkJggg==); - *background-image:url(360-button-vis-play.png); - _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; - cursor:pointer; -} - -.ui360-vis:hover .sm2-360btn, -.ui360-vis .sm2-360btn-default:hover, -.ui360-vis .sm2-360ui.sm2_paused .sm2-360btn:hover { - background:transparent url(360-button-vis-play-light.png) no-repeat 50% 50%; - _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; - cursor:pointer; -} - - -.ui360-vis .sm2-360ui.sm2_playing .sm2-360btn:hover, -.ui360-vis .sm2-360btn-playing:hover { - background:transparent url(360-button-vis-pause-light.png) no-repeat 50% 50%; - _background:transparent url(360-button-vis-pause-light.gif) no-repeat 50% 50%; - cursor:pointer; -} - -.ui360-vis { - /* non-JS / before-loaded state */ - background-position: 21% 50%; - _background:transparent url(360-button-vis-play.gif) no-repeat 21% 50%; /* IE 6-only: special crap GIF */ -} - -.ui360-vis .sm2-360btn-default { - /* real button, post-loaded state */ - _background:transparent url(360-button-vis-play.gif) no-repeat 50% 50%; /* IE 6-only: special crap GIF */ -} - -.ui360-vis .sm2-360ui.sm2_dragging .sm2-360btn { - visibility: hidden; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css deleted file mode 100755 index b74df11c..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/360player.css +++ /dev/null @@ -1,271 +0,0 @@ -/* General warning: Beta-ish. Code could be a bit cleaner. */ - -.ui360, /* entire UI */ -.sm2-360ui { /* canvas container */ - position:relative; -} - -.ui360, -.sm2-360ui { - min-width:50px; /* should always be at least this. */ - min-height:50px; -} - -.sm2-360ui { - width:50px; - height:50px; -} - -.ui360, -.ui360 * { - vertical-align:middle; -} - -.sm2-360ui { - position:relative; - display:inline-block; /* firefox 3 et al */ - float:left; /* IE 6+7, firefox 2 needs this, inline-block would work with fx3 and others */ - *display:inline; -/* - clear:left; -*/ -} - -.sm2-360ui.sm2_playing, -.sm2-360ui.sm2_paused { - /* bump on top when active */ - z-index:10; -} - -.ui360 a { /* .sm2_link class added to playable links by SM2 */ - float:left; - display:inline; - position:relative; - color:#000; - text-decoration:none; - left:3px; /* slight spacing on left UI */ - top:18px; /* vertical align */ - text-indent:50px; /* make room for UI at left */ -} - -.ui360 a.sm2_link { /* SM2 has now started */ - text-indent:0px; /* UI now in place. */ -} - -.ui360 a, -.ui360 a:hover, -.ui360 a:focus { - padding:2px; - margin-left:-2px; - margin-top:-2px; -} - -.ui360 a:hover, -.ui360 a:focus { - background:#eee; - border-radius:3px; - outline:none; -} - -.ui360 .sm2-canvas { - position:absolute; - left:0px; - top:0px; -} - -.ui360 .sm2-timing { - position:absolute; - display:block; - left:0px; - top:0px; - width:100%; - height:100%; - margin:0px; - font:11px "helvetica neue",helvetica,monaco,lucida,terminal,monospace; - color:#666; - text-align:center; - line-height:50px; -} - -.ui360 .sm2-timing.alignTweak { - text-indent:1px; /* devious center-alignment tweak for Safari (might break things for others.) */ -} - -.ui360 .sm2-cover { - position:absolute; - left:0px; - top:0px; - width:100%; - height:100%; - z-index:2; - display:none; - background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==); /* old-skool bug: IE 9 won't catch mouse events otherwise. /smash */ -} - -.ui360 .sm2-360btn { - position:absolute; - display:block; - top:50%; - left:50%; -/* - width:22px; - height:22px; - margin-left:-11px; - margin-top:-11px; -*/ - /* by default, cover whole space. make smaller when playing. */ - width:50px; - height:50px; - margin-left:-25px; - margin-top:-25px; - border-radius: 25px; - cursor:pointer; - z-index:3; -} - -.ui360 .sm2-360data { - display:inline-block; - font-family:helvetica; -} - -.sm2-inline-block .ui360 .sm2-360btn, -.ui360 .sm2-360ui.sm2_playing .sm2-360btn, -.ui360 .sm2-360ui.sm2_paused .sm2-360btn { - /* smaller clickable button, in center */ - width:22px; - height:22px; - margin-left:-11px; - margin-top:-11px; -} - -.ui360 .sm2-360ui.sm2_playing .sm2-cover, -.ui360 .sm2-360ui.sm2_paused .sm2-cover { - display:block; -} - -/* this could be optimized a fair bit. */ - -.ui360, -.ui360 .sm2-360btn-default, -.ui360 .sm2-360ui.sm2_paused .sm2-360btn { - background:transparent url(360-button-play.png) no-reoeat; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAABoUlEQVR42sWVu2oCQRhGU/s8gpVYJeQJNkZSbiH4QNuLlQZS21sJayGYaOEFVFDxNiremj9zig2uzk5YQpKFg8PMd75ZZle9E5Ff4e+Ll8tlQuNoPI2vUcCYOdbIxCmm9F5T0YgNMmS/LebSwWdNa7VayXq9ls1mI9vtVna7nQBj5lgjQxYHN7KY3QkiUbDf7+V4PMrpdArBHGtkyOJc3/n1mVaUUl+F5/PZSrABDi4dpmKH3QkixQEHlw5TsccZmsRCoSD1et1ajkuHqdg/HA5GKZPJCOTzeanVasYMLh2mYsXDIGAoDuG6rlSr1WCdBxrcsTIWazgrQiHS6bSRYJ3XDzeq2O/3+9Ltdm9IpVIhstmslEqlUAY36ii8ZrMpjUbjhmQyKeA4jhSLRWMGN+rhOZ1Oh8ANuVxOyuUy40hwo163RK/XeyPQbrdjgYNr/ILAYDB41Gf1wZnFAQfX+iM0HA5fxuPx+2g0Ej22QoYsDq61mGsymTxMp9NX/Sk2yJDFsRZfXpzXbDZ7WiwW3nw+9zUKGDPHGpkL5V//mn7OJyJZApyzeUS5AAAAAElFTkSuQmCC); - *background-image: url(360-button-play.png); - background-repeat: no-repeat; -} - -.ui360 { - /* - "fake" button shown before SM2 has started, non-JS/non-SM2 case etc. - background image will be removed via JS, in threeSixyPlayer.init() - */ - background-position: 14px 50%; - _background:transparent url(360-button-play.gif) no-repeat 14px 50%; /* IE 6-only: special crap GIF */ -} - -.ui360 .sm2-360btn-default, -.ui360 .sm2-360ui.sm2_paused .sm2-360btn { - background-position:50% 50%; - _background:transparent url(360-button-play.gif) no-repeat 50% 50%; /* IE 6-only: special crap GIF */ -} - -.ui360 .sm2-360btn-default, -.ui360 .sm2-360ui.sm2_paused .sm2-360btn { - cursor:pointer; -} - -.ui360 .sm2-360btn-default:hover, -.ui360 .sm2-360ui.sm2_paused .sm2-360btn:hover { - background:transparent url(360-button-play-light.png) no-repeat 50% 50%; - _background:transparent url(360-button-play.gif) no-repeat 50% 50%; - cursor:pointer; -} - -.ui360 .sm2-360ui.sm2_playing .sm2-360btn:hover, -.ui360 .sm2-360btn-playing:hover { - background:transparent url(360-button-pause-light.png) no-repeat 50% 50%; - _background:transparent url(360-button-pause-light.gif) no-repeat 50% 50%; - cursor:pointer; -} - -.ui360 .sm2-360ui.sm2_playing .sm2-timing { - visibility:visible; -} - -.ui360 .sm2-360ui.sm2_buffering .sm2-timing { - visibility:hidden; -} - -.ui360 .sm2-360ui .sm2-timing, -.ui360 .sm2-360ui .sm2-360btn:hover + .sm2-timing, -.ui360 .sm2-360ui.sm2_paused .sm2-timing { - visibility:hidden; -} - -.ui360 .sm2-360ui.sm2_dragging .sm2-timing, -.ui360 .sm2-360ui.sm2_dragging .sm2-360btn:hover + .sm2-timing { - /* paused + dragging */ - visibility:visible; -} - -.ui360 .sm2-360ui.sm2_playing .sm2-360btn, -.ui360 .sm2-360ui.sm2_dragging .sm2-360btn, -.ui360 .sm2-360ui.sm2_dragging .sm2-360btn:hover, -.ui360 .sm2-360ui.sm2_dragging .sm2-360btn-playing:hover { - /* don't let pause button show on hover when dragging (or paused and dragging) */ - background:transparent; - cursor:auto; -} - -.ui360 .sm2-360ui.sm2_buffering .sm2-360btn, -.ui360 .sm2-360ui.sm2_buffering .sm2-360btn:hover { - background:transparent url(icon_loading_spinner.gif) no-repeat 50% 50%; - opacity:0.5; - visibility:visible; -} - -/* inline list style */ - -.sm2-inline-list .ui360, -.sm2-inline-block .ui360 { - position:relative; - display:inline-block; - float:left; - _display:inline; - margin-bottom:-15px; -} - -.sm2-inline-list .ui360 { - /* inline player: minor tweak, tighten spacing */ - margin-right:-2px; -} - -.sm2-inline-block .ui360 { - margin-right:8px; -} - -.sm2-inline-list .ui360 a { - display:none; -} - -/* annotations */ - -ul.ui360playlist { - list-style-type:none; -} - -ul.ui360playlist, -ul.ui360playlist li { - margin:0px; - padding:0px; -} - -div.ui360 div.metadata { - display:none; -} - -div.ui360 a span.metadata, -div.ui360 a span.metadata * { - /* name of track, note etc. */ - vertical-align:baseline; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html deleted file mode 100755 index 352856b4..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization-basic.html +++ /dev/null @@ -1,132 +0,0 @@ - - - -360° MP3 player UI demo (SoundManager 2): Javascript + Canvas Visualization, basic example - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    360° Player Demo - Visualization Example, Basic Template

    - -

    Canvas-based UI with visualization options. Note: No EQ/spectrum support for IE < 9 (too slow.) Data not implemented in HTML5.

    - -
    - -
    - -
    - - - -

    Inline list

    - -
    - - - - - - -
    - -

    Block list

    - - - -
    - -

    - SoundManager 2 project page (not an MP3 link) -

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html deleted file mode 100755 index 1f3d6e2c..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/canvas-visualization.html +++ /dev/null @@ -1,359 +0,0 @@ - - - -360° MP3 player UI demo (SoundManager 2): Javascript + Canvas Visualization - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    SoundManager 2 / 360° Player Demo: JS + Canvas Visualization

    - -

    Canvas-based UI with visualization options. Note: Spectrum/EQ visualizations disabled for IE < 9 (too slow.) Data is not implemented under HTML5.

    -

    You can also show FPS or customize the UI, or see the hi-fi version. Check the basic template for a minimal code example; also see the default 360° UI.

    - - - - - - - -
    - -
    - -

    Inline list

    - - - -

    Artist thank-yous: "Graffiti Sex" courtesy of The Fugitives. "Blue Belle Lament" courtesy of Adrian Glynn. "I Tried" and "People Asking" courtesy of SonReal.

    - -

    Block list

    - - - -

    56K Modem sound (Creative Commons license) via dialup.mp3, from freesound.org user Jlew.

    - - -

    Variant: Annotations/meta-data

    - - -
      - -
    • - -
      - A Virtual Haircut (3 scenes) - -
      - -
    • - -
    • - -
      - Rubber Chicken Launch (Office) - - - - -
      - -
    • - -
    - -
    - -

    - SoundManager 2 project page (not an MP3 link) -

    - - - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css deleted file mode 100755 index 27281c0b..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.css +++ /dev/null @@ -1,179 +0,0 @@ -#cp-container { position:relative;float:left;display:inline; margin-left:1em;padding: 6px; background-color: #f6f6f6; border:1px solid #eee; width: 320px; height:180px;z-index:2; } - -.yui-picker-controls li, -.yui-picker-controls input { - font-size:1em; - font-family:"helvetica neue",helvetica,arial,verdana; -} - -#controls { - position:relative; - margin-top:1.5em; - font-size:0.85em; -} - -#options { - float:left; - display:inline; - margin-bottom:0.5em; - margin-top:-1.2em; -} - -#controls .checkbox { - float:left; - display:inline; - width:21.2em; - margin-right:2.5em; -} - -#controls .checkbox div { - /* tab */ - width:auto; - padding:0.4em; - border:1px solid #ddd; - border-bottom:none; - background:#eee; -} - -#controls .checkbox div, -#controls .checkbox input { - font-family:arial,tahoma,verdana,"sans serif"; - font-size:1em; - vertical-align:middle; -} - -#controls dl { - width:21em; -} - -#controls dl.col { - position:relative; - float:left; - display:inline; - margin:0px; - margin-right:1em; - padding:0.75em; -/* - height:12.4em; -*/ - height:auto; - border:1px solid #ddd; - background:#f6f6f6; -} - -#controls .disabled { - color:#ccc; -} - -#controls .disabled dt, -#controls .disabled dd { - color:#999; - opacity:0.5; -} - -#controls dl dd p { - margin:0px; - padding:0px; -} - -#controls dt, -#controls dd { - margin:0px; - padding:0px; -} - -#controls dt { - border-bottom:none; -} - -#controls dt { - float:left; - display:inline; - background:transparent; - padding-right:0.7em; - margin-right:0.7em; - border-right:1px solid #ccc; - font-size:1.1em; - color:#333; - font-family:"helvetica neue",helvetica,verdana,arial,"sans serif"; -} - -#controls dd { - margin:0px; - padding:0px; - font-size:0.9em; - vertical-align:middle; - color:#666; -} - -#controls .title { - float:left; - display:inline; - margin-right:0.6em; - color:#333; -} - -/* those slider bits you might be wondering about */ - -#controls .control { - position:relative; - border-left:0px; - width:214px; - height:20px; -} - -#controls .control .bar { - position:absolute; - left:0px; - top:0px; - width:214px; - height:20px; - background:transparent url(../_image/slider-bar.gif) no-repeat 0px 9px; - cursor:pointer; - cursor:hand; -} - -#controls .control .slider { - position:absolute; - left:0px; - top:0px; - width:20px; - height:20px; - background:transparent url(../_image/slider.png) no-repeat 0px 0px; - *background:none; - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider.png'); - cursor:pointer; - cursor:hand; -} - -#controls .control .slider:hover { - background:transparent url(../_image/slider-1.png) no-repeat 0px 0px; - *background:none; -} - -#controls .control .slider.hover { - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-1.png'); -} - -#controls .disabled .control .slider { - background:transparent url(../_image/slider-disabled.png) no-repeat 0px 0px; - *background:none; - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-disabled.png'); -} - -#controls .disabled .control .slider:hover { - background:transparent url(../_image/slider-disabled-1.png) no-repeat 0px 0px; - *background:none; -} - -#controls .disabled .control .slider.hover { - filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=true,sizingMethod=crop,src='../_image/slider-disabled-1.png'); -} - -#controls input[type=text] { - width:5em; -} - -#options div { - margin-bottom:0.25em; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js deleted file mode 100755 index 379cd33d..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/demo-slider-controls.js +++ /dev/null @@ -1,750 +0,0 @@ -/* - Ancient fireworks slider control code (2005) - Kinda/sorta refactored for SM2 360 demo - http://schillmania.com/projects/fireworks/ - -------------------------------------------- - Not required for your use! -*/ - -function Animator2() { - var self = this; - this.tweens = []; - this.tweens['default'] = [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]; - this.tweens['blast'] = [12,12,11,10,10,9,8,7,6,5,4,3,2,1]; - this.tweens['fade'] = [10,10,10,10,10,10,10,10,10,10]; - this.queue = []; - this.queue.IDs = []; - this.active = false; - this.timer = null; - - this.createTween = function(start,end,type) { - // return array of tween coordinate data (start->end) - type = type||'default'; - var tween = [start]; - var tmp = start; - var diff = end-start; - var x = self.tweens[type].length; - for (var i=0; i= 0.4 && pos <= 0.6) { - pos = 0.5; - } - pos = parseInt(pos*100); - // writeDebug('getPanX('+x+'): '+pos+'%'); - return pos; - } - - this.isEmpty = function(o) { - // needs further hacking - return (typeof(o)=='undefined'||(o==null&&o!=0)||(o==''&&o!=0)||o=='null'); - } - - this.init = function() { -// self.oFW = document.getElementById('fw'); -// self.oFP = document.getElementById('fp'); -// if (typeof(enableDebugMode)!='undefined' && (self.DEBUG||window.location.toString().toLowerCase().indexOf('debug')>=0)) enableDebugMode(); - self.getWindowCoords(); - self.animator = new Animator2(); - } - - this.destructor = function() { -/* - for (var i=self.fireworks.length; i--;) { - self.fireworks[i] = null; - } - self.fireworks = null; - if (soundManager) { - soundManager.destructor(); - soundManager = null; - } -*/ - } - - if (this.isSafari || this.isOpera) this.getWindowCoords = this.getWindowCoordsAlt; - -} - - -function Controller(o) { - var self = this; - this.o = o; - this.controls = []; - this.cb = []; - this.options = []; - this.functionExample = document.getElementById('function-example'); - this.fbIE = null; - - this.randomize = function() { - for (var i=1; i,\n\ - autoPlay: "+threeSixtyPlayer.config.autoPlay+",\n\ - allowMultiple: "+threeSixtyPlayer.config.allowMultiple+",\n\ - loadRingColor: '"+threeSixtyPlayer.config.loadRingColor+"',\n\ - playRingColor: '"+threeSixtyPlayer.config.playRingColor+"',\n\ - backgroundRingColor: '"+threeSixtyPlayer.config.backgroundRingColor+"',\n\ - circleDiameter: "+threeSixtyPlayer.config.circleDiameter+",\n\ - circleRadius: "+threeSixtyPlayer.config.circleRadius+",\n\ - animDuration: "+threeSixtyPlayer.config.animDuration+",\n\ - animTransition: Animator.tx.bouncy,\n\ - showHMSTime: "+threeSixtyPlayer.config.showHMSTime+",\n\ -\n\ - useWaveformData: "+threeSixtyPlayer.config.useWaveformData+",\n\ - waveformDataColor: '"+threeSixtyPlayer.config.waveformDataColor+"',\n\ - waveformDataDownsample: "+threeSixtyPlayer.config.waveformDataDownsample+",\n\ - waveformDataOutside: "+threeSixtyPlayer.config.waveformDataOutside+",\n\ - waveformDataConstrain: false,\n\ - waveformDataLineRatio: "+threeSixtyPlayer.config.waveformDataLineRatio+",\n\ -\n\ - useEQData: "+threeSixtyPlayer.config.useEQData+",\n\ - eqDataColor: '"+threeSixtyPlayer.config.eqDataColor+"',\n\ - eqDataDownsample: "+threeSixtyPlayer.config.eqDataDownsample+",\n\ - eqDataOutside: "+threeSixtyPlayer.config.eqDataOutside+",\n\ - eqDataLineRatio: "+threeSixtyPlayer.config.eqDataLineRatio+",\n\ -\n\ - usePeakData: "+threeSixtyPlayer.config.usePeakData+",\n\ - peakDataColor: '"+threeSixtyPlayer.config.peakDataColor+"',\n\ - peakDataOutside: "+threeSixtyPlayer.config.peakDataOutside+",\n\ - peakDataLineRatio: "+threeSixtyPlayer.config.peakDataLineRatio+",\n\ -\n\ - useAmplifier: "+threeSixtyPlayer.config.useAmplifier+"\n\ -\n\ -}"; -document.getElementById('config-code').style.display = 'block'; // weird Fx fix - } - - this.createCustomFirework = function() { - } - - this.destructor = function() { - for (var i=self.controls.length; i--;) { - self.controls[i].destructor(); - } - for (i=self.cb.length; i--;) { - self.cb.onclick = null; - self.cb[i] = null; - } - for (i=self.options.length; i--;) { - self.options[i] = null; - } - if (navigator.userAgent.match(/msie/i)) { - self.fbIE.onmouseover = null; - self.fbIE.onmouseout = null; - self.fbIE = null; - } - self.cb = null; - self.options = null; - self.controls = null; - self.functionExample = null; - self.o = null; - } - - var items = parseInt(this.o.length/3); - for (var i=0; iself.xMax) { - x = self.xMax; - } else if (x=self.tween.length-1) { - self.active = false; - self.frame = 0; - if (self._oncomplete) self._oncomplete(); -// self.doUpdate(); - return false; - } - self.doUpdate(); - return true; - } - - this.doUpdate = function(t) { - // if (!self.timer) self.timer = setTimeout(self.update,t||20); - self.update(); - } - - this.update = function() { - self.timer = null; - self.value = 1+parseInt(self.x/self.xMax*(self.scale-1)); - if (self.value<1) self.value = 1; - // if (self.oV.innerHTML != self.value) self.oV.innerHTML = self.value; - // self.oV.innerHTML = self.value; - } - - this.setValue = function(x) { - self.slide(self.x,Math.min(self.xMax,x)); - } - - this.randomize = function() { - self.slide(self.x,parseInt(Math.random()*self.xMax)); - } - - this.destructor = function() { - self.o.onmouseover = null; - self.o.onmouseout = null; - self.o.onmousedown = null; - self.o = null; - self.oV = null; - self.oB.onclick = null; - self.oB = null; - } - - if (soundManager.isIE) { - // IE is lame, no :hover - this.o.onmouseover = this.over; - this.o.onmouseout = this.out; - } - - this.o.onmousedown = this.down; - this.oB.onclick = this.barClick; - self.update(); - -} - -var gOID = 0; - -function demoInit() { - controller = new Controller(document.getElementById('controls').getElementsByTagName('dd')); -} - -function demoDestuctor() { - controller.destructor(); - controller = null; -} - -var controller = null; - -var mc = new MainController(); -// create null objects if APIs not present - -function createCP(oInput,oHandler) { - var Event = YAHOO.util.Event; - - cpHandler = oHandler; - if (picker != null) { - // picker.showcontrols(true); - var c = oInput.value.substr(1); - picker.setValue(hex2decArray([c.substr(0,2),c.substr(2,2),c.substr(4,2)]),true); // be silent - return false; - } - - Event.onDOMReady(function() { - picker = new YAHOO.widget.ColorPicker("cp-container", { - showhsvcontrols: true, - showhexcontrols: true, - images: { - PICKER_THUMB: "../_image/picker_thumb.png", - HUE_THUMB: "../_image/hue_thumb.png" - } - }); - -// picker.showcontrols(false); - //a listener for logging RGB color changes; - //this will only be visible if logger is enabled: - var onRgbChange = function(o) { - /*o is an object - { newValue: (array of R, G, B values), - prevValue: (array of R, G, B values), - type: "rgbChange" - } - */ - cpHandler(o.newValue); - controller.updateExampleCode(); - } - - //subscribe to the rgbChange event; - picker.on("rgbChange", onRgbChange); - - //use setValue to reset the value to white: - Event.on("reset", "click", function(e) { - picker.setValue([255, 255, 255], false); //false here means that rgbChange - //wil fire; true would silence it - }); - - //use the "get" method to get the current value - //of one of the Color Picker's properties; in - //this case, we'll get the hex value and write it - //to the log: - Event.on("gethex", "click", function(e) { - console.log("Current hex value: " + picker.get("hex")); - }); - - }); -} - -var picker = null; - -cpHandler = function() { -} - - - // hex -> dec / dec -> hex - // http://www.southwest.com.au/~jfuller/binary/converter.htm - - function dec2hex(cval) { - if (cval > 255) cval = 255; - var hexascii = "0123456789ABCDEF"; - var cval0 = Math.floor(cval/16); - var cval1 = cval-(cval0*16); - var c1 = hexascii.charAt(cval0); - var c2 = hexascii.charAt(cval1); - return (c1+c2); - } - - function hex2dec(cval) { - cval = cval.toUpperCase(); - var tval = 0; - var hexascii = "0123456789ABCDEF"; - var mychar, ch; - for (var c=0; cC&CvKvux~M zp|?;#Xo0OM<<;gw5D^$J%R~%F5Xl0S5L6_D5Q58G7D5OTBHoLen)%i94?O32e&-~o zXymasJb(u{fPg+ao$mPfxT2y$B9ROX4D9XgaX6euj~*Q!9zK5j_~FBcQmORWvuEAi z-4sPFEG*2<&aSMiXtmlWPoCVqeLFute{*xw*VnhCq-1Sv4af1Cni`A6qSx#9_xF2y zdkYH-^YZd0CML48vqwiqZ8lqAV4%a{uv)Eib91}9yZ-+E)6>(>pFdYBm4kzW(b3W6 z<>g~zW2L2~Wo2b)X=w)s2S-Oo!^6WH8yoTQ@fwXLJw06}lPxVRH8(da6pDt12D{x( zlH}8;PlZC^{QSIHt&WL_DK0KvUtj0(ctb-&J3Bj0r?axMa(jC_H8oW(mj?$2cXoE> z=H~YI_lra#48v~Sx}{R7R##WIwzjgevfSL<78e)AVsS`F$jQkG6YKvzK_`Orq^!)u z1YMFWGK$R%67)NV&jS!h85T1Wa4oBXIKfMaLkT041h_#C0135tvI1x?v;j|?Yg9LB z!X)wUU4(q31NT4oMryc)Uz-%`ZmE?ghE7_PO`<7?kzF8c=3D5lI{W&}va@e$)W}6v zjr{|}FBrD5jFLYr-+ciW11WQpGXMdATc9-Ss4s6u&TL0nOKYqy*d&`oZo;b z7c+13nl8r1?c&ehOEqVl=a&Tf3OqlH%JE_GQt=cNBN8#R+MqI;8b9S5npIrHlEO#0 ziMINh7DFwb@Q*G-L>Qv$`?M}jUz{L~N&rL<4Y){hakVL|I1|L><6MM)D&g&F5))m< z3)xbi0^>+hY~;uU(+I^TaE>WqY8om`o^v>zrTP1j0jIgsiCBmqA@;R>?yHHHrgUaV zw?=5!zqka75(b=0U>J;)=&lenj0}Af$PBGydX7GV?1AAf?!7(!K7OyE^?gAAu)pYo z>=EyA+$$iE8W+D6YU?>$0&-o9EhJ|I_?heKMY-UHptl;2lKl+-!)1I+nR)-_615F9 zlU}kBZ#G-3wsw+E0nvIJ)1tRsO@-M{_3aW}zTv*X<9gBcNyu%2jC-CdC2qhuR6;>v zT6Tt6L3zT0%i&h$X_#L@zZiGAs>0VOY=kqqU_VK9O)|?*8*jhbU(x^D$4yO+9KF{^ z-xb}I)O2rnj92~25ydwQwrbHK_=hJ`fDZExM5I6{2)e@#e>+;DijoN+`;K=J9m8Gw zuW`X?WJdM_Mi!#zCnOX3Rau<2FtndO@OBJUI6V7M=JGv+hwjRQ^GFFo&u0TF#K(jsG crTC^`aPD(cM;9w1IwI2CV)%(NQg=bzpXOJ!4FCWD diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/icon_loading_spinner.gif deleted file mode 100755 index 8449353f08e515913a7412ec02a79e5de984a35d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html deleted file mode 100755 index 9453eb92..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/index.html +++ /dev/null @@ -1,173 +0,0 @@ - - - -360° MP3 player UI demo (SoundManager 2) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    SoundManager 2 / 360° Player: JavaScript + Canvas UI

    - -

    Canvas-based UI. Load progress, seek, play/pause etc. Also see 360° UI visualization demo.

    - -
    - -
    - -
    - - - - -
    - -

    Alternate style: inline

    - - - -
    - -
    - -
    - - -

    How This Works

    - -

    The script looks for a container element matching div.ui360, and then the first link inside of it.

    - -
    - -
    <div class="ui360">
    - <a href="/path/to/an.mp3">play "an.mp3"</a>
    -</div>
    - -
    - -

    When the 360 player script loads, it adds a UI template to the block, prepending it in front of the MP3 link:

    - -
    <div class="ui360">
    - <-- dynamically-inserted block -->
    - <div class="ui">
    -  <canvas class="sm2-canvas"></canvas>
    -  <span class="sm2-360btn"></span> 
    -  <div class="sm2-timing"></div>
    -  <div class="sm2-cover"></div>
    - </div>
    - <-- /UI -->
    - <a href="/path/to/an.mp3">
    -</div>
    - -

    Customizing the UI

    - -

    The player's default 50x50-pixel canvas is defined both within JavaScript and CSS. For an example with different values, see this larger version.

    - -
    threeSixtyPlayer.config = {
    -  playNext: false, // stop after one sound, or play through list until end
    -  autoPlay: false, // start playing the first sound right away
    -  allowMultiple: true, // let many sounds play at once (false = one at a time)
    -  loadRingColor: '#ccc', // amount of sound which has loaded
    -  playRingColor: '#000', // amount of sound which has played
    -  backgroundRingColor: '#eee', // "default" color shown underneath everything else
    -  animDuration: 500,
    -  animTransition: Animator.tx.bouncy // http://www.berniecode.com/writing/animator.html
    -}
    - -

    The CSS for the canvas UI block is a bit ugly, but JavaScript reads the width of the .sm2-360ui element in the DOM as set by CSS and uses that to later draw and update the canvas element while playing.

    - -
    .ui360,
    -.sm2-360ui {
    -  /* size of the container for the circle, etc. */
    -  width:50px;
    -  height:50px;
    -}
    -
    - -

    Third-party Components

    - -

    This demo includes use of Bernie's Better Animation Class (Apache licensed) for some animation effects.

    -

    Also, some loader/spinner icons from ajaxload.info are used for showing loading/buffering states.

    - -
    - -

    - SoundManager 2 project page (not an MP3 link) -

    - - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js deleted file mode 100755 index c869d1a1..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/360player.js +++ /dev/null @@ -1,1410 +0,0 @@ -/** - * - * SoundManager 2 Demo: 360-degree / "donut player" - * ------------------------------------------------ - * http://schillmania.com/projects/soundmanager2/ - * - * An inline player with a circular UI. - * Based on the original SM2 inline player. - * Inspired by Apple's preview feature in the - * iTunes music store (iPhone), among others. - * - * Requires SoundManager 2 Javascript API. - * Also uses Bernie's Better Animation Class (BSD): - * http://www.berniecode.com/writing/animator.html - * -*/ - -/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: false, newcap: true, immed: true */ -/*global document, window, soundManager, navigator */ - -var threeSixtyPlayer, // instance - ThreeSixtyPlayer; // constructor - -(function(window) { - -function ThreeSixtyPlayer() { - - var self = this, - pl = this, - sm = soundManager, // soundManager instance - uA = navigator.userAgent, - isIE = (uA.match(/msie/i)), - isOpera = (uA.match(/opera/i)), - isSafari = (uA.match(/safari/i)), - isChrome = (uA.match(/chrome/i)), - isFirefox = (uA.match(/firefox/i)), - isTouchDevice = (uA.match(/ipad|iphone/i)), - hasRealCanvas = (typeof window.G_vmlCanvasManager === 'undefined' && typeof document.createElement('canvas').getContext('2d') !== 'undefined'), - // I dunno what Opera doesn't like about this. I'm probably doing it wrong. - fullCircle = (isOpera||isChrome?359.9:360); - - // CSS class for ignoring MP3 links - this.excludeClass = 'threesixty-exclude'; - this.links = []; - this.sounds = []; - this.soundsByURL = []; - this.indexByURL = []; - this.lastSound = null; - this.lastTouchedSound = null; - this.soundCount = 0; - this.oUITemplate = null; - this.oUIImageMap = null; - this.vuMeter = null; - this.callbackCount = 0; - this.peakDataHistory = []; - - // 360player configuration options - this.config = { - - playNext: false, // stop after one sound, or play through list until end - autoPlay: false, // start playing the first sound right away - allowMultiple: false, // let many sounds play at once (false = only one sound playing at a time) - loadRingColor: '#ccc', // how much has loaded - playRingColor: '#000', // how much has played - backgroundRingColor: '#eee', // color shown underneath load + play ("not yet loaded" color) - - // optional segment/annotation (metadata) stuff.. - segmentRingColor: 'rgba(255,255,255,0.33)', // metadata/annotation (segment) colors - segmentRingColorAlt: 'rgba(0,0,0,0.1)', - loadRingColorMetadata: '#ddd', // "annotations" load color - playRingColorMetadata: 'rgba(128,192,256,0.9)', // how much has played when metadata is present - - circleDiameter: null, // set dynamically according to values from CSS - circleRadius: null, - animDuration: 500, - animTransition: window.Animator.tx.bouncy, // http://www.berniecode.com/writing/animator.html - showHMSTime: false, // hours:minutes:seconds vs. seconds-only - scaleFont: true, // also set the font size (if possible) while animating the circle - - // optional: spectrum or EQ graph in canvas (not supported in IE <9, too slow via ExCanvas) - useWaveformData: false, - waveformDataColor: '#0099ff', - waveformDataDownsample: 3, // use only one in X (of a set of 256 values) - 1 means all 256 - waveformDataOutside: false, - waveformDataConstrain: false, // if true, +ve values only - keep within inside circle - waveformDataLineRatio: 0.64, - - // "spectrum frequency" option - useEQData: false, - eqDataColor: '#339933', - eqDataDownsample: 4, // use only one in X (of 256 values) - eqDataOutside: true, - eqDataLineRatio: 0.54, - - // enable "amplifier" (canvas pulses like a speaker) effect - usePeakData: true, - peakDataColor: '#ff33ff', - peakDataOutside: true, - peakDataLineRatio: 0.5, - - useAmplifier: true, // "pulse" like a speaker - - fontSizeMax: null, // set according to CSS - - scaleArcWidth: 1, // thickness factor of playback progress ring - - useFavIcon: false // Experimental (also requires usePeakData: true).. Try to draw a "VU Meter" in the favicon area, if browser supports it (Firefox + Opera as of 2009) - - }; - - this.css = { - - // CSS class names appended to link during various states - sDefault: 'sm2_link', // default state - sBuffering: 'sm2_buffering', - sPlaying: 'sm2_playing', - sPaused: 'sm2_paused' - - }; - - this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.addEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - o.attachEvent('on'+evtName,evtHandler); - }); - - this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.removeEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - return o.detachEvent('on'+evtName,evtHandler); - }); - - this.hasClass = function(o,cStr) { - return typeof(o.className)!=='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false; - }; - - this.addClass = function(o,cStr) { - - if (!o || !cStr || self.hasClass(o,cStr)) { - return false; - } - o.className = (o.className?o.className+' ':'')+cStr; - - }; - - this.removeClass = function(o,cStr) { - - if (!o || !cStr || !self.hasClass(o,cStr)) { - return false; - } - o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); - - }; - - this.getElementsByClassName = function(className,tagNames,oParent) { - - var doc = (oParent||document), - matches = [], i,j, nodes = []; - if (typeof tagNames !== 'undefined' && typeof tagNames !== 'string') { - for (i=tagNames.length; i--;) { - if (!nodes || !nodes[tagNames[i]]) { - nodes[tagNames[i]] = doc.getElementsByTagName(tagNames[i]); - } - } - } else if (tagNames) { - nodes = doc.getElementsByTagName(tagNames); - } else { - nodes = doc.all||doc.getElementsByTagName('*'); - } - if (typeof(tagNames)!=='string') { - for (i=tagNames.length; i--;) { - for (j=nodes[tagNames[i]].length; j--;) { - if (self.hasClass(nodes[tagNames[i]][j],className)) { - matches.push(nodes[tagNames[i]][j]); - } - } - } - } else { - for (i=0; i 1) { - // only catch left-clicks - return true; - } - - var o = self.getTheDamnLink(e), - canvasElements, sURL, soundURL, thisSound, oContainer, has_vis, diameter; - - if (o.nodeName.toLowerCase() !== 'a') { - o = self.isChildOfNode(o,'a'); - if (!o) { - return true; - } - } - - if (!self.isChildOfClass(o,'ui360')) { - // not a link we're interested in - return true; - } - - sURL = o.getAttribute('href'); - - if (!o.href || !sm.canPlayLink(o) || self.hasClass(o,self.excludeClass)) { - return true; // pass-thru for non-MP3/non-links - } - - sm._writeDebug('handleClick()'); - soundURL = (o.href); - thisSound = self.getSoundByURL(soundURL); - - if (thisSound) { - - // already exists - if (thisSound === self.lastSound) { - // and was playing (or paused) - thisSound.togglePause(); - } else { - // different sound - thisSound.togglePause(); // start playing current - sm._writeDebug('sound different than last sound: '+self.lastSound.id); - if (!self.config.allowMultiple && self.lastSound) { - self.stopSound(self.lastSound); - } - } - - } else { - - // append some dom shiz, make noise - - oContainer = o.parentNode; - has_vis = (self.getElementsByClassName('ui360-vis','div',oContainer.parentNode).length); - - // create sound - thisSound = sm.createSound({ - id:'ui360Sound'+(self.soundCount++), - url:soundURL, - onplay:self.events.play, - onstop:self.events.stop, - onpause:self.events.pause, - onresume:self.events.resume, - onfinish:self.events.finish, - onbufferchange:self.events.bufferchange, - type:(o.type||null), - whileloading:self.events.whileloading, - whileplaying:self.events.whileplaying, - useWaveformData:(has_vis && self.config.useWaveformData), - useEQData:(has_vis && self.config.useEQData), - usePeakData:(has_vis && self.config.usePeakData) - }); - - // tack on some custom data - - diameter = parseInt(self.getElementsByClassName('sm2-360ui','div',oContainer)[0].offsetWidth, 10); - - // see note re: IE <9 and excanvas when Modernizr is included, making weird things happen with . - canvasElements = self.getElementsByClassName('sm2-canvas','canvas',oContainer), - - thisSound._360data = { - oUI360: self.getParentByClassName(o,'ui360'), // the (whole) entire container - oLink: o, // DOM node for reference within SM2 object event handlers - className: self.css.sPlaying, - oUIBox: self.getElementsByClassName('sm2-360ui','div',oContainer)[0], - oCanvas: canvasElements[canvasElements.length-1], - oButton: self.getElementsByClassName('sm2-360btn','span',oContainer)[0], - oTiming: self.getElementsByClassName('sm2-timing','div',oContainer)[0], - oCover: self.getElementsByClassName('sm2-cover','div',oContainer)[0], - circleDiameter: diameter, - circleRadius: diameter/2, - lastTime: null, - didFinish: null, - pauseCount:0, - radius:0, - fontSize: 1, - fontSizeMax: self.config.fontSizeMax, - scaleFont: (has_vis && self.config.scaleFont), - showHMSTime: has_vis, - amplifier: (has_vis && self.config.usePeakData?0.9:1), // TODO: x1 if not being used, else use dynamic "how much to amplify by" value - radiusMax: diameter*0.175, // circle radius - width:0, - widthMax: diameter*0.4, // width of the outer ring - lastValues: { - bytesLoaded: 0, - bytesTotal: 0, - position: 0, - durationEstimate: 0 - }, // used to track "last good known" values before sound finish/reset for anim - animating: false, - oAnim: new window.Animator({ - duration: self.config.animDuration, - transition:self.config.animTransition, - onComplete: function() { - // var thisSound = this; - // thisSound._360data.didFinish = false; // reset full circle - } - }), - oAnimProgress: function(nProgress) { - var thisSound = this; - thisSound._360data.radius = parseInt(thisSound._360data.radiusMax*thisSound._360data.amplifier*nProgress, 10); - thisSound._360data.width = parseInt(thisSound._360data.widthMax*thisSound._360data.amplifier*nProgress, 10); - if (thisSound._360data.scaleFont && thisSound._360data.fontSizeMax !== null) { - thisSound._360data.oTiming.style.fontSize = parseInt(Math.max(1,thisSound._360data.fontSizeMax*nProgress), 10)+'px'; - thisSound._360data.oTiming.style.opacity = nProgress; - } - if (thisSound.paused || thisSound.playState === 0 || thisSound._360data.lastValues.bytesLoaded === 0 || thisSound._360data.lastValues.position === 0) { - self.updatePlaying.apply(thisSound); - } - }, - fps: 0 - }; - - // "Metadata" (annotations) - if (typeof self.Metadata !== 'undefined' && self.getElementsByClassName('metadata','div',thisSound._360data.oUI360).length) { - thisSound._360data.metadata = new self.Metadata(thisSound,self); - } - - // minimize ze font - if (thisSound._360data.scaleFont && thisSound._360data.fontSizeMax !== null) { - thisSound._360data.oTiming.style.fontSize = '1px'; - } - - // set up ze animation - thisSound._360data.oAnim.addSubject(thisSound._360data.oAnimProgress,thisSound); - - // animate the radius out nice - self.refreshCoords(thisSound); - - self.updatePlaying.apply(thisSound); - - self.soundsByURL[soundURL] = thisSound; - self.sounds.push(thisSound); - if (!self.config.allowMultiple && self.lastSound) { - self.stopSound(self.lastSound); - } - thisSound.play(); - - } - - self.lastSound = thisSound; // reference for next call - - if (typeof e !== 'undefined' && typeof e.preventDefault !== 'undefined') { - e.preventDefault(); - } else if (typeof window.event !== 'undefined') { - window.event.returnValue = false; - } - return false; - - }; - - this.fanOut = function(oSound) { - - var thisSound = oSound; - if (thisSound._360data.animating === 1) { - return false; - } - thisSound._360data.animating = 0; - soundManager._writeDebug('fanOut: '+thisSound.id+': '+thisSound._360data.oLink.href); - thisSound._360data.oAnim.seekTo(1); // play to end - window.setTimeout(function() { - // oncomplete hack - thisSound._360data.animating = 0; - },self.config.animDuration+20); - - }; - - this.fanIn = function(oSound) { - - var thisSound = oSound; - if (thisSound._360data.animating === -1) { - return false; - } - thisSound._360data.animating = -1; - soundManager._writeDebug('fanIn: '+thisSound.id+': '+thisSound._360data.oLink.href); - // massive hack - thisSound._360data.oAnim.seekTo(0); // play to end - window.setTimeout(function() { - // reset full 360 fill after animation has completed (oncomplete hack) - thisSound._360data.didFinish = false; - thisSound._360data.animating = 0; - self.resetLastValues(thisSound); - }, self.config.animDuration+20); - - }; - - this.resetLastValues = function(oSound) { - oSound._360data.lastValues.position = 0; - }; - - this.refreshCoords = function(thisSound) { - - thisSound._360data.canvasXY = self.findXY(thisSound._360data.oCanvas); - thisSound._360data.canvasMid = [thisSound._360data.circleRadius,thisSound._360data.circleRadius]; - thisSound._360data.canvasMidXY = [thisSound._360data.canvasXY[0]+thisSound._360data.canvasMid[0], thisSound._360data.canvasXY[1]+thisSound._360data.canvasMid[1]]; - - }; - - this.stopSound = function(oSound) { - - soundManager._writeDebug('stopSound: '+oSound.id); - soundManager.stop(oSound.id); - if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) - soundManager.unload(oSound.id); - } - - }; - - this.buttonClick = function(e) { - - var o = e?(e.target?e.target:e.srcElement):window.event.srcElement; - self.handleClick({target:self.getParentByClassName(o,'sm2-360ui').nextSibling}); // link next to the nodes we inserted - return false; - - }; - - this.buttonMouseDown = function(e) { - - // user might decide to drag from here - // watch for mouse move - if (!isTouchDevice) { - document.onmousemove = function(e) { - // should be boundary-checked, really (eg. move 3px first?) - self.mouseDown(e); - }; - } else { - self.addEventHandler(document,'touchmove',self.mouseDown); - } - self.stopEvent(e); - return false; - - }; - - this.mouseDown = function(e) { - - if (!isTouchDevice && e.button > 1) { - return true; // ignore non-left-click - } - - if (!self.lastSound) { - self.stopEvent(e); - return false; - } - - var evt = e?e:window.event, - target, thisSound, oData; - - if (isTouchDevice && evt.touches) { - evt = evt.touches[0]; - } - target = (evt.target||evt.srcElement); - - thisSound = self.getSoundByURL(self.getElementsByClassName('sm2_link','a',self.getParentByClassName(target,'ui360'))[0].href); // self.lastSound; // TODO: In multiple sound case, figure out which sound is involved etc. - // just in case, update coordinates (maybe the element moved since last time.) - self.lastTouchedSound = thisSound; - self.refreshCoords(thisSound); - oData = thisSound._360data; - self.addClass(oData.oUIBox,'sm2_dragging'); - oData.pauseCount = (self.lastTouchedSound.paused?1:0); - // self.lastSound.pause(); - self.mmh(e?e:window.event); - - if (isTouchDevice) { - self.removeEventHandler(document,'touchmove',self.mouseDown); - self.addEventHandler(document,'touchmove',self.mmh); - self.addEventHandler(document,'touchend',self.mouseUp); - } else { - // incredibly old-skool. TODO: Modernize. - document.onmousemove = self.mmh; - document.onmouseup = self.mouseUp; - } - - self.stopEvent(e); - return false; - - }; - - this.mouseUp = function(e) { - - var oData = self.lastTouchedSound._360data; - self.removeClass(oData.oUIBox,'sm2_dragging'); - if (oData.pauseCount === 0) { - self.lastTouchedSound.resume(); - } - if (!isTouchDevice) { - document.onmousemove = null; - document.onmouseup = null; - } else { - self.removeEventHandler(document,'touchmove',self.mmh); - self.removeEventHandler(document,'touchend',self.mouseUP); - } - - }; - - this.mmh = function(e) { - - if (typeof e === 'undefined') { - e = window.event; - } - var oSound = self.lastTouchedSound, - coords = self.getMouseXY(e), - x = coords[0], - y = coords[1], - deltaX = x-oSound._360data.canvasMidXY[0], - deltaY = y-oSound._360data.canvasMidXY[1], - angle = Math.floor(fullCircle-(self.rad2deg(Math.atan2(deltaX,deltaY))+180)); - - oSound.setPosition(oSound.durationEstimate*(angle/fullCircle)); - self.stopEvent(e); - return false; - - }; - - // assignMouseDown(); - - this.drawSolidArc = function(oCanvas, color, radius, width, radians, startAngle, noClear) { - - // thank you, http://www.snipersystems.co.nz/community/polarclock/tutorial.html - - var x = radius, - y = radius, - canvas = oCanvas, - ctx, innerRadius, doesntLikeZero, endPoint; - - if (canvas.getContext) { - // use getContext to use the canvas for drawing - ctx = canvas.getContext('2d'); - } - - // re-assign canvas as the actual context - oCanvas = ctx; - - if (!noClear) { - self.clearCanvas(canvas); - } - // ctx.restore(); - - if (color) { - ctx.fillStyle = color; - } - - oCanvas.beginPath(); - - if (isNaN(radians)) { - radians = 0; - } - - innerRadius = radius-width; - doesntLikeZero = (isOpera || isSafari); // safari 4 doesn't actually seem to mind. - - if (!doesntLikeZero || (doesntLikeZero && radius > 0)) { - oCanvas.arc(0, 0, radius, startAngle, radians, false); - endPoint = self.getArcEndpointCoords(innerRadius, radians); - oCanvas.lineTo(endPoint.x, endPoint.y); - oCanvas.arc(0, 0, innerRadius, radians, startAngle, true); - oCanvas.closePath(); - oCanvas.fill(); - } - - }; - - this.getArcEndpointCoords = function(radius, radians) { - - return { - x: radius * Math.cos(radians), - y: radius * Math.sin(radians) - }; - - }; - - this.deg2rad = function(nDeg) { - return (nDeg * Math.PI/180); - }; - - this.rad2deg = function(nRad) { - return (nRad * 180/Math.PI); - }; - - this.getTime = function(nMSec,bAsString) { - - // convert milliseconds to mm:ss, return as object literal or string - var nSec = Math.floor(nMSec/1000), - min = Math.floor(nSec/60), - sec = nSec-(min*60); - // if (min === 0 && sec === 0) return null; // return 0:00 as null - return (bAsString?(min+':'+(sec<10?'0'+sec:sec)):{'min':min,'sec':sec}); - - }; - - this.clearCanvas = function(oCanvas) { - - var canvas = oCanvas, - ctx = null, - width, height; - - if (canvas.getContext) { - // use getContext to use the canvas for drawing - ctx = canvas.getContext('2d'); - } - - if (ctx) { - width = canvas.offsetWidth; - height = canvas.offsetHeight; - ctx.clearRect(-(width/2), -(height/2), width, height); - } - - }; - - this.updatePlaying = function() { - - var timeNow = (this._360data.showHMSTime?self.getTime(this.position,true):parseInt(this.position/1000, 10)); - var ringScaleFactor = self.config.scaleArcWidth; - - if (this.bytesLoaded) { - this._360data.lastValues.bytesLoaded = this.bytesLoaded; - this._360data.lastValues.bytesTotal = this.bytesTotal; - } - - if (this.position) { - this._360data.lastValues.position = this.position; - } - - if (this.durationEstimate) { - this._360data.lastValues.durationEstimate = this.durationEstimate; - } - - // background ring - self.drawSolidArc(this._360data.oCanvas,self.config.backgroundRingColor,this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad(fullCircle),false); - - // loaded ring - self.drawSolidArc(this._360data.oCanvas,(this._360data.metadata?self.config.loadRingColorMetadata:self.config.loadRingColor),this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad(fullCircle*(this._360data.lastValues.bytesLoaded/this._360data.lastValues.bytesTotal)),0,true); - - // don't draw if 0 (full black circle in Opera) - if (this._360data.lastValues.position !== 0) { - self.drawSolidArc(this._360data.oCanvas,(this._360data.metadata?self.config.playRingColorMetadata:self.config.playRingColor),this._360data.width,this._360data.radius * ringScaleFactor,self.deg2rad((this._360data.didFinish===1?fullCircle:fullCircle*(this._360data.lastValues.position/this._360data.lastValues.durationEstimate))),0,true); - } - - // metadata goes here - if (this._360data.metadata) { - this._360data.metadata.events.whileplaying(); - } - - if (timeNow !== this._360data.lastTime) { - this._360data.lastTime = timeNow; - this._360data.oTiming.innerHTML = timeNow; - } - - // draw spectrum, if applicable - if ((this.instanceOptions.useWaveformData || this.instanceOptions.useEQData) && hasRealCanvas) { // IE <9 can render maybe 3 or 4 FPS when including the wave/EQ, so don't bother. - self.updateWaveform(this); - } - - if (self.config.useFavIcon && self.vuMeter) { - self.vuMeter.updateVU(this); - } - - }; - - this.updateWaveform = function(oSound) { - - if ((!self.config.useWaveformData && !self.config.useEQData) || (!sm.features.waveformData && !sm.features.eqData)) { - // feature not enabled.. - return false; - } - - if (!oSound.waveformData.left.length && !oSound.eqData.length && !oSound.peakData.left) { - // no data (or errored out/paused/unavailable?) - return false; - } - - /* use for testing the data */ - /* - for (i=0; i<256; i++) { - oSound.eqData[i] = 1-(i/256); - } - */ - - var oCanvas = oSound._360data.oCanvas.getContext('2d'), - offX = 0, - offY = parseInt(oSound._360data.circleDiameter/2, 10), - scale = offY/2, // Y axis (+/- this distance from 0) - // lineWidth = Math.floor(oSound._360data.circleDiameter-(oSound._360data.circleDiameter*0.175)/(oSound._360data.circleDiameter/255)); // width for each line - lineWidth = 1, - lineHeight = 1, - thisY = 0, - offset = offY, - i, j, direction, downSample, dataLength, sampleCount, startAngle, endAngle, waveData, innerRadius, perItemAngle, yDiff, eqSamples, playedAngle, iAvg, nPeak; - - if (self.config.useWaveformData) { - // raw waveform - downSample = self.config.waveformDataDownsample; // only sample X in 256 (greater number = less sample points) - downSample = Math.max(1,downSample); // make sure it's at least 1 - dataLength = 256; - sampleCount = (dataLength/downSample); - startAngle = 0; - endAngle = 0; - waveData = null; - innerRadius = (self.config.waveformDataOutside?1:(self.config.waveformDataConstrain?0.5:0.565)); - scale = (self.config.waveformDataOutside?0.7:0.75); - perItemAngle = self.deg2rad((360/sampleCount)*self.config.waveformDataLineRatio); // 0.85 = clean pixel lines at 150? // self.deg2rad(360*(Math.max(1,downSample-1))/sampleCount); - for (i=0; i16500 Hz), most stuff won't actually use it. - sampleCount = (eqSamples/downSample); - innerRadius = (self.config.eqDataOutside?1:0.565); - direction = (self.config.eqDataOutside?-1:1); - scale = (self.config.eqDataOutside?0.5:0.75); - startAngle = 0; - endAngle = 0; - perItemAngle = self.deg2rad((360/sampleCount)*self.config.eqDataLineRatio); // self.deg2rad(360/(sampleCount+1)); - playedAngle = self.deg2rad((oSound._360data.didFinish===1?360:360*(oSound._360data.lastValues.position/oSound._360data.lastValues.durationEstimate))); - j=0; - iAvg = 0; - for (i=0; iplayedAngle?self.config.eqDataColor:self.config.playRingColor),oSound._360data.width*innerRadius,oSound._360data.radius*scale*(oSound.eqData.left[i]*direction),endAngle,startAngle,true); - } - } - - if (self.config.usePeakData) { - if (!oSound._360data.animating) { - nPeak = (oSound.peakData.left||oSound.peakData.right); - // GIANT HACK: use EQ spectrum data for bass frequencies - eqSamples = 3; - for (i=0; i', - ' ', // note use of imageMap, edit or remove if you use a different-size image. - '
    ', // + Ever-so-slight Safari horizontal alignment tweak - '
    ' - ]; - - }; - - this.uiTest = function(sClass) { - - // fake a 360 UI so we can get some numbers from CSS, etc. - - var oTemplate = document.createElement('div'), - oFakeUI, oFakeUIBox, oTemp, fakeDiameter, uiHTML, circleDiameter, circleRadius, fontSizeMax, oTiming; - - oTemplate.className = 'sm2-360ui'; - - oFakeUI = document.createElement('div'); - oFakeUI.className = 'ui360'+(sClass?' '+sClass:''); // ui360 ui360-vis - - oFakeUIBox = oFakeUI.appendChild(oTemplate.cloneNode(true)); - - oFakeUI.style.position = 'absolute'; - oFakeUI.style.left = '-9999px'; - - oTemp = document.body.appendChild(oFakeUI); - - fakeDiameter = oFakeUIBox.offsetWidth; - - uiHTML = self.getUIHTML(fakeDiameter); - - oFakeUIBox.innerHTML = uiHTML[1]+uiHTML[2]+uiHTML[3]; - - circleDiameter = parseInt(oFakeUIBox.offsetWidth, 10); - circleRadius = parseInt(circleDiameter/2, 10); - - oTiming = self.getElementsByClassName('sm2-timing','div',oTemp)[0]; - fontSizeMax = parseInt(self.getStyle(oTiming,'font-size'), 10); - if (isNaN(fontSizeMax)) { - // getStyle() etc. didn't work. - fontSizeMax = null; - } - - // soundManager._writeDebug('diameter, font size: '+circleDiameter+','+fontSizeMax); - - oFakeUI.parentNode.removeChild(oFakeUI); - - uiHTML = oFakeUI = oFakeUIBox = oTemp = null; - - return { - circleDiameter: circleDiameter, - circleRadius: circleRadius, - fontSizeMax: fontSizeMax - }; - - }; - - this.init = function() { - - sm._writeDebug('threeSixtyPlayer.init()'); - - var oItems = self.getElementsByClassName('ui360','div'), - i, j, oLinks = [], is_vis = false, foundItems = 0, canvasElements, oCanvas, oCanvasCTX, oCover, diameter, radius, uiData, uiDataVis, oUI, oBtn, o, o2, oID; - - for (i=0,j=oItems.length; i. - * When this is the case, the first doesn't have getContext('2d') and such - so, use the second. - */ - canvasElements = oCanvas.parentNode.getElementsByTagName('canvas'); - if (canvasElements.length > 1) { - oCanvas = canvasElements[canvasElements.length-1]; - } - } else { - // add a handler for the button - oCanvas = oLinks[i].parentNode.getElementsByTagName('canvas')[0]; - } - oCover = self.getElementsByClassName('sm2-cover','div',oLinks[i].parentNode)[0]; - oBtn = oLinks[i].parentNode.getElementsByTagName('span')[0]; - self.addEventHandler(oBtn,'click',self.buttonClick); - if (!isTouchDevice) { - self.addEventHandler(oCover,'mousedown',self.mouseDown); - } else { - self.addEventHandler(oCover,'touchstart',self.mouseDown); - } - oCanvasCTX = oCanvas.getContext('2d'); - oCanvasCTX.translate(radius, radius); - oCanvasCTX.rotate(self.deg2rad(-90)); // compensate for arc starting at EAST // http://stackoverflow.com/questions/319267/tutorial-for-html-canvass-arc-function - } - } - if (foundItems>0) { - self.addEventHandler(document,'click',self.handleClick); - if (self.config.autoPlay) { - self.handleClick({target:self.links[0],preventDefault:function(){}}); - } - } - sm._writeDebug('threeSixtyPlayer.init(): Found '+foundItems+' relevant items.'); - - if (self.config.useFavIcon && typeof this.VUMeter !== 'undefined') { - this.vuMeter = new this.VUMeter(this); - } - - }; - -} - -// Optional: VU Meter component - -ThreeSixtyPlayer.prototype.VUMeter = function(oParent) { - - var self = oParent, - me = this, - _head = document.getElementsByTagName('head')[0], - isOpera = (navigator.userAgent.match(/opera/i)), - isFirefox = (navigator.userAgent.match(/firefox/i)); - - this.vuMeterData = []; - this.vuDataCanvas = null; - - this.setPageIcon = function(sDataURL) { - - if (!self.config.useFavIcon || !self.config.usePeakData || !sDataURL) { - return false; - } - - var link = document.getElementById('sm2-favicon'); - if (link) { - _head.removeChild(link); - link = null; - } - if (!link) { - link = document.createElement('link'); - link.id = 'sm2-favicon'; - link.rel = 'shortcut icon'; - link.type = 'image/png'; - link.href = sDataURL; - document.getElementsByTagName('head')[0].appendChild(link); - } - - }; - - this.resetPageIcon = function() { - - if (!self.config.useFavIcon) { - return false; - } - var link = document.getElementById('favicon'); - if (link) { - link.href = '/favicon.ico'; - } - - }; - - this.updateVU = function(oSound) { - - if (soundManager.flashVersion >= 9 && self.config.useFavIcon && self.config.usePeakData) { - me.setPageIcon(me.vuMeterData[parseInt(16*oSound.peakData.left, 10)][parseInt(16*oSound.peakData.right, 10)]); - } - - }; - - this.createVUData = function() { - - var i=0, j=0, - canvas = me.vuDataCanvas.getContext('2d'), - vuGrad = canvas.createLinearGradient(0, 16, 0, 0), - bgGrad = canvas.createLinearGradient(0, 16, 0, 0), - outline = 'rgba(0,0,0,0.2)'; - - vuGrad.addColorStop(0,'rgb(0,192,0)'); - vuGrad.addColorStop(0.30,'rgb(0,255,0)'); - vuGrad.addColorStop(0.625,'rgb(255,255,0)'); - vuGrad.addColorStop(0.85,'rgb(255,0,0)'); - bgGrad.addColorStop(0,outline); - bgGrad.addColorStop(1,'rgba(0,0,0,0.5)'); - for (i=0; i<16; i++) { - me.vuMeterData[i] = []; - } - for (i=0; i<16; i++) { - for (j=0; j<16; j++) { - // reset/erase canvas - me.vuDataCanvas.setAttribute('width',16); - me.vuDataCanvas.setAttribute('height',16); - // draw new stuffs - canvas.fillStyle = bgGrad; - canvas.fillRect(0,0,7,15); - canvas.fillRect(8,0,7,15); - /* - // shadow - canvas.fillStyle = 'rgba(0,0,0,0.1)'; - canvas.fillRect(1,15-i,7,17-(17-i)); - canvas.fillRect(9,15-j,7,17-(17-j)); - */ - canvas.fillStyle = vuGrad; - canvas.fillRect(0,15-i,7,16-(16-i)); - canvas.fillRect(8,15-j,7,16-(16-j)); - // and now, clear out some bits. - canvas.clearRect(0,3,16,1); - canvas.clearRect(0,7,16,1); - canvas.clearRect(0,11,16,1); - me.vuMeterData[i][j] = me.vuDataCanvas.toDataURL('image/png'); - // for debugging VU images - /* - var o = document.createElement('img'); - o.style.marginRight = '5px'; - o.src = vuMeterData[i][j]; - document.documentElement.appendChild(o); - */ - } - } - - }; - - this.testCanvas = function() { - - // canvas + toDataURL(); - var c = document.createElement('canvas'), - ctx = null, ok; - if (!c || typeof c.getContext === 'undefined') { - return null; - } - ctx = c.getContext('2d'); - if (!ctx || typeof c.toDataURL !== 'function') { - return null; - } - // just in case.. - try { - ok = c.toDataURL('image/png'); - } catch(e) { - // no canvas or no toDataURL() - return null; - } - // assume we're all good. - return c; - - }; - - this.init = function() { - - if (self.config.useFavIcon) { - me.vuDataCanvas = me.testCanvas(); - if (me.vuDataCanvas && (isFirefox || isOpera)) { - // these browsers support dynamically-updating the favicon - me.createVUData(); - } else { - // browser doesn't support doing this - self.config.useFavIcon = false; - } - } - - }; - - this.init(); - -}; - -// completely optional: Metadata/annotations/segments code - -ThreeSixtyPlayer.prototype.Metadata = function(oSound, oParent) { - - soundManager._wD('Metadata()'); - - var me = this, - oBox = oSound._360data.oUI360, - o = oBox.getElementsByTagName('ul')[0], - oItems = o.getElementsByTagName('li'), - isFirefox = (navigator.userAgent.match(/firefox/i)), - isAlt = false, i, oDuration; - - this.lastWPExec = 0; - this.refreshInterval = 250; - this.totalTime = 0; - - this.events = { - - whileplaying: function() { - - var width = oSound._360data.width, - radius = oSound._360data.radius, - fullDuration = (oSound.durationEstimate||(me.totalTime*1000)), - isAlt = null, i, j, d; - - for (i=0,j=me.data.length; ime.refreshInterval) { - me.refresh(); - me.lastWPExec = d; - } - - } - - }; - - this.refresh = function() { - - // Display info as appropriate - var i, j, index = null, - now = oSound.position, - metadata = oSound._360data.metadata.data; - - for (i=0, j=metadata.length; i= metadata[i].startTimeMS && now <= metadata[i].endTimeMS) { - index = i; - break; - } - } - if (index !== metadata.currentItem && index < metadata.length) { - // update - oSound._360data.oLink.innerHTML = metadata.mainTitle+' '; - // self.setPageTitle(metadata[index].title+' | '+metadata.mainTitle); - metadata.currentItem = index; - } - - }; - - this.strToTime = function(sTime) { - var segments = sTime.split(':'), - seconds = 0, i; - for (i=segments.length; i--;) { - seconds += parseInt(segments[i], 10)*Math.pow(60,segments.length-1-i); // hours, minutes - } - return seconds; - }; - - this.data = []; - this.data.givenDuration = null; - this.data.currentItem = null; - this.data.mainTitle = oSound._360data.oLink.innerHTML; - - for (i=0; i= Math.abs(this.state - this.target)) { - this.state = this.target; - } else { - this.state += movement; - } - - try { - this.propagate(); - } finally { - this.options.onStep.call(this); - if (this.target == this.state) { - window.clearInterval(this.intervalId); - this.intervalId = null; - this.options.onComplete.call(this); - } - } - }, - // shortcuts - play: function() {this.seekFromTo(0, 1)}, - reverse: function() {this.seekFromTo(1, 0)}, - // return a string describing this Animator, for debugging - inspect: function() { - var str = "# 20) return; - } - }, - getStyle: function(state) { - state = this.from + ((this.to - this.from) * state); - if (this.property == 'filter') return "alpha(opacity=" + Math.round(state*100) + ")"; - if (this.property == 'opacity') return state; - return Math.round(state) + this.units; - }, - inspect: function() { - return "\t" + this.property + "(" + this.from + this.units + " to " + this.to + this.units + ")\n"; - } -} - -// animates a colour based style property between two hex values -function ColorStyleSubject(els, property, from, to) { - this.els = Animator.makeArray(els); - this.property = Animator.camelize(property); - this.to = this.expandColor(to); - this.from = this.expandColor(from); - this.origFrom = from; - this.origTo = to; -} - -ColorStyleSubject.prototype = { - // parse "#FFFF00" to [256, 256, 0] - expandColor: function(color) { - var hexColor, red, green, blue; - hexColor = ColorStyleSubject.parseColor(color); - if (hexColor) { - red = parseInt(hexColor.slice(1, 3), 16); - green = parseInt(hexColor.slice(3, 5), 16); - blue = parseInt(hexColor.slice(5, 7), 16); - return [red,green,blue] - } - if (window.DEBUG) { - alert("Invalid colour: '" + color + "'"); - } - }, - getValueForState: function(color, state) { - return Math.round(this.from[color] + ((this.to[color] - this.from[color]) * state)); - }, - setState: function(state) { - var color = '#' - + ColorStyleSubject.toColorPart(this.getValueForState(0, state)) - + ColorStyleSubject.toColorPart(this.getValueForState(1, state)) - + ColorStyleSubject.toColorPart(this.getValueForState(2, state)); - for (var i=0; i 255) number = 255; - var digits = number.toString(16); - if (number < 16) return '0' + digits; - return digits; -} -ColorStyleSubject.parseColor.rgbRe = /^rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i; -ColorStyleSubject.parseColor.hexRe = /^\#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/; - -// Animates discrete styles, i.e. ones that do not scale but have discrete values -// that can't be interpolated -function DiscreteStyleSubject(els, property, from, to, threshold) { - this.els = Animator.makeArray(els); - this.property = Animator.camelize(property); - this.from = from; - this.to = to; - this.threshold = threshold || 0.5; -} - -DiscreteStyleSubject.prototype = { - setState: function(state) { - var j=0; - for (var i=0; i section ? 1 : 0); - } - if (this.options.rememberance) { - document.location.hash = this.rememberanceTexts[section]; - } - } -} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js deleted file mode 100755 index d7488739..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/360-player/script/excanvas.js +++ /dev/null @@ -1,17 +0,0 @@ -// Excanvas (Explorer Canvas) R43 -// http://excanvas.sourceforge.net/ -// Copyright 2006 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -if(!document.createElement("canvas").getContext){(function(){var u=Math;var v=u.round;var r=u.sin;var C=u.cos;var l=u.abs;var B=u.sqrt;var a=10;var n=a/2;function g(){return this.context_||(this.context_=new p(this))}var t=Array.prototype.slice;function D(j,m,E){var i=t.call(arguments,2);return function(){return j.apply(m,i.concat(t.call(arguments)))}}var h={init:function(i){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var j=i||document;j.createElement("canvas");j.attachEvent("onreadystatechange",D(this.init_,this,j))}},init_:function(F){if(!F.namespaces.g_vml_){F.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML")}if(!F.namespaces.g_o_){F.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML")}if(!F.styleSheets.ex_canvas_){var E=F.createStyleSheet();E.owningElement.id="ex_canvas_";E.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var m=F.getElementsByTagName("canvas");for(var j=0;j','","");this.element_.insertAdjacentHTML("BeforeEnd",Y.join(""))};k.stroke=function(ae){var J=[];var K=false;var ap=c(ae?this.fillStyle:this.strokeStyle);var aa=ap.color;var ak=ap.alpha*this.globalAlpha;var F=10;var M=10;J.push("V.x){V.x=ai.x}if(ao.y==null||ai.yV.y){V.y=ai.y}}}J.push(' ">');if(!ae){var U=this.lineScale_*this.lineWidth;if(U<1){ak*=U}J.push("')}else{if(typeof this.fillStyle=="object"){var N=this.fillStyle;var S=0;var ah={x:0,y:0};var ab=0;var Q=1;if(N.type_=="gradient"){var P=N.x0_/this.arcScaleX_;var m=N.y0_/this.arcScaleY_;var O=N.x1_/this.arcScaleX_;var aq=N.y1_/this.arcScaleY_;var am=this.getCoords_(P,m);var al=this.getCoords_(O,aq);var I=al.x-am.x;var G=al.y-am.y;S=Math.atan2(I,G)*180/Math.PI;if(S<0){S+=360}if(S<0.000001){S=0}}else{var am=this.getCoords_(N.x0_,N.y0_);var j=V.x-ao.x;var E=V.y-ao.y;ah={x:(am.x-ao.x)/j,y:(am.y-ao.y)/E};j/=this.arcScaleX_*a;E/=this.arcScaleY_*a;var ag=u.max(j,E);ab=2*N.r0_/ag;Q=2*N.r1_/ag-ab}var Z=N.colors_;Z.sort(function(H,i){return H.offset-i.offset});var T=Z.length;var Y=Z[0].color;var X=Z[T-1].color;var ad=Z[0].alpha*this.globalAlpha;var ac=Z[T-1].alpha*this.globalAlpha;var af=[];for(var aj=0;aj')}else{J.push('')}}J.push("");this.element_.insertAdjacentHTML("beforeEnd",J.join(""))};k.fill=function(){this.stroke(true)};k.closePath=function(){this.currentPath_.push({type:"close"})};k.getCoords_=function(E,j){var i=this.m_;return{x:a*(E*i[0][0]+j*i[1][0]+i[2][0])-n,y:a*(E*i[0][1]+j*i[1][1]+i[2][1])-n}};k.save=function(){var i={};w(this,i);this.aStack_.push(i);this.mStack_.push(this.m_);this.m_=d(q(),this.m_)};k.restore=function(){w(this.aStack_.pop(),this);this.m_=this.mStack_.pop()};k.translate=function(m,j){var i=[[1,0,0],[0,1,0],[m,j,1]];this.m_=d(i,this.m_)};k.rotate=function(j){var E=C(j);var m=r(j);var i=[[E,m,0],[-m,E,0],[0,0,1]];this.m_=d(i,this.m_)};k.scale=function(G,F){this.arcScaleX_*=G;this.arcScaleY_*=F;var j=[[G,0,0],[0,F,0],[0,0,1]];var i=this.m_=d(j,this.m_);var E=i[0][0]*i[1][1]-i[0][1]*i[1][0];this.lineScale_=B(l(E))};k.clip=function(){};k.arcTo=function(){};k.createPattern=function(){return new f};function z(i){this.type_=i;this.x0_=0;this.y0_=0;this.r0_=0;this.x1_=0;this.y1_=0;this.r1_=0;this.colors_=[]}z.prototype.addColorStop=function(j,i){i=c(i);this.colors_.push({offset:j,color:i.color,alpha:i.alpha})};function f(){}G_vmlCanvasManager=h;CanvasRenderingContext2D=p;CanvasGradient=z;CanvasPattern=f})()}; \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot1.png deleted file mode 100755 index b7b3b5ddd5822192b2ee83a517215957757748ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11385 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 Hu0mjfZbc{S diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot2.png deleted file mode 100755 index 28cc08791df1866fed4359eaa7ae1fc42d2c496e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12003 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 BEzSS{ diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/360ui-screenshot3.png deleted file mode 100755 index fd57d068f82f80547fec98b3986d02b7f7fbf431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8983 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

    H5OikG@5m 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg deleted file mode 100755 index 9b4ae056..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - - -This is a custom SVG webfont generated by Font Squirrel. -Copyright : Generated in 2010 by FontLab Studio Copyright info pending - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/chunk-webfont.ttf deleted file mode 100755 index 5ba183cee5676a916c2f49205889a1e61baedcd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20496 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.eot deleted file mode 100755 index 97fd210d646be5656c6e7c47525344d14504c214..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19626 zcmafaQ*c4CKJuf{r>;y-lto&R@d(C zy=wJqSM91*1OO%#008L!90>R?BEuoVAONAEflz=HD8PSbimLx;0B0X>fMvS>q5Wt3 zPyo~a*8TM$Go%06|Gx$XNCB(>_5d@0Hoyx2259_;oB{NlJA|Wl(qH_8gTP(475rQhL_FdLHMXyoJOv< zjYt5^9j>DXMG^A`#Pb3e7%iGWqy!ep6N(J~-+5qRk0Z&+2=3zX%8A!5C+-$yKALX9 zNE9CB&Xk4=@h_%*Y$xoF<0xn?<_Fr=CEu6F0z(wSzacVoi-F#hHj-DaJjFXjcF~Lx^g8u{FTm1>`nk!Q-A|$k9%NGCrZMkgHLgoYU;?*|}|FuJ4JQjk$P>QW7JF38@jC4DOeP z)txdRdPM(*4bhn8IKTb5DyNS2IISpdYB%1p?e%n2KZ(r>N%9B49N@4w(`61mBS25$ z22B+^Sy-%m4aCw7n4=BuNri>;vAy>m-{g{_m?$J}8!~d8rjv!sEH!vGo*$x6hmFYz zi8y(ii|7;efVj$hrei-d!(xl%U=BOvOxVEWkWC^cn0-DWmC0eC@Bo*l#0tc7DpCLu zsl0Mm*lM@33WjK?ZgHDz|c1bInH08VwDKt`12@<$j zd&B$@9G=$Iu!&fR>C?@6@}gQ?Z7Hd|NtelNk8^}L@W-yQs6X%#>y*+{zm+?;DO^Rp z4Gr6lwopG!HUp`g6MhgI=+Rk)#AjTRKTgU}t(s?~oV;7o#;X%!L_ecz_I=3BQ;wR6 zDUMq%rfcQNVe;(=!PC4~|IkXJ${*GIlP4dss{)^88&<3Mhic^`t<3B`ED)Jwc2ht$ zHq}erlUgS%86#>CI!=3ADOFnBNK6a829sY$HpvaqpN&Kyjw0rGfzuU3yo6f24$DgC z4}%uQnib08i4snv$g?47WRN_(@-YoE1;e1UURBMFIh7j;NKe9iWZYz}W0p_g(t|Wn zhQ$zMl-zK1{f`$efUh^$S>krv5Bc1m6lL5F(e7vF5V{cxzW25v5Yyb1`uot`#hC2i ziT1dn%4-z6axJ%M=%S2HZ-$tyeRRKFL%+Zud0qR(Wn>{>W|P1 z{4ED1xnY*A>TxqNd#UMn1g`_4iQ`M>{mprl6Y3V;*|Ky0nj5{OO@$OD0WG#c1!7}s ze_RG?*f|sGuW+=osCy^p8d9d|RIqdIz@p*uAQ_pzdi`BZJN_ilCFG7bwbXhmI6JDZ z3YvFMlxlSOVsR_YOG8$LVfn|WNwfs2l$>F$Y*5K#7;7-^8KsOv2+#E}u!@vNePmDp+VU1RklW+FtU~h`K zTV^^R6SDfF$9O6#8d{+>gL1;{SDhK+XLMOXjk9yu z5)W)%B3uL(aSB%S4DqiL9#radKXx4FyDhabLhex(SMSqNVw1@!q_|gv5=|>8nNdQa zyAlk=wGQ!(gQ*&s=-O>Ff1NP{ zKZrE+6Z)MkOBa=$CF+vNHcQlrBQy-KTh(^;4^)Zo;zV|f*g`DYH1==9xw!)U5v7MD z2gih{r99-jvy`Ht>b^JZS(YWml9DXBa2B}!W&zJvn1bz_77ObT2Fwq@x30B~+@9^N zR>4DR*MN<@Ln~6Y-N3uRo_BZlK2V*@&o?^Uufu)oN5s{Rn1r8=m7zd)0kO!{t>5-- zVAk%eGK6rO)>5bkfiL`^6(fbF(#j=e#s%3t z`d?{HG&=1jI(&OB_FVvnFEpWCjwn|Z*BKW1Bayf-egX#Ikwx}pb<=@*hqCcU2f(O- zzH#+bccU0+bBZ_7^|VrIjZ+U=B3`sD9Mq1g!d^TA`W{Eu*z8~YK@B{~5)EC7{$d&T zIrHx~@t!_@;n{*R+6nQ)Mzbz@zF_bvJU&{Um6ZB}8&ux2;W0}C2nUODW=-x?$#t%2 zMQWL5!wzv&f7>r5<(br+LqRJ;-{mv%o)su54gw*QB3 z92Q({SI3@pfa@>ETOg{@W%bUA=~9!Op=efI6IrmLUd)q47x5)oX#-y4s8nmMc^ln{ z-kSa>6e%g_wG=#({hk zN9VhWYHy{J%!qDC^hikWYP$K-bTs^?(sXmr5Yc;Vc!0<>6c=njnkeFCldkM9<$M?5 z6h=6d)ua4Lk;r77bAG-Jq4pc+WY`Mr3D!`4+tS~eF}FKqK7s_g!fKep^ch9I4`e;V z>QHOO{Z8(OqK}UBP)@WpSwPdjRO=flizo(~xb>&AHiDc1SW0goKFp}(h^fjyLIJ-0Y2jwwj)x#0`U+Dm+1g^O=k~KY03J+1c z;mAB)YP2m8l-=83e`2EiqMsL#oF=QX+lDyN$fp;%22LGPsn*s#N_|M1Ka03~yd9@o zh{963L*rSlV#~3D4-~rSSNTk3W~cVlD-IY)I>78^O&ae6%^_^+wq(`FZ17~RASFP~ zQ2m3Kb0W>JF0!qMCeCiRj;|LCJr!}|b$potSL~cmSEA9XNcq&h2nN`Sb3zianZ{gw zLQu^(bPSf2>ap|feExpk#W>hxt_v?y*J7k~Jgf2+8e{g zAiasixATRrL<8ze?blu(^xH?~YGci80ThJ-8flw3V>l|E(LcYHb6Vwxk11kTVjTq*)# zXW4RyE(X0B+ugsdG>9})Eynl*N=_cZA4}8py-j=aE9*S=sL)_^*%YFZC#jDzTXHog zo{1JVdE}9^xll_zUsGh>dqwD_p26QX(XM(a=?1?|5XX7yBPYIN>!EbhK*a`%7byR& zY~>WxT8k`Jd$GIwN{|uu3IUlQdX763$%~T+-crvHrCkw@peIg#$_iEf1)37n-3$f63jPOi-KDlL;ImTOZzwX)N;56J~ZaF$ZzS4 zG6{qZnvk?dZ@|m5_S#mx(aWHzR>kq+n~5!HTAcbiLVsThUtQJ&bjHl4#eIhhPG2a< zpO3O~5AY|G*qddkiYY*XxuCKU&^x^+`$olSA-_Eq=&Mh&6s`6VV1^?;IRgyu_@}1{XBmrnnIE z6t9O9g%7p#N1i?<0-16@RUX#Uw`kl=sU1N>r)WdF6pUCRtWlRoMVKEmo9~G2!V7;u z@Mm~Nk=6*HAy)a&1Y}e$?%|jq7OJ!`Z&O)2Sv!f2z#XEAwT;!aRK1S?DoOE8Ob5Jg zSnRn)`wm;5y7l)MUsB6aTuo;u*2uEZ6i38hNbbxrFcqhb*xwZA;1+7jd1YJfwamU3Aaioj%=pmkJVenqOsX2C0tKJCpi(w55~-<9aX9){ z4g#G5r(AW&S2|T!;nv~E1&p9+bx)GKhn+9`@SfrLeN+L(yM!M@l|!V$Q>GN~4{nMe zg>ydOP;B=g!IfH8O02UGuhg`7c z!A5Rq6wU{a6Z~a$benGcM}|F#RNJe8laS(}C8PulzR)j@g+kHBgIs0J}PJ(ZrSEn+sd=?X80-hqf%#2vO- z!|xkDJ@#$;3I9ofSy{vpkU4=a`Mzh@M#`g^s}vT4lmQ6uIjwx>Zt16L@UTym^1xnQE zw|{4od_S}#)ShzIq%7fK*=t;k^QgIXMBp(J_Ff5gqsOmfeE$xyhsU{E&B)bVyKPS2HByhxs?*eyU$F^11_CPTMCdJs z_qnCK(M57|crCO|jtZrW$(@}8|JNVnbHF=@uoj72+ko~$h2(? z;Oh?mT~dwQwTIo7CcU871poI;j0~9d!B#cK^;-O)eG(T@J5wh#^J?`T z0Je^&vD=SOf?isD!r~5%;i&Sp$qQ{krvzgfM0A%T=OPc@&tF5BpnABYi)NZfYckxN z{$H)kNY9Ph>n*=}{?cT&i^kGJSbf|2-y+Egx;!lwzeh^pBe5b5TM8a8liOtE$_iH4 zKI0l^JO2Bcu;?2HX^b1i`mk9JH08U2aROB2@PVQscGq!@S#mh;6M=Hvsw>9L4z0d| z6%_stL4uj)&1u%3x1oFKA>n?g94+T=H&@%2T~Qqp<7JE|Hz{N;#H;iNVa4UUn(YvZ z*et#Ge4&Bka-rI1dO9*8fqMugm5{Gy{Ztl3$)r#$VnIqit~)_^rEj0&`~5N!e3T*W z)w`m^oIST=4r{;2Vtk0@oP}$=+O?Ts8iO6lH~$zUOG>YM!aF4Ts3V?Y%?PMa`A@cN z3`Dt68*<|TEuaisUpg)+t%V%I=SxQUS-^q~%t)b}%kJK?od-0D%`O)Kbs8Q4`mm2q z^Ap0sk2>cut=w%5F7S^95ljz*WY#zEm?42>0#4l5&{z1i7Li*sw|^#9#-^K|7(Jx( zmUS#;9V@n^m)SA6Kth^OOR+%_Y@X2H4)o$U5U3|Jd7<{EBNo@3(&$`>K8?Y3x>pS+ zdS#{N6>LnjVe}F8S|^xh5;;C$FTp6j!*_<&^h>;y8qMpf8b97d#)099E^Ar&I&*kG zyind0^Jf^mc9?;r9Ol8H7_yY5(PJC?mhV!eRopL2h2ME8J$|DJ?31s)d5pd;P-+Sx zb;IO>A5aQAt}YK+;63Z5M!Vf3DY1x9k_6=WL7P~B$eGKwNG@)|dC(BDmplg!~OUw!d{h58qK|>+&j*l3MUwStU zD178(hVW8CO})+8LTh#T5^??ez&-17-M ze__}JT{W{Jtod$M7IfKVkIbUxe)4|L7w(MPbC&JikA6*x#xN8bF1cI}eSk5!g&G7w zfuv(BqmAE0PRP1Z?fO??@S2O2Q!t7h_JXd0pm#sA%ng~Xpi4Ux>N5;YoJN_zwCnn2 zlGYu$I2&`NyLbG0VlE@am0bV~_A{d!NI<<}8`|t~<>y;0T*+5HKgRHhhWXj75AyGC zS0MNE>>E`2UwZO-(iH{J6+~c+5Nm&!jF4cT0|PtK zG`hVJkE5+x*C2FyVilF-br_m3U|WnnO}w>pEB0k5VjP>+bv6uv+SXM1A`uEn8$S3$ zRkApiI&qUbH%3e@i%Lg{5Uf@ye$e-TLDol*7FQ=f7}cT7BQ{6}V?>iX(NYF+h}7iM zgMJFQQgVA55;&@@nXv!!g>nvmdg?DqgCa}dfmK8Aed_q3aPxXR9aSv1<^=4h7x%TN7Hhw~?YKNwqCgnJ%GSOH~WC zDm77Ou7H^&Ww1}x8SF@lD3c3=RodL0fybnoyoB*tYwNO^lAhDhA-GZiEqi7z; z)h7gqpOz^lC}-pZ;$O+&-sl1H$Vy%xDe113WrSZ}`sn`F>Epn3!L?^PUzwFBh>-_f zK|h5Y*o~n#efKwJ2wloDLHsg?vRZtXLVbH^EE7&@5+>`8G!Kt}l+49{^)d_uu3HeM zN{#L_$UQ+n`vk58_8(XZI{eC%>XroB%K|N=^*WB%oXEMc1(Y}zlef*8}(V5 zp#u0y-}xyb!r*_!OQA`lFX4@OK@4N2imna^A59L>Ng!SHgEetH<1qqjew@j8nu7~) z=Tp5ielDFI)Hz7Dln6}Mt&WJ;POYl`ZOnfY0pYZg2T|lLDAn{js6@F{d(mi|c4N5J zmLHN*<%)tlB3+*cy?6=KL=k1+dw7X^$evOptIfm+6ORA`ssNEJ+}B0l)E>NBP1=h~ zqNK%fSKD$2!&yegdrpmTY|hkpVe)FsbO)$iRh4Z&auOR=%{(M^1rHv}QY&bTF8oMR zn|!GAv12M}X*xsw@$}?6CiZJzJ5p(wD4GXr(7?LB8Z>u54whJGn}A$JO9!!*^B%1ZE}A^h+og&4}gsZh@5bBHi1@n)$xNJ$JLvaOzn z&`$D-+ddR1_+z8V_UM<42;fTKHUk@Dj4l>~x^dDK_2XXS6hR`+4t%vOS?D0CzsU@b zWI45ycZu3PS6Z2Q7|%_iiaxO&6QoUpB7eT+m1H*6B$@q47VTVq7(6XXrratmPJ5$2rWMX zR~r{9;w_LePh8ger*(`3M$-Z6h2glNT?nt(2y z#2#MxmURZ-YW7hV0R{tIS&=D!Y<@}h1SABZze2VtPrF2uW$!2wS~2azu@YWPI+ z$ZsY%U+C)b(j{nFSW7EqSe>pU(WM39neRwJ0-Y2vNTXSD);}S9QJL_X8QU7Mt7^g`V{38MNQgTl&G z_%L?YFP6?POVU9ufCB(ftn46Yet}TQ!0P3bl+%S0Dfd;sUVUSkFEtNM|4_nbfaHw! z0T4!dP7Kq%Q;|&Rl*KFewV(FPhDLLe-d;R88$r=gCTZyHD`0 zn;ZH*Af8Ej2k)*gIq?*j$NmFM3JkY}G~}lKeeaE^1P9M|MhymK`dH;6 z$JmB&fTUTZtsQ+dUR>$}fQK6EOKQw{R6B*#1%1lU%qVW7=lX&zN)c^z^d?ye9;yqu2f-aX;UKiQ8OZ}%FB1Pr9^ruG;>Bm6It#72O9A(>8q*X7io({ zU26Jt$1$i0Ccm3Pqg}0Q8z^)t&CJ03!f^PZJ_RY@$M=PzFrfz$apY;^^o7 zuSo`skSVbZXvgr3K#}j9I};n4Yq8AITU(@Oyi7BVKlX<vRB&3d$Cy!*iGrkR zE>{d+UUJTZJ6WHtyYRZRs|BndTAE0ihC6Ea$1-|?<`6l|{p5EU{vnb}J>H6>Ox^LK z9!5TOJsgZLwp-5}stKDpOx9jrpPf9D z6i1uI;XGokEPnK*A32u8Xv3#-)I*BrO^SgXDYJ7t2l7ZLRgX}b>~Q2@slsDy&rXsb z$NzK-s8ub)Ye3VAiV1j)+4IgUg@lE93qKUfv1lVI&K;)y^5P4ZT>UAd34K>zE#LZH zSOPIW3Ew-p(0p4_p3hDvKCbQtyN$0F=J`t^+?!HSe;X-Jxl#Sw?@ViS9$#ywnKTmb z<&gH975E)YwvU{em&|_=IDU4Kh8O&ciPpjk?=Wl3K8sFR_-q)=XJls|Gwc_7DZj9? zS&TGh;v_AmYs!PKlT>#mv)}t3T5OvNWvG^HpbJhvQ(IbS9gNg_L`2k!>(JC?px0Pt zoFoClWosp+8&ior7o6T)r4btH4Y~1fe8V#=btI$jf!x#07P3|gsbISEM8-bM`-cT&Gm1czj~qdwF~vZh zCYKsJDzt|-!asyEOcGF#@|sQ!+bK@+$J~dbfXc~Fjg)oTl3}*wWmHJwUpj_e6N^U& zK;)B_OUtj8WKa^ajV+!}u)EXb;*ctS#2t?~*z1+Q1$h^5^(3s{(#L6*uCbZolf&`n zbV1@I5?2f)+P!m)iSw2g!&p{mX=>(pD$D>q)Fnn$`c6~=ZzI4 z?gC{Nn18wFhj^$}V9YO<%k9hveJG-xHTJx7A=X$Sr9bIX<0WD>=Kl(6rbmq$5D@a5 zND)iOfzmedTPP!G3~i@FaaAyc?F>7xNEWI|kL6D=iP&M4Q_6w(*%qMkK!8 z3>kxX8mAcuIEC6y0Z6R`)UeK4@p6)dZ?VK!5kZ8B^%xe9rq*1U zek8uK`_Wp7wOEb15+i`NDGePfAc83*^GwfFGSWbLjI)kO9*dT7f?;z^Sm$5yFOfHv zu%&srlxF|TGb=}0=@>+Tp_&IFF$V}FcxP)Co(CUssyL9w64c#C6#}h(s53h@kQNN4 zU!K>Msf-(3W|#vQWl0eSO*PYau52t5GdU-acu|d@5}6|!oc@8)cbS}l4{wMv+9z(r9CBfr(YM$OEDYI+aIYt6>`bz8~r7wCtduwe(K+S@DZ0Ub`n8e&$Z4^Ji;E+fU%3e&}HG^-9=y&MjB1(pTK0`#zU5tSWr{4 zf7_wMgXC*WgKd2r&z(iG+EgDLWxBLPS7JkDC%HgAG0Ec?U6)&hLH}`gElD2<0pd$ef zmWtYms=!te&I2zzD}HZ1>ERY3K56=pEX_$kQTYWy<)FYAyo9xrlB!|@JZ6K15=S=p zB2S1=q9TQ5K95kzP0$yayiZSAS&%peoPkgi8C{V@uVI+Ky%##z1_(g6TdS-$N zaDBEz1NC@6cdPLiI*qbb^GFcOUx|a}P#0 zzWEplMP91WVL}8$E16qYdZ4W`nx?hitRcIhF0AH+#$V;+{`_Rlb+GYG@a;52LVNk1 z;@yY$J48s$lzs^Ldd8Y;Z~Mij6Rk01O4g&Hq`9_oE%vsvRZ?f6>LHH7^yzJ|Jhbn@ zszLQ9CuW*VnwWH^%Al*PG4^8X6;MHtBHs2|*7@`iQa+V%Il1@%gS@1>gd~qY@7}EO zb*7T3RMo3$3V_nDraE$My@ZJ*EG{ZQOBvY$&c5(?@y@BttC;3Nvn z*5VN=T@LfO-e8PPqDyXW1m6bz4jfFKh;Ol7%@fY0-?nDkOtdB|iB25`pdKttaOBzQ zQHzcQTw1wxA97aAr>ycIL^>x!_%kK7tR_? z8w^*p<`txezSirY^2R*+On}xAJLnH6(4c7Ep+dLiV1bQdL^9|vqUg#k$?T((7r8%l zr?BKHsYb0KI^)ytXXgL}s68_N!Js%PsL_FAQmuKj?;MYXl8KjoXqRFu--E8{NI5@Z z3>S`{;`#mE2O!uoclo~UK`J*ZqdntCW@7U9*s7>A(XMOx_kR+&;GLHHj1-n{F=cKJ^NvN4&7TaV=$4tX1s3cF9M>$ZDSq>Qt*Af4d{X}*6 zUme&=7q*BCTq+St*`(v1uG(VCsYMFI^ywtVYkOObWctESX3MZW|o z!W3fIO8YUoEU89V26OHMEftd1G<#r2qIqY*B!gQAdK)1S>?l`ePFMdnjib_XtN2a| z#!t*xUJlz1EidRNb1BLBeqgyZ{ES&yLGEp&E^UZ3p?)deZoYO`an+QDE=!J9IK)5+ z;l{W9s~lu@pM~ZNuc@AmnC6DSKAai|?bD?HlxUY^>W6qE0niMiXa= z^2j)2T#?GAk!FN7FbLJipi&wGMoNR3_P|bY3>qWj;i&a&Vn)rZGmFO8PiM_1>hZPo zaS9ld-)n+A>8pbybJF+}oRB7>oTdQ@3>gpl+bASgh(<;4;oO$W#zt$Y8O`_tyel2j z`%ie>T4+qB9Cqncp_&rVy{>E8o#o0!zw{2l*OLMDyD9b-UmT4vDSSeJqN_!$ly{z9APHvf#?X3@S-ILM>(bR4XPLq0 z=Dm>S&uKkQ$d-c)j?BM1wnI(w3|=hDn5MEtk|OW!BdC!33J<;#Q@>;DbbkK6_GI|- zR?db$3P7h-4ykw<{MC{dS6&T3{??R*0)09MGqy+T4}Je5W2^TlD#{VZWkWX5!#`G- zErkg1;BZDa95YL3TgW#FjPN>@@pTI$P!zKQQ^eZme0Nifyc@?%m?O+{up%7h_^;X_ zf>r852BMsmEMXUyGq|rcx#WT^g8_FkQwR-9bd-%i^yB2<;8zly@Gxn=v$gEh>`#Aq z$>b!`Yg!1+tI9EZWw7I_g0G(YfwB#$07yL1_jBg)6xArNVGVvxViB&bX8FI^<@z2O zu}3o7WT_OgS8T9=If^kZ9^~%*8hq;V@SPUIFAlZmvhcZv>s*lm5(K+(C?e72$Fr5w zlzyXH&C99#EAEMNRjUV+Vy2en7k30bc(gH_{t{j2H0sPc1AMkD^<#6Mz9&r2EXIf; zvHVPhOP!L;84B;f;$b%58`Qo9W(HqWikpVPME=a%K6b!{*rN;+21D<4vgcUuEs|XG z7nT%n6ECsat%9W8nx4Eq%~SyIlD0eU#m^y;f?*X>w|AjbF4W9HrLquvT)q)MhlYll(~jZpkN;Z^Zs zBXdno;;Vh1A$OMO%MJhLq?7lhq^mX=wF;sfWr}9s-kd$Iri2t7zKTxIRn(G>4u8*v ztb%P%U|+d|OZfa_iSlXpAIF5h#egmlSvC(xq=hE?Bc=~8`LZLKjIvkXSgeezf zf%Mxy@^o$h{hNZ?3>E-X$H=^Z8*>(t-7}kQq~5<_h8;tQhe{H+%o5F)n4dB+9qF=u z{#$JQaF)*f062bLI41j7SNq;CBFVgV#YL0^!pDXHiFQyTjB^ECvD?T!E+|shXJ-`8Wh3 zm$|Z1DxfNc)#RP!BEK?gZXchEGBzNUntDfQq(w)oEfg zEZ{vFatd@_&ymz6+6^usR_*tEB&JU!=Q#Z4zFWw?LrJJ=gj$`UNycx;TJ_z`b4JUK zP?J#96#6nDn1HEV#3;bvHUrfbF&=LXU0gs%Mo>L&M zZQ9U=vZgE+^LuHnl#tJ*ns zGiYj59xF{43wHfI^X;#O{hp8Sb^5SeB*$iVa8AE8irDlYPjW9mC|o5c5$uVcEBfTj)fyyEM;MNjG=%GaqpMUA z(U?@)XiK`c{tS@NljdPdI@m~_p|sW#7zqdh%hzvOyz_z1ilmh2*OYP3SAWpwvf1^U zAvvM86w!p1`LnW0WmM5&-7lz5H2<{I@iz`e$0!I%8=UjPW#gNqt234 zy{$ue+DrVa>4gcp)5vncJq3h(mfr%|xVXMTJV9f#9QoM{n{zAdx1D@9HvkVwf4ve0~s|Mgj~8Z88^)t^vZMUFy4z1+g3R6|BjKpd;f zhT@+7i#fjz(~&@guDN!N;3&-WL8`JFpQelX$R;4fgrxFC9vWIr(gQl?Nn#Z5z%9iG z@nrK;dBpiO`^AigGF*2k)`HGlmq)1Wl@XO|F>Z*7SxhZei9l z$l<8S3h}GZ#X+L?;_35>Q}i_Iv~^~|iKpo>lmk>6qz%%u=#3+)Rz2e(KE@oAe)v8n>9;4&LWJ_M6HyoA65 zQU64HFk*MM!RMrzxHjiLGuWf-y7cPI`~?XqR708}q`iUdL}D~ylquW}&NN2*<40+5 z9?ZXGoWni>UKcDIPA`&MOEIu{*66?!ow70oc72;u!zC~&S|go?OOc_!-?55X(R(r* z3OIf4mb0AW^oRg$hU1${-hTom)EwB&97)cOmc`>QZj_;iwV(MK5{8f~<5iqqF=nYb zU2I}w{OPndid8e1|0zpHrhhobjkN!SIvU;rQCNylE?@yuHGL(%fVqX&c`>qtfIBa? zZZ*uFh~&hsKq`36k5Q2g>gqUe>)Y>BhD% z;$I^g>3Y?wh(8fi(elPBr4Xd473tbAT5nfmZ@wC+t}GS**#i>zzCxjjZ(pSM%j+V4 z)lf}U(?yW)t5TE|-?m4D5rHPbo6`UHn#zqqgO`SpTEAn6a3^-}xHSy)rW(4eWakF+ zCZph|A{Zi?MU$f96%~?>MRUN;#P^f$oXpb3Zuxe_tAQ7X#;DmUUMrbnWpi-Ed+dE%}5XvGGZXyf0NK zE7DJbJR=KVYoC0?s7D|fT6nOAAAT@NZ#S+yR7IK(^|WxFn-Bse#1OwRz3OE9${O0o zG4ru41e;P^gfAUQ7}ngBRnrKE2_W_~9vt*kcnw!?10T z(I+QK{LA2WbBt$6um2m{LIK0?rIm{?{O7@n|JSuD$$=NWz`HZYUwD)$DmFNOw1_TOBx~!y$b8<+N>uSd zK>te7tzr0~Mx9liYb|p*CeUr&`NuWV%FI${z&DOCn9X|uri3ddLsKhia>y^Aa_`DU z)G3ducG!22EO7+R($maGdy(iydlqY?1XHvT=m8aJm_4cyo$CC;XW3F}ofmP6GjA8? zg!UUyQ}#FItd&ALj)a8hl^;QV8i3%eI!!rnEe1%{A{F%BK;LxIXL8bA%#iB!@%$O^WI&RbsJ0^w6?sO$#z$z6P>~9|@KYE{w!ipvaC*_Y$Q zjwnPUF8?91tZViJt{LkcJ{eK`!cRmUYbNd|)o4-k{I(Ixqpr(vL7AT8C6J2Pq^o~{ zi%ndMp?jW}PD?I6Kv`-?mUbvyIw|^kq1PkFtK0AZA5^5pf|$&+)0R;gdDTwC<9GO* zS0srTW%jbWUL}t0n?eTudX0lv!MNl%&wBEu9Gi(XF`DvJmc>NGHGM=vx-1cZ*|ZUM zJN%!Op7DoExF?89bM{%|ilt^dAj?CbZ%_*j8xaF99G>64fKNxkU z-@PcOaxOz(-}F0WVyC++T%npz!|tebviW=1CZE~`g_Kgexwmc#)ank_D-1chIip$2 zdSB7MVwjFFSd`GYs4ytrh-nymm;n_BTf8Hpr2w$l#t|US{E?*>gF#Gl?k8gQq0)&q zrpoHeAEugcb&yT=7}zl##BP&Km-XAigcW*pGiAs}*#Z&oPUUsJF2NGP%=-H)FQgJL)KMVfS^3GPNQX%QU9wq5YE=3%DqUGjiMCVo3qo!eAgXTC42g66K;eNCMa+nhH z+)veIm33#C9tu_XDh~k7a|m8@=R$@;;0E+?BiW!8EX|+#vnt3mO!O%HRJ#?`R)P{! ztMpmJiPdU{l?!Uu4IPKesVGpWpif)-94MCR&kybg*LwPQ4B%=i9PL@=(+ZNamFd@Y zf77A$SAjnm`j|a-8WCKCt+{it6X1`mQLlhV&s@!3xopb>9PH zLwYTD)G&ISlb61PZNxv7Jp~YHkRba>?!;e7SE=k6KqG%f=Gfr5V`N^E730tUMp8LD zGUE(@+G)^NJY^9mJa;g&??ZstaHEthA9r6tD?0zbXfppcoGj>F-}1U&eg&|MQX?}= zvnZ!rcw@)IYfgGdUg`@N*!2Tg|KY_g&hzR-p!@dg3**-?n=bi&! z5X~cmX6hKwwtrWUdOc8BaQ|Cngm(8g230Pw7fayKd#gJ#l*&tDy8$tlkYSs9_J?z* zS^I~J=%I~NOR1tAs(Er!yq#%iQJTKkAlaUbre*v5untZE*$HCd6?1P&v%~wjtK1o0 zj36WI=H%XqgQABnY10{m#k23laqWZ$O5%(;;8434eSfGEhLaZL0@J^KUzTe0EME>1 z^K&E?!w}LGAEb~HwNSW>$rfM7uzE@VoFRfK3|1>k4L(r0%Eg+^AB+*me+JqV#ZaSGUMr`PP4#a@0>?K&3tdM9>@XZ?wDL5XZq*}B{f{27M0T0P2AEhUMCBvU7qV!y0 zkB~d14qY|S#LeA%Gx-EjfxONtlo>>t*F12HdW z;Jr^KI5$g}UOEGlQB>xe8=6{fVl-8M0&{XjP|RNIn|uZssq* zvut`?86IZaVs2-cuYw0jl!*YGjeJUIEBq7_-~obe#O?k0h04nOd``$A?6V& zB@>Ao2oZn@Lji(`*B}983gipRonXB1L5U6f8N9e2dMfy_pj@9cY@yo<*_|I&^l`J4 zFJ$FfjL|%TE&M3y82|*w1yE&#QA?HJD%~CxB~-v6i0{gJ+Xqu3EDC(v4lwsXL~+oL z`JlmgWO9mshf$nBHqEICwHgo5CG${Lm$pl+GaF8vmtXQ_AYzP<{GnZag;|?v+^)?D zy*a*65Xa3Cf-P{5rOjf?2bi>NShq?xRPJuZI$K6s22Se#KAm7rXw z981Qhk%laj*(3+nB}`3onLKdECm1q=qzC+rE6#6_8Hq8pZGFxivqxv^g5F>(*vsEgBafI1M6(jYVoXdJ zDenw9Y4aZt!U95`auMHw<0G1*P>z36u~z3AQX`zQ`9z}mLa!W~0t|Mv$twssEun9^ z*GG-p5^$`R47-WDBSsI%12sCTC!I{yx(265o_Od1K8YWf(w=?$99;qZns zOGpToy7U4iJ=ua3k*M@S4tpGDcpUP(WTpqwbVAvjlbA_Z)M(HuA{89}k#X0vX2*D8{(6Z0*7v#ID(4?)iTUY=fsFf z`?w*J9g-?{Xcli>>6))QZt>_`?(xFoDg?GrvL(CcARu`$xGD8AkUmIl{pp;CEZ}Gy zB`n!!1|PTqn};ft6;$1AGQrpx%0eL2NrD4y5-}S;G8Kc$eZp*Fh`np5!c)YSz!~B5 zQoxug`EwlP6lIo#PMT;p81XX|1YoD&d`7YI=L932)j-}WA;ZxEU>3W?o$^{Wbw*8@ z;r6WuiEt+raKs2N9J^IND&|s59(D?~enR8L;bHUgt&kO>v-q zXk9{ht!CubIUf0d5@t$xK_Fw_J>PUJs9^)IJO=B*Q$IAt%p{SO&Y`FO zbQ@0sd8{i0ELKlQvGp4e81BmuX_qU8y{hU_-&a}Qca1QUp4fl7N>^72C@;fGV1Bpdjlzl%d=U&Id{0Mi`f z2>>XoWB?4kMuuNOnI<@j0L-yO*6ov}HbBly3hYJ@l4>~xy&Q=W8Gs3ZX;y4-fUqHx zOC6SiKZOiBI>KVdvc_@qP#$S~8gX(!3xOcCf+cMu5(0LL2I4kqDi{3<;SP$^%xIrU z?ByleIO~$efrlJt7?Jap-1!khlZ8x6E036tS^^ZxrOXS9eI0zd&7rohA~YalA8`$I ziwNkMUpq?4LaBVSE4c}o`l%{%R|U3Q8@N5oOIs_;MC;$&-rX>;QT)*WRXNS`I>$Fc{a+pC;1qSd31nW$%6sz^O@1KJ=(8l zOn{e)(J8gCEk`d5k*#T8fuK_DsYV0WrNk&zx8($+a*4??RO-(^I0IAJpb}3YE{H@5 zdm34lAhRcuw~A&mvx5w(7O9Fv)Noldo_C|wfYM1|MyXVm1ZuzSNp7=$0wCNNty&R{e5{453^`uK+Z`Ch2P zgrceRkqxKsBzruaqPKif968J9R}p zG>`!9$CzF=9V8@eWXb`hoQ4Z5S<1m=mQ=}d3G-_{T4bZSV7l%_iPGVdx*mKyL6hPI zxdVl(h%yoC*UX2g85B{HX*p1N1ZE`-bx$;hNHoZ6LNAo_WiubzQD4VJB8a3@lZyKs zt(*ltkS}0QLb7@MI?21{9Ds+#jCaQb4c(y4vVVhZQ7}x%es>vJ7vrv*YC0ojm_mdw zQo?=2@i3TtnL_@6_azXQQnDf2!&2*Jfeb!~>etUIiU|jc;O35H zNp^3Ebc`C&;aqoYJ$nBqag}!XI_%wEBSJn`N2Vl)r~n3314OA!LLKW|ILW*a1aEI; z35AHJL(kwd)lMoxLT4O!)x|m=#e=SxcI_Pde@NppQ$N)%a28}-je9R52q!EeI5d6f yAO%>_w$5dQNWq)!Zi-wB0EMNVsm`;Eo_><-dX$ntheowY+VO4i diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/dejavusansmono-webfont.woff deleted file mode 100755 index cd75c788ab07394a27fdc7d82c922de1a1c7744f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23040 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 z 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 I_n8g=02>8dtN;K2 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/fitter-happier-waveform.jpg deleted file mode 100755 index 20497b7ec7638876d38399658738b4b99b63c1d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12510 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 xjud4|RJ?+w%$GZ`3do(maC!UEvi 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 ^c)JcNzP*u2ic$an2@0ILws_N|T= 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/flash9.png deleted file mode 100755 index ad08d03e719156dae248362e9637cb85b4f33638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmV{2?{}i*(=npME3wC6OwO==={#p@3r|u z&y_snUFgyURtKyOSRLr}6GTAh$tJ4}K+ooJ4?g(l_DK`K>)Ras z>$*?DKW~iz=m@+o*~l*t&`kF^M;G0?Gz2OgiEU0+RzN_b%ZTgpTLOVb9Ve jMz3LY!0O;M1& diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/glyphish-dot-com-icons-and-android-sprite.png deleted file mode 100755 index c4d7b764b2944b078734a342be2de417c175b3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1895 zcmaJ?dpOkV7XE%?#{7tKO>JS2+)B1-t6lD4BD)!dlG|vGkbA{YHp39Ry&tzo8qA~+ z5wb}x&4`-XPK7Zi$0#$d<({_tT+Zm6zt4KUXFcnA*Lt7zerx@)ej}X1Da!vK4**bf zIpKI30Ei-u&0$%o-*v4v2>`U2i=(|q{LpL(K6BV(4_l{bf`?ESI4 zWbLinr$gPAv^Q>U{h}m6&q?gTFIUMMqH$4P0-m7e@lZ7937d!bR5S8w|uqQ%Pu)XbpWaAvfumFL_(A#ZI@ z`*7UUcKBv>^(nfIA2ni7=T=0^zK7Ompf27W@q1oK5GhXQMY5_Oxlw238b6Z9ZR@1> zt?2S!A86G7fOPWoG!e4HeF)F&74xv~}jpS1BqN}R$!2y9liqTJgI#Vl@2hV+S9*%r|3$G zU?F3L|5A;;--PHWl=amIH_RkfFf)DW9nU*FmWV4oT=GnW1dtubM+3`twQDv@{$b>! z6^tj@8gdfnAsWkm#0WXifV6v3gIPSb^b>M*TZO4%w1I8Vv&*t`;X8foXFhW(?xRQa zO1szJBaDI<$+Lz41_(@Y(2j4T5Ru(ws|?;K)yq*1fnFQ;fN6&lbf-)_>AL1bG0j^M zj-OPYODf*fkBtmx9tTQ5Dh8wSg14jN&hn4F{K3}=ccs0{-mj82v7B67?>v!Ce|cLo ztz*76DfR+_#~jmkh|(E~wO8I^MrZJ`1BxT=Otexl6%Uo8!LVW!KS>_!nS;P4_BgAr zUEPPqN=Tw|6-RwR&XlJOZi|=09KHAP2N`f)exJ0PM~Eq4SP#XGXB8X}aucjL+5I&Tn ze3h{)pwuXzw5t&LhB|`_8sEj*Noy`48Ig$KL#ZQeL_GVulr2;r;(I(8F-8!5LGLSB ziut1Tm9f3wvxEzv+b|<+ao^%689RycFMigjt8&_MK(KDr)u)e#LXRAdLTD^G$x5}h zbY-*^nV%&T>BvOLPLdd;>k5CL?a@l~4nxgx#*CoaL}SC4Qo53GdbqF}fIppyQqn^e zFi;@W3ukGJHST@2VWzfR9cv$Wl_ zGj$5h!*LTo{>g5r9#s1lyZ~4fQE`NHr6P35%dAj?{V*2pl{b^~KDb%7ShbOV0$zPo zJxD{h2qB2eXWead|I_3D- HftdOq;(1m} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/hue_thumb.png deleted file mode 100755 index 0492e8a0d565c476e0d99cd424a9a2fb0b652fdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mbUj@hLn;`PfB3V=yy_}A>8zpA z$m}rHams^D?5lXv_~d?fm~?KK&G9?0(^b diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/logo-sprite.png deleted file mode 100755 index f08a6705410b2fd854cb7413531c9d2fe8cc42ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33987 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 R;a2}rtxloLi%wj*|8M6>t!MxM diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/muxtape-logo.png deleted file mode 100755 index edc5d35fe454b5e2a79c982b827bb2aa9146da92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3224 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 KMNUMnLSTaTL)zm2 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-bw.png deleted file mode 100755 index 8c60abbcd8b90a9f8fcacce8b6b5a576cec4758b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ez!2%??1H#S&scKIb$B+ufr585x9#WKW`B;C$ zJ$=WiQ>-@*a>g{@OYl!ms@xp8_ngcA=J5Xy4s9&Hv*vK+S@rD6(X;Q|dJ=X<^O;C- zm*v$THo){H<$tih%kt=) fB)|JR|Gj5^W@xhep;2HG&>0M#u6{1-oD!M<+15+& diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/new-dark.png deleted file mode 100755 index 8d20f60338cc6a64e3df9867d25b244403d94a21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/picker_thumb.png deleted file mode 100755 index de21a6f2b4b9ede823652fbec87d569a6169389a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s0wkH2?q3U}j67W&Ln;`P|D0!FbKv5VILI>N zzxB$bj%OJyNdr_?O2ytc_e zgAKqOsRX2gj^PWWJgFP0o|30#p?N%gG=!7B?`OZPbQWJe_~-t@{>?^i-~SpyjUHz3 zz^gL0W|>EhVpq*(GyDFZo#(%5(L3%?y!84+toUicdhClCJO5t6d3r9Lc;oX1d;8s^ z_H*zeqp~!30Wr_>hQ2wwesb^DUY>EC#TQc)pO3SML(CRTSP2r=GcJq0G?rNUxo0oK ziwv@gLAYgo)KsNXnY{lOy%l7~UwvwrIb%_rfYcj7g(Xmn-+Rn&H!i;YXfoU=6be;2 z=ty~>lD?2?wVFQRGfUHg+vgs!hkYhE6J)*`ezybB7tA6jQLI)Uq$RMf7z7~G&_<)- zHZxC5(QQbzJ_(yFMnu?<`S4jNxCpr<^5`fs8aDWBShw4avNX3Ye9mm!l0a;Ok@>8# z!w?FkhX;2VV@1qwK)>G)GTm0w&*a>Z7*W(>BqWZE-<}XCEaruRIqmipGRUHJGlK=Qn@bBadm%I+wjVwM|Ch$S0rc-+G__I`{n_KMz;Ck;KOiAFb(Uo~>tKum%7; Caxka> diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/slider.png deleted file mode 100755 index 320f987e0b977c2d4df09e5eb8baddc526713ffc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 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 F_+S00Ar}Au diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/tiny_grid.png deleted file mode 100755 index 679051dc4973018277f08a5400a3aa8f66d2845f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^QXtF$Bp7-Wg@u4rzNd?0NCji>#EpCh95|f*{(sM^ z-fkwPSGHoF&e@~l3ub-hDOw?({HNFOPe)@o&yuvRo$9lewmJ!2sk`hlwLe7j^yLle zQx?aoen~pg87JIz>3Zt=ZQK*D$0;3sU+)~d=c&p3m38qGt&j3I@49j2HDi(d6wO-o R{wE+Oc)I$ztaD0e0svqHK^y=8 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wedge.png deleted file mode 100755 index ad1c48849f7848eca63ce722a48313fdd763c88f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 832 zcmeAS@N?(olHy`uVBq!ia0vp^4Gav73@pq*R_FEPDL_ghz$e62P*9K|ZKi~T1dvox zQUa0?5r(z0O+YnlB|(0{3=FSd3kf+Y{V!r*V7ln(;uunK>+Q{*xiXFdtq%|Jw{6^J zB=AIc2D9;mg)Au=8j?PZH&~{y*fs_*nH;%!Gr8~Gu3O4kcjm7BUU=iOugxdt{rl<- z^BlgsE-}b6VA~__r|-<{r~kfvBID)lyi9Bfa+72Y>ciC&7QbR41;Q_lQg@oyj0vos$xo#{I zV9iP9U^cUCVVte-sG(G-@PJhpOTtuFrVU)m%n{2bGU`0`U=*ud!qDwd)KINtdBAp( z%7ba1LIvEa+&h*{VvR}mWY*icgmHSprv}TJHVJ)c3QpTFn-#~UXj@6N)%-eyl9kA60I;v>CWc~ zA`j)-Q#iU!RGcGP6gdwWaeE3(3-p+?!OQ7UOQ?X5+M41C28puGE}XMPRJ?AqC^#N6 zW9AgvCg{<#!P_CJC6+-*>CJOx#Y1&ALW(BKlm(rVErb-dq$x8xWt%)wH&Iuvb1F7? zXKh{l@%}BjZt2@U4;I+3JGc1g?>$xiV(;_UeBXU^XWFjS+|O6NU6)^TdfWazANN}P z73aCWdi9=1JIwe~Cm-Bgol(s*@2~gmrv+~oyt3;~<_|BgdgB{&|Ha0B!M`gG+MMV) z%=cNtv@d$i<||gY8~uu3@7ezEcm0-sj~<-Q|628Lb^X6Ed?5=C^qOD)9@wwlIC=I) T<87;e$(_N|)z4*}Q$iB}%|KH! diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-full-ui.jpg deleted file mode 100755 index d758823dcc1178837533079db971df62ea024317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13063 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

    VVwY34U7I_pH(nE(#nKyTNP(bX`rB8>4MT5hT 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%0A+GcX{RyWla1SO>2 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 LNkvXXu0mjf`(=D8 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/wheelsofsteel-single-deck-256.jpg deleted file mode 100755 index 2d8aeaf7e5e5ef5ef72a539ca63c4918522dce41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14946 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 z 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/880hz.mp3 deleted file mode 100755 index 756e8d93e0e031e1fef58c0abc1771b775564deb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40541 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background0.mp3 deleted file mode 100755 index 3816dd76075329524cda08175c9467d308ffb227..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2160 zcmeH|X;70_6ozj|fEbW9QVb{=AebP8fTERJNGyvW*vJwIz}lL<)im5~wT!>STb(B2rL6WK&eIED1~UHR()k|1ka8AMG=9XYQSI?woVq^Uhp& zB{mTJ1CGp~NNI|ybfEx1M*-?uKx@&w7VsKKYgswdTEy5=T}>MApKuY)EfX*$z=pJnxMQBy_cLq~4PBGzuQIz)Mjgplq9}iE0g~_Ttjn zawxPK9*IOo&CWKV7&>zL}`h(8pV zK|Dg=%}G{B_;Eo1^H$;6k&)Jdj1b5ipee-7`Y2~2LW#F5HH)Mh^_7H!hZ zMPU?mgTo)>fAP{N6?e7%!=|B#VP0x<(PKuA*B_yhEa?@Bu8M*jTjroib`@pTvO=Ln zKY5ly)YjQNi^rc5DQ9HK*@@P3dr)oa`LlRxFlx$?7OJTVo2hY_F1wlg;^C5_{@X^6 zjfPinSQ^E#37+rU(fkr<=(rA9$Gx2{%i0juK1X|M&Cu%(lg&#RVjWHxm@(&~^r#1K zd_W`8Bi^1E%Z?PKT%7RW-oRkDL50Kvd1ubM*uL$`Oc=a~cekI0sWtpG`GJJAiVn16 zkXUnn^mIUqB(g8QymObvdt=MpnU1(ne0}J3%O2)rJ@NL(=k-|=@(nBExwb@MH%%UY z?^4CWO;0AH@;d3#UV%%<3C~~4y`QsK&iftx<)yC&0Fg3Y^79aOSp1i8Qkm|GKh-_= zA)u*f5`mCcee(o{(}93;&^}9Gqc9w5>N-A?@ipbp-qAzwNf5=5C<}w&?VtTS_?uNQ z7LBeIRc-Yw&xGSoPt8o5*sK=Eg0ZG9_10`1C*Pp6!3kUK<7%u1IQR9+^5^*`3ko|& zdMzHhnP|bbg2QRg?7~vsaoV@0ynT)GlP&l$9EH$5%Q< zs|($aYkC(eb@zt%=^Ne1OnNy)PRm~@IVrIFW^vf6fB9RlNe@feyvP9glI{I*Jyk`Q zYqeaQipWNsv5pl&h|{H81QvLZyTD?da&8FT#KV-sox*XlsoGd#IejtFM-UnEef8YUuvha{ zUSl=Fl?xKX(>lH)dcd^S{RZ|r{@iF@EoX3aS;e2>WG{G7`!Qm4sJ-cxSvVtd-=I+# zuD)NG{|VMW&CA^Vk!4_eZy7Dgb`PH7ZWY5V zw}HjSnzR6&hy{vBHYBT~`t%1$6Wo@)&z?evZ|Sj6Jb6*WCdZp7FUO{G=@f0WEJ=~x zB4TOIkkVfxRX-=k^S#nV7%GP|4lno{*q+Om&5H;j3~|0p`6?87?6lA090&r4B3-G{ c0Blc$01B>&`SUBm69bO2{7D}F^DimzJBp@V)&Kwi diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background1.mp3 deleted file mode 100755 index 9e9c63806d08da756f08ee10082b6757627cbb6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2592 zcmd^>c~Fx{8pgjIKsbaD5XpcfLJWt1a)?CK1d$*JnE;|3q9GucgF!?g;YflEMW|J`3zcXf4lRlof{Pj$cG zm&7pOFK|B?&QNU8QZyw1P{RUt-y!@vlzoTm-vRt@6lZPpboO$!vnFhyLyj*+XlVlg zx-^_p69oWhOL4T~SgA`3|4)El^@7v_zBd4phC}}YL47XZx2VGI-Yd|KIBq>}F#=r; zK=j-v=9JZ-$mG~9@01Z2B7H(B$mVl^z{wI;;wW>c41lyma_b>0oh14!~xJ>I5bB?O%+(d=*%vC1n@$2 zH#hU@c=&`Hm#-@bEl%)mKa<^Jti?VV$%P*>@Cc3M3o#Gnw63jTtyv*gEof8&Z~+9% z(o)N;bCl=k2hr<9Fu~=LwUI&scz<_M9T45FWN%AsoEf9&t zk+jn}ZT=@n$}m##hQ(0X+iynteE7nVfSjNA(V%Dx23s^zXCK7_s7-y?V#HXCF5Z*Qa?;&Wh#+H zTHw@RqC}J%5gdukp4}yyUsUJiWO1v(sSB%)wg+KN)Hk-;*UuBp^zd)o&zN8`vd=E* zrOt_`9}Aqq1Dbj?UfxU=faEQUsc&pKVGQ}HYXq(mAD9)d{No$`W_KLxeCkOiIgl^! z&YD3bc=uSacuD2;l1I@vU%d9Vn(g&DmF}hyCvW~xoA{*uC~LNy|I?g_(8;sw+M`E% z)1@l4^9SalUdMC}3;XuSBkIl#GD2tC5__YAHamIWlX_XTHQ+8gwW$*aol!3?;l4^L zr8T;kWwt!qQKLw%&xNyS2)v?nEHBNMA2~W%f3So)O50IYw;U)t__(oS=7@5>&rnrC zl^l(TCQ4g#DIZ@uKoKHkBSWLpdh1mz4#|8_MvV)Pvt4f=S?M(raMLKdbBsb7Pm;(= z;t*$b2SOiaFjA;>gW6&Od}pw2hAMyge&*o$;<$Ki@9DQaIiu1KM>GK#T(jDC8n#t! zDMY6sbwc#T_SQ?~!Cptrd(=Z>i++*+-hMsk{&U*w#L&lv$+&|F)FHwHoL%bLm+{GM zw|EZ@u>aT#E=n%jJS9w6cVG;%Y_@*9?O#8!r~w(UC6lde@=Q1Hc`nGYEEJO?0uzen zHV8-O@O!`|y$I*ekxyDrn%MSoT$$F z3^V^``Q)G7qDDBe%#@F^_O z@E-e{QUB358@rOAj3S@A!B6H=wD$(I%y(901HLVf3O_+GQD|K!+j!NUf@EKCWniK2 zL`K=M7>grxGsC{rCmxgrjG-L78weupg#+s}6E2)n;Xv>mtY<|-q10<{05ftr)fQ6+ z=L~wxw|BVj4un6*K`lcdDf#tV2MHR}3FS18#laY1Ua4a;BwA?< zyu9PozFAo$FSfacK2%NTbc-os2PSRm5R4CB7gm`OH5}PnusW$mm9e-Sy{C$3vR!y{ zR!~A#J$=XYt6rQizxW5tm&ot1|83sIV~c3#t~%SUX{WXo(v*^* z&;C>VAW#^1c#7Q@5cs0PV`F*s+$5%QHq(=PHJf_v+I60f*fbr*|YMHYKW_qlhW;@ zewJC}N;-9S)D^QLiGa7Z&bBnLcq`*eslK=rZ>*PBpySpi0w*&s#|`nG`RMqcX(%i( z*S^QU0m_EMEBhi@eg4QvrE~LR#FNMSs)*Edici)wKW`w{GGW}6dQeqWa ziYuQr#jiP#bKKndwmQ(7Y!4wpO<)2Dg!+-Erx#pS@q#$#H|&=f-cqusCfY2ZBe;vP zl)#YiHrE(e%B0Ia*}Nt6Zh@khfN+peFRAU|`{IW5u=n~i z)anw-wmcZnT3}_LX9)deTOlfU(=rt%ZRRcN>~IyT>7UgJ){MSCKE%A~f0I7}b(L$5 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/background2.mp3 deleted file mode 100755 index ec251cf2b592270798fa861cd9e2e072429d2ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2592 zcmd^>do9My#?UmGkx{~B#2_SZWAYf4JdTPCX$~2g8RK~rc^#QyG9J~T2?x;` zMjDUFJ5pUk$|Dtrk|-jF5Glzce%G9{?pk-P+gkVkdp>LJz4lsrueHD5@8`SM+TdC= z75E=GhSGo9Jc8OBk^q3f0>(9*L55kYj4V1W< zzdc}-Rzp-Y1D@X#HSXjf^a0&oLZDVMI zDH2iz0%1`m(!7w$P}G(FYi?Gc3mGso(1Xflw2o2?fsXq>nRq*cEBN4}TUi1x;zcff z;`2ljnFD@t6*pZ`Cu@{~SC)~IfQaKo1VV@&b$TW~(J)p*^}JlK;YV#X8AN64;{JnN zT=UxqIp5*xByHyMqJbH1@)uojBX>w6;Lr|>=QT}@J1q|oMw>+qA$rsuT1zs?Le zDy-b<_bIrYRq^`j(ujVr89 z7Js8IZqIZHTRZCoqx0Sv*ghV@3~^wtPr;*+?>r7<7cI?~+ou&ZsN;5$3NqZvv!^r{ zncYV&Sx1}q6Tz-3EZFSOKHldRx8F;72 z$9|ov-*8H9$I$co!d~L5^YQnBvTklnfZ%}>_QO~#_xO-Se{VUB#jv$H@F?9$#t3yZ zU!bw~+1Z8LbwYeddz;12-!xw#Vq)R@zAk8qjw!4+x2>YCQ%C_#n8x#F{o%%QLZq^2!#kF-2vDRnusj8!m` zBNUYS!A=?$;o;unc^V$YGqyiJeAAmu*UIot(-4;!0H9_MU`l~c6V-rIZPc_a8g+J6 zKB=C|o?gmSR^JO+c5(|L?!y*Vr`;sEv2isyX7<_Bm1q_?B`1Gkb>%TpjwEBnxlnrh z)^e}9ZYoP}I5>iXdXKpxSVla$9d@(eLj3Res{O?S#BVsL?8^WaMNr3P^FXvfuuPFAWuMHb`P z9bGXpc;HMnm!8Sr@YTZ*lHNSx803gHYi3M)X^dMg z&2@X38*oi1^icL3RqTrlQ1`}@7icQO>Mer;7cFU2tmK)+t1N?9NX14K7JkV1;Khoi zcHwWc4CUIiBmKb|_0216-tud*IhwhOQ9^B@+suWguQOaPUYYZ1LS^^GeCXk)>v}k9 z#l0(7*R(8Wu2iIZlr!@N?CV}Qxo3`mht87;W-9tUu_uQc7oy)QmbP1rmrO7$W901A zZ?vm#=77_@R2X;|XW0DLa}v+%s--p{7 z!sf2=_-@59JJe>$2H1}NFQ;z08yius>lZ)5jqfl$B1bK#NV{T)&*hqzUZy)m9{=I< z+U|M}ZgyaN+`^Zca|711pFaHRe^=LgN$Br_PqaVi($%;v=31y((9XbcCddPbhKsu( zqTjb{HRI$03K7+rdvz$p+YJ(_7n#Wtt;yg*YpA~Mu}{Dh9tL*FX`+?DkBScXwGnW` z#X)r|62f|%vYB@P-vN+@h<(KalHtL}uUliGPW+YLE)0;CKcsHi20-Gn1zH>fI1-Bx zWxx?xMzOPX5pn0sV;`3$B~+OaYz2sX6B6mwvir-E#U#Z7U6B)V_mkNHu8uA>?V3w#JE^oMKr}GgPe9a0dFdFS(daTL6#AU#ahNv9%44w_$^_iB z@>*l_UH1>9TDhOkjqYwATz7Y$u2e9POW;2NCok{>A4yXwyIf2@HD=0(Wwl}hM15_A i^@+D+Pw&$~v{j?eZab0n?~e*r`!p@WcaQu35&r@ul`FRZ diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_mp3/bass.mp3 deleted file mode 100755 index adc281f930d21404052a6eedcad81cea68af34ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106161 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

    ;}1%2qQ3Ocdnd{6uTPW-NoIBgep)72m>E<>~ME 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 ijA|!)sob>;$VVI?eVSK9M?`HmGSbQ zb|bSqre-zgWQN@(+fM9&0vdM!LQED~OeXsGq{O9xG2F4>Pc7pUhuRW?W~KyGf_JT* zaPo@MbB09+{(62;FvQaMCi$!vD9RC5(?3%Os39;v4Px={^PVa=UwL%N5FzFVxcDAKgb ze>|am0Ms|p`H!`nyd?Z633)5hT?=^FHal^|Jpm8f@~B(*%TGgYk?FkdzgmwE^OYjL znkQ@Cyj_M$_L3WYR+zfHYFQdOpqsJK|=_9fytF|~)E^*uP z0KQQ->W$$)1V^mXwJAl|PU8_);z2H0)ju?ZVj9{gm$U))2JOB!uS+FLq0%qNiC%%v zz(q#Zf3AONgV13O5;7)Jl81I~4=T~x5bX>d0cb~HmkrZuDkQ0K+|^d#Bn#5vnXhFr zG|Z2Ko?1@U%hasWYgZi8C=cHqu3oPVK=|8HVYQf;(%WL6m-bs6 zMn!MRl;*JVMila_(pp8(^WMS=LR_CwL-OiGD)Hda3I(ili zGK-hADHc=OzUS=7QeVp4iVc{jhr_4UwHat5!6Z!RD%KQ0+EHf4;o5I|yO2@4NhW@A z`4!%zYg9ryt~xXJxPJ4ts=y}q2e&10T3q0X$8nFp6m;1RVBi$v-vpaC=^=r&a8O4~ z@x>BxdeBSBA-{HR$zdxzW5_gEB@Mo?9Tp2E9DbKB@ZuzTELOB**iog;)w3J7O1|70 z^U6y%wo@8wAl}lYyJYtLfhzDCVGJcwSY50wYhtUn)(lYXRhOFvz1b~-ATs~52jK(+ON3a$mv;m@M_y=Cy0?wz&Pp+vU%AUa^I?F(gqZvJf6R z=tRHRZs^f10nSw#lQgw1O!wvzBoBXL*AB){hm6NxzubQdV~`9ePU4rc#4g!f-Qp!-T9BV39!$(`r%7ngKlU6OT3i%U zCCKhmHjoS)38MThmv7xd+1>Xx#dF~|P^_q#`~EWa*4)@rB-dT$tp1rj`jokPYp8Cq zZrW7O?@e;$>Hq+pqM@Pd8i)Cl?DMw!=$2XkdFR9-yyi@!Q=e(V_541Jq4a<0Yd z8+9_*G`rNFGRy)oe}_R=nq7OtdOTLw-QioNFYgBGY=-JrW4g->y?OVnDIorm>bL9v zx?CVRo|qaK6zr`uz;6iX$BUUrSH6TZvNlgV0T0{u5JQ$+pe|g%1^QIuqaV2f>@0Z| zID$)DSfGjzqUCtfI5A{KLwu&*B$><^299Tz^{+8_f$%HHlhixXuToVu= zGu?!v5}BZtFAvTKWNAyFImJ}_

    g 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/cassette-tape-ui-screenshot.png deleted file mode 100755 index 7bffca2be916277343906d731b918cbdb3dc79da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119618 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 LNkvXXu0mjfJjvls diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.jpg deleted file mode 100755 index f07cd01e9ae28191b2e6c02df4c813c32dbb62c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23588 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 Mi^}vm{qOSs03JDOwEzGB diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/_image/christmas-lights.png deleted file mode 100755 index 5600eee6f242605a6aefa0ed9e9a739aba8f6203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 119590 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

    ',d=navigator.userAgent.match(/(ipad|iphone|ipod)/i);if(soundManager.html5.mp3&&soundManager.html5.mp4)return soundManager._wD("Special homepage case: Flash appears to blocked, HTML5 support for MP3/MP4 exists; trying HTML5-only mode..."),soundManager.useHTML5Audio= -!0,soundManager.preferFlash=!1,setTimeout(function(){soundManager.reboot();soundManager.onready(function(){a.innerHTML='

    Support note

    SoundManager 2 tried to start using HTML5 + Flash, but rebooted in HTML5-only mode as flash was blocked. Visualization demo features will not be shown in this mode. To enable flash, whitelist the blocked movie and reload this page.

    '+(soundManager.useAltURL?'

    Running offline? Flash may be blocked due to security restrictions; see troubleshooting for more.': -"")+"

    ";a.style.marginBottom="1.5em";a.style.display="block"})},1),!1;a.innerHTML=b;c.innerHTML='

    SoundManager 2 could not start. See below for details.

    ';if(d||soundManager.getMoviePercent())_id("flashblocker").style.display="none",d&&(_id("flash-offline").style.display="none");a.style.marginBottom="1.5em";a.style.display="block";c.style.display="inline-block"})} -function startStuff(){navigator.userAgent.match(/safari/i)&&(document.getElementsByTagName("html")[0].className="isSafari");doVersion();ie6Sucks();fixLinks();getLiveData();doAltShortcuts()}document.addEventListener?document.addEventListener("DOMContentLoaded",startStuff,!1):window.onload=startStuff; diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css deleted file mode 100755 index e98629a4..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.css +++ /dev/null @@ -1,2926 +0,0 @@ -body { - background:#fff; - color: #444; /* scandalous. */ - margin:0px; - padding:0px; - font:76% "helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; - /* wacky IE 6 horizontal scrollbar hack */ - _width:99.5%; - /* a little fun: transition font size with @media shift. */ - -moz-transition: font-size 0.1s; - -webkit-transition: font-size 0.1s; -} - -@media all and (min-width: 1280px) { - /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ - body { - font-size: 80%; - } -} - -@media all and (min-width: 1600px) { - /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ - body { - font-size: 90%; - } - body.home .sm2-speaker { - max-width: 226px !important; - } - /* nav vertical align tweak */ - #nav > ul > li > strong > a { - padding-bottom: 0.5em !important; - } -} - -@media all and (min-width: 1800px) { - /* holy CSS3 media queries, Batman! (in this case, larger screen widths get this rule.) */ - body { - font-size: 105%; - } - body.home .sm2-speaker { - left: -2.5% !important; - margin-left: -15% !important; - margin-top: 20px !important; - } -} - -body.home { - min-width: 80em; -} - -body, -#main-wrapper, -#nav ul li strong a { - background: #fff url(../demo/_image/noise.png); -} - -body, -#main-wrapper, -#nav ul li strong a { - background: #fff url(../demo/_image/tiny_grid.png); - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaAgMAAADUJKRdAAAADFBMVEX8/Pz19fX09PT29vY9qbYoAAAAaElEQVR4Xk2MoREDMRADrzSDBQcEQj71GBw4kBbSQKp4YBBw9PsJyLxtsR2tZNfx/LyPhzX7R1Ue2SfjKlicDKBNdpBXsz790Nj8kUlo+WR47PvEPfY+gb7+kMhm5801EBsLvq/z3v8Apg8pkRmgbrsAAAAASUVORK5CYII=); - /* old IE */ - *background: #fff url(../demo/_image/tiny_grid.png); -} - -#nav ul li strong a { - background-position: 0px 5px; -} - -/* below block commented out as it crashes YUI Compressor (as of 12/2011) - moved out to make-rollups script. */ - -/* -* "Chunk" font by Meredith Mandel - http://work.meredithmandel.com/#379252/Typeface-Chunk-Five -* http://www.theleagueofmoveabletype.com/fonts/4-chunk -* Provided under the SIL Open Font License (OFL) -* http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL&_sc=1 -*/ - -/* -@font-face { - font-family: 'ChunkFiveRegular'; - src: url('_image/chunk-webfont.woff') format('woff'), - url('_image/chunk-webfont.ttf') format('truetype'), - url('_image/chunk-webfont.svg#ChunkFiveRegular') format('svg'); - font-weight: normal; - font-style: normal; -} -*/ - -@font-face { - /** - * DejaVu font license - * http://dejavu-fonts.org/wiki/index.php?title=Main_Page - */ - font-family: 'DejaVuSansMonoBook'; - src: url('../demo/_image/dejavusansmono-webfont.eot'); - src: url('../demo/_image/dejavusansmono-webfont.eot?#iefix') format('embedded-opentype'), - url('../demo/_image/dejavusansmono-webfont.woff') format('woff'), - url('../demo/_image/dejavusansmono-webfont.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -h2.special { - font-family:"ChunkFive","ChunkFiveRegular","helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; - font-weight: normal; - display: inline; -} - -h1, h2, h3, h4 { - font-size: 1em; - margin: 0px; - padding: 0px; - vertical-align: middle; - font-weight: 300; -} - -h4.new, -h4.recent, -h4.flash9 { - min-height: 24px; -} - -h1 { - font-size: 2em; - font-weight: 500; -} - -h2 { - font-size: 1.5em; -} - -h3 { - font-size: 1.17em; - font-weight: bold; - border-top: 0.25em solid #333; - border-bottom: 1px dotted #999; - padding-top: 0.25em; - padding-bottom: 0.25em; - _margin-top: 1.5em; /* fark IE6 */ -} - -body.home h3 { - border-top: 0.25em solid #444; - margin-top: 1.25em; -} - -#doc .c2 h3 { - position: relative; - background: #333; - color: #fff; - padding: 0.25em 0.75em; - border: none; - line-height: 1.4em; /* windoze alignment */ -} - -h3, -.likeh3, -.home .columnar .c2 #about-sm2 h3:first-child { /* silly override */ - margin-top:1.5em; -} - -h4 { - margin:1.5em 0px 0.5em 0px; - font-size:1.15em; - font-weight: 500; -} - -h5 { - font-size:1.2em; - font-weight: 500; - color:#333; -} - -.c2 h5 { - border-bottom:1px solid #ccc; - padding-bottom:0.25em; -} - -.sub-heading { - color: #666; - font-weight: 400; -} - -h2.special a { - /* download SM2 link */ - top: -0.65em; -} - -body.home #about-header { - /* speaker image, etc. */ - position: relative; - margin-left: 18%; - min-height: 175px; - padding-top: 1.75em; -} - -body.home #about-header .feature { - /* special alignment tweak */ - position: relative; - vertical-align: middle; - font-size: 1.2em; -} - -body.home .sm2-speaker { - position: absolute; - left: -1.5%; - top: 0px; - margin-right: 2em; - margin-bottom: 8px; - max-width: 192px; - min-width: 64px; - width: 20%; - margin-left: -20%; -} - -body.home .sm2-speaker img { - width:100%; - max-width:226px; - min-width:32px; -} - -body.home #about-sm2 h2.special, -body.home #about-sm2 h3, -body.home #about-sm2 h4 { - font-weight:500; - font-size:2em; - border-bottom:none; - padding-bottom:0px; -} - -body.home #about-sm2 h2.special { - font-size:3.5em; - color: #333; - margin-top:0.1em; -} - -body.home #about-sm2 h3 { - font-size: 2.25em; -} - -body.home #about-sm2 b { - font-weight: 500; -} - -body.home #about-sm2 strong { - font-weight: 500; - color: #333; -} - -#col3 a.button, /* "newer version available" */ -a.feature-hot, -a.feature { - display: inline-block; - -moz-transition: all 0.25s ease-in-out; - -webkit-transition: all 0.25s ease-in-out; - transition: all 0.25s ease-in-out; - text-shadow: 0px 1px 0px rgba(0,0,0,0.33); -} - -@-moz-keyframes highlight { - from { - box-shadow: 0px 0px 0px rgba(255,64,64,0); - } - to { - box-shadow: 0px 0px 16px rgba(255,64,64,0.75); - } -} - -@-webkit-keyframes highlight { - from { - box-shadow: 0px 0px 0px rgba(255,64,64,0); - } - to { - box-shadow: 0px 0px 16px rgba(255,64,64,0.75); - } -} - -#col3 a.feature { - /* "newer version available" hack */ - margin-top: 0px; -} - -a.feature-hot:hover, -a.feature:hover, -#col3 a.button:hover { - -moz-animation-duration: 0.5s; - -moz-animation-name: highlight; - -moz-animation-iteration-count: infinite; - -moz-animation-direction: alternate; - -webkit-animation-duration: 0.5s; - -webkit-animation-name: highlight; - -webkit-animation-iteration-count: infinite; - -webkit-animation-direction: alternate; -} - -body.home #about-sm2 h3 { - color:#444; - font-weight: bold; - padding-bottom: 0px; - margin-bottom: 0px; - font-weight: 300; -} - -body.home h4 { - border-bottom: 1px solid #e9e9e9; - padding-bottom: 0.33em; - margin-bottom: 0.75em; -} - -body.home #about-sm2 h4 { - font-weight: 600; - color: #777; - font-size: 1.3em; - margin-bottom: 1.25em; - margin-top: 0.15em; -} - -body.home #about-sm2 h4 b { - color: #777; -} - -body.home #about-sm2 h3 + h4 { - /* sub-headers directly under headers */ - color: #666; - font-size: 1.25em; - font-weight: 400; - margin-bottom: 2em; - border-bottom: 1px dotted #b0b0b0; - padding-bottom: 0.75em; -} - -body.home .demo-more, -body.home .demo-more-abs { - text-align:right; - font-size:85%; - margin-right:0.25em; - white-space:nowrap; -} - -body.home .demo-more-abs { - position:absolute; - right:0px; - bottom:0px; -} - -body.home #about-sm2 h4.home-shopping-network { - font-style:italic; -} - -em em { - /* special highlight */ - color:#003366; - background:#e9f3ff; - font-weight:bold; - margin-top:-0.3em; - padding:0.2em 0.25em; -} - -pre { - border-left:2px solid #f3f3f3; - padding-left:0.5em; -} - -dl pre { - border-color:#e9f3ff; -} - -dl.alt pre { - border-color:#f3f3f3; -} - -pre, -code, -pre code, -.code, -.code-block, -dt, -#soundmanager-debug, -.c3 ul li ul li { - font-family:Menlo,"DejaVu Sans Mono","DejaVuSansMonoBook",monaco,"Andale Mono","VT-100","Lucida Console","Courier New",monospace,courier,system,sans-serif; -} - -pre, -code, -.code, -dt, -#soundmanager-debug { - font-weight:normal; - line-height:auto; - color:#006699; - background:#f6fcff; -} - -.no-code-highlight pre, -.no-code-highlight code, -.no-code-highlight .code -.no-code-highlight { - background: transparent; -} - -pre, -#soundmanager-debug { - font-size: 100%; -} - -body.home p code { - font-size: 91%; -} - -pre code { - /* don't scale further down, of course... */ - font-size: 100%; -} - -pre { - line-height:1.75em; -} - -pre.specialcommentblock span span { - *line-height:1.75em; -} - -.block.small { - font-size:92%; -} - -p pre, -p.in pre { - font-size:0.97em; -} - -#soundmanager-debug { - background:#fff; - padding-left:0.75em; - border:2px solid #ddeeff; - font-size: 85%; - line-height:1.7em; -} - -body.home #soundmanager-debug { - position:fixed; - _position:absolute; /* IE <7 */ - bottom:1em; - right:1em; - height:12em; - width:auto; - overflow:auto; - padding:0px; - margin:1em 6px 6px 1em; - opacity:0.95; - color:#333; - border:1px solid #ccddee; - border-radius:3px; - background:#f3f9ff; - z-index:10; - font-size: 85%; - line-height:1.2em; -} - -body.home #soundmanager-debug div { - padding-left:0.5em; -} - -#soundmanager-debug div { - margin:0px; - padding:0.25em 0px; - font-size: 100%; - color:#333; -} - -#soundmanager-debug div { - background-color:#fff; -} - -#soundmanager-debug div.sm2-alt { - background-color: #f3f9ff; - color:#336699; -} - -#live-debug { - display:table; - *display:block; -} - -dd pre, -dd code { - background:transparent; -} - -pre code { - font-size:1em; -} - -pre { - white-space:-moz-pre-wrap; - white-space:pre-wrap; - word-wrap:break-word; /* IE */ -} - -ul.code-block em, -pre span, -code span, -dt span { - color:#339933; -} - -ul.code-block em { - font-style: normal; -} - -ul.code-block span, -pre span span, -code span span, -dt span span { - color:#667788; -} - -pre.block, -pre.block code, -div.block div.code, -ul.code-block { - position:relative; - display:table; - *display:block; - border:1px solid #ccc; - border-radius:3px; -} - -div.block, -pre.block { - background:#e9f3ff; - border-color:#eee; - padding:3px; -} - -pre.block code, -.block .code { - background:#fff; - border:1px solid #ccddee; - padding:0.5em; - font-size: 100%; - line-height:1.75em; - background-image: -webkit-linear-gradient(#fcfcfc 50%, #fff 50%); - background-image: -o-linear-gradient(#fcfcfc 50%, #fff 50%); - background-image: linear-gradient(#fcfcfc 50%, #fff 50%); - background-size: 100% 3.5em; - background-origin: content-box; -} - -#sm2-properties .code { - /* special case: no zebra striping for this one. */ - background-image: none; -} - -pre.block code { - padding: 1em; -} - -h2 code { - /* common header stuffs */ - background: none; - font-size: 93%; -} - -dl { - background:#f9fcff; - padding-bottom: 1px; - border: 1px solid #ccddee; - border-radius: 3px; - margin-top: 1em; -} - -dd { - margin:1em 0px; - padding:0px 1em; - line-height:1.75em; -} - -dt { - padding:0px; - margin:0px; - border-bottom:1px solid #ddeeff; - padding:0.5em 0.5em 0.5em 0.75em; - background:#eef6ff; - font-size:1.15em; -} - -dt.alt { - background:#f3f3f3; - border-bottom-color:#e6e6e6; -} - -dl:nth-child(2n+1), -dl.alt { - background:#fcfcfc; - padding:0px 0px 1px 0px; - border-color:#ddd; -} - -dl.tight dt.alt { - background: #fcfcfc; -} - -#smsound-methods dl a { - font-weight: normal; -} - -#smsound-methods dt:last-of-type { - border-bottom: none; -} - -h2 { - padding-top:0.5em; -} - -#top { - position:relative; - padding:1em 1em 0px 1.5em; - max-width: 95.5em; - color:#fff; - z-index:3; - margin: 0px auto; -} - -#content { /* #top #content */ - background: #222 url(../demo/_image/noise-dark.png); -} - -#top, -#top div { - *zoom:1; -} - -#top h1 { - /* special christmas light case */ - display:inline; -} - -#top h2 { - /* tagline */ - font-size:1.25em; - font-weight:300; - padding-top:2px; -} - -#top h1, -#top h2, -#version { - text-shadow: 0px 1px 0px rgba(0,0,0,0.5); -} - -#main-wrapper { - position: relative; - /* fade out the body texture */ - /* - border: 1px solid #fff; - */ - box-shadow: inset 0px 0px 16px #fff; -} - -#main { - position:relative; - padding:0px 0px 2em 0px; - padding-top:1px; - margin:0px auto; - *padding:0px 1em 2em 1em; - zoom:1; - /* - box-shadow: 0px 0px 32px rgba(0,0,0,0.05); - */ -} - -#main { - max-width: 98em; -} - -body.home #main { - box-shadow: none; - max-width: 104em; -} - -.columnar { - position:relative; - margin:0px; - padding:0px; - margin:1.9em 0.5em 0.5em 1em; /* slight left tweak */ -} - -.columnar .c1 { - position:absolute; - left:0px; - top:0px; - width:20em; - height:30px; - _position:relative; /* IE 6 hackery */ - _height:auto; -} - -#doc .columnar .c1 { - left:auto; - right:1em; - _right:auto; -} - -.columnar .c1 h2 { - position:relative; - font-size:1.2em; - padding:0.37em 0.5em; - vertical-align:middle; - background:#333; - color:#fff; - text-indent: 0.25em; -} - -.columnar .c1 p { - margin:0.5em 0px 1em 0px; - padding-left:0.5em; - padding-right:0.5em; - font-size:0.95em; - line-height:1.35em; - color:#666; -} - -.columnar .c1 p code { - color:#336699; -} - -.columnar .c2 { - position:relative; - margin-top:0px; - margin-left:22em; - margin-bottom:1.5em; -} - -.triple .columnar .c2 { - margin-right:21.25em; - min-width:20em; -} - -#doc .triple .columnar .c2 { - margin-left:21.5em; - margin-right:23em; - _margin-right:0px; /* not you, IE 6. */ -} - -#doc.special .triple .columnar .c2 { - /* override case: make c2 extra-wide. */ - margin-right: 0.75em; - max-width: 70em; -} - -#doc .triple .columnar .c1 { - margin-right:0px; - margin-left:21.25em; -} - -.columnar .c2 p:first-child { - margin-top:0.2em; -} - -.columnar .c2 > .f-block:first-child > h4 { - margin-top:0.5em; -} - -.columnar .c2 strong strong { - display:block; - padding:0.5em; - border-bottom:1px solid #999; - background:#f0f6ff; - color:#336699; -} - -.columnar .c2 p { - line-height:1.75em; - padding-top: 0.25em; - padding-bottom: 0.25em; -} - -p code, -.columnar .c2 p code { - font-size: 97%; -} - -.three .columnar { - position:relative; -} - -.three .columnar .c1 { - position:relative; - width:20em; -} - -.three .columnar .c2 { - position:relative; - margin-right:16em; -} - -.c3 { - position:absolute; - right:1em; - margin-right:16px; - top:2em; - width:16em; - margin-top:-0.5em; -} - -#doc .c3 { - right:auto; - margin-right:0px; - margin-left:16px; - left:1.25em; - z-index: 1; -} - -#nav { - position:relative; - margin-top:0.75em; - margin-left:-0.5em; -} - -ul { - /* lists inside main content area */ - line-height: 1.75em; -} - -ul li { - margin-bottom: 0.75em; -} - -#nav ul { - margin:0px; - padding:0px; - line-height:1em; - list-style-type:none; -} - -#nav ul li { - position:relative; - margin:0px; - padding:0px; - float:left; - display:inline; - padding-right:1px; -} - -#nav ul li ul { - position:absolute; - z-index:1; - display:none; - min-width:19em; - max-width:21em; - background:#3399cc; - background: -moz-linear-gradient(top, rgba(51,153,204,0.99) 0%, rgba(35,96,127,0.96) 100%); /* FF3.6+ */ - background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(51,153,204,0.99)), color-stop(100%,rgba(35,96,127,0.96))); /* Chrome,Safari4+ */ - background: -webkit-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* Chrome10+,Safari5.1+ */ - background: -o-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* Opera 11.10+ */ - background: -ms-linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* IE10+ */ - background: linear-gradient(top, rgba(51,153,204,0.99) 0%,rgba(35,96,127,0.96) 100%); /* W3C */ - text-shadow: 0px 1px 0px rgba(0,0,0,0.25); - _width:19em; - *top:2.3em; - *left:0px; -} - -#nav ul li:last-child ul { - right:1px; -} - -#nav ul li:hover ul, -#nav ul li ul:hover { - display:block; -} - -#nav ul li ul li { - float: none; - display: block; - width: 100%; -} - -#nav ul li ul li a { - display: block; - width: auto; - border: none; - padding: 0.5em 0px 0.5em 1em; - font-size: 1.1em; - line-height: 1.1em; - color: #fff; - font-weight: 300; - color:rgba(255,255,255,0.9); - border-bottom: 1px dotted rgba(0,0,0,0.2); - border-top: 1px dotted rgba(255,255,255,0.2); -} - -#nav ul li ul li:first-of-type a { - border-top: none; -} - -#nav ul li a { - display: inline-block; - padding: 0.5em 1em; - text-decoration: none; - font-weight: bold; - color: #fff; -} - -#nav ul li ul li a:hover { - background-color: #336699; - background-color: rgba(0,0,0,0.45); -} - -#nav>ul>li>a, -#nav>ul>li>strong>a { - /* top-level links */ - color:#ddd; - font-size: 1.25em; - font-weight: 300; - vertical-align: bottom; -} - -#nav ul li strong a { - color:#333; -} - -#nav > ul > li > strong > a { - /* tweak for good browsers that respect larger font size */ - padding-bottom: 8px; -} - -#nav ul li a:hover, -#nav>ul>li:hover>a { - /* top-level */ - background: #3399cc; - color:#fff; - text-shadow: 0px 1px 0px rgba(0,0,0,0.25); -} - -#version { - position:relative; - float:right; - display:inline; - margin-left:1em; - font-size:85%; - margin-bottom:0px; - bottom: -1em; - color:#999; -} - -div.clear { - clear:both; - font-size:1px; - line-height:1px; -} - -.note { - margin-top:0.5em; - font-size:0.95em; - color:#999; -} - -.note a { - color:#666; - padding:1px; - margin:-1px; -} - -.note a:hover { - color:#fff; - background:#666; -} - -.medium-note { - padding-top:1.5em; - font-size:1em; -} - -ul.standard { - line-height:1.5em; - padding-left:1.2em; - *padding-left:0px; - color:#333; - margin-top:1em; - margin-bottom:1em; - list-style-type:square; -} - -ul.standard li { - margin-bottom:0.5em; -} - -ul.standard ul { - margin-top:0.5em; - margin-bottom:1.5em; - padding-left:1.2em; -} - -.c3 ul { - list-style-type:none; -} - -.c3 ul, -.c3 ul li { - margin:0px; - padding:0px; -} - -.c3 h2 { - font-size:1.1em; - text-indent:0.4em; -} - -.c3 ul li a { - display: block; - text-decoration:none; -} - -.c3 ul li, -.c3 ul li a, -.c3 ul li a:hover, -.c3 ul li a:focus { - color:#555; - _color:#555; - outline:none; -} - -.c3 ul li.active { - box-shadow: 0 0 6px #003366 inset; - border-radius: 1px; -} - -.c3 ul li.active a { - border-radius: 2px; - text-shadow: 0px 1px 0px rgba(0,0,0,0.25); -} - -.c3 ul li.active, -.c3 ul li.active a, -.c3 ul li ul li:hover, -.c3 ul li ul li:hover a { - color: #fff; -} - -.c3 ul li.active a:hover { - _color:#fff; -} - -.c3 .box { - margin-top:6px; -} - -.wedge, -.c3 h2 { - position:relative; - background:#333; - color:#fff; - margin:0px; - padding:0px; - height:2.101em; - line-height:1.65em; -} - -.c3 h2 { - height:2em; - line-height:2em; -} - -.c3 h2, -#doc .c2 h3 { - text-shadow: 0px 1px 0px #000; -} - -.wedge { - background-color:#3399cc; -} - -.wedge-dark { - background:#333; -} - -.wedge .l, -.wedge .r { - border-top:1.75em solid #333; -} - -.c3 h2 .l, -.c3 h2 .r { - border-top: 2em solid #333; - border-top: 2.1em solid #333\9; /* IE 8 */ -} - -.wedge .l, -.c3 h2 .l, -.wedge .r, -.wedge-dark .r, -.c3 h2 .r { - background:transparent url(../demo/_image/wedge.png) no-repeat; - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAEABAMAAACJ12OUAAAAGFBMVEUREREAZpkYGBgAZpkiIiIAZpkREREAZpkArR2CAAAABnRSTlMAAOvrEhJBIv9yAAAC0UlEQVR42u3ZuW0cQRCF4cIPhrG2MhDkLZgDM5ChBGQoKBlMgdgElAQ9gVACNMTZ2WOO7rraI2rcna33cdjTTTzyQ7++fzFuQPTrdDBuMAa8H04vQwNOL++HkQHTtw0CBmAekh0wf1cnYAEsAibAIGACDAI2QCdgA3QCDoBKwAFQCXgAGgEPQCPgAigEXACFgA/QJ+AD9Ak4AV0CTkCXgBfQI+C/tT0W952dubgBncH4Ae3J+AHt0QQAzdkEAM3hRACt6UQArfGEAI35hACNAGKAfQIxwD6CIGCXQRCwCyEK2KYQBWxjCAM2OYQBmyDigHUSccA6igRglUUCsAojA1imkQEs40gBFnmkAItAcoB7IjnAPZIk4JZJEnALJQu4ppIFXGNJAy65pAGXYPKAOZk8YI5mAHDOZgBwJjACmAiMACYCT7/U6+c3/fOv1R9Uf1D9QfUH1R9Uf1D9QfUH1R9Uf1D9QfUH1R9Uf1D9wefvD/4NXhwfRwQPrzy8jgw4PiIjhI90ZITwEY4MEKZsZIAwRSN5wjkZyRPOwUiaMOciacIci2QJl1QkS7iEIknCNRNJEq6RSI5wS0RyhFsgkiLc85AU4R6HZAiLNCRDWIQhCcIyC0kQllFInLBKQuKEVRASJqxzkDBhHYNECZsUJErYhCBBwjYDCRK2EUiMsEtAYoRdABIi7OcjIcJ+PBIhNKYjEUJjOBIgtGYjAUJrNOInNCcjfkJzMO47O3Px39oeixvb+cFwP67Oo8X7vHpPFu9vrPe7xblmuqsL56rtrm98y7a/vPG9OP0XDNerq7ziuDYPZZPBs3toewye/Uvb5XDsoOo+i2MPV3d67E1c3+ixjxH9qME8yIzDDvMoNY5brLPUOm2xTnPrvLf++3+0/uLgz2/1ev6rf/5W/UH1B9UfVH9Q/UH1B9UfVH9Q/UH1B9UfVH9Q/UH1B9UffPr+4D+tsZObsTO2qgAAAABJRU5ErkJggg==); - *background-image:url(../demo/_image/wedge.png); -} - -.wedge .l, -.c3 h2 .l { - background-position: -64px 0px; - position:absolute; - left:0px; - top:0px; - width:16px; - height:100%; - margin-left:-16px; -} - -.wedge .r, -.wedge-dark .r, -.c3 h2 .r { - background-position: -48px 0px; - position:absolute; - right:0px; - top:0px; - width:16px; - height:100%; - margin-right:-16px; -} - -.wedge .l, -.wedge .r { - border-color:#3399cc; -} - -.wedge .l { - background-position:-64px -64px; - border-top: 2em solid #3399cc -} - -.wedge .r { - margin-top:-15px; - border-top:none; - height:16px; - border-bottom:2em solid #3399cc; - background-position:0px -192px; -} - -.wedge-dark .l, -.wedge-dark .r { - border-color:#333; -} - -.wedge-dark .l { - background-position:-64px 0px; -} - -.wedge-dark .r { - background-position:0px -128px; -} - -.c3 h2 .r.up { - margin-top:-16px; - border-top:none; - height:16px; - border-bottom:1.66em solid #333; - background-position:0px -128px; -} - -.c3 h2 .l.flat, -.wedge .l.flat, -.c3 h2 .r.flat, -.wedge .r.flat { - background-image:none; -} - -.c3 ul { - margin:0px; - padding:0px; - list-style-type:none; -} - -.c3 ul li { - border:1px solid #f3f3f3; - border-top:none; - border-bottom:none; -} - -.c3 ul ul li { - border:none; -} - -.c3 ul li { - margin:0px; - padding:0px; -} - -.c3 ul li ul li { - background-color: #fcfcfc; - background-color: rgba(255,255,255,0.5); - font-size: 97%; - line-height:2.4em; - text-indent:0.5em; - padding: 0px 0.25em; - cursor:hand; - border-bottom: 1px dotted #eee; -} - -.c3 ul li ul li:hover { - background-color:#999; - cursor:pointer; - cursor:hand; -} - -.c3 ul li ul li.active { - background-color:#3399cc; - color:#fff; -} - -.c3 h3 { - position: relative; - margin: 0px; - padding: 0px; - height: auto; - min-height: 25px; - background: #3399cc; - border: none; - color: #fff; - text-indent: 0.5em; - font-size: 1em; - line-height: 2em; - text-shadow: 0px 1px 0px rgba(0,0,0,0.25); -} - -.c3 h4 { - font-size:1em; - margin:0px; - padding:0.4em 0.2em 0.4em 0.75em; - vertical-align:middle; - color:#333; - background-color: #f3f3f3; - background-color: rgba(0,0,0,0.05); - border-top: 1px dotted #d6d6d6; - border-bottom: 1px dashed #e9e9e9; - text-shadow: 0px 1px 0px #fff; -} - -.c3 h4:first-of-type { - border-top-color: transparent; -} - -#get-satisfaction h2 a { - color:#fff; -} - -#get-satisfaction a { - color:#555; -} - -#get-satisfaction a:hover { - color:#fff; -} - -.c3 h2 a { - color:#fff; -} - -.c3 h2 a:hover { - color:#fff; - text-decoration:underline; -} - -.flash9 { - background-image:url(../demo/_image/flash9.png); - background-repeat:no-repeat; - background-position:bottom right; - _background-image:none; -} - -li.flash9 { - background-position:bottom right; -} - -.flash9:hover, -.flash9.active { - background-image:url(../demo/_image/flash9-dark.png); - _background-image:none; -} - -.new { - background-image:url(../demo/_image/new.png); - background-repeat:no-repeat; - background-position:bottom right; - _background-image:none; -} - -.recent { - background-image:url(../demo/_image/new-bw.png); - background-repeat:no-repeat; - background-position:bottom right; - _background-image:none; -} - -.new:hover, -.new.active, -.recent:hover, -.recent.active { - background-image:url(../demo/_image/new-dark.png); - background-repeat:no-repeat; - background-position:bottom right; - _background-image:none; -} - -.deprecated { - font-style: italic; - color: #333 !important; -} - -span.nevermind, -.removed { - text-decoration:line-through; - opacity:0.33; -} - -strong.removed { - font-weight: normal; - opacity:0.5; -} - -.padded { - padding:0.5em; -} - -dd.deprecation-note { - color: #993333; - background-color: #fff6f6; -} - -.c3 p { - font-size:0.9em; - padding-left:0.75em; - padding-right:0.5em; -} - -.c1 pre code { - margin-top:0px; - color:#336699; - margin-left:0px; -} - -.c1 pre { - margin-top:0px; - padding-top:0px; - margin-left:0.5em; -} - -#reset-filter { - position:relative; - font-family:"Helvetica Neue","Helvetica",helvetica,arial,verdana,sans-serif; - font-weight:300; - font-size:2.5em; -} - -.c2 .option { - font-size:85%; - float:right; - display:inline; - margin-left:1em; - margin-right:0.5em; - margin-top:3px; - line-height:1em; - white-space:nowrap; -} - -.c2 .option a { - padding:0.1em 0.35em 0.1em 0.35em; - color:#3399cc; -} - -#filter-box { - position:relative; - display:none; -} - -#get-satisfaction { - position:relative; -} - -#support-wrapper { - position: relative; - background: #fff; - border: 1px solid rgba(0,0,0,0.03); - box-shadow: 0px 0px 1px rgba(0,0,0,0.075); -} - -#gsfn_content { - position: relative; - padding:0.5em 0px 0.5em 0px; -} - -#gsfn_content ul { - position: relative; - /* initially, hide and then expand. */ - overflow: hidden; - height: 0px; - margin: 0px; - /* smooth height transitions, why not */ - -webkit-transition: height 0.5s ease-in-out; - -moz-transition: height 0.5s ease-in-out; - transition: height 0.5s ease-in-out; -} - -#gsfn_list_widget.loaded ul { - /* JS callback assigns this class when load is complete */ -} - -#gsfn_content ul li { - border:none; -} - -div#gsfn_list_widget img { - border: none; -} - -div#gsfn_list_widget a { - text-decoration:none; -} - -div#gsfn_list_widget a.widget_title { - display: block; - margin-bottom: 10px; - font-weight: bold; -} - -div#gsfn_list_widget .powered_by { - font-family:verdana,arial; - margin:-0.25em 1em 0px 1em; - padding:0.25em 0px 0.5em 0px; - border-top: 1px dotted #ddd; - font-size:75%; -} - -body.home div#gsfn_list_widget .powered_by { - padding-bottom: 0px; -} - -div#gsfn_list_widget .powered_by a { - font-style: italic; - color: #999; -} - -div#gsfn_list_widget .powered_by a:hover { - color:#333; -} - -div#gsfn_list_widget div#gsfn_content { - font-size:0.88em; - padding-left:0.5em; - padding-right:0.5em; -} - -div#gsfn_list_widget div#gsfn_content li { - text-align:left; - position: relative; - clear:right; - *zoom:1; -} - -div#gsfn_list_widget div#gsfn_content li:hover, -div#gsfn_list_widget div#gsfn_content li:hover a { - background:#3399cc; - color:#fff; -} - -div#gsfn_list_widget div#gsfn_content a.gsfn_link { - display:block; - line-height:1.2em; - padding:5px 0px 5px 5px; -} - -div#gsfn_list_widget div#gsfn_content a.gsfn_link:hover { - _color:#fff; - _background-color:#3399cc; -} - -div#gsfn_list_widget div#gsfn_content span.time { - font-size: 85%; - color:#999; - padding-left:3px; - padding-right:3px; - text-align:right; - float:right; - display:inline; - margin-top:1px; -} - -div#gsfn_list_widget div#gsfn_content li:hover span.time { - color:#fff; -} - -div#gsfn_list_widget div#gsfn_content p.gsfn_summary { - margin-top: 2px; - position:relative; - z-index:2; -} - -.tight { - margin-top:0px; -} - -.compact { - margin-bottom:0.25em !important; -} - -.smaller { - margin-top: 0px !important; - margin-bottom: 0.25em !important; -} - -.c2 a, -a.cta { - margin-top:-0.3em; - padding:0.2em 0.25em; - margin-left: -0.25em; - margin-right: -0.25em; - *margin: 0px; - *padding: 0px 2px; - *margin: 0px -2px 0px -2px; - text-decoration:none; - color:#3399cc; - border-radius:0.25em; - zoom:1; -} - -body.home .c2 a, -body.home a.cta { - text-shadow: 0px 1px 0px #fff; -} - -body.home .c2 a:hover, -body.home a.cta:hover { - text-shadow: none; -} - -pre code a, -.c2 pre code a { - color: #3399cc; - font-weight: 400; - text-decoration: none; - text-shadow: none; -} - -pre code a:hover, -.c2 pre code a:hover { - background-color: #3399cc; - color: #fff; - font-weight: 400; -} - -/* redefine for simple mp3 button demo */ -.c2 a.sm2_button { - border-radius:6px; -} - -.c2 a.sm2_button.type-2 { - border-radius:9px; -} - -.c2 a { - color:#3399cc; - font-weight:500; - text-decoration:none; -} - -.c2 a.cta { - text-decoration:none; -} - -a.cta span { - font-size:1.5em; - line-height:1em; -} - -a.cta:hover, -.c2 a:hover, -#sm2-options a:hover { - position: relative; - z-index: 1; - background-color:#3399cc; - border-color:#3399cc; - color:#fff; - text-decoration:none; -} - -.c2 a.sm2_button:hover { - /* arg. not specific enough, redefine here. */ - background-color:#cc3333; -} - -dt a:hover span { - color: #fff; -} - -a.cta-more { - color:#ddeeff; - font-size:0.8em; - position:absolute; - right:0px; - margin:0px; - padding:1px; - bottom:0.9em; - line-height:1em; -} - -a.cta-more:hover { - background:#fff; - color:#3399cc; -} - -div.html5support { - clear: both; - padding-top: 2em; -} - -div.html5support span { - padding:0px 5px; - display:inline-block; - text-align:center; - font-weight:bold; - background:#ccc; - color:#fff; - border-radius:5px; - margin-left:0.5em; - margin-bottom:0.25em; -} - -div.html5support em { - font-weight:bold; -} - -div.html5support span.true { - background:#669966; -} - -div.html5support span.partial { - background:#993333; -} - -div.html5support em.partial { - color:#993333; -} - -div.html5support em.true { - color:#669966; -} - -#nav ul li ul { - /* eh, why not. */ - box-shadow:2px 2px 2px rgba(51,153,204,0.2); -} - -.newer { - vertical-align: middle; - margin-top: 1em; - margin-bottom: 1em; -} - -.newer a, -a.feature, -.feature-hot { - position:relative; - display:inline-block; - background:#3399ff; - font-size: 1.1em; - line-height: 1.75em; - padding: 0px 0.5em; - margin: 0px 0.125em; - color:#fff; - font-weight:bold; - border:3px solid #cce6ff; - border:3px solid rgba(255,255,255,0.66); - border-radius:8px; - text-decoration:none; -} - -a.feature { - margin-left:0px; -} - -.newer a, -.feature-hot { - background:#ff0000; - border-color:#ff6666; - color:#fff; -} - -.newer a:hover, -.c2 .feature-hot:hover { - background:#990000; - border-color:#cc0000; -} - -a.feature:focus, -a.feature:hover { - background:#ff0000; - border-color:#ff6666; - color:#fff; -} -# -a.warning, -span.warning { - font-weight:bold; -} - -a.warning, -span.warning, -a.warning code, -span.warning code { - color:#993300; -} - -a.warning:hover { - color:#fff; - background:#993300; -} - -.newer p { - margin:0px; - padding:0px; -} - -.scratched-out { - display: inline-block; - text-decoration:line-through; - color:#999; - font-size:0.9em; - margin-top:-0.75em; - -webkit-transform:rotate(-15deg); - -moz-transform:rotate(-15deg); - transform:rotate(-15deg); -} - -div.inthewild { - position: relative; - margin-top:1em; -} - -ul.inthewild { - display: inline; - margin: 0px auto; - list-style-type: none; -} - -ul.inthewild, -ul.inthewild li { - position: relative; - margin: 0px; - padding: 0px; -} - -ul.inthewild { - margin-bottom: 2em; -} - -ul.inthewild li { - display: inline-block; - *float: left; - *display: inline; - width: 128px; - height: 64px; - vertical-align: middle; - text-align: center; - margin: 2px 0px; - background-color: #fcfcfc; - background-color: rgba(255,255,255,0.5); - border-radius: 2px; - border: 1px solid #eee; - border-color: rgba(0,0,0,0.05) -} - -ul.inthewild a, -ul.inthewild a img { - border:none; - vertical-align:middle; -} - -ul.inthewild a { - position: absolute; - left: 50%; - top: 50%; - overflow:hidden; - margin: 0px; - padding: 0px; - border-radius: 0px; - background: transparent url(../demo/_image/logo-sprite.png) no-repeat 0px 0px; - line-height: 96px; - vertical-align: middle; -} - -ul.inthewild a:hover { - background-color: transparent; -} - -ul.inthewild a span { - position:absolute; - text-indent:-9999em; -} - -#eight-tracks { - background-position: 0 0; - width: 64px; - height: 20px; - margin: -10px 0px 0px -32px; -} - -#audiogalaxy { - width: 100px; - height: 22px; - background-position: 0 -37px; - margin: -11px 0px 0px -50px; -} - -#discogs { - background-position: 0 -72px; - width: 55px; - height: 20px; - margin: -10px 0px 0px -27px; -} - -#hypem { - background-position: 0 -111px; - width: 80px; - height: 38px; - margin: -19px 0px 0px -40px; -} - -#lastfm { - background-position: 0 -176px; - width: 80px; - height: 28px; - margin: -14px 0px 0px -40px; -} - -#pitchfork { - background-position: 0 -688px; - width: 100px; - height: 20px; - margin: -10px 0px 0px -50px; -} - -#nyancat { - background-position: 0 -312px; - width: 64px; - height: 40px; - margin: -20px 0px 0px -32px; -} - -#soundcloud { - background-position: 0 -424px; - width: 83px; - height: 58px; - margin: -29px 0px 0px -42px; -} - -#turntable-dot-fm { - background-position: 0 -252px; - width: 100px; - height: 20px; - margin: -10px 0px 0px -50px; -} - -#baroque-me { - background-position: 0 -541px; - width: 88px; - height: 47px; - margin: -23px 0px 0px -42px; -} - -#freesound { - background-position: 0 -635px; - width: 100px; - height: 27px; - margin: -15px 0px 0px -50px; -} - -div.inthewild.active li:hover { - background-color: rgba(255,255,255,0.9); - border-color: #ccc; - box-shadow: 0px 0px 3px rgba(0,0,0,0.075); -} - -/* homepage-specific demo shiz */ - -.sidenote { - font-size:85%; - opacity:0.75; -} - -ul.playlist { - font-size:85%; -} - -ul.playlist li { - margin-bottom:0.2em; -} - -ul.playlist li a { - font-size:1em; - color:#333; -} - -ul.playlist li a, -ul.playlist li a:hover { - background:transparent; - border-radius:0px; - line-height:1em; -} - -ul.playlist li .timing { - margin-right: 0.1em; - font-size: 50%; - top: 0.5em; -} - -ul.playlist.use-peak li .peak { - /* overrides */ - height:0.61em; - margin-top:-5px; - width:0.92em; -} - -html.isSafari ul.playlist.use-peak li .peak { - margin-top:-4px; /* dumb tweak */ -} - -ul.playlist.use-peak li .timing { - right:4em; -} - -ul.playlist.use-peak li .peak-box { - height:0.66em; -} - -ul.playlist li .peak .l { - margin-right:0px; -} - -ul.playlist li .peak .l, -ul.playlist li .peak .r { - width:6px; -} - -ul.playlist li .peak .r { - left:9px; -} - -a.not-supported { - /* give user a hint that the format doesn't work */ - text-decoration:line-through; - color:#666; - opacity:0.25; -} - -ul.graphic li { - line-height:1.5em; -} - -ul.graphic li a, -ul.graphic li a.sm2_link { - min-width:17.75em; - width:auto; -} - -ul.graphic li a, -ul.graphic li a.sm2_link { - background-color:#ddd; - border-color:#ddd; - color:#333; - vertical-align:middle; -} - -ul.graphic li a { - background:#ddd url(../demo/play-mp3-links/image/icon_play.png) no-repeat 3px 50%; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAA6ElEQVR42q2UvQqDMBRGC47dAj6rgygIDg5OfQlHF30GX0JFURddnEQU+eoNLaSJFRUvnPzA/c4QkjwA3AIf1tJWnitsRT8I+2Q0UfTM8/yFk0UZyooiNk0ThmE4BWUoK4r0cRxxBcr+iMh+AVW0LAtkoihCURS0/ocqwkaZpgnbtrmwrmts1DGR67owDIPjeR7iOEbXdfuisiwh4zgOSb5wcZIkYo8qapoGMpZlkYALwzBElmWoqkrsUUVt20LG930EQUAHTvstVFHf95BJ05TmPVQR3dQLKCI2zzOuQNnbHu3t38gtvAF1L6rpAc8MDwAAAABJRU5ErkJggg==); - *background-image: url(../demo/play-mp3-links/image/icon_play.png); - _background-image:url(../demo/play-mp3-links/image/icon_play.gif); -} - -ul.graphic li a:hover, -ul.graphic li a.sm2_paused:hover, -ul.graphic li a.sm2_link:hover, -ul.graphic li a.sm2_playing, -ul.graphic li a.sm2_playing:hover { - background-color:#336699; - border-color:#336699; - color:#fff; -} - -ul.graphic li a.sm2_link { - /* Doesn't work on this page. */ - -webkit-transition-property: none; - -webkit-transition: none; -} - -.c2 ul.playlist li a { - margin:0px; - padding:0px; - letter-spacing: -0.02em; -} - -ul.inline-playlist { - min-height:49px; - min-width:512px; - margin-top:4em; -} - -ul.inline-playlist li { - float:left; - display:inline; - width:45%; - margin-right:0.25%; -} - -body.home .sm2-inline-list .ui360-vis { - margin-right:0px; -} - -body.home #special-demo-left .ui360 { - margin-right: 4px; - /* homepage-specific demo UI: a slight inner shadow + BG color + border */ - background-color: rgba(0,0,0,0.025); - box-shadow: inset 0px 0px 8px rgba(0,0,0,0.075); - /* a little radii, modern browsers only */ - border: 1px solid rgba(0,0,0,0.075); - border-radius: 32px; - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - /* specifics */ - -moz-transition-property: background, border, box-shadow; - -webkit-transition-property: background, border, box-shadow; - transition-property: background, border, box-shadow; -} - -body.home #special-demo-left .ui360:hover { - background-color: rgba(0,0,0,0.045); - border-color: rgba(0,0,0,0.15); - box-shadow: inset 0px 0px 5px rgba(0,0,0,0.15); -} - -body.home #special-demo-left .ui360:last-child { - margin-right: 0px; -} - -body.home .columnar .c2 p { - font-size: 1.1em; - line-height:1.6em; - color:#333; -} - -body.home .c2 ul.playlist li a { - _color:#000; /* stupid IE */ -} - -body.home .c2 ul.playlist li.sm2_paused a, -body.home .c2 ul.playlist li.sm2_playing a { - _color:#fff; /* argh */ -} - -body.home .c2 ul.standard { - _margin-left:1.5em; -} - -body.home .ie6sucks { - _background: transparent !important; - _display: none !important; -} - -body.home .ie7sucks { - *display: none !important; -} - -/* Flash positioning and flashblock / clicktoflash handling */ - -/* special-case for the SM2 homepage only */ - -body.home #sm2-container { - position: fixed; - bottom: 0px; - left: 0px; - width: 48px; - height: 48px; - /* IE 6 hax, unlikely to have flashblock anyway... */ - _margin:-8px 0px 0px 0px; -} - -@-moz-keyframes flashblock { - from { - border-color: #ff3333; - } - - to { - border-color: #fff; - } -} - -@-webkit-keyframes flashblock { - from { - border-color: #ff3333; - } - - to { - border-color: #fff; - } -} - -body.home #sm2-container.swf_timedout { - /* blocked state */ - border:1px solid #ff3333; - -moz-animation-duration: 1s; - -moz-animation-name: flashblock; - -moz-animation-iteration-count: 5; - -webkit-animation-duration: 1s; - -webkit-animation-name: flashblock; - -webkit-animation-iteration-count: 5; - width:48px; - height:48px; -} - -body.home #sm2-container.swf_unblocked { - /* unblocked state */ -} - -body.home #sm2-container.swf_unblocked, -body.home #sm2-container.swf_loaded { - top:auto; - left:0px; - bottom:0px; - margin:0px; - width: 6px; - height: 6px; -} - -#sm2-support-warning { - display:none; - border:1px solid #ff9999; - padding:0.5em; - margin-top:1.5em; - font-weight:bold; -} - -#sm2-support { - display:none; - font-size:0.9em !important; - margin-top: 1.5em; -} - -#sm2-support-warning, -#sm2-support { - background:#fff6f0; - border:1px solid #ff3333; -} - -body.home #about-sm2 #sm2-support h3 { - border-color:#ff9999; - margin-top:0.25em; -} - -body.home #special-demo-left { - min-height:70px; - position:relative; - float:left; - display:inline; - margin-right:14px; - padding-right:0.9em; - border-right:1px dotted #e0e0e0; - *border-right:none; - _width:210px; -} - -body.home #special-demo-right { - min-height:51px; - position:relative; - float:left; - display:inline; - margin-top:18px; - /* - padding-right:15px; - */ - *width: 90px; - _display: none; -} - -body.home #inline-playlist { - clear:both; - float:right; - display:inline; - width:256px; - min-height:49px; - margin-top:2em; - padding-bottom:0px; -} - -#demo-box { - position:relative; - float:right; - display:inline; - margin-top:-4px; - background:#fff; - padding-left:3em; - width:256px; - z-index: 1; -} - -hr { - visibility:hidden; - margin:0px; - padding:0px; -} - -.demo-block { - position:relative; - background:#f9f9f9; - border:1px solid #e6e6e6; - padding:4px; - padding-top:0.5em; - margin-top:-0.55em; - border-top:none; -} - -#demo-header { - color:#333; - background:#f9f9f9; - border:1px solid #e6e6e6; - border-bottom:0px; - margin-bottom:0px; - padding:0.5em; -} - -#demos h3 { - padding-bottom:0px; - text-indent:0.5em; - font-weight:normal; -} - -#demos h3 a { - font-weight:normal; -} - -#revision-list > li { - margin-top:3em; - margin-bottom:2em; -} - -#revision-list > li:first-child { - margin-top:2em; -} - -/* seasonal decorations */ - -body.home.has-lights { - /* prevent ugly scrollbars from explosion fragments */ - overflow-x: hidden; -} - -body.home #lights { - position:absolute; - border-top:1px solid #006600; - left:0px; - top:0px; - width:100%; - z-index:4; - display:none; -} - -.xlsf-light { - position:absolute; - margin-top:-1px; -} - -body.fast .xlsf-light { - opacity:0.9; -} - -.xlsf-light { - opacity:0.9; -} - -#explosion-box { - position: absolute; - left: 0px; - top: 0px; - width: 100%; - z-index: 10; -} - -.xlsf-fragment { - position:absolute; - background:transparent url(christmas-lights/image/bulbs-50x50-fragments.png) no-repeat 0px 0px; - width:50px; - height:50px; -} - -.xlsf-fragment-box { - position:absolute; - left:0px; - top:0px; - width:50px; - height:50px; - *width:100%; - *height:100%; - display:none; -} - -.figure { - display:inline; - display:inline-block; - border:1px solid #ddeeff; - padding:0.5em; - margin:0.5em 0px 0.5em 0px; -} - -.figure .code span { - padding:0.25em; - border:1px solid #f0f9ff; - background:#fff; -} - -.figure .code span.mid { - color:#666; -} - -#sm2-container.flash_debug { - /* flash movie, when soundManager.debugFlash = true */ - position:relative; - width:auto; - height:300px; - width:100%; - background:#f6f6f6; - border:1px solid #ccc; -} - -#sm2-container.flash_debug object, -#sm2-container.flash_debug embed { - width:100%; - height:100%; - left:auto; - top:auto; -} - -ul.file-structure ul { - padding-left:1.5em; -} - -ul.file-structure li { - list-style-type:square; - margin-top:0.25em; - margin-left:0px; -} - -ul.file-structure li span { - color:#999; -} - -#sm2-filesizes { - border:1px solid #ddd; - background:#fff; -} - -#sm2-filesizes tr:nth-child(2n+1) { - background:#f9f9f9; -} - -#sm2-filesizes th { - background:#eee; - font-weight:bold; - text-align:left; -} - -#sm2-filesizes th { - padding:4px 6px; -} - -#sm2-filesizes td { - padding:0px 6px; - border:1px solid #eee; -} - -#sm2-filesizes p { - margin-top:0.5em; - margin-bottom:0px; -} - -#sm2-filesizes pre { - border-left:none; - margin-top:0.5em; - margin-bottom:0.5em; -} - -#sm2-filesizes .nw { - white-space:nowrap; -} - -#sm2-filesizes .booyaa { - /* in the words of Paris Hilton, "that's hot." (in the nerdy sense, I suppose.) */ - background:#fff9f9; - color:#990000; -} - -#history li.in > p.compact { - font-weight:bold; -} - -#sm2-options { - /* -html5, -debug etc. */ - position: relative; - clear: both; - color: #666; - margin: 0.33em 0.75em 0px 0.75em; - border-top: 1px dotted #ddd; -} - -#sm2-options .options-divider { - font-size: 85%; - color: #ccc; -} - -#sm2-options p { - font-size: 85%; - padding-left: 0px; - padding-bottom: 0px; - margin-bottom: 0.75em; -} - -#sm2-options p:first-child { - margin-top: 0.75em; -} - -#sm2-options a { - color: #3399cc; - text-decoration: none; - padding: 1px; - margin-top: -2px 0px 0px -2px; -} - -#without-html5 { - display: none; -} - -body.home #about-sm2 #inline-demo-header { - margin-top: 1.5em; - border-bottom: 1px solid #eee; - padding-bottom: 0.5em; -} - -body.home #about-sm2 #inline-demo-header, -body.home #about-sm2 .home-shopping-network { - display: block; -} - -#about-sm2 a img { - border: none; -} - -/* alternate code + comment blocks */ - -ul.code-block { - list-style-type: none; - position: relative; - padding: 3px; - font-size: 85%; -} - -ul.code-block, -ul.code-block li { - position: relative; - margin: 0px; - padding: 0px; - line-height: 1.5em; -} - -ul.code-block li { - padding: 0.75em 0.5em; -} - -ul.code-block li:nth-child(2n+1) { - background-color: #fcfcfc; -} - -ul.code-block li:last-child { - padding-bottom: 0px; -} - -ul.code-block li div { - position: absolute; - left: 0.5em; - top: 0.75em; /* note: match LI padding */ - width: 22em; /* left gutter */ - z-index: 2; /* sit on top */ -} - -ul.code-block li span { - position: relative; - display: block; - padding-left: 22.5em; /* room for left gutter */ - text-indent: -2em; -} - -/* special min-width case */ -#soundmanager-properties ul.code-block { - min-width: 43em; -} - -/** -* November 2011 homepage redesign -*/ - -div.oneup, -div.twoup, -div.threeup { - position: relative; - clear: both; - padding: 2em 1em 2.5em 1em; - *zoom:1; /* god damn shite IE */ -} - -div.oneup, -div.twoup, -div.threeup, -#about-sm2 h2.special, -#about-sm2 p { - text-shadow: 0px 1px 0px #fff; /* eh, why not. */ -} - -div.oneup .column { - position: relative; - width: 100%; -} - -div.twoup .column, -div.threeup .column { - position: relative; - float: left; - display: inline; - width: 33.3%; - _width: 32%; /* IE 6 */ -} - -div.twoup .column { - width: 50%; - _width: 49%; /* IE 6 can die */ -} - -div.oneup .column, -div.twoup .column, -div.threeup .column { - padding-bottom: 0.5em; -} - -div.oneup .column-wrapper, -div.twoup .column-wrapper, -div.threeup .column-wrapper { -/* - border-top: 1px dotted #d0d0d0; -*/ - margin: 0px 2.5em; -} - -div.oneup .column-wrapper.spaced-out, -div.twoup .column-wrapper.spaced-out, -div.threeup .column-wrapper.spaced-out { - /* spacing for columns without an <h3> header */ - padding-top: 6.25em; -} - -div.threeup.first { - padding-top: 0.75em; -} - -div.threeup.first .column-wrapper { - border-top: none; -} - -body.home #main .oneup p, -body.home #main .twoup p, -body.home #main .threeup p { - font-size: 1.1em; - line-height: 1.5em; - margin-bottom: 1.5em; -} - -body.home #main p.sidenote { - /* disclaimer */ - font-size: 92%; - color: #666; -} - -body.home h2 { - margin-top: 0px; -} - -body.home div.c3 { - /* pop discussion/support on top of margin */ - position: relative; - float: right; - display: inline; - margin-left: 30px; /* a little extra spacing, so the <h2> doesn't overlap */ - margin-top: -6px; - z-index: 2; - margin-bottom: 2.5em; -} - -body.home #inline-playlist { - float: none; - display: block; - width: auto; -} - -body.home .sm2-inline-list .ui360-vis { - /* center */ - margin: 0px auto; -} - -body.home ul.playlist { - font-size: 85%; -} - -body.home ul.playlist li { - font-size: 1.75em; - letter-spacing: -0.02em; -} - -body.home ul.playlist .sidenote { - font-size: 85%; -} - -body.home .demo-more, -body.home .demo-more-abs { - font-size: 95%; -} - -body.home ul.graphic { - margin-top: 1em; -} - -body.home ul.graphic { - position: relative; -} - -body.home ul.graphic li { - float: left; - display: inline; - width: 50%; - margin-bottom: 0px; -} - -body.home ul.graphic li a, -body.home ul.graphic li a.sm2_link { - display: block; - width: auto; - min-width: 8em; - margin-right: 0.5em; - margin-bottom: 0.5em; -} - -body.home ul li a:hover, -body.home ul.graphic a.sm2_playing, -body.home #inline-playlist li.sm2_paused a, -body.home #inline-playlist li.sm2_playing a, -body.home ul.playlist li div.timing, -body.home .feature-hot, -body.home #html5-support-li span { - /* take out shadow on most demo links */ - text-shadow: none; -} - -body.home .feature-hot { - /* hack: font size fix */ - font-size: 13px; -} - -body.home ul.graphic li a, -ul.playlist li a { - /* "..." on titles */ - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - /* crap IE */ - *overflow: auto; - *white-space: wrap; -} - -body.home ul.playlist li a, -body.home ul.playlist li a:hover { - line-height: 1.2em; -} - -body.home .demo-more a span, -body.home .demo-more-abs a span { - font-size: 1.5em; - line-height: 1em; -} - -body.home #sm2-visualization { - clear: both; - margin-top: 2em; -} - -body.home #sm2-visualization .ui360 { - float: none; - display: block; -} - -body.home #sm2-visualization .ui360 .sm2-360ui { - border-color: rgba(0,0,0,0.05); - background-color: rgba(255,255,255,0.5); - box-shadow: inset 0px 0px 32px rgba(0,0,0,0.075); -} - -body.home #sm2-visualization .ui360 canvas, -body.home #sm2-visualization .ui360 .sm2-360ui, -body.home #sm2-visualization .ui360 a { - border-radius: 128px; -} - -body.home #sm2-visualization .ui360 a { - /* put title underneath button */ - line-height: 340px; - *line-height: 480px; /* not crap IE, though. */ - line-height: 480px\9; /* nor IE 8. */ - color: #666 !important; /* hax */ - text-shadow: 0px 1px 0px #fff; -} - -:root body.home #sm2-visualization .ui360 a { - /* IE 9 correction */ - line-height: 340px\0/IE9; -} - -body.home #sm2-visualization .ui360 a, -body.home #sm2-visualization .ui360 canvas { - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; - -moz-transition-property: background-color, border, box-shadow; - -webkit-transition-property: background-color, border, box-shadow; - transition-property: background-color, border, box-shadow; -} - -body.home #sm2-visualization .ui360:hover { - background-color: rgba(0,0,0,0); -} - -body.home #sm2-visualization .ui360:hover a { - background-color: rgba(0,0,0,0.01); - border-color: rgba(0,0,0,0.1); - box-shadow: inset 0px 0px 32px rgba(0,0,0,0.05); -} - -body.home #sm2-visualization .ui360 .sm2_playing canvas, -body.home #sm2-visualization .ui360 .sm2_paused canvas { - /* hide song title while playing */ - background-color: #fafafa; - *background-color: transparent; /* not you, crap IE. */ - background-color: transparent\9; /* nor IE 8. */ -} - -body.home #sm2-visualization .ui360 .sm2_playing canvas, -body.home #sm2-visualization .ui360 .sm2_paused canvas { - background-color: #fafafa; - box-shadow: inset 0px 0px 32px rgba(0,0,0,0.066); -} - -body.home #sm2-visualization .ui360:hover .sm2_playing canvas, -body.home #sm2-visualization .ui360:hover .sm2_paused canvas { - background-color: #fafafa; - box-shadow: inset 0px 0px 32px rgba(0,0,0,0.1); -} - -body.home .gsfn_topic_list li { - /* by default, hide (and only show first X items.) */ - display: none; -} - -body.home .gsfn_topic_list .gsfn-item-1, -body.home .gsfn_topic_list .gsfn-item-2, -body.home .gsfn_topic_list .gsfn-item-3 { - /* show these items only. */ - display: block; -} - -div.clearfix { - font-size: 0px; - height: 0px; - overflow: hidden; -} - -div.icons ul { - list-style-type: none; -} - -div.icons ul, -div.icons ul li { - margin: 0px; - padding: 0px; -} - -div.icons ul li, -.icon { - position: relative; - display: inline-block; - vertical-align: middle; - *display: none; /* not you, crap IE. */ - background: transparent url(data:image/png;base64,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) no-repeat; - width: 32px; - height: 24px; - padding-right: 4px; - text-indent: -999em; - overflow: hidden; - cursor: help; - opacity: 0.75; -} - -div.icons ul li:hover, -.icon:hover { - opacity: 1; -} - -.icon { - display: inline-block; - *display: none; - width: 32px; - height: 30px; - margin-left: 16px; - margin-top: 5px; - opacity: 0.85; - cursor: default; -} - -div.icons ul li.desktop { - background-position: -11px -12px; - height: 24px; -} - -div.icons ul li.laptop { - background-position: -59px -13px; - height: 22px; -} - -div.icons ul li.ipad { - background-position: -109px -10px; - width: 28px; - height: 28px; -} - -div.icons ul li.iphone { - background-position: -256px -9px; - width: 22px; - height: 28px; -} - -div.icons ul li.android { - background-position: -299px -7px; - width: 28px; - height: 32px; -} - -.icon.performance, -div.icons ul li.performance { - background-position: -205px -9px; -} - -.icon.performance { - width: 18px; - height: 28px; - margin-top: -7px; -} - -.icon.music-note, -div.icons ul li.music-note { - background-position: -155px -13px; -} - -.icon.music-note { - width: 19px; - height: 23px; - margin-top: -4px; -} - -.icon.package, -div.icons ul li.package { - background-position: -347px -7px; - height: 28px; -} - -.icon.package { - width: 22px; - margin-top: -8px; -} - -.bonus-demos { - position: relative; - list-style-type: none; -} - -.bonus-demos, -.bonus-demos li { - margin: 0px; - padding: 0px; -} - -.bonus-demos li { - float: left; - display: inline; - width: 24%; - margin-right: 1%; - text-align: center; -} - -.bonus-demos li img { - border-radius: 4px; -} - -#client-requests ul.flat { - /* nested examples as in HTML5 vs. flash download behaviours */ - list-style-type: none; - padding-left: 0.5em; - margin-top: 0.5em; -} - -#client-requests ul.flat li { - margin-bottom: 0px; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html deleted file mode 100755 index 31133af0..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - -MP3 player demo - - - - - - - - - - - - -
    - -

    SoundManager 2 Demos

    - -

    - SoundManager 2 project page -

    - -
    - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js deleted file mode 100755 index e26c92bd..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/index.js +++ /dev/null @@ -1,621 +0,0 @@ -/* SoundManager 2 - project home utility JS */ - -var IS_CHRISTMAS = (document.domain.match(/schillmania.com/i) && new Date().getMonth() == 11) || window.location.toString().match(/christmas/i); - -function _id(sID) { - return document.getElementById(sID); -} - -getSoundByURL = function(sURL) { - return (typeof self.soundsByURL[sURL] != 'undefined'?self.soundsByURL[sURL]:null); -} - -function init() { - var o = document.getElementById('main'); - var el = o.getElementsByTagName('dt'); - for (var i=el.length; i--;) { - if ((i+1)%2==0) { - utils.addClass(el[i],'alt'); - } - } - var el = o.getElementsByTagName('dl'); - for (var i=el.length; i--;) { - if ((i+1)%2==0) { - utils.addClass(el[i],'alt'); - } - } - var newCSS; - if (IS_CHRISTMAS) { - // overflow-x: hidden hack for homepage during christmas light season (so explosion fragments don't cause horizontal scrollbars.) - var newCSS = document.body.className.split(' '); - newCSS.push('has-lights'); - document.body.className = newCSS.join(' '); - } -} - -function Utils() { - var self = this; - - this.hasClass = function(o,cStr) { - return (typeof(o.className)!='undefined'?new RegExp('(^|\\s)'+cStr+'(\\s|$)').test(o.className):false); - } - - this.addClass = function(o,cStr) { - if (!o || !cStr) return false; // safety net - if (self.hasClass(o,cStr)) return false; - o.className = (o.className?o.className+' ':'')+cStr; - } - - this.removeClass = function(o,cStr) { - if (!o || !cStr) return false; // safety net - if (!self.hasClass(o,cStr)) return false; - o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); - } - - this.toggleClass = function(o,cStr) { - var m = (self.hasClass(o,cStr)?self.removeClass:self.addClass); - m(o,cStr); - } - - this.getElementsByClassName = function(className,tagNames,oParent) { - var doc = (oParent||document); - var matches = []; - var i,j; - var nodes = []; - if (typeof(tagNames)!='undefined' && typeof(tagNames)!='string') { - for (i=tagNames.length; i--;) { - if (!nodes || !nodes[tagNames[i]]) { - nodes[tagNames[i]] = doc.getElementsByTagName(tagNames[i]); - } - } - } else if (tagNames) { - nodes = doc.getElementsByTagName(tagNames); - } else { - nodes = doc.all||doc.getElementsByTagName('*'); - } - if (typeof(tagNames)!='string') { - for (i=tagNames.length; i--;) { - for (j=nodes[tagNames[i]].length; j--;) { - if (self.hasClass(nodes[tagNames[i]][j],className)) { - matches[matches.length] = nodes[tagNames[i]][j]; - } - } - } - } else { - for (i=0; i'+o.innerHTML+'
    '; - _id('search-results').style.display = 'block'; - _id('filter-box').style.display = 'block'; - if (isClear) { - _id('filter-box').style.paddingBottom = '0px'; - _id('filter-box').style.display = 'none'; - } else { - _id('filter-box').style.paddingBottom = '0px'; - if (!navigator.userAgent.match(/msie/i)) { - _id('filter-box').style.paddingBottom = Math.max(0,(document.documentElement.scrollTop || window.scrollY)-utils.getOffY(_id('filter-box'))-parseInt(_id('filter-box').offsetHeight)-20)+'px'; - } - _id('filter-box').style.display = 'block'; - // if ((!document.documentElement.scrollTop && !window.scrollY)) _id('filter-box').style.display = 'none'; - } - if (lastSelected) { - if (lastSelected == o) { - utils.toggleClass(lastSelected,'active'); - } else { - utils.removeClass(lastSelected,'active'); - utils.addClass(o,'active'); - } - } else { - utils.addClass(o,'active'); - } - lastSelected = o; - if (typeof e.preventDefault !== 'undefined') { - e.preventDefault(); - } - // cancel bubble, too? - return false; - } -} - -function getLiveData() { - getDynamicData(); - // reinvigorate.net is a handy (and free!) stats tracking service thingy. you should check it out. - var is_live = (document.domain && document.domain.match(/schillmania.com/i) && typeof re_ != 'undefined'); - loadScript('http://include.reinvigorate.net/re_.js'); - setTimeout(function(){ - if (typeof re_ != 'undefined') re_(is_live?'f6795-v062d0xv4u':'u8v2l-jvr8058c6n'); - },3000); -} - -function getDynamicData() { - // Attempt to fetch data from schillmania.com: "Get Satisfaction" topics, version updates etc. - loadScript('http://www.schillmania.com/services/soundmanager2/info/?version='+soundManager.versionNumber+'&rnd='+parseInt(Math.random()*1048576)); -} - -function loadScript(sURL,onLoad) { - var loadScriptHandler = function() { - var rs = this.readyState; - if (rs == 'loaded' || rs == 'complete') { - this.onreadystatechange = null; - this.onload = null; - window.setTimeout(onLoad,20); - } - } - function scriptOnload() { - this.onreadystatechange = null; - this.onload = null; - window.setTimeout(onLoad,20); - } - var oS = document.createElement('script'); - oS.type = 'text/javascript'; - if (onLoad) { - oS.onreadystatechange = loadScriptHandler; - oS.onload = scriptOnload; - } - oS.src = sURL; - document.getElementsByTagName('head')[0].appendChild(oS); -} - -function doAltShortcuts() { -/* - var o = _id('shortcuts-list'); - if (!o) { - return false; - } - var oParents = []; - var oLIs = o.getElementsByTagName('li'); - var isIgnore = null; - var offset = 0; - for (var i=0; i - usePeakData: true, // [Flash 9 only] whether or not to show peak data (left/right channel values) - nor noticable on CPU - useWaveformData: false,// [Flash 9 only] show raw waveform data - WARNING: LIKELY VERY CPU-HEAVY - useEQData: false, // [Flash 9 only] show EQ (frequency spectrum) data - useFavIcon: false // try to apply peakData to address bar (Firefox + Opera) - performance note: appears to make Firefox 3 do some temporary, heavy disk access/swapping/garbage collection at first(?) - may be too heavy on CPU - } - - threeSixtyPlayer.config = { - - playNext: false, - autoPlay: false, - allowMultiple: true, - loadRingColor: '#ccc', - playRingColor: '#000', - backgroundRingColor: '#eee', - circleDiameter: 256, - circleRadius: 128, - scaleArcWidth: 1, - animDuration: 500, - animTransition: Animator.tx.bouncy, - showHMSTime: true, - - useWaveformData: true, - waveformDataColor: '#0099ff', - waveformDataDownsample: 2, - waveformDataOutside: false, - waveformDataConstrain: false, - waveformDataLineRatio: 0.73, - - useEQData: true, - eqDataColor: '#339933', - eqDataDownsample: 2, - eqDataOutside: true, - eqDataLineRatio: 0.69, - - usePeakData: true, - peakDataColor: '#ff33ff', - peakDataOutside: true, - peakDataLineRatio: 0.5, - - useAmplifier: true - - } - - if (navigator.platform.match(/win32/i) && navigator.userAgent.match(/firefox/i)) { - // extra-special homepage case (you should never see this), prevent out-of-view SWF load failure WITH high performance AND flashblock AND SWF in a placed element - soundManager.useHighPerformance = false; - } - - function checkBadSafari() { - var _ua = navigator.userAgent; - if (!document.location.href.match(/sm2-usehtml5audio/i) && !window.location.toString().match(/sm2\-ignorebadua/i) && _ua.match(/safari/i) && !_ua.match(/chrome/i) && _ua.match(/OS X 10_6_([3-7])/i)) { // Safari 4 and 5 occasionally fail to load/play HTML5 audio on Snow Leopard due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Known Apple "radar" bug. https://bugs.webkit.org/show_bug.cgi?id=32159 - var complaint = document.createElement('li'); - complaint.innerHTML = 'Note: Partial HTML5 in effect. Using Flash for MP3/MP4 formats (if available) for this browser/OS due to HTML5 audio load/play failures in Safari 4 + 5 on Snow Leopard 10.6.3 - 10.6.7 (purportedly fixed in OS X 10.6.8 and 10.7 "Lion.") Issue caused by bugs in QuickTime X and/or underlying frameworks. See bugs.webkit.org #32519. (Safari on iOS, Leopard and Windows OK, however.)

    Try HTML5 anyway? (some MP3 playback may intermittently fail.)'; - _id('html5-audio-notes').appendChild(complaint); - } - } - - soundManager.onready(function() { - - _id('sm2-support').style.display = 'none'; - _id('sm2-support-warning').style.display = 'none'; - - if (soundManager.didFlashBlock) { - soundManager.createSound({ - id: 'success', - url: 'demo/_mp3/mouseover.mp3' - }).play(); - } - - doChristmasLights(); - - // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt - - var _hasFlash; - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; - - if (nP && nP.length) { - - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - - } else if (typeof AX !== 'undefined') { - - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - // oh well - } - hasPlugin = (!!obj); - - } - - _hasFlash = hasPlugin; - - // if using HTML5, show some additional format support info - // written while watching The Big Lebowski for the Nth time. Donny, you're out of your element! - var s = soundManager; - - if (s.useHTML5Audio && s.hasHTML5) { - var liID = 'html5-support-li'; - var oldLI = document.getElementById(liID); - if (oldLI) { - oldLI.parentNode.removeChild(oldLI); - } - // what lies. not an

  • at all. ;) - var li = document.createElement('div'); - li.id = liID; - li.className = 'html5support'; - var items = []; - var needsFlash = false; - for (item in s.audioFormats) { - if (s.audioFormats.hasOwnProperty(item)) { - needsFlash = (soundManager.filePattern.test('.' + item)); - items.push('' + (s.html5[item] ? '<' : '') + item + (s.html5[item] ? '>' : '') + ''); - } - } - - li.innerHTML = [ - 'This browser\'s <HTML5> vs. Flash support:

    ', - items.join(''), - '
    ', - '', - (soundManager.html5.mp3 || soundManager.html5.mp4 ? (_hasFlash && soundManager.preferFlash ? 'Preferring flash for MP3/MP4; try preferFlash=false for HTML5-only mode.' : (soundManager.html5Only ? 'HTML5-only mode.' + (!soundManager.canPlayMIME('audio/aac') ? ' Try preferFlash=true for MP4 support as needed.' : '') : '  Some flash required; allowing HTML5 to play MP3/MP4, as supported.' + '

    ')) : 'Flash is required for this browser to play MP3/MP4.'), - '' - ].join(''); - _id('html5-audio-notes').appendChild(li); - _id('without-html5').style.display = 'inline'; - - } else { - - _id('without-html5').style.display = 'none'; - - } - - checkBadSafari(); - - // check inline player / HTML 5 bits - var items = utils.getElementsByClassName('button-exclude', 'a', _id('inline-playlist')).concat(utils.getElementsByClassName('exclude', 'a', _id('graphic-playlist'))); - for (var i = 0, j = items.length; i < j; i++) { - if (!soundManager.canPlayLink(items[i])) { - items[i].className += ' not-supported'; - items[i].title += '. \n\nNOTE: '+(soundManager.useHTML5Audio?'Format apparently not supported under this configuration or browser.':'SoundManager 2\'s HTML5 feature is not currently enabled. (Try turning it on, see +html5 link.)'); - } - } - - }); - - soundManager.ontimeout(function() { - - // failed to load - - if (navigator.userAgent.match(/msie 6/i)) { - // we don't care. - return false; - } - - var o = _id('sm2-support'); - var o2 = _id('sm2-support-warning'); - var smLoadFailWarning = '

    Oh snap!

    ' + (soundManager.hasHTML5 ? 'The flash portion of ' : '') + 'SoundManager 2 was unable to start. ' + (soundManager.useHTML5Audio ? (soundManager.hasHTML5 ? '

    Some HTML5 audio support is present, but flash is needed for MP3/MP4 support on this page.' : '

    No HTML5 support was found, so flash is required.') : '' ) + '

    All links to audio will degrade gracefully.

    If you have a flash blocker, try allowing the SWF to run - it may be visible below.

    ' + (soundManager.useAltURL ? 'Viewing offline? You may need to change a Flash security setting.' : 'Other possible causes: Missing .SWF, or no Flash?') + ' Not to worry, as guided help is provided.

    Troubleshooting

    '; - var hatesFlash = (navigator.userAgent.match(/(ipad|iphone|ipod)/i)); - - if (soundManager.html5.mp3 && soundManager.html5.mp4) { - // flash portion was blocked, but support exists. We'll "downgrade" to HTML5-only. - soundManager._wD('Special homepage case: Flash appears to blocked, HTML5 support for MP3/MP4 exists; trying HTML5-only mode...'); - soundManager.useHTML5Audio = true; - soundManager.preferFlash = false; - setTimeout(function() { - soundManager.reboot(); - soundManager.onready(function() { - // for when things start up in HTML5-only mode... - o.innerHTML = '

    Support note

    SoundManager 2 tried to start using HTML5 + Flash, but rebooted in HTML5-only mode as flash was blocked. Visualization demo features will not be shown in this mode. To enable flash, whitelist the blocked movie and reload this page.

    '+(soundManager.useAltURL?'

    Running offline? Flash may be blocked due to security restrictions; see troubleshooting for more.':'')+'

    '; - o.style.marginBottom = '1.5em'; - o.style.display = 'block'; - }); - }, 1); - return false; - } - - o.innerHTML = smLoadFailWarning; - o2.innerHTML = '

    SoundManager 2 could not start. See below for details.

    '; - if (hatesFlash || soundManager.getMoviePercent()) { - // movie loaded at least somewhat, so don't show flashblock things - _id('flashblocker').style.display = 'none'; - if (hatesFlash) { - // none of that here. - _id('flash-offline').style.display = 'none'; - } - } - o.style.marginBottom = '1.5em'; - o.style.display = 'block'; - o2.style.display = 'inline-block'; - }); - -} - -// side note: If it's not december but you want to smash things, try #christmas=1 in the homepage URL. - -// --------- /home JS ------------ - -function startStuff() { - if (navigator.userAgent.match(/safari/i)) { - document.getElementsByTagName('html')[0].className = 'isSafari'; - } - doVersion(); - ie6Sucks(); - fixLinks(); - getLiveData(); - doAltShortcuts(); -} - -if (document.addEventListener) { - document.addEventListener("DOMContentLoaded", startStuff, false); -} else { - window.onload = startStuff; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html deleted file mode 100755 index f2510a5b..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/basic.html +++ /dev/null @@ -1,56 +0,0 @@ - - - -SoundManager 2 Demo: Basic MP3 Play Button (Simple Demo) - - - - - - - - - - - -

    SoundManager 2 / Basic MP3 Play Button: Template

    - -

    View the source code of this page for detail. Don't forget to set debugMode: false to disable debug output.

    - -

    Walking Walking

    - -

    Armstrong Beat Armstrong Beat

    - -

    SoundManager 2 project home

    - -
  • - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css deleted file mode 100755 index 495b0614..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/css/mp3-player-button.css +++ /dev/null @@ -1,117 +0,0 @@ -/* - - SoundManager 2: Basic MP3 player CSS - ------------------------------------ - - Clicks on links to MP3s are intercepted via JS, calls are - made to SoundManager to load/play sounds. CSS classes are - appended to the link, which are used to highlight the - current play state and so on. - - Class names are applied in addition to "sm2_button" base. - - Default: - - sm2_button - - Additional states: - - sm2_playing - sm2_paused - - eg. - - - some.mp3 - - - some.mp3 - - - Note you don't require ul.graphic / ul.flat etc. for your use - if only using one style on a page. You can just use .sm2_button{} - and so on, but isolate the CSS you want. - - Side note: Would do multiple class definitions eg. - - a.sm2_default.sm2_playing{} - - .. except IE 6 has a parsing bug which may break behaviour, - applying sm2_playing {} even when the class is set to sm2_default. - - - If you want to make your own UI from scratch, here is the base: - - Default + hover state, "click to play": - - a.sm2_button {} - a.sm2_button:hover {} - - Playing + hover state, "click to pause": - - a.sm2_playing {} - a.sm2_playing:hover {} - - Paused + hover state, "click to resume": - - a.sm2_paused {} - a.sm2_paused:hover {} - -*/ - -a.sm2_button { - position:relative; - display:inline-block; /* If you worry about old browser bugs, Firefox 2 might not like this and may need -moz-inline-box instead. :D */ - width:18px; - height:18px; - text-indent:-9999px; /* don't show link text */ - overflow:hidden; /* don't draw inner link text */ - vertical-align:middle; - /* and, a bit of round-ness for the cool browsers. */ - border-radius:6px; - margin-top:-1px; /* vertical align tweak */ - /* safari 3.1+ fun (/W3 working draft extension, TBD.) */ - -webkit-transition-property: hover; - -webkit-transition: all 0.2s ease-in-out; - -moz-transition: all 0.2s ease-in-out 0s; /* firefox 4 (couldn't sort out -moz-transform vs. MozTransform, so, "all" for now) */ - -o-transition-property: background-color; /* opera 10.5 */ - -o-transition-duration: 0.15s; - /* weird IE 6/7 display fixes, and/or I'm doing it wrong */ - *text-indent:0px; - *line-height:99em; - *vertical-align: top; -} - -a.sm2_button:focus { - outline:none; /* maybe evil, but don't show the slight border outline on focus. */ -} - -a.sm2_button, -a.sm2_button.sm2_paused:hover { - background-color:#3399cc; - background-image:url(../image/arrow-right-white.png); - /* where possible, use data: and skip the HTTP request. Fancy-pants. Would use short-hand background: for above, but IE 8 doesn't override background-image. */ - background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAKCAYAAABmBXS+AAAAbklEQVQY02NgQAL//v1jZMAF/v//vwuIs9HEUBUBTbj4HwIeA3EGVsVAxtn/qOAVUGM8uknIiv4hsV8A5ZKxKfoLVvnvHwifAzLtMKwDSQLBVSBti27dJajkcSD2RJODO3wtkOOMz/tMSJJYAxMA5dmsL0IfubQAAAAASUVORK5CYII=); - *background-image:url(../image/arrow-right-white.gif); /* IE 6+7 don't do DATA: URIs */ - background-repeat:no-repeat; - background-position:5px 50%; - *background-position:5px 4px; /* IE 6 again */ -} - -a.sm2_button:hover, -a.sm2_button.sm2_playing, -a.sm2_button.sm2_playing:hover { - background-color:#cc3333; -} - -a.sm2_button.sm2_playing, -a.sm2_button.sm2_playing:hover { - -moz-transform:rotate(90deg); - -webkit-transform:rotate(90deg); - -ms-transform:rotate(90deg); -} - -a.sm2_button.sm2_paused, -a.sm2_button.sm2_paused:hover { - background-color:#666; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-black.gif deleted file mode 100755 index 6205273c316116296bdd8685ce98450a15156810..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66 zcmZ?wbhEHb}k%ntXH#@73N>L%*ya=4xd9h@t5-754=4#6KD&Ar>mdKI;Vst046#ybN~PV diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/image/arrow-right-white.gif deleted file mode 100755 index d9ccd365f2efd63387d9dd8053eb3bbf6ab8eb55..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60 zcmZ?wbhEHbw9=kJovxv z|4p715AGlR|Np=Jzxj=8UcIU3sQ9Wcw~R~a3%}34AJfmY1n@ZhpKo}tEt^Ga*RS(p w%RUNCsQ$BGebdM6|CWob7;|pbt1M??Xi{=mbwkcH1!xI_r>mdKI;Vst0O3eE-2eap diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html deleted file mode 100755 index 5c737141..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/index.html +++ /dev/null @@ -1,195 +0,0 @@ - - - -SoundManager 2 Demo: Basic MP3 Play Button - - - - - - - - - - - - - -
    - -

    SoundManager 2 / Inline MP3 Player Button

    - -

    Basic MP3 Play Button Examples

    (also see basic demo.) - -
    - -
    - -
    - -

    Inline text, with "play" button

    - -

    Example code (link with a sm2_button CSS class):

    -
    <p> <a href="/path/to/coins.mp3" title="Play &quot;coins&quot;" class="sm2_button">coins.mp3</a> Spare change</p>
    -

    Renders as:

    -
    -

    coins.mp3 Spare change

    -

    Note that the text inside the link is hidden and replaced with an image, but should be descriptive - or at least should say something generic, like "play".

    -
    -

    Basic MP3 play button, no text

    - -

    Code:

    - -
    <a href="../_mp3/office_lobby.mp3" title="Play &quot;Office Lobby&quot;" class="sm2_button">Office Lobby</a>
    - -

    Renders as:

    -

    - Office Lobby -

    -

    How It Works

    - -

    SoundManager 2 intercepts clicks to MP3 links and plays them inline. The script assigns additional CSS classes to the links to indicate their state (playing/paused, etc.)

    - -

    Static Examples

    - -

    CSS classes are dynamically applied as follows:

    - - - -

    Basic CSS

    - -

    If you want to make your own UI from scratch, here is the base:

    - -
    - Default + hover state, "click to play":
    -
    - a.sm2_button {}
    - a.sm2_button:hover {}
    -
    - Playing + hover state, "click to pause":
    -
    - a.sm2_button.sm2_playing {}
    - a.sm2_button.sm2_playing:hover {}
    -
    - Paused + hover state, "click to resume":
    -
    - a.sm2_button.sm2_paused {}
    - a.sm2_button.sm2_paused:hover {}
    -
    - -

    Other Options

    - -

    By default, one sound will be played at a time; you can easily change a "config" object value to turn on playlist-like behaviour (i.e., play the next MP3 when the current one finishes.)

    - -
    -
    -// (within mp3-player-button.js)
    -this.config = {
    - playNext: false // stop after one sound, or play through list until end
    -}
    -
    - -

    I'd like to use this.

    -

    See this basic demo for reference.

    - -

    - SoundManager 2 project page (not an MP3 link) -

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js deleted file mode 100755 index dc79ee52..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mp3-player-button/script/mp3-player-button.js +++ /dev/null @@ -1,260 +0,0 @@ -/** - * SoundManager 2 Demo: Play MP3 links via button - * ---------------------------------------------- - * - * http://schillmania.com/projects/soundmanager2/ - * - * A simple demo making MP3s playable "inline" - * and easily styled/customizable via CSS. - * - * A variation of the "play mp3 links" demo. - * - * Requires SoundManager 2 Javascript API. - */ - -/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, regexp: false, newcap: true, immed: true */ -/*global document, window, soundManager, navigator */ - -function BasicMP3Player() { - var self = this, - pl = this, - sm = soundManager, // soundManager instance - isTouchDevice = (navigator.userAgent.match(/ipad|iphone/i)), - isIE = (navigator.userAgent.match(/msie/i)); - this.excludeClass = 'button-exclude'; // CSS class for ignoring MP3 links - this.links = []; - this.sounds = []; - this.soundsByURL = {}; - this.indexByURL = {}; - this.lastSound = null; - this.soundCount = 0; - - this.config = { - // configuration options - playNext: false, // stop after one sound, or play through list until end - autoPlay: false // start playing the first sound right away - }; - - this.css = { - // CSS class names appended to link during various states - sDefault: 'sm2_button', // default state - sLoading: 'sm2_loading', - sPlaying: 'sm2_playing', - sPaused: 'sm2_paused' - }; - - // event + DOM utils - - this.includeClass = this.css.sDefault; - - this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.addEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - o.attachEvent('on'+evtName,evtHandler); - }); - - this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.removeEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - return o.detachEvent('on'+evtName,evtHandler); - }); - - this.classContains = function(o,cStr) { - return (typeof(o.className)!=='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false); - }; - - this.addClass = function(o,cStr) { - if (!o || !cStr || self.classContains(o,cStr)) { - return false; - } - o.className = (o.className?o.className+' ':'')+cStr; - }; - - this.removeClass = function(o,cStr) { - if (!o || !cStr || !self.classContains(o,cStr)) { - return false; - } - o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); - }; - - this.getSoundByURL = function(sURL) { - return (typeof self.soundsByURL[sURL] !== 'undefined' ? self.soundsByURL[sURL] : null); - }; - - this.isChildOfNode = function(o,sNodeName) { - if (!o || !o.parentNode) { - return false; - } - sNodeName = sNodeName.toLowerCase(); - do { - o = o.parentNode; - } while (o && o.parentNode && o.nodeName.toLowerCase() !== sNodeName); - return (o.nodeName.toLowerCase() === sNodeName ? o : null); - }; - - this.events = { - - // handlers for sound events as they're started/stopped/played - - play: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLink,this._data.className); - }, - - stop: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = ''; - }, - - pause: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPaused; - pl.addClass(this._data.oLink,this._data.className); - }, - - resume: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLink,this._data.className); - }, - - finish: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = ''; - if (pl.config.playNext) { - var nextLink = (pl.indexByURL[this._data.oLink.href]+1); - if (nextLink1) { - // ignore right-click - return true; - } - var o = self.getTheDamnLink(e), - sURL, - soundURL, - thisSound; - if (o.nodeName.toLowerCase() !== 'a') { - o = self.isChildOfNode(o,'a'); - if (!o) { - return true; - } - } - sURL = o.getAttribute('href'); - if (!o.href || !soundManager.canPlayLink(o) || self.classContains(o,self.excludeClass)) { - return true; // pass-thru for non-MP3/non-links - } - if (!self.classContains(o,self.includeClass)) { - return true; - } - sm._writeDebug('handleClick()'); - soundURL = (o.href); - thisSound = self.getSoundByURL(soundURL); - if (thisSound) { - // already exists - if (thisSound === self.lastSound) { - // and was playing (or paused) - thisSound.togglePause(); - } else { - // different sound - thisSound.togglePause(); // start playing current - sm._writeDebug('sound different than last sound: '+self.lastSound.id); - if (self.lastSound) { - self.stopSound(self.lastSound); - } - } - } else { - // create sound - thisSound = sm.createSound({ - id:'basicMP3Sound'+(self.soundCount++), - url:soundURL, - onplay:self.events.play, - onstop:self.events.stop, - onpause:self.events.pause, - onresume:self.events.resume, - onfinish:self.events.finish, - type:(o.type||null) - }); - // tack on some custom data - thisSound._data = { - oLink: o, // DOM node for reference within SM2 object event handlers - className: self.css.sPlaying - }; - self.soundsByURL[soundURL] = thisSound; - self.sounds.push(thisSound); - if (self.lastSound) { - // stop last sound - self.stopSound(self.lastSound); - } - thisSound.play(); - } - self.lastSound = thisSound; // reference for next call - return self.stopEvent(e); - }; - - this.stopSound = function(oSound) { - soundManager.stop(oSound.id); - if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) - soundManager.unload(oSound.id); - } - }; - - this.init = function() { - sm._writeDebug('basicMP3Player.init()'); - var i, j, - foundItems = 0, - oLinks = document.getElementsByTagName('a'); - // grab all links, look for .mp3 - for (i=0, j=oLinks.length; i0) { - self.addEventHandler(document,'click',self.handleClick); - if (self.config.autoPlay) { - self.handleClick({target:self.links[0],preventDefault:function(){}}); - } - } - sm._writeDebug('basicMP3Player.init(): Found '+foundItems+' relevant items.'); - }; - - this.init(); - -} - -var basicMP3Player = null; - -soundManager.setup({ - preferFlash: false, - onready: function() { - basicMP3Player = new BasicMP3Player(); - } -}); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml deleted file mode 100755 index 3d6606ae..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/acoustic-drumkit.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_BD_1.mp3 deleted file mode 100755 index ac40028ea65e031977fc9b6a09a5615208ba8816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12416 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 F`d`6lpMU@W diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHCL.mp3 deleted file mode 100755 index 583313404e6afc815e18023bf3171d2270eaf772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5642 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 Ts~beau2=u&xc~3^mjwO;%sBDI diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHOP.mp3 deleted file mode 100755 index 679376c89a1db0330f3ad0632aeebcddf23a3c93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45139 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 G^WOl$`Sqm$ diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HHPD.mp3 deleted file mode 100755 index 79bf78c296538c91ef588b605d1e0a04538109a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7523 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 R2OtDN?*7lU@_(X1{||)_yg~o~ diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_HTM.mp3 deleted file mode 100755 index 990d8f1e68a0c9693db2394d8bae08ba8c7a49ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15986 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 Izkl`r0F`6o=l}o! diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_LTM2.mp3 deleted file mode 100755 index d9c371c15b3f4f26c1f2ca5f5dbef0ead07786ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20062 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_MTM.mp3 deleted file mode 100755 index cadd93e6aa4e0a63dde7883449b5f51250e6934b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18808 zcmc$k<8vil*zR|XiS3Dv9ou%YW822Wnb@}NWMbR4ZD)dsCz#~SJnwtHoPXeSRae*Q z{?J`l{qF0&dad>O<~RiSe-CMUbBDk8kpG^%0D!ay01_4!5fK#=6AzDwl$45!j){ql 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_RIM1.mp3 deleted file mode 100755 index 354c35ab85f7295a0b83ec17009e23f5d55c48e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5955 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 Q=3@14NBsZbzf9mi0EaAKQ2+n{ diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN13.mp3 deleted file mode 100755 index 319348cd4e73f9d93867293d1c25df4cbfbaca0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17554 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 UO>CZ#`~RSD|C_7$f8%NY2ivd7H2?qr diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/AMB_SN_5.mp3 deleted file mode 100755 index baf7a87948f927e3866f918b3d8faa4935066988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15046 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CHINA_1.mp3 deleted file mode 100755 index 18a514261a361930a0efeb62cf09d6faf8d4bb46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46393 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_1.mp3 deleted file mode 100755 index db773015fa0682866b91be40e169a2f2c83e8b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61440 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/CRASH_5.mp3 deleted file mode 100755 index 4d999f26e9d46c1ff5f96f38015d57b5bcf57966..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53603 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 rBE`-HI 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

    Q@8$}#5Y3nPOZPMi5k8d=a(lpLu6Q5{f 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 L|N653pRWEFy)nea diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_1.mp3 deleted file mode 100755 index 1e5601c65a5b6176d461154a11a03a294809bb9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49841 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/audio/RIDE_3.mp3 deleted file mode 100755 index 701e150ca6812ab6840d812be9a6e8a569d2e1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38243 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

      rF5w9%7_!~&s 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
      - -
      - -

      SoundManager 2: Javascript Drum Machine Demo

      -

      Trigger the pads to play different sounds.

      -

      View with debug output

      -

      Photo: MPC 2500 by .schill on Flickr

      -

      (If supported): Your browser is cool and is using 100% HTML5 Audio. Look ma, no Flash!

      -
      - -
      - -
      - -
        -
      • 1
      • -
      • 2
      • -
      • 3
      • -
      • 4
      • -
      - -
        -
      • q
      • -
      • w
      • -
      • e
      • -
      • r
      • -
      - -
        -
      • a
      • -
      • s
      • -
      • d
      • -
      • f
      • -
      - -
        -
      • z
      • -
      • x
      • -
      • c
      • -
      • v
      • -
      - -
      - -
      - -
      - - - -

      |h}Dq@t{9Bx6r#ryHl`2AlK4 zhi6-;;Y=2nNL_74$9i=xT3BdH?5r0-&nO#m)jBRVmiAJens6p_W1wEO3~sry$A?R4EGBuNW+1e7>dW94?C@P%z#>zYAd8Z;r@q24gl3D zjUw69mAwewgdjm{zmv0Rff*0BCqWd3f+~hOxyhb73W6b@6|A!Ip^{V1GMk0tYj)p_ zG6IW}qN))2GIzOv%k~b(UAl_!3-P5_w+jTp_acWOjg{R;C*~JtZhe;`8ZX`$JR*PK zDV+9hiu~;QEolg{pIw5<8-{s&Y2N3yM%r323zG6#k{$NhqZA zmV}7ka8f6yY%iv2{NZYR$pW0~plbB~2hq-`0p<*&aMt(u!-j(V==w`fY^6pJNnAO$ z4qoXn!MnocH?_ss$mjGo3Q40<|LmGIw;4^tAs4JHjtUj}S?>O8#R#ZdQ6A(1(ROM+ zZFcyXr*l0w)%7i099l$a7W*mMVoc3EX^t(B2ptVQfp2G)^Vo{!Fx-kDBNgPJ^0P>M zLN-qcTjCuEKaft)QixkOc7o;!#D$%3%THH!S}9VhD_b^+&gdVxxG*wVWs1qqNv*Fc znUj#<>;cntRYw}SmasC(o=KZ^k-ngAmea}h>6OpfzR=pksmY)RN0jlvYoq!oh^u4G2768tHQnIeiJD+|PwOK_XM7Zkf=2Wn}cESl~>d$BWxbjd?w(84V~SEQr0li%%ogv!Ro zd`+64mgo~MWws@w&wy0ExAXLj&-i`%@%wZ2q)5@^(a=Dih^@mnsZeR-VCn zqN3QomhH6_$>&EJbPFxHzgVkXclom!;doQcRrFJoo`I61x@d0H;~+07fq4dH-&)(D zH+1m~&{P~B>RJKI{g}U9LBzyQ@Y*XGA9D^mH={tndkFu;mE&~I}C*w z9S~Gk8mr3ZY?;Qy^B>I8h8STE5T1E)!I0m-`q?3(9zFJqJ89iZYf~s4DxFNJteU8c zPtJ8+f+@5p-q?McDcdPza}QUcN*l;zSiie$02U*Z%bMAnQf6&YO5-GvgyO z^7*fPT2AVc{HZ^Kn!)DjeO;zOBTt90(Ig#8cFZ|*1iYRq=_Eg>QJM^@KAHWOa$%6D z&v*x!Z&g)4lukqthMjA6{NpK>F-8}WBcvS^-5W(j({M?ZR3qC>B8AHdoaxLUZJ^X% zuWQj%H?#$zGVjf`L$*LRr4L)8^x+>!$YRo@fNLsPvPN3^@ zyf7Wz@u@p*BLg3dIkH;qm0Krf7A3yx;v^&0;wX{@RarTsp88CFmCIc>8ObVO=ryoJ zoH`0HuqHERjF&6$ssu-us&|D~M6r%fCx$5-1Q2aAK$L@qfmGV#3aL)KI}}pD!zs55 z6*(|lg7P0J%^m!#nO+IEfwqY>tbnEOLPptPv7J}~Yy|>ryR&^;(_j|dD=9+8y`o!1f z<@}Jf8BGbTPq#aJ^Qrj^9=^2y7D-Jlxl7_G7aSY>&aS(8fK682NjCNySxdueZ~o0n z4;_XVPeZd;I`@TcE^pDcet>iE_kL5rlGlAoAiDz(89aM$?ma)dtc*w7$(9 znlysdq|q&Cm6@#LDcC6>^bqb~ocF0TkWhXJqS;hZ7vc(1BWA&PE(MI+AN(Wz4h}eU zgqoP7KJ=MH==_GUA~fSmc>=WB5mvX-_`_a%V|H6g>E);e9&&&UN{(lho EFS9%J^#A|> diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css deleted file mode 100755 index cddf9f0d..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/css/mpc.css +++ /dev/null @@ -1,158 +0,0 @@ -/* Demo/example CSS - not needed for general use */ - -body { - background:#000; - font:normal 75% "helvetica neue",helvetica,verdana,arial,tahoma,"times new roman","sans serif"; - color:#fff; - margin:0px; - padding:0px; -} - -#background { - position:absolute; - left:0px; - top:0px; - width:100%; - height:100%; - background:transparent url(http://farm1.static.flickr.com/45/191496680_97cdc5351b_b.jpg) no-repeat 50% 50%; -} - -#site { - position:relative; - z-index:2; - background:rgba(0,0,0,0.5); - padding:1em; -} - -#site h1 { - margin-top:0px; -} - -#site p { - margin:0.5em 0px 0.5em 0px; -} - -#site p:last-child { - margin:0px; -} - -.clear { - float:none; - clear:both; - font-size:1px; - line-height:1px; - height:1px; - overflow:hidden; -} - -#mpc { - position:absolute; - left:50%; - top:50%; - margin-left:-19em; - margin-top:-19em; - width:38em; - _width:37.3em; - border:3px solid #666; - border:3px solid rgba(255,255,255,0.25); - border-radius:12px; - z-index:2; -} - -#mpc #wrapper { - position:relative; - background:#333; - background:rgba(0,0,0,0.5); - padding:0.5em; - border-radius:12px; -} - -#mpc ul { - margin:0px; - padding:0px; - margin-left:2px; - *margin-left:1em; - _margin-left:2px; - padding:2px 0px 2px 0px; -} - -#mpc ul li { - position:relative; - float:left; - display:inline; - width:7em; - height:7em; - margin:0.5em; - background:#999; - border:1px solid rgba(0,0,0,0.75); - border-radius:2px; - font:normal 1em/1em "helvetica",verdana,arial,system; - padding:0.5em; - cursor:pointer; - cursor:hand; - color:#eee; - text-transform:uppercase; - font-weight:bold; -} - -#mpc ul li span { - text-transform:none; - font-weight:normal; - color:#ccc; -} - -#mpc ul li.active { - background:#666; -} - -#mpc ul li div { - /* progress indicator */ - position:absolute; - left:0px; - bottom:1em; - font-size:1em; - line-height:1em; - height:1em; - margin:0px 0px 0px 1em; - width:6em; - background:#888 url(../image/progress.png) no-repeat -256px 0px; - background-repeat:no-repeat; - border:1px solid #666; - visibility:hidden; -} - -#mpc ul li.active div, -#mpc ul li.loading div { - visibility:visible; -} - -#soundmanager-debug { - position:absolute; - right:20px; - bottom:20px; - height:12em; - width:50em; - overflow:auto; - margin-left:1em; -} - -#soundmanager-debug div { - font-size:11px; - font-family: "lucida console",system,verdana,arial; /* IE doesn't seem to obey short-hand font family here? */ - padding:0px 1em 0.5em 0px; -} - -#mpc-debug, -.note { - color:#999; -} - -#mpc-debug a, -.note a { - color:#6699cc; - text-decoration:none; -} - -#isHTML5 { - display:none; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/image/progress.png deleted file mode 100755 index cfd26fbefabe18c952631a1821f2cb697dba9a48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1452 zcmV;d1ylNoP)pz1rQA65Tlt*DfA~Q|!@(Fiu-2U3yK2>{k6p8G?qTdaFyX}0E|Mz8 zJt}KQ!J?J#bNwmbJZ4zeAy=khzQ>GLdK1`Z`V(hd9$0(P{As9P1CQ86`=^HNtoW1<&l^K6GfqElsPx-lYrTPczDS?t} zpwWufJ3_`n)hW9mZyN8q6X9NOzaIGQJRk~t3FH@OEbk(y+1ILxvG_Qg^HN7CFkfMhGh@`NQqRIFvCUmO)t&E2A=$VKrr z8?7+G4ymG=2ofu&Ws+F`jai+AY+u)`$hL^_~{KFj=y~$=IjcY2X~5g zlpt}*^P;OWM30q3u$z|>VG?=!W{(U;F$MWddHQz4A}kxx#N7lu%2K6xDI_2t9xftJ zxallK2CGmaK_?i6ZOs&xV2c;;ZiT24$}6q)+=X#qwuLHapdeAb%F_&w?uNX z%B2fM;v0Erpx9(xk2X+VDO6gf))rOq{$>RMxUZ<5rDxOMO-ETGl<2VG>6nfMly?L#T+X{p_SZqVfnq)P@KY?F+M01Es^z z2<7x8#*rs zXUhG?%y=XEQuPS^ax0`J+tkC#(jtwbe#N~Jd4i*%DVOK{eLBcVqfu_^vZHjPDOg?q z8@ni$ZcavBt(Py$im;t^3e!aRsWJJyowkN(B(&ARBAU0-(T(1fe-)y00SX^ z>v8P9914Te03ZMe00MvjAOHve0)PM@00;mAfB+x>2mk|D7jP%bx&jyg0000 - - -SoundManager 2: A Javascript Sound API - MPC Demo - - - - - - - - - - - - -

    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js deleted file mode 100755 index c53912c0..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/mpc/script/mpc.js +++ /dev/null @@ -1,134 +0,0 @@ -/** - * SoundManager 2: MPC (Drum Machine) demo - */ - -var MPC = function() { - var self = this; - this.idPrefix = 'btn-'; // HTML ID prefix - this.statusWidth = 6; - this.progressWidth = 256; - this.keys = {'1':0,'2':1,'3':2,'4':3,'q':4,'w':5,'e':6,'r':7,'a':8,'s':9,'d':10,'f':11,'z':12,'x':13,'c':14,'v':15} - - // scope within these event handler methods: "this" = SMSound() object instance (see SMSound() in soundmanager.js for reference) - - this.showProgress = function() { - // sound is loading, update bytes received using this.bytesLoaded / this.bytesTotal - if (self._getButton(this.id).className != 'loading') self._getButton(this.id).className = 'loading'; // a bit inefficient here.. - self._showStatus(this.id,this.bytesLoaded,this.bytesTotal); - } - - this.onload = function() { - var sID = this.id; - self._getButton(this.id).className = ''; - self._getButton(this.id).title = ('Sound ID: '+this.id+' ('+this.url+')'); - } - - this.onfinish = function() { - self._getButton(this.id).className = ''; - self._reset(this.id); - } - - this.onplay = function() { - self._getButton(this.id).className = 'active'; - } - - this.whileplaying = function() { - self._showStatus(this.id,this.position,this.duration); - } - - this._keyHandler = function(e) { - var oEvt = e?e:event; - var sChar = String.fromCharCode(oEvt.keyCode).toLowerCase(); - if (typeof self.keys[sChar] != 'undefined') soundManager.play('s'+self.keys[sChar]); - } - - this._showStatus = function(sID,n1,n2) { - var o = self._getButton(sID).getElementsByTagName('div')[0]; - var offX = (n2>0?(-self.progressWidth+parseInt((n1/n2)*o.offsetWidth)):-self.progressWidth); - o.style.backgroundPosition = offX+'px 0px'; - } - - this._getButton = function(sID) { - return document.getElementById(self.idPrefix+sID); - } - - this._reset = function(sID) { - var id = sID; - self._showStatus(sID,1,1); - setTimeout(function(){self._showStatus(sID,0,0);},200); - } - - this.init = function() { - document.onkeydown = self._keyHandler; - } - -} - -var mpc = new MPC(); - -soundManager.flashVersion = (window.location.toString().match(/#flash8/i)?8:9); -if (soundManager.flashVersion != 8) { - soundManager.useHighPerformance = true; -} - -soundManager.setup({ - url: '../../swf/', // path to load SWF from (overriding default) - bgColor: '#333333', - wmode: 'transparent', - debugMode: false, - preferFlash: false, - html5PollingInterval: 50, - onready: function() { - - soundManager.setup({ - defaultOptions: { - autoLoad: true, - multiShot: true, - whileloading: mpc.showProgress, - onid3: mpc.onid3, - onload: mpc.onload, - onplay: mpc.onplay, - whileplaying: mpc.whileplaying, - onfinish: mpc.onfinish - } - }); - - // This is the "onload" equivalent which is called when SoundManager has been initialised (sounds can be created, etc.) - mpc.init(); - - if (!soundManager.html5.needsFlash) { - document.getElementById('isHTML5').style.display = 'inline'; - } - - var soundURLs = 'AMB_BD_1,AMB_FTM2,AMB_HHCL,AMB_HHOP,AMB_HHPD,AMB_HTM,AMB_LTM2,AMB_MTM,AMB_RIM1,AMB_SN13,AMB_SN_5,CHINA_1,CRASH_1,CRASH_5,CRASH_6,RIDE_1'.split(','); - for (var i=0; i - - -SoundManager 2 Demo: Play MP3 links on a page, "page as playlist" style - - - - - - - - - - - - -
    - -

    SoundManager 2 / page as a playlist, basic template (flash 8)

    - -
    - -
    - - - -

    For alternate themes, add the class to the playlist UL - eg. <ul class="playlist dark"> or <ul class="playlist bubblegum">; the base default is <ul class="playlist">.

    - -

    A reminder that if loading from the local filesystem, Flash will deny access to remote (network/internet) URLs by default unless whitelisted via the Flash Player Global Security Settings Page. Some URLs in this example are remote to demonstrate this.

    - -

    Note that by default, the Flash 8 version is used and therefore Flash 9-only features such as the VU meter, waveform etc. are not available. Refer to the main "page player" demo for configuration examples, or view the source of page-player.js for the configuration object (similar to that used in SoundManager 2 itself.)

    - -

    SoundManager 2 project

    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css deleted file mode 100755 index 89776425..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/demo.css +++ /dev/null @@ -1,124 +0,0 @@ -/* - ----------------------------------------------------------------- - In-page demo CSS for code, documentation etc. - See page-player.css for actual playlist-relevant stuff. - ----------------------------------------------------------------- - */ - -#soundmanager-debug { - /* SM2 debug container (optional, makes debug more useable) */ - position:absolute;position:fixed;*position:absolute;bottom:10px;right:10px;width:50em;height:18em;overflow:auto;background:#fff;margin:1em;padding:1em;border:1px solid #999;font-family:"lucida console",verdana,tahoma,"sans serif";font-size:x-small;line-height:1.5em;opacity:0.9;filter:alpha(opacity=90);z-index:99; -} - -body { - font:75% normal verdana,arial,tahoma,"sans serif"; -} - -h1, h2, h3 { - font:300 3em "Helvetica Neue",georgia,"times new roman","Arial Rounded MT Bold",helvetica,verdana,tahoma,arial,"sans serif"; - margin-bottom:0px; -} - -h1, h2 { - letter-spacing:-1px; /* zomg web x.0! ;) */ -} - -h1, h2, h3 { - float:left; - clear:both; - border-bottom:1px solid #999; - padding-bottom:1px; - margin-bottom:0.25em; -} - -h1 { - margin-top:0px; - margin-bottom:0px; - background-color:#666; - color:#ccc; - margin-left:-5px; - padding-left:5px; - padding-right:5px; -} - -h1, -h1 a { - color:#fff; - text-decoration:none; -} - -h1 a:hover { - text-decoration:underline; -} - -h2 { - font-size:2em; - margin-top:1em; - background-color:#aaa; - color:#fff; - padding:5px; - margin-left:-5px; - min-width:23em; -} - -h3 { - font-size:1.65em; - margin-top:0.5em; - margin-bottom:0.25em; - color:#333; - min-width:28em; -} - -h3 a { - font-size:small; -} - -h4 { - color:#444; -} - -ul.notes { - margin-left:0px; - padding-left:1.5em; -} - -.note { - margin-top:0px; - font-style:italic; - color:#999; -} - -pre { - font-size:1.2em; - _font-size:1em; -} - -code { - font-family:"lucida console",monaco,courier,system; - font-size:1em; - color:#003366; -} - -code span { - color:#666; -} - -ul, -p, -pre { - clear:left; - max-width:46em; -} - -ul.tight li { - max-width:44.5em; -} - -ul.playlist { - /* undo the above nonsense */ - max-width:none; -} - -ul.tight { - padding-left:1.5em; -} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css deleted file mode 100755 index 16b4964c..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-annotations.css +++ /dev/null @@ -1,162 +0,0 @@ -/* - ------------------------------------------ - -- annotations (sub-tracks, notes etc.) -- - ------------------------------------------ -*/ - -ul.playlist li a.sm2_link .metadata { - display:none; /* hide by default */ -} - -ul.playlist li.sm2_paused a.sm2_link .metadata, -ul.playlist li.sm2_playing a.sm2_link .metadata { - display:inline; -} - -ul.playlist li ul { - list-style-type:none; - margin:0px; - padding:0px; - position:relative; - font-size:small; - display:none; -} - -ul.playlist li ul li { - position:relative; - margin:0px; - padding:2px 3px; - border:1px solid transparent; - border-radius:6px; - margin-right:1em; - font-family:helvetica,verdana,tahoma,arial,"sans serif"; - font-size:x-small; - font-weight:300; - letter-spacing:0px; - background-color:transparent; - opacity:0.66; -} - -ul.playlist li ul li:hover { - opacity:1; - background-color:#fff; - border-color:#ccc; - color:#666; -} - -ul.playlist li.sm2_playing ul li, -ul.playlist li.sm2_paused ul li { - color:#fff; -} - -ul.playlist li.sm2_playing ul li:hover { - background-color:#fff; - color:#5588bb; - border-color:#336699; - opacity:0.9; -} - -ul.playlist li.sm2_paused ul li:hover { - background-color:#888; -} - -/* metadata */ - -ul.playlist li .metadata .duration { - /* optional timing data */ - display:none; -} - -ul.playlist li .metadata ul li p { - margin:0px; - padding:0px; -} - -ul.playlist li .metadata ul li span { - display:none; -} - -ul.playlist li .controls .statusbar .annotation { - position:absolute; - background-color:transparent; - top:0px; - color:#666; - text-align:right; - margin-left:10px; - height:0.5em; -} - -ul.playlist li .controls .statusbar .annotation:hover { - z-index:12; /* sit on top of note */ -} - -ul.playlist li .controls .statusbar .annotation span.bubble { - /* using · */ - display:inline-block; - background-color:#fff; - border:1px solid #666; - border-radius:6px; -} - -ul.playlist li .controls .statusbar .annotation span { - display:block; - background:transparent url(../image/divot.png) no-repeat 50% 0px; - width:15px; - margin-left:-15px; - height:12px; - text-align:center; -} - -ul.playlist li .controls .statusbar .annotation.alt { - top:auto; - bottom:0px; -} - -ul.playlist li .controls .statusbar .annotation span:hover { - cursor:none; /* Fx3 rules. */ - margin-top:0.1em; -} - -ul.playlist li .controls .statusbar .annotation.alt span:hover { - margin-top:-0.1em; -} - -ul.playlist li .controls .statusbar .annotation.alt span { - background:transparent url(../image/divot-bottom.png) no-repeat 50% bottom; -} - -ul.playlist li .note { - position:absolute; - display:none; - left:0px; - top:0px; - z-index:10; - font-size:x-small; - padding:2px 4px 2px 4px; - width:auto; - color:#666; - background-color:#fff; - border:1px solid #ccc; - border-radius:6px; - font-style:normal; - font-weight:bold; - font-family:arial,tahoma,verdana,"sans serif"; - letter-spacing:0px; - margin-top:1.1em; -} - -ul.playlist li .note.alt { - margin-top:-1.32em; -} - -ul.playlist li .note:hover { - display:block !important; -} - -ul.playlist li .sm2_divider { - font-size:0.75em; -} - -ul.playlist li .sm2_metadata { - font-size:0.65em; -} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css deleted file mode 100755 index 0b85b44e..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/optional-themes.css +++ /dev/null @@ -1,200 +0,0 @@ -/* - --------------------------------- - -- alternate (optional) themes -- - --------------------------------- -*/ - -ul.playlist.dark li.sm2_playing a { - color:#fff; -} - -ul.playlist.dark li.sm2_playing .timing, -ul.playlist.use-peak.dark li.sm2_playing .peak { - color:#999; -} - -ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container { - background-color:#222; - border-color:#444; -} - -ul.playlist.use-spectrum.dark li.sm2_playing .spectrum-container .spectrum { - background-color:#999; -} - -ul.playlist.dark li.sm2_paused { - background-color:#333; -} - -ul.playlist.dark li.sm2_paused a { - color:#999; -} - -ul.playlist.dark li.sm2_playing, -ul.playlist.dark li.sm2_playing:hover { - background-color:#333; -} - -ul.playlist.dark li:hover .controls .statusbar { - background-color:#666; -} - -ul.playlist.dark li .controls { - background-color:#333; -} - -ul.playlist.dark li .controls .statusbar { - background-color:#666; - border-color:#444; -} - -ul.playlist.dark li .controls .statusbar .position { - background-color:#111; - border-right:3px solid #111; - border-radius:3px; -} - -ul.playlist.dark li .controls .statusbar .loading { - background-color:#444; -} - -ul.playlist.dark li .timing, -ul.playlist.use-peak.dark li .peak { - background-color:#222; - border-color:#444; -} - -ul.playlist.dark.use-peak li .peak .l, -ul.playlist.dark.use-peak li .peak .r { - border-color:#444; - background-color:#999; -} - - -/* gold theme */ - -ul.playlist.gold li.sm2_paused { - background-color:#996600; -} - -ul.playlist.gold li.sm2_playing, -ul.playlist.gold li.sm2_playing:hover { - background-color:#cc9900; -} - -ul.playlist.gold li .controls { - background-color:transparent; -} - -ul.playlist.gold li .controls .statusbar { - background-color:#fff; - border-color:#fff; -} - -ul.playlist.gold li .controls .statusbar .position { - background-color:#996600; - border-right:3px solid #996600; - border-radius:3px; -} - -ul.playlist.gold li .controls .statusbar .loading { - background-color:#ffeedd; -} - -ul.playlist.gold li .timing, -ul.playlist.use-peak.gold li .peak { - background-color:#CC9900; - border-color:#ffcc33; -} - -ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container { - background-color:#cc9900; - border-color:#ffcc33; -} - -ul.playlist.use-spectrum.gold li.sm2_playing .spectrum-container .spectrum { - background-color:#fff; -} - -ul.playlist.gold.use-peak li .peak .l, -ul.playlist.gold.use-peak li .peak .r { - border-color:#fff; - background-color:#fff; -} - - -/* ZOMG PONIES!!!ONEONEONE */ - -ul.playlist.bubblegum li a { - font-family:"comic sans ms",verdana,arial,tahoma,"sans serif"; /* heh */ -} - -ul.playlist.bubblegum li.sm2_paused, -ul.playlist.bubblegum li.sm2_paused:hover { - background-color:#ffccee; -} - -ul.playlist.bubblegum li.sm2_paused a, -ul.playlist.bubblegum li.sm2_paused:hover a, -ul.playlist.bubblegum li.sm2_paused .timing, -ul.playlist.use-peak.bubblegum li.sm2_paused .peak { - color:#ff6699; -} - -ul.playlist.bubblegum li:hover { - background-color:#ffddee; -} - -ul.playlist.bubblegum li.sm2_playing, -ul.playlist.bubblegum li.sm2_playing:hover { - background-color:#ff7799; -} - -ul.playlist.bubblegum li .controls { - background-color:transparent; -} - -ul.playlist.bubblegum li .controls .statusbar { - background-color:#fff; - border-color:#fff; -} - -ul.playlist.bubblegum li .controls .statusbar .position { - background-color:#ffaacc; - border-right:3px solid #ffaacc; - border-radius:3px; -} - -ul.playlist.bubblegum li .controls .statusbar .loading { - background-color:#ffeedd; -} - -ul.playlist.bubblegum li .timing, -ul.playlist.use-peak.bubblegum li .peak { - background-color:#ffaacc; - border-color:#ffccee; -} - -ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container { - background-color:#ffaacc; - border-color:#ffccee; -} - -ul.playlist.use-spectrum.bubblegum li.sm2_playing .spectrum-container .spectrum { - background-color:#fff; -} - -ul.playlist.bubblegum.use-peak li .peak .l, -ul.playlist.bubblegum.use-peak li .peak .r { - border-color:#fff; - background-color:#fff; -} - - -ul.playlist.shiny li.sm2_paused, -ul.playlist.shiny li.sm2_playing { - background-image:url(../image/top-highlight.png); - background-repeat:repeat-x; - background-position:0px -1px; - _background-image:none; /* can't be bothered with IE 6. */ -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css deleted file mode 100755 index 9c0098fa..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/css/page-player.css +++ /dev/null @@ -1,307 +0,0 @@ -/* - - SoundManager 2: "page as playlist" example - ------------------------------------------ - http://schillmania.com/projects/soundmanager2/ - -*/ - -.spectrum-container { - display:none; -} - -ul.use-spectrum li.sm2_playing .spectrum-container { - position:absolute; - left:0px; - top:0px; - margin-left:-266px; - margin-top:-1px; - display:block; - background-color:#5588bb; - border:1px solid #99ccff; - border-radius:4px; -} - -ul.use-spectrum .spectrum-box { - position:relative; - width:255px; - font-size:1em; - padding:2px 0px; - height:1.2em; - overflow:hidden; -} - -ul.use-spectrum .spectrum-box .spectrum { - position:absolute; - left:0px; - top:-2px; - margin-top:20px; - display:block; - font-size:1px; - width:1px; - height:1px; /* set to 50px for a thick line, 1px for a thin line, etc. */ - overflow:hidden; - background-color:#fff; -} - -ul.playlist { - list-style-type:none; - margin:0px; - padding:0px; - -} - -ul.playlist li { - /* assume all items will be sounds rather than wait for onload etc. in this example.. may differ for your uses. */ - position:relative; - display:block; - width:auto; - font-size:2em; - color:#666; - padding:0.25em 0.5em 0.25em 0.5em; - border:none; - letter-spacing:-1px; /* ZOMG WEB X.0. ;) */ - background-color:#f9f9f9; - -webkit-transition-property: hover; - -webkit-transition: background-color 0.15s ease-in-out; - -moz-transition: background-color 0.15s linear 0s; /* firefox 4 */ - -o-transition-property: background-color; /* opera 10.5 */ - -o-transition-duration: 0.15s; - -} - -ul.playlist li a { - display:block; - text-decoration:none; - font-weight:normal; - color:#000; - font-size:120%; - outline:none; - position:relative; - z-index:2; -} - -ul.playlist li.sm2_playing, -ul.playlist li.sm2_paused, -ul.playlist li.sm2_playing a { - color:#fff; - border-radius:3px; -} - -ul.playlist li:hover { - background-color:#eee; -} - -ul.playlist li:hover a { - color:#333; -} - -ul.playlist li.sm2_playing, -ul.playlist li.sm2_playing:hover { - background-color:#6699cc; -} - -ul.playlist li.sm2_paused { - background-color:#999; -} - -ul.playlist li.sm2_playing:hover a, -ul.playlist li.sm2_paused a { - color:#fff; -} - -ul.playlist li .controls { - display:none; -} - -ul.playlist li .peak, -ul.playlist.use-peak li .peak { - display:none; - position:absolute; - top:0.55em; - right:0.5em; -} - -ul.playlist li.sm2_playing .controls, -ul.playlist li.sm2_paused .controls { - position:relative; - display:block; -} - -ul.playlist.use-peak li.sm2_playing .peak, -ul.playlist.use-peak li.sm2_paused .peak { - display:inline; - display:inline-block; -} - -ul.playlist.use-peak li .peak { - display:none; /* IE 7 */ -} - -ul.playlist li.sm2_paused .controls { - background-color:#666; -} - -ul.playlist li:hover .controls .statusbar { - position:relative; - cursor:ew-resize; - cursor:-moz-grab; - cursor:grab; -} - -ul.playlist li.sm2_paused .controls .statusbar { - background-color:#ccc; -} - -ul.playlist li .controls { - position:relative; - margin-top:0.25em; - margin-bottom:0.25em; - background-color:#99ccff; -} - -ul.playlist li .controls .statusbar { - position:relative; - height:0.5em; - background-color:#ccddff; - border:2px solid #fff; - border-radius:2px; - overflow:hidden; - cursor:-moz-grab; - cursor:grab; -} - -ul.playlist li .controls.dragging .statusbar { - cursor:-moz-grabbing; - cursor:grabbing; -} - -ul.playlist li .controls .statusbar .position, -ul.playlist li .controls .statusbar .loading, -ul.playlist li .controls .statusbar .annotation { - position:absolute; - left:0px; - top:0px; - height:0.5em; -} - -ul.playlist li .controls .statusbar .position { - background-color:#336699; - border-right:3px solid #336699; - border-radius:3px; -} - -ul.playlist li.sm2_paused .controls .statusbar .position { - background-color:#666; - border-color:#666; -} - -ul.playlist li .controls .statusbar .loading { - background-color:#eee; -} - -ul.playlist li .controls .statusbar .position, -ul.playlist li .controls .statusbar .loading { - width:0px; -} - -ul.playlist li.sm2_playing a.sm2_link, -ul.playlist li.sm2_paused a.sm2_link { - margin-right:4.5em; /* room for timing stuff */ -} - -ul.playlist li .timing { - position:absolute; - display:none; - text-align:right; - right:1em; - top:1em; - width:auto; - height:1em; - padding:3px 5px; - background-color:#5588bb; - border:1px solid #99ccff; - border-radius:4px; - letter-spacing:0px; - font:44% monaco,"VT-100","lucida console",courier,system; - line-height:1em; - vertical-align:middle; -} - -ul.playlist.use-peak li .timing { - right:4.25em; -} - -ul.playlist li:hover .timing { - z-index:2; -} - -ul.playlist li .timing div.sm2_timing { - margin:0px; - padding:0px; - margin-top:-1em; -} - -ul.playlist li.sm2_playing .timing, -ul.playlist li.sm2_paused .timing { - display:block; -} - -ul.playlist li.sm2_paused .timing .sm2_position { - text-decoration:blink; /* hee hee. first actual appropriate use? :D */ -} - -ul.playlist li.sm2_paused .timing, -ul.playlist.use-peak li.sm2_paused .peak { - background-color:#888; - border-color:#ccc; -} - -/* peak data */ - -/* ul.playlist ... */ - -ul.playlist.use-peak li .peak { - display:none; - zoom:1; - border:1px solid #99ccff; - padding:2px; - height:0.55em; - border-radius:4px; - background-color:#5588bb; - width:0.8em; - height:0.55em; - margin-top:-3px; -} - -ul.playlist.use-peak li .peak-box { - position:relative; - width:100%; - height:0.55em; - overflow:hidden; -} - -ul.playlist li .peak .l, -ul.playlist li .peak .r { - position:absolute; - left:0px; - top:0px; - width:7px; - height:50px; - background:#fff; - border:1px solid #fff; - border-radius:1px; - margin-top:1em; -} - -ul.playlist li .peak .l { - margin-right:1px; -} - -ul.playlist li .peak .r { - left:10px; -} - -#control-template { - display:none; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot-bottom.png deleted file mode 100755 index 929b42d3022e3e3766eed5455c31740d65b9dc43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^{6NgX!2%?EZsk@2sRU0K$B+ufWChj@Mjsdr^-ktI zzpeg-S8~P%Povg|y|uso|G(Q^6jj7yz_B>O?&t;ucLK6V8 Cm^cyu diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/image/divot.png deleted file mode 100755 index 76c5ee537d76bd5269f00b66014a2b2ec9b50c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^{2p7^bmrD{zOh|HI_E8MW zpa1WF{r5$4rpYk#7%3P=Zl0Sz|AKkT%OfmncxoKZ7;rJ{nC)40d8dCF&_)JNS3j3^ HP69*YC91r6&DGMdRITw;u~I^fK{!%F7C z5&4Be409Qn4iqyoaVRt}FmW94WnjF)31oh#OIKECRJ(6t4z!EG)78&qol`;+07ob< A2LJ#7 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html deleted file mode 100755 index 678d2e8f..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/index.html +++ /dev/null @@ -1,379 +0,0 @@ - - - -SoundManager 2 Demo: Play MP3 links on a page, "page as playlist" style - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    SoundManager 2 / "Page as a playlist"

    - -

    Muxtape.com-style UI, MP3/AAC Player Example

    - -

    This page uses Flash 9-based effects where supported. The default config uses Flash 8.

    - -

    You can also try enabling experimental visualization features.

    - -
    - -
    - - - -

    MPEG4 / H.264 + HE-AAC (Flash "MovieStar" 9.0r115+) format support - audio-only example

    -

    A subset of MPEG4 is supported including AAC, FLV, MP4, M4A, MOV, MP4V, 3GP and 3G2 files.

    - - - -

    Basics

    - -

    Don't want a Flash 9 requirement, EQ/waveform, perhaps less CPU? See Flash 8-based basic demo.

    - -

    Clicking a title will start loading + playing, or pause, a sound.

    -

    Once loading, click (or click and drag) on the loading/position bar to seek within the sound.

    -

    The document title reflects the currently-playing sound, and by default the list will play sequentially if left alone. (This is configurable.)

    - -

    Themes

    -

    Just for fun, a few color schemes (visible when playing/paused):

    - - -
    -
    - -
    -
    - - -

    Experimental (Alpha) Variant: MP3 "Metadata": Annotations / notes / sub-tracks

    -

    A potential approach to noting interesting moments in sounds, scene changes, new tracks in seamless DJ mixes etc. Keep in mind this is a single MP3 being loaded, but annotations are placed along the timeline as shown.

    -

    A "metadata" element contains a nested list of data (UL/LI combination) - in this case, a summary of each scene - and the time at which this item occurs/begins. In order to help with positioning, the total length of the sound is also specified up-front. View the source code of this page for the details.

    - -
      - -
    • - A Virtual Haircut (3 scenes) - -
    • - -
    • - Rubber Chicken Launch (Office) - -
    • - -
    - -

    How It Works

    - -

    This example uses SoundManager 2 to find links to MP3 files within an unordered list, and makes them playable "in-place" on a page. The script assigns CSS classes to links' parent LI nodes to indicate their state (playing/paused, etc.)

    - -

    Progressive Enhancement

    - -

    This provides a nice HTML base for all browsers and user agents, and enhances progressively for those with Javascript and Flash. Links pointing to MP3s are assigned an onclick handler which intercepts the click (preventing the browser from following the link and unloading the page. SM2 will then create sound objects as needed to play the MP3s. In the event there is an error at runtime or a lack of support (no JS/Flash etc.), the browser will simply load the MP3s directly as it normally would. This includes iPhones, etc.

    - -

    HTML Fragments (UI Element Templates)

    -

    Each item in the playlist has its own set of controls and progress indicators, etc. This content is defined once as a hidden template of HTML in the player JavaScript file, separate from the playlist markup, and is cloned for each item as needed. This can be easily styled with CSS as well, of course.

    - -

    I'd like to use this.

    -

    See this basic demo for reference.

    -

    The basic demo uses the default Flash 8 configuration, but you can easily change this to use Flash 9 features. The only difference in code is the configuration.

    - -

    A reminder that if loading from the local filesystem, Flash will deny access to remote (network/internet) URLs by default unless whitelisted via the Flash Player Global Security Settings Page. Some URLs in this example are remote to demonstrate this.

    - -

    Configuration + Options

    - -

    Default configuration

    - -

    Behaviours such as auto-start and UI elements like VU meters and spectrum graphs are easy configurable, using an object literal format as shown below.

    -

    The page player config (see related page-player.js file) as below.

    -

    The custom parameters used to make this demo page are highlighted in red.

    -
      // ( within page-player.js )
    -
    -  soundManager.setup({
    -    // If you need flash 9, include this line.
    -    flashVersion: 9
    -  });
    -
    -  this.config = {
    -    usePeakData: true,     // [Flash 9 only] show peak (VU-meter) data
    -    useFavIcon: true,      // try to show peakData in address bar (Firefox + Opera) - requires usePeakData = true too, of course.
    -    useWaveformData: true, // [Flash 9 only] true: show raw waveform data - WARNING: CPU-intensive
    -    useEQData: false,      // [Flash 9 only] show EQ (frequency spectrum) data - WARNING: CPU-intensive
    -    fillGraph: false,      // [Flash 9 only] draw full lines instead of only top (peak) spectrum points
    -    allowRightClick:true,  // let users right-click MP3 links ("save as...", etc.) or discourage (can't prevent.)
    -    useThrottling: false,  // try to rate-limit potentially-expensive calls (eg. dragging position around)
    -    autoStart: false,      // begin playing first sound when page loads
    -    playNext: true,        // stop after one sound, or play through list until end
    -    updatePageTitle: true, // change the page title while playing sounds
    -    emptyTime: '-:--'      // null/undefined timer values (before data is available)
    -  }
    -
    - -

    Per-page configuration override

    - -

    Alternately, you may override the defaults on a per-page basis by defining an "alternate configuration" object before the page-player.js file has been included in your source code:

    - -
      // ( before soundManager.onready() has fired )
    -
    -  soundManager.setup({
    -    // If you need flash 9, include this line.
    -    flashVersion: 9
    -  });
    -
    -  var PP_CONFIG = {
    -    usePeakData: true,     // [Flash 9 only] whether or not to show peak data (no notable CPU cost)
    -    useWaveformData: true  // [Flash 9 only] show raw waveform data. WARNING: Experimental, likely CPU-heavy
    -  }
    - -

    Any options specified in PP_CONFIG will override the defaults defined in page-player.js.

    - -

    Basic CSS

    - -
    - If you want to make your own UI from scratch, here is the base:
    -
    - ul.playlist {}
    -
    - Default + hover state, "click to play":
    -
    - li.sm2_link {}
    - li.sm2_link:hover {}
    -
    - Playing + hover state, "click to pause":
    -
    - li.sm2_playing {}
    - li.sm2_playing:hover {}
    -
    - Paused + hover state, "click to resume":
    -
    - li.sm2_paused {}
    - li.sm2_paused:hover {}
    -
    - -

    The positioning (load status / control bar) template is also applied after each MP3 link, from an element named "control-template"

    - -

    "loading" and "position" have background colors applied, and have their width adjusted dynamically by SM2 as the sound(s) load/play. "timing" is replaced with the current time / duration, eg. 1:23 / 4:20

    -

    The class names applied can be edited within the source JS also, for convenience.

    -

    The controls are shown and hidden via the same dynamic CSS updates. See the source CSS for the timing / status bar layout.

    - -

    Performance Considerations

    -

    Experimental Flash 9 features

    -
      -
    • -

      Dynamic "favicon" VU meter

      -

      The VU meter "favicon" option as shown in the address/location bar for Firefox and Opera can cause a lot of disk access in Firefox (2.x/3.0 at time of writing, from what has been reported.) It may be garbage collection-related.

      -

      The behaviour seems to be connected to the dynamic swapping of <link> elements with data: URIs containing the VU meter data, and looks to be noticeable with the first sound played - after which point things settle down. Perhaps the browser is attempting to cache the favicon data being assigned.

      -
    • -
    • -

      Waveform/spectrum visualization graph

      -

      Enabling the waveformData and/or eqData features will result in some heavy DOM calls (manipulation of 256 <div> elements with each "frame" drawn) which can eat up a good amount of CPU and may make really old computers cower in fear.

      -

      Ultimately, the UI refresh rate will simply be limited if a CPU ceiling is hit, and audio playback should not be affected.

      -
    • -
    - -

    More CSS comments

    - -
    -
    -
    - SoundManager 2: "page as playlist" example
    - ------------------------------------------
    -
    - Clicks on links to MP3s are intercepted via JS, calls are
    - made to SoundManager to load/play sounds. CSS classes are
    - appended to the LI parent, which are used to highlight the
    - current play state and so on.
    -
    - Class names are applied in addition to "sm2_link" base.
    -
    - Default:
    -
    - sm2_link
    -
    - Additional states:
    -
    - sm2_playing
    - sm2_paused
    -
    - eg.
    -
    - <!-- default -->
    - <li class="sm2_link"><a href="some.mp3">some.mp3</a></li>
    -
    - <!-- playing -->
    - <li class="sm2_link sm2_playing"><a href="some.mp3">some.mp3</a></li>
    -
    - The script also injects an HTML template containing control bar
    - and timing elements, which can also be targeted with CSS.
    -
    -
    - Note you don't necessarily require ul.playlist for your use
    - if only using one style on a page. You can just use .sm2_link
    - and so on, but isolate the CSS you want.
    -
    - Side note: Would do multiple class definitions eg.
    -
    - li.sm2_default.sm2_playing{}
    -
    - .. except IE 6 has a parsing bug which may break behaviour,
    - applying sm2_playing {} even when the class is set to sm2_default.
    -
    -
    - If you want to make your own UI from scratch, here is the base:
    -
    - Default + hover state, "click to play":
    -
    - li.sm2_link {}
    - li.sm2_link:hover {}
    -
    - Playing + hover state, "click to pause":
    -
    - li.sm2_playing {}
    - li.sm2_playing:hover {}
    -
    - Paused + hover state, "click to resume":
    -
    - li.sm2_paused {}
    - li.sm2_paused:hover {}
    -
    -
    - -

    SoundManager 2 project home

    - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js deleted file mode 100755 index 0faa0e35..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/script/optional-page-player-metadata.js +++ /dev/null @@ -1,142 +0,0 @@ -// SoundManager 2: Page Player demo, MetaData UI prototype - -/*jslint white: false, onevar: true, undef: true, nomen: false, eqeqeq: true, plusplus: false, bitwise: true, newcap: true, immed: true */ -/*global pagePlayer, document, window */ - -var Metadata = function(oSound) { - - var self = this, - pl = pagePlayer, - oLI = oSound._data.oLI, - o = oLI.getElementsByTagName('ul')[0], - oItems = o.getElementsByTagName('li'), - oTemplate = document.createElement('div'), - oTemplate2 = document.createElement('div'), - oTemplate3 = document.createElement('div'), - oDuration, i; - - oTemplate.innerHTML = ' '; - oTemplate.className = 'annotation'; - oTemplate2.innerHTML = ' '; - oTemplate2.className = 'annotation alt'; - oTemplate3.className = 'note'; - - this.totalTime = 0; - this.data = []; - this.data.givenDuration = null; - this.data.currentItem = null; - this.data.mainTitle = oSound._data.oLink.innerHTML; - - this.strToTime = function(sTime) { - var segments = sTime.split(':'), - seconds = 0, i; - for (i=segments.length; i--;) { - seconds += parseInt(segments[i],10)*Math.pow(60,segments.length-1-i); // hours, minutes - } - return seconds; - }; - - // make stuff - this.createElements = function() { - var oFrag = document.createDocumentFragment(), - oNode = null, - oNodeSpan = null, - oNode2 = null, i; - for (i=0; i= metadata[i].startTimeMS && now <= metadata[i].endTimeMS) { - index = i; - break; - } - } - if (index !== metadata.currentItem) { - // update - oSound._data.oLink.innerHTML = metadata.mainTitle+' '; - pl.setPageTitle(metadata[index].title+' | '+metadata.mainTitle); - metadata.currentItem = index; - } - }; - - this.refresh = function() { - var offset = 0, - relWidth = null, - duration = (self.data.givenDuration?self.data.givenDuration:oSound.durationEstimate), i; - for (i=0; i 3) { - args.pop(); // no capture - } - } else if (len === 3) { - args.push(false); - } - return args; - } - - function apply(args, sType) { - var element = args.shift(), - method = [evt[sType]]; - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - } - - function add() { - apply(getArgs(arguments), 'add'); - } - - function remove() { - apply(getArgs(arguments), 'remove'); - } - - return { - 'add': add, - 'remove': remove - }; - - }()); - - // event + DOM utilities - - this.hasClass = function(o, cStr) { - return (typeof(o.className)!=='undefined'?new RegExp('(^|\\s)'+cStr+'(\\s|$)').test(o.className):false); - }; - - this.addClass = function(o, cStr) { - if (!o || !cStr || self.hasClass(o,cStr)) { - return false; // safety net - } - o.className = (o.className?o.className+' ':'')+cStr; - }; - - this.removeClass = function(o, cStr) { - if (!o || !cStr || !self.hasClass(o,cStr)) { - return false; - } - o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); - }; - - this.select = function(className, oParent) { - var result = self.getByClassName(className, 'div', oParent||null); - return (result ? result[0] : null); - }; - - this.getByClassName = (document.querySelectorAll ? function(className, tagNames, oParent) { // tagNames: string or ['div', 'p'] etc. - - var pattern = ('.'+className), qs; - if (tagNames) { - tagNames = tagNames.split(' '); - } - qs = (tagNames.length > 1 ? tagNames.join(pattern+', ') : tagNames[0]+pattern); - return (oParent?oParent:document).querySelectorAll(qs); - - } : function(className, tagNames, oParent) { - - var node = (oParent?oParent:document), matches = [], i, j, nodes = []; - if (tagNames) { - tagNames = tagNames.split(' '); - } - if (tagNames instanceof Array) { - for (i=tagNames.length; i--;) { - if (!nodes || !nodes[tagNames[i]]) { - nodes[tagNames[i]] = node.getElementsByTagName(tagNames[i]); - } - } - for (i=tagNames.length; i--;) { - for (j=nodes[tagNames[i]].length; j--;) { - if (self.hasClass(nodes[tagNames[i]][j], className)) { - matches.push(nodes[tagNames[i]][j]); - } - } - } - } else { - nodes = node.all||node.getElementsByTagName('*'); - for (i=0, j=nodes.length; i playlist item, find previous
  • and then - if (o.previousElementSibling) { - o = o.previousElementSibling; - } else { - o = o.previousSibling; // move from original node.. - while (o && o.previousSibling && o.previousSibling.nodeType !== 1) { - o = o.previousSibling; - } - } - if (o.nodeName.toLowerCase() !== 'li') { - return null; - } else { - return o.getElementsByTagName('a')[0]; - } - }; - - this.playPrevious = function(oSound) { - if (!oSound) { - oSound = self.lastSound; - } - if (!oSound) { - return false; - } - var previousItem = self.getPreviousItem(oSound._data.oLI); - if (previousItem) { - pl.handleClick({target:previousItem}); // fake a click event - aren't we sneaky. ;) - } - return previousItem; - }; - - this.getNextItem = function(o) { - // given
  • playlist item, find next
  • and then - if (o.nextElementSibling) { - o = o.nextElementSibling; - } else { - o = o.nextSibling; // move from original node.. - while (o && o.nextSibling && o.nextSibling.nodeType !== 1) { - o = o.nextSibling; - } - } - if (o.nodeName.toLowerCase() !== 'li') { - return null; - } else { - return o.getElementsByTagName('a')[0]; - } - }; - - this.playNext = function(oSound) { - if (!oSound) { - oSound = self.lastSound; - } - if (!oSound) { - return false; - } - var nextItem = self.getNextItem(oSound._data.oLI); - if (nextItem) { - pl.handleClick({target:nextItem}); // fake a click event - aren't we sneaky. ;) - } - return nextItem; - }; - - this.setPageTitle = function(sTitle) { - if (!self.config.updatePageTitle) { - return false; - } - try { - document.title = (sTitle?sTitle+' - ':'')+self.pageTitle; - } catch(e) { - // oh well - self.setPageTitle = function() { - return false; - }; - } - }; - - this.events = { - - // handlers for sound events as they're started/stopped/played - - play: function() { - pl.removeClass(this._data.oLI,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLI,this._data.className); - self.setPageTitle(this._data.originalTitle); - }, - - stop: function() { - pl.removeClass(this._data.oLI,this._data.className); - this._data.className = ''; - this._data.oPosition.style.width = '0px'; - self.setPageTitle(); - self.resetPageIcon(); - }, - - pause: function() { - if (pl.dragActive) { - return false; - } - pl.removeClass(this._data.oLI,this._data.className); - this._data.className = pl.css.sPaused; - pl.addClass(this._data.oLI,this._data.className); - self.setPageTitle(); - self.resetPageIcon(); - }, - - resume: function() { - if (pl.dragActive) { - return false; - } - pl.removeClass(this._data.oLI,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLI,this._data.className); - }, - - finish: function() { - pl.removeClass(this._data.oLI,this._data.className); - this._data.className = ''; - this._data.oPosition.style.width = '0px'; - // play next if applicable - if (self.config.playNext) { - pl.playNext(this); - } else { - self.setPageTitle(); - self.resetPageIcon(); - } - }, - - whileloading: function() { - function doWork() { - this._data.oLoading.style.width = (((this.bytesLoaded/this.bytesTotal)*100)+'%'); // theoretically, this should work. - if (!this._data.didRefresh && this._data.metadata) { - this._data.didRefresh = true; - this._data.metadata.refresh(); - } - } - if (!pl.config.useThrottling) { - doWork.apply(this); - } else { - var d = new Date(); - if (d && d-self.lastWLExec > 50 || this.bytesLoaded === this.bytesTotal) { - doWork.apply(this); - self.lastWLExec = d; - } - } - - }, - - onload: function() { - if (!this.loaded) { - var oTemp = this._data.oLI.getElementsByTagName('a')[0], - oString = oTemp.innerHTML, - oThis = this; - oTemp.innerHTML = oString+' | Load failed, d\'oh! '+(sm.sandbox.noRemote?' Possible cause: Flash sandbox is denying remote URL access.':(sm.sandbox.noLocal?'Flash denying local filesystem access':'404?'))+''; - setTimeout(function(){ - oTemp.innerHTML = oString; - // pl.events.finish.apply(oThis); // load next - },5000); - } else { - if (this._data.metadata) { - this._data.metadata.refresh(); - } - } - }, - - whileplaying: function() { - var d = null; - if (pl.dragActive || !pl.config.useThrottling) { - self.updateTime.apply(this); - if (sm.flashVersion >= 9) { - if (pl.config.usePeakData && this.instanceOptions.usePeakData) { - self.updatePeaks.apply(this); - } - if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) { - self.updateGraph.apply(this); - } - } - if (this._data.metadata) { - d = new Date(); - if (d && d-self.lastWPExec>500) { - this._data.metadata.refreshMetadata(this); - self.lastWPExec = d; - } - } - this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%'); - } else { - d = new Date(); - if (d-self.lastWPExec>30) { - self.updateTime.apply(this); - if (sm.flashVersion >= 9) { - if (pl.config.usePeakData && this.instanceOptions.usePeakData) { - self.updatePeaks.apply(this); - } - if (pl.config.useWaveformData && this.instanceOptions.useWaveformData || pl.config.useEQData && this.instanceOptions.useEQData) { - self.updateGraph.apply(this); - } - } - if (this._data.metadata) { - this._data.metadata.refreshMetadata(this); - } - this._data.oPosition.style.width = (((this.position/self.getDurationEstimate(this))*100)+'%'); - self.lastWPExec = d; - } - } - } - - }; // events{} - - this.setPageIcon = function(sDataURL) { - if (!self.config.useFavIcon || !self.config.usePeakData || !sDataURL) { - return false; - } - var link = document.getElementById('sm2-favicon'); - if (link) { - _head.removeChild(link); - link = null; - } - if (!link) { - link = document.createElement('link'); - link.id = 'sm2-favicon'; - link.rel = 'shortcut icon'; - link.type = 'image/png'; - link.href = sDataURL; - document.getElementsByTagName('head')[0].appendChild(link); - } - }; - - this.resetPageIcon = function() { - if (!self.config.useFavIcon) { - return false; - } - var link = document.getElementById('favicon'); - if (link) { - link.href = '/favicon.ico'; - } - }; - - this.updatePeaks = function() { - var o = this._data.oPeak, - oSpan = o.getElementsByTagName('span'); - oSpan[0].style.marginTop = (13-(Math.floor(15*this.peakData.left))+'px'); - oSpan[1].style.marginTop = (13-(Math.floor(15*this.peakData.right))+'px'); - if (sm.flashVersion > 8 && self.config.useFavIcon && self.config.usePeakData) { - self.setPageIcon(self.vuMeterData[parseInt(16*this.peakData.left,10)][parseInt(16*this.peakData.right,10)]); - } - }; - - this.updateGraph = function() { - if (pl.config.flashVersion < 9 || (!pl.config.useWaveformData && !pl.config.useEQData)) { - return false; - } - var sbC = this._data.oGraph.getElementsByTagName('div'), - scale, i, offset; - if (pl.config.useWaveformData) { - // raw waveform - scale = 8; // Y axis (+/- this distance from 0) - for (i=255; i--;) { - sbC[255-i].style.marginTop = (1+scale+Math.ceil(this.waveformData.left[i]*-scale))+'px'; - } - } else { - // eq spectrum - offset = 9; - for (i=255; i--;) { - sbC[255-i].style.marginTop = ((offset*2)-1+Math.ceil(this.eqData[i]*-offset))+'px'; - } - } - }; - - this.resetGraph = function() { - if (!pl.config.useEQData || pl.config.flashVersion<9) { - return false; - } - var sbC = this._data.oGraph.getElementsByTagName('div'), - scale = (!pl.config.useEQData?'9px':'17px'), - nHeight = (!pl.config.fillGraph?'1px':'32px'), - i; - for (i=255; i--;) { - sbC[255-i].style.marginTop = scale; // EQ scale - sbC[255-i].style.height = nHeight; - } - }; - - this.updateTime = function() { - var str = self.strings.timing.replace('%s1',self.getTime(this.position,true)); - str = str.replace('%s2',self.getTime(self.getDurationEstimate(this),true)); - this._data.oTiming.innerHTML = str; - }; - - this.getTheDamnTarget = function(e) { - return (e.target||(window.event?window.event.srcElement:null)); - }; - - this.withinStatusBar = function(o) { - return (self.isChildOfClass(o,'playlist')) && (self.isChildOfClass(o,'controls')); - }; - - this.handleClick = function(e) { - - // a sound (or something) was clicked - determine what and handle appropriately - - if (e.button === 2) { - if (!pl.config.allowRightClick) { - pl.stopEvent(e); - } - return pl.config.allowRightClick; // ignore right-clicks - } - var o = self.getTheDamnTarget(e), - sURL, soundURL, thisSound, oControls, oLI, str; - if (!o) { - return true; - } - if (self.dragActive) { - self.stopDrag(); // to be safe - } - if (self.withinStatusBar(o)) { - // self.handleStatusClick(e); - return false; - } - if (o.nodeName.toLowerCase() !== 'a') { - o = self.getParentByNodeName(o,'a'); - } - if (!o) { - // not a link - return true; - } - - // OK, we're dealing with a link - - sURL = o.getAttribute('href'); - - if (!o.href || (!sm.canPlayLink(o) && !self.hasClass(o,'playable')) || self.hasClass(o,'exclude')) { - - // do nothing, don't return anything. - return true; - - } else { - - // we have something we're interested in. - - // find and init parent UL, if need be - self.initUL(self.getParentByNodeName(o, 'ul')); - - // and decorate the link too, if needed - self.initItem(o); - - soundURL = o.href; - thisSound = self.getSoundByObject(o); - - if (thisSound) { - - // sound already exists - self.setPageTitle(thisSound._data.originalTitle); - if (thisSound === self.lastSound) { - // ..and was playing (or paused) and isn't in an error state - if (thisSound.readyState !== 2) { - if (thisSound.playState !== 1) { - // not yet playing - thisSound.play(); - } else { - thisSound.togglePause(); - } - } else { - sm._writeDebug('Warning: sound failed to load (security restrictions, 404 or bad format)',2); - } - } else { - // ..different sound - if (self.lastSound) { - self.stopSound(self.lastSound); - } - if (spectrumContainer) { - thisSound._data.oTimingBox.appendChild(spectrumContainer); - } - thisSound.togglePause(); // start playing current - } - - } else { - - // create sound - thisSound = sm.createSound({ - id:o.id, - url:decodeURI(soundURL), - onplay:self.events.play, - onstop:self.events.stop, - onpause:self.events.pause, - onresume:self.events.resume, - onfinish:self.events.finish, - type:(o.type||null), - whileloading:self.events.whileloading, - whileplaying:self.events.whileplaying, - onmetadata:self.events.metadata, - onload:self.events.onload - }); - - // append control template - oControls = self.oControls.cloneNode(true); - oLI = o.parentNode; - oLI.appendChild(oControls); - if (spectrumContainer) { - oLI.appendChild(spectrumContainer); - } - self.soundsByObject[o.id] = thisSound; - - // tack on some custom data - thisSound._data = { - oLink: o, // DOM reference within SM2 object event handlers - oLI: oLI, - oControls: self.select('controls',oLI), - oStatus: self.select('statusbar',oLI), - oLoading: self.select('loading',oLI), - oPosition: self.select('position',oLI), - oTimingBox: self.select('timing',oLI), - oTiming: self.select('timing',oLI).getElementsByTagName('div')[0], - oPeak: self.select('peak',oLI), - oGraph: self.select('spectrum-box',oLI), - className: self.css.sPlaying, - originalTitle: o.innerHTML, - metadata: null - }; - - if (spectrumContainer) { - thisSound._data.oTimingBox.appendChild(spectrumContainer); - } - - // "Metadata" - if (thisSound._data.oLI.getElementsByTagName('ul').length) { - thisSound._data.metadata = new Metadata(thisSound); - } - - // set initial timer stuff (before loading) - str = self.strings.timing.replace('%s1',self.config.emptyTime); - str = str.replace('%s2',self.config.emptyTime); - thisSound._data.oTiming.innerHTML = str; - self.sounds.push(thisSound); - if (self.lastSound) { - self.stopSound(self.lastSound); - } - self.resetGraph.apply(thisSound); - thisSound.play(); - - } - - self.lastSound = thisSound; // reference for next call - return self.stopEvent(e); - - } - - }; - - this.handleMouseDown = function(e) { - // a sound link was clicked - if (isTouchDevice && e.touches) { - e = e.touches[0]; - } - if (e.button === 2) { - if (!pl.config.allowRightClick) { - pl.stopEvent(e); - } - return pl.config.allowRightClick; // ignore right-clicks - } - var o = self.getTheDamnTarget(e); - if (!o) { - return true; - } - if (!self.withinStatusBar(o)) { - return true; - } - self.dragActive = true; - self.lastSound.pause(); - self.setPosition(e); - if (!isTouchDevice) { - _event.add(document,'mousemove',self.handleMouseMove); - } else { - _event.add(document,'touchmove',self.handleMouseMove); - } - self.addClass(self.lastSound._data.oControls,'dragging'); - return self.stopEvent(e); - }; - - this.handleMouseMove = function(e) { - if (isTouchDevice && e.touches) { - e = e.touches[0]; - } - // set position accordingly - if (self.dragActive) { - if (self.config.useThrottling) { - // be nice to CPU/externalInterface - var d = new Date(); - if (d-self.dragExec>20) { - self.setPosition(e); - } else { - window.clearTimeout(self.dragTimer); - self.dragTimer = window.setTimeout(function(){self.setPosition(e);},20); - } - self.dragExec = d; - } else { - // oh the hell with it - self.setPosition(e); - } - } else { - self.stopDrag(); - } - e.stopPropagation = true; - return false; - }; - - this.stopDrag = function(e) { - if (self.dragActive) { - self.removeClass(self.lastSound._data.oControls,'dragging'); - if (!isTouchDevice) { - _event.remove(document,'mousemove',self.handleMouseMove); - } else { - _event.remove(document,'touchmove',self.handleMouseMove); - } - if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) { - self.lastSound.resume(); - } - self.dragActive = false; - return self.stopEvent(e); - } - }; - - this.handleStatusClick = function(e) { - self.setPosition(e); - if (!pl.hasClass(self.lastSound._data.oLI,self.css.sPaused)) { - self.resume(); - } - return self.stopEvent(e); - }; - - this.stopEvent = function(e) { - if (typeof e !== 'undefined') { - if (typeof e.preventDefault !== 'undefined') { - e.preventDefault(); - } else { - e.stopPropagation = true; - e.returnValue = false; - } - } - return false; - }; - - this.setPosition = function(e) { - // called from slider control - var oThis = self.getTheDamnTarget(e), - x, oControl, oSound, nMsecOffset; - if (!oThis) { - return true; - } - oControl = oThis; - while (!self.hasClass(oControl,'controls') && oControl.parentNode) { - oControl = oControl.parentNode; - } - oSound = self.lastSound; - x = parseInt(e.clientX,10); - // play sound at this position - nMsecOffset = Math.floor((x-self.getOffX(oControl)-4)/(oControl.offsetWidth)*self.getDurationEstimate(oSound)); - if (!isNaN(nMsecOffset)) { - nMsecOffset = Math.min(nMsecOffset,oSound.duration); - } - if (!isNaN(nMsecOffset)) { - oSound.setPosition(nMsecOffset); - } - }; - - this.stopSound = function(oSound) { - sm._writeDebug('stopping sound: '+oSound.id); - sm.stop(oSound.id); - if (!isTouchDevice) { // iOS 4.2+ security blocks onfinish() -> playNext() if we set a .src in-between(?) - sm.unload(oSound.id); - } - }; - - this.getDurationEstimate = function(oSound) { - if (oSound.instanceOptions.isMovieStar) { - return (oSound.duration); - } else { - return (!oSound._data.metadata || !oSound._data.metadata.data.givenDuration ? (oSound.durationEstimate||0) : oSound._data.metadata.data.givenDuration); - } - }; - - this.createVUData = function() { - - var i=0, j=0, - canvas = vuDataCanvas.getContext('2d'), - vuGrad = canvas.createLinearGradient(0, 16, 0, 0), - bgGrad, outline; - - vuGrad.addColorStop(0,'rgb(0,192,0)'); - vuGrad.addColorStop(0.30,'rgb(0,255,0)'); - vuGrad.addColorStop(0.625,'rgb(255,255,0)'); - vuGrad.addColorStop(0.85,'rgb(255,0,0)'); - bgGrad = canvas.createLinearGradient(0, 16, 0, 0); - outline = 'rgba(0,0,0,0.2)'; - bgGrad.addColorStop(0,outline); - bgGrad.addColorStop(1,'rgba(0,0,0,0.5)'); - for (i=0; i<16; i++) { - self.vuMeterData[i] = []; - } - for (i=0; i<16; i++) { - for (j=0; j<16; j++) { - // reset/erase canvas - vuDataCanvas.setAttribute('width',16); - vuDataCanvas.setAttribute('height',16); - // draw new stuffs - canvas.fillStyle = bgGrad; - canvas.fillRect(0,0,7,15); - canvas.fillRect(8,0,7,15); - /* - // shadow - canvas.fillStyle = 'rgba(0,0,0,0.1)'; - canvas.fillRect(1,15-i,7,17-(17-i)); - canvas.fillRect(9,15-j,7,17-(17-j)); - */ - canvas.fillStyle = vuGrad; - canvas.fillRect(0,15-i,7,16-(16-i)); - canvas.fillRect(8,15-j,7,16-(16-j)); - // and now, clear out some bits. - canvas.clearRect(0,3,16,1); - canvas.clearRect(0,7,16,1); - canvas.clearRect(0,11,16,1); - self.vuMeterData[i][j] = vuDataCanvas.toDataURL('image/png'); - // for debugging VU images - /* - var o = document.createElement('img'); - o.style.marginRight = '5px'; - o.src = self.vuMeterData[i][j]; - document.documentElement.appendChild(o); - */ - } - } - - }; - - this.testCanvas = function() { - // canvas + toDataURL(); - var c = document.createElement('canvas'), - ctx = null, ok; - if (!c || typeof c.getContext === 'undefined') { - return null; - } - ctx = c.getContext('2d'); - if (!ctx || typeof c.toDataURL !== 'function') { - return null; - } - // just in case.. - try { - ok = c.toDataURL('image/png'); - } catch(e) { - // no canvas or no toDataURL() - return null; - } - // assume we're all good. - return c; - }; - - this.initItem = function(oNode) { - if (!oNode.id) { - oNode.id = 'pagePlayerMP3Sound'+(self.soundCount++); - } - self.addClass(oNode,self.css.sDefault); // add default CSS decoration - }; - - this.initUL = function(oULNode) { - // set up graph box stuffs - if (sm.flashVersion >= 9) { - self.addClass(oULNode,self.cssBase); - } - }; - - this.init = function(oConfig) { - - if (oConfig) { - // allow overriding via arguments object - sm._writeDebug('pagePlayer.init(): Using custom configuration'); - this.config = this._mergeObjects(oConfig,this.config); - } else { - sm._writeDebug('pagePlayer.init(): Using default configuration'); - } - - var i, spectrumBox, sbC, oF, oClone, oTiming; - - // apply externally-defined override, if applicable - this.cssBase = []; // optional features added to ul.playlist - - // apply some items to SM2 - sm.useFlashBlock = true; - - if (sm.flashVersion >= 9) { - - sm.defaultOptions.usePeakData = this.config.usePeakData; - sm.defaultOptions.useWaveformData = this.config.useWaveformData; - sm.defaultOptions.useEQData = this.config.useEQData; - - if (this.config.usePeakData) { - this.cssBase.push('use-peak'); - } - - if (this.config.useWaveformData || this.config.useEQData) { - this.cssBase.push('use-spectrum'); - } - - this.cssBase = this.cssBase.join(' '); - - if (this.config.useFavIcon) { - vuDataCanvas = self.testCanvas(); - if (vuDataCanvas && supportsFavicon) { - // these browsers support dynamically-updating the favicon - self.createVUData(); - } else { - // browser doesn't support doing this - this.config.useFavIcon = false; - } - } - - } else if (this.config.usePeakData || this.config.useWaveformData || this.config.useEQData) { - - sm._writeDebug('Page player: Note: soundManager.flashVersion = 9 is required for peak/waveform/EQ features.'); - - } - - controlTemplate = document.createElement('div'); - - controlTemplate.innerHTML = [ - - // control markup inserted dynamically after each page player link - // if you want to change the UI layout, this is the place to do it. - - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - '
    ', - - '
    ', - '
    ', - ' %s1 / %s2', - '
    ', - '
    ', - - '
    ', - '
    ', - '
    ', - - '
    ', - '
    ', - '
    ', - '
    ', - '
    ' - - ].join('\n'); - - if (sm.flashVersion >= 9) { - - // create the spectrum box ish - spectrumContainer = self.select('spectrum-container',controlTemplate); - - // take out of template, too - spectrumContainer = controlTemplate.removeChild(spectrumContainer); - - spectrumBox = self.select('spectrum-box',spectrumContainer); - - sbC = spectrumBox.getElementsByTagName('div')[0]; - oF = document.createDocumentFragment(); - oClone = null; - for (i=256; i--;) { - oClone = sbC.cloneNode(false); - oClone.style.left = (i)+'px'; - oF.appendChild(oClone); - } - spectrumBox.removeChild(sbC); - spectrumBox.appendChild(oF); - - } else { - - // flash 8-only, take out the spectrum container and peak elements - controlTemplate.removeChild(self.select('spectrum-container',controlTemplate)); - controlTemplate.removeChild(self.select('peak',controlTemplate)); - - } - - self.oControls = controlTemplate.cloneNode(true); - - oTiming = self.select('timing-data',controlTemplate); - self.strings.timing = oTiming.innerHTML; - oTiming.innerHTML = ''; - oTiming.id = ''; - - function doEvents(action) { // action: add / remove - - _event[action](document,'click',self.handleClick); - - if (!isTouchDevice) { - _event[action](document,'mousedown',self.handleMouseDown); - _event[action](document,'mouseup',self.stopDrag); - } else { - _event[action](document,'touchstart',self.handleMouseDown); - _event[action](document,'touchend',self.stopDrag); - } - - _event[action](window, 'unload', cleanup); - - } - - cleanup = function() { - doEvents('remove'); - }; - - doEvents('add'); - - sm._writeDebug('pagePlayer.init(): Ready',1); - - if (self.config.autoStart) { - // grab the first ul.playlist link - pl.handleClick({target:pl.getByClassName('playlist', 'ul')[0].getElementsByTagName('a')[0]}); - } - - }; - -} - -soundManager.useFlashBlock = true; - -soundManager.onready(function() { - pagePlayer = new PagePlayer(); - pagePlayer.init(typeof PP_CONFIG !== 'undefined' ? PP_CONFIG : null); -}); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html deleted file mode 100755 index a9bcf6d2..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/page-player/xbm-test.html +++ /dev/null @@ -1,23 +0,0 @@ - - -XBM image test - - - - - -

    XBM (X-Bitmap) Support Test

    - -

    Firefox 3.6 dropped support for XBM images citing lack of use (and a security hole or two), so SoundManager 2 has moved to using canvas for rendering favicon images on-the-fly.

    - -

    -XBM with data URI (may be broken image, invalid etc.):
    - -

    - -

    See the SoundManager 2 demo with experimental favicon animation feature enabled, and the related screenshot showing the different states.

    - -

    XBM (X-Bitmap) is neat in that it's an ASCII, C-style declarative image format, and is quite old. See XBM on Wikipedia for more.

    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html deleted file mode 100755 index e41a20bf..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/basic.html +++ /dev/null @@ -1,61 +0,0 @@ - - - -SoundManager 2 Demo: Play MP3 Links on a page - - - - - - - - - - -

    SoundManager 2 / page as a playlist, basic template

    - -

    Don't forget to set debugMode = false within inlineplayer.js to disable debug output.

    - -
    - -
    - - - -

    SoundManager 2 project home

    - -
  • - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css deleted file mode 100755 index 69e05341..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/css/inlineplayer.css +++ /dev/null @@ -1,210 +0,0 @@ -/* - - SoundManager 2: In-page MP3 player example - ------------------------------------------ - - Clicks on links to MP3s are intercepted via JS, calls are - made to SoundManager to load/play sounds. CSS classes are - appended to the link, which are used to highlight the - current play state and so on. - - Class names are applied in addition to "sm2_link" base. - - Default: - - sm2_link - - Additional states: - - sm2_playing - sm2_paused - - eg. - - - some.mp3 - - - some.mp3 - - - Note you don't require ul.graphic / ul.flat etc. for your use - if only using one style on a page. You can just use .sm2_link{} - and so on, but isolate the CSS you want. - - Side note: Would do multiple class definitions eg. - - a.sm2_default.sm2_playing{} - - .. except IE 6 has a parsing bug which may break behaviour, - applying sm2_playing {} even when the class is set to sm2_default. - - - If you want to make your own UI from scratch, here is the base: - - Default + hover state, "click to play": - - a.sm2_link {} - a.sm2_link:hover {} - - Playing + hover state, "click to pause": - - a.sm2_playing {} - a.sm2_playing:hover {} - - Paused + hover state, "click to resume": - - a.sm2_paused {} - a.sm2_paused:hover {} - - -*/ - -/* two different list types */ - -ul.flat { - list-style-type:none; - padding-left:0px; -} - -ul.flat li, -ul.graphic li { - padding-bottom:1px; -} - -ul.flat li a { - display:inline-block; - padding:2px 4px 2px 4px; -} - -ul.graphic { - list-style-type:none; - padding-left:0px; - margin-left:0px; -} - -/* background-image-based CSS3 example */ - -ul.graphic { - list-style-type:none; - margin:0px; - padding:0px; -} - -ul.graphic li { - margin-bottom:2px; -} - -ul.graphic li a, -ul.graphic li a.sm2_link { - /* assume all items will be sounds rather than wait for onload etc. in this example.. may differ for your uses. */ - display:inline-block; - padding-left:22px; - min-height:16px; - vertical-align: middle; - background-color:#336699; - border-radius:3px; - padding:3px 3px 3px 25px; - min-width:19em; - _width:19em; /* IE 6 */ - text-decoration:none; - font-weight:normal; - color:#f6f9ff; -} - -ul.graphic li a.sm2_link { - /* safari 3.1+ fun (or, proprietary crap. TBD.) */ - -webkit-transition-property: hover; - -webkit-transition: background-color 0.15s linear; - -moz-transition: background-color 0.15s linear 0s; /* firefox 4 */ - -o-transition-property: background-color; /* opera 10.5 */ - -o-transition-duration: 0.15s; -} - -ul.graphic li a, /* use a.sm2_link {} if you want play icons showing only if SM2 is supported */ -ul.graphic li a.sm2_paused:hover, -ul.graphic li a.sm2_link:hover { - background-image:url(../image/icon_play.png); - background-position:3px 50%; - background-repeat:no-repeat; - _background-image:url(../image/icon_play.gif); /* IE 6 */ -} - -ul.graphic li a.sm2_link:hover { - /* default hover color, if you'd like.. */ - background-color:#003366; - color:#fff; -} - -ul.graphic li a.sm2_paused { - background-color:#999; -} - -ul.graphic li a.sm2_paused:hover { - background:#003366 url(../image/icon_play.png) no-repeat 3px 50%; - _background-image:url(../image/icon_play.gif); -} - -ul.graphic li a.sm2_playing, -ul.graphic li a.sm2_playing:hover { - background:#003366 url(../image/icon_pause.png) no-repeat 3px 50%; - _background-image:url(../image/icon_pause.gif); - text-decoration:none; -} - -/* hide button while playing? -ul.graphic li a.sm2_playing { - background-image:none; -} -*/ - -body #sm2-container object, -body #sm2-container embed { - /* - flashblock handling: hide SWF off-screen by default (until blocked timeout case.) - include body prefix to ensure override of flashblock.css. - */ - - left:-9999em; - top:-9999em; -} - -/* flat CSS example */ - -ul.flat a.sm2_link { - /* default state: "a playable link" */ - border-left:6px solid #999; - padding-left:4px; - padding-right:4px; -} - -ul.flat a.sm2_link:hover { - /* default (inactive) hover state */ - border-left-color:#333; -} - - -ul.flat a.sm2_playing { - /* "now playing" */ - border-left-color:#6666ff; - background-color:#000; - color:#fff; - text-decoration:none; -} - -ul.flat a.sm2_playing:hover { - /* "clicking will now pause" */ - border-left-color:#cc3333; -} - -ul.flat a.sm2_paused { - /* "paused state" */ - background-color:#666; - color:#fff; - text-decoration:none; -} - -ul.flat a.sm2_paused:hover { - /* "clicking will resume" */ - border-left-color:#33cc33; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.gif deleted file mode 100755 index 7f3443d9d46e0b576b36ba68927da3362b8e69ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 189 zcmV;u07CyqNk%w1VG;lm0J9GO{QUgv?CkCB?ez5Y;o;%s<>mYP`}p|y@bK{c{rz`$ zcl!GJ_V)Jb>gxah|NsC0A^8LW000jFEC2ui01^Na000DP@X1Ll1w*vWyBL5p1Wsw5 zWiUv>!n|<&E`rn?c&_V>z5Kvnu=i*rj>u$^*f=Q^rRRz1ggT@qCSgl>ZoOP)VO)5Q r&17b0&9))l@OYdltHX!_gMQEF*B&D%f(|MY7#eIGA0ZZv6%hbCfP-P( diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_pause.png deleted file mode 100755 index 846dd8adddefad95f42466f03c0cb6e105653b16..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mYCT;XLn;`jPTI(I*n!8HRWjfB z&h~HipBfwaBCSfTPEB3(OyGt$@49;n9P>8^o^4}u{@)mTT5YAQ^<)|ASt_$-I42u; z{yi#F;xX$?;Y;Vj-5p|jfsx5uJ}oa<9+AAI;N=o9>A3M&#=}dKE%kVp?MTUgcHkBJ dx;^?4M>7Bb diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/image/icon_play.gif deleted file mode 100755 index 39543369dde96067f28557f192c07bc68617025c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmV;y06zamNk%w1VG;lm0J9GOetv$mw6xvb-QnTk<>lq=?d|mR^!@$)@bK{a`}_F# z`1<<#_V)Jb>gxah|NsC0A^8LW000jFEC2ui01^Na000DT@X1LlJ*KqHdohQUIb>;) zpHwVN>%Q$$NR49OINs1p@BhEuqj4w}0|TQ{*f;?I0m6ytd_tQf=3u+EKBHSEVLY}X v8)Rmu0Trw_G=y9(nA;IdnBFBUB>sSbfin*yCx2UNYo5{bM8=ZWHk&A}dG-|Ek9sEeI)M>MF*%XH!`eOHIn z+Y=&gdq_^;`_jqg!o2F!tL$t^z`)M;olr5{r&Lp z@b>oh>gwwM|NrFV - - -SoundManager 2 Demo: Play MP3 Links on a page - - - - - - - - - - -
    - -

    SoundManager 2 / Playable MP3 links

    - -

    Inline MP3 Player Example: Fancy* CSS 3 version

    -

    *CSS 3 border-radius supported only by Firefox 2.x+, Safari (2.x?) - sadly, not IE 8.

    - -
    - -
    - - - -

    How It Works

    - -
      -
    • Lightweight (single JS click event handler)
    • -
    • Uses existing SoundManager 2 API
    • -
    • CSS for UI, easy to modify to taste
    • -
    - -

    This example uses SoundManager 2 to find links to MP3 files, and makes them playable "in-place" on a page. The script assigns CSS classes to links to indicate their state (playing/paused, etc.)

    -

    Links pointing to MP3s are assigned an onclick handler which intercepts the click (preventing the browser from following the link and unloading the page. SM2 will then create sound objects as needed to play the MP3s.

    - -

    Static Examples

    -

    CSS classes are dynamically applied as follows:

    - -

    :hover effects are also active.

    - -

    Flat (CSS-only) style

    - - - -

    Static Examples

    - - - -

    Forcing play (or exclusion) of links

    - -

    If you have a link to a PHP file that serves MP3 files eg. /music.php?fileID=123, it won't be picked up by the script as containing a known, playable .mp3 extension. To tell the script it should be treated as playable, include a type="audio/mpeg" MIME type attribute, or CSS class="inline-playable" in the link. eg:

    - -

    - <a href="/music.php?fileID=123" type="audio/mpeg">A song</a> -

    - -

    Or via CSS class name:

    - <a href="/music.php?fileID=123" class="inline-playable">A song</a> -

    - -

    - To exclude an .MP3 or otherwise-playable link from being handled by SM2, use class="inline-exclude" and it will be ignored. -

    - -

    - SoundManager 2 project page (not an MP3 link) -

    - -

    Basic CSS

    - -
    - If you want to make your own UI from scratch, here is the base:
    -
    - Default + hover state, "click to play":
    -
    - a.sm2_link {}
    - a.sm2_link:hover {}
    -
    - Playing + hover state, "click to pause":
    -
    - a.sm2_playing {}
    - a.sm2_playing:hover {}
    -
    - Paused + hover state, "click to resume":
    -
    - a.sm2_paused {}
    - a.sm2_paused:hover {}
    -
    - -

    Other Options

    - -

    By default, one sound will be played at a time; you can easily change a "config" object value to turn on playlist-like behaviour (i.e., play the next MP3 when the current one finishes.)

    - -
    -// (within inlineplayer.js)
    -this.config = {
    - playNext: false // stop after one sound, or play through list until end
    -}
    -
    - -

    I'd like to use this.

    -

    See this basic demo for reference.

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js deleted file mode 100755 index 0b1f977d..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/play-mp3-links/script/inlineplayer.js +++ /dev/null @@ -1,256 +0,0 @@ -/** - * - * SoundManager 2 Demo: Play MP3 links "in-place" - * ---------------------------------------------- - * - * http://schillmania.com/projects/soundmanager2/ - * - * A simple demo making MP3s playable "inline" - * and easily styled/customizable via CSS. - * - * Requires SoundManager 2 Javascript API. - * - */ - -function InlinePlayer() { - var self = this; - var pl = this; - var sm = soundManager; // soundManager instance - var isIE = (navigator.userAgent.match(/msie/i)); - this.playableClass = 'inline-playable'; // CSS class for forcing a link to be playable (eg. doesn't have .MP3 in it) - this.excludeClass = 'inline-exclude'; // CSS class for ignoring MP3 links - this.links = []; - this.sounds = []; - this.soundsByURL = []; - this.indexByURL = []; - this.lastSound = null; - this.soundCount = 0; - - this.config = { - playNext: false, // stop after one sound, or play through list until end - autoPlay: false // start playing the first sound right away - } - - this.css = { - // CSS class names appended to link during various states - sDefault: 'sm2_link', // default state - sLoading: 'sm2_loading', - sPlaying: 'sm2_playing', - sPaused: 'sm2_paused' - } - - this.addEventHandler = (typeof window.addEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.addEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - o.attachEvent('on'+evtName,evtHandler); - }); - - this.removeEventHandler = (typeof window.removeEventListener !== 'undefined' ? function(o, evtName, evtHandler) { - return o.removeEventListener(evtName,evtHandler,false); - } : function(o, evtName, evtHandler) { - return o.detachEvent('on'+evtName,evtHandler); - }); - - this.classContains = function(o,cStr) { - return (typeof(o.className)!='undefined'?o.className.match(new RegExp('(\\s|^)'+cStr+'(\\s|$)')):false); - } - - this.addClass = function(o,cStr) { - if (!o || !cStr || self.classContains(o,cStr)) return false; - o.className = (o.className?o.className+' ':'')+cStr; - } - - this.removeClass = function(o,cStr) { - if (!o || !cStr || !self.classContains(o,cStr)) return false; - o.className = o.className.replace(new RegExp('( '+cStr+')|('+cStr+')','g'),''); - } - - this.getSoundByURL = function(sURL) { - return (typeof self.soundsByURL[sURL] != 'undefined'?self.soundsByURL[sURL]:null); - } - - this.isChildOfNode = function(o,sNodeName) { - if (!o || !o.parentNode) { - return false; - } - sNodeName = sNodeName.toLowerCase(); - do { - o = o.parentNode; - } while (o && o.parentNode && o.nodeName.toLowerCase() != sNodeName); - return (o.nodeName.toLowerCase() == sNodeName?o:null); - } - - this.events = { - - // handlers for sound events as they're started/stopped/played - - play: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLink,this._data.className); - }, - - stop: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = ''; - }, - - pause: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPaused; - pl.addClass(this._data.oLink,this._data.className); - }, - - resume: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = pl.css.sPlaying; - pl.addClass(this._data.oLink,this._data.className); - }, - - finish: function() { - pl.removeClass(this._data.oLink,this._data.className); - this._data.className = ''; - if (pl.config.playNext) { - var nextLink = (pl.indexByURL[this._data.oLink.href]+1); - if (nextLink1) { - // ignore right-click - return true; - } - var o = self.getTheDamnLink(e); - if (o.nodeName.toLowerCase() != 'a') { - o = self.isChildOfNode(o,'a'); - if (!o) return true; - } - var sURL = o.getAttribute('href'); - if (!o.href || (!sm.canPlayLink(o) && !self.classContains(o,self.playableClass)) || self.classContains(o,self.excludeClass)) { - return true; // pass-thru for non-MP3/non-links - } - var soundURL = (o.href); - var thisSound = self.getSoundByURL(soundURL); - if (thisSound) { - // already exists - if (thisSound == self.lastSound) { - // and was playing (or paused) - thisSound.togglePause(); - } else { - // different sound - sm._writeDebug('sound different than last sound: '+self.lastSound.id); - if (self.lastSound) { - self.stopSound(self.lastSound); - } - thisSound.togglePause(); // start playing current - } - } else { - // stop last sound - if (self.lastSound) { - self.stopSound(self.lastSound); - } - // create sound - thisSound = sm.createSound({ - id:'inlineMP3Sound'+(self.soundCount++), - url:soundURL, - onplay:self.events.play, - onstop:self.events.stop, - onpause:self.events.pause, - onresume:self.events.resume, - onfinish:self.events.finish, - type:(o.type||null) - }); - // tack on some custom data - thisSound._data = { - oLink: o, // DOM node for reference within SM2 object event handlers - className: self.css.sPlaying - }; - self.soundsByURL[soundURL] = thisSound; - self.sounds.push(thisSound); - thisSound.play(); - } - - self.lastSound = thisSound; // reference for next call - - if (typeof e != 'undefined' && typeof e.preventDefault != 'undefined') { - e.preventDefault(); - } else { - event.returnValue = false; - } - return false; - } - - this.stopSound = function(oSound) { - soundManager.stop(oSound.id); - soundManager.unload(oSound.id); - } - - this.init = function() { - sm._writeDebug('inlinePlayer.init()'); - var oLinks = document.getElementsByTagName('a'); - // grab all links, look for .mp3 - var foundItems = 0; - for (var i=0, j=oLinks.length; i0) { - self.addEventHandler(document,'click',self.handleClick); - if (self.config.autoPlay) { - self.handleClick({target:self.links[0],preventDefault:function(){}}); - } - } - sm._writeDebug('inlinePlayer.init(): Found '+foundItems+' relevant items.'); - } - - this.init(); - -} - -var inlinePlayer = null; - -soundManager.setup({ - // disable or enable debug output - debugMode: true, - // use HTML5 audio for MP3/MP4, if available - preferFlash: false, - useFlashBlock: true, - // path to directory containing SM2 SWF - url: '../../swf/', - // optional: enable MPEG-4/AAC support (requires flash 9) - flashVersion: 9 -}); - -// ---- - -soundManager.onready(function() { - // soundManager.createSound() etc. may now be called - inlinePlayer = new InlinePlayer(); -}); - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html deleted file mode 100755 index 831a090e..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/deferred-example.html +++ /dev/null @@ -1,243 +0,0 @@ - - - -SoundManager 2: Deferred loading / Lazy-loading / Dynamic script loading Example - - - - - - - - - - - - -
    - -

    SoundManager 2: Lazy Loading Example

    -

    This is an example of dynamically loading SoundManager 2 using JS, after window.onload() has fired.

    - -

    How it works

    -

    This page waits until window.onload(), delays 1 second and loads soundmanager2.js, which should then start up.

    -

    Behaviour note: SM2 will not automatically start if it is loaded at or after the DOMContentLoaded event has fired, which may be common with most JS loaders.

    -

    However, SM2 will try to start once soundManager.setup() is called and a url attribute has been provided.

    -

    If you want to ensure that SM2 starts after setup, you can call soundManager.beginDelayedInit() - this should be safe to call after DOMContentLoaded has fired.

    - -

    Pseudo-code Example

    - -

    Once SM2 has been dymamically loaded, you can call its setup() method. Passing a url attribute will trigger the initialization process.

    - -
    loadJS('soundmanager2.js', function() {
    -  soundManager.setup({
    -    url: '/path/to/swfs/',
    -    onready: function() {
    -      // good to go!
    -      // soundManager.createSound(...), etc.
    -    }
    -  });
    -});
    - -

    Live Example

    - -

    SoundManager 2 status: Waiting for window.onload()...

    - -
    /**
    - * Dynamic script loading helper (example)
    - * Normalizes good browser onload() vs. IE readyState weirdness
    - */
    -
    -function loadScript(sURL, onLoad) {
    -
    -  function loadScriptHandler() {
    -    var rs = this.readyState;
    -    if (rs == 'loaded' || rs == 'complete') {
    -      this.onreadystatechange = null;
    -      this.onload = null;
    -      if (onLoad) {
    -        onLoad();
    -      }
    -    }
    -  }
    -
    -  function scriptOnload() {
    -    this.onreadystatechange = null;
    -    this.onload = null;
    -    window.setTimeout(onLoad,20);
    -  }
    -
    -  var oS = document.createElement('script');
    -  oS.type = 'text/javascript';
    -  if (onLoad) {
    -    oS.onreadystatechange = loadScriptHandler;
    -    oS.onload = scriptOnload;
    -  }
    -  oS.src = sURL;
    -  document.getElementsByTagName('head')[0].appendChild(oS);
    -
    -}
    -
    -// Wait for window load, then load soundmanager2.js, let it start and play a test sound
    -
    -window.onload = function() {
    -
    -  msg('Window loaded, waiting 1 second...');
    -
    -  setTimeout(function() {
    -
    -    msg('Loading soundmanager2.js...');
    -
    -    loadScript('../../script/soundmanager2.js', function() {
    -
    -      // SM2 script has loaded
    -
    -      window.setTimeout(function() {
    -        msg('soundmanager2.js loaded, delaying before setup()...');
    -      }, 500);
    -
    -      window.setTimeout(function() {
    -
    -        soundManager.setup({
    -          url: '../../swf/',
    -          onready: function() {
    -            soundManager.createSound({
    -              id: 'foo',
    -              url: '../_mp3/mouseover.mp3'
    -            }).play();
    -            msg('Started OK');
    -          },
    -          ontimeout: function() {
    -            msg('Loaded OK, but unable to start: unsupported/flash blocked, etc.');
    -          }
    -        });
    -
    -        // ensure start-up in case document.readyState and/or DOMContentLoaded are unavailable
    -        soundManager.beginDelayedInit();
    -
    -      }, 1000);
    -
    -    });
    -
    -  }, 1000);
    -
    -}
    -
    - -

    Handling flash blockers

    -

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info on this, see the Flashblock example.

    - -

    Preventing auto-init using SM2_DEFER

    -

    If you want to completely defer the normal start-up of SM2 and call the SoundManager() constructor yourself, you can declare an SM2_DEFER global and set it to true. See the SM2_DEFER example for details.

    - -

    Disabling debug output

    -

    SoundManager 2 will write to a debug <div> element or a javascript console if available, by default. To disable it, simply set the relevant property to false:

    -soundManager.setup({ debugMode: false }); -

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    -

    Troubleshooting

    -

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool which can help you fix things.

    -

    No-debug, compressed version of soundmanager2.js

    -

    You can also use the "minified" (60% smaller) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. If you can, serve this with gzip compression for even greater bandwidth savings!

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html deleted file mode 100755 index d4357cd9..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/html5-dtd-test.html +++ /dev/null @@ -1,87 +0,0 @@ - - - -SoundManager 2: HTML 5 DTD test - - - - - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html deleted file mode 100755 index c7a62d49..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/index.html +++ /dev/null @@ -1,206 +0,0 @@ - - - -SoundManager 2 Template - - - - - - - - - - - - - - - - - - - - - -
    - -

    SoundManager 2 Template Example

    -

    This page covers the basics of adding SoundManager 2 to your project.

    - -

    How it works

    -

    The minimal code needed to get SoundManager 2 going is below, with configurable parts highlighted. You can copy/paste it to get started. This page is also running the template code; If available, look at your JavaScript console for debug output from SM2.

    - -

    Dependencies

    - -

    You'll need to copy the files inside the script/ and swf/ subdirectories included with the SoundManager 2 package into your project.

    - -
      -
    • - soundmanager2/ -
        -
      • - script/ - API core, soundmanager2.js -
      • -
      • - swf/ - API core, SoundManager 2 .SWF files -
      • -
      -
    • -
    - - -

    At the bare minimum, you will need soundmanager2.js, soundmanager2.swf and soundmanager2_debug.swf for the default flash 8-based configuration. (Optionally, SM2 can use a Flash 9-based audio API which has MP4 support, data visualization and a few other features.)

    - -

    Template Code: Basic Version

    - -

    This is a compact version of the template you can copy/paste to get started. For new users, see the commented version.

    - -
    <script src="/path/to/soundmanager2.js"></script>
    -<script>
    -soundManager.setup({
    -  url: '/path/to/swf-files/',
    -  onready: function() {
    -    var mySound = soundManager.createSound({
    -      id: 'aSound',
    -      url: '/path/to/an.mp3'
    -    });
    -    mySound.play();
    -  },
    -  ontimeout: function() {
    -    // Hrmm, SM2 could not start. Missing SWF? Flash blocked? Show an error, etc.?
    -  }
    -});
    -</script>
    - - - -

    Template Code: Commented Version

    - -
    <!-- include SM2 library (see builds for optimized versions) -->
    -<script type="text/javascript" src="/path/to/soundmanager2.js"></script>
    -
    -<!-- configure SM2 for your use -->
    -<script type="text/javascript">
    -
    -soundManager.setup({
    -
    -  // location: path to SWF files, as needed (SWF file name is appended later.)
    -
    -  url: '/path/to/swf-files/',
    -
    -  // optional: version of SM2 flash audio API to use (8 or 9; default is 8 if omitted, OK for most use cases.)
    -  // flashVersion: 9,
    -
    -  // use soundmanager2-nodebug-jsmin.js, or disable debug mode (enabled by default) after development/testing
    -  // debugMode: false,
    -
    -  // good to go: the onready() callback
    -
    -  onready: function() {
    -
    -    // SM2 has started - now you can create and play sounds!
    -
    -    var mySound = soundManager.createSound({
    -      id: 'aSound', // optional: provide your own unique id
    -      url: '/path/to/an.mp3'
    -      // onload: function() { console.log('sound loaded!', this); }
    -      // other options here..
    -    });
    -
    -    mySound.play();
    -
    -  },
    -
    -  // optional: ontimeout() callback for handling start-up failure
    -
    -  ontimeout: function() {
    -
    -    // Hrmm, SM2 could not start. Missing SWF? Flash blocked? No HTML5 audio support? Show an error, etc.?
    -    // See the flashblock demo when you want to start getting fancy.
    -
    -  }
    -
    -});
    -
    -</script>
    - -

    HTML5 Support Notes

    -

    Read up on HTML5 audio support, if you're feeling adventurous. iPad/iPhone and devices without flash installed will always use 100% HTML5 mode. By default, SM2 will use 100% HTML5 mode where supported. If you want to override this, specify preferFlash: true and Flash will be used (if present) for playing MP3 and MP4 (AAC) formats.

    - -

    Handling flash blockers

    -

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info, see the Flashblock example.

    - -

    Disabling debug output

    -

    SoundManager 2 will write debug output via console.log() if available, by default. To disable it, simply specify debugMode: false.

    -

    You can also write HTML-based debug output to the DOM via consoleOnly: false and/or useConsole: false.

    -

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    - -

    Troubleshooting ("failed to start": Viewing offline, missing SWF, flash blockers etc.)

    -

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool for tips.

    - -

    No-debug, compressed version of soundmanager2.js

    -

    Once development is finished, you can also use the "minified" (down to ~8% of original size with gzip!) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. Serve with gzip compression wherever possible for best bandwidth savings.

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html deleted file mode 100755 index 526f43eb..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/sm2_defer-example.html +++ /dev/null @@ -1,128 +0,0 @@ - - - -SoundManager 2: SM2_DEFER Example - - - - - - - - - - - - - - - - - - -
    - -

    SoundManager 2: SM2_DEFER Example

    - -

    This is an example of manually starting SoundManager 2. If you want to pre-load the SM2 script up front and have its onready() events etc. fire much later without delay, this approach makes sense. Otherwise, it's better to lazy-load or simply load SM2 normally as an external script without deferring.

    - -

    How it works

    -

    By default, SM2 will call its own SoundManager() constructor inline and will try to initialize ASAP. This page defines a global boolean - window.SM2_DEFER = true; - before loading soundmanager2.js, preventing the constructor from being called.

    - -

    Some time later, you must call soundManager = new SoundManager(); manually and set things like soundManager.url etc. Finally, you may then call soundManager.beginDelayedInit() to kick off the initialization process. SM2 should then start as usual.

    - -

    Example code

    - -
    <script type="text/javascript">
    -
    -/*
    - * Firstly, define SM2_DEFER and set it to true *before* we load soundmanager2.js.
    - * This prevents the SoundManager() constructor from being called immediately.
    - * SM2_DEFER should be assigned within the global scope.
    -*/
    -
    -window.SM2_DEFER = true;
    -
    -</script>
    -
    -<!-- Now, load soundmanager2.js as we normally would. -->
    -<script type="text/javascript" src="../../script/soundmanager2.js"></script>
    -
    -<!-- "Some time later", window.onload() may have fired and you now want to start SM2, etc... -->
    -<script type="text/javascript">
    -
    -// for example purposes, we'll wait until window.onload before starting things.
    -window.onload = function() {
    -
    -  /*
    -   * Now that the SM2 constructor is defined, you can call the constructor,
    -   * set the options and "kick-start" SM2's init process, and it should work as normal.
    -   * WARNING: Do not call beginDelayedInit() before "DOM ready", or things will fail.
    -  */
    -
    -  // construct the instance (must be named soundManager, and scoped globally)
    -  window.soundManager = new SoundManager();
    -
    -  // assign flash url, flashVersion and other SM2 options as usual
    -  soundManager.setup({
    -    // path to directory containing SM2 SWF
    -    url: '/path/to/swfs/',
    -    flashVersion: 9
    -    // etc...
    -  });
    -
    -  // finally, kick-start the init process.
    -  // (old IE etc. may miss domloaded/ready/window.load if they've already fired.)
    -  soundManager.beginDelayedInit();
    -
    -}
    -
    -</script>
    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css deleted file mode 100755 index 59ff8a6a..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/template.css +++ /dev/null @@ -1,162 +0,0 @@ -/** - * - * SoundManager 2: TEMPLATE EXAMPLE / DEMO ONLY, just to make the demo page pretty. - * - * You don't need this stuff for SM2 to work. :) - * - */ - -body { - font-size:75%; - background: #fff url(../../demo/_image/noise.png); -} - -pre { - padding: 0.5em; - background: #f9f9f9; -} - -code, pre { - font-family:"lucida console",monaco,courier,system; - font-size:100%; - color:#2233cc; -} - -em em { - font-weight:normal; - font-style:normal; - color:#339933; -} - -h1, -h2.special { - letter-spacing: -0.005em; -} - -h1, h2, h3, h4 { - font-family:"helvetica neue",helvetica,verdana,arial,tahoma,"sans serif"; - font-size:1em; - margin:0px; - padding:0px; - vertical-align:middle; -} - -h1 { - font-size:2em; - border-bottom: 1px dotted #999; -} - -h2 { - font-family:"helvetica neue",helvetica,arial,verdana,tahoma,"sans serif"; - font-size:1.5em; - margin-top: 1.5em; - margin-bottom: 0px; -} - -h2 code { - font-size: 85%; -} - -h3 { - font-size:1.17em; - border-bottom:1px solid #ccc; - padding-bottom:0.25em; - margin-top:1.5em; -} - -h4 { - margin:1.5em 0px 0.5em 0px; - font-size:1.1em; -} - - -p, -li { - font:normal 1em verdana,tahoma,arial,"sans serif"; - line-height: 1.4em; -} - -code span, -pre span { - color:#666; -} - -ul.file-structure ul { - padding-left:1.5em; -} - -ul.file-structure li { - list-style-type:square; - margin-top:0.25em; - margin-left:0px; -} - -ul.file-structure li span { - color:#999; -} - -/* re-used bits from index.css */ - -pre code { - font-size:1em; -} - -pre { - white-space:-moz-pre-wrap; - white-space:pre-wrap; - word-wrap:break-word; /* IE */ -} - -ul.code-block em, -pre span, -code span, -dt span { - color:#339933; -} - -ul.code-block em { - font-style: normal; -} - -ul.code-block span, -pre span span, -code span span, -dt span span { - color:#667788; -} - -pre.block, -pre.block code, -div.block div.code, -ul.code-block { - position:relative; - display:table; - *display:block; - border:1px solid #ccc; - border-radius:3px; -} - -div.block, -pre.block { - background:#e9f3ff; - border-color:#eee; - padding:3px; -} - -pre.block code, -.block .code { - background:#fff; - border:1px solid #ccddee; - padding:0.5em; - font-size: 100%; - line-height:1.75em; - background-image: -webkit-linear-gradient(#fcfcfc 50%, #fff 50%); - background-image: -o-linear-gradient(#fcfcfc 50%, #fff 50%); - background-image: linear-gradient(#fcfcfc 50%, #fff 50%); - background-size: 100% 3.5em; - background-origin: content-box; -} - -pre.block code { - padding: 1em; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml deleted file mode 100755 index 38bcbb13..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/demo/template/xhtml-test.xhtml +++ /dev/null @@ -1,143 +0,0 @@ - - - -SoundManager 2 Template - - - - - - - - - - - - - - - - - - -
    -

    SoundManager 2 Template Example

    -

    This is a basic template for adding SoundManager to your page.

    -

    How it works

    -

    This page includes the SM2 script, which starts up on its own as appropriate. By default it will try to start as soon as possible.

    -

    The minimal code needed to get SoundManager 2 going is below, with configurable parts:

    - -
    -<!-- include SM2 library -->
    -<script type="text/javascript" src="/path/to/soundmanager2.js"></script>
    -
    -<!-- configure it for your use -->
    -<script type="text/javascript">
    -
    -soundManager.setup({
    -  url: '/path/to/sm2-flash-files/', // directory where SM2 .SWFs live
    -
    -  /*
    -   * Note that SoundManager will determine and append the appropriate .SWF file to the URL,
    -   * eg. /path/to/sm2-flash-files/soundmanager2.swf automatically.
    -   * You should not put soundmanager2.swf in there yourself.
    -  */
    -
    -  // Beta-ish HTML5 audio support (force-enabled for iPad), flash-free sound for Safari + Chrome. Enable if you want to try it!
    -  // useHTML5Audio: true,
    -
    -  // do this to skip flash block handling for now. See the flashblock demo when you want to start getting fancy.
    -  useFlashBlock: false,
    -
    -  // disable debug mode after development/testing..
    -  // debugMode: false
    -
    -});
    -
    -// Option 1: Simple onready() + createSound() method
    -
    -soundManager.onready(function() {
    -  // SM2 has loaded - now you can create and play sounds!
    -  soundManager.createSound('helloWorld','/path/to/hello-world.mp3');
    -  soundManager.play('helloWorld');
    -});
    -
    -// Option 2 (better): More flexible onready() + createSound() method
    -
    -soundManager.onready(function() {
    -
    -  var mySound = soundManager.createSound({
    -    id: 'aSound',
    -    url: '/path/to/an.mp3'
    -    // onload: [ event handler function object ],
    -    // other options here..
    -  });
    -
    -  mySound.play();
    -
    -});
    -
    -// Option 3 (best): onready() + createSound() / ontimeout() methods for success/failure:
    -
    -soundManager.onready(function() {
    -
    -  // SM2 has loaded - now you can create and play sounds!
    -  var mySound = soundManager.createSound({
    -    id: 'aSound',
    -    url: '/path/to/an.mp3'
    -    // onload: [ event handler function object ],
    -    // other options here..
    -  });
    -  mySound.play();
    -
    -});
    -
    -soundManager.ontimeout(function() {
    -
    -  // (Optional) Hrmm, SM2 could not start. Show an error, etc.?
    -
    -});
    -
    -
    -</script>
    - -

    Handling flash blockers

    -

    It's good to let users see the flash component of SM2, so those with flash blockers can unblock it and allow SM2 to start. For more info on this, see the Flashblock example.

    - -

    Making SM2 wait for window.onload()

    -

    If you prefer to have the library wait for window.onload() before making onready() / ontimeout() callbacks, you can specify waitForWindowLoad: true.

    - -

    Disabling debug output

    -

    SoundManager 2 will write debug output via console.log() if available, by default. To disable it, simply specify debugMode: false.

    -

    You can also write HTML-based debug output to the DOM via consoleOnly: false and/or useConsole: false.

    -

    To see related configuration code, refer to the source of this page which basically does all of the above "for real."

    - -

    Troubleshooting ("failed to start": Viewing offline, missing SWF, flash blockers etc.)

    -

    If SM2 is failing to start and throwing errors due to flash security, timeouts or other issues, check out the troubleshooting tool for tips.

    - -

    No-debug, compressed version of soundmanager2.js

    -

    Once development is finished, you can also use the "minified" (down to ~8% of original size with gzip!) version of SM2, which has debug output and comments removed for you: soundmanager2-nodebug-jsmin.js. Serve with gzip compression wherever possible for best bandwidth savings.

    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html deleted file mode 100755 index 9c666c0c..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/archive.html +++ /dev/null @@ -1,2041 +0,0 @@ - - - -SoundManager 2: Revision History (Archived) - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    - - -
    - -
    - -

    Revision History

    -

    Archived versions of SM2 releases

    - -
    - -
    - -
    - -

    Revision History (Archives)

    - -

    A changelog of sorts.

    - -
      - - - -
    • - -

      V2.97a.20111220 - HTML5 src/onload()/onstop() fixes, new HTML5 polling, onPosition() updates, "audio sprites" (from/to) and multiple URL support. (Also: New homepage design!) (Download archived version)

      - -

      Fixes for HTML5 audio including redundant src assignment, onload and onstop. New html5PollingInterval property, onPosition() and clearOnPosition() methods, "audio sprites" support via from and to parameters. Updated onposition() sound method, added new onposition sound parameter, and multiple URLs / URL formats now allowed for a sound. Also: Version checking between JS and SWF, brand-new optimized homepage design and demo UI tweaks + optimizations.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - HTML5: Fixed Audio() src attribute re-assignment bug seen in createSound()->play() use case. -

          -
        • - -
        • -

          - HTML5: mySound.load({onload:function(){}}) callback fixed so it works. -

          -
        • - -
        • -

          - HTML5 + Flash: onload() now called immediately when load({onload:function(){}}) is used on a sound with the same URL which has already loaded. -

          -
        • - -
        • -

          - onstop() now mimics onfinish() in terms of sequence. HTML5 sets position to 0, but retains pre-stop() position property value (like Flash does.) -

          -
        • - -
        • -

          - Amazon Kindle Fire UA looks like Safari on OS X 10.6.3, but does not have broken HTML5 audio (i.e., intermittent playback failure) like the "isBadSafari" case. -

          -
        • - -
        • -

          - MovieStar/NetStream (non-RTMP) edge case: Correct onfinish() after play() and a seek so that it always fires. Remove metadata() after first call (as it was) for non-RTMP. Reduce buffer-near-end logic to 3 seconds from 5. -

          -
        • - -
        • -

          - Flash 9 MovieStar/RTMP: Only fire onconnect() for RTMP (was firing for flash 9/NetStream, too, breaking MovieStar createSound({autoLoad:true,onload:function(){this.play()}}) case.) -

          -
        • - -
        • -

          - RTMP: Exclude RTMP from 30-second resume() reposition hack (streaming does not have this issue.) May have been breaking buffer due to seek on resume. -

          -
        • - -
        • -

          - Fix edge case where soundManager.waitForWindowLoad = true (non-async startup case), but _initComplete() may fire after window.onload() and thus onready() never fired. -

          -
        • - -
        - -
      • - -
      • - -

        API updates

        - -
          - -
        • -

          - Added soundManager.html5PollingInterval property, for increased whileplaying() callback frequency (higher UI framerates) similar to flashPollingInterval. (By default, null/off.) Also excludes mobile (eg., iOS) by default. -

          -
        • - -
        • -

          - soundManager.onPosition(): Queues a callback that will be fired each time a sound reaches a given position during playback. Applies for the life of the sound object. -

          -
        • - -
        • -

          - soundManager.clearOnPosition(): Removes onPosition() callback(s) from a sound, by position and/or callback. (If no position or callback are specified, then all callbacks are cleared for the given sound.) -

          -

          - Optionally, an onstop: function(){} handler can be passed to capture the moment when "to" is reached. When using Flash, sound is preloaded 100% in order to guarantee playback can start at the "from" position. -

          -
        • - -
        • -

          - Added support for "audio sprites." New sound options, from and to allow segments, samples or slices of sound to be played. eg., mySound.play({ from: 5000, to: 10000}); -

          -
        • - -
        • -

          - New sound option, onposition, defines times and related callbacks for positions of interest within a sound. Applies on a per-play basis. eg. onposition: {500: function(p) { console.log('position ' + p + ' was reached.') } } -

          -
        • - -
        • -

          - Experimental: Multiple formats/encodings support in the sound url parameter; now accepts an array as an alternate to a single string. eg. soundManager.createSound({id:'foo', url:['bar.ogg','bar.mp3']}); - SM2 will use the first playable URL it finds and the URL property will then reflect the one URL after that point. Note that this means the original array data will be lost. -

          -

          - Also accepts type attributes, eg. url:[{type:'audio/mp3',url:'/path/to/play.php?song=123'},...] - useful for URLs without obvious filetype extensions. -

          -
        • - -
        • -

          - Flash 9 + MovieStar (NetStream) / RTMP: onmetadata (sound parameter) callback, allows capturing of metadata events from flash (eg., streaming song / title updates) similar to onid3(). Can now fire multiple times, eg., when RTMP streaming and new song / artist info is provided. -

          -
        • - -
        • -

          - Added JS version + Flash SWF build/version check to SM2 during start-up. (Finally! :D) ... Will now throw new Error() if soundmanager.js version reports V2.97a.20111030 and SWF version is V2.97a.20110918, for example. (Happens when upgrading/replacing old versions of SM2, you may forget to update one of the SWFs etc.) -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Homepage: Brand-new, shinier design, improved three-column layout; looks better even in IE 6. Small UI tweaks on inline demos. Combined demo JS + CSS files for performance; cut HTTP requests by over 50% (now down to 14 HTTP requests in most cases) via concatenation and data: URIs for some background images and sprites. -

          -
        • - -
        • -

          - 360 player demos: Updated UI with more circles and a few gradients, border-radius etc. Small 50x50 UI is now clickable over entire area, rather than small circular button. -

          -
        • - -
        • -

          - Demos: Some data: URIs added to inline player and 360 player for performance (reduced HTTP requests.) Christmas lights demo now uses YUI 3 seed + animation. -

          -
        • - -
        • -

          - soundManager.useConsoleOnly = true by default, was previously false. New "true" default means no HTML debug output if console.log() is available. -

          -
        • - -
        • -

          - soundmanager2.js: Micro-optimizations, further -nodebug-jsmin optimizations and minor comment formatting. Eliminated last Google Closure Compiler warning (caused by an empty "if" block.) -

          -
        • - -
        • -

          - Debug output no longer shows "loops: 1" (redundant), only interesting values eg. 2+ are reported. -

          -
        • - -
        • -

          - Documentation: Small theme tweaks, textured background and re-organization of properties (left menu) for easier navigation. Fixed "onsuspend" event labeling, clarify SMSound events as properties and not methods. Re-sorted property lists, tidied up code formatting. Added missing soundManager.onPosition() documentation (side note: previously named onposition(), old lower-case method name maintained for backward compatibility.) -

          -
        • - -
        • -

          - Page player / Muxtape demos: Removed useMovieStar sound option - no longer exists, redundant. -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20111030 - HTML5 unload() improvements, Android 2.3 fix and new onsuspend() event (Download archived version)

      - -

      Fixes for HTML5 unload() on Webkit (connection was not closing), playback on Android 2.3, and IE 9 "not implemented" / unsupported HTML5 case. Addition of onsuspend() HTML5 event, possibly applicable to iOS where stalled events suggest that user action is needed to play or resume audio playback.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • - -

          HTML5 unload(): Correctly apply about:blank (_emptyURL default) to everyone except Firefox, which allegedly likes ''. Webkit was not actually closing the connection of loading streams, in this case.

          - -
        • - -
        • - -

          HTML5 audio playback fix for Android 2.3 (Honeycomb), which doesn't seem to like new Audio('foo.mp3') followed by load() -> play(); first request/attempt stalls and eventually fires ended event. Rather odd. (Related discussion.)

          - -
        • - -
        • - -

          Added try...catch for dumb IE 9 Audio() "not implemented" error in Windows server case without "desktop experience" installed, means no HTML5 audio/video support. Hat tip: Modernizr issue 224

          - -
        • - -
        - -
      • - -
      • - -

        API updates

        - -
          - -
        • - -

          Added soundManager.noSWFCache (boolean) for easy cache busting - good for dev/testing. SWFs tend to be aggressively cached by browsers, especially in offline cases.

          - -
        • - -
        • -

          HTML5 suspend events are now listened for and fired via SMSound option onsuspend(). This event may be the best way to detect when mobile Safari (eg. iOS) is blocking autoplay-style behaviour, and user interaction is required to start or resume playback.

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • - -

          Fix "playable MP3 links" demo for iOS, playing 2nd+ sound now works. Due to single sound object reuse, "old" sound must be paused before new one is created. Previously, playing sound 1 -> sound 2 -> sound 1 would fail.

          - -
        • - -
        • - -

          Tweaked 360player behaviour to support being initialized multiple times (for dynamic content, "decorating" new MP3 links etc.)

          - -
        • - -
        • - -

          Modified soundManager core property documentation to be multi-line, allowing longer comments

          - -
        • - -
        - -
      • - -
      - -
    • - -
    • - -

      V2.97a.20110918 - Code clean-up, improved comments and formatting, generated documentation, polling and onbefore- removal, HTML5 stop()/unload() fixes (Download archived version)

      - -

      Added block comments above major SM2 methods (and Docco-generated documentation), more line breaks for consistent vertical spacing and readability, removal of onbefore-related SMSound options, allowPolling + useFastPolling features. Improved build task optimizing of -nodebug JS build, removing comments, extra line breaks and debug code blocks which were previously only commented out.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • HTML5 unload: Gecko can use url = '' to cancel request etc., others seem to need about:blank or similar empty URL (matching Flash 8.)
        • - -
        • HTML5 stop(): Don't call unload() here (file under "durrr." This fixes a few state-related bugs.)
        • - -
        • Fire the onposition callback after setting item.fired, instead of before. This allows looping in the form of mySound.onposition(200, function(){ mySound.setposition(100); });
        • - -
        • Fix movieStar (MPEG-4) handling for URLs without MIME hints (eg. a URL ending in .php) if type: 'audio/mp4' is passed, for example. (Possible regression introduced with V2.97a.20110801, one report was received.)
        • - -
        • Fire onposition() after increasing the internal "onPositionFired" counter.
        • - -
        - -
      • - -
      • - -

        API updates

        - -
          - -
        • - -

          Clean-up time! The following soundManager properties have been removed as they're ineffective and/or have modern replacements:

          - -

          - soundManager.nullURL = 'about:blank'; (internalized; search for 'about:blank' in the source if you want to customize it.) -

          - -

          - soundManager.allowPolling = true; (ignored, always true now. whileloading() / whileplaying() calls rely on it.) -

          - -

          - soundManager.useFastPolling = false; (redundant, now determined by flashPollingInterval now being specified as a number eg., 20, instead of the default of null.) -

          - -

          - The following SMSound (sound options) have been removed, in favour of modern replacements (and also didn't work with HTML5 sounds.) -

          - -
          soundManager.defaultOptions.onbeforefinish = null;
          -soundManager.defaultOptions.onbeforefinishtime = 5000;
          -soundManager.defaultOptions.onbeforefinishcomplete = null;
          -soundManager.defaultOptions.onjustbeforefinish = null;
          -soundManager.defaultOptions.onjustbeforefinishtime: 200;
          - -

          - As a replacement, use the SMSound.onposition() method to assign an event callback handler to fire at the relevant time. -

          - -
          mySound.onposition(10000, function() {
          -  console.log('the sound ' + this.id + ' is now at position ' + this.position);
          -});
          - -

          - If you need to fire an event relative to the true end of the sound, reference its duration once the sound has fully-loaded - ie., at or after the onload() event - as the duration will not be completely accurate until that time. durationEstimate may be referenced before onload(), but it should not be relied on when "precise" timings of say, < 1 second are desired. -

          - -
          mySound.load({
          -  onload: function() {
          -    this.onposition(this.duration - 5000, function() {
          -      console.log('the sound ' + this.id + ' is now at position ' + this.position);
          -    }
          -  }
          -});
          - -

          - Again, note that due to the interval / polling-based methods of both HTML5 and flash audio, sound status updates and thus precision can vary between 20 msec to perhaps 0.5 seconds and the sound's position property will reflect this delta when the onposition() callback fires. -

          - -
        • - -
        • - -

          Added soundManager.onposition() (forgot to mirror the SMSound method)

          - -
        • - -
        • - -

          - Privatize soundManager.netStreamMimeTypes, etc. soundManager.mimePattern, the resulting one applied to canPlayMIME() etc., is still exposed. -

          - -
        • - -
        • - -

          - Simplify getMovie() to use _id(smID) || _doc[smID] || _win[smID] rather than IE / Safari special checks. Sometimes (old?) IE and Safari would return null on getElementById(), but window[id] or document[id] would work. Presumably related to Flash + ExternalInterface wackiness. -

          - -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • Reviewed soundmanager2.js code for readability and comments. Added linebreaks, spacing and block-style comments around main functions.
        • - -
        • Added generated documentation via "Rocco" (ruby port of Docco.)
        • - -
        • Added build.xml notes re: Closure compiler, MTASC and where to find working builds
        • - -
        • Modified soundmanager-nodebug.js build so comments and debug blocks are removed entirely from the code. Double-spaced linebreaks are also removed.
        • - -
        • Removed executable permissions from almost all files
        • - -
        • parseInt() on soundManager.flashVersion, invalidate strings like "9"
        • - -
        • Use 10 / 50 msec polling interval for high performance mode vs. regular mode
        • - -
        • Page cache/unload/restore (back button case): Only apply window unload event if using flash, since plugin is more likely to break (ie., state won't be recalled correctly.)
        • - -
        - -
      • - -
      - -
    • - -
    • - -

      V2.97a.20110801 - "100% HTML5 mode" desktop browser (+no flash) fix, useHTML5Audio enabled by default, flash 9 end-of-sound correction, ClickToFlash improvements (Download archived version)

      - -

      Last release introduced a regression with HTML5-only mode on desktops when flash was not installed/present, now fixed; HTM5 audio support is enabled by default, although flash is still preferred for MP3/MP4 by default. probably|maybe is now the default when testing HTML5 format support. Flash 9 now does not reset sound position to 0 at onfinish(), matching flash 8 and HTML5 behaviour. Better ClickToPlugin / ClickToFlash compatibility (CSS tweaks for display of blocked SWF.) Minor internal flash polling loop improvements. soundManager onload, onerror and oninitmovie events have been deprecated in favour of onready() and ontimeout(), but remain functional.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • A regression was introduced in V2.97.20110706 where SM2 would fail to start in HTML5-only mode on supported desktop browsers when flash was disabled or not installed, eg., Safari on new Macs or IE 9 without flash. (iOS was not affected.) This has been fixed with the 2.97.20110801 release.
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • -

          soundManager.useHTML5Audio is now true by default; however, soundManager.preferFlash is also true and HTML5 browsers will still attempt to use flash for playing MP3/MP4 by default, if those formats are marked as "required".

          -

          If you wish to have 100% HTML5 mode in more cases, set soundManager.preferFlash = false. Presently, the MP3 links and MP3 button SM2 demos are more HTML5-friendly and will serve as a test for exposing bugs that may be in the wild.

          -
        • - -
        • -

          soundManager.html5Test has been relaxed to use (probably|maybe) for Audio's canPlayType() test (previously, was only "probably") - so formats will be more likely to work on HTML5-only devices that conservatively report "maybe" for MIME types like audio/mpeg; codecs="mp3" at this point.

          -
        • - -
        • -

          Certain mobile and tablet-like devices are special-cased as preferring HTML5, and will ignore checking for flash altogether; this presently includes the iPad, iPhone and iPod, Palm Pre and Motorola Xoom.

          -
        • - -
        • -

          The HTML5 audio "loadeddata" event triggers an SMSound onload() event, which now fires whileplaying() and tries to pass identical bytesLoaded, bytesTotal parameters so that UIs will correctly show the sound as fully-"loaded" - even if in truth, not all bytes have actually been fetched (depending on the browser and server, etc.) because of the ability to do arbitrary seeking.

          -
        • - -
        • -

          Updated Flash 9 onfinish() / end-of-sound behaviour: Sound objects' position property no longer resets to 0 when a sound ends (and when onfinish() fires.) This now matches both HTML5 and flash 8's existing behaviour; therefore, a sound's position will equal its duration at onfinish() in all cases now. In the event play() is called from the end of a sound at or after onfinish(), the sound's position will be set to 0 before playback begins if using flash 9.

          -

          Edge case covered: if at internal SOUND_COMPLETE the SMSound.position is < its duration, flash will match position to duration and fire whileplaying() one last time so "100%" is always reached before onfinish() is called.

          -

          multiShot + multiShotEvent case has been verified as working (eg. onfinish() fires 5x if play() called 5x.)

          -
        • - -
        • -

          soundManager.onload, soundManager.onerror and soundManager.oninitmovie have been deprecated in favour of soundManager.onready() and soundManager.ontimeout(). The deprecated methods are still present and work with this release, but you should migrate to their modern replacements.

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          Flash 8 + 9 internal whileplaying() + whileloading() polling improvements: Internal check previously looped through all sounds from onLoad(), registerOnComplete(), _load() and _setPosition(). Now only the relevant sound is checked.

          -
        • - -
        • -

          Improved HTML5 support debug ouput/messaging, now right up top. Better messaging and error handling when Flash isn't present, yet required case (Flash plugin either not installed or disabled, but needed in some cases) - eg., Firefox and audioFormats.mp3.required = true; ... Also, only one _detectFlash() call now made.

          -
        • - -
        • -

          Playable MP3 links and MP3 button demos use soundManager.preferFlash = false, so they should be able to run in 100% HTML5 mode. Some HTML5 bugs are anticipated, and these may help to reveal issues via a smaller audience.

          -
        • - -
        • -

          Initialization code reorganized, minor edits and clean-up, removal of some unused objects and ternary optimizations per jslint

          -
        • - -
        • -

          Cleaned up IE <object> code, added highPriority flash param (affects flash 10.1+, if at all.)

          -
        • - -
        • -

          Improved flashblock handling / compatibility (CSS layout tweaks) with newer ClickToPlugin/ClickToFlash Safari (5.0.6 / 5.1+) extensions.

          -
        • - -
        • -

          SM2 homepage demos try HTML5 + Flash if available, with "safe" reboot + fallback to HTML5-only mode (if supported - eg., Safari with flashBlock/ClickToFlash.)

          -
        • - -
        • -

          Basic MP3 player demo: Fix event JS error when manually calling things like basicMP3Player.handleClick({target:document.getElementById('foo')});

          -
        • - -
        • -

          Flash SWFs, debug versions: Mention right-click -> security panel options when troubleshooting security errors

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20110706 - improved HTML5/flash "mixed mode" via preferFlash, Safari + Snow Leopard HTML5 audio bug update, better ClickToFlash compatibility, minor demo tweaks (Download archived version)

      - -

      Special note: This was V2.97a.20110705, but the latest Flex SDK (4.5.1.21328) was downloaded and used for this build, and it compiled a Flash 9 SWF that wouldn't fully-start on some Windows machines running Firefox and IE 7, possibly others - thus, SM2 would fail to start up. The Flash 9 SWFs are now compiled with an older, working SDK version 4.1.0.16076, used in previous working releases. See discussion for more details.

      - -

      Improved "mixed mode" HTML5/flash handling via new (experimental) preferFlash option, enabled by default. (If present, MP3/MP4 get flash for stability; HTML5 is used for other formats.) OS X 10.6.8 (finally?) fixes HTML5 audio in Safari. SoundManager 2 SWF adjusted to fall under ClickToFlash's "invisible" rules, may lower chance of blocking.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • ClickToFlash (Safari/Mac flashblock-style extension) compatibility improvement: Use width/height: auto on SWF instead of 100%. The latter is not recognized as being within ClickToFlash's <= 8x8px "invisible flash" rules, almost guaranteed to be blocked. (When considered "invisible", SWF is allowed to load normally if user has the invisibles option enabled.)
        • - -
        • Flash blocking/handling improvements: Default #sm2-container size now always 8x8px to fall under "invisible" flash rules, better chance of load being allowed. If blocked and using flashblock.css, #sm2-container reverts to 48x48px at ontimeout() for visibility (so user can see, and unblock the flash bit.)
        • - -
        • OS X 10.6.8 "pre-Lion release" update finally appears to have fixed the broken Safari HTML5 audio issue. Thus, audio was broken from OS X 10.6.3 to 10.6.7 and SM2 will use Flash for these known cases. Related: Testcase and Webkit bug #32159.
        • - -
        • HTML5 audio: Playback now does not start after a setPosition() call (if the sound was not already playing), or if it was paused - matching the existing Flash API behaviour.
        • - -
        • Fix ontimeout() queue incorrectly processing after onload() and successful startup.
        • - -
        • Debug output: extraneous "%s" fixes for onready() / ontimeout()
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • -

          Added experimental soundManager.preferFlash (default:true) for a more consistent MP3/MP4 playback option in certain HTML5 cases. If using soundManager.useHTML5Audio + preferFlash and flash is available, flash will be used for MP3/MP4.

          -

          HTML5 is still new and relatively unstable, and bugs are yet to be found and fixed across a growing number of browsers/platforms etc. (consider that it was broken on Safari between OS X 10.6.3 and 10.6.7.) If flash is not installed or preferFlash = false, 100% HTML5 mode can still apply. In any event, HTML5 will still be used (if enabled) for all other formats.

          -
        • - -
        • Moved internal html5Only to (experimental) soundManager.html5Only, for detecting "HTML5-only mode" - eg., iOS, Safari without preferFlash or other environments where SM2 is operating without the flash portion of SM2.
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • Improved "can play" detection (canPlayURL() + canPlayMIME()) for HTML5 + flash cases. Increased "getting impatient, waiting for flash" message to 1 second.
        • - -
        • 360°, inline, MP3 button players: Event add/remove: use addEventListener based on typeof attachEvent === null (old IE behaviour)
        • - -
        • MP3 player button demo: Fix IE 6/7 display issue on button (d'oh!)
        • - -
        • Muxtape-style demo: Added pagePlayer.playPrevious(), to match pagePlayer.playNext() (call when a sound is currently playing.)
        • - -
        • Fixed 360° player basic visualization demo (missing class in HTML), clarified canvas support (no eq/spectrum) re: IE <9.
        • - -
        • 360° UI: Old "empty element doesn't catch mouse events" bug apparently still applies to IE 9. Fix with invisible background image.
        • - -
        • Minor homepage stylistic updates, source code order change for API docs (CTRL-F search now hits left column first)
        • -
        • Small debug output clean-up in SM2, object/embed, init etc.
        • - -
        - -
      • - -
      - -
    • - -
    • - -

      V2.97a.20110424 - Minor HTML5 tweaks, option inheritance fixes, improved build.xml file (Download archived version)

      - -

      HTML5 bulletproofing, Audio(null) argument fix for iOS + Opera, load() vs. createSound() and setVolume()/setPan() options/inheritance correction

      - -
        - -
      • - -

        Bug fixes

        - -
          -
        • HTML5: new Audio(null) fix for differences between iOS (which would try to load null) and Opera 9.64, which would throw a WRONG_ARGUMENTS_ERR if null was not passed.
        • -
        • HTML5: Restrict internal volume value range to 0..1, avoid DOM exceptions.
        • -
        • HTML5: load{url:x}) improvements for desktop, better old vs. new URL comparison.
        • -
        • HTML5, iOS 4.2/4.3+, SM2 Muxtape/inline/link demos: onfinish()->unload()->playNext() was breaking on newer iOS versions, "play through" affected. Removing unload() for iOS fixed issue.
        • -
        • Flash object/embed pluginspage/codebase attribute now uses http:// when being used from file:// (offline), and http/https-agnostic //macromedia.com syntax to avoid SSL mixed-content warnings.
        • -
        • Fix setVolume() / setPan() to properly update SMSound.options (when not "instance-only"), so settings are retained for future play() calls. Bug was that original volume/pan were incorrectly restored after the first instance completed.
        • -
        -
      • - -
      • - -

        Miscellaneous

        - -
          -
        • -

          New and improved (nearly platform-independent) build.xml file, thanks to github user "dolmen". A .build.properties file is now needed, defining "mxmlc", "mtasc", and "closure-compiler.jar" paths. e.g.:

          -
          <!-- .build.properties file in SM2 root -->
          -mxmlc=/Applications/flexsdk/bin/mxmlc
          -mtasc=/Applications/mtasc/mtasc
          -closure-compiler.jar=${user.home}/compiler.jar
          - -

          Running ant from the SM2 root will build the no-debug and minified versions of the script, as well as the SWF files.

          - -
        • - -
        -
      • - -
      -
    • - - - - -
    • -

      V2.97a.20110306 - HTML5 audio updates, Flash/HTML5 mode detection, IE flash init tweaks, reuse and instance options fixes (Download archived version)

      - -

      Bug fixes and improvements for HTML5 audio (object reuse on iOS), improved URL comparison. onfinish() -> this.play() instance option fix. IE flash wmode initialization tweak. Flash/NetStream (MP4) unpause()/resume() hack now applies to everyone. If no flash found (eg., new Mac desktops), HTML5 audio will now be tried. Make hasPriority actually work (d'oh!)

      - -
        - -
      • -

        Bug fixes

        -
          -
        • HTML5: _resetProperties() when setting Audio().src, fix sound1.play() -> sound2.play() -> sound1.play() case on iOS 4.1 not correctly re-assigning original sound URL (related to global audio object.)
        • -
        • HTML5 audio: If no flash, try forcing useHTML5Audio = true (eg. desktop safari on new Macs which don't come with Flash.) Related: flash detection code tweak.
        • -
        • Improved _iO vs. old _iO URL comparison, rather than .src which gets translated from local paths to file:// etc.
        • -
        • Correctly trash instanceOptions (and _iO) before calling onfinish(), but maintain local copy of onfinish() so it still works. Fix play({onfinish:this.play}) bug where _iO was being incorrectly remembered.
        • -
        • Flash 9/movieStar: setPosition() unpause hack for everyone, not just Webkit (via 8tracks dudes, reported now in Firefox? Should not cause regressions.)
        • -
        • Special wmode tweak for reports of SM2 start-up failures, may be admin/non-admin account related, IE 8-only on Windows 7 (possibly Vista, too?) as of late January, 2011.
        • -
        • Apply hasPriority to object/embed, not its style. D'oh. :P
        • -
        • HTML5: use new Audio(null) vs new Audio(), Opera 9.64 expects URL argument; throws WRONG_ARGUMENTS_ERR otherwise. Doesn't implement canPlayType() either, but both are fixed in future releases.
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Don't actually apply new value in setPosition() if a sound has not yet loaded (and if so, hasn't errored out.)
        • -
        • isNaN() check for HTML5 loading (saw one under Safari, in testing).
        • -
        • Added CLSID and codebase attributes for IE <object> (same as used in SWFObject), just to be safe.
        • -
        • Removed some HTML5 debug bits, unused _HTML5_states/codes block.
        • -
        • Flashblock CSS: Correctly hide the SWF via left/top:-9999em when it hits .swf_loaded {}, ie., never blocked in the first place. Minor flashblock regression fixes after .swf_loaded / .swf_unblocked changes with last release.
        • -
        • Ant build script parameter change, now uses .build.properties file (related pull request)
        • -
        -
      • - -
      -
    • - -
    • -

      V2.97a.20110123 - HTML5 audio improvements for desktop + mobile (iOS), 360° UI demo tweaks (Download archived version)

      - -

      Tweaks to HTML5 features, "mixed-mode" HTML5 + flash cases, desktop and iOS tweaks. Improved sound re-use and "play-through" on iOS (believed previously working, may have regressed with iOS 4.2.1.) Code clean-up and shuffling of homepage, 360° demo (jslinted and improved functionality), load({options}) fix, better handling of broken Safari/Snow Leopard audio case.

      - -
        - -
      • -

        Bug fixes

        -
          -
        • Fix for soundManager.load({options}) / SMSound.load({options})-specific case (regular load() sans-parameters was fine), where load({onload:...}) would fail if a URL parameter was not specified. load({url:...,onload:...}) was OK. If unspecified, load now takes URL from SMSound.url.
        • -
        • Fixed unload/replay case on iOS: play sound #1, interrupt it by starting sound #2, then play sound #1 again - previously, #1 would fail on replay due to interrupted state since iOS only allows one sound at a time. Should now restart OK. (This applies to the new soundManager.useGlobalHTML5Audio stuff.) Playlist auto-advance looks to be OK as well.
        • -
        -
      • - -
      • -

        API Updates

        -
          -
        • New (experimental) soundManager.useGlobalHTML5Audio property - if true (default for iOS/mobile), reuses a single Audio() object for loading sound. Helps make playlist / onfinish()->play() work on iOS without user interaction.
        • -
        • New (experimental) soundManager.requireFlash property (default: false.) If true, prevents HTML5-only mode on devices with both HTML5 and Flash. May be useful when HTML5 is enabled (and can play MP3), but Flash is desired to play RTMP content etc. As of this version, will only use Flash for RTMP.
        • -
        • HTML5: Fix for type:'audio/mp3' returning false on canPlay(). Timer update-while-paused tweak.
        • -
        • HTML5: More event listeners, ignore events on destroyed sounds, improved event clean-up, "seek before load" fix
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Improved broken Safari/Snow Leopard HTML5 audio situation: HTML5 mode is no longer disabled - and if available, Flash is used to play MP3/MP4 content to work around known playback issues with native HTML5 audio.
        • -
        • (Finally) report "true" position of MovieStar (MPEG4/AAC) content while scrubbing a playing/paused sound. Previously did not fire updates while scrubbing. Imperfect on resume due to buffer, but should be negligible and an improvement vs. old behaviour.
        • -
        • 360° player refresh, works with multiple types (eg. small 48x48 square vs. large 256x256 square w/spectrum + EQ visualizations) on the same page now. Can play and seek simultaneously, as well. More configurable. Removed old empty.gif + imageRoot junk. Core JS now appeases the jslint gods.
        • -
        • Code clean-up, removed undocumented/experimental playOnSeek and related methods from a prior fork.
        • -
        • Fresh homepage demo design/layout, should be nicer for new users.
        • -
        -
      • - -
      -
    • - -
    • -

      V2.97a.20110101 - Simplified onready() behaviour (see potential onready() regression note), new ontimeout() handler, Webkit + MovieStar 30-second-pause fix (Download archived version)

      -

      onready() is now called only for SM2 init success (makes default case easier, no need for "supported" check) - new ontimeout() is called only for failure case, ie., flash blocked/missing. Special Webkit/MovieStar won't-resume-after-30-seconds-paused fix. soundManager.supported() renamed to soundManager.ok() (old method aliased for the time being.)

      - -
        - -
      • -

        Bug fixes

        -
          -
        • Special bad case, Webkit/Flash+MovieStar (AAC/MPEG4/RTMP-only, not MP3): sounds don't resume after being paused for 30+ seconds(?), but setPosition() with current position gets things going again after a resume() attempt. Reported via 8tracks dudes.
        • -
        -
      • - -
      • -

        API Updates

        -
          -
        • -

          In previous releases, the soundManager.onready() queue would be processed for both OK and failure cases. The onready() queue is now processed only if successful initialisation occurs, making old "supported" checks within the onready() handlers redundant.

          -

          Potential regression note: Old error case handling within onready() will never execute as a result of this change. Update your code to use the new explicit soundManager.ontimeout() handler instead.

          - -
          -

          Old onready() method

          -
          soundManager.onready(function(){
          -  if (soundManager.supported()) {
          -    // OK, play sound etc.
          -  } else {
          -    // SM2 could not start; message user?
          -  }
          -});
          -
          - -
          -

          New onready() / ontimeout() method

          -
          soundManager.onready(function(){
          -  // OK, play sound etc.
          -});
          -
          -soundManager.ontimeout(function(){
          -  // SM2 could not start; message user?
          -});
          -
          - -
        • -
        • New soundManager.ontimeout(myFunction) method, for asynchronous queueing of init failure handlers. Fired only when SoundManager 2 is unable to initialise (usually due to blocked/missing flash, or flash security error.) Queue behaviour is the same style as onready().
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Code cleanup: Took the unsupported "jsAMP" demo (2007 prototype) out back and shot it.
        • -
        • 360° UI demo: New "allowMultiple" config option, let 2+ sounds play at once etc. (Default: false, one at a time.)
        • -
        • 360° UI, canvas visualization demo: Minor layout, UI, code tweaks
        • -
        • API/docs/demos reference and use updated onready()/ontimeout() methods.
        • -
        -
      • - -
      -
    • - -
    • -

      V2.97a.20101221 - HTML5 loading/progress and RTMP tweaks, onready() double-firing fix, hasPriority for mobile flash, Muxtape-style player now AJAX-friendly (Download archived version)

      -

      Improved HTML5 whileloading() / whileplaying(), unload and event handling. hasPriority for off-screen SWF loading on mobile, replaces old mobileFlash positioning tricks. Effectively re-wrote page player (Muxtape-style) demo to use event delegation + read live DOM, so should not break in AJAX cases. RTMP onplay() / play() / buffering fixes, setPosition() regression fix.

      - -
        - -
      • -

        Bug fixes

        -
          -
        • Double onready()-firing bug (HTML5 and non-flashblock case) fixed.
        • -
        • HTML5: Don't request null/about:blank URL with unload(), may hang/JS error in Chrome and IE 9 preview 7.
        • -
        • RTMP: Ensure onplay() is called for auto-loading streams when resumed. Don't call play() until connected. play() sets flash pauseOnBufferFull = false (fix for reported "RTMP not playing audio" issue.)
        • -
        • overHTTP was likely returning incorrect values previously - now fixed.
        • -
        • unload() tweak: Ensure position is reset to 0 if unload() fails
        • -
        • Flash audio: Log metaDataHandler info if debug enabled, possible duration metaData fix
        • -
        • No HTML5 audio for any Safari on OS X Snow Leopard 10.6.[3|4|5] due to underlying bugs causing intermittent audio playback failure; ongoing Apple issue, on their radar. Amusingly, Safari on Windows appears to be fine.
        • -
        -
      • - -
      • -

        API Updates

        -
          -
        • Revised HTML5 Audio() events, improved whileloading() / whileplaying() / onload() for Webkit and Firefox 4. Progress/onload are still a bit quirky as HTML5 audio is more about "non-linear" loading including range and partial requests, where supported. See related discussion.
        • -
        • New soundManager.ok() method, nicer alias for soundManager.supported().
        • -
        • Took soundmanager.loadFromXML() (SM1 legacy method) out back and shot it. Last tweak was in 2008, nobody uses it.
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Flash <object> / <embed>: hasPriority attribute, enables off-screen SWF loading with Flash 10.1+. Removed mobileFlash positioning/repositioning tricks in lieu of this.
        • -
        • Effectively re-wrote page-player (Muxtape-style) demo, now traverses live DOM for next item(s). Should be more AJAX-friendly. Event delegation now handles any links added at any time. Externalised experimental features, too.
        • -
        • HTML5: If URL lacks type attribute and extension such as .mp3 (worst-case scenario, you shouldn't be doing this anyway) just try dumbly loading it - imitating Flash behaviour.
        • -
        • Improved dataerror (wave/spectrum) exception handling, should result in lowered CPU use if playback continues with access exceptions (eg. YouTube video going in another tab.)
        • -
        • Start-up debug output/messaging clean-up (no movieStar in flash 8, minimal output in HTML5-only mode, etc.)
        • -
        • Add window unload handler if Flash being used, so back button will cause a page refresh (vs. the browser showing "previous state") to reinstate Flash in good browsers. Previously, the "previous state" was be shown but Flash audio would be broken.
        • -
        • ipod (ipod touch) gets HTML5 now, too.
        • -
        • Microsoft have added Audio() to Internet Explorer 9 as of "Platform Preview 7" - previous pre-releases of IE 9 only implemented <audio>, which SM2 does not use.
        • -
        -
      • - -
      -
    • - -
    • -

      V2.97a.20101010 - Code cleanup, HTML5 audio tweaks, RTMP features, removal of experimental video, optional usePolicyFile crossdomain.xml feature (Download archived version)

      -

      Shuffling of SoundManager 2 core, approximately 5% shaved off full debug-enabled file size after bug fixes, additional comments, new features and so on. Internal event handling code cleaned up. .SWF builds optimized, Flash 9 non-debug version now under 10 KB. Debug version now flash debugger-enabled. RTMP improvements for Red5 + Flash Media Server streaming cases - buffering, event and state handling. Experimental video feature is toast, createVideo() no longer implemented. iPhone + iPad touch events on page player + 360° player UI demos; tap and drag to seek, etc.

      - -
        - -
      • -

        Bug fixes

        -
          -
        • No HTML5 audio for *any* Safari on OS X Snow Leopard 10.6.[3|4] due to underlying bugs causing intermittent audio playback failure; ongoing Apple issue, on their radar. (See related GitHub commit)
        • -
        • Don't unload() at onfinish() for HTML5 audio (was originally done to be conservative, but results in additional HTTP requests despite caching expectations?)
        • -
        • onload() for HTML5 now using proper boolean values
        • -
        • Fix NetStream-specific autoLoad/autoPlay/volume createSound() call, specific null flash sound object error scenario. (Related changes on GitHub.)
        • -
        • Fix for "onbufferchange(1) followed immediately by onbufferchange(0)" case when audio was actually still buffering.
        • -
        • Removed setPosition() within unload(), cleaner exit when destroying a sound
        • -
        -
      • - -
      • -

        API Updates

        -
          -
        • Removed experimental video feature (originally added late 2008, never developed further.) createVideo(), allowFullScreen and related video methods are now gone. Other dedicated HTML5/flash video player projects have since solved this problem.
        • -
        • New SMSound option: usePolicyFile - (boolean, default: false) - enables Flash to request /crossdomain.xml file for content on third-party domains, if access to ID3/metadata such as wave/peak/spectrum is needed. Will automagically enable if onid3() or peak/wave/spectrum features are being used.
        • -
        • console.warn()-style messaging (instead of throwing exceptions) if createSound() etc. are called before SM2 init has fired. Now calls similar warning and exits if called after a failed, unsuccessful startup (ie., timeout or not-supported case.)
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • SoundManager 2 core code cleanup, ~5% shaved off soundmanager2.js code size after new features, bug fixes and comments etc. Internal event handling (DOM-related events for init, IE 6 vs. everybody else) improved.
        • -
        • Flash builds optimized; Flash 9 SWF build now under 10 KB. Debug-enabled Flash 9 SWF now hooks into Flash debug player/IDE debugging tools (compiled with -debug=true)
        • -
        • Attempt to detect RTL documents, position Flash accordingly if so to avoid long horizontal scrollbar issue (related discussion)
        • -
        • iPhone + iPad touchmove() and related events added to page player + 360° player UI demos; tap and drag to seek should now work.
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.96a.20100822 - HTML5 audio support no longer alpha, Safari 5.0.1/SL HTML5 audio issues continue, iPad/iPhone "play through", Flash tweak for Android (Download archived version)

      -

      useHTML5Audio feature now considered beta-worthy, though disabled by default to be safe (with the exception of iPhone + iPad.) iPhone/iPad will now play a sequence of sounds, user interaction only required to start first one. Flash on-screen positioning tweak for Android devices that run Flash. Safari 5.0.1 on Snow Leopard exhibits same buggy HTML5 audio issue, disabled by default; Apple have been notified. IE 9 "Platform Preview 4" has <audio> but no Audio() support (yet?) See bug #586311 (may require connect.microsoft.com / Windows Live ID, login first etc.)

      - -
        - -
      • -

        Bug fixes

        -
          -
        • HTML5 Audio() still broken in Safari 5.0.1 on Snow Leopard (10.6.3, 10.6.4), where sounds intermittently fail to load and play. Apple are aware of the regression. Related bug: #32519. Include sm2-ignorebadua in URL on SM2 pages to ignore this check and verify broken behaviour, etc.
        • -
        • Tweaks for experimental RTMP feature re: handling of paused state, tracking of position and onfinish() firing early.
        • -
        • Bumped SWF z-index to 5000 for Safari 5, SoundCloud-reported bug-and-fix for Safari 5-specific bad redraw issues, and occasional crash case referencing WebCore::RenderLayer::paintLayer
        • -
        -
      • -
      • -

        API Updates

        -
          -
        • iPhone/iOS 4 and iPad can now play a sequence of sounds (once the user starts sound initially), provided onfinish() is used to create/play the next sound. Example: Muxtape-style UI on homepage will play through list without further interaction once a user plays something in the list.
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Special case for getting SM2 working more reliably on HTC Android + Flash 10.1, where flash does not load until on-screen (ie., in view.) If off-screen, Flash is repositioned at left/top 0px in order to load (including scroll/resize if needed), then events released and movie is repositioned off-screen. If movie is in the DOM already eg. as in useFlashBlock cases, flashLoadTimeout is set to 0 to allow infinite wait (eg., SM2 will not timeout with an error, and will simply load when the flash is scrolled into view.)
        • -
        • Documentation: Clarified createSound() behaviour if an existing sound ID is given (returns sound object "as-is", ignores any options passed.)
        • -
        • Page-player demo updated to use canPlayLink() instead of canPlayURL, more flexible link/type handling.
        • -
        • Homepage and documentation UI/layout and language tweaks, a few new "as seen on the internets" icons etc.
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.96a.20100624 - Safari 5/Snow Leopard 10.6.3/10.6.4 HTML5 Audio() issue, X-domain SWF build fixes (Download archived version)

      - -

      Disabling HTML5 Audio for Safari 5 on Snow Leopard 10.6.3 + 10.6.4 (current release) only, as it is broken similar to Safari 4.x (also on Snow Leopard only.) Related bug: #32519. Also, version info in SWFs and fixed X-domain SWF build.

      - -
        - -
      • -

        Bug fixes

        -
          -
        • HTML5 Audio() still broken in Safari 5 on Snow Leopard (10.6.3, 10.6.4) - disabling for now, falling back to Flash as with Safari 4.x on Snow Leopard. Include sm2-ignorebadua in URL to ignore this check and verify broken behaviour, etc.
        • -
        • Fixed X-domain SWF builds to actually work cross-domain.
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Added version info string to SWFs in Flash right-click / context menu, helpful when troubleshooting SWFs.
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.96a.20100606 - RTMP (Flash Media Server) Support, HTML5 Updates (Download archived version)

      - -

      HTML5 update, new RTMP feature: Experimental Flash Media Server support, onposition() event listener, SMSound type option and code cleanup.

      - -
        - -
      • -

        API Updates

        -
          -
        • New experimental RTMP support while maintaining existing NetStream-based behaviour for non-RTMP MPEG4 audio, etc. Uses new serverURL parameter for FMS (I used Red5 for dev/testing,) eg. soundManager.createSound({id:'rtmpTest',serverURL:'rtmp://localhost/oflaDemo',url:'oh-alberta.mp3'}).play();
        • -
        • New SMSound option for createSound(), load(), play(): 'type', for specifying MIME type alongside URL to help with detecting playability. eg. -soundManager.createSound({id:'foo', url:'/player.php?stream=1', type:'audio/mp3'}).play(); and so on. Hat tip: sylvinus.org
        • -
        • New SMSound event: onposition(), for attaching listeners to specific times within a sound.
        • -
        -
      • -
      • -

        Bug fixes

        -
          -
        • Flash sound unload/destroy ActionScript "could not close stream" exception/warning (finally?) fixed.
        • -
        • Sound looping updated for Flash 8, working (albeit with a quirk - requires preloading.)
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Removed Base64 HTML5 Audio() tests, redundant as numerous MIME (audio/mpeg, audio/mp3 etc.) checks seem to cover it.
        • -
        • Updated MPC (drum machine) demo from 2006-era design, modernizing the CSS a bit.
        • -
        • nullURL = 'about:blank' tweak for unloading (flash 8.) May have finally fixed that dumb stream closing error on unload/destroy.
        • -
        • set soundManager.didFlashBlock *before* firing onready()/onerror() listeners
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.96a.20100520 - HTML5 Edition (Download archived version)

      - -

      Experimental HTML5 support, lots of code shuffling and performance tweaks.

      - -
        - -
      • -

        API Updates

        -
          -
        • New soundManager.useHTML5Audio (disabled by default except for iPad, Palm Pre) - adds experimental HTML5 Audio support, with Flash fallback for MP3/MP4 formats as needed.
        • -
        • Sound looping now works in Flash! eg. mySound.play({loops:3}); - for an example + discussion of how to get near-seamless looping, see Seamless Looping MP3s in Flash (demo video) on Flickr.
        • -
        -
      • -
      • -

        Bug fixes

        -
          -
        • beginDelayedInit() is always used in lazy loading case (eg. via dynamic script tag/XHR etc.,) as some cases where SM2 won't auto-start eg. document.readyState empty for Firefox 3.5.5 (seen on Win32) with an HTML5 DOCTYPE.
        • -
        • SWF is now 8x8 pixels by default, vs. 6x6 pixels (odd fix for HTML5 Doctype on Firefox 3.6/win32)
        • -
        • Fixed dumb IE undefined ID bug
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • soundmanager2.swf and soundmanager2_flash9.swf are now "non-debug" versions; with debugMode enabled, soundmanager2_debug.swf and soundmanager2_flash9_debug.swf are loaded instead.
        • -
        • New build script for JS + SWFs, see file size table. JS compression now done via Google Closure compiler; new soundmanager-jsmin.js build, debug-enabled but compressed, in addition to build-script-optimized, no-debug, compressed JS (~9 KB with gzip vs. ~90 KB for raw, commented, debug-enabled version.)
        • -
        • Null check fix for unavailable eq/waveform data
        • -
        • Experimental video (flash 9-only) change: Use stage width/height instead of 0/0 when lacking metadata
        • -
        • Page player whileloading() calls now being throttled
        • -
        • Better page player click handling for IE 7
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.95b.20100323 (Download archived version)

      -

      useFlashBlock, better handling of time-out/errors (CSS-based SWF repositioning options for unblocking on time-out), "play MP3 button" demo, canPlayLink(), canPlayMIME(), eqData + waveformData for AAC/H.264 (movieStar) content, missing documentation and miscellaneous bug fixes.

      - -
        - -
      • -

        API Updates

        -
          -
        • New soundManager.useFlashBlock (disabled by default) - enables CSS classes assigned to SWF container indicate start-up state (ok/error/blocked), allowing positioning/display of SWF for unblock cases and successful recovery from unblocking. Built into homepage + (most) demos. Updated flashblock demo as well.
        • -
        • playableClass attribute eg. <a href="foo.php" class="inline-playable">, allowing URLs without .mp3 to be picked up
        • -
        • New soundManager.canPlayLink() + canPlayMIME(), ability to check <a href="foo.php" type="audio/mp3"> for example
        • -
        -
      • -
      • -

        Bug fixes

        -
          -
        • soundManager.play() type check fix, instanceof Object vs. typeof x === 'Object' (typo)
        • -
        • computeSpectrum() can access waveform and eq (spectrum) data for movieStar (AAC/MP4, netstream-based) objects, too.
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Moved old demo code using $() to _id(), _$ in soundManager2 to _id() to avoid potential jQuery (and other $-based library) collisions
        • -
        • Make new SoundManager('/path/to/swfs/'); actually work.
        • -
        • Flash time-out (flash blockers) vs. security failure detection/other error cases is smarter on the SM2 homepage now
        • -
        • New "MP3 player button" demo
        • -
        • Removed old IE onclick handler fix in several demos for non-MP3 links
        • -
        • eqeqeq = true for jslint, why not.
        • -
        -
      • - -
      -
    • - - -
    • -

      V2.95b.20100101 (Download archived version)

      -

      New features: Flash movie debugging in SWF via debugFlash (default:false), SMSound.eqData = { left:[], right:[] }, code tidying and debug output clean-up

      - -
        - -
      • -

        API Updates

        -
          -
        • New soundManager.debugFlash property, enables debug messages from within flash (output to flash movie). Useful for troubleshooting start-up, security issues etc. Flash debug output example
        • -
        • SMSound.eqData now has left and right channels - e.g. eqData = { left: [], right: [] } - was previously a single array: eqData = []; Backwards-compatibility is maintained for now as eqData[i] still works with the new structure.
        • -
        -

        Bug fixes

        -
          -
        • stream = true is no longer automatically set when SMSound.play() is called and readyState == 0, as it was breaking the stream:false case where playback should not start until the sound has fully-loaded.
        • -
        • soundManager.reboot() forces recreation of object/embed rather than old method of node remove/re-append (in case other options changed, eg. debugFlash was false, but assigned to true after an error during start-up.)
        • -
        -

        Miscellaneous

        -
          -
        • Review of all SM2 debug output, more concise and informative messaging - especially around start-up troubleshooting/error debugging, security sandbox errors, SWF 404 case etc.
        • -
        • Code formatting clean-up (via jsbeautifier.org) - soundmanager2.js tested and passes JSLint, Edition 2009-11-22 + options: /*jslint undef: true, bitwise: true, newcap: true, immed: true */
        • -
        • Better organization/use of strings for debug output
        • -
        • New canvas-based favicon VU meter demo for home page, 360 player and muxtape-style player demos where supported (Firefox and Opera, currently.) Firefox 3.6 is disappearing support for XBM images, which were previously used.
        • -
        -
      • - -
      -
    • - -
    • -

      V2.95a.20090717 (Download archived version)

      -

      New features: onready(), fast polling, flash blocking demos etc.

      - -
        - -
      • -

        API Updates

        -
          -
        • New soundManager.onready(myFunction[,scope]) method, for asynchronous queueing of onload()-style handlers. Fires when SM2 has finished initialising. Accepts an optional scope parameter to apply to handler; if none given, window object is used. A "status" object is passed to your handler (can be ignored) which includes a success boolean indicating whether SM2 loaded OK or not. Handlers added via onready() after successful initialisation will fire immediately.
        • -
        • New soundManager.oninitmovie() event callback, single assignment similar to onload(). Fires when the flash movie has first been written to (or read from) the DOM. Used internally for a flashblock-handler-related example, custom timeout condition.
        • -
        • New soundManager.useFastPolling property (false by default), enables 1 msec Flash 9+ timer for highest-possible whileplaying() and related JS callback frequency (default is 20 msec.) Use with soundManager.useHighPerformance = true for best performance, frame rates while updating the UI via whileplaying() etc.
        • -
        • New sound option (soundManager.defaultOptions): multiShotEvents (default:false) - enable support for multiShot-style events (currently onfinish() only). Eg. When mySound.play() is called three times, onfinish() will subsequently fire three times.
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • createSound now writes a warning to debug output if the sound ID is a number, or is a string starting with a numeric character. Because SMSound objects are stored in soundManager.sounds[], while not syntactically invalid, numeric IDs will be treated as array indices and are likely to break things.
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • New flashblock / "click to flash" demo, example of handling blocked conditions and graceful recovery when flash is initially blocked until user chooses to allow it.
        • -
        • Cross-domain-scripting enabled SWF (using allowDomain("*")) included in swf/ directory (in its own .zip file.) Use when you must have domain A loading SM2 .SWF from domain B, or for testing etc and can't compile your own custom x-domain SWF from source.
        • -
        • Documentation, layout and menu tweaks
        • -
        -
      • - -
      -
    • - -
    • -

      V2.95a.20090501 (Download archived version)

      -

      Lots of updates.

      - -
        - -
      • -

        API Updates

        -
          -
        • Added soundManager.allowFullVideo for full-screen video playback, triggered by double-clicking. Also, related soundManager.onfullscreenchange event handler.
        • -
        • Updated waveformData to include stereo channels. Now an object literal instead of a single array. New format: SMSound.waveformData = { left: [], right: [] }
        • -
        • New SMSound.ondataerror() (flash 9+) handler for cases where waveform/eq data is inaccessible due to other flash movies in the current browser which have loaded sound. (Flash must have security permissions to "read" all data currently being output, long story short. Having a YouTube tab open can cause this, for example.)
        • -
        • New isBuffering property for MovieStar (MP4 audio/video) content, related onbufferchange() event handler (sound object)
        • -
        • New bufferTime property for MovieStream content. Defines seconds of data to buffer before playback begins (null = flash default of 0.1 seconds; if AAC playback is gappy, try up to 3 seconds.)
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • Off-screen flash with wmode set to non-default value (transparent/opaque) will break SM2 for non-IE on Windows, time-out error style. SM2 will now revert wmode to default for this case (losing transparency/layering of movie) - or set soundManager.flashLoadTimeout to 0 and SM2 will retain wmode, but must now wait potentially infinitely for flash to load (until user scrolls it into view.) soundManager.specialWmodeCase reflects if this fix has been applied after init time.
        • -
        • Calling soundObject.load() after directly assigning a value to soundObject.url should now work as expected.
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Shiny new "360° UI" canvas + visualization demos (Warning: Beta-ish code.)
        • -
        • Experimental SM2 exception/error handling + stack trace reporting added, an attempt to make custom errors thrown from SM2 more meaningful (ideally showing the user's call to SM2 where things went wrong in the stack.)
        • -
        • Calling soundObject.load() after directly assigning a value to soundObject.url should now work as expected.
        • -
        • soundManager.useHighPerformance update: Now false/disabled by default. Strange bug with JS/flash communication breaking with wmode=opaque on flash, specific (?) to Firefox on windows. SM2 does not normally set wmode. When useHighPerformance = true, wmode=transparent will be used on the flash movie by default.
        • -
        • Tweaks related to position, whileplaying(), playState, buffering and state resetting when sound has finished playing (fixes for a few edge cases if replaying or reusing the same sound or video.)
        • -
        • Better code/feature separation and clean-up on inline player, Muxtape-style demos
        • -
        -
      • - -
      -
    • - -
    • -

      V2.94a.20090206 (Download archived version)

      - -
        - -
      • -

        API Updates

        -
          -
        • New isBuffering property, related onbufferchange() event handler (sound object)
        • -
        • New soundManager.reboot() method (experimental): Shut down and re-initialise SoundManager, remove and recreate flash movie (possibly handy for cases where you want to restart after flashblock-type whitelisting, etc.)
        • -
        • New soundManager.flashLoadTimeout property, milliseconds SM2 will wait for flash movie callback before failing and calling soundManager.onerror() during start-up/init. If set to 0, SM2 will wait indefinitely for flash (good for reboot/flashblock-type scenarios.)
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • Reverted Firebug 1.3 console.log().apply() hack, was breaking console.log() under IE 8 RC1 (as used with debug mode.) Firebug 1.3 seems to have a bug, occasional "console undefined" error.
        • -
        • Fixed a dumb flash 9/AS3 bug with setVolume() passing an extra parameter to flash.
        • -
        • soundManager.useHighPerformance update: Now false/disabled by default. Strange bug with JS/flash communication breaking with wmode=opaque on flash, specific (?) to Firefox on windows. SM2 does not normally set wmode. When useHighPerformance = true, wmode=transparent will be used on the flash movie by default.
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Tweaked project page / documentation UI, nicer code/debug formatting
        • -
        • Misc. API documentation fixes, improvements
        • -
        -
      • - -
      - -
    • - - -
    • -

      V2.93a.20090117 (Download archived version)

      - -
        - -
      • -

        General Updates

        -
          -
        • New SoundManager 2 start-up debugger / troubleshooting tool, built into project home (see troubleshooting, and a standalone version - see "troubleshoot/" directory of download package)
        • -
        • New soundManager.getMemoryUse() method (flash 9+.) Returns RAM use for flash plugin (appears to be browser-wide, possibly system-wide by design.) Video demo includes an example RAM use monitor.
        • -
        • highPerformance disabled by default for Firefox on Windows due to reports of bugs preventing SM2 start-up in some cases. To override the disabling safety check, set soundManager.useHighPerformance = 'always';
        • -
        • Updated API demo testcases (API Demo page)
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • Fixed Flash 8 bug with autoLoad/autoPlay and playState not being correctly set.
        • -
        • Fixed a bug with onfinish() not firing when autoPlay is used.
        • -
        • Fixed a bug with pan and volume defaults not being correctly inherited and handled
        • -
        • console[method]() now uses apply(), preventing possible Firebug 1.3-related scope issue where this != console
        • -
        • IE now appends (vs. destructive .innerHTML write) SWF movie to target element, appends DIV with className "sm2-object-box"
        • -
        -
      • - -
      - -
    • - - -
    • -

      V2.92a.20081224 (Download archived version)

      - -
        - -
      • -

        General Updates

        -
          -
        • Note: Flash (SWF) assets moved to swf/ subdirectory, starting with this version.
        • -
        • Updated design on API demo page, new looping example
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • Improved regular-expression-based URL detection for canPlayURL(), flash 8/9 and MovieStar (video) formats
        • -
        • Improved soundManager.url-related normalizeURL() handling. If GET parameters are in the URL including the SWF, it will be left alone.
        • -
        • Fixed out-of-bounds issue with setPosition().
        • -
        • Fixed a setPosition(0) and before onfinish()-related issue, so it is possible to nicely loop sounds from within onfinish() - see looping a sound (API demo)
        • -
        • Fixed an error condition where destroying a loading sound would not terminate the HTTP request, relating to error cases involving netStream.close().
        • -
        -
      • - -
      - -
    • - - -
    • -

      V2.91a.20081205 (Download archived version)

      - -
        - -
      • -

        General Updates

        -
          -
        • Completely-redesigned project page, multiple pages/sections, more-legible grid-based documentation layout
        • -
        • Code verified with jslint. 0 errors reported with default settings, Edition 2008-11-26
        • -
        -
      • - -
      • -

        Bug fixes

        -
          -
        • True XHTML DOM compatibility. Rewrote createMovie() to use standard DOM createElement() methods, vs. previous writing to .innerHTML method which caused exceptions with XHTML documents.
        • -
        • Special-cased useHighPerformance for Firefox 2 only, disabling it as it seems to be problematic. Further research pending.
        • -
        • Removed try .. catch error handling within soundManager.onload(), catching exceptions when calling user-defined onload handler. Errors should now fall through as normally expected.
        • -
        • Fixed several setPosition()-related bugs (NaN/undefined error, seeking to invalid position, position inconsistencies with pause/resume)
        • -
        -
      • -
      - -
    • - -
    • -

      V2.90a.20081028 (Old documentation theme) - Download archived version

      - -
        -
      • -

        API: Bug fixes

        -
          -
        • Fixed numerous Flash AS3 exceptions for Flash 10 plugin users of SM2 with Flash 9 .SWF
        • -
        • Fixed a setPosition() bug where position > duration would stop sounds playing in other tabs
        • -
        • Fixed createSound(); play(); destruct(); sequence to correctly stop sound under Flash 9
        • -
        • Changed Flash 9 onload() to properly pass boolean "false" on load failure, same as Flash 8
        • -
        • Fixed autoLoad=true bug with Flash 9 movieStar (MPEG4) content, now pauses after creating
        • -
        -
      • - -
      • -

        API: New shiny!

        -
          -
        • soundManager.useHighPerformance: Minimize JS/Flash lag, ~3x whileplaying() frequency! (Most noticeable on Mac OS X, and Safari on Windows? Investigating IE cases.)
        • -
        • soundManager.pauseAll() / soundManager.resumeAll(): Global pause/resume
        • -
        • soundManager.muteAll() / soundManager.unmuteAll(): Global mute/unmute
        • -
        -
      • - -
      • -

        MovieStar MPEG4 video support! (experimental)

        -
          -
        • soundManager.createVideo() / soundManager.destroyVideo() for MovieStar MPEG4 formats!
        • -
        • Uses same SMSound instance object and API methods/options as regular sounds, with a few extra parameters
        • -
        • soundManager.useVideo will show video when applicable (false/disabled by default)
        • -
        • SMSound.onmetadata: Meta data handler for MPEG4 video files - provides dimensions (w/h)
        • -
        -
      • - -
      • -

        Miscellaneous

        -
          -
        • Removed experimental flashBlock support. Considering eliminating SM2 timeout-based onerror() behaviour in favour of asynchronous loading (eg. user may initially block, notice flash movie and take action to unblock many seconds after loading - thus, flash movie eventually loads and can eventually trigger successful SM2 init.)
        • -
        • Modified pause() and resume() to only affect playing sounds (eg. playState != 0).
        • -
        -
      • - -
      - -
    • - - - -
    • -

      V2.80a.20081005

      - -
        -
      • -

        API: Bug fixes

        -
          -
        • Changed Flash 8 onload() boolean "loaded" to be based on sound duration being >0, better test of load success.
        • -
        • Modified Flash 9 onload() to include boolean result for success/fail, parity with Flash 8
        • -
        -
      • - -
      • -

        API: New shiny!

        -
          -
        • -

          Added experimental Flash 9.0r115+ (flash codename "MovieStar", Flash 9 Update 3) MPEG4 / HE-AAC support (audio only.) A subset of MPEG4 should be supported including FLV, MP4, M4A, MOV, MP4V, 3GP and 3G2 files. Feature is disabled by default.

          -
            -
          • New soundManager useMovieStar property, controls feature availability (currently disabled by default.)
          • -
          • New SMSound option, isMovieStar, configures feature behaviour on a per-sound basis. Default (null) is to auto-detect .mp4, .mov etc. in URL and enable if found, but can also be forced on or off (true / false).
          • -
          • Video-based formats use the Flash 9 NetStream and NetConnection objects, whose API differs slightly from the Sound object. Seeking is limited to video key frames and is not as smooth as an MP3.
          • -
          • Audio playback has been seen to pause during certain events (window scrolling, etc.) while playing MovieStar formats. It doesn't appear to be from CPU overload. More investigation is needed.
          • -
          • Basic load, progress, onload, whileplaying API support is provided (page player demo includes MP4 and FLV formats). Not all methods (eg. setVolume) have been tested.
          • -
          • .AVI is not included by default, but may work if the format is actually MPEG4-based.
          • -
          • Format limitation note: EQ, peak and spectrumData are not available with MovieStar content. This may be a Flash 9/AS3 limitation.
          • -
          -
        • -
        -
      • - -
      • -
          -
        • -

          Miscellaneous

          -
            -
          • Added CSS checks to page player: "exclude" and "playable" to override default URL matching behaviour.
          • -
          -
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.78a.20080920

      - -
        -
      • -

        API: Bug fixes

        -
          -
        • Added SoundLoaderContext parameter to load(), Flash should now check policy-related (crossdomain.xml) files when loading resources from remote domains. Should fix previous security exception warnings when trying to access ID3 and/or waveform/EQ data. See related SoundLoaderContext documentation (ActionScript 3)
        • -
        • Fixed a bug with load(), was improperly expecting an options object - now works properly.
        • -
        -
      • -
      • -

        API: New shiny!

        -
          -
        • Added soundManager.altURL property (and useAltURL conditional) for convenient offline and other URL switching cases (dev vs. production environments, etc.)
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Renamed internal soundManager and SMSound self closure references to _s and _t, respectively, to avoid potential conflicts with others' code
        • -
        • Moved self-destruct to use window.onunload instead of onbeforeunload, given the latter event can be caught and canceled if desired by the user
        • -
        • Inline player demo: Added autoPlay option
        • -
        • "Basic" demo directory (demo/basic/) moved to demo/api/, added load()-related testcase
        • -
        -
      • -
      - -
    • - -
    • -

      V2.78a.20080920

      - -
        -
      • -

        API: Bug fixes

        -
          -
        • Added SoundLoaderContext parameter to load(), Flash should now check policy-related (crossdomain.xml) files when loading resources from remote domains. Should fix previous security exception warnings when trying to access ID3 and/or waveform/EQ data. See related SoundLoaderContext documentation (ActionScript 3)
        • -
        • Fixed a bug with load(), was improperly expecting an options object - now works properly.
        • -
        -
      • -
      • -

        API: New shiny!

        -
          -
        • Added soundManager.altURL property (and useAltURL conditional) for convenient offline and other URL switching cases (dev vs. production environments, etc.)
        • -
        -
      • -
      • -

        Miscellaneous

        -
          -
        • Renamed internal soundManager and SMSound self closure references to _s and _t, respectively, to avoid potential conflicts with others' code
        • -
        • Moved self-destruct to use window.onunload instead of onbeforeunload, given the latter event can be caught and canceled if desired by the user
        • -
        • Inline player demo: Added autoPlay option
        • -
        • "Basic" demo directory (demo/basic/) moved to demo/api/, added load()-related testcase
        • -
        -
      • -
      - -
    • - -
    • -

      V2.77a.20080901

      - -
        - -
      • -

        API: Bug fixes

        -
          -
        • Fixed some mute() / unmute()-related bugs, global muting should now work properly. Added some related demo page examples.
        • -
        • Removed comment on flash9Options merging code, was previously new and didn't actually work as it was commented out. Oops. :D
        • -
        • Added experimental Flashblock exception handling (mozilla/firefox extension), "notification bar"-style UI which can message and assist users in unblocking SM2 .swf. Configured via soundManager.flashBlockHelper object, currently disabled by default.
        • -
        • Modified soundManager.destroySound() and sound.destruct(), fixed a bug with these methods and flash's unloading of sounds which was breaking things. Hopefully fixes destroying sounds within whileplaying() and related event handlers, too.
        • -
        • Modified flash 9 "peak data" code to only set the data if the feature is actually enabled.
        • -
        • Modified soundManager._debug() to list all sound object details, instead of just ID/URL.
        • -
        -
      • - -
      - -
    • - -
    • -

      V2.76a.20080808

      - -
        - -
      • -

        API: Bug fixes

        -
          -
        • Fixed some memory "leaks" / garbage collection issues. RAM allocated to load sounds previously wasn't freed until page unload; now memory should be garbage collected some time after sound.unload() and/or soundManager.destroySound()/sound.destruct() methods are called. In certain cases, Flash sound objects may be destroyed and re-created (transparent to the JS-side) to release memory. Note that garbage collection is not instantaneous, and is affected by CPU/system load and other variables.
        • -
        • Fixed an issue with play() not working on sounds created with autoPlay.
        • -
        • Fixed SM2 to work under proper XHTML (served as application/xhtml+xml MIME type). Rewrote object/embed code again, now version-agnostic for IE (no CLSID parameters.)
        • -
        • Corrected reported loadFromXML() bug, multiple loadFromXML() calls should work.
        • -
        -
      • - -
      • -

        API: New shiny!

        -
          -
        • New useWaveformData and useEQData sound options, providing access to raw waveform and sound frequency/EQ spectrum data via sound.waveformData and sound.eqData.
        • -
        • Renamed useSpectrumData to useWaveformData - if using waveform stuff currently, make sure you update your code!
        • -
        • Added soundManager.features object, which reflects the "support" state for peakData, waveformData and eqData. Handy for current and future version/support branching.
        • -
        -
      • - -
      • -

        API: Miscellaneous

        -
          -
        • New flash9Options configuration object for logical separation. When Flash 9+ is used, these options are merged into the defaultOptions object.
        • -
        • Added allowDomain() stubs and documentation to .as source for allowing .swf on external domains to work (recompile of .swf required)
        • -
        -
      • - -
      • -

        "Page As Playlist" demo: Updates

        -
          -
        • Added "favicon" VU meter display option (Flash 9+ only, experimental, currently Firefox/Opera only)
        • -
        • More-efficient RAM use via unload() and destruct() sound methods, discarding inactive sounds and freeing RAM as appropriate.
        • -
        • Added useEQData, showing sound spectrum (frequency range) instead of raw waveform
        • -
        • Added fillGraph config option, allowing solid waveform graphs instead of only peak points
        • -
        • Fixed playNext bug where same track couldn't be played twice in a row.
        • -
        • Fixed duplicate URL bug; items with identical MP3 URLs will now work. (Previously, URL was the ID for items and thus had to be unique. Lookup is now done by object.)
        • -
        • Modified MP3 URL search to include URL parameters, characters after ".mp3"
        • -
        -
      • - -
      • -

        Other updates

        -
          -
        • Demo code clean-up, externalised CSS, prettier demo layout and code color highlighting
        • -
        -
      • - -
      -
    • - -
    • -

      V2.75a.20080707

      -
        -
      • Flash 9 support! (soundmanager2_flash9.swf) - multiShot now actually works (layering/"chorus" effects on sounds), new spectrumData and peakData API features. All existing API features should have parity.
      • -
      • Added soundManager.flashVersion property. Flash 8 is the supplied default.
      • -
      • Modified soundManager.url to require only a path, eg. /path/to/soundmanager-swfs/ to allow loading of varying .SWF versions.
      • -
      • Basic (API) demo: Updated multiShot/Flash 9 behaviour documentation
      • -
      • Page player demo: Added optional spectrum and VU (spectrumData/peakData) features
      • -
      • MPC + animation demos: Modified to use Flash 9 (demo improved multiShot feature)
      • -
      • Flash 9 behaviour differences: -
          -
        • multiShot properly allows play() to be called multiple times on a sound object, creating desired "chorus" effect. Will call onfinish() multiple times, but whileplaying() etc. are called only for the first "play instance" to avoid complications.
        • -
        • New soundSpectrum and peakData sound features (spectrum graph / "VU" meter-style data) available
        • -
        • Sounds can be actually unloaded ("null" MP3 no longer needed to cancel loading of an MP3), but URL cannot be changed without destroying and recreating the related Flash sound object. The Flash 9 version does this to maintain API consistency.
        • -
        -
      • -
      • New + improved documentation/project page, updated 2-column layout with content filters, "Get Satisfaction" integration and self-update checks (and a light-switch-related easter egg.)
      • -
      -
    • - -
    • -

      V2.5b.20080525

      -
        -
      • Added waitForWindowLoad for delayed init
      • -
      • Added onpause() and onresume() event handlers
      • -
      • Added mute() and unmute()
      • -
      • Updated demos, revised documentation
      • -
      -
    • - -
    • -

      V2.5b.20080505

      -
        -
      • To improve startup time, soundManager.go() (createMovie() alias) now fires at onDOMContentLoaded() by default if supported. (Otherwise, falls back to window.onload().)
      • -
      • Improved initialisation routine - soundManager.onerror() is called when the Flash init "times out." Specifically, onerror() is called when Flash fails to make an ExternalInterface (Flash-> JS) call to SM2 within 1 second of window.onload() firing.
      • -
      • Added logic to handle special Safari delayed init case (Flash not loading when in a new, unfocused tab until focused) as a exception to the above.
      • -
      • Added better exception handling + debug messaging for initialisation failure cases (Flash security restrictions due to loading from local file system, no flash support, no ExternalInterface support etc.)
      • -
      • Updated .swf appendChild() target to use best-to-worst options: (document.body || document.documentElement || document.getElementsByTagName('div')[0])
      • -
      • Safari console[log|warn|error]-style messages are now properly formatted.
      • -
      • Added tons of semicolons to closing braces, eg. };
      • -
      • "No-debug", minified version of SM2 included: soundmanager2-nodebug-jsmin.js (17.4 KB, down from full size of 35 KB.) With Gzip compression, file size is ~6 KB. (Commented, debug-enabled version compresses to 10 KB with Gzip.)
      • -
      -
    • - -
    • - -

      V2.5b.20080501

      -

      Warning: A little experimental too, read details below.

      -

      Changelog:

      -
        -
      • Rewrote SoundManager initialisation: "Way faster." Communication now initiated from Flash, verification callback then performed by JS; far faster, hopefully more-reliable (TBD.) Init time drastically reduced from seconds to milliseconds in most cases, dependent primarily on Flash movie load rather than window.onload().
      • -
      • Above change also fixes Safari "loading SM2 in background tab" issue, where Safari does not init Flash until background tab comes into focus (when a link is opened in a new, non-focused tab.)
      • -
      • Current drawback: Difficult to determine, save for falling back to window.onload() plus focus methods due to above issue, whether SM2 is actually available or not (ie., soundManager.onerror() will not likely be called as in past.) However, the supported() method will correctly reflect if SM2 has successfully initialised, for example.
      • -
      • Added sandbox/security model code; SM2 can now tell if it is restricted to either local or internet access only, for example. Helpful in potential debugging errors, plus viewing demos off the local filesystem should no longer throw init errors requiring whitelisting (seemingly due to the new initialisation method.) Win!
      • -
      • Opera 9.27 has been noted to have some bugs relating to ExternalInterface, seems to be unable to make calls from ActionScript-level methods using setTimeout() or setInterval(). As a reulst, SoundManager 2 events like onfinish(), whileplaying() and onfinish() can be sporadically called or missed altogether. No known workaround at this time, but Opera 9.5 (beta 2) does not have this issue. Popular MP3 "mix tape" site muxtape.com uses similar techniques for JS-Flash communication and appears to suffer from the same problem.
      • -
      • Warning: Random crash issue noticed when using IE 6 + 7 and this demo page, calling createSound() when soundManager.defaultOptions.autoLoad = true; from within soundManager.onload(), for creating + preloading the tab/theme switch sounds. Removing autoLoad=true (leaving the default of false) fixed the crash. Exact reason not determined, perhaps recursive calls or pre-onload issue (?), seems to be isolated to the home page. MPC demo uses autoLoad also, but did not crash. Mentioning just in case.
      • -
      • Updated Muxtape-style demo: More themes, load/security debugging info etc.
      • -
      -
    • - -
    • - -

      V2.2.20080420

      -

      Changelog:

      -
        -
      • More demos! "Page as a playlist" (muxtape.com-style) example, "Make MP3 links playable inline" demo
      • -
      • Corrected onStop() handler inheritance/overriding behaviour (was incorrectly checking defaultOptions)
      • -
      • Added debug output of options object for createSound() calls. Full options (result of merging global default + sound-instance-specific options) displayed, helpful in troubleshooting. Event handler function code is intelligently (hopefully) displayed, truncated at 64 characters of first block or end of line, whichever comes first.
      • -
      • Removed most HTML markup from non-HTML (eg. console) _writeDebug() calls
      • -
      • soundManager.destruct() writes to console, to be consistent
      • -
      - -
    • - -
    • - -

      V2.1.20080331

      -

      Changelog:

      -
        -
      • Modified createSound() to return a sound object if successful (more logical)
      • -
      • Updated setPosition() method and added position option parameter, documentation + demo (bugfix)
      • -
      • Corrected createSound() and play() sound option inheritance/overriding behaviour (eg. position) to work as expected (most to least important: Method call options -> sound object instance options -> SM2 global options)
      • -
      • Updated deleteSound() so Array.splice() is used instead of delete, the latter doesn't cause Array.length to update (bugfix)
      • -
      • Modified debug=alert to only work when debug mode is enabled (potential annoyance aversion)
      • -
      • Modified togglePause() to use position option parameter rather than undocumented offset (oops :D)
      • -
      • Added supported() convenience method (indicates pass/fail after SM2 has initialised.)
      • -
      • Added disabling debug calls from Flash (performance)
      • -
      • Added URL hash updating/bookmarking and page title updating to jsAMP demo app
      • -
      • Updated project page layout
      • -
      - -
    • - -
    • - -

      V2.0b.20070415

      -

      Changelog:

      -
        -
      • Added destroySound() method
      • -
      • Made debug output slightly less-verbose (commented out)
      • -
      • Safety tweak for position-related Flash bug when loading new sounds
      • -
      • Highly-expanded documentation (SMSound events + properties, examples, caveats, FAQs etc.)
      • -
      • Added time-sensitive light/dark theme for documentation
      • -
      - -
    • - -
    • - -

      V2.0b.20070201

      -

      Second beta?

      -

      Changelog:

      -
        -
      • Fixed stopAll() bug (previously broken)
      • -
      • Added nullURL parameter
      • -
      • Updated documentation
      • -
      -

      V2.0b.20070123

      -

      V2.0b.20070118

      -

      V2.0b.20070115

      -
    • - -
    • -

      V2.0b.20070107

      -

      First beta

      -
    • - -
    • -

      V2.0a.20060904

      -

      Prerelease alpha

      -
    • - -
    - - - - -
    - -
    HTML5 Audio: Support updates, technical notes, quirks, bugs and annoyances
    - -

    Note: This section is archived content and has been rolled into Revision History.

    - -

    As of the V2.97.20111220 release of SM2:

    - -
      - -
    • -

      Multiple URLs (and/or multiple MIME types) can be specified when creating a sound, thus allowing for better native HTML5 support between OGG, MP3 and others. See SMSound.url for details.

      -
    • - -
    • -

      Support for "audio sprites" has been added in the form of from and to sound options. See the audio sprite demo for a live example.

      -
    • - -
    • -

      Added soundManager.html5PollingInterval, for increased whileplaying() callback frequency (higher framerates.) Excludes mobile (eg., iOS) by default.

      -
    • - -
    • -

      Fixed Audio() object src property re-assignment bug seen in createSound()->play().

      -
    • - -
    • -

      mySound.load({onload:function(){}}) callback fixed so it works.

      -
    • - -
    • -

      onload() now called immediately when load({onload:function(){}}) is used on a sound with the same URL which has already loaded.

      -
    • - -
    • -

      onstop() now mimics onfinish() in terms of sequence. HTML5 sets position to 0, but retains pre-stop() position property value (like Flash does.)

      -
    • - -
    • -

      Amazon Kindle Fire UA looks like Safari on OS X 10.6.3, but does not have broken HTML5 audio (i.e., intermittent playback failure) like the "isBadSafari" case.

      -
    • - -
    • -

      Side note: iOS ignores volume, always returns value of "1" (at least, on iOS 4 and present iOS 5 releases.) See related notes.

      -
    • - -
    - -

    As of the V2.97.20111030 release of SM2:

    - -
      - -
    • -

      Fixes for HTML5 unload() on Webkit (connection was not closing) due to src being set to '' (OK only in Firefox, presently?) vs. an "empty" URL.

      -
    • - -
    • -

      HTML5 suspend events are now listened for and fired via SMSound option onsuspend(). This event may be the best way to detect when mobile Safari (eg. iOS) is blocking autoplay-style behaviour, and user interaction is required to start or resume playback. (iOS does not allow auto-play of audio; user interaction is required for audio playback to start.)

      -
    • - -
    • -

      Added try...catch for dumb IE 9 Audio() "not implemented" error in Windows server case without "desktop experience" installed, means no HTML5 audio/video support. Hat tip: Modernizr issue 224.

      -
    • - -
    - -

    As of the V2.97.20110801 release of SM2:

    - -
      -
    • A regression was introduced in V2.97.20110706 where SM2 would fail to start in HTML5-only mode on supported desktop browsers when flash was disabled or not installed, eg., Safari on new Macs or IE 9 without flash. (iOS was not affected.) This has been fixed with the 2.97.20110801 release.

    • -
    • -

      soundManager.useHTML5Audio is now true by default; however, soundManager.preferFlash is also true and HTML5 browsers will still attempt to use flash for playing MP3/MP4 by default, if those formats are marked as "required".

      -

      If you wish to have 100% HTML5 mode in more cases, set soundManager.preferFlash = false. Presently, the MP3 links and MP3 button SM2 demos are more HTML5-friendly and will serve as a test for exposing bugs that may be in the wild.

      -
    • -
    • -

      soundManager.html5Test has been relaxed to use (probably|maybe) for Audio's canPlayType() test (previously, was only "probably") - so formats will be more likely to work on HTML5-only devices that conservatively report "maybe" for MIME types like audio/mpeg; codecs="mp3" at this point.

      -
    • -
    • -

      Certain mobile and tablet-like devices are special-cased as preferring HTML5, and will ignore checking for flash altogether; this presently includes the iPad, iPhone and iPod, Palm Pre and Motorola Xoom.

      -
    • -
    • -

      The HTML5 audio "loadeddata" event triggers an SMSound onload() event, which now fires whileplaying() and tries to pass identical bytesLoaded, bytesTotal parameters so that UIs will correctly show the sound as fully-"loaded" - even if in truth, not all bytes have actually been fetched (depending on the browser and server, etc.) because of the ability to do arbitrary seeking.

      -
    • -
    • -

      The experimental soundManager.useGlobalHTML5Audio and soundManager.requireFlash properties were removed. Internally the global HTML5 audio logic still applies to iOS, but it does not seem to be necessary for other devices at this time.

      -
    • -
    - -

    As of the V2.97.20110706 release of SM2:

    - -
      -
    • HTML5 audio appears to have been fixed in Safari with Snow Leopard 10.6.8, the "pre-Lion release", from 06/2011. SM2 will now only blacklist Safari + OS X 10.6.3 through 10.6.7 as having broken HTML5 audio (intermittent load/playback failures), and falling back to Flash where available.

    • -
    • -

      New, experimental soundManager.preferFlash for handling "mixed-mode" HTML5 + flash cases. In the event HTML5 supports MP3/MP4 and preferFlash is true (and flash is installed), flash will be used for MP3/MP4 content while allowing HTML5 to play OGG, WAV and other formats etc.

      -

      Important note: Because HTML5 audio is still quirky and has bugs, preferFlash is true by default to help ensure MP3/MP4 play consistently. If set to false or flash is not available, "HTML5-only" mode will kick in and will apply to all formats.

      -
    • -
    - -

    As of the V2.97.20110424 release of SM2:

    - -
      -
    • HTML5 audio in Safari on Snow Leopard 10.6.3 through 10.6.9 (10.6.7 was released 03/2011) are blacklisted and will fall back to Flash. 10.6.8 and 10.6.9 are preemptive guesses. According to beta testers, OS X 10.7 ("Lion") has fixed the intermittent HTML5 audio load/playback issue.

    • -
    • new Audio(null) is no longer used for iOS, as iOS would attempt to load a URL called "null".

    • -
    • iOS 4.2 or 4.3 may have introduced new security restrictions around onfinish()->unload()->play() that prevents the "play-through" behaviour previously allowed in certain cases. The unload() attempts to nullify the audio's src attribute, breaking the future play() request. The Muxtape/button/link demos were affected by this, and have been fixed with this release. To prevent this issue in your own apps, avoid unload() and simply use onfinish()->play() for iOS.

    • -
    - -

    As of the V2.97.20110306 release of SM2:

    - -
      -
    • Testing suggests that auto-play ("auto-annoy?") does work on iOS 4.1, but are aggressively blocked as of iOS 4.2.

    • -
    • _resetProperties() when setting Audio().src, fix sound1.play() -> sound2.play() -> sound1.play() case on iOS 4.1 not correctly re-assigning original sound URL (related to global audio object.)

    • -
    • If no flash is detected, try forcing useHTML5Audio = true (eg. desktop safari on new Macs which don't come with Flash.) Related: flash detection code tweak.

    • -
    • isNaN() check for HTML5 loading (saw one under Safari, in testing).

    • -
    • Use new Audio(null) vs (), Opera 9.64 expects URL argument; throws WRONG_ARGUMENTS_ERR otherwise. Doesn't implement canPlayType() either, but both are fixed in future releases.

    • -
    - -

    As of the V2.97.20110123 release of SM2:

    - -
      -
    • New (experimental) soundManager.useGlobalHTML5Audio attribute, enabled by default for mobile + iOS. Enables use of a single audio object, re-used for loading and playing all sounds. iOS currently can only play one sound at a time, so this limitation is safe for now. The global object fixes previous regression of play-through/playNext()-style behaviours.

    • -
    • Sound recycling with new global audio feature should work better than in prior (development) versions.

    • -
    • Improved broken Safari/Snow Leopard HTML5 audio situation: HTML5 mode is no longer disabled - and if available, Flash is used to play MP3/MP4 content to work around known playback issues with native HTML5 audio.

    • -
    • New (experimental) soundManager.requireFlash property (default: false.) If true, prevents HTML5-only mode on devices with both HTML5 and Flash. May be useful when HTML5 is enabled (and can play MP3), but Flash is desired to play RTMP content etc. As of this version, will only use Flash for RTMP.

    • -
    • Fix for type:'audio/mp3' returning false on canPlay(). Timer update-while-paused tweak.

    • -
    • More event listeners, ignore events on destroyed sounds, improved event clean-up, "seek before load" fix

    • -
    - -

    As of the January 1, 2011 (V2.97a.20110101) and December, 2010 releases of SM2 (V2.97a.20101221):

    -
      -
    • The bytesLoaded and bytesTotal properties may become less-relevant under HTML5 due to non-linear HTTP downloading (using ranges and partials), but they are still provided under Firefox at this time.

    • -
    • Related to bytes loading/total, a sound's onload event may not always be fired (Mozilla currently discourage use of the DOM loaded event), again because of range requests and the ability to arbitrarily seek within a file.

    • -
    • Basic support for the W3 TimeRanges implementation of sound buffering (ie., loaded data) has been implemented. This gives an idea of "total time loaded", but again, is not necessarily sequential.

    • -
    • HTML5 audio is disabled for all versions of Safari (4 and 5) on Snow Leopard (OS X 10.6.3 - 10.6.5) until Apple fixes issues with audio loading and playback due to bugs in "underlying frameworks." See Webkit #32159. HTML5 audio in Safari on Windows (provided QuickTime is installed) does not have the same fatal bug.

    • -
    - -

    As of the October, 2010 release of SM2 (V2.97a.20101010):

    -
      -
    • HTML5 audio is disabled for all versions of Safari (4 and 5) on Snow Leopard (OS X 10.6.3 and 10.6.4) until Apple fixes issues with audio loading and playback due to bugs in "underlying frameworks." See Webkit #32159.

    • -
    - -

    As of the August, 2010 release of SM2 (V2.96a.20100822):

    -
      -
    • Safari 5.0.1 (533.17.18) on Snow Leopard (10.6.x) continues to show buggy HTML5 audio load/playback behaviour. Apple are aware of the regression, which began with Safari 4.0 on Snow Leopard (perhaps with the new QuickTime.) See Webkit #32159.

    • -
    • iPad/iPhone iOS4 will now play a sequence of sounds if using onfinish() to create/start the next (eg., the Muxtape-style playlist on the SM2 homepage will play through once the user starts it.) In any event, user interaction is always required to start the first sound.

    • -
    - -

    As of the June, 2010 release of SM2 (V2.96a.20100624):

    -
      -
    • Safari 5.0 (533.16) on OS X Snow Leopard (10.6.x) continues to show buggy HTML5 audio load/playback behaviour, same as with Safari 4.0.5 on Snow Leopard only - may be related to underlying QuickTime implementation (a guess, at this point.) SM2 will disable HTML5 audio support by default for this specific browser + OS combo. See Webkit #32159 for discussion + testcases.

    • -
    - -

    As of the May, 2010 release of SM2 (V2.96a.20100520):

    -
      -
    • Safari 4.0.5 on OS X Snow Leopard (10.6.x) appears to have an annoying bug where audio inconsistently fails to load / play; SM2 will currently disable or ignore the HTML5 feature on this exact browser + OS version. See Webkit #32159 for discussion + testcases. Note that Safari on OS X 10.5 "Leopard" and on Windows do not appear to have this bug; it seems to be limited to Snow Leopard, seen on OS X 10.6.3.

    • -
    • Some browsers (and iPad 3.2?) do not fire progress events, and/or do not implement bytesLoaded/bytesTotal-style attributes.

    • -
    • iPad 3.2 appears to be able to only play one sound at a time, and will terminate other sounds.

    • -
    • iPad 3.2 may also loop AAC+ (HE-AAC) and WAV sounds, perhaps not firing onfinish() and resetting the position to 0 each time, but is fine with MP3s. This has been observed, but not fully-tested.

    • -
    • Looping in HTML5 is either "infinite" or "none". A wrapper may be created for SM2 so that a number of loops can be specified, as with Flash. This is not yet implemented.

    • -
    • Panning (left/right channel balance) does not appear to be in HTML5.

    • -
    • Flash-only features such as ID3 tag reading, waveform and spectrum data will simply be ignored, and their related events will not fire on SMSound objects which are using HTML5.

    • -
    - -
    - - - - -
    - - -
    - - -
    - - - -
    - - - -
    - - - -
    - -
    - -
    - - -
    - - -
    - - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html deleted file mode 100755 index 25fb5a13..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/download/index.html +++ /dev/null @@ -1,1452 +0,0 @@ - - - -SoundManager 2: Download - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    - -
    - -
    -

    Get SoundManager 2

    -

    Get the latest and greatest.

    -
    - -
    - -

    Download SoundManager 2

    - -

    Latest changes: 100% HTML5 mode by default, where available. Duration fix for Adobe FMS/RTMP server-based streaming. HTML5 unload, multiShot, autoPlay tweaks and more. See revision history for details.

    - -

    Download SoundManager 2.97a.20131201 or see on GitHub

    - -

    Performance tip: SM2's code size varies from over 150 KB (commented, debug-enabled) down to 11 KB (optimized) over HTTP; check the pre-optimized builds for details.

    - -

    Side reading + video talks, slides etc.

    - - - -
    - -
    - - -
    - -
    - -

    Revision History

    -

    Latest changes and archived notes from bug fixes, API updates, feature development etc.

    - -
    - -
    - -
    - -

    Revision History

    - -

    A changelog of sorts.

    - -
      - -
    • - -

      V2.97a.20131201 - 100% HTML5 mode by default. Duration fix for Adobe FMS/RTMP server-based streaming. HTML5 unload, multiShot and autoPlay tweaks. See GitHub commits.

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Adobe FMS (RTMP Server) fix: Invoke server-side getStreamLength() call to determine duration. (Red5 and other free RTMP servers use NetStream onMetaData() to pass duration.) -

          -
        • - -
        • -

          - Fix html5Unload() by loading a tiny base64-encoded data: URI WAVe file where supported. Elsewhere, use about:blank. This fixes errors in Chrome where the browser attempts to load the url "null" (a string.) -

          -
        • - -
        • -

          - D'oh! Fix HTML5 sprite regression where _oncanplay() was not being picked up & fired, sound would not play on first click. -

          -
        • - -
        • -

          - HTML5: Fix double-play bug with autoPlay: true. Correct edge case where onposition() items would sometimes be cleared if called/assigned before play(). -

          -
        • - -
        • -

          - ontimeout: function(status) {} callback parameter corrections. Fix missing error { type: 'INIT_TIMEOUT' } for missing/404 SWF case, and INIT_FLASHBLOCK for flashblock-specific case. -

          -
        • - -
        • -

          - HTML5: Apply volume to cloned sounds in HTML5 multiShot case. -

          -
        • - -
        • -

          - Fixed issue in _processOnPosition where the item in onPositionItems[i] can be undefined mid-loop if the callback that is triggered changes the length of the onPositionItems array, where onPositionItems.length becomes zero and there's an uncaught TypeError when trying to access item.fired the next time around. -

          -
        • - -
        • -

          - Fixed mute in HTML5. -

          -
        • - -
        • -

          - Fix onload in Firefox 3.6 with no flash (and yes, Firefox 25 is the current release. :D) -

          -
        • - -
        • -

          - Correct event removal (cloned HTML5 nodes) - onendedended -

          -
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • -

          - Use 100% HTML5 mode by default, where available. preferFlash: false is now the default setting. Firefox does MP3 on Vista (and newer) via HTML5, and recently (via Firefox Aurora builds) on OS X - the last major hold-out. The vast majority of browsers now support MP3 via HTML5, thus reducing the reliance on Flash. -

          -
        • - -
        • -

          - Reboot into 100% HTML5 mode where supported if flash fails after loading, i.e., local/offline/file:// or other edge case. -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Fixed canPlayMIME() documentation example. -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20130512 - multiShot for polyphonic HTML5 clients. createSound() no longer requires an id. Auto-reboot() into 100% HTML5 mode where supported. HTML5 unload tweaks. (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Init enhancement: If preferFlash: true but useFlashBlock: false (the default SM2 config) and flash timeout / blocked case occurs, SM2 will reboot reboot into 100% HTML5 mode if available so init can succeed. If flash block handling is enabled, user interaction will be required to whitelist the flash movie and init will be delayed until the SWF loads. -

          -
        • - -
        • -

          - Correct reboot() to allow 100% HTML5 mode when Flash was previously required due to preferFlash: true. Previously, soundManager.audioFormats.mp3.required = false; soundManager.reboot() did not result in 100% HTML5 mode under Firefox. Now works as expected. -

          -
        • - -
        • -

          - HTML5 unloading: Firefox was supposed to like assigning '' to Audio().url for canceling requests, unloading and destroying the decoder (perhaps only on <audio>, in retrospect?) - similarly, .src = null did not seem to work, possible request to ./ - undesirable. -

          - -

          - Now using more-conservative null URL for unload / destruct on webkit, iOS and others, and emptyURL for Firefox (user-customizable, 'about:blank' by default.) -

          -
        • - -
        • -

          - More HTML5 safety checks so that buffered can't go beyond 100%. -

          -
        • - -
        • -

          - Improve Flash 9 load() -> onload() failure case, when loading a non-404 (eg., HTTP 301 -> 200) with non-audio content. Improved messaging for Flash 8, Flash 9 + HTML5 with zero-duration (invalid / unsupported sound) case. -

          - -
        • - -
        • -

          - Fix flash-only (no HTML5 / useHTML5Audio: false) init case, e.g., running under IE 8. -

          -
        • - -
        • -

          - HTML5: Fix legacy "overloaded" case when soundManager.play('someID', 'some.mp3'); is called twice, second call would fail. This shortcut method is deprecated, and not recommended for use other than a conveience when in development / testing. -

          -
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • - -

          - createSound() no longer requires an id property. If omitted, a unique id will automatically be generated for the new sound object with a prefix based on the SM2 setup option idPrefix. -

          - -

          - Specifying an id is useful if you want to look up the sound via getSoundById() - otherwise, you can simply use the object returned by the createSound() call. -

          - -
        • - -
        • - -

          - multiShot + multiShotEvents for HTML5 Audio()-based sounds, allowing layered / "chorused" playback if play() is called and multiShot: true has been specified to either createSound() or play(). Behaviour should mimic that of Flash 9. If multiShotEvents: true is specified, onfinish() will fire for each instance. Does not apply to mobile clients (e.g., iOS and Android) which only allow one sound to be played at a time. -

          - -

          - Implementation summary: A new Audio(src) instance is created with an onfinish listener, and played immediately. It is unloaded and destroyed when playback finishes. -

          - -

          - Caveat #1: If a position argument is provided eg., play({ position: 1000 }), the cloned Audio() instance must wait for a HTML5 canplay event before a seek and playback can begin. This may mean playback *could* have a slight delay vs. playing without the position offset. -

          - -

          - Caveat #2: The from/to parameters used for "sound sprites", e.g., { from: 500, to: 1500 }, are not presently supported under multiShot. -

          - -

          - Caveat #3: multiShot is not supported where only a single audio instance can be playing at once, e.g., iOS (iPhone/iPad) and some Android devices. -

          - -

          - Secondary instances are "fire-and-forget", similar to the Flash 9 implementation, and fire no events other than onfinish(). They do not respond to position, volume etc. after playback has begun. -

          - -
        • - - - - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Remove debug-related complain() calls from -nodebug and minified script builds -

          -
        • - -
        • -

          - Force data: URLs over to HTML5. Catch unsupported case under 100% HTML5 mode, preventing attempt to use Flash fallback. -

          -
        • - -
        • -

          - Edge case: Fix error case if setup() called without arguments inline, before DOMReady / init etc. -

          -
        • - -
        • -

          - Tweak soundManager.getSoundById() to not throw error if ID omitted. Improve language on "not found" messaging. -

          -
        • - -
        • -

          - Warn on possible 32-sound channel Flash ceiling/limit, which can occur when Flash tries to begin playback and fails to start. -

          -
        • - -
        • -

          - Documentation updates: How Clients Download Audio (Flash/HTML5 progressive download vs. byte streaming) -

          -
        • - -
        • -

          - Improved API Examples page design, two-column layout with navigation -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20130324 - Fix for playlist/event chaining when using flashVersion = 8 with Flash Player 11.6.602.171. HTML5 iOS load() fix. Added Opus to audio formats. (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Flash Player 11.6.602.171, released by Adobe on 02/26/2013, introduced an issue with SM2's default Flash 8 (flashVersion: 8) API-based JS/Flash interaction, where SM2 methods called from callbacks such as onfinish() would not work. This primarily broke methods used for playing sounds in sequence, serially loading a series of sounds and so on. (See discussion for more.) -

          - -

          - Note that this does not affect cases where soundManager.setup({ flashVersion: 9}) is being used; however, SM2 does use flashVersion: 8 by default. -

          - -

          - Specifically, Flash-initiated events (such as a sound finishing) make Flash -> JS calls to the SM2 API, which subsequently call user-specified event handlers. If the user-specified SM2 onfinish() handler immediately calls a SM2 method like play() that makes a JS -> Flash call, this call either silently fails or is blocked. Other JS + Flash libraries that use similar callback patterns may also be affected, if their SWF is built targeting the Flash 8 API. -

          - -

          - Suspecting a timing or recursion/stack issue, it was found that introducing a setTimeout(callback, 0) to user-specified SM2 callbacks like onfinish() restored sequential/playlist functionality. -

          - -

          - Flash Player 11.6.602.180, relased by Adobe on 3/12/2013, exhibits the same behaviour. To avoid additional hacks, SM2 applies this to all Flash 8-based API callbacks regardless of what version of Flash Player is installed. No regressions are anticipated as a result of this change. -

          - -

          - Alternately, this issue can be avoided by using soundManager.setup({ flashVersion: 9 }) as the Flash 9-based API does not appear to have this problem. -

          -
        • - -
        • -

          - HTML5: Fix for iOS load() case when using an auto-load and looping pattern (related discussion). -

          -
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • -

          - HTML5: Added check for Opus (OGG-based audio codec, audio/opus). -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • - -

          - Added documentation for Serving To Clients, and Mobile Device Limitations. -

          -
        • - -
        • - -

          - Minor SM2 homepage + documentation CSS tweaks (design) -

          -
        • - -
        • - -

          - This SM2 release is tagged "Mahalo Edition" to say thank-you, and because some SM2 work was done while on vacation in Hawai'i. Also, some new demo sound recordings from the beach on Kaua'i were added. -

          - - -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20130101 - Strict Mode. Android 2.3 HTML5 fixes, cleaner debug output, improved default flashblock handling. Confirmed compatibility with Firefox WMF-based HTML5 MP3 support. New reset() method, reboot() tweaks (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - HTML5: Reset last URL and load state for "singleton" (global HTML5 audio) case, on iOS + Android <= 2.3 for specific use case - createSound() -> play() -> destruct() -> createSound() -> play() with same URL/parameters. -

          -
        • - -
        • -

          - HTML5: Fix for Android 2.3 / Nexus 7 - they work better with the singleton HTML5 audio() instance as well, same as iOS, for chained (i.e., playlist-style) playback cases. -

          -
        • - -
        • -

          - soundManager.setup() now allows html5Test (regular expression, eg. /probably|maybe/i) to be passed. Was previously unrecognized/rejected. -

          -
        • - -
        - -
      • - -
      • - -

        API Updates

        - -
          - -
        • -

          - The SoundManager 2 core API (soundmanager2.js) now runs in Strict Mode, via "use strict";. This is scoped to a closure within soundmanager2.js, and should not cause issues when combined (rolled-up and/or minified) with other JavaScript code. -

          -
        • - - -
        • -

          - New soundManager.reset() method. Similar to reboot(), but also nukes any registered onready() and related callbacks. Based on pull request from Github user jabr. Chaining is now possible too, e.g., soundManager.reset().setup({onready:function(){console.log('reset() complete, reboot OK')}});. Call soundManager.beginDelayedInit() to re-init after a reset(). -

          -
        • - -
        • -

          - soundManager.setup({url:...}) + lazy-loading (dynamically-loaded JS) case: If setup() given a url parameter after DOMContentLoaded has fired, assume we should start right away. (Helps reduce need for beginDelayedInit() + "just works" for most users). -

          -
        • - -
        • -

          - Don't init inline after document.readyState === 'complete' (improve lazy-loading case, wait for setup() with url instead). -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • - -

          - Prerelease Firefox builds can play MP3 audio via HTML5 in some cases, as part of a move to support H.264 video (see Bugzilla #799318 for details). Firefox 20 (nightlies, and Aurora channel builds in January 2013) can get native MP3 support via Windows Media Foundation (OS-level codec support) components on Windows 8, Windows 7, and soon, Windows Vista. As of 12/2012, OS X support is planned, and Windows XP support is not. (Disclaimer: Vista, OS X and XP notes sourced from comments on Hacker News; see links). -

          - -

          - When enabled with media.windows-media-foundation.enabled = true under about:config, Firefox may be able to play MP3s via HTML5 and thus get "100% HTML5 mode" when soundManager.setup({preferFlash: false}) is used. -

          - -

          - At time of writing (12/30/2012), Firefox 20 (nightly) returns "" for canPlayType('audio/mpeg; codecs="mp3"'), a test commonly used to query for MP3 support under HTML5 and one which works in other modern browsers. Firefox's behaviour differs because it is trying to follow the MPEG spec, which does not include an explicit MP3 MIME type. Instead, canPlayType('audio/mpeg'), which is in-spec, presently returns a "maybe" when MP3 is supported under Firefox. -

          - -
        • - -
        • -

          - Improved SM2 console.log() debug output, aiming to be less "noisy". Core setup options are shown better at start-up, eg. "SoundManager V2.97a.20130101 (AS3/Flash 9) + HTML5 audio + preferFlash + html5PollingInterval (50ms) + flashBlock". -

          -
        • - -
        • -

          - Christmas light demo: Tweaks for iOS + Android touch devices. -

          -
        • - -
        • -

          - MP3 Player Button demo: Include HTML type (MIME hint) attribute, if specified. -

          -
        • - -
        - -
      • - -
      - -
    • - -
    • - -

      V2.97a.20121104 - HTML5 + iOS load fixes, Windows 8 App Store compatibility tweak, code pattern improvements (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Fix HTML5 unload() -> play() case (re-use of same object without assigning new URL). -

          -
        • - -
        • -

          - More global (iOS) HTML5 object unload() / play() re-use tweaks, improved handling of re-use and empty / load() cases -

          -
        • - -
        • -

          - HTML5: Ensure instanceOptions are set after play() call results in load(). Noted instanceOptions not being set from within whileplaying(). -

          -
        • - -
        • -

          - Fix call signature for Flash 8 load method, was tying usePolicyFile (enables remote crossdomain.xml request for ID3/waveform data on 3rd-party domains) to precence of whileloading() due to driver error. Derp. :D -

          -
        • - -
        • -

          - Windows 8 Store Apps (IE 10/"MSAppHost" in UA) don't support Flash or ActiveX, except for (at time of writing), three special ActiveX controls. Thus, new window.ActiveXObject('ShockwaveFlash.ShockwaveFlash') seems to work without error. However, an error is thrown if an <object> with a Flash ActiveX CLSID is appended to the DOM. http://msdn.microsoft.com/en-us/library/windows/apps/hh465143.aspx -

          -
        • - - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Death to underscores! Removed legacy pattern of var _foo = ... for most private internals. -

          -
        • - -
        • -

          - Better typeof x === 'undefined' -> x === undefined pattern per newer jslint rules. -

          -
        • -
        - -
      • - -
      - -
    • - -
    • - -

      V2.97a.20120916 - Inline, deferred and lazy-load init improvements, HTML5 format / detection improvements, "re-use" load/play URL fix. (Download archived version)

      - -
        - -
      • - -

        API Updates

        - -
          - -
        • -

          - Init improvement: Don't fail if Flash URL is null in normal include + init case. Instead, show note in debug input and wait for soundManager.setup() with url param, then treat as delayed init case. Improved experience if including <script>, then trying to do setup() after DOM Ready (common jQuery case). -

          -
        • - -
        • -

          - soundManager.setup({url:...}) + lazy-loading (dynamically-loaded JS) case: If setup() given url parameter after DOMContentLoaded has fired, assume we should start right away. (Helps reduce need for beginDelayedInit() + "just works" for most users) -

          -
        • - -
        • -

          - Don't init inline after document.readyState === 'complete' (improve lazy-loading case, wait for setup() with url: instead) -

          -
        • - -
        - -
      • - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Fix 'audio/mpeg' canPlay() checks, was incorrectly returning false due to audio/mpeg; codecs="mp3" working and preventing audio/mpeg from being checked. -

          -
        • - -
        • -

          - More paranoid Audio() handling for "bad" Opera (< 10) where new Audio() would throw not_enough_arguments (always required URL). -

          -
        • - -
        • -

          - Safer HTML5 duration checks - null now assigned instead of undefined. -

          -
        • - -
        • -

          - Improve durationEstimate under HTML5 during whileloading(). -

          -
        • - -
        • -

          - Flash 9/RTMP: Actually provide caption data to oncaptiondata(). -

          -
        • - -
        • -

          - Fix SMSound.play({url:...}) "re-use" case where new URL wasn't being assigned + loaded right away, and SMSound.url property was not being updated. -

          -
        • - -
        • -

          - Correct load() and play() with new URL parameter, so that subsequent play() call uses new URL (and not URL assigned with original createSound() call). -

          -
        • - -
        • -

          - Use seconds for SMSound.buffered (time ranges) whether HTML5 or Flash, since SM2 API uses seconds for setPosition() etc. -

          -
        • - -
        • -

          - Correct play() -> pause() -> setPosition(0) -> play() -> pause() case where the latter wasn't firing due to invalid state. -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - New Cassette Tape UI Prototype/demo (experimental). -

          -
        • - -
        • -

          - Tweaked documentation layout for legibility. Webfont (deja vu sans mono) from dejavu-fonts.org for code examples. -

          -
        • - -
        • -

          - Improved lazy-load / deferred example based on new setup() logic -

          -
        • - -
        • -

          - Added SMSound.buffered documentation -

          -
        • - -
        • -

          - Added m4b extension as an mp4 format -

          -
        • - -
        • -

          - Safer initial HTML5 support checks -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20120624 - New soundManager.setup() method, numerous HTML5 improvements for createSound(), load(), progress and reuse cases, and minor flash audio bug fixes (Download archived version)

      - -
        - -
      • - -

        API: New sugar-like stuff

        - -
          - -
        • - -

          - New soundManager.setup() mixin-style method for assigning properties and common start-up callbacks. Collects top-level soundManager configuration properties and object collections - onready, ontimeout, defaultOptions, flash9Options and movieStarOptions - under a single method call. -

          -

          - Upgrade / legacy note: This is a modern replacement for the direct property assignment method used in all previous versions - eg., soundManager.url = '/swfs/' - the old method continues to work for legacy support, but you should migrate to using the new method as it's much cleaner. All included demos use the new method where applicable. -

          - -

          - New soundManager.setup() method example -

          - -
          soundManager.setup({
          -  // required
          -  url: '/path/to/swfs/',
          -  // optional
          -  flashVersion: 9,
          -  // convenience
          -  onready: function() {
          -    console.log('Ready to play sound!');
          -  },
          -  ontimeout: function() {
          -    console.log('SM2 start-up failed.');
          -  },
          -  // more custom parameters
          -  defaultOptions: {
          -    volume: 50
          -  }
          -});
          - -

          - See soundManager.setup() for details. -

          - -
        • - -
        - -
      • - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Improve HTML5 audio load/playback reliability + stability on iOS, and for object reuse cases (play() -> load({url: ...}). Prior behaviour was making initial HTTP request when object was created (meta/preload, not necessarily loading entire file.) Request now only happens with preload/load/play-related calls. -

          -
        • - -
        • -

          - HTML5: Firefox seems to have changed when unloading HTML5 audio, url = '' now loads hosting page HTML (boo) instead of null / no request. Changed to about:blank like everyone else. Also fixed boolean logic on isMovieStar assignment. -

          -
        • - -
        • -

          - Add audio/mp3 and related MIME checks for flash, correct edge case where play({type:'audio/mp3'}) would use HTML5 when preferFlash = true, due to seeming lack of Flash support for the MIME type. -

          -
        • - -
        • -

          - Fixed old Flash 8 onload() edge case where loading from cache might return incorrect didLoad: false result - corrected by checking for a non-zero sound duration. -

          -
        • - -
        • -

          - Properly reset SMSound.id3 = {} with internal resetProperty and public methods like load(). -

          -
        • - -
        • -

          - Edge case fix: Don't attempt to remove flash unless reference exists (prevent false warning when reboot() called in 100% HTML5 mode.) -

          -
        • - -
        • -

          - Correct empty options JS error on internal _setup_html5() when reusing HTML5 audio object per V2.97a.20120527 bug report -

          -
        • - -
        • -

          - Fix minor false positive (undocumented error handler case) with HTML5 play() falsely reporting 32-sound ceiling edge case and calling SMSound.onplayerror() (if assigned) when using flashVersion = 9. Should only apply when flash 9 is being used for playback, and ceiling hit. -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Finally assign + use SMSound.id (instead of sID), matching createSound({id: 'foo'}) pattern; maintain legacy sID property (ancient behaviour, originally intended to avoid potential namespace conflicts many years ago - now silly and not a concern.) -

          -
        • - -
        • -

          - Improved handling of whileloading() vs. HTML5 onload (when using HTTP range/partial requests). -

          -

          - HTML5 onload() (now triggered via native canplaythrough event) may fire early, followed by numerous HTML5 progress requests during playback as the audio object requests and buffers more audio ranges (eg., 0-10 seconds), eventually matching the total sound duration. -

          -

          - Bytes loaded / total are not available, so bytesLoaded instead reflects a fraction of "duration loaded", between 0 and 1 as data is buffered in. Previously, whileloading events would not fire once onload had fired under HTML5. -

          -
        • - -
        • -

          - New (undocumented, for now) buffered array on SMSound objects; list of objects following the pattern SMSound.buffered = [{ start: 0, end: 706 }] representing loaded time ranges (somewhat similar to HTML5 TimeRanges spec, but using static properties instead of method calls with an index parameter.) Array will initially be empty, zero-length. This can be looped through to show overlays of "loaded" time fragments on progress bars, for example.

          -

          SMSound buffered is updated during whileloading() calls, where values are provided by the browser. For flash, will always be one item with { start: 0, end: SMSound.duration } assigned. Also stopped sending 1/1 values to whileplaying() at onload(), since HTML5 can fire onload() (via canplaythrough) very early followed by many progress (whileloading()) events. -

          -

          - Support note: Not all browsers (eg., Safari 5.1.7) appear to provide buffer / TimeRanges data for HTML5 audio objects. At time of writing (06/2012), Firefox, Chrome Canary, IE 9 and Opera provide TimeRanges alongside progress events. -

          -
        • - -
        • -

          - Upgraded demos to use to soundManager.setup({...}) for most configuration cases (vs. setting soundManager.url, soundManager.defaultOptions.autoLoad directly etc.) -

          -
        • - -
        • -

          - Warn if soundManager.setup() called with url or flashVersion, and init has already fired (ie., flash options already set + movie already loaded) where changes will not take effect until soundManager.reboot(). -

          - -
        • - -
        • -

          - Assign top-level soundManager properties (eg. soundManager.url) from soundManager.setupOptions at DOMReady time; this allows legacy soundManager.url = ... assignment to work, and helps to ensure legacy-style, directly-assigned top-level property values get written back to soundManager.setupOptions. -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20120527 - Fix for ontimeout() regression. GWT/JSNI compatibility, slow connection and Safari "background tab" SWF load handling improvements (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Fix for ontimeout() regression seen when using lazy-loading / SM2_DEFER introduced with V2.97a.20120513; bug introduced when making edits to pass newer jslint rules regarding return within if...else blocks. -

          -
        • - -
        • -

          - Replaced instanceof Function with "safer" typeof x === 'function' for onready(), ontimeout() and related callback argument checks as GWT + JSNI was passing arguments that failed the instanceof check. (Related bug report.) -

          -
        • - -
        • -

          - Corrected another small regression for the ontimeout() -> onready() "recovery" edge case, ensuring "ready" does not fire after a timeout when init was unsuccessful. -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - - -
        • -

          - Improved handling for special Safari page load case: When a new tab is opened that does not have focus, the Flash SWF does not load/init until the tab is brought to the foreground. SM2 now recognizes this special case and waits until window.onfocus() before attempting to do the JS/Flash part of init. Previously, it would fail with a timeout. -

          -

          - Code written to originally handle Safari 3.1, which did not support document.hasFocus(), was modified and updated for this purpose. The Safari 3.1 logic previously deferred SM2's start-up in a similar fashion. (The old Safari 3.1 mousemove() focus-detection hack has been removed as Safari 4 has been out since mid-2009, and Safari 5 since mid-2010.) -

          - -
        • - -
        • -

          - SM2 init process will now delay and retry if no Flash response, and SWF has loaded > 0 and < 100%. Timeout will now happen only after delay and when SWF has loaded 100%. Should help prevent first-visit (non-cached) failure on very slow or laggy connections. -

          - -
        • - -
        • -

          - Added note about potential Firefox regression: Offline JS/Flash start-up (viewing HTML pages via file:// and/or c:/ and so forth), possibly not working as of Firefox 9 and newer (at time of writing, also up to and including Firefox 12), even despite special security whitelisting under Flash Player "trusted locations" preferences / control panel. -

          -

          - After successful Flash -> JS call, SM2's "return" JS -> Flash call fails with unusual JS/Flash exception, "Error in ActionScript" error with no further detail. Offline viewing still works in other browsers. -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20120513 - Fixes for Android 2.3 playback, onPosition() in HTML5, Flash 9 double-play edge case. Minor new Flash 9-specific features (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Android 2.3 playback fix (some sounds started only after 2+ play attempts due to Android not liking load() immediately followed by play()?) -

          -
        • - -
        • -

          - onPosition() fix for HTML5 playback, items were mistakenly being removed. -

          -
        • - -
        • -

          - Fix RTMP stream duration reporting via onmetadata() (wrong value was being returned, previously.) -

          -
        • - -
        • -

          - Fix for Flash 9 double-play edge case found with pause() + setPosition() calls. -

          -
        • - - -
        • -

          - JSLINT validation per 04-15-2012 edition rules, mostly removal of multiple return statements within if ... else blocks and inverted loop tricks. -

          -
        • - -
        - -
      • - -
      • - -

        API updates

        - -
          - -
        • -

          - Enabled waveform/eq/spectrum data features for MovieStar (H.264/NetStream content.) -

          -
        • - -
        • -

          - Added oncaptiondata() callback for caption data from Flash 9 (NetStream/RTMP-only, similar to onmetadata(). Contributor: GitHub user karma.) -

          -
        • - -
        • -

          - Added SMSound.onplayerror(), presently for Flash 9 (non-MovieStar/NetStream) which can detect lack of available sound hardware or 32-channel ceiling as reasons for playback failure. -

          -
        • - -
        • -

          - Added oncaptiondata() callback for caption data from Flash 9 (NetStream/RTMP-only, similar to onmetadata().) -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - Scaling added to 360 UI (via GitHub user tomasdev) -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      V2.97a.20120318 - Minor updates. from / to and onplay() bug fixes, canPlayMIME() and canPlayLink() Flash-specific corrections. (Download archived version)

      - -
        - -
      • - -

        Bug fixes

        - -
          - -
        • -

          - Fix silly undefined"soundID" debug output message shown at SMSound.onload (now says SMSound._onload() as previously.) -

          -
        • - -
        • -

          - soundManager.sounds = {} instead of [] on reboot (per bug report) -

          -
        • - -
        • -

          - Fix logic for calling onplay(), was always non-truthy. D'oh! -

          -
        • - -
        • -

          - Add missing typeof to fix html5 MIME check for playability tests -

          -
        • - -
        • -

          - Don't apply width:auto to SWF (invalid per HTML5, allegedly: Related patch.) -

          -
        • - -
        • -

          - Make soundManager.canPlayMIME() and canPlayLink() check flash support before returning (check after ontimeout() was returning truthy when flash required under Firefox, for example, for 'audio/mp3') -

          -
        • - -
        • -

          - Fix play() "from" + "to" sound sprite playback issue: In some cases, previously-fired "to" events were re-firing due to not being removed, because an equality check was comparing against a potential "to" value of a string rather than a number. (eg., 0-700 followed by 1500-2000; playback would stop in second case, saying 700 had been reached. (Related bug report.) -

          -
        • - -
        • -

          - Re-appeased the jslint gods, removed unused variables and two-statement reverse loop (for i=x; i--;) { } trickery. -

          -
        • - -
        - -
      • - -
      • - -

        Miscellaneous

        - -
          - -
        • -

          - The SoundManager project turned 10 years old, having originally launched in late 2001. Thanks for using it! -

          -
        • - -
        - -
      • - -
      - -
    • - - - -
    • - -

      Older Release Info

      -

      For release and changelog history going back to 2010, see the archive page.

      - -
    • - -
    - - -
    - - -
    - - -
    - - -
    - - - -
    - - - -
    - - - -
    - -
    - - -
    - - -
    - - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html deleted file mode 100755 index df95c37e..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS.html +++ /dev/null @@ -1,938 +0,0 @@ - - - - - SoundManager2_AS.as - - - - - - -
    -
    - - - -
      - -
    • -
      -

      SoundManager2_AS.as

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      /**
      - * SoundManager 2: Javascript Sound for the Web
      - * ----------------------------------------------
      - * http://schillmania.com/projects/soundmanager2/
      - *
      - * Copyright (c) 2007, Scott Schiller. All rights reserved.
      - * Code licensed under the BSD License:
      - * http://www.schillmania.com/projects/soundmanager2/license.txt
      - *
      - * Flash 8 / ActionScript 2 version
      - *
      - * Compiling AS to Flash 8 SWF using MTASC (free compiler - http://www.mtasc.org/):
      - * mtasc -swf soundmanager2.swf -main -header 16:16:30 SoundManager2.as -version 8
      - *
      - * ActionScript Sound class reference (Macromedia), documentation download:
      - * http://livedocs.macromedia.com/flash/8/
      - * Previously-live URL:
      - * http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002668.html
      - *
      - * *** NOTE ON LOCAL FILE SYSTEM ACCESS ***
      - *
      - * Flash security allows local OR network access, but not both
      - * unless explicitly whitelisted/allowed by the flash player's
      - * security settings.
      - *
      - * To enable in-flash messaging for troubleshooting, pass debug=1 in FlashVars (within object/embed code)
      - * SM2 will do this by default when soundManager.debugFlash = true.
      - *
      - */
      -
      -import flash.external.ExternalInterface; // woo
      -
      -class SoundManager2 {
      -
      -  static var app: SoundManager2;
      -
      -  function SoundManager2() {
      -
      -    var version = "V2.97a.20131201";
      -    var version_as = "(AS2/Flash 8)";
      -
      -    /**
      -     *  Cross-domain security options
      -     *  HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work.
      -     *  // allow_xdomain_scripting = true;
      -     *  // xdomain = "foo.com";
      -     *  For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*");
      -     *  When loading from HTTPS, use System.security.allowInsecureDomain();
      -     *  See "allowDomain (security.allowDomain method)" in Flash 8/AS2 liveDocs documentation (AS2 reference -> classes -> security)
      -     *  download from http://livedocs.macromedia.com/flash/8/
      -     *  Related AS3 documentation: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain%28%29
      -     */
      -
      -    var allow_xdomain_scripting = false;
      -    var xdomain = "*";
      -
      -    if (allow_xdomain_scripting && xdomain) {
      -      System.security.allowDomain(xdomain);
      -      version_as += ' - cross-domain enabled';
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      externalInterface references (for Javascript callbacks)

      - -
      - -
          var baseJSController = "soundManager";
      -    var baseJSObject = baseJSController + ".sounds";
      - -
    • - - -
    • -
      - -
      - -
      -

      internal objects

      - -
      - -
          var sounds = []; // indexed string array
      -    var soundObjects = []; // associative Sound() object array
      -    var timer = null;
      -    var pollingEnabled = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call
      -    var debugEnabled = true; // Flash debug output enabled by default, disabled by JS call
      -    var flashDebugEnabled = false; // debug output to flash movie, off by default
      -    var didSandboxMessage = false;
      -    var caughtFatal = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      for flash text output, debugging etc.

      - -
      - -
          var _messages = [];
      -    var _messageObj = null;
      -    flashDebugEnabled = (_root.debug == 1);
      - -
    • - - -
    • -
      - -
      - -
      -

      display stuffs

      - -
      - -
          Stage.scaleMode = 'noScale';
      -    Stage.align = 'TL';
      - -
    • - - -
    • -
      - -
      - -
      -

      context menu item with version info

      - -
      - -
      -    var doNothing = function() {}
      -
      -    var sm2Menu:ContextMenu = new ContextMenu();
      -    var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as, doNothing);
      -    sm2MenuItem.enabled = false;
      -    sm2Menu.customItems.push(sm2MenuItem);
      -    _root.menu = sm2Menu;
      -
      -    var writeDebug = function(s, logLevel) {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (!debugEnabled) return false;
      -      ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, (logLevel || 0));
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
          }
      -
      -    var flashDebug = function(messageText) {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            _messages.push(messageText);
      -      if (!flashDebugEnabled) {
      -        return false;
      -      }
      -      var sans = new TextFormat();
      -      sans.size = 12;
      -      sans.font = "Arial";
      - -
    • - - -
    • -
      - -
      - -
      -

      320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.)

      - -
      - -
            var w = Stage.width?Stage.width:320;
      -      var h = Stage.height?Stage.height:240;
      -      if (!_messageObj) {
      -        _messageObj = _root.createTextField("_messageObj", 0, 0, 0, w, h);
      -        _messageObj.x = 0;
      -        _messageObj.y = 0;
      -        _messageObj.multiline = true;
      -        _messageObj.html = true;
      -        _messageObj.wordWrap = true;
      -        _messageObj.align = 'left';
      -        _messageObj.autoSize = false;
      -      }
      -      _messageObj.htmlText = _messages.join('\n');
      -      _messageObj.setTextFormat(sans);
      -      _messageObj.width = w;
      -      _messageObj.height = h;
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
          }
      -
      -    var _externalInterfaceTest = function(isFirstCall) {
      -      var sandboxType = System.security['sandboxType'];
      -      try {
      -        if (isFirstCall) {
      -          flashDebug('Testing Flash -&gt; JS...')
      -          if (!didSandboxMessage && sandboxType != 'remote' && sandboxType != 'localTrusted') {
      -            didSandboxMessage = true;
      -            flashDebug('<br><b>Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".<br>Additional security permissions need to be granted.<br>See <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html">flash security settings panel</a> for non-HTTP, eg. file:// use.</b><br>http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html<br><br>You may also be able to right-click this movie and choose from the menu: <br>"Global Settings" -> "Advanced" tab -> "Trusted Location Settings"<br>');
      -          }
      -          ExternalInterface.call(baseJSController + "._externalInterfaceOK", version);
      -          if (!didSandboxMessage) {
      -            flashDebug('Flash -&gt; JS OK');
      -            flashDebug('Waiting for JS -&gt; Flash...');
      -          }
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('SM2 SWF ' + version + ' ' + version_as, 1);

      - -
      - -
                ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType);
      -          flashDebug('JS -&gt; Flash OK');
      -        }
      -      } catch(e) {
      -        flashDebug(e.toString());
      -        if (!caughtFatal) {
      -          caughtFatal = true;
      -        }
      -        return false;
      -      }
      -      return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.)
      -    }
      -
      -    var _disableDebug = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      prevent future debug calls from Flash going to client (maybe improve performance)

      - -
      - -
            writeDebug('_disableDebug()');
      -      debugEnabled = false;
      -    }
      -
      -    var checkProgress = function() {
      -      var bL = 0;
      -      var bT = 0;
      -      var nD = 0;
      -      var nP = 0;
      -      var oSound = null;
      -      for (var i = 0, j = sounds.length; i < j; i++) {
      -        oSound = soundObjects[sounds[i]];
      -        bL = oSound.getBytesLoaded();
      -        bT = oSound.getBytesTotal();
      -        nD = oSound.duration || 0; // can sometimes be null with short MP3s? Wack.
      -        nP = oSound.position;
      -        if (bL && bT && bL != oSound.lastValues.bytes) {
      -          oSound.lastValues.bytes = bL;
      -          ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", bL, bT, nD);
      -        }
      -        if (typeof nP != 'undefined' && nP != oSound.lastValues.position) {
      -          oSound.lastValues.position = nP;
      -          ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileplaying", nP);
      - -
    • - - -
    • -
      - -
      - -
      -

      if position changed, check for near-end

      - -
      - -
              }
      -      }
      -    }
      -
      -    var onLoad = function(bSuccess) {
      -      checkProgress(); // ensure progress stats are up-to-date
      - -
    • - - -
    • -
      - -
      - -
      -

      force duration update (doesn't seem to be always accurate)

      - -
      - -
            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.getBytesLoaded(), this.getBytesTotal(), this.duration);
      -      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", this.duration > 0 ? 1 : 0); // bSuccess doesn't always seem to work, so check MP3 duration instead.
      -    }
      -
      -    var onID3 = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      --- NOTE: BUGGY? ---

      -

      TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) -ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) -iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. -May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33

      - -
      - -
            var id3Data = [];
      -      var id3Props = [];
      -      for (var prop in this.id3) {
      -        id3Props.push(prop);
      -        id3Data.push(this.id3[prop]);
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('id3['+prop+']: '+this.id3[prop]);

      - -
      - -
            }
      -      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onid3", id3Props, id3Data);
      - -
    • - - -
    • -
      - -
      - -
      -

      unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) -Therefore if ID3V2 data is received, ID3V1 is ignored.

      - -
      - -
            soundObjects[this.sID].onID3 = null;
      -    }
      -
      -    var registerOnComplete = function(sID) {
      -      soundObjects[sID].onSoundComplete = function() {
      -        checkProgress();
      -        ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      -      }
      -    }
      -
      -    var _setPosition = function(sID, nSecOffset, isPaused, _allowMultiShot) {
      - -
    • - - -
    • -
      - -
      - -
      -

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical.

      - -
      - -
            var s = soundObjects[sID];
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_setPosition()');

      - -
      - -
            s.lastValues.position = s.position;
      -      if (s.lastValues.loops > 1 && nSecOffset != 0) {
      -        writeDebug('Warning: Looping functionality being disabled due to Flash limitation.', 240);
      -        s.lastValues.loops = 1;
      -      }
      -      s.start(nSecOffset, s.lastValues.nLoops || 1); // start playing at new position
      -      if (isPaused) {
      -        s.stop();
      -      }
      -    }
      -
      -    var _load = function(sID, sURL, bStream, bAutoPlay, bCheckPolicyFile) {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_load(): '+sID+', '+sURL+', '+bStream+', '+bAutoPlay+', '+bCheckPolicyFile);

      - -
      - -
            if (typeof bAutoPlay == 'undefined') {
      -        bAutoPlay = false;
      -      }
      -      if (typeof bStream == 'undefined') {
      -        bStream = true;
      -      }
      -      if (typeof bCheckPolicyFile == 'undefined') {
      -        bCheckPolicyFile = false;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('bStream: '+bStream); -writeDebug('bAutoPlay: '+bAutoPlay); -checkProgress();

      - -
      - -
            var s = soundObjects[sID];
      -      s.onID3 = onID3;
      -      s.onLoad = onLoad;
      -      s.loaded = true;
      -      s.checkPolicyFile = bCheckPolicyFile;
      -      s.loadSound(sURL, bStream);
      -      if (bAutoPlay != true) {
      -        s.stop(); // prevent default auto-play behaviour
      -      } else {
      -        writeDebug('auto-play allowed');
      -      }
      -      registerOnComplete(sID);
      -    }
      -
      -    var _unload = function(sID, sURL) {
      - -
    • - - -
    • -
      - -
      - -
      -

      effectively "stop" loading by loading a tiny MP3

      - -
      - -
            var s = soundObjects[sID];
      -      s.onID3 = null;
      -      s.onLoad = null;
      -      s.loaded = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      ensure position is reset, if unload fails

      - -
      - -
            s.start(0,1);
      -      s.stop();
      -      s.loadSound(sURL, true);
      -      s.stop(); // prevent auto-play
      -    }
      -
      -    var _createSound = function(sID, loops, checkPolicyFile) {
      -      var s = new Sound();
      -      if (!soundObjects[sID]) {
      -        sounds.push(sID);
      -      }
      -      soundObjects[sID] = s;
      -      s.setVolume(100);
      -      s.sID = sID;
      -      s.paused = false;
      -      s.loaded = false;
      -      s.checkPolicyFile = checkPolicyFile;
      -      s.lastValues = {
      -        bytes: 0,
      -        position: 0,
      -        nLoops: loops||1
      -      };
      -    }
      -
      -    var _destroySound = function(sID) {
      - -
    • - - -
    • -
      - -
      - -
      -

      for the power of garbage collection! .. er, Greyskull!

      - -
      - -
            var s = (soundObjects[sID] || null);
      -      if (!s) {
      -        return false;
      -      }
      -      for (var i = 0; i < sounds.length; i++) {
      -        if (sounds[i] == sID) {
      -          sounds.splice(i, 1);
      -          break;
      -        }
      -      }
      -      s = null;
      -      delete soundObjects[sID];
      -    }
      -
      -    var _stop = function(sID, bStopAll) {
      - -
    • - - -
    • -
      - -
      - -
      -

      stop this particular instance (or "all", based on parameter)

      - -
      - -
            if (bStopAll) {
      -        _root.stop();
      -      } else {
      -        soundObjects[sID].stop();
      -        soundObjects[sID].paused = false;
      -      }
      -    }
      -
      -    var _start = function(sID, nLoops, nMsecOffset, _allowMultiShot) {
      - -
    • - - -
    • -
      - -
      - -
      -

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. -writeDebug('_start: ' + sID + ', loops: ' + nLoops + ', nMsecOffset: ' + nMsecOffset);

      - -
      - -
            registerOnComplete();
      -      var s = soundObjects[sID];
      -      s.lastValues.paused = false; // reset pause if applicable
      -      s.lastValues.nLoops = (nLoops || 1);
      -      s.start(nMsecOffset, nLoops);
      -      return true;
      -    }
      -
      -    var _pause = function(sID, _allowMultiShot) {
      - -
    • - - -
    • -
      - -
      - -
      -

      note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. -writeDebug('_pause()');

      - -
      - -
            var s = soundObjects[sID];
      -      if (!s.paused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      reference current position, stop sound

      - -
      - -
              s.paused = true;
      -        s.lastValues.position = s.position;
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_pause(): position: '+s.lastValues.position);

      - -
      - -
              s.stop();
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      resume playing from last position -writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.nLoops+' times');

      - -
      - -
              s.paused = false;
      -        s.start(s.lastValues.position / 1000, s.lastValues.nLoops);
      -      }
      -    }
      -
      -    var _setPan = function(sID, nPan) {
      -      soundObjects[sID].setPan(nPan);
      -    }
      -
      -    var _setVolume = function(sID, nVol) {
      -      soundObjects[sID].setVolume(nVol);
      -    }
      -
      -    var _setPolling = function(bPolling, timerInterval) {
      -      if (typeof timerInterval === 'undefined') {
      -        timerInterval = 50;
      -      }
      -      pollingEnabled = bPolling;
      -      if (timer == null && pollingEnabled) {
      -        flashDebug('Enabling polling, ' + timerInterval + ' ms interval');
      -        timer = setInterval(checkProgress, timerInterval);
      -      } else if (timer && !pollingEnabled) {
      -        flashDebug('Disabling polling');
      -        clearInterval(timer);
      -        timer = null;
      -      }
      -    }
      -
      -    var _init = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      OK now stuff should be available

      - -
      - -
            try {
      -        flashDebug('Adding ExternalInterface callbacks...');
      -        ExternalInterface.addCallback('_load', this, _load);
      -        ExternalInterface.addCallback('_unload', this, _unload);
      -        ExternalInterface.addCallback('_stop', this, _stop);
      -        ExternalInterface.addCallback('_start', this, _start);
      -        ExternalInterface.addCallback('_pause', this, _pause);
      -        ExternalInterface.addCallback('_setPosition', this, _setPosition);
      -        ExternalInterface.addCallback('_setPan', this, _setPan);
      -        ExternalInterface.addCallback('_setVolume', this, _setVolume);
      -        ExternalInterface.addCallback('_setPolling', this, _setPolling);
      -        ExternalInterface.addCallback('_externalInterfaceTest', this, _externalInterfaceTest);
      -        ExternalInterface.addCallback('_disableDebug', this, _disableDebug);
      -        ExternalInterface.addCallback('_createSound', this, _createSound);
      -        ExternalInterface.addCallback('_destroySound', this, _destroySound);
      -      } catch(e) {
      -        flashDebug('Fatal: ExternalInterface error: ' + e.toString());
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      try to talk to JS, do init etc.

      - -
      - -
            _externalInterfaceTest(true);
      - -
    • - - -
    • -
      - -
      - -
      -

      flashDebug('Init OK');

      - -
      - -
          }
      -
      -    flashDebug('SM2 SWF ' + version + ' ' + version_as);
      -
      -    if (ExternalInterface.available) {
      -      flashDebug('ExternalInterface available');
      -      _init();
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      d'oh! - may be from a corrupt install, ancient (pre-Netscape 6?) browser etc.

      - -
      - -
            flashDebug('Fatal: ExternalInterface (Flash &lt;-&gt; JS) not available');
      -    }
      -
      -
      -  } // SoundManager2()
      - -
    • - - -
    • -
      - -
      - -
      -

      entry point

      - -
      - -
        static function main(mc) {
      -    app = new SoundManager2();
      -  }
      -
      -}
      - -
    • - -
    -
    - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html deleted file mode 100755 index a41e3fe8..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_AS3.html +++ /dev/null @@ -1,2026 +0,0 @@ - - - - - SoundManager2_AS3.as - - - - - - -
    -
    - - - -
      - -
    • -
      -

      SoundManager2_AS3.as

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      /**
      - * SoundManager 2: Javascript Sound for the Web
      - * ----------------------------------------------
      - * http://schillmania.com/projects/soundmanager2/
      - *
      - * Copyright (c) 2007, Scott Schiller. All rights reserved.
      - * Code licensed under the BSD License:
      - * http://www.schillmania.com/projects/soundmanager2/license.txt
      - *
      - * Flash 9 / ActionScript 3 version
      - */
      -
      -package {
      -
      -  import flash.display.Sprite;
      -  import flash.events.Event;
      -  import flash.events.IOErrorEvent;
      -  import flash.events.MouseEvent;
      -  import flash.events.SecurityErrorEvent;
      -  import flash.events.AsyncErrorEvent;
      -  import flash.events.NetStatusEvent;
      -  import flash.events.TimerEvent;
      -  import flash.external.ExternalInterface; // woo
      -  import flash.media.Sound;
      -  import flash.media.SoundChannel;
      -  import flash.media.SoundMixer;
      -  import flash.net.URLLoader;
      -  import flash.net.URLRequest;
      -  import flash.system.Security;
      -  import flash.system.System;
      -  import flash.text.TextField;
      -  import flash.text.TextFormat;
      -  import flash.text.TextFieldAutoSize;
      -  import flash.ui.ContextMenu;
      -  import flash.ui.ContextMenuItem;
      -  import flash.utils.setInterval;
      -  import flash.utils.clearInterval;
      -  import flash.utils.Dictionary;
      -  import flash.utils.Timer;
      -
      -  public class SoundManager2_AS3 extends Sprite {
      -
      -    public var version:String = "V2.97a.20131201";
      -    public var version_as:String = "(AS3/Flash 9)";
      -
      -    /**
      -     *  Cross-domain security options
      -     *  HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work.
      -     *  // allow_xdomain_scripting = true;
      -     *  // xdomain = "foo.com";
      -     *  For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*");
      -     *  When loading from HTTPS, use System.security.allowInsecureDomain();
      -     *  See http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain()
      -     */
      -    public var allow_xdomain_scripting:Boolean = false;
      -    public var xdomain:String = "*";
      - -
    • - - -
    • -
      - -
      - -
      -

      externalInterface references (for Javascript callbacks)

      - -
      - -
          public var baseJSController:String = "soundManager";
      -    public var baseJSObject:String = baseJSController + ".sounds";
      - -
    • - - -
    • -
      - -
      - -
      -

      internal objects

      - -
      - -
          public var sounds:Array = []; // indexed string array
      -    public var soundObjects: Dictionary = new Dictionary(); // associative Sound() object Dictionary type
      -    public var timer: Timer = null;
      -    public var pollingEnabled: Boolean = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call
      -    public var debugEnabled: Boolean = true; // Flash debug output enabled by default, disabled by JS call
      -    public var flashDebugEnabled: Boolean = false; // Flash internal debug output (write to visible SWF in browser)
      -    public var loaded: Boolean = false;
      -    public var currentObject: SoundManager2_SMSound_AS3 = null;
      -    public var paramList:Object = null;
      -    public var messages:Array = [];
      -    public var textField: TextField = null;
      -    public var textStyle: TextFormat = new TextFormat();
      -    public var didSandboxMessage: Boolean = false;
      -    public var caughtFatal: Boolean = false;
      -
      -    public function SoundManager2_AS3() {
      -
      -      if (allow_xdomain_scripting && xdomain) {
      -        Security.allowDomain(xdomain);
      -        version_as += ' - cross-domain enabled';
      -      }
      -
      -      this.paramList = this.root.loaderInfo.parameters;
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (this.paramList['debug'] == 1) {
      -        this.flashDebugEnabled = true;
      -      }
      -
      -      if (this.flashDebugEnabled) {
      -        var canvas: Sprite = new Sprite();
      -        canvas.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
      -        addChild(canvas);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      flashDebug('SM2 SWF ' + version + ' ' + version_as);
      - -
    • - - -
    • -
      - -
      - -
      -

      context menu item with version info

      - -
      - -
      -      var sm2Menu:ContextMenu = new ContextMenu();
      -      var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as);
      -      sm2MenuItem.enabled = false;
      -      sm2Menu.customItems.push(sm2MenuItem);
      -      contextMenu = sm2Menu;
      -
      -      if (ExternalInterface.available) {
      -        flashDebug('ExternalInterface available');
      -        try {
      -          flashDebug('Adding ExternalInterface callbacks...');
      -          ExternalInterface.addCallback('_load', _load);
      -          ExternalInterface.addCallback('_unload', _unload);
      -          ExternalInterface.addCallback('_stop', _stop);
      -          ExternalInterface.addCallback('_start', _start);
      -          ExternalInterface.addCallback('_pause', _pause);
      -          ExternalInterface.addCallback('_setPosition', _setPosition);
      -          ExternalInterface.addCallback('_setPan', _setPan);
      -          ExternalInterface.addCallback('_setVolume', _setVolume);
      -          ExternalInterface.addCallback('_setPolling', _setPolling);
      -          ExternalInterface.addCallback('_externalInterfaceTest', _externalInterfaceTest);
      -          ExternalInterface.addCallback('_disableDebug', _disableDebug);
      -          ExternalInterface.addCallback('_getMemoryUse', _getMemoryUse);
      -          ExternalInterface.addCallback('_createSound', _createSound);
      -          ExternalInterface.addCallback('_destroySound', _destroySound);
      -          ExternalInterface.addCallback('_setAutoPlay', _setAutoPlay);
      -        } catch(e: Error) {
      -          flashDebug('Fatal: ExternalInterface error: ' + e.toString());
      -        }
      -      } else {
      -        flashDebug('Fatal: ExternalInterface (Flash &lt;-&gt; JS) not available');
      -      };
      - -
    • - - -
    • -
      - -
      - -
      -

      call after delay, to be safe (ensure callbacks are registered by the time JS is called below)

      - -
      - -
            var timer: Timer = new Timer(20, 0);
      -      timer.addEventListener(TimerEvent.TIMER, function() : void {
      -        timer.reset();
      -        _externalInterfaceTest(true);
      - -
    • - - -
    • -
      - -
      - -
      -

      timer.reset(); -flashDebug('Init OK');

      - -
      - -
            });
      -      timer.start();
      - -
    • - - -
    • -
      - -
      - -
      -

      delayed, see above -_externalInterfaceTest(true);

      - -
      - -
          } // SoundManager2()
      -
      -    public function flashDebug (txt:String) : void {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            messages.push(txt);
      -      if (this.flashDebugEnabled) {
      -        var didCreate: Boolean = false;
      -        textStyle.font = 'Arial';
      -        textStyle.size = 12;
      - -
    • - - -
    • -
      - -
      - -
      -

      320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.)

      - -
      - -
             var w:Number = this.stage.width?this.stage.width:320;
      -       var h:Number = this.stage.height?this.stage.height:240;
      -        if (textField == null) {
      -          didCreate = true;
      -          textField = new TextField();
      -          textField.autoSize = TextFieldAutoSize.LEFT;
      -          textField.x = 0;
      -          textField.y = 0;
      -          textField.multiline = true;
      -          textField.textColor = 0;
      -          textField.wordWrap = true;
      -        }
      -        textField.htmlText = messages.join('\n');
      -        textField.setTextFormat(textStyle);
      -        textField.width = w;
      -        textField.height = h;
      -        if (didCreate) {
      -          this.addChild(textField);
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
          }
      -
      -    public function _setAutoPlay(sID:String, autoPlay:Boolean) : void {
      -      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      if (s) {
      -        s.setAutoPlay(autoPlay);
      -      }
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      methods

      - -
      - -
      -    public function writeDebug (s:String, logLevel:Number = 0) : Boolean {
      -      if (!debugEnabled) {
      -        return false;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, null, logLevel);
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
            return true;
      -    }
      -
      -    public function _externalInterfaceTest(isFirstCall: Boolean) : Boolean {
      -      var sandboxType:String = flash.system.Security['sandboxType'];
      -      if (!didSandboxMessage && sandboxType != 'localTrusted' && sandboxType != 'remote') {
      -        didSandboxMessage = true;
      -        flashDebug('<br><b>Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".<br>Additional security permissions need to be granted.<br>See <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html">flash security settings panel</a> for non-HTTP, eg., file:// use.</b><br>http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html<br><br>You may also be able to right-click this movie and choose from the menu: <br>"Global Settings" -> "Advanced" tab -> "Trusted Location Settings"<br>');
      -      }
      -      try {
      -        if (isFirstCall == true) {
      -          flashDebug('Testing Flash -&gt; JS...');
      -          ExternalInterface.call(baseJSController + "._externalInterfaceOK", version);
      -          flashDebug('Flash -&gt; JS OK');
      -          flashDebug('Waiting for JS -&gt; Flash...');
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('SM2 SWF ' + version + ' ' + version_as, 1);

      - -
      - -
                ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType);
      -          flashDebug('JS -&gt; Flash OK');
      -        }
      -      } catch(e: Error) {
      -        flashDebug('Fatal: Flash &lt;-&gt; JS error: ' + e.toString());
      -        writeDebug('_externalInterfaceTest: Error: ' + e.toString(), 2);
      -        if (!caughtFatal) {
      -          caughtFatal = true;
      -        }
      -        return false;
      -      }
      -      return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.)
      -    }
      -
      -    public function _disableDebug() : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      prevent future debug calls from Flash going to client (maybe improve performance)

      - -
      - -
            writeDebug('_disableDebug()');
      -      debugEnabled = false;
      -    }
      -
      -    public function checkLoadProgress(e: Event) : void {
      -      try {
      -        var oSound:Object = e.target;
      -        var bL: int = oSound.bytesLoaded;
      -        var bT: int = oSound.bytesTotal;
      -        var nD: int = oSound.length || oSound.duration || 0;
      -        var sMethod:String = baseJSObject + "['" + oSound.sID + "']._whileloading";
      -        ExternalInterface.call(sMethod, bL, bT, nD);
      -        if (bL && bT && bL != oSound.lastValues.bytes) {
      -          oSound.lastValues.bytes = bL;
      -          ExternalInterface.call(sMethod, bL, bT, nD);
      -        }
      -      } catch(e: Error) {
      -        writeDebug('checkLoadProgress(): ' + e.toString());
      -      }
      -    }
      -
      -    public function checkSoundProgress(oSound:SoundManager2_SMSound_AS3, forceCheck:Boolean = false, forceEndCheck:Boolean = false) : void {
      -      var bL: int = 0;
      -      var bT: int = 0;
      -      var nD: int = 0;
      -      var nP: int = 0;
      -      var bufferLength: int = 0;
      -      var lP:Number = 0;
      -      var rP:Number = 0;
      -      var isBuffering:Object = null;
      -      var oSoundChannel: flash.media.SoundChannel = null;
      -      var sMethod:String = null;
      -      var newPeakData: Boolean = false;
      -      var newWaveformData: Boolean = false;
      -      var newEQData: Boolean = false;
      -      var areSoundsInaccessible: Boolean = SoundMixer.areSoundsInaccessible();
      -      var isPlaying: Boolean = true; // special case for NetStream when ending
      -      var hasNew:Boolean = false;
      -      var hasNewLoaded:Boolean = false;
      -
      -      if (!oSound || !oSound.useEvents || oSound.failed || !oSound.connected) {
      - -
    • - - -
    • -
      - -
      - -
      -

      edge cases for ignoring: if sounds are destructed within event handlers while checkProgress() is running, may be null

      - -
      - -
              return;
      -      }
      -
      -      sMethod = baseJSObject + "['" + oSound.sID + "']._whileloading";
      -
      -      if (oSound.useNetstream) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Don't do anything if there is no NetStream object yet

      - -
      - -
              if (!oSound.ns) {
      -          return;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      stream

      - -
      - -
              bufferLength = oSound.ns.bufferLength;
      -        bL = oSound.ns.bytesLoaded;
      -        bT = oSound.ns.bytesTotal;
      -        nD = int(oSound.duration || 0); // can sometimes be null with short MP3s? Wack.
      -        nP = oSound.ns.time * 1000;
      -
      -        if (oSound.paused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: paused netStreams don't update if setPosition() is called while they are paused. -instead, return lastValues.position which should reflect setPosition() call. -writeDebug('paused case, setting nP of '+nP+' to -1'); -writeDebug('lastValues: '+oSound.lastValues.position);

      - -
      - -
                nP = oSound.lastValues.position;
      -        }
      -
      -        if (nP >= 0 && nP != oSound.lastValues.position) {
      -          oSound.lastValues.position = nP;
      -          hasNew = true;
      -        }
      -        if (nD > oSound.lastValues.duration) {
      -          oSound.lastValues.duration = nD;
      -          hasNew = true;
      -        }
      -        if (bL > oSound.lastValues.bytesLoaded) {
      -          oSound.lastValues.bytesLoaded = bL;
      -          hasNew = true;
      -        }
      -        if (bT > oSound.lastValues.bytes) {
      -          oSound.lastValues.bytes = bT;
      -          hasNew = true;
      -        }
      -        if (bufferLength != oSound.lastValues.bufferLength) {
      -          oSound.lastValues.bufferLength = bufferLength;
      -          hasNew = true;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      Don't set loaded for streams because bytesLoaded and bytesTotal are always 0 -writeDebug('ns: time/duration, bytesloaded/total: '+nP+'/'+nD+', '+bL+'/'+bT);

      - -
      - -
              if (oSound.loaded != true && nD > 0 && bL == bT && bL != 0 && bT != 0) {
      - -
    • - - -
    • -
      - -
      - -
      -

      non-MP3 has loaded

      - -
      - -
                oSound.loaded = true;
      -          try {
      -            ExternalInterface.call(sMethod, bL, bT, nD, bufferLength);
      -            ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", oSound.duration > 0 ? 1 : 0);
      -          } catch(e: Error) {
      -            writeDebug('_whileLoading/_onload error: ' + e.toString(), 2);
      -          }
      -        } else if (oSound.loaded != true && hasNew) {
      -          ExternalInterface.call(sMethod, bL, bT, nD, bufferLength);
      -        }
      -
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      MP3 sound

      - -
      - -
              oSoundChannel = oSound.soundChannel;
      -        bL = oSound.bytesLoaded;
      -        bT = oSound.bytesTotal;
      -        nD = int(oSound.length || 0); // can sometimes be null with short MP3s? Wack.
      -        isBuffering = oSound.isBuffering;
      -
      -        if (oSoundChannel) {
      -          nP = (oSoundChannel.position || 0);
      -          if (oSound.lastValues.loops > 1 && nP > oSound.length) {
      - -
    • - - -
    • -
      - -
      - -
      -

      round down to nearest loop

      - -
      - -
                  var playedLoops:Number = Math.floor(nP/oSound.length);
      -            nP = nP - (oSound.length*playedLoops);
      -          }
      -          if (oSound.usePeakData) {
      -            lP = int((oSoundChannel.leftPeak) * 1000) / 1000;
      -            rP = int((oSoundChannel.rightPeak) * 1000) / 1000;
      -          } else {
      -            lP = 0;
      -            rP = 0;
      -          }
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      stopped, not loaded or feature not used

      - -
      - -
                nP = 0;
      -        }
      -
      -        if (forceEndCheck) {
      - -
    • - - -
    • -
      - -
      - -
      -

      sound finish case: Ensure position is at end (sound duration), as flash 9 does not always correctly match the two.

      - -
      - -
                if (nP < nD) {
      -            writeDebug('correcting sound ' + oSound.sID + ' end position ('+nP+') to length: '+ nD, 2);
      -            nP = nD;
      -          }
      -        }
      -
      -        if (nP != oSound.lastValues.position && nP !== 0 && !oSound.didFinish) { // once "completed", sound is locked via didFinish so no more position-type events fire.
      -          oSound.lastValues.position = nP;
      -          hasNew = true;
      -        }
      -
      -        if (nD > oSound.lastValues.duration) { // original sound duration * number of sound loops
      -          oSound.lastValues.duration = nD;
      -          hasNew = true;
      -        }
      -
      -        if (bL > oSound.lastValues.bytesLoaded) {
      -          oSound.lastValues.bytesLoaded = bL;
      -          hasNew = true;
      -        }
      -
      -        if (bT > oSound.lastValues.bytes) {
      -          oSound.lastValues.bytes = bT;
      -          hasNew = true;
      -          hasNewLoaded = true;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      loading progress

      - -
      - -
              if (hasNewLoaded) {
      -          oSound.lastValues.bytes = bL;
      -          ExternalInterface.call(sMethod, bL, bT, nD);
      -        }
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      peak data

      - -
      - -
            if (oSoundChannel && oSound.usePeakData) {
      -        if (lP != oSound.lastValues.leftPeak) {
      -          oSound.lastValues.leftPeak = lP;
      -          newPeakData = true;
      -        }
      -        if (rP != oSound.lastValues.rightPeak) {
      -          oSound.lastValues.rightPeak = rP;
      -          newPeakData = true;
      -        }
      -      }
      -
      -      var newDataError:Boolean = false;
      -      var dataError:String;
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: Netstream may try to fire whileplaying() after finishing. check that stop hasn't fired.

      - -
      - -
            isPlaying = (oSound.didLoad && !oSound.paused && (!oSound.useNetstream || (oSound.useNetstream && oSound.lastNetStatus != "NetStream.Play.Stop"))); // don't update if stream has ended
      - -
    • - - -
    • -
      - -
      - -
      -

      raw waveform + EQ spectrum data

      - -
      - -
            if (isPlaying && (oSoundChannel || oSound.useNetstream)) {
      -
      -        if (oSound.useWaveformData) {
      -          if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) {
      -            try {
      -              oSound.getWaveformData();
      -            } catch(e: Error) {
      -              if (!oSound.handledDataError) {
      -                writeDebug('getWaveformData() (waveform data) '+e.toString());
      -              }
      - -
    • - - -
    • -
      - -
      - -
      -

      oSound.useWaveformData = false;

      - -
      - -
                    newDataError = true;
      -              dataError = e.toString();
      -            }
      -          }
      -        }
      -
      -        if (oSound.useEQData) {
      -          if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) {
      -            try {
      -              oSound.getEQData();
      -            } catch(e: Error) {
      -              if (!oSound.handledDataError) {
      -                writeDebug('computeSpectrum() (EQ data) '+e.toString());
      -              }
      - -
    • - - -
    • -
      - -
      - -
      -

      oSound.useEQData = false;

      - -
      - -
                    newDataError = true;
      -              dataError = e.toString();
      -            }
      -          }
      -        }
      -
      -        if (oSound.waveformDataArray != oSound.lastValues.waveformDataArray) {
      -          oSound.lastValues.waveformDataArray = oSound.waveformDataArray;
      -          newWaveformData = true;
      -        }
      -
      -        if (oSound.eqDataArray != oSound.lastValues.eqDataArray) {
      -          oSound.lastValues.eqDataArray = oSound.eqDataArray;
      -          newEQData = true;
      -        }
      -
      -        if (newDataError && !oSound.handledDataError) {
      -          sMethod = baseJSObject + "['" + oSound.sID + "']._ondataerror";
      -          ExternalInterface.call(sMethod, 'data unavailable: ' + dataError);
      -          oSound.handledDataError = true;
      -        }
      -
      -      }
      -
      -      if (typeof nP != 'undefined' && (hasNew && (oSound.soundChannel || oSound.useNetstream || forceCheck || forceEndCheck))) { // && isPlaying - removed to allow updates while paused, eg. from setPosition() calls. Also be more liberal if we're using netStream.
      - -
    • - - -
    • -
      - -
      - -
      -

      oSound.lastValues.position = nP;

      - -
      - -
              sMethod = baseJSObject + "['" + oSound.sID + "']._whileplaying";
      -        var waveDataLeft:String = (newWaveformData ? oSound.waveformDataArray.slice(0, 256).join(',') : null);
      -        var waveDataRight:String = (newWaveformData ? oSound.waveformDataArray.slice(256).join(',') : null);
      -        var eqDataLeft:String = (newEQData ? oSound.eqDataArray.slice(0, 256).join(',') : null);
      -        var eqDataRight:String = (newEQData ? oSound.eqDataArray.slice(256).join(',') : null);
      -        ExternalInterface.call(sMethod, nP, (newPeakData ? {
      -          leftPeak: lP,
      -          rightPeak: rP
      -        } : null), waveDataLeft, waveDataRight, (newEQData ? {
      -          leftEQ: eqDataLeft,
      -          rightEQ: eqDataRight
      -        } : null));
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      check isBuffering

      - -
      - -
            if (!oSound.useNetstream && oSound.isBuffering != oSound.lastValues.isBuffering) {
      - -
    • - - -
    • -
      - -
      - -
      -

      property has changed

      - -
      - -
              oSound.lastValues.isBuffering = oSound.isBuffering;
      -        sMethod = baseJSObject + "['" + oSound.sID + "']._onbufferchange";
      -        ExternalInterface.call(sMethod, oSound.isBuffering ? 1 : 0);
      -      }
      -
      -    }
      -
      -    public function checkProgress() : void {
      -      for (var i: int = 0, j: int = sounds.length; i < j; i++) {
      -        checkSoundProgress(soundObjects[sounds[i]]);
      -      }
      -    }
      -
      -    public function onLoadError(oSound:Object) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      something went wrong. 404, bad format etc.

      - -
      - -
            ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", 0);
      -    }
      -
      -    public function onLoad(e: Event) : void {
      -      var oSound:Object = e.target;
      -      checkSoundProgress(soundObjects[oSound.sID]); // ensure progress stats are up-to-date
      -      if (!oSound.useNetstream) { // FLV must also have metadata
      -        oSound.loaded = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      force duration update (doesn't seem to be always accurate)

      - -
      - -
              ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", oSound.bytesLoaded, oSound.bytesTotal, oSound.length || oSound.duration);
      - -
    • - - -
    • -
      - -
      - -
      -

      duration > 0 means a valid sound was loaded.

      - -
      - -
              ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", (oSound.length || oSound.duration ? 1 : 0));
      -      }
      -    }
      -
      -    public function onID3(e: Event) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      --- NOTE: BUGGY (Flash 8 only? Haven't really checked 9 + 10.) --- -TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) -ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) -iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. -May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33

      - -
      - -
            try {
      -        var oSound:Object = e.target;
      -
      -        var id3Data:Array = [];
      -        var id3Props:Array = [];
      -        for (var prop:String in oSound.id3) {
      -          id3Props.push(prop);
      -          id3Data.push(oSound.id3[prop]);
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('id3['+prop+']: '+oSound.id3[prop]);

      - -
      - -
              }
      -        ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onid3", id3Props, id3Data);
      - -
    • - - -
    • -
      - -
      - -
      -

      unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) -Therefore if ID3V2 data is received, ID3V1 is ignored. -soundObjects[oSound.sID].onID3 = null;

      - -
      - -
            } catch(e: Error) {
      -        writeDebug('onID3(): Unable to get ID3 info for ' + oSound.sID + '.');
      -      }
      -      oSound.removeEventListener(Event.ID3, onID3);
      -    }
      -
      -    public function registerOnComplete(sID:String) : void {
      -      var oSound: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      if (oSound && oSound.soundChannel) {
      -        oSound.didFinish = false; // reset this flag
      -        oSound.soundChannel.addEventListener(Event.SOUND_COMPLETE, function() : void {
      -          if (oSound) {
      - -
    • - - -
    • -
      - -
      - -
      -

      force progress check, catching special end-of-sound case where position may not match duration.

      - -
      - -
                  checkSoundProgress(oSound, true, true);
      -            try {
      -              oSound.ignoreDataError = true; // workaround: avoid data error handling for this manual step..
      - -
    • - - -
    • -
      - -
      - -
      -

      oSound.soundChannel.stop();

      - -
      - -
                    oSound.didFinish = true; // "lock" sound, prevent extra whileplaying() position-type updates
      - -
    • - - -
    • -
      - -
      - -
      -

      call onfinish first (with end position)...

      - -
      - -
                    ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      - -
    • - - -
    • -
      - -
      - -
      -

      then reset sound so it can be played again. -oSound.start(0, 1); // go back to 0

      - -
      - -
                  } catch(e: Error) {
      -              writeDebug('Could not set position on ' + sID + ': ' + e.toString());
      -            }
      -            oSound.ignoreDataError = false; // ..and reset
      -            oSound.handledDataError = false; // reset this flag
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      safety net

      - -
      - -
                  ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish");
      -          }
      -        });
      -      }
      -    }
      -
      -    public function doSecurityError(oSound: SoundManager2_SMSound_AS3, e: SecurityErrorEvent) : void {
      -      writeDebug('securityError: ' + e.text);
      - -
    • - - -
    • -
      - -
      - -
      -

      when this happens, you don't have security rights on the server containing the FLV file -a crossdomain.xml file would fix the problem easily

      - -
      - -
          }
      -
      -    public function _setPosition(sID:String, nSecOffset:Number, isPaused: Boolean, allowMultiShot: Boolean) : void {
      -      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      if (!s) return void;
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_setPosition()');

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      stop current channel, start new one.

      - -
      - -
            if (s.lastValues) {
      -        s.lastValues.position = nSecOffset; // s.soundChannel.position;
      -      }
      -      if (s.useNetstream) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Minimize the buffer so playback starts ASAP

      - -
      - -
              s.ns.bufferTime = s.bufferTime;
      -        writeDebug('setPosition ('+ sID + '): setting buffer to '+s.ns.bufferTime+' secs');
      -
      -        nSecOffset = nSecOffset > 0 ? nSecOffset / 1000 : 0;
      -        s.ns.seek(nSecOffset);
      -        checkSoundProgress(s); // force UI update
      -      } else {
      -        if (s.soundChannel) {
      -          s.soundChannel.stop();
      -        }
      -        writeDebug('setPosition ('+ sID + '): ' + nSecOffset); // +', '+(s.lastValues.loops?s.lastValues.loops:1));
      -        if (s.lastValues.loops > 1 && nSecOffset != 0) {
      -          writeDebug('Warning: Looping functionality being disabled due to Flash limitation.');
      -          s.lastValues.loops = 1;
      -        }
      -        try {
      -          s.start(nSecOffset, s.lastValues.loops || 1, allowMultiShot); // start playing at new position
      -        } catch(e: Error) {
      -          writeDebug('Warning: Could not set position on ' + sID + ': ' + e.toString());
      -        }
      -        checkSoundProgress(s); // force UI update
      -        try {
      -          registerOnComplete(sID);
      -        } catch(e: Error) {
      -          writeDebug('_setPosition(): Could not register onComplete');
      -        }
      -        if (isPaused && s.soundChannel) {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_setPosition: stopping (paused) sound'); -writeDebug('last position: '+s.lastValues.position+' vs '+s.soundChannel.position);

      - -
      - -
                s.soundChannel.stop();
      -        }
      -      }
      -    }
      -
      -    public function _load(sID:String, sURL:String, bStream: Boolean, bAutoPlay: Boolean, nLoops: Number, bAutoLoad: Boolean, bCheckPolicyFile: Boolean) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_load()');

      - -
      - -
            if (typeof bAutoPlay == 'undefined') bAutoPlay = false;
      -      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      if (!s) return void;
      -      var didRecreate: Boolean = false;
      -      if (s.didLoad == true) {
      - -
    • - - -
    • -
      - -
      - -
      -

      need to recreate sound

      - -
      - -
              didRecreate = true;
      -        writeDebug('recreating sound ' + sID + ' in order to load ' + sURL);
      -        var ns:Object = new Object();
      -        ns.sID = s.sID;
      -        ns.loops = nLoops||1;
      -        ns.usePeakData = s.usePeakData;
      -        ns.useWaveformData = s.useWaveformData;
      -        ns.useEQData = s.useEQData;
      -        ns.useNetstream = s.useNetstream;
      -        ns.bufferTime = s.bufferTime;
      -        ns.serverUrl = s.serverUrl;
      -        ns.duration = s.duration;
      -        ns.checkPolicyFile = s.checkPolicyFile;
      -        ns.useEvents = true;
      -        _destroySound(s.sID);
      -        _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, bAutoPlay, ns.useEvents, bAutoLoad, ns.checkPolicyFile);
      -        s = soundObjects[sID];
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('Sound object replaced');

      - -
      - -
            }
      -      checkSoundProgress(s);
      -
      -      if (!s.didLoad) {
      -        try {
      -          s.addEventListener(Event.ID3, onID3);
      -          s.addEventListener(Event.COMPLETE, onLoad);
      -        } catch(e: Error) {
      -          writeDebug('_load(): could not assign ID3/complete event handlers');
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      don't try to load if same request already made

      - -
      - -
            s.sURL = sURL;
      -
      -      try {
      -        if (!s.useNetstream) {
      -          s.addEventListener(IOErrorEvent.IO_ERROR, function(e: IOErrorEvent) : void {
      -            s.doIOError(e);
      -          });
      -        }
      -        s.loadSound(sURL);
      -      } catch(e: Error) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
              writeDebug('_load: Error loading ' + sURL + '. Flash error detail: ' + e.toString());
      -      }
      -
      -    }
      -
      -    public function _unload(sID:String) : void {
      -      var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null);
      -      if (!s) return void;
      -      var sURL:String = s.sURL; // save existing sound URL for object recreation
      -      try {
      -        removeEventListener(Event.ID3, onID3);
      -        removeEventListener(Event.COMPLETE, onLoad);
      -      } catch(e: Error) {
      -        writeDebug('_unload() warn: Could not remove ID3/complete events');
      -      }
      -      s.paused = false;
      -      if (s.soundChannel) {
      -        s.soundChannel.stop();
      -      }
      -      try {
      -        if (s.didLoad && !s.loaded && !s.useNetstream) {
      -          s.close(); // close stream only if still loading?
      -        }
      -      } catch(e: Error) {
      - -
    • - - -
    • -
      - -
      - -
      -

      stream may already have closed if sound loaded, etc.

      - -
      - -
              writeDebug(sID + '._unload(): Note: Unable to close stream: ' + e.toString());
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
            }
      - -
    • - - -
    • -
      - -
      - -
      -

      destroy and recreate Flash sound object, try to reclaim memory -writeDebug('sound._unload(): recreating sound '+sID+' to free memory');

      - -
      - -
            if (s.useNetstream) {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_unload(): closing netStream stuff');

      - -
      - -
              try {
      -          s.removeNetstreamEvents();
      -          s.ns.close();
      -          s.nc.close();
      - -
    • - - -
    • -
      - -
      - -
      -

      s.nc = null; -s.ns = null;

      - -
      - -
              } catch(e: Error) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
                writeDebug('_unload(): caught exception during netConnection/netStream close');
      -        }
      -      }
      -      var ns:Object = new Object();
      -      ns.sID = s.sID;
      -      ns.loops = s.loops;
      -      ns.usePeakData = s.usePeakData;
      -      ns.useWaveformData = s.useWaveformData;
      -      ns.useEQData = s.useEQData;
      -      ns.useNetstream = s.useNetstream;
      -      ns.bufferTime = s.bufferTime;
      -      ns.serverUrl = s.serverUrl;
      -      ns.duration = s.duration;
      -      ns.autoPlay = s.autoPlay;
      -      ns.autoLoad = s.autoLoad;
      -      ns.checkPolicyFile = s.checkPolicyFile;
      -      _destroySound(s.sID);
      -      _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, ns.autoPlay, false, ns.autoLoad, ns.checkPolicyFile); // false: don't allow events just yet
      -      soundObjects[sID].connected = true; // fake it?
      -      writeDebug(s.sID + '.unload(): ok');
      -    }
      -
      -    public function _createSound(sID:String, sURL:String, usePeakData: Boolean, useWaveformData: Boolean, useEQData: Boolean, useNetstream: Boolean, bufferTime:Number, loops:Number, serverUrl:String, duration:Number, autoPlay:Boolean, useEvents:Boolean, autoLoad:Boolean, checkPolicyFile:Boolean) : void {
      -      var s: SoundManager2_SMSound_AS3 = new SoundManager2_SMSound_AS3(this, sID, sURL, usePeakData, useWaveformData, useEQData, useNetstream, bufferTime, serverUrl, duration, autoPlay, useEvents, autoLoad, checkPolicyFile);
      -      if (!soundObjects[sID]) {
      -        sounds.push(sID);
      -      }
      -      soundObjects[sID] = s;
      -      this.currentObject = s;
      -      s.sID = sID;
      -      s.sURL = sURL;
      -      s.paused = false;
      -      s.loaded = false;
      -      s.checkPolicyFile = checkPolicyFile;
      -      s.lastValues = {
      -        bytes: 0,
      -        duration: 0,
      -        position: 0,
      -        loops: loops||1,
      -        leftPeak: 0,
      -        rightPeak: 0,
      -        bufferLength: 0
      -      };
      -    }
      -
      -    public function _destroySound(sID:String) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      for the power of garbage collection! .. er, Greyskull!

      - -
      - -
            var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null);
      -      if (!s) return void;
      - -
    • - - -
    • -
      - -
      - -
      -

      try to unload the sound

      - -
      - -
            for (var i: int = 0, j: int = sounds.length; i < j; i++) {
      -        if (sounds[i] == sID) {
      -          sounds.splice(i, 1);
      -          break;
      -        }
      -      }
      -      if (s.soundChannel) {
      -        s.soundChannel.stop();
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      if is a movie, remove that as well.

      - -
      - -
            if (s.useNetstream) {
      - -
    • - - -
    • -
      - -
      - -
      -

      s.nc.client = null;

      - -
      - -
              try {
      -          s.removeNetstreamEvents();
      - -
    • - - -
    • -
      - -
      - -
      -

      s.nc.removeEventListener(NetStatusEvent.NET_STATUS, s.doNetStatus);

      - -
      - -
              } catch(e: Error) {
      -          writeDebug('_destroySound(): Events already removed from netStream/netConnection?');
      -        }
      -        if (s.didLoad) {
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: figure out if stream is still open first, can't close an already-closed stream.

      - -
      - -
                try {
      -            s.ns.close();
      -            s.nc.close();
      -          } catch(e: Error) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
                  writeDebug('_destroySound(): caught exception: '+e.toString());
      -          }
      -        }
      -      } else if (s.didLoad) {
      - -
    • - - -
    • -
      - -
      - -
      -

      non-netstream case

      - -
      - -
              try {
      -          s.close(); // close stream only if still loading?
      -        } catch(e: Error) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
              }
      -      }
      -      s = null;
      -      soundObjects[sID] = null;
      -      delete soundObjects[sID];
      -    }
      -
      -    public function _stop(sID:String, bStopAll: Boolean) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      stop this particular instance (or "all", based on parameter)

      - -
      - -
            if (bStopAll) {
      -        SoundMixer.stopAll();
      -      } else {
      -        var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -        if (!s) return void;
      -        if (s.useNetstream && s.ns) {
      -          s.ns.pause();
      -        } else if (s.soundChannel) {
      -          s.soundChannel.stop();
      -        }
      -        s.paused = false;
      -      }
      -    }
      -
      -    public function _start(sID:String, nLoops: int, nMsecOffset: int, allowMultiShot: Boolean) : Boolean {
      -      var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      var result: Boolean;
      -      if (!s) return true;
      -      writeDebug('start (' + sID + '): ' + nMsecOffset + (nLoops > 1 ? ', loops: ' + nLoops : ''));
      -      s.lastValues.paused = false; // reset pause if applicable
      -      s.lastValues.loops = (nLoops || 1);
      -      if (!s.useNetstream) {
      -        s.lastValues.position = nMsecOffset;
      -      }
      -      s.handledDataError = false; // reset this flag
      -      try {
      -        result = s.start(nMsecOffset, nLoops, allowMultiShot);
      -      } catch(e: Error) {
      -        writeDebug('Could not start ' + sID + ': ' + e.toString());
      -      }
      -      try {
      -        registerOnComplete(sID);
      -      } catch(e: Error) {
      -        writeDebug('_start(): registerOnComplete failed');
      -      }
      -      return result;
      -    }
      -
      -    public function _pause(sID:String, allowMultiShot: Boolean) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_pause(): ' + sID);

      - -
      - -
            var s: SoundManager2_SMSound_AS3 = soundObjects[sID];
      -      if (!s) return void;
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('s.paused: '+s.paused);

      - -
      - -
            if (!s.paused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      reference current position, stop sound

      - -
      - -
              s.paused = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_pause(): position: '+s.lastValues.position);

      - -
      - -
              if (s.useNetstream) {
      -          if (s.ns) {
      -            s.lastValues.position = s.ns.time*1000;
      -            s.ns.pause();
      -          } else if (s.autoPlay) {
      -            s.setAutoPlay(false);
      -          }
      -        } else {
      -          if (s.soundChannel) {
      -            s.lastValues.position = s.soundChannel.position;
      -            s.soundChannel.stop();
      -          }
      -        }
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      resume playing from last position -writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.loops+' times');

      - -
      - -
              s.paused = false;
      -        if (s.useNetstream) {
      -          s.ns.resume();
      -        } else {
      -          s.start(s.lastValues.position, s.lastValues.loops, allowMultiShot);
      -        }
      -        try {
      -          registerOnComplete(sID);
      -        } catch(e: Error) {
      -          writeDebug('_pause(): registerOnComplete() failed');
      -        }
      -      }
      -    }
      -
      -    public function _setPan(sID:String, nPan:Number) : void {
      -      if (soundObjects[sID]) {
      -        soundObjects[sID].setPan(nPan);
      -      }
      -    }
      -
      -    public function _setVolume(sID:String, nVol:Number) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('_setVolume: '+nVol);

      - -
      - -
            if (soundObjects[sID]) {
      -        soundObjects[sID].setVolume(nVol);
      -      }
      -    }
      -
      -    public function _setPolling(bPolling: Boolean = false, nTimerInterval: uint = 50) : void {
      -      pollingEnabled = bPolling;
      -      if (timer == null && pollingEnabled) {
      -        flashDebug('Enabling polling, ' + nTimerInterval + ' ms interval');
      -        timer = new Timer(nTimerInterval, 0);
      -        timer.addEventListener(TimerEvent.TIMER, function() : void {
      -          checkProgress();
      -        }); // direct reference eg. checkProgress doesn't work? .. odd.
      -        timer.start();
      -      } else if (timer && !pollingEnabled) {
      -        flashDebug('Disabling polling');
      - -
    • - - -
    • -
      - -
      - -
      -

      flash.utils.clearInterval(timer);

      - -
      - -
              timer.reset();
      -      }
      -    }
      -
      -    public function _getMemoryUse() : String {
      -      return System.totalMemory.toString();
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -
      -

      end methods

      - -
      - -
      -  }
      - -
    • - - -
    • -
      - -
      - -
      -

      package

      - -
      - -
      -}
      - -
    • - -
    -
    - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html deleted file mode 100755 index ff0ae3f4..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/SoundManager2_SMSound_AS3.html +++ /dev/null @@ -1,1302 +0,0 @@ - - - - - SoundManager2_SMSound_AS3.as - - - - - - -
    -
    - - - -
      - -
    • -
      -

      SoundManager2_SMSound_AS3.as

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      /**
      - * SoundManager 2: Javascript Sound for the Web
      - * ----------------------------------------------
      - * http://schillmania.com/projects/soundmanager2/
      - *
      - * Copyright (c) 2007, Scott Schiller. All rights reserved.
      - * Code licensed under the BSD License:
      - * http://www.schillmania.com/projects/soundmanager2/license.txt
      - *
      - * Flash 9 / ActionScript 3 version
      - */
      -
      -package {
      -
      -  import flash.external.*;
      -  import flash.events.*;
      -  import flash.media.Sound;
      -  import flash.media.SoundChannel;
      -  import flash.media.SoundLoaderContext;
      -  import flash.media.SoundTransform;
      -  import flash.media.SoundMixer;
      -  import flash.net.URLRequest;
      -  import flash.utils.ByteArray;
      -  import flash.utils.getTimer;
      -  import flash.net.NetConnection;
      -  import flash.net.NetStream;
      -  import flash.net.Responder;
      -
      -  public class SoundManager2_SMSound_AS3 extends Sound {
      -
      -    public var sm: SoundManager2_AS3 = null;
      - -
    • - - -
    • -
      - -
      - -
      -

      externalInterface references (for Javascript callbacks)

      - -
      - -
          public var baseJSController: String = "soundManager";
      -    public var baseJSObject: String = baseJSController + ".sounds";
      -    public var soundChannel: SoundChannel = new SoundChannel();
      -    public var urlRequest: URLRequest;
      -    public var soundLoaderContext: SoundLoaderContext;
      -    public var waveformData: ByteArray = new ByteArray();
      -    public var waveformDataArray: Array = [];
      -    public var eqData: ByteArray = new ByteArray();
      -    public var eqDataArray: Array = [];
      -    public var usePeakData: Boolean = false;
      -    public var useWaveformData: Boolean = false;
      -    public var useEQData: Boolean = false;
      -    public var sID: String;
      -    public var sURL: String;
      -    public var didFinish: Boolean;
      -    public var loaded: Boolean;
      -    public var connected: Boolean;
      -    public var failed: Boolean;
      -    public var paused: Boolean;
      -    public var finished: Boolean;
      -    public var duration: Number;
      -    public var handledDataError: Boolean = false;
      -    public var ignoreDataError: Boolean = false;
      -    public var autoPlay: Boolean = false;
      -    public var autoLoad: Boolean = false;
      -    public var pauseOnBufferFull: Boolean = false; // only applies to RTMP
      -    public var loops: Number = 1;
      -    public var lastValues: Object = {
      -      bytes: 0,
      -      position: 0,
      -      duration: 0,
      -      volume: 100,
      -      pan: 0,
      -      loops: 1,
      -      leftPeak: 0,
      -      rightPeak: 0,
      -      waveformDataArray: null,
      -      eqDataArray: null,
      -      isBuffering: null,
      -      bufferLength: 0
      -    };
      -    public var didLoad: Boolean = false;
      -    public var useEvents: Boolean = false;
      -    public var sound: Sound = new Sound();
      -
      -    public var cc: Object;
      -    public var nc: NetConnection;
      -    public var ns: NetStream = null;
      -    public var st: SoundTransform;
      -    public var useNetstream: Boolean;
      -    public var bufferTime: Number = 3; // previously 0.1
      -    public var lastNetStatus: String = null;
      -    public var serverUrl: String = null;
      -
      -    public var checkPolicyFile:Boolean = false;
      -
      -    public function SoundManager2_SMSound_AS3(oSoundManager: SoundManager2_AS3, sIDArg: String = null, sURLArg: String = null, usePeakData: Boolean = false, useWaveformData: Boolean = false, useEQData: Boolean = false, useNetstreamArg: Boolean = false, netStreamBufferTime: Number = 1, serverUrl: String = null, duration: Number = 0, autoPlay: Boolean = false, useEvents: Boolean = false, autoLoad: Boolean = false, checkPolicyFile: Boolean = false) {
      -      this.sm = oSoundManager;
      -      this.sID = sIDArg;
      -      this.sURL = sURLArg;
      -      this.usePeakData = usePeakData;
      -      this.useWaveformData = useWaveformData;
      -      this.useEQData = useEQData;
      -      this.urlRequest = new URLRequest(sURLArg);
      -      this.didFinish = false;
      -      this.loaded = false;
      -      this.connected = false;
      -      this.failed = false;
      -      this.finished = false;
      -      this.soundChannel = null;
      -      this.lastNetStatus = null;
      -      this.useNetstream = useNetstreamArg;
      -      this.serverUrl = serverUrl;
      -      this.duration = duration;
      -      this.useEvents = useEvents;
      -      this.autoLoad = autoLoad;
      -      if (netStreamBufferTime) {
      -        this.bufferTime = netStreamBufferTime;
      -      }
      -      this.checkPolicyFile = checkPolicyFile;
      -
      -      writeDebug('SoundManager2_SMSound_AS3: Got duration: '+duration+', autoPlay: '+autoPlay);
      -
      -      if (this.useNetstream) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Pause on buffer full if auto-loading an RTMP stream

      - -
      - -
              if (this.serverUrl && this.autoLoad) {
      -          this.pauseOnBufferFull = true;
      -        }
      -
      -        this.cc = new Object();
      -        this.nc = new NetConnection();
      - -
    • - - -
    • - - -
              this.nc.client = this;
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: security/IO error handling -this.nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doSecurityError);

      - -
      - -
              nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
      -
      -        if (this.serverUrl != null) {
      -          writeDebug('SoundManager2_SMSound_AS3: NetConnection: connecting to server ' + this.serverUrl + '...');
      -        }
      -        this.nc.connect(serverUrl);
      -      } else {
      -        this.connected = true;
      -      }
      -
      -    }
      -
      -    public function rtmpResponder(result:Object):void {
      - -
    • - - -
    • -
      - -
      - -
      -

      callback from Flash Media Server (RTMP) for 'getStreamLength' server-side method - result should be a floating-point. -http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html

      - -
      - -
            writeDebug('RTMP server getStreamLength() response: ' + result);
      - -
    • - - -
    • -
      - -
      - -
      -

      we now know the duration. type cast to floating-point - this will update JS-land during whileloading() / whileplaying().

      - -
      - -
            this.duration = Number(result) * 1000;
      -    }
      -
      -    public function netStatusHandler(event:NetStatusEvent):void {
      -
      -      if (this.useEvents) {
      -        writeDebug('netStatusHandler: '+event.info.code);
      -      }
      -
      -      switch (event.info.code) {
      -
      -        case "NetConnection.Connect.Success":
      -          try {
      -            this.ns = new NetStream(this.nc);
      -            this.ns.checkPolicyFile = this.checkPolicyFile;
      - -
    • - - -
    • - - -
                  this.ns.bufferTime = this.bufferTime; // set to 0.1 or higher. 0 is reported to cause playback issues with static files.
      -            this.st = new SoundTransform();
      -            this.cc.onMetaData = this.onMetaData;
      -            this.cc.setCaption = this.captionHandler;
      -            this.ns.client = this.cc;
      -            this.ns.receiveAudio(true);
      -            this.addNetstreamEvents();
      -            this.connected = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      RTMP-only

      - -
      - -
                  if (this.serverUrl && this.useEvents) {
      -              var responder:Responder = new Responder(rtmpResponder);
      - -
    • - - -
    • -
      - -
      - -
      -

      call a method on server to get the length of the stream (like onMetaData, but Flash Media Server-specific) -Red5 and other RTMP servers appear to provide duration via onMetaData event(s) in the stream. -http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html

      - -
      - -
                    nc.call('getStreamLength', responder, this.sURL);
      -              writeDebug('NetConnection: connected');
      -              writeDebug('firing _onconnect for '+this.sID);
      -              ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._onconnect", 1);
      -            }
      -          } catch(e: Error) {
      -            this.failed = true;
      -            writeDebug('netStream error: ' + e.toString());
      -            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code);
      -          }
      -          break;
      -
      -        case "NetStream.Play.StreamNotFound":
      -          this.failed = true;
      -          writeDebug("NetConnection: Stream not found!");
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Stream not found!', event.info.level, event.info.code);
      -          break;
      - -
    • - - -
    • -
      - -
      - -
      -

      This is triggered when the sound loses the connection with the server. -In some cases one could just try to reconnect to the server and resume playback. -However for streams protected by expiring tokens, I don't think that will work.

      -

      Flash says that this is not an error code, but a status code... -should this call the onFailure handler?

      - -
      - -
              case "NetConnection.Connect.Closed":
      -          this.failed = true;
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection closed!', event.info.level, event.info.code);
      -          writeDebug("NetConnection: Connection closed!");
      -          break;
      - -
    • - - -
    • -
      - -
      - -
      -

      Couldn't establish a connection with the server. Attempts to connect to the server -can also fail if the permissible number of socket connections on either the client -or the server computer is at its limit. This also happens when the internet -connection is lost.

      - -
      - -
              case "NetConnection.Connect.Failed":
      -          this.failed = true;
      -          writeDebug("NetConnection: Connection failed! Lost internet connection? Try again... Description: " + event.info.description);
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code);
      -          break;
      - -
    • - - -
    • -
      - -
      - -
      -

      A change has occurred to the network status. This could mean that the network -connection is back, or it could mean that it has been lost...just try to resume -playback.

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      KJV: Can't use this yet because by the time you get your connection back the -song has reached it's maximum retries, so it doesn't retry again. We need -a new _ondisconnect handler. -case "NetConnection.Connect.NetworkChange": - this.failed = true; - writeDebug("NetConnection: Network connection status changed"); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Reconnecting...'); - break;

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      Consider everything else a failure...

      - -
      - -
              default:
      -          this.failed = true;
      -          writeDebug("NetConnection: got unhandled code '" + event.info.code + "'! Description: " + event.info.description);
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', event.info.level, event.info.code);
      -          break;
      -      }
      -
      -    }
      -
      -    public function writeDebug (s: String, logLevel: Number = 0) : Boolean {
      -      return this.sm.writeDebug (s,logLevel); // defined in main SM object
      -    }
      -
      -    public function onMetaData(infoObject: Object) : void {
      -      var prop:String;
      -      if (sm.debugEnabled) {
      -        var data:String = new String();
      -        for (prop in infoObject) {
      -          data += prop+': '+infoObject[prop]+' \n';
      -        }
      -        writeDebug('Metadata: '+data);
      -      }
      -      this.duration = infoObject.duration * 1000;
      -      if (!this.loaded) {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('not loaded yet: '+this.ns.bytesLoaded+', '+this.ns.bytesTotal+', '+infoObject.duration1000); -TODO: investigate loaded/total values -ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.ns.bytesLoaded, this.ns.bytesTotal, infoObject.duration1000);

      - -
      - -
              ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.bytesLoaded, this.bytesTotal, (this.duration || infoObject.duration))
      -      }
      -      var metaData:Array = [];
      -      var metaDataProps:Array = [];
      -      for (prop in infoObject) {
      -        metaData.push(prop);
      -        metaDataProps.push(infoObject[prop]);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      pass infoObject to _onmetadata, too

      - -
      - -
            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onmetadata", metaData, metaDataProps);
      - -
    • - - -
    • -
      - -
      - -
      -

      this handler may fire multiple times, eg., when a song changes while playing an RTMP stream.

      - -
      - -
            if (!this.serverUrl) {
      - -
    • - - -
    • -
      - -
      - -
      -

      disconnect for non-RTMP cases, since multiple firings may mess up duration.

      - -
      - -
              this.cc.onMetaData = function(infoObject: Object) : void {}
      -      }
      -    }
      -
      -    public function captionHandler(infoObject: Object) : void {
      -
      -      if (sm.debugEnabled) {
      -        var data:String = new String();
      -        for (var prop:* in infoObject) {
      -          data += prop+': '+infoObject[prop]+' \n';
      -        }
      -        writeDebug('Caption: '+data);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      null this out for the duration of this object's existence. -it may be called multiple times. -this.cc.setCaption = function(infoObject: Object) : void {}

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('Caption\n'+infoObject['dynamicMetadata']); -writeDebug('firing _oncaptiondata for '+this.sID);

      - -
      - -
      -      ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._oncaptiondata", infoObject['dynamicMetadata']);
      -
      -    }
      -
      -    public function getWaveformData() : void {
      - -
    • - - -
    • - - -
            SoundMixer.computeSpectrum(this.waveformData, false, 0); // sample wave data at 44.1 KHz
      -      this.waveformDataArray = [];
      -      for (var i: int = 0, j: int = this.waveformData.length / 4; i < j; i++) { // get all 512 values (256 per channel)
      -        this.waveformDataArray.push(int(this.waveformData.readFloat() * 1000) / 1000);
      -      }
      -    }
      -
      -    public function getEQData() : void {
      - -
    • - - -
    • - - -
            SoundMixer.computeSpectrum(this.eqData, true, 0); // sample EQ data at 44.1 KHz
      -      this.eqDataArray = [];
      -      for (var i: int = 0, j: int = this.eqData.length / 4; i < j; i++) { // get all 512 values (256 per channel)
      -        this.eqDataArray.push(int(this.eqData.readFloat() * 1000) / 1000);
      -      }
      -    }
      -
      -    public function start(nMsecOffset: int, nLoops: int, allowMultiShot:Boolean) : Boolean {
      -
      -      this.useEvents = true;
      -
      -      if (this.useNetstream) {
      -
      -        writeDebug("SMSound::start nMsecOffset "+ nMsecOffset+ ' nLoops '+nLoops + ' current bufferTime '+this.ns.bufferTime+' current bufferLength '+this.ns.bufferLength+ ' this.lastValues.position '+this.lastValues.position);
      - -
    • - - -
    • -
      - -
      - -
      -

      mark for later Netstream.Play.Stop / sound completion

      - -
      - -
              this.finished = false;
      -
      -        this.cc.onMetaData = this.onMetaData;
      - -
    • - - -
    • -
      - -
      - -
      -

      Don't seek if we don't have to because it destroys the buffer

      - -
      - -
              var set_position:Boolean = this.lastValues.position != null && this.lastValues.position != nMsecOffset;
      -
      -        if (set_position) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Minimize the buffer so playback starts ASAP

      - -
      - -
                this.ns.bufferTime = this.bufferTime;
      -        }
      -
      -        if (this.paused) {
      -          writeDebug('start: resuming from paused state');
      -          this.ns.resume(); // get the sound going again
      -          if (!this.didLoad) {
      -            this.didLoad = true;
      -          }
      -          this.paused = false;
      -        } else if (!this.didLoad) {
      -          writeDebug('start: !didLoad - playing '+this.sURL);
      -          this.ns.play(this.sURL);
      -          this.pauseOnBufferFull = false; // SAS: playing behaviour overrides buffering behaviour
      -          this.didLoad = true;
      -          this.paused = false;
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      previously loaded, perhaps stopped/finished. play again?

      - -
      - -
                writeDebug('playing again (not paused, didLoad = true)');
      -          this.pauseOnBufferFull = false;
      -          this.ns.play(this.sURL);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      KJV seek after calling play otherwise some streams get a NetStream.Seek.Failed -Should only apply to the !didLoad case, but do it for all for simplicity. -nMsecOffset is in milliseconds for streams but in seconds for progressive -download.

      - -
      - -
              if (set_position) {
      -          this.ns.seek(this.serverUrl ? nMsecOffset / 1000 : nMsecOffset);
      -          this.lastValues.position = nMsecOffset; // https://gist.github.com/1de8a3113cf33d0cff67
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      this.ns.addEventListener(Event.SOUND_COMPLETE, _onfinish);

      - -
      - -
              this.applyTransform();
      -
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('start: seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops'));

      - -
      - -
              if (!this.soundChannel || allowMultiShot) {
      -          this.soundChannel = this.play(nMsecOffset, nLoops);
      -          this.addEventListener(Event.SOUND_COMPLETE, _onfinish);
      -          this.applyTransform();
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('start: was already playing, no-multishot case. Seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); -already playing and no multi-shot allowed, so re-start and set position

      - -
      - -
                if (this.soundChannel) {
      -            this.soundChannel.stop();
      -          }
      -          this.soundChannel = this.play(nMsecOffset, nLoops); // start playing at new position
      -          this.addEventListener(Event.SOUND_COMPLETE, _onfinish);
      -          this.applyTransform();
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      if soundChannel is null (and not a netStream), there is no sound card (or 32-channel ceiling has been hit.) -http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29

      - -
      - -
            return (!this.useNetstream && this.soundChannel === null ? false : true);
      -
      -    }
      -
      -    private function _onfinish() : void {
      -      this.removeEventListener(Event.SOUND_COMPLETE, _onfinish);
      -    }
      -
      -    public function loadSound(sURL: String) : void {
      -      if (this.useNetstream) {
      -        this.useEvents = true;
      -        if (this.didLoad != true) {
      -          this.ns.play(this.sURL); // load streams by playing them
      -          if (!this.autoPlay) {
      -            this.pauseOnBufferFull = true;
      -          }
      -          this.paused = false;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      this.addEventListener(Event.SOUND_COMPLETE, _onfinish);

      - -
      - -
              this.applyTransform();
      -      } else {
      -        try {
      -          this.didLoad = true;
      -          this.urlRequest = new URLRequest(sURL);
      -          this.soundLoaderContext = new SoundLoaderContext(1000, this.checkPolicyFile); // check for policy (crossdomain.xml) file on remote domains - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundLoaderContext.html
      -          this.load(this.urlRequest, this.soundLoaderContext);
      -        } catch(e: Error) {
      -          writeDebug('error during loadSound(): ' + e.toString());
      -        }
      -      }
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      Set the value of autoPlay

      - -
      - -
          public function setAutoPlay(autoPlay: Boolean) : void {
      -      if (!this.serverUrl) {
      -        this.autoPlay = autoPlay;
      -      } else {
      -        this.autoPlay = autoPlay;
      -        if (this.autoPlay) {
      -          this.pauseOnBufferFull = false;
      -        } else if (!this.autoPlay) {
      -          this.pauseOnBufferFull = true;
      -        }
      -      }
      -    }
      -
      -    public function setVolume(nVolume: Number) : void {
      -      this.lastValues.volume = nVolume / 100;
      -      this.applyTransform();
      -    }
      -
      -    public function setPan(nPan: Number) : void {
      -      this.lastValues.pan = nPan / 100;
      -      this.applyTransform();
      -    }
      -
      -    public function applyTransform() : void {
      -      var st: SoundTransform = new SoundTransform(this.lastValues.volume, this.lastValues.pan);
      -      if (this.useNetstream) {
      -        if (this.ns) {
      -          this.ns.soundTransform = st;
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('applyTransform(): Note: No active netStream');

      - -
      - -
              }
      -      } else if (this.soundChannel) {
      -        this.soundChannel.soundTransform = st; // new SoundTransform(this.lastValues.volume, this.lastValues.pan);
      -      }
      -    }
      - -
    • - - -
    • - - -
          public function onBWDone() : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      writeDebug('onBWDone: called and ignored');

      - -
      - -
          }
      - -
    • - - -
    • -
      - -
      - -
      -

      NetStream client callback. Invoked when the song is complete.

      - -
      - -
          public function onPlayStatus(info:Object):void {
      -      writeDebug('onPlayStatus called with '+info);
      -      switch(info.code) {
      -        case "NetStream.Play.Complete":
      -          writeDebug('Song has finished!');
      -          break;
      -      }
      -    }
      -
      -    public function doIOError(e: IOErrorEvent) : void {
      -      ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", 0); // call onload, assume it failed.
      - -
    • - - -
    • -
      - -
      - -
      -

      there was a connection drop, a loss of internet connection, or something else wrong. 404 error too.

      - -
      - -
          }
      -
      -    public function doAsyncError(e: AsyncErrorEvent) : void {
      -      writeDebug('asyncError: ' + e.text);
      -    }
      -
      -    public function doNetStatus(e: NetStatusEvent) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      Handle failures

      - -
      - -
            if (e.info.code == "NetStream.Failed"
      -          || e.info.code == "NetStream.Play.FileStructureInvalid"
      -          || e.info.code == "NetStream.Play.StreamNotFound") {
      -
      -        this.lastNetStatus = e.info.code;
      -        writeDebug('netStatusEvent: ' + e.info.code);
      -        this.failed = true;
      -        ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', e.info.level, e.info.code);
      -        return;
      -      }
      -
      -      writeDebug('netStatusEvent: ' + e.info.code);  // KJV we like to see all events
      - -
    • - - -
    • -
      - -
      - -
      -

      When streaming, Stop is called when buffering stops, not when the stream is actually finished. -@see http://www.actionscript.org/forums/archive/index.php3/t-159194.html

      - -
      - -
            if (e.info.code == "NetStream.Play.Stop") {
      -
      -        if (!this.finished && (!this.useNetstream || !this.serverUrl)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      finished playing, and not RTMP

      - -
      - -
                writeDebug('calling onfinish for a sound');
      - -
    • - - -
    • -
      - -
      - -
      -

      reset the sound? Move back to position 0?

      - -
      - -
                this.sm.checkProgress();
      -          this.finished = true; // will be reset via JS callback
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish");
      -
      -        }
      -
      -      } else if (e.info.code == "NetStream.Play.Start" || e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Buffer.Full") {
      - -
    • - - -
    • -
      - -
      - -
      -

      RTMP case.. -We wait for the buffer to fill up before pausing the just-loaded song because only if the -buffer is full will the song continue to buffer until the user hits play.

      - -
      - -
              if (this.serverUrl && e.info.code == "NetStream.Buffer.Full" && this.pauseOnBufferFull) {
      -          this.ns.pause();
      -          this.paused = true;
      -          this.pauseOnBufferFull = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      Call pause in JS. This will call back to us to pause again, but -that should be harmless.

      - -
      - -
                writeDebug('Pausing on buffer full');
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "'].pause", false);
      -        }
      -
      -        var isNetstreamBuffering: Boolean = (e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Play.Start");
      - -
    • - - -
    • -
      - -
      - -
      -

      assume buffering when we start playing, eg. initial load.

      - -
      - -
              if (isNetstreamBuffering != this.lastValues.isBuffering) {
      -          this.lastValues.isBuffering = isNetstreamBuffering;
      -          ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onbufferchange", this.lastValues.isBuffering ? 1 : 0);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      We can detect the end of the stream when Play.Stop is called followed by Buffer.Empty. -However, if you pause and let the whole song buffer, Buffer.Flush is called followed by -Buffer.Empty, so handle that case too.

      -

      Ignore this event if we are more than 3 seconds from the end of the song.

      - -
      - -
              if (e.info.code == "NetStream.Buffer.Empty" && (this.lastNetStatus == 'NetStream.Play.Stop' || this.lastNetStatus == 'NetStream.Buffer.Flush')) {
      -          if (this.duration && (this.ns.time * 1000) < (this.duration - 3000)) {
      -            writeDebug('Ignoring Buffer.Empty because this is too early to be the end of the stream! (sID: '+this.sID+', time: '+(this.ns.time*1000)+', duration: '+this.duration+')');
      -          } else if (!this.finished) {
      -            this.finished = true;
      -            writeDebug('calling onfinish for sound '+this.sID);
      -            this.sm.checkProgress();
      -            ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish");
      -          }
      -
      -        } else if (e.info.code == "NetStream.Buffer.Empty") {
      - -
    • - - -
    • -
      - -
      - -
      -

      The buffer is empty. Start from the smallest buffer again.

      - -
      - -
                this.ns.bufferTime = this.bufferTime;
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      Remember the last NetStatus event

      - -
      - -
            this.lastNetStatus = e.info.code;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      KJV The sound adds some of its own netstatus handlers so we don't need to do it here.

      - -
      - -
          public function addNetstreamEvents() : void {
      -      ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError);
      -      ns.addEventListener(NetStatusEvent.NET_STATUS, doNetStatus);
      -      ns.addEventListener(IOErrorEvent.IO_ERROR, doIOError);
      -    }
      -
      -    public function removeNetstreamEvents() : void {
      -      ns.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError);
      -      ns.removeEventListener(NetStatusEvent.NET_STATUS, doNetStatus);
      -      ns.addEventListener(NetStatusEvent.NET_STATUS, dummyNetStatusHandler);
      -      ns.removeEventListener(IOErrorEvent.IO_ERROR, doIOError);
      - -
    • - - -
    • -
      - -
      - -
      -

      KJV Stop listening for NetConnection events on the sound

      - -
      - -
            nc.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      Prevents possible 'Unhandled NetStatusEvent' condition if a sound is being -destroyed and interacted with at the same time.

      - -
      - -
          public function dummyNetStatusHandler(e: NetStatusEvent) : void {
      - -
    • - - -
    • -
      - -
      - -
      -

      Don't do anything

      - -
      - -
          }
      -  }
      -}
      - -
    • - -
    -
    - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css deleted file mode 100755 index 97efe8f2..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/docco.css +++ /dev/null @@ -1,508 +0,0 @@ -/*--------------------- Typography ----------------------------*/ - -@font-face { - font-family: 'aller-light'; - src: url('public/fonts/aller-light.eot'); - src: url('public/fonts/aller-light.eot?#iefix') format('embedded-opentype'), - url('public/fonts/aller-light.woff') format('woff'), - url('public/fonts/aller-light.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'aller-bold'; - src: url('public/fonts/aller-bold.eot'); - src: url('public/fonts/aller-bold.eot?#iefix') format('embedded-opentype'), - url('public/fonts/aller-bold.woff') format('woff'), - url('public/fonts/aller-bold.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'novecento-bold'; - src: url('public/fonts/novecento-bold.eot'); - src: url('public/fonts/novecento-bold.eot?#iefix') format('embedded-opentype'), - url('public/fonts/novecento-bold.woff') format('woff'), - url('public/fonts/novecento-bold.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -/*--------------------- Layout ----------------------------*/ -html { height: 100%; } -body { - font-family: "aller-light"; - font-size: 14px; - line-height: 18px; - color: #30404f; - margin: 0; padding: 0; - height:100%; -} -#container { min-height: 100%; } - -a { - color: #000; -} - -b, strong { - font-weight: normal; - font-family: "aller-bold"; -} - -p { - margin: 15px 0 0px; -} - .annotation ul, .annotation ol { - margin: 25px 0; - } - .annotation ul li, .annotation ol li { - font-size: 14px; - line-height: 18px; - margin: 10px 0; - } - -h1, h2, h3, h4, h5, h6 { - color: #112233; - line-height: 1em; - font-weight: normal; - font-family: "novecento-bold"; - text-transform: uppercase; - margin: 30px 0 15px 0; -} - -h1 { - margin-top: 40px; -} - -hr { - border: 0; - background: 1px solid #ddd; - height: 1px; - margin: 20px 0; -} - -pre, tt, code { - font-size: 12px; line-height: 16px; - font-family: Menlo, Monaco, Consolas, "Lucida Console", monospace; - margin: 0; padding: 0; -} - .annotation pre { - display: block; - margin: 0; - padding: 7px 10px; - background: #fcfcfc; - -moz-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - -webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - box-shadow: inset 0 0 10px rgba(0,0,0,0.1); - overflow-x: auto; - } - .annotation pre code { - border: 0; - padding: 0; - background: transparent; - } - - -blockquote { - border-left: 5px solid #ccc; - margin: 0; - padding: 1px 0 1px 1em; -} - .sections blockquote p { - font-family: Menlo, Consolas, Monaco, monospace; - font-size: 12px; line-height: 16px; - color: #999; - margin: 10px 0 0; - white-space: pre-wrap; - } - -ul.sections { - list-style: none; - padding:0 0 5px 0;; - margin:0; -} - -/* - Force border-box so that % widths fit the parent - container without overlap because of margin/padding. - - More Info : http://www.quirksmode.org/css/box.html -*/ -ul.sections > li > div { - -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ - -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ - box-sizing: border-box; /* css3 */ -} - - -/*---------------------- Jump Page -----------------------------*/ -#jump_to, #jump_page { - margin: 0; - background: white; - -webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777; - -webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px; - font: 16px Arial; - cursor: pointer; - text-align: right; - list-style: none; -} - -#jump_to a { - text-decoration: none; -} - -#jump_to a.large { - display: none; -} -#jump_to a.small { - font-size: 22px; - font-weight: bold; - color: #676767; -} - -#jump_to, #jump_wrapper { - position: fixed; - right: 0; top: 0; - padding: 10px 15px; - margin:0; -} - -#jump_wrapper { - display: none; - padding:0; -} - -#jump_to:hover #jump_wrapper { - display: block; -} - -#jump_page { - padding: 5px 0 3px; - margin: 0 0 25px 25px; -} - -#jump_page .source { - display: block; - padding: 15px; - text-decoration: none; - border-top: 1px solid #eee; -} - -#jump_page .source:hover { - background: #F9FCFF; -} - -#jump_page .source:first-child { -} - -/*---------------------- Low resolutions (> 320px) ---------------------*/ -@media only screen and (min-width: 320px) { - .pilwrap { display: none; } - - ul.sections > li > div { - display: block; - padding:5px 10px 0 10px; - } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 30px; - } - - ul.sections > li > div.content { - background: #F9FCFF; - overflow-x:auto; - -webkit-box-shadow: inset 0 0 5px #e5e5ee; - box-shadow: inset 0 0 5px #e5e5ee; - border: 1px solid #dedede; - margin:5px 10px 5px 10px; - padding-bottom: 5px; - } - - ul.sections > li > div.annotation pre { - margin: 7px 0 7px; - padding-left: 15px; - } - - ul.sections > li > div.annotation p tt, .annotation code { - background: #f8f8ff; - border: 1px solid #dedede; - font-size: 12px; - padding: 0 0.2em; - } -} - -/*---------------------- (> 481px) ---------------------*/ -@media only screen and (min-width: 481px) { - #container { - position: relative; - } - body { - background-color: #F9FCFF; - font-size: 15px; - line-height: 21px; - } - pre, tt, code { - line-height: 18px; - } - p, ul, ol { - margin: 0 0 15px; - } - - - #jump_to { - padding: 5px 10px; - } - #jump_wrapper { - padding: 0; - } - #jump_to, #jump_page { - font: 10px Arial; - text-transform: uppercase; - } - #jump_page .source { - padding: 5px 10px; - } - #jump_to a.large { - display: inline-block; - } - #jump_to a.small { - display: none; - } - - - - #background { - position: absolute; - top: 0; bottom: 0; - width: 350px; - background: #fff; - border-right: 1px solid #e5e5ee; - z-index: -1; - } - - ul.sections > li > div.annotation ul, ul.sections > li > div.annotation ol { - padding-left: 40px; - } - - ul.sections > li { - white-space: nowrap; - } - - ul.sections > li > div { - display: inline-block; - } - - ul.sections > li > div.annotation { - max-width: 350px; - min-width: 350px; - min-height: 5px; - padding: 13px; - overflow-x: hidden; - white-space: normal; - vertical-align: top; - text-align: left; - } - ul.sections > li > div.annotation pre { - margin: 15px 0 15px; - padding-left: 15px; - } - - ul.sections > li > div.content { - padding: 13px; - vertical-align: top; - background: #F9FCFF; - border: none; - -webkit-box-shadow: none; - box-shadow: none; - } - - .pilwrap { - position: relative; - display: inline; - } - - .pilcrow { - font: 12px Arial; - text-decoration: none; - color: #454545; - position: absolute; - top: 3px; left: -20px; - padding: 1px 2px; - opacity: 0; - -webkit-transition: opacity 0.2s linear; - } - .for-h1 .pilcrow { - top: 47px; - } - .for-h2 .pilcrow, .for-h3 .pilcrow, .for-h4 .pilcrow { - top: 35px; - } - - ul.sections > li > div.annotation:hover .pilcrow { - opacity: 1; - } -} - -/*---------------------- (> 1025px) ---------------------*/ -@media only screen and (min-width: 1025px) { - - body { - font-size: 16px; - line-height: 24px; - } - - #background { - width: 525px; - } - ul.sections > li > div.annotation { - max-width: 525px; - min-width: 525px; - padding: 10px 25px 1px 50px; - } - ul.sections > li > div.content { - padding: 9px 15px 16px 25px; - } -} - -/*---------------------- Syntax Highlighting -----------------------------*/ - -td.linenos { background-color: #f0f0f0; padding-right: 10px; } -span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; } -/* - -github.com style (c) Vasily Polovnyov - -*/ - -pre code { - display: block; padding: 0.5em; - color: #000; - background: #f8f8ff -} - -pre .comment, -pre .template_comment, -pre .diff .header, -pre .javadoc { - color: #408080; - font-style: italic -} - -pre .keyword, -pre .assignment, -pre .literal, -pre .css .rule .keyword, -pre .winutils, -pre .javascript .title, -pre .lisp .title, -pre .subst { - color: #954121; - /*font-weight: bold*/ -} - -pre .number, -pre .hexcolor { - color: #40a070 -} - -pre .string, -pre .tag .value, -pre .phpdoc, -pre .tex .formula { - color: #219161; -} - -pre .title, -pre .id { - color: #19469D; -} -pre .params { - color: #00F; -} - -pre .javascript .title, -pre .lisp .title, -pre .subst { - font-weight: normal -} - -pre .class .title, -pre .haskell .label, -pre .tex .command { - color: #458; - font-weight: bold -} - -pre .tag, -pre .tag .title, -pre .rules .property, -pre .django .tag .keyword { - color: #000080; - font-weight: normal -} - -pre .attribute, -pre .variable, -pre .instancevar, -pre .lisp .body { - color: #008080 -} - -pre .regexp { - color: #B68 -} - -pre .class { - color: #458; - font-weight: bold -} - -pre .symbol, -pre .ruby .symbol .string, -pre .ruby .symbol .keyword, -pre .ruby .symbol .keymethods, -pre .lisp .keyword, -pre .tex .special, -pre .input_number { - color: #990073 -} - -pre .builtin, -pre .constructor, -pre .built_in, -pre .lisp .title { - color: #0086b3 -} - -pre .preprocessor, -pre .pi, -pre .doctype, -pre .shebang, -pre .cdata { - color: #999; - font-weight: bold -} - -pre .deletion { - background: #fdd -} - -pre .addition { - background: #dfd -} - -pre .diff .change { - background: #0086b3 -} - -pre .chunk { - color: #aaa -} - -pre .tex .formula { - opacity: 0.5; -} diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.eot deleted file mode 100755 index 1b32532a8e40e483069482c3650c3ef22ef16bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29804 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 F>VRGqwvGS* diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.ttf deleted file mode 100755 index dc4cc9c27a59ab14fbb7444c6ab35c5b33a034f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66836 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%0AAIIsziQtyhPht7#*LdNqb{-ye3^( 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ⅆA*wV|2E?UgaO-298Xthc^!eoT=hLnT61q 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-bold.woff deleted file mode 100755 index fa16fd0aba81582de121d833c7bc50e8f1b1b981..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33244 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 q6yXA@F-u0Z~1!1poleYR}~W diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/aller-light.eot deleted file mode 100755 index 40bd654b5fe63501ae64d5673b5aa45051a69e65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29509 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�y6>nTFX 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/fonts/novecento-bold.eot deleted file mode 100755 index 98a9a7fbabb1083aca5143bc306e228886ff2eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18190 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 F001ed(;ol; diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css deleted file mode 100755 index 73abb76f..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/public/stylesheets/normalize.css +++ /dev/null @@ -1,375 +0,0 @@ -/*! normalize.css v2.0.1 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/* - * Corrects `block` display not defined in IE 8/9. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section, -summary { - display: block; -} - -/* - * Corrects `inline-block` display not defined in IE 8/9. - */ - -audio, -canvas, -video { - display: inline-block; -} - -/* - * Prevents modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/* - * Addresses styling for `hidden` attribute not present in IE 8/9. - */ - -[hidden] { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/* - * 1. Sets default font family to sans-serif. - * 2. Prevents iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -webkit-text-size-adjust: 100%; /* 2 */ - -ms-text-size-adjust: 100%; /* 2 */ -} - -/* - * Removes default margin. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/* - * Addresses `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/* - * Improves readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/* - * Addresses `h1` font sizes within `section` and `article` in Firefox 4+, - * Safari 5, and Chrome. - */ - -h1 { - font-size: 2em; -} - -/* - * Addresses styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/* - * Addresses style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/* - * Addresses styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/* - * Addresses styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - - -/* - * Corrects font family set oddly in Safari 5 and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -/* - * Improves readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* - * Sets consistent quote types. - */ - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -/* - * Addresses inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/* - * Prevents `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/* - * Removes border when inside `a` element in IE 8/9. - */ - -img { - border: 0; -} - -/* - * Corrects overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/* - * Addresses margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/* - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/* - * 1. Corrects color not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/* - * 1. Corrects font family not being inherited in all browsers. - * 2. Corrects font size not being inherited in all browsers. - * 3. Addresses margins set differently in Firefox 4+, Safari 5, and Chrome - */ - -button, -input, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 2 */ - margin: 0; /* 3 */ -} - -/* - * Addresses Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/* - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Corrects inability to style clickable `input` types in iOS. - * 3. Improves usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/* - * Re-set default cursor for disabled elements. - */ - -button[disabled], -input[disabled] { - cursor: default; -} - -/* - * 1. Addresses box sizing set to `content-box` in IE 8/9. - * 2. Removes excess padding in IE 8/9. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/* - * 1. Addresses `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Addresses `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/* - * Removes inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* - * Removes inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/* - * 1. Removes default vertical scrollbar in IE 8/9. - * 2. Improves readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/* - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html deleted file mode 100755 index 12064399..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/generated/soundmanager2.html +++ /dev/null @@ -1,11613 +0,0 @@ - - - - - soundmanager2.js - - - - - - -

    - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html deleted file mode 100755 index 10f022ac..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/getstarted/index.html +++ /dev/null @@ -1,563 +0,0 @@ - - - -SoundManager 2 Tutorial: Getting Started - - - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - -
    -
    -

    How SoundManager Works

    -

    It starts out easy, but you can go down the rabbit hole if you want.

    -
    - -
    - -
    - - - -

    SoundManager 2 Tutorial: What, Why, How

    - -

    Problem: Browsers lack good, consistent native audio support. (HTML 5's Audio() is the future, but is still in development.)

    -

    Solution: Javascript API using HTML5 Audio() + headless Flash via ExternalInterface, works almost everywhere. If HTML5 is supported but "non-free" MP3/MP4 formats are not, flash can be used as a fallback.

    -

    SoundManager 2 wraps and extends both the HTML Audio and Flash Audio APIs, providing a single, unified sound API to Javascript; the API is consistent regardless of the technology working under the hood to play sound. (The flash portion is hidden, transparent to both developers and end users.)

    - -
    - -
    - - -

    Including SoundManager 2

    - -

    The soundmanager2.js core can get down to 11 KB over the wire, depending on what version you use. A few versions of the SM2 script are available, balancing code size between commented, debug-enabled and production-optimized builds.

    -

    Regardless of which build you use, take advantage of gzip compression on your server for big savings. As shown below, SoundManager 2 compresses quite well with gzip; the full debug-enabled version served with gzip is smaller than even the minified, no-debug version served without.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Build versionRecommended useFile size+ gzip
    -

    Original, formatted debug-enabled version with comments. Passes jslint.

    -
    <script src="soundmanager2.js"></script>
    -
    Development, testing, debugging153 KB41 KB
    -

    "No-debug", formatted (comments removed, whitespace retained) version

    -
    <script src="soundmanager2-nodebug.js"></script>
    -
    Production, "clean" no-debug code78 KB17 KB
    -

    Minified (Google Closure Compiler-munged, no comments or whitespace), debug-enabled version

    -
    <script src="soundmanager2-jsmin.js"></script>
    -
    Production, with debug code47 KB16 KB
    -

    Build-script optimized, minified, no-debug version

    -
    <script src="soundmanager2-nodebug-jsmin.js"></script>
    -
    Production-optimized, debug code removed34 KB11 KB!
    - -

    You then need to tell SM2 where to find the flash .SWF it will need (depending on HTML5 support), and optionally what version of Flash (~2.8 KB for flash 8, and ~8.5 KB for flash 9) depending on what API features you want:

    - -
    <script>
    -soundManager.setup({
    -  url: '/path/to/swf-files/',
    -  flashVersion: 9, // optional: shiny features (default = 8)
    -  // optional: ignore Flash where possible, use 100% HTML5 mode
    -  // preferFlash: false,
    -  onready: function() {
    -    // Ready to use; soundManager.createSound() etc. can now be called.
    -  }
    -});
    -</script>
    - -

    If you plan to eventually use the flash block handling feature (disabled in this example), you'll want to look at the flash block demo and include the relevant CSS it uses.

    - - - -

    Basic SoundManager Template

    - -

    For a live example of a page including SoundManager 2, check the bare-bones template.

    - -

    SoundManager File Structure

    -

    Or, "What you get when you download SM2."

    -

    The core audio API bits require script/soundmanager2.js and the SWF files swf/soundmanager2.swf and swf/soundmanager2_flash9.swf, as well as the _debug versions of the SWFs. The flash 9 SWF enables some extra API features, and is only used if you set soundManager.flashVersion = 9 (the default is 8.)

    - -
      -
    • - soundmanager2/ -
        -
      • - demo/ - Examples, MP3 player UIs etc. -
      • -
      • - doc/ - API method documentation, notes, troubleshooting -
      • -
      • - script/ - API core, soundmanager2.js -
      • -
      • - src/ - AS2/AS3 Flash source used to build SWFs (for flash development) -
      • -
      • - swf/ - API core, SoundManager 2 .SWF files -
      • -
      • - troubleshoot/ - Tool for finding/fixing startup issues -
      • -
      -
    • -
    - -

    How SoundManager 2 Really Works

    - -

    SoundManager 2 is the result of Javascript talking to a hidden Flash movie. The Flash layer is not something you have to work with directly, but it is the component which makes audio control possible behind the scenes.

    - -
    - -
    - soundmanager2.js <- Flash + ExternalInterface, and/or HTML5 Audio() -> <- HTTP -> audio file -
    - -
    - -

    Flash can expose methods to Javascript via ExternalInterface, allowing bi-directional calls to be made and thus providing additional functionality to Javascript.

    - -

    For the real gory details on the behind-the-scenes action of JS + Flash, see How SoundManager 2 Works on schillmania.com.

    - - -
    - -
    - -

    Startup / Initialization

    - -

    In brief, here is now SM2 starts up:

    -
      -
    • soundmanager2.js loads
    • -
    • new SoundManager() constructor call, event listeners attached for dom ready/init
    • -
    • document.createElement('embed') (or 'object' for IE), append Flash .SWF to document
    • -
    • SWF loads, Flash makes call to JS function: "Hi, JS!"
    • -
    • JS -> Flash test (JS calls Flash function): "Hello, Flash!"
    • -
    • -- startup is complete, soundManager.onready() fires --
    • -
    - -

    A single Javascript include will link in all of the required code for the library, which will automatically begin loading either at onDOMContentLoaded() if supported, or alternately, after window.onload() (eg., IE 6 and others.) The default behaviour is to start "as soon as possible", but the library can be configured to wait for window.onload() in all cases as well. Loading and initialisation are separate events.

    - -

    Once initialised, SM2 will call event handlers/listeners registered via soundManager.onready(). There are also "old-skool" onload()/onerror() event handlers which you can define just as you would with window.onload().

    - -

    If you want to lazy-load or defer SM2, see Lazy-loading and SM2_DEFER.

    - -

    SoundManager onready() / ontimeout() Event Handlers

    - -

    onready() is a flexible method that can be used to queue numerous listeners for SM2's successful start-up. Simply pass a callback function, which will be called when SM2 has successfully started:

    - -
    soundManager.onready(function() {
    -    // SM2 is ready to go!
    -    makeSomeNoise(); // soundManager.createSound(), etc.
    -});
    - -

    ontimeout() is used to add listeners for SM2 init failures, which can happen due to missing or blocked Flash support. They are not necessarily fatal as in the flash block case, where onready() calls can follow ontimeout() if the user unblocks flash after a failed init attempt.

    - -
    soundManager.ontimeout(function() {
    -    // SM2 could not start. Flash blocked, missing or security error? Complain, etc.?
    -});
    - -

    Lazy-loading / Dynamically-loading SM2 on-the-fly

    - -

    Let's say you wanted to load and start SM2 after your page has loaded, using JavaScript to insert a script node etc., or otherwise only start SM2 conditionally. You can load the library dynamically (at or after DOMContentReady), and it will not attempt to init until you call setup() with a url parameter.

    -

    Example:

    - -
    function loadSM2() {
    -  // -- load soundmanager2.js via <script>, createElement('script') or XHR etc. --
    -  // imaginary loadJS() function with callback ...
    -  loadJS('/path/to/soundmanager2.js', function() {
    -    // once soundmanager2.js has loaded, call soundManager.setup().
    -    soundManager.setup({
    -      url: '/path/to/swfs/',
    -      onready: function() {
    -        // soundManager.createSound() etc. here
    -      }
    -    });
    -  });
    -}
    - -

    For a live demo, check out the deferred loading example.

    - -
    - - -
    - -
    - -
    - -
    -

    Sound Options Object Format

    -

    Object Literal, JSON-style data passed to createSound() and play()

    -
    - -
    - -
    - -

    Object Literal Format

    - -

    Sounds can be created with instance-specific parameters in an object literal (JSON-style) format, where omitted parameters inherit default values as defined in soundManager.

    - -
    soundManager.createSound({
    -  id: 'mySound',
    -  url: '/path/to/some.mp3',
    -  autoLoad: true,
    -  autoPlay: false,
    -  onload: function() {
    -    alert('The sound '+this.id+' loaded!');
    -  },
    -  volume: 50
    -});
    - -

    This object can also be passed as an optional argument to the play method, overriding options set at creation time.

    - -

    For a full list of available options, see Sound Properties Object

    - -
    - - -
    - -
    - -
    -
    -

    "Use Responsibly"

    -

    Only you can prevent audio pollution?

    -
    - -
    - -
    - -

    A Word Of Vice

    -

    Not every button, link, element or paragraph on the web needs to zoom, move, change colour and be noisy, repetitive and annoying all at the same time. Use your own discretion!

    -

    Sites which automatically start playing background sound, and/or don't have volume or mute controls are the kind of things you should avoid building. As a developer, gentle reader, you may eventually find yourself in such a situation. Please do your part in enhancing the web with sound if you use SM2, while at the same time keeping it audibly usable. :)

    - -
    - -
    - -
    - -
    - -
    -

    Troubleshooting

    -

    Console-style messaging, useful for troubleshooting start-up and runtime issues.

    -
    - -
    - -

    SoundManager 2 Start-up and Debug Tools

    -

    This troubleshooting tool can come in handy for debugging SM2 start-up problems, when Flash support is required.

    - -

    Flash options: Flash 8 (default), Flash 9 (normal) or Flash 9 + highPerformance + fastPolling modes.

    - -
    -
      - -
    • -

      OKFAILN/AUnknownSoundManager 2 start-up

      -
      -

      soundManager onready() or ontimeout() events are ultimately called when start-up completes.

      -

      If you're seeing a failure, refer to the below for troubleshooting details for common causes.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash

      -
      -

      Flash 8 or 9 may be required for SoundManager 2 to start, depending on HTML5 support. You are currently using [unknown].

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash SWF

      -
      -

      SoundManager 2 must load a flash movie before initialisation can proceed. If you have errors here, check that soundManager.url is correctly defined and that the URL being loaded is correct.

      -

      If the Flash movie URL is OK, Flash security or flash blockers are the likely cause. Check the section below.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash -> JS

      -
      -

      Once the flash component of SM2 has loaded, it tries to make a call to Javascript-land. This is a common point of failure, for security reasons.

      -
        -
      • -

        Have a flash blocker? Check that the SM2 flash movie (below) is loading and is not being blocked.

        -
      • -
      • - First time opening SM2 after downloading it? Is your browser URL at file:// or c:/path/ or otherwise not using HTTP? Flash security "whitelisting" is required to allow Flash + JS to work when offline, placing it in the "LocalTrusted" Flash security sandbox rather than "localWithFile". - -
        -

        Offline viewing: Adding a "trusted location" to the Flash Security Settings Panel

        -

        The Flash Player Global Security Settings Panel is a web-based control panel which allows you to configure Flash security. You will need to add the path of the SoundManager 2 project in order for it to work "offline" (ie., when viewing via file:// or c:/)

        -

        Show me how: Adding a "trusted location"

        - -

        Launch the Flash Security Settings Panel

        -
        - -
      • -
      • Flash blockers (FlashBlock, "click to flash" etc.) preventing flash load and start-up - need whitelisting/"allow this domain" to work smoothly. If you suspect blocking is the issue, try the SoundManager 2 Flashblock demo.
      • -
      • Online viewing (HTTP/S): Same-domain security rules apply to HTML + Flash content by default (crossdomain.xml/allowDomain() in .AS source required to override.)
      • -
      -

      See Flash debug output for more security error details.

      - -
      -

      Online viewing: Cross-domain security restrictions

      -

      HTML page on domain A loading .SWF from domain B: Flash security prevents JS + Flash when a cross-domain XML permission file is not available on domain B, and/or flash movie was not compiled with allowDomain('domainA') or allowDomain('*') - note that the SWF distributed with SM2 does not use this by default; try using the cross-domain version of the SWF, or compile your own which whitelists your own domain(s).

      - -

      Flash Blockers

      -

      Browser extensions/add-ons like "FlashBlock" and "click to flash" can prevent the .SWF from loading, and this will mean SM2 will time-out and fail waiting for a response from Flash. For development, it's best to whitelist the domain(s) or the .SWF for SM2 to allow it to work.

      -

      Have a flash blocker installed? Want to test it? Try the SoundManager 2 Flashblock demo.

      - -
      - -
      -
    • - -
    • -

      OKErrorN/AUnknownJS -> Flash

      -
      -

      At this point, Javascript attempts to respond to Flash's initial outgoing Flash -> JS call, completing the test for JS/flash communication. If SM2 does not receive a response from flash, it will eventually fail.

      -

      Offline viewing conditions and cross-domain security rules will prevent Flash <-> JS communication. See the details of Flash -> JS for information.

      -

      Special Firefox Note: Some versions of Firefox (9.0 and newer?) may break JS/Flash in the file:// or offline case even when the path has been whitelisted in the Flash player security settings panel. IE, Chrome, Safari and Opera do not have this issue.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownSound test

      -
      -

      Here, a simple createSound() call is made to test SM2's actual operation. A sound should load and play provided SM2 was able to start successfully.

      -
      -
    • - -
    -
    - -

    Flash detection code from Flash Detect (featureblend.com)

    - -

    Flash Movie Debug Output

    -

    When soundManager.debugFlash = true, Flash will write debug info as text to the flash movie. This can be helpful for troubleshooting Flash/JS issues when timeouts or security errors are involved which prevent Flash from talking to Javascript, potentially hiding useful debug information. A CSS class of flash_debug will also be appended to the Flash #sm2-container DIV element when enabled, if you wish to style it differently.

    -

    You can also specify ?debug=1 in the URL to the SWF, and it will write debug output. Try soundmanager2_debug.swf?debug=1, or soundmanager2_flash9_debug.swf?debug=1.

    - -
    - -
    - -

    Live Debug Output

    -

    SoundManager 2 relies on Javascript and Flash communicating via ExternalInterface, and this is subject to a number of timing, loading and browser security conditions. Because of this complexity, debug information is essential for troubleshooting start-up, loading, initialization and error conditions between Flash and Javascript.

    -

    With debug mode enabled via debugMode = true, SM2 can write helpful troubleshooting information to javascript console.log()-style interfaces. Additionally, output can be written to an optional DIV element with the ID of "soundmanager-debug".

    -

    If loading from the local filesystem (offline eg. file://, not over HTTP), Flash security is likely preventing SM2 from talking to Javascript. You will need to add this project's directory to the trusted locations in the Flash global security settings panel, or simply view this page over HTTP.

    -

    Below is a live example of debug output.

    -
    -
    - -
    -
    -

    For more examples of live debug output, see the Basic Template, API demo and other demos in the top navigation.

    - -

    Standalone version of troubleshooting tool

    -

    For debugging your development/production environment with this widget, see the troubleshooting subdirectory of the SoundManager 2 package.

    - -
    - -
    - -
    - - - -
    - -
    - -
    - -
    - - -
    - - -
    - - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html deleted file mode 100755 index 5463f54d..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/index.html +++ /dev/null @@ -1,1934 +0,0 @@ - - - -SoundManager 2: Documentation - - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - -
    - - - -
    - - - -
    - -

    API Elements

    - -

    SoundManager and SMSound API

    - - - - -
    - -
    - -
    - -
    - - -
    - -
    -
    -
    - -
    -
    -
    - -
    - -
    - -
    - -

    SoundManager Properties: soundManager.setup()

    - -

    - Just getting started? See the basics. For nicely-formatted, annotated source code, see the pretty-printed version. -

    - -
    - -

    The soundManager object has many configurable properties which set debug mode, determine the flash movie path and other behaviours.

    - -

    When configuring soundManager for your use, soundManager.setup() is the method used to assign these options; for example, soundManager.setup({ url: '/path/to/swfs/', flashVersion: 9 });

    - -

    You should call the setup method before "DOM Ready", which is when SM2 applies configuration and starts up.

    - -

    Below are the default settings for SoundManager 2, which are appropriate for the majority of use cases - you shouldn't need to change them. These parameters are defined and stored in soundManager.setupOptions.

    - -

    Note: The only property requiring customization is url - this defines the path used to look for the appropriate flash SWF for driving audio when HTML5 is not available. (If not specified, the current working path is used.) Aside from flash-specific items like url and flashVersion, most properties can be set after "DOM Ready" without issue.

    - -
    - -
      - -
    • -
      url: '/path/to/swf-files/',
      - // the directory where SM2 can find the flash movies (soundmanager2.swf, soundmanager2_flash9.swf and debug versions etc.) Note that SM2 will append the correct SWF file name, depending on flashVersion and debugMode settings. -
    • - -
    • -
      allowScriptAccess: 'always',
      - // for scripting the SWF (object/embed property), 'always' or 'sameDomain' -
    • - -
    • -
      bgColor: '#ffffff',
      - // SWF background color. N/A when wmode = 'transparent' -
    • - -
    • -
      consoleOnly: true,
      - // if console is being used, do not create/write to #soundmanager-debug -
    • - -
    • -
      debugMode: true,
      - // enable debugging output (console.log() with HTML fallback) -
    • - -
    • -
      debugFlash: false,
      - // enable debugging output inside SWF, troubleshoot Flash/browser issues -
    • - -
    • -
      flashVersion: 8,
      - // flash build to use (8 or 9.) Some API features require 9. -
    • - -
    • -
      flashPollingInterval: null,
      - // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. -
    • - -
    • -
      html5PollingInterval: null,
      - // msec affecting whileplaying/loading callback frequency. If null, native HTML5 update events are used. -
    • - -
    • -
      html5Test: /^(probably|maybe)$/i,
      - // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. -
    • - -
    • -
      flashLoadTimeout: 1000,
      - // msec to wait for flash movie to load before failing (0 = infinity) -
    • - -
    • -
      idPrefix: 'sound',
      - // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc. -
    • - - -
    • -
      noSWFCache: false,
      - // if true, appends ?ts={date} to break aggressive SWF caching. -
    • - -
    • -
      preferFlash: true,
      - // overrides useHTML5audio. if true and flash support present, will try to use flash for MP3/MP4 as needed since HTML5 audio support is still quirky in browsers. -
    • - -
    • -
      useConsole: true,
      - // use console.log() if available (otherwise, writes to #soundmanager-debug element) -
    • - -
    • -
      useFlashBlock: false,
      - // requires flashblock.css, see demos - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. -
    • - -
    • -
      useHighPerformance: false,
      - // position:fixed flash movie can help increase js/flash speed, minimize lag -
    • - -
    • -
      useHTML5Audio: true,
      - // use HTML5 Audio() where supported. Some browsers may not support "non-free" MP3/MP4/AAC codecs. Ideally, transparent vs. Flash API where possible. -
    • - -
    • -
      waitForWindowLoad: false,
      - // force SM2 to wait for window.onload() before trying to call soundManager.onready() -
    • - -
    • -
      wmode: null
      - // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index) -
    • - - -
    - -
    - -

    Legacy support note: The new approach defines top-level properties in soundManager.setupOptions. The old approach was to assign properties directly to the soundManager instance. Thus, when soundManager.setup({ url: ... }); is called, the updated property value is assigned to both soundManager.setupOptions.url and soundManager.url. You can assign soundManager.url directly as with the old method, but it is recommended to use the new setup()-based method for forward compatibility.

    - -
    - -

    Bonus: Extended soundManager.setup() Parameters

    - -

    As it is common to configure soundManager properties and related events all at once, you can also pass onready and ontimeout parameters which will be called as if you had used soundManager.onready() and soundManager.ontimeout().

    - -

    You can also provide values from the following top-level soundManager properties:

    - -
      -
    • defaultOptions: {...} (global defaults for new sound objects)
    • -
    • flash9Options: {...} (API feature options specific to Flash 9)
    • -
    • movieStarOptions: {...} (Flash 9-only NetStream/RTMP-specific options)
    • -
    - -
    soundManager.setup({
    -  url: '/path/to/swfs/',
    -  flashVersion: 9,
    -  preferFlash: false, // prefer 100% HTML5 mode, where both supported
    -  onready: function() {
    -    // console.log('SM2 ready!');
    -  },
    -  ontimeout: function() {
    -    // console.log('SM2 init failed!');
    -  },
    -  defaultOptions: {
    -    // set global default volume for all sound objects
    -    volume: 33
    -  }
    -});
    - -
    - -
    - -
    -

    debugFlash

    -

    soundManager.debugFlash configures SM2's flash debugging output, disabled (false) by default. When enabled, the Flash portion of SM2 will write debug statements within the Flash movie. This can be useful for troubleshooting Flash/JS/browser (ExternalInterface) issues and so on.

    -

    A CSS class of flash_debug will also be appended to the Flash #sm2-container DIV element when enabled, if you wish to style it differently.

    -

    For a live example, see Flash Movie Debug Output in the Troubleshooting section.

    -
    - -
    -

    debugMode

    -

    soundManager.debugMode configures SM2's debug behaviour, enabled (true) by default. When enabled, SoundManager 2 will write console-like output to console.log()-style javascript interfaces, and/or an HTML element with the ID soundmanager-debug (will be created if not found in the DOM at runtime.)

    -

    For a live example of debug output, see Debug + Console Output.

    -
    - -
    - -

    flashVersion

    - -

    SoundManager 2 started with a Flash 8 base requirement, but can also use Flash 9 and take advantages of some unique features Flash 9 offers. By default Flash 8 will be used, but the version can be easily changed by setting flashVersion appropriately.

    - -

    Example: soundManager.setup({ flashVersion: 9 });

    - -

    The Flash 8 version is soundmanager2.swf, and the flash 9 version is soundmanager2_flash9.swf, accordingly. Note that only Flash 8 and Flash 9 are supported at this time; other values will result in errors.

    - -
    - -
    - -

    Flash 9-only features:

    - -
      -
    • MPEG-4 (HE-AAC/H.264) audio support
    • -
    • True "multi-shot" sound behaviour. play() can be called multiple times, giving a layered, "chorus" effect. Sound will also fire onfinish() multiple times. (Previous behaviour did not layer sounds, but would re-play a single instance.)
    • -
    • waveformData array: 256 waveform data values available while playing sound
    • -
    • eqData array: 256 EQ spectrum data values available while playing sound
    • -
    • peakData object: Left and right channel peak/volume data available while playing sound
    • -
    - -
    - -
    -

    flashLoadTimeout

    -

    After initializing the flash component during start-up, SM2 will wait for a defined period of time before timing out and calling soundManager.onerror().

    -

    The default value is 1000 (msec.) Setting a value of 0 disables the timeout and makes SM2 wait indefinitely for a call from the flash component. If you want to handle flash block-type situations, see soundManager.useFlashBlock.

    -

    Setting this parameter to 0 may be useful when attempting to gracefully recover from a flashBlock situation, where the user has whitelisted the movie after it was blocked etc.

    -

    Note that when the timeout is disabled, soundManager will not fire its onerror() handler if there is an error at the flash loading stage.

    -
    - -
    -

    flashPollingInterval

    -

    Setting this will override useFastPolling, and defines the interval of the internal flash timer used for callbacks to sound events like whileloading() and whileplaying(). For example, set this to 200 to have 200ms intervals. This is useful in the case where your callbacks are CPU intensive, or you simply wish to throttle your calls to be more CPU-conservative.

    -
    - -
    -

    html5PollingInterval

    -

    Setting this will enable a single interval that will affect the frequency of event callbacks such whileplaying() for HTML5 sounds, with the exclusion of mobile devices. If null, native HTML5 update events are used. The frequency of native events may vary widely across browsers, and may exceed 500 msec on mobile and other resource-limited devices.

    -

    By default, Flash uses a 50-msec timer interval and this is a reasonable value to apply to html5PollingInterval for desktop use cases.

    -
    - -
    -

    preferFlash

    -

    This property handles "mixed-mode" HTML5 + flash cases, and may prevent 100% HTML5 mode when enabled depending on the configuration of soundManager.audioFormats. In the event HTML5 supports the default "required" formats (presently MP3), and preferFlash is true (and flash is installed), flash will be used for MP3/MP4 content while allowing HTML5 to play OGG, WAV and other supported formats.

    -

    Important note: Because HTML5 audio has some bugs across various browsers and operating systems, preferFlash is true by default to help ensure MP3/MP4 play consistently. If set to false or flash is not available, "HTML5-only" mode will kick in and will apply to all formats.

    -

    To encourage 100% HTML5 mode, call soundMangager.setup({ preferFlash: false }) and then Flash will not be used for MP3/MP4 playback, provided that HTML5 supports them.

    -
    - -
    -

    url

    -

    soundManager.url, applied via soundManager.setup(), specifies the "online", generally HTTP-based path which SM2 will load .SWF movies from. The "local" (current) path of ./ will be used by default. The appropriate .SWF required (depending on the desired Flash version) will be appended to the URL.

    -

    Example: soundManager.setup({ url: '/path/to/swf-directory/' }); (Note trailing slash)

    -

    For a simple demo of this in action, see the basic template.

    -

    For cases where SM2 is being used "offline" in non-HTTP cases (eg., development environments), see altURL.

    -
    - -
    -

    useFastPolling

    -

    By default useFastPolling = false, and thus SoundManager uses a 50-millisecond timer inside Flash when polling for updated sound properties such as bytesLoaded and data and event callbacks eg. whileloading(), whileplaying() and so on. With useFastPolling = true, a 10-msec timer is used and callback frequency may noticeably increase. This is best combined with useHighPerformance for optimal results.

    -
    - -
    -

    useFlashBlock

    -

    Flash blockers (eg. FlashBlock, "Click To Flash") can prevent the flash portion of SM2 from loading, which will cause a start-up error with a time-out.

    -

    SM2 historically has kept the flash movie off-screen and out of view, and thus the user could not click on and unblock it. Now with useFlashBlock = true, the movie positioning can be handled by CSS. The initial state is still off-screen by default, but will change to be in view when a blocking (time-out) situation may be encountered. You can also edit the CSS to taste, of course.

    -

    When starting up, CSS classes are appended to the #sm2-container DIV (which you can provide, or SM2 will create and append to the document.) The CSS classes change with the state of SM2's start-up, eg. #sm2-container.swf_timedout { border:1px solid red; } could be used to highlight the movie to the user for unblocking and so on.

    -

    Setting useFlashBlock = true will cause SM2 to wait infinitely for the Flash content to load after an initial (non-fatal) timeout, having already waited for flashLoadTimeout to pass. If flashLoadTimeout = 0, SM2 will immediately go into "flash block mode" on start-up.

    -

    The relevant CSS is as follows:

    -
    #sm2-container {
    - /**
    -  * Initial/default state...
    -  * position:absolute/off-screen, or left/top:0
    -  */
    -}
    -
    -#sm2-container.swf_timedout {
    -  /**
    -   * Didn't load before time-out, show to user.
    -   * Maybe highlight on-screen, red border, etc..? 
    -   */
    -}
    -
    -#sm2-container.swf_unblocked {
    -  /**
    -   * Applied if movie loads successfully
    -   * (flash started, so move off-screen etc.)
    -   */
    -}
    -
    -#sm2-container.swf_error {
    -  /**
    -   * "Fatal" error case: SWF loaded, but SM2 was unable to start.
    -   * (Flash security or other error case.)
    -   */
    -}
    -
    -#sm2-container.high_performance {
    -  /**
    -   * Additional modifier for "high performance" mode
    -   * should apply position:fixed and left/bottom 0 to stay on-screen
    -   * at all times (better flash performance)
    -   */
    -}
    -
    -#sm2-container.flash_debug {
    -  /**
    -   * Additional modifier for flash debug output mode
    -   * should use width/height 100% so you can read debug messages
    -   */
    -}
    - -

    For a live example, see the FlashBlock Demo.

    -
    - -
    -

    useHighPerformance

    -

    Perhaps intuitively, Flash is given higher priority when positioned within the viewable area of the browser, at least 6px in height (oddly), fully-opaque, visible and displayed on the screen. By default, useHighPerformance is disabled. When enabled, it may noticeably reduce JS/flash lag and increase the frequency of callbacks such as whileplaying() in some circumstances.

    -

    soundManager.setup({useHighPerformance: true});

    -

    This has made a noticeable impact in responsiveness on Mac OS X, and Safari on Windows; animation lag is practically non-existent (see demo). Because setting wmode=transparent and fixed position has been reported to cause some issues, the feature is disabled by default.

    -

    To be least-obtrusive, SM2 attempts to set position:fixed, and uses bottom/left:0px to stay within view (though using wmode=transparent where possible, to be hidden from view.) It occupies an 8x8px square. If you wish to position the movie yourself or show it inline, have a DIV element with the ID of sm2-container present in the DOM for SM2 to reference and it will write the movie there without positioning.

    -
    - -
    - -

    useHTML5Audio

    - -

    HTML5 support is in active development. See Revision History for the latest updates on HTML5 playback support.

    - -

    useHTML5Audio determines whether HTML5 Audio() support is used (as available) to play sound, with flash as the fallback for playing MP3 and MP4 (AAC) formats. Browser support for HTML5 Audio varies, and format support (eg. MP3, MP4/AAC, OGG, WAV) can vary by browser/platform.

    - -

    The SM2 API is effectively transparent, consistent whether using flash or HTML5 Audio() for sound playback behind the scenes. The HTML5 Audio API is roughly equivalent to the flash 8 feature set, minus ID3 tag support and a few other items. (Flash 9 features like waveform data etc. are not available in HTML5 mode.)

    - -

    By default, "100% HTML5 mode" applies to Apple iPad 3.2+ (iPad version 1.0), iPhone / iOS 4.0+ devices and others without flash. In other cases, HTML5 support is tested and if MP3/MP4 aren't natively supported, flash will be used as a backup method of playing these "required" formats. (It is assumed MP3 playback is required by default, but this is user-configurable via soundManager.audioFormats.) HTML5 may also enable support for additional formats such as OGG and WAV.

    -

    On the desktop and other devices with flash support, SM2 will still try for 100% HTML5 mode by default. However, you can use soundManager.setup({ preferFlash: true }) if you would like to have Flash play MP3 and MP4 (AAC) formats even when they are supported via HTML5.

    - -
    SoundManager 2 + useHTML5Audio: Init Process
    - -

    At DOM ready (if useHTML5Audio = true), a test for Audio() is done followed by a series of canPlayType() tests to see if MP3, MP4, WAV and OGG formats are supported. If any of the "required" formats (by default, MP3) are not supported via HTML5, or if preferFlash = true and MP3 or MP4 are required, then flash is also added as a requirement for SM2 to start.

    - -

    soundManager.audioFormats defines the list of formats to check (MP3, MP4 and so on), their possible canPlayType() strings (long story short, it's complicated) and whether or not they are "required" - that is, whether flash should be loaded if they don't work under HTML5. (Again, only MP3 + MP4 are supported by flash.) If you had a page solely using OGG, you could make MP3/MP4 non-required, but many browsers do not play OGG files natively.

    - -

    SM2 will indicate its state (HTML 5 support or not, using flash or not) in console.log()-style debug output messages when debugMode = true.

    - -
    "My browser does HTML5, why not MP3"?
    - -

    Despite best efforts, some browsers eg. Chrome on Windows may only return "maybe" for Audio().canPlayType('audio/mpeg; codecs=mp3') and variants; SoundManager 2 will presently assume a format is supported if a "probably" or "maybe" response is given. You can modify html5Test to be /probably/i if you want to be more strict, for example.

    - -

    Safari, IE 9, and Chrome (excluding Chromium?) support the "non-free" MP3 and MP4 (including AAC) formats. Firefox, in some cases, does support the MP3 codec where the underlying OS has support for it. This includes Windows Vista (and newer), and as of November 2013, Firefox Aurora (development builds) also on OS X.

    -

    For the cases where MP3 is not supported via HTML5, flash is used as the fallback support for MP3/MP4 as needed. Additionally, if flash support is present, soundManager.preferFlash means that MP3/MP4 will be handled by flash even if HTML5 support is present for those formats.

    - -
    Additional HTML5 formats: OGG, WAV
    - -

    WAVe (uncompressed audio) and OGG (a free/open-source alternative to MP3) are both supported in a majority of browsers via HTML5, so SoundManager 2 will also test for support for these formats. A flash fallback for these formats has not been implemented. In 2011, Adobe suggested they would support OGG audio + video (combined, the "WebM" format) in a future release of flash. As of November 2013, this has yet to materialize.

    - -

    You may need to make a few server configuration updates given the importance of MIME types and the use of certain HTTP headers when serving audio to HTML5 clients. See Client Requests for more.

    - -

    HTML5 is not limited to OGG and WAV, of course, as the system is designed to be extensible. Support for other formats may exist, depending on what built-in support exists, and plug-ins or codecs the user has installed on their system.

    - -
    Testing audio format support
    - -

    Once soundManager.onready() has fired and SM2 has started, you can check for support via a number of methods. Namely, soundManager.canPlayLink() will take an <a> element and check its href and type attributes, if available, for hints as to its format or type. You can also pass arbitrary URLs to soundManager.canPlayURL(), which will make a "best guess" based on the extension it finds. In any event, SM2 will return a true/false value from canPlay methods based on HTML and/or flash capabilities.

    - -

    To see what formats are supported by HTML5, watch SM2's debug/console output when debug is enabled, or dump the contents of soundManager.html5 to the console; it will show the results of tests for simple items like "mp3", as well as canPlayType() strings such as 'mpeg; codecs=mp3'

    - -
    Apple iPad, iPhone, Palm Pre: Special Cases
    -

    The "Big iPhone" doesn't do Flash, and does support HTML5 Audio() pretty decently - so SM2 makes a special exception to enable useHTML5Audio when it detects an iPad, iPhone or Palm Pre user agent string by default. Feel free to disable this if you wish.

    -

    iPad and iPhone require user interaction to start a sound, eg. the createSound() and play() call should happen within an onclick() handler on a link, etc. The "security" model here seems to be implemented similarly to the way pop-up blockers work. You may "chain" sounds (eg. create and play a new one) provided it is done via the onfinish() event of a sound initiated by a user, however. The Muxtape-style demo on the SM2 homepage uses this, and will advance the playlist on the iPad/iPhone if allowed.

    -

    iPad 3.2 gets hung up on the "BC quail" HE-AAC example sound for some reason, and endlessly loops it rather than finishing and moving on to the next item. May be an iPad playback bug, as other formats are fine. iPhone OS 4 (iOS 4) does not show this issue.

    -

    iPhone OS version < 3.1 doesn't work, but 3.1 (and possibly earlier versions, not verified) have a native Audio() object. However, they seem to simply not play sound when play() is called, so SM2 looks for and ignores the iPhone with these OS revisions.

    -

    The Palm Pre supports a number of MP3, MP4 and WAV formats (WebOS 1.4.1 was tested; it didn't seem to like MP3s at 192kbps, but 128kbps was fine.)

    - -
    General Disclaimer
    -

    HTML5 audio support may still be in flux, and may not be fully-supported or implemented consistently in modern browsers. Be careful out there.

    - -
    Related Reading on HTML5
    -

    For some more backstory on HTML and audio, see the 24ways.org article "Probably, Maybe, No": The State Of HTML5 Audio (published December, 2010.)

    - -
    - -
    -

    wmode

    -

    The wmode property is applied directly to the flash movie, and can be either null, 'window', 'transparent' or 'opaque'. By default if useHighPerformance is enabled, transparency will be attempted by SM2 unless there are known issues with the rendering mode.

    -

    It appears that non-IE browsers on Windows will not load SWF content "below the fold" (out of scrollable view) when wmode is set to anything other than null (window). This will break SM2 as it expects Flash to load within a reasonably short amount of time - so SM2 by default will reset wmode for this case. If you wish to force retention of your wmode, set soundManager.flashTimeout = 0 which will ensure that if the content is below the fold, SM2 will not time out waiting for it to load.

    -

    Additionally, soundManager.specialWmodeCase will be set to true if wmode has been reset due to this special condition.

    -
    - - -
    - -

    SoundManager Top-Level Properties

    - -

    A few additional properties that hang off the soundManager instance object

    - -
    - -
    -

    soundManager.altURL

    -

    soundManager.altURL specifies an alternate path to soundManager.setupOptions.url which SM2 can load its SWF from. It is a simple convenience for when you may need to load SWFs from different paths depending on your hosting environment (eg., offline development vs. production.)

    -

    Example: soundManager.altURL = '../'; (Load from parent directory - note trailing slash)

    -

    For altURL to be used, it must be defined and an "alternate environment" condition must be met:

    -

    soundManager.useAltURL = (!document.location.protocol.match(/http/i));

    -

    By default and as shown above, SM2 will use this property when the hosting page is not being served over HTTP, and thus is assumed to being served "offline" - for example, when loading via file://, from the local file system.

    -

    This can easily be adapted to taste, eg., checking the domain matching yourdomain.com vs. localhost:

    -

    soundManager.useAltURL = (!document.location.match(/mydomain.com/i));

    -

    If soundManager.altURL is null (the default), soundManager.setupOptions.url will be used for all cases.

    -
    - -
    -

    soundManager.audioFormats

    - -

    soundManager.audioFormats defines a structure listing the audio codecs that will be tested for support under both HTML5 and Flash. Each type is defined by a file extension and MIME types, and optionally, a list of related extensions (eg. MPEG-4 content can be in an .mp4 file, but may also be .aac, or .m4a.)

    - -

    Additionally, each format can be defined as "required", meaning that SM2 can fail to start if playback support is not found via either HTML5 or Flash. By default, MP3 is a required format.

    -
    soundManager.audioFormats = {
    -
    -  /**
    -   * determines HTML5 support + flash requirements.
    -   * if no support (via flash/HTML5) for "required" format, SM2 will fail to start.
    -   * flash fallback is used for MP3 or MP4 if lacking HTML5 (or preferFlash = true)
    -   * multiple MIME types may be tried looking for positive canPlayType() response.
    -   */
    -
    -  'mp3': {
    -    'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
    -    'required': true
    -  },
    -
    -  'mp4': {
    -    'related': ['aac','m4a'], // additional formats under the MP4 container
    -    'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
    -    'required': false
    -  },
    -
    -  'ogg': {
    -    'type': ['audio/ogg; codecs=vorbis'],
    -    'required': false
    -  },
    -
    -  'wav': {
    -    'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
    -    'required': false
    -  }
    -
    -};
    - -
    - - -
    - - -
    - -
    - -
    - -
    - -

    soundManager Global Object

    - -

    This is a collection of methods, properties and event handlers available via the soundManager Javascript object. Sound properties and methods can be set on a global (inherited) default, or per-sound basis.

    - -
    - - - -
    -
    canPlay:boolean canPlayMIME(MIMEtype:string)
    -
    Returns a boolean indicating whether soundManager can play the given MIME type - eg., audio/mp3. The types supported vary based on Flash version and MPEG4 (MovieStar mode) options.
    -
    - MIME type patterns are as follows: -
      -
    • Defaults: /^audio\/(?:x-)?(?:mp(?:eg|3))\s*;?/i; - eg. audio/mp3 or audio/mpeg
    • -
    • MovieStar-only formats: /^audio\/(?:x-)?(?:mp(?:eg|3)|mp4a-latm|aac|speex)\s*;?/i; - eg. audio/m4a or audio/aac
    • -
    -
    -
    Example: -
    // link example: <a id="song1" href="foo.php?songID=1" type="audio/mp3">play #1</a>
    -var aLink = document.getElementById('song1');
    -if (soundManager.canPlayMIME(aLink.type)) {
    - soundManager.createSound('song1Sound', aLink.href);
    -}
    -
    If no type attribute is found, this method will return null instead of false.
    -
    - -
    -
    canplay:boolean canPlayURL(mediaURL:string)
    -
    Returns a boolean indicating whether soundManager can play the given URL. Playability is determined by a matching URL pattern set at runtime, based on Flash version and MPEG4 (MovieStar mode) support.
    -
    Example: -
    var sURL = '/path/to/some.mp3';
    -if (soundManager.canPlayURL(sURL)) {
    - soundManager.createSound('fooSound', sURL);
    -}
    -
    If no href attribute is found, this method will return null instead of false.
    -
    - -
    -
    object:SMSound clearOnPosition(id:string, msecOffset:integer, [callback:function])
    -
    Clears the event listener set via onPosition(), in the same way it was registered. If the callback is omitted, any and all callbacks registered for the given offset will be cleared.
    -
    Example: soundManager.clearOnPosition('mySound', 3000, positionHandler);
    -
    Example 2: soundManager.clearOnPosition('mySound', 3000);
    -
    - -
    - -
    object:SMSound createSound(object:options)
    -
    Creates a sound object, supporting an arbitrary number of optional arguments. Returns a SMSound object instance. At minimum, a url parameter is required.
    -
    - Minimal example: -
    var someSound = soundManager.createSound({ 
    -  url: '/path/to/an.mp3'
    -});
    -
    -
    - With optional parameters: -
    var mySoundObject = soundManager.createSound({
    - // optional id, for getSoundById() look-ups etc. If omitted, an id will be generated.
    - id: 'mySound',
    - url: '/audio/mysoundfile.mp3',
    - // optional sound parameters here, see Sound Properties for full list
    - volume: 50,
    - autoPlay: true,
    - whileloading: function() { console.log(this.id + ' is loading'); }
    -});
    -

    Each createSound() call results in the creation of a SMSound object which stores all properties, methods and events relevant to that particular sound instance. If you keep the SMSound object in scope, you probably don't need to specify an ID. However, if you do provide an id, you can easily get a reference to the given sound via soundManager.getSoundById() (for the above example, you would use mySound.)

    -

    When specifying an id you can also use controller-level convenience methods, i.e., soundManager.play('mySound'), soundManager.stop('mySound') and so on.

    -

    Individual sound objects can also easily be referenced as returned from createSound():

    -
    var mySoundObject = soundManager.createSound({
    - url: '/audio/mysoundfile.mp3'
    -});
    -mySoundObject.play(); // SMSound object instance
    - -

    For more SMSound parameters, see Object Literal Format.

    -
    -
    If createSound is called with the ID of an existing sound, that sound object will be returned "as-is". Any other createSound options passed (eg., url or volume, etc.) will be ignored.
    - -
    - -
    -
    object:SMSound createSound(id:string, url:string) - overloaded method
    -
    Creates a sound with the specified ID and URL (simple two-parameter method.)
    -
    Example: soundManager.createSound('mySound','/audio/mysoundfile.mp3');
    -
    - -
    -
    destroySound(id:string)
    -
    Stops, unloads and destroys a sound specified by ID.
    -
    Example: soundManager.destroySound('mySound');
    -
    SMSound equivalent example: mySound.destruct();
    -
    - -
    -
    object:SMSound mute([id:string])
    -
    Mutes the sound specified by ID and returns that sound object. If no ID specified, all sounds will be muted and null is returned. Affects muted property (boolean.)
    -
    Example: soundManager.mute('mySound');
    -
    - -
    -
    object:SMSound onPosition(id:string, msecOffset:integer, callback:function, [scope])
    -
    Registers an event listener, fired when a sound reaches or passes a certain position while playing. Position being "listened" for is passed back to event handler. Will also fire if a sound is "rewound" (eg. via setPosition() to an earlier point) and the given position is reached again. Listeners will be removed if a sound is unloaded. An optional scope can be passed as well.
    -
    Note that for multiShot cases, only the first play instance's position is tracked in Flash; therefore, subsequent "shots" will not have onPosition() events being fired.
    -
    Example: soundManager.onPosition('mySound', 3000, function(eventPosition){console.log(this.id+' reached '+eventPosition});
    -
    - -
    -
    onready(callback:function, [scope])
    -
    Queues an event callback/handler for successful initialization and "ready to use" state of SoundManager 2. An optional scope parameter can be specified; if none, the callback is scoped to the window. If onready() is called after successful initialization, the callback will be executed immediately. The onready() queue is processed before soundManager.onload().
    -
    Example: -
    soundManager.onready(function() {
    -  alert('Yay, SM2 loaded OK!');	
    -});
    -
    -
    Queueing multiple handlers: soundManager.onready(myOnReadyHandler); soundManager.onready(myOtherHandler);
    -
    The same listener may be added multiple times; there is no duplicate checking. Queue is processed in order of addition.
    -
    If soundManager.reboot() is called, all listeners' "fired" flags will be reset and they will be eligible to fire again when SM2 starts.
    -
    This method can also be used via soundManager.setup({ onready: function() { ... } });
    -
    - -
    -
    ontimeout(callback:function, [scope])
    -
    Queues an event callback/handler for SM2 init failure, processed at (or immediately, if added after) SM2 initialization has failed, just before soundManager.onerror() is called. An optional scope parameter can be specified; if none, the callback is scoped to the window.
    -
    Additionally, a status object containing success and error->type parameters is passed as an argument to your callback.
    -
    Example: -
    soundManager.ontimeout(function(status) {
    -  alert('SM2 failed to start. Flash missing, blocked or security error?');
    -  alert('The status is ' + status.success + ', the error type is ' + status.error.type);
    -});
    -
    -
    Queueing multiple handlers: soundManager.ontimeout(myOnTimeoutHandler); soundManager.ontimeout(myOtherHandler);
    -
    The timeout event is not necessarily fatal, as SM2 may be rebooted and fire an onready() in the useFlashBlock case (where the user sees, and chooses to unblock the Flash component after a failed init attempt.)
    -
    The same listener may be added multiple times; there is no duplicate checking. Queue is processed in order of addition.
    -
    If soundManager.reboot() is called, all listeners' "fired" flags will be reset and they will be eligible to fire again when SM2 starts.
    -
    This method can also be used via soundManager.setup({ ontimeout: function() { ... } });
    -
    - -
    -
    object:SMSound play(id:string, [options object])
    -
    Starts playing the sound specified by ID. (Will start loading if applicable, and will play ASAP.)
    -
    Returns an SMSound (sound object) instance.
    -
    Example: soundManager.play('mySound');
    -
    Note that the second parameter, options object, is not required and can take almost any argument from the object literal format (eg. volume.) It is convenient when you wish to override the sound defaults for a single instance.
    -
    Example: soundManager.play('mySound',{volume:50,onfinish:playNextSound});
    -
    - -
    -
    object:SMSound pause(id:string)
    -
    Pauses the sound specified by ID. Does not toggle. Affects paused property (boolean.) Returns the given sound object.
    -
    Example: soundManager.pause('mySound');
    -
    - -
    -
    pauseAll()
    -
    Pauses all sounds whose playState is >0. Affects paused property (boolean.)
    -
    Example: soundManager.pauseAll();
    -
    - -
    -
    reboot()
    -
    Destroys any created SMSound objects, unloads the flash movie (removing it from the DOM) and restarts the SM2 init process, retaining all currently-set properties.
    -
    Example: -
    soundManager.ontimeout(function() {
    -  // Something went wrong during init - in this example, we *assume* flashblock etc.
    -  soundManager.flashLoadTimeout = 0; // When restarting, wait indefinitely for flash
    -  soundManager.onerror = {}; // Prevent an infinite loop, in case it's not flashblock
    -  soundManager.reboot(); // and, go!
    -});
    -
    -
    This method may be helpful when trying to gracefully recover from FlashBlock-type situations where the user has prevented the SWF from loading, but is able to whitelist it. For more ideas, see Flashblock demo.
    -
    When using this method also consider flashLoadTimeout, which can have SM2 wait indefinitely for the flash to load if desired.
    -
    - -
    -
    reset()
    -
    Effectively restores SoundManager's original state without rebooting (re-initializing).
    -
    Similar to reboot() which destroys sound objects and the flash movie (as applicable), but also nukes any registered onready() and related callbacks.
    -
    Once soundManager.reset() has been called, soundManager.beginDelayedInit() (or soundManager.setup() with a url property) may be called to re-init SM2.
    -
    - -
    -
    object:SMSound resume(id:string)
    -
    Resumes and returns the currently-paused sound specified by ID.
    -
    Example: soundManager.resume('mySound');
    -
    - -
    -
    resumeAll()
    -
    Resumes all currently-paused sounds.
    -
    Example: soundManager.resumeAll();
    -
    - -
    -
    object:SMSound setPan(id:string,volume:integer)
    -
    Sets the stereo pan (left/right bias) of the sound specified by ID, and returns the related sound object. Accepted values: -100 to 100 (L/R, 0 = center.) Affects pan property.
    -
    Example: soundManager.setPan('mySound',-80);
    -
    - -
    -
    object:SMSound setPosition(id:string,msecOffset:integer)
    -
    Seeeks to a given position within a sound, specified by miliseconds (1000 msec = 1 second) and returns the related sound object. Affects position property.
    -
    Example: soundManager.setPosition('mySound',2500);
    -
    Can only seek within loaded sound data, as defined by the duration property.
    -
    - -
    -
    object:SMSound setVolume(id:string, volume:integer)
    -
    Sets the volume of the sound specified by ID and returns the related sound object. Accepted values: 0-100. Affects volume property.
    -
    Example: soundManager.setVolume('mySound',50);
    -
    - -
    -
    object:SMSound stop(id:string)
    -
    Stops playing the sound specified by ID. Returns the related sound object.
    -
    Example: soundManager.stop('mySound');
    -
    - -
    -
    stopAll()
    -
    Stops any currently-playing sounds.
    -
    Example: soundManager.stopAll();
    -
    - -
    -
    object:SMSound toggleMute(id:string)
    -
    Mutes/unmutes the sound specified by ID. Returns the related sound object.
    -
    Example: soundManager.toggleMute('mySound');
    -
    - -
    -
    object:SMSound togglePause(id:string)
    -
    Pauses/resumes play on the sound specified by ID. Returns the related sound object.
    -
    Example: soundManager.togglePause('mySound');
    -
    - -
    -
    object:SMSound unload(id:string)
    -
    Stops loading the sound specified by ID, canceling any current HTTP request. Returns the related sound object.
    -
    Example: soundManager.unload('mySound');
    -
    Note that for Flash 8, SoundManager does this by pointing the sound object to about:blank, which replaces the current one from loading.
    -
    - -
    -
    object:SMSound unmute([id:string])
    -
    Unmutes the sound specified by ID. If no ID specified, all sounds will be unmuted. Affects muted property (boolean.) Returns the related sound object.
    -
    Example: soundManager.unmute('mySound');
    -
    - -
    -
    object:SMSound load(id:string, [options object])
    -
    Starts loading the sound specified by ID, with options if specified. Returns the related sound object.
    -
    Example: soundManager.load('mySound');
    -
    Example 2: soundManager.load('mySound',{volume:50,onfinish:playNextSound});
    -
    - -
    -
    object:SMSound getSoundById(id:string)
    -
    Returns an SMSound object specified by ID, or null if a sound with that ID is not found.
    -
    Example: var mySMSound = soundManager.getSoundById('mySound');
    -
    - -
    -
    number:bytesUsed getMemoryUse()
    -
    Returns the total number of bytes allocated to the Adobe Flash player or Adobe AIR, or 0 if unsupported (Flash 9+ only.) This number may include memory use across all tabs, browsers etc. See system.totalMemory (livedocs.adobe.com)
    -
    Example: var mbUsed = (soundManager.getMemoryUse()/1024/1024).toFixed(2); // eg. 12.05 MB
    -
    - -
    -
    isSupported:boolean ok() ( previous name: supported() )
    -
    Returns a boolean indicating whether soundManager has attempted to and succeeded in initialising. This function will return false if called before initialisation has occurred, and is useful when you want to create or play a sound without knowing SM2's current state.
    -
    Example: var isSupported = soundManager.ok();
    -
    - -
    - -
    - -
    - -
    - -
    - -

    Sound Object Methods

    - -

    Each sound under SoundManager 2 is given a SMSound object instance which includes the following events, methods and properties. Note that most methods will return the sound object instance, allowing for method chaining if desired.

    - -
    -
    object:SMSound clearOnPosition(msecOffset:integer, [callback:function])
    -
    Clears the event listener set via onPosition(), in the same way it was registered. If the callback is omitted, any and all callbacks registered for the given offset will be cleared.
    -
    Example: mySound.clearOnPosition(3000, positionHandler);
    -
    Example 2: mySound.clearOnPosition('mySound', 3000);
    -
    - -
    -
    destruct()
    -
    Stops, unloads and destroys a sound, freeing resources etc.
    -
    Example: mySound.destruct();
    -
    - -
    -
    object:SMSound load([options object])
    -
    Starts loading the given sound, with options if specified.
    -
    Example: mySound.load();
    -
    Example 2: mySound.load({volume:50,onfinish:playNextSound});
    -
    - -
    -
    object:SMSound mute()
    -
    Mutes the given sound. Affects muted property.
    -
    Example: mySound.mute();
    -
    - -
    -
    object:SMSound onPosition(msecOffset:integer, callback:function, [scope])
    -
    Registers an event listener, fired when a sound reaches or passes a certain position while playing. Position being "listened" for is passed back to event handler. Will also fire if a sound is "rewound" (eg. via setPosition() to an earlier point) and the given position is reached again. Listeners will be removed if a sound is unloaded. An optional scope can be passed as well.
    -
    Note that for multiShot cases, only the first play instance's position is tracked in Flash; therefore, subsequent "shots" will not have onPosition() events being fired.
    -
    Example: mySound.onPosition(3000, function(eventPosition){console.log(this.id+' reached '+eventPosition});
    -
    If you need to fire an event relative to the true duration of the sound, reference its duration once the sound has fully-loaded - ie., at or after the onload() event - as the duration will not be completely accurate until that time. durationEstimate may be referenced before onload(), but it should not be relied on when "precise" timings of say, < 1 second are desired.
    -
    Example:
    mySound.load({
    -  onload: function() {
    -    this.onPosition(this.duration * 0.5, function(eventPosition) {
    -      console.log('the sound ' + this.id + ' is now at position ' + this.position + ' (event position: ' + eventPosition + ')');
    -    });
    -  }
    -});
    -
    -
    Again, note that due to the interval / polling-based methods of both HTML5 and flash audio, sound status updates and thus precision can vary between 20 msec to perhaps 0.5 seconds and the sound's position property will reflect this delta when the onPosition() callback fires.
    - -
    - -
    -
    object:SMSound pause()
    -
    Pauses the given sound. (Does not toggle.) Affects paused property (boolean.)
    -
    Example: mySound.pause();
    -
    - -
    -
    object:SMSound play([options object])
    -
    Starts playing the given sound, with an optional options object. (Will start loading if applicable, and will play ASAP.)
    -
    Note that the options object parameter is not required and can take almost any argument from the object literal format (eg. volume.)
    -
    Example: mySound.play('mySound',{volume:50,onfinish:playNextSound});
    -
    - -
    -
    object:SMSound setPosition(msecOffset:integer)
    -
    Seeks to a given position within a sound, specified by miliseconds (1000 msec = 1 second.) Affects position property.
    -
    Example: mySound.setPosition(2500);
    -
    Can only seek within loaded sound data, as defined by the duration property.
    -
    - -
    -
    object:SMSound resume()
    -
    Resumes the currently-paused sound. Does not affect currently-playing sounds.
    -
    Example: mySound.resume();
    -
    - -
    -
    object:SMSound setPan(volume:integer)
    -
    Sets the stereo pan (left/right bias) of the given sound. Accepted values: -100 to 100 (L/R, 0 = center.) Affects pan property.
    -
    Example: mySound.setPan(-80);
    -
    - -
    -
    object:SMSound setVolume(volume:integer)
    -
    Sets the volume of the given sound. Accepted values: 0-100. Affects volume property.
    -
    Example: mySound.setVolume(50);
    -
    - -
    -
    object:SMSound toggleMute()
    -
    Mutes/unmutes the given sound. Affected muted property (boolean.)
    -
    Example: mySound.toggleMute();
    -
    - -
    -
    object:SMSound togglePause()
    -
    Pauses/resumes play of the given sound. Will also start a sound if it is has not yet been played.
    -
    Example: mySound.togglePause();
    -
    - -
    -
    object:SMSound stop()
    -
    Stops playing the given sound.
    -
    Example: mySound.stop();
    -
    - -
    -
    object:SMSound unload()
    -
    Stops loading the given sound, canceling any current HTTP request.
    -
    Example: mySound.unload();
    -
    Note that for Flash 8, SoundManager does this by pointing the sound object to about:blank, which replaces the current one from loading.
    -
    - -
    -
    object:SMSound unmute()
    -
    Unmutes the given sound. Affects muted property.
    -
    Example: mySound.unmute();
    -
    - -
    - -
    - -
    - -
    - -
    - -
    - -

    Sound Object Events

    - -

    Like native javascript objects, each SoundManager SMSound (sound instance) object can fire a number of onload-like events. Handlers cannot be "directly" assigned (eg. someSound.onload), but can be passed as option parameters to several sound methods.

    -
    -
    soundManager.play('mySound',{
    -  onfinish: function() {
    -    alert('The sound '+this.id+' finished playing.');
    -  }
    -});
    -
    -

    Event handlers are scoped to the relevant sound object, so the this keyword will point to the sound object on which the event fired such that its properties can easily be accessed - eg. within an SMSound event handler, this.id will give the sound ID.

    - -
    - -
    - -
    -
    onbufferchange()
    -
    Fires when a sound's reported buffering state has changed while playing and/or loading. The current state is reflected in the boolean isBuffering property.
    -
    Flash 9+ only. Related information on Adobe, Sound.isBuffering.
    -
    - -
    -
    ondataerror()
    -
    Fires at least once per sound play instance when Flash encounters a security error when trying to call computeSpectrum() internally. This typically happens when sounds are 'inaccessible' due to another Flash movie (eg. YouTube) in another tab which has loaded, and may (or may not be) playing sound. Flash attempts to read the "combined" output to the sound card, and must have security permissions for all sounds as a result. See areSoundsInaccessible() on Adobe for more info.
    -
    If the offending resource causing the security error is closed or becomes inactive(?), the data will become available again. Intermittent availability will result in intermittent calls to ondataerror().
    -
    - -
    -
    onbeforefinishcomplete()
    -
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    - -
    - -
    -
    onbeforefinish()
    -
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    - -
    - -
    -
    onconnect()
    -
    Fires when a sound using an RTMP serverURL property has attempted to connect, and has either succeeded or failed. Affects connected property. Once connected, a stream can be requested from the RTMP server.
    -
    Example: -
    var s = soundManager.createSound({
    -  id: 'rtmpTest',
    -  serverURL: 'rtmp://localhost/test/',
    -  url: 'song.mp3',
    -  onconnect: function(bConnect) {
    -    // this.connected can also be used
    -    soundManager._writeDebug(this.id+' connected: '+(bConnect?'true':'false'));
    -  }
    -}).play(); // will result in connection being made
    -
    -
    - -
    -
    onfinish()
    -
    Fires when a playing sound has reached its end. By this point, relevant properties like playState will have been reset to non-playing status.
    -
    - -
    -
    onid3()
    -
    Fires when ID3 data has been received. Relevant property is id3, which is an object literal (JSON)-style object. Only fields with data will be populated.
    -
    Note that ID3V2 data is located at the beginning (header) of an MP3 file and will load almost immediately, whereas ID3V1 data is at the end and will not be received until the MP3 has fully loaded.
    -
    - Example handler code: -
    -
    soundManager._writeDebug('sound '+this.id+' ID3 data received');
    -var prop = null;
    -var data = '';
    -for (prop in this.id3) {
    -  data += prop+': '+this.id3[prop]+','; // eg. title: Loser, artist: Beck
    -}
    -
    -
    -
    Refer to the Flash 8 Sound.id3 documentation for a list of ID3 properties.
    -
    When parsing ID3 data, it is best to check for the existance of ID3V1 data first, and apply ID3V2 if no matching ID3V1 data is defined. (V1 should "inherit" from V2, ideally, if available.)
    -
    Note that Flash's cross-domain security restrictions may prevent access to ID3 information, even though the MP3 itself can be loaded. (crossdomain.xml files on the remote host can grant Flash permission to access this.)
    -
    Also note some issues with parsing ID3 from iTunes.
    -
    - - -
    -
    onjustbeforefinish()
    -
    This method has been removed. Use the newer SMSound.onPosition() as a replacement.
    - -
    - -
    -
    onload(boolean:success)
    -
    Fires on sound load. Boolean reflects successful load (true), or fail/load from cache (false).
    -
    False value should seemingly only be for failure, but appears to be returned for load from cache as well. This strange behaviour comes from Flash. More detail may be available from the Flash 8 sound object documentation.
    -
    Failure can occur if the Flash sandbox (security) model is preventing access, for example loading SoundManager 2 on the local file system and trying to access an MP3 on a network (or internet) URL. (Security can be configured in the Flash security panel, [see here].)
    - -
    - -
    -
    onpause()
    -
    Fires when a sound pauses, eg. via sound.pause().
    -
    Example: soundManager.pause('mySound');
    -
    - -
    -
    onplay()
    -
    Fires when sound.play() is called.
    -
    - -
    -
    onresume()
    -
    Fires when a sound resumes playing, eg. via sound.resume().
    -
    Example: soundManager.resume('mySound');
    -
    - -
    -
    onsuspend()
    -
    HTML5-only event: Fires when a browser has chosen to stop downloading of an audio file.
    -
    Per spec: "The user agent is intentionally not currently fetching media data, but does not have the entire media resource downloaded."
    -
    One use case may be catching the behaviour where mobile Safari (iOS) will not auto-load or auto-play audio without user interaction, and using this event to show a message where the user can click/tap to start audio.
    -
    The HTML5 stalled event may also fire in desktop cases and might behave differently across browsers and platforms, so careful testing is recommended.
    -
    - -
    -
    onstop()
    -
    Fires when sound.stop() is explicitly called. For natural "sound finished" onfinish() case, see below.
    -
    - -
    -
    whileloading()
    -
    Fires at a regular interval when a sound is loading and new data has been received. The relevant, updated property is bytesLoaded.
    -
    Example handler code: soundManager._writeDebug('sound '+this.id+' loading, '+this.bytesLoaded+' of '+this.bytesTotal);
    -
    Note that the duration property starts from 0 and is updated during whileloading() to reflect the duration of currently-loaded sound data (ie. when a 4:00 MP3 has loaded 50%, the duration will be reported as 2:00 in milliseconds.) However, an estimate of final duration can be calculated using bytesLoaded, bytesTotal and duration while loading. Once fully-loaded, duration will reflect the true and accurate value.
    -
    - -
    -
    whileplaying()
    -
    Fires at a regular interval when a sound is playing, and a position (time) change is detected. The relevant, updated property is position.
    -
    Example handler code: soundManager._writeDebug('sound '+this.id+' playing, '+this.position+' of '+this.duration);
    -
    - -
    - -
    - -
    - - -
    - -
    - -
    - -

    Sound Object Properties

    -

    Each sound object inherits these properties from soundManager.defaultOptions. They can be set individually or at once when enclosed in object literal form to either createSound() or play().

    - -
    - -
    - -
    -
    id
    -
    Sound ID string as provided from the id parameter via createSound(). Can be referenced as this.id from within sound object event handlers such as onload(), whileloading() or whileplaying(), etc.
    -
    If an ID is known, the related SMSound object can be retrieved via getSoundById or directly referencing sounds[id] on the SoundManager global object.
    -
    Legacy note: The sound ID property used to be referenced as sID from within the sound object; this name is maintained for backward compatibility.
    -
    - -
    -
    url
    -
    The specified URL from which the sound is loaded, typically over HTTP. Can be referenced as this.url from within sound object event handlers such as onload() or whileplaying(), etc.
    -
    Experimental feature: Multiple formats/encodings can now be applied to the url parameter by specifying an array instead of a single string.
    -
    Example: -
    soundManager.createSound({
    -  id: 'foo',
    -  url: ['bar.ogg','bar.mp3']
    -});
    -
    SoundManager 2 will use the first playable URL it finds (according to canPlayURL() and/or canPlayType()), and the URL property will then reflect the playable URL after that point. Note that this means the original array data will be lost.
    -
    In this alternate format, the array accepts "type" attributes.
    -
    -
    soundManager.createSound({
    -  id: 'foo',
    -  // useful for URLs without obvious filetype extensions
    -  url: [
    -    {type:'audio/mp3',url:'/path/to/play.php?song=123'},
    -    {type:'audio/mp4',url:'/path/to/play.php?song=256'}
    -  ]
    -});
    -
    - -
    -
    serverURL
    -
    Note: Experimental feature. Only for use with RTMP streaming, ie., Flash Media Server and similar servers.
    -
    The RTMP server address which Flash will connect to using a NetStream object. Only the server address is specified here, when RTMP is in use; the url property is used to point to a specific resource on the server.
    -
    Example: -
    soundManager.createSound({
    -  id: 'mySound',
    -  serverURL: 'rtmp://localhost/rtmpDemo/', // RTMP server
    -  url: 'mysong.mp3' // path to stream
    -}).play();
    -
    - -
    -
    usePolicyFile
    -
    Boolean value (default: false) which instructs Flash, when loading MP3/MP4 content from remote/third party domains, to request example.com/crossdomain.xml first in order to determine permissions for access to metadata such as ID3 info, waveform, peak and/or spectrum data.
    -
    usePolicyFile will be automagically set to true if your sound options have an onid3() event handler, or uses sound data (peak/wave/spectrum) features. By default, Flash will not have access to this metadata on remote domains unless granted cross-domain security permissions via the crossdomain.xml file.
    -
    Consider additional HTTP traffic (albeit, perhaps with caching-like behaviour for subsequent checks?) and silent 404s in most cases given few hosts use crossdomain.xml files.
    -
    See Adobe's knowledge base for related ID3 + crossdomain.xml documentation.
    -
    - -
    - -
    - -
    - -

    Sound Object Dynamic Properties

    -

    Each sound includes a number of properties that are updated throughout the life of a sound - while loading or playing, for example. Many of these properties have related events that fire when they are updated, and should be treated as read-only.

    - -
    - -
    -
    buffered
    -
    Based loosely on the native HTML5 attribute, SM2 defines buffered as an array of objects which include start and end position (time) values. This property is updated during the SM2 whileloading event; internally, SM2 uses HTML5's progress event to track changes.
    -
    It is important to note that the buffered values may not always be contiguous and can change, particularly if the user seeks within the file during downloading. With ranges, you can draw highlighted segments on a progress bar UI which would reflect the current "slices" of buffered data.
    -
    Example: a buffered array of [{ start: 0, end: 2 }, { start: 5, end: 7 }]; shows a sound that has buffered data for the ranges 0-2 seconds, and 5-7 seconds.
    -
    In order to determine the total buffered data and thus "total percent loaded" under HTML5, you can loop through the buffered array and sum the total of (buffered[i].end - buffered[i].start). If you want to draw ranges, you can use the start and end values of each buffered item and draw that relative to the total duration (normalized as durationEstimate for flash compatibility).
    -
    Example: -
    var i, total = 0;
    -for (i=0, j=this.buffered.length; i<j; i++) {
    -  // draw current range in progress bar UI?
    -  drawProgressUI(this.buffered[i].start, this.buffered[i].end);
    -  // sum of all ranges vs. whole file duration
    -  total += (this.buffered[i].end - this.buffered[i].start);
    -}
    -
    -
    Note that under Flash, downloading is always sequential and thus the buffered array will always be a single item with start: 0 and an end value of duration (eg., the amount of currently-downloaded "time").
    -
    Additional behaviour note: A browser might download additional bytes of a sound in advance under HTML5, but may only update the buffered state to reflect the newly-downloaded range(s) when the "playback head" reaches near the end of the current buffer. This can also be affected if the user seeks within the file.
    -
    - -
    -
    bytesLoaded
    -
    The number of bytes currently received while loading a sound.
    -
    - -
    -
    bytesTotal
    -
    The total number of bytes to be downloaded, while loading a sound.
    -
    - -
    -
    didBeforeFinish
    -
    This property has been removed. Use the newer SMSound.onPosition() as a replacement.
    - -
    - -
    -
    didJustBeforeFinish
    -
    This property has been removed. Use the newer SMSound.onPosition() as a replacement.
    - -
    - -
    -
    duration
    -
    The current length of the sound, specified in milliseconds.
    -
    Note that during loading, this property reflects the length of downloaded data, not the full length, until completely loaded (see whileloading().) For an approximate "full duration" value while loading, see durationEstimate.
    -
    - -
    -
    durationEstimate
    -
    The estimated duration of the sound, specified in milliseconds.
    -
    Due to the dynamic nature of duration while loading, this attempts to provide the full duration by calculating parseInt((self.bytesTotal/self.bytesLoaded)*self.duration) and is updated with each whileloading() interval.
    -
    (Flash-only): Once the sound has fully loaded (onload() has fired), durationEstimate will be updated with the final, Flash-calculated value of duration.
    -
    Note that the durationEstimate method works only with Constant Bitrate (CBR)-encoded MP3s due to the consistent data/time assumption. VBR-encoded MP3s will give inaccurate results.
    -
    HTML5 behaviour: Both duration and durationEstimate are updated at regular intervals during loading of HTML5 audio, directly referencing the duration property provided on the native HTML5 object. Unlike Flash, HTML5 typically gets the true and final duration value by the time playback begins.
    -
    - -
    -
    eqData = {left:[], right: []}
    -
    Object containing two arrays of 256 floating-point (three decimal place) values from 0 to 1, the result of an FFT on the waveform data. Can be used to draw a spectrum (frequency range) graph while playing a sound. See Page-as-playlist demo for example implementation. Requires Flash 9+.
    -
    A spectrum frequency graph reflects the level of frequencies being played, from left to right, low to high (i.e., 0 to 20,000 Hz.)
    -
    eqData is set and updated during whileplaying(). A simple graph could be drawn by looping through the values and multiplying by a vertical scale value (eg. 32, thus a graph with peaks of 32 pixels.)
    -
    Example code: -
    someSoundObject.whileplaying = function() {
    -  // Move 256 absolutely-positioned 1x1-pixel DIVs, for example (ugly, but works)
    -  var gPixels = document.getElementById('graphPixels').getElementsByTagName('div');
    -  var gScale = 32; // draw 0 to 32px from bottom
    -  for (var i=0; i<256; i++) {
    -    graphPixels[i].style.top = (32-(gScale+Math.ceil(this.waveformData.left[i]*gScale)))+'px';
    -  }
    -}
    -
    -
    Related Adobe technical documentation (Flash 9/AS3 Sound() object): computeSpectrum()
    -
    Note: Flash security measures may deny access to waveformData when loading MP3s from remote domains.
    -
    Warning: This feature can eat up a lot of CPU in some cases. The amount of data passed from Flash to JS is not terribly large, but the JS-DOM updates and browser reflow can be expensive. Use with caution.
    -
    Backward compatibility note: Up to SoundManager 2.95a.20090717, eqData was a single array containing one channel of data. In newer versions this is unchanged, except the array now has .left[] and .right[] objects attached to it. To ensure future compatibility, use eqData.left[0] instead of eqData[0] and so on.
    -
    - -
    -
    id3
    -
    An object literal populated, if applicable, when ID3 data is received (related handler: onid3())
    -
    For property details, see onid3().
    -
    - -
    -
    isBuffering
    -
    Boolean value reflecting the buffering state of a playing or loading object. To be notified when this property changes, see onbufferchange().
    -
    Flash 9+ only. Related information on Adobe, Sound.isBuffering.
    -
    - -
    -
    isHTML5
    -
    Boolean property indicating whether a sound object is using HTML5 Audio for playback. Treat as read-only.
    -
    This should not really be relied on for anything, but it is provided as an indicator of support on a per-sound basis.
    -
    isHTML5 is set based on the URL provided to createSound(), and is updated when the URL changes.
    -
    - -
    -
    connected
    -
    Boolean value reflecting the state of an RTMP server connection (when serverURL is used to connect to a Flash Media Server or similar RTMP service.) Calls to load or play will result in a connection attempt being made, and onconnect() ultimately being called.
    -
    For example code using connected, see onconnect().
    -
    - -
    -
    loaded
    -
    Boolean value indicating load success as returned from Flash. True indicates success, False is a failure.
    -
    Because of the potential for false positives, duration and other properties could be checked as a test of whether sound data actually loaded. For more granular state information, see readyState.
    -
    - -
    -
    muted
    -
    Boolean indicating muted status. True/False.
    -
    Treat as read-only; use mute(), unmute() and toggleMute() methods to affect state.
    -
    - -
    -
    paused
    -
    Boolean indicating pause status. True/False.
    -
    Treat as read-only; use pause(), resume() and togglePause() methods to affect state.
    -
    - -
    -
    peakData = {left:0.0, right:0.0}
    -
    Object literal format including left and right properties with floating-point values ranging from 0 to 1, indicating "peak" (volume) level. Updated during whileplaying(). See Page-as-playlist demo as one example. Requires Flash 9+.
    -
    Example (within relevant sound object handler): -
    someSoundObject.whileplaying = function() {
    -  soundManager._writeDebug('Peaks, L/R: '+this.peakData.left+'/'+this.peakData.right);
    -}
    -
    - -
    -
    playState
    -
    Numeric value indicating the current playing state of the sound.
    -
    0 = stopped/uninitialised
    -
    1 = playing or buffering sound (play has been called, waiting for data etc.)
    -
    Note that a 1 may not always guarantee that sound is being heard, given buffering and autoPlay status.
    -
    - - -
    -
    position
    -
    The current location of the "play head" within the sound, specified in milliseconds (1 sec = 1000 msec).
    -
    - -
    -
    readyState
    -
    Numeric value indicating a sound's current load status
    -
    0 = uninitialised
    -
    1 = loading
    -
    2 = failed/error
    -
    3 = loaded/success
    -
    Under Flash, readyState will move from 0 to 1, and then change to 3 when the sound's onload() event fires (and all bytes have loade.)
    -
    Under HTML5, readyState will move from 0 to 1 when initializing the HTTP request (from load()), and will quickly change to 3 when the sound is ready to play. Note that HTML5 is buffer-based and onload() means "enough audio data has buffered to begin playback".
    -
    - -
    -
    type
    -
    A MIME type-like string eg. audio/mp3, used as a hint for SM2 to determine playability of a link with methods like canPlayURL().
    -
    This can be helpful when you have a sound URL that does not have an .mp3 extension, but serves MP3 data (eg., a PHP or other CGI script.)
    -
    Example: -
    var s = soundManager.createSound({
    -  id: 'aSound',
    -  url: '/path/to/some.php?songID=123',
    -  type: 'audio/mp3' // indicates an MP3 link, so SM2 can handle it appropriately
    -});
    -
    - -
    -
    waveformData = {left:[], right:[]}
    -
    Array of 256 floating-point (three decimal place) values from -1 to 1, can be used to draw a waveform while playing a sound. See Page-as-playlist demo for example implementation. Requires Flash 9+.
    -
    waveformData is set and updated during whileplaying(). A simple graph could be drawn by looping through the values and multiplying by a vertical scale value (eg. 32, which would make a graph with peaks of -32 and +32 pixels.)
    -
    Example code: -
    someSoundObject.whileplaying = function() {
    -  // Move 256 absolutely-positioned 1x1-pixel DIVs, for example (ugly, but works)
    -  var gPixels = document.getElementById('graphPixels').getElementsByTagName('div');
    -  var gScale = 32; // draw -32 to +32px from "zero" (i.e., center Y-axis point)
    -  for (var i=0; i<256; i++) {
    -    graphPixels[i].style.top = (gScale+Math.ceil(this.waveformData.left[i]*-gScale))+'px';
    -  }
    -}
    -
    -
    SM2 implementation note: waveformData contains both left and right channels, and the data represents a raw sound wave rather than a frequency spectrum.
    -
    Related Adobe technical documentation (Flash 9/AS3 Sound() object): computeSpectrum()
    -
    Note: Flash security measures may deny access to waveformData when loading MP3s from remote domains.
    -
    Warning: This feature can eat up a lot of CPU in some cases. The amount of data passed from Flash to JS is not terribly large, but the JS-DOM updates and browser reflow can be expensive. Use with caution.
    -
    - -
    - -
    - -
    - -
    - -
    - -
    -

    SMSound Object Methods

    -

    SoundManager provides wrappers for most SMSound methods - eg. soundManager.play('mySound') checks for a valid sound object, and then calls soundManager.sounds['mySound'].play() on that particular object; thus, it is the same as var sound = soundManager.getSoundById('mySound'); mySound.play();

    -

    The following methods can be called directly on a SMSound instance. The method calls are the same as the SoundManager global methods documented above for existing sound objects, minus the sound ID parameter.

    -
    - - - - -
    -
    - - - -
    - -
    - -
    - -

    SoundManager: Default Sound Options

    - -

    Sound objects inherit properties from soundManager.defaultOptions when they are created.

    -

    Sound parameters can be overridden on a per-sound basis at create time, or changed dynamically in some cases. Note that none of these options are required when calling createSound() except for id and url; the others will inherit the default values if unspecified.

    -

    soundManager.defaultOptions apply the properties and event handlers as specified above. Defaults are shown below as an example.

    - -
    soundManager.defaultOptions = {
    -  autoLoad: false,        // enable automatic loading (otherwise .load() will call with .play())
    -  autoPlay: false,        // enable playing of file ASAP (much faster if "stream" is true)
    -  from: null,             // position to start playback within a sound (msec), see demo
    -  loops: 1,               // number of times to play the sound. Related: looping (API demo)
    -  multiShot: true,        // let sounds "restart" or "chorus" when played multiple times..
    -  multiShotEvents: false, // allow events (onfinish()) to fire for each shot, if supported.
    -  onid3: null,            // callback function for "ID3 data is added/available"
    -  onload: null,           // callback function for "load finished"
    -  onstop: null,           // callback for "user stop"
    -  onfinish: null,         // callback function for "sound finished playing"
    -  onpause: null,          // callback for "pause"
    -  onplay: null,           // callback for "play" start
    -  onresume: null,         // callback for "resume" (pause toggle)
    -  position: null,         // offset (milliseconds) to seek to within downloaded sound.
    -  pan: 0,                 // "pan" settings, left-to-right, -100 to 100
    -  stream: true,           // allows playing before entire file has loaded (recommended)
    -  to: null,               // position to end playback within a sound (msec), see demo
    -  type: null,             // MIME-like hint for canPlay() tests, eg. 'audio/mp3'
    -  usePolicyFile: false,   // enable crossdomain.xml request for remote domains (for ID3/waveform access)
    -  volume: 100,            // self-explanatory. 0-100, the latter being the max.
    -  whileloading: null,     // callback function for updating progress (X of Y bytes received)
    -  whileplaying: null,     // callback during play (position update)
    -  // see optional flash 9-specific options, too
    -}
    -
    - -

    As a simple example, the following code would override the default autoPlay, pan and volume options for a given sound:

    - -
    soundManager.createSound({
    -  url: '/path/to/some.mp3',
    -  autoPlay: true,
    -  pan: -75,
    -  volume: 50
    -});
    - -

    Note: For live examples, see the code behind the "page as playlist" demo which uses much of this functionality.

    - -
    - -
    - -

    Sound Properties Object: Version-specific Options (Merging)

    - -

    Some sound properties object items (eg. usePeakData) are flash version-specific, non-default and are intentionally separated from soundManager.defaultOptions. Flash 9-specific options fall under this category.

    - -

    soundManager.flash9Options and soundManager.movieStarOptions are both defined as separate objects, and if supported according to flashVersion and defaultOptions parameters, are merged at the property level into soundManager.defaultOptions.

    - -
    // Note: These are merged into soundManager.defaultOptions when flashVersion = 9.
    -
    -soundManager.flash9Options = {
    -  isMovieStar: null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
    -  usePeakData: false,     // enable left/right channel peak (level) data
    -  useWaveformData: false, // enable sound spectrum (raw waveform data) - WARNING: May set CPUs on fire.
    -  useEQData: false,       // enable sound EQ (frequency spectrum data) - WARNING: Also CPU-intensive.
    -  onbufferchange: null,	  // callback for "isBuffering" property change
    -  ondataerror: null	  // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
    -}
    -
    -soundManager.movieStarOptions = {
    -  bufferTime: null  // seconds of data to buffer (null = flash default of 0.1 - if AAC gappy, try up to 3 seconds)
    -}
    -
    -// when merged, soundManager.flash9Options.isMovieStar -> soundManager.defaultOptions.isMovieStar, etc.
    - -
    - -
    - -
    - -
    - -
    - -
    - -

    SoundManager Dynamic (Runtime) Properties

    - -

    Some properties are dynamic, determined at initialisation or later during runtime, and should be treated as read-only.

    - - -

    soundManager.features Object

    - -

    As certain sound functionality is only available beginning with Flash 9, soundManager.features can provide a consistent way of checking for feature support.

    - -

    The structure (intended as read-only) is currently as follows:

    - -
    soundManager.features = {
    -  buffering: [boolean],
    -  peakData: [boolean],
    -  waveformData: [boolean],
    -  eqData: [boolean],
    -  movieStar: [boolean]
    -}
    - -

    Example (checking for peakData support):

    -
    if (soundManager.features.peakData) {
    -  // do peak data-related things here
    -}
    - -

    The features object is populated at initialisation time; the current feature support tests simply check the value of soundManager.flashVersion being >= 9. This object has been added in anticipation of additional features with future versions of Flash.

    - -
    - -

    soundManager.html5Only [boolean, read-only]

    -

    This property is set during initialization and reflects whether SM2 is running in "100% HTML5 mode", based on support for required formats defined by soundManager.audioFormats.

    - -
    - -
    - -
    - -
    - -
    - -

    SoundManager Core Events

    - -

    The following events are attached to the soundManager global object and are useful for detecting the success/failure of the API's initialisation.

    -

    Keep in mind that these core events are effectively asynchronous (ie., they may fire long before or after window.onload()) and therefore should not be relied on as the "ready" event for starting your application. Use the standard "DOM content loaded" or window load events for your own initialization routines.

    - -
    - -
    onready(callback:function(status),[scope])
    -
    Queue onload()-style event listener(s), triggered when soundManager has successfully started.
    -
    Example: soundManager.onready(myOnReadyHandler); soundManager.onready(myOtherHandler);
    -
    For more detail and examples, see soundManager.onready().
    - -
    ontimeout(callback:function(status),[scope])
    -
    Queue onload()-style event listener(s), triggered when soundManager has successfully started.
    -
    Example: soundManager.ontimeout(myOnTimeoutHandler); soundManager.ontimeout(myOtherHandler);
    -
    For more detail and examples, see soundManager.ontimeout().
    - -
    onerror(status)
    -
    Deprecation note: Use the newer soundManager.ontimeout() instead of this method.
    - - -
    oninitmovie()
    -
    Deprecation note: Use the newer soundManager.ontimeout() instead of this method.
    - -
    onload()
    - -
    Deprecation note: Use the newer soundManager.onready() instead of this method.
    - - -
    - -
    - - -
    -
    - -
    - -
    - -
    - -

    SoundManager Object Collections

    - -
    -
    soundIDs[]
    -
    An array of sound ID strings, ordered by creation. Can be used to iterate through sounds{} by ID.
    -
    sounds{}
    -
    An object literal/JSON-style instance of SMSound objects indexed by sound ID (as in sounds['mySound'] or sounds.mySound), used internally by SoundManager. soundManager.getSoundById() may be used as an alternate to directly accessing this object.
    -
    - -
    - -
    -
    - -
    - -
    - -
    - -

    Object Literal Format

    - -

    Sounds can be created with instance-specific parameters in an object literal (JSON) format, where omitted parameters inherit default values as defined in soundManager.

    - -
    soundManager.createSound({
    -  id: 'mySound',
    -  url: '/path/to/some.mp3',
    -  autoLoad: true,
    -  autoPlay: false,
    -  onload: function() {
    -    alert('The sound '+this.id+' loaded!');
    -  },
    -  volume: 50
    -});
    - -

    This object can also be passed as an optional argument to the play method, overriding options set at creation time.

    - -

    For a full list of available options, see Sound Properties Object

    - -
    - - -
    - -
    - - -
    - - -
    - - -
    - - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html deleted file mode 100755 index d8cd10af..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/resources/index.html +++ /dev/null @@ -1,243 +0,0 @@ - - - -SoundManager 2: Resources - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - -
    - -
    -

    Licensing

    -

    BSD licensed.

    -
    - -
    -

    SoundManager 2 License

    -

    SoundManager 2 is provided under a BSD license.

    -
    - -
    - - - - - -
    - - - -
    - - - -
    - -
    - -
    - - -
    - - -
    - - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html deleted file mode 100755 index 86972486..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/doc/technotes/index.html +++ /dev/null @@ -1,508 +0,0 @@ - - - -SoundManager 2: Technical Notes - - - - - - - - - - - - - - - - -
    - - - -
    - -
    - -
    - -
    -
    -
    - -
    -
    -
    - -
    - -
    - -
    -

    Requirements + Specifications

    -

    What SM2 needs, and how it works.

    -
    - -
    - -
    - -

    Requirements + Specifications

    - -

    Prerequisites (client)

    - -
      -
    • HTML5 Audio() support and/or Flash plugin, version 8 or higher
    • -
    • Supported web browser + platform
    • -
    - -

    Tested Browsers and Platforms

    - -
      -
    • Firefox (all versions), Windows/Mac
    • -
    • Safari 1.3+ (Mac) / All Windows versions
    • -
    • Mobile Webkit: iOS 4.0 devices, iPad 3.2 (original iPad iOS release) and newer
    • -
    • Android (2.3+, confirmed on 2.3.3.)
    • -
    • Google Chrome (all versions/OSes)
    • -
    • Internet Explorer 5.0+, Windows
    • -
    • Opera 9.10 (slightly buggy, 9.5+ ideal), Windows/Mac
    • -
    • Netscape 8.0+, Windows/Mac
    • -
    • Firefox 1.5+, Linux (Flash 9 beta)
    • -
    - -

    In the absence of native HTML5 audio support, JavaScript-to-flash communication is used to provide Flash-based audio playback. JS-to-flash is possible through Flash 8's ExternalInterface feature, which uses a standard browser plugin architecture implemented by each browser manufacturer (see NPAPI.)

    - -

    For further JS/flash reference, see Adobe's Flash 8 documentation, under the "ExternalInterface support" page which details supported browsers.

    - -

    Of course, not all possible combinations of browser/OS have been tested. Most modern browsers and devices should work reasonably well.

    - -
    - -
    - -

    Caveats + Limitations / FAQ

    - -
    - -
    - -

    Supported sound formats (MP3 via Flash 8 and MP4/M4A/AAC via Flash 9 "MovieStar", with caveats)

    -

    SM2 uses Flash's native Sound object for loading and managing sound, so it is subject to the same limitations that Flash 8 is. Perhaps a design decision, the Flash 8 sound object only supports MP3 files through the loadSound() ActionScript method. SM2 is not able to load other sound formats, including audio-only SWF files, due to this limitation. Refer to the Flash 8 documentation for details.

    - -

    MP3 Format Caveats

    -

    Additionally, some very low and very high bitrate MP3s, and Variable Bitrate (VBR) MP3s may play either too quickly or too slowly (see "the chipmunk problem"); if you are encountering this issue, try re-encoding at a different bitrate (between 64 kbps and 192 kbps, for example.) Using Constant Bitrate (CBR) encoding may also alleviate this problem.

    -

    It has been suggested that sample rates that are neither 22/44 KHz can also contribute to this issue. 44 KHz is the standard CD-spec sample rate, and is recommended for "hi-fi" recordings.

    - -

    Looping

    -

    Perhaps due to the way Flash dynamically loads and decodes MP3 data, seamless looping doesn't seem to be fully implemented. Loops have a noticeable gap between the finish and start. This has been an issue since the original version of SoundManager. Rather than have a broken feature, the funcionality has been omitted until a solid workaround is found.

    - -

    Flash 8 limitations with multiShot (overlaying/"chorus") effects

    -

    Regarding "layering" sounds (calling play() on a sound multiple times): Even though a multi-shot option can be specified, it does not work with Flash 8; a single instance of a sound can only have one timeline. The current behaviour is that when multiShot is specified and play() is called on a currently-playing sound, it will restart from the beginning without an overlay.

    -

    However, the API does provide some creative ways (onfinish for looping, multiple sound objects for multi-shot layering) of working around these Flash limitations.

    -

    It should be noted that sounds can loop seamlessly and be layered when linked and exported to SWF from within the Flash IDE, but SoundManager does not support SWF-based audio.

    - -

    Flash 9 multiShot capabilities

    -

    The Flash 9-based version of SoundManager2 can successfully layer sounds via "multiShot", truly playing a single sound multiple times on top of itself. However the API will only call certain timing-related methods such as whileplaying() for the first play() "instance" of the sound, to avoid confusion. By contrast, simpler methods such as onfinish() will be called multiple times, one for each instance of play().

    - -

    ID3 Parsing

    -

    ID3 data can differ in formatting, version and subsequently be oddly-parsed by Flash. Values may sometimes be repeated across different fields.

    -

    ID3 info seems to fail to load for iTunes 7-edited files, perhaps due to the format or inclusion of album artwork (image data.)

    - -

    Performance Notes: Caching + RAM Obeservations

    -

    Flash appears to use the browser cache (presumably the OS' native, or closest browser,) so the browser's cache size and other settings may affect Flash's cache behaviour. It is safe to assume a 100 MB MP3 will probably not be cached, for example, but a 16 MB one most likely will be.

    -

    MP3s appear to be loaded and stored in RAM while loading over HTTP, so memory use needs to be considered for both large MP3s and streaming radio-type applications.

    - -

    Timing/Latency (JS + Flash, ExternalInterface-related)

    -

    JavaScript-to-Flash communication is not instantaneous on slower systems, but can be much better on more modern systems. Latency (timing lag/delays) can be noted in some cases from function call to sound execution. It is possible some performance analysis can help to speed up this area for timing-critical applications involving animation etc., but this area has not been thoroughly investigated yet. Brad Neuberg has some notes on speeding up ExternalInterface which may be relevant.

    -

    Flash-to-OS/hardware latency (where flash reports progress, but no sound is heard for a number of milliseconds) may also be an unfortunate reality of Flash-based audio, varying between platform and OS version etc.

    -

    Additionally, MP3 files may contain audible gaps at the beginning or end by default when encoded, even if the source (eg. WAVE) file did not. Using optional "nogap" encoding options with programs such as LAME may help to remedy this.

    -

    Finally, the useHighPerformance option may help with JS/flash lag. Using this option causes the flash movie to be placed with position:fixed on-screen at all times (though in a small, hidden box) and has been shown to notably improve performance on Mac OS X. As well, flashPollingInterval will use a lower timer value, making polling calls run as quickly as reasonably possible and increasing the frequency of calls to whileplaying(), whileloading() and other time-related events.

    -

    Use these options with caution, as overly-aggressive intervals may hinder performance if event callbacks become too frequent.

    - -
    - -
    - -
    - -
    - -
    - -

    Serving to HTML5 + Flash Clients

    -

    A few notes on HTTP response headers, configuration and so forth.

    - -
    - -
    - -

    Tips for serving audio to HTML5 + Flash Clients

    -

    HTTP response headers from your server are important. Below is a brief list of recommended practices for serving audio content to clients using HTML5, and/or Flash.

    - -

    HTML5

    - -
      -
    • Likes Content-Length HTTP response headers (can affect duration and playback events if missing.)
    • -
    • Arbitrary seeking, dynamic loading/buffering works when the server supports Byte Serving via byte ranges, also known as HTTP partials / range requests. Without this support, behaviour falls back to a Flash-like single-connection, sequential/progressive-style download.
    • -
    • Likes a proper MIME type response from the server, e.g., audio/mpeg for MP3 content.
    • -
    - -

    Flash

    - -
      -
    • Likes Content-Length HTTP response headers. When missing, duration may be unknown and certain events like whileloading() / whileplaying() may not fire.
    • -
    • Does not care about MIME type or partials in server responses.
    • -
    - -

    In summary...

    - -

    Always serve a proper Content-Length HTTP response header. For HTML5, review that HTTP partials / range requests are enabled and that you are serving the correct MIME type in your response as well.

    -

    Never apply gzip or mod_deflate compression to binary assets. It causes playback problems, costs CPU and in some cases, may even increase the transfer size.

    - - -
    - -
    - -
    - -
    - -

    How Clients Download Audio

    -

    Progressive, sequential HTTP vs. HTTP 206 partials / range requests.

    - -
    - -
    - -

    How HTML5 + Flash Clients Download Audio

    - -

    In terms of HTTP, assets are typically requested and downloaded in sequential byte order over a single connection. Flash typically works this way, but HTML5 clients can use behaviours that are closer to streaming - instead, using multiple requests for pieces of data.

    - -

    Browsers can request audio from servers either sequentially or using Byte Serving (AKA "partials"), depending on client and server capabilities. The key difference is that with byte serving, clients request data in a "streaming" fashion and can buffer at will, therefore allowing arbitrary seeking, pausing and requesting of audio data in pieces - similar to how video playback typically works on YouTube, for example. Thus, preloading and onload() is less-meaningful when byte serving is involved.

    - -

    Traditional, "progressive" download (single request)

    - -

    The typical HTTP file download can be described as follows:

    - -
      -
    • Single HTTP request, one TCP connection
    • -
    • All bytes are sent sequentially "over the wire"
    • -
    • Network connection is closed when the download completes (or fails)
    • -
    • SoundManager 2 fires relevant sound onload() callback when the connection closes and the sound is deemed to be valid
    • -
    - -

    In terms of HTTP traffic, the sequence is something like this (excluding some headers for brevity):

    - -
      -
    • Client request -
        -
      • GET some.mp3 HTTP/1.1
      • -
      -
    • -
    • - Server response -
        -
      • HTTP/1.1 200 OK
      • -
      • Content-Length: 158958
      • -
      • Connection: close
      • -
      • Content-type: audio/mpeg
      • -
      -
    - -

    Progressive downloading behaviour in SoundManager 2

    - -

    This method is typically used by Flash when requesting audio via standard HTTP, and HTML5 clients in the event that Byte Serving (HTTP 206/Partial Content) is not implemented or cannot be negotiated.

    - -
      -
    • Playback begins after a small amount of buffering, once the download has started.
    • -
    • Once started, the download progress continues until all bytes are received. Stopping or pausing playback does not cancel the download.
    • -
    • During load, a SM2 sound object's whileloading() event will fire at a regular interval with bytesLoaded, bytesTotal and duration properties updating as the file progresses. Because Flash only reflects the "amount of duration loaded", durationEstimate is provided as a means of reflecting the total duration before load has completed (at which point duration is 100% and accurate.)
    • -
    • During load, the user can only seek within the amount of data (duration) downloaded.
    • -
    • onload() fires when the connection is closed, and all bytes have been received.
    • -
    - -

    Byte Serving (partials / byte range requests, "streaming"-style delivery)

    - -

    HTML5 clients will send a Accept-ranges: bytes header in the HTTP request for an audio asset to indicate their capability for Byte Serving, along with a Range header indicating what piece of the file to download.

    -

    If the server supports partials, it will reply with a HTTP/1.1 206 Partial Content header and a Content-Range header indicating the bytes it is going to send.

    -

    It appears that servers will return the whole range in the first response unless interrupted (and when a client requests a range of "0-" as in this case), but the initial connection may be dropped by the client if it wishes to stop "buffering" at any point, or if the user tries to seek to a new position in the audio that has not yet buffered.

    - -
      -
    • - Client request -
        -
      • GET some.mp3 HTTP/1.1
      • -
      • Range: bytes=0-
      • -
      -
    • -
    • - Server response -
        -
      • HTTP/1.1 206 Partial Content
      • -
      • Accept-ranges: bytes
      • -
      • Content-length: 4237566
      • -
      • Content-Range: bytes 0-4237565/7237566
      • -
      -
    • -
    • The first response includes all bytes in this case, but a client may drop this connection and make a new range request, if needed; for example, the user may seek to a new position in the file where data is not yet available, and the client will make a new request to buffer data beginning at the appropriate offset.
    • -
    - -

    HTTP/1.1 206 Partial Content request/response example

    - -
      -
    • - Client request -
        -
      • GET some.ogg HTTP/1.1
      • -
      • Range: bytes=5210604-5275910
      • -
      • If-Range: "508107-4d8a0b4e90d26"
      • -
      -
    • -
    • - Server response -
        -
      • HTTP/1.1 206 Partial Content
      • -
      • Accept-Ranges: bytes
      • -
      • Content-length: 65307
      • -
      • Content-Range: bytes 5210604-5275910/5275911
      • -
      • Content-Type: audio/ogg
      • -
      -
    • -
    - -

    Byte Serving behaviour in SoundManager 2

    - -

    Byte Serving is automatically negotiated between client and server, and offers a number of advantages over traditional downloads. Most notably, Byte Serving is closer to a "streaming" technology and enables clients to seek, buffer and resume playback at arbitrary positions within a file once the duration is known. Larger files benefit most from this technique, since they can be handled in smaller chunks vs. being held entirely in memory a la Flash.

    - -

    While SoundManager 2 uses the same events for HTML5 and Flash regardless of transport mechanism, there are some notable differences in SoundManager 2's behaviour when using HTML5 and Byte Serving.

    - -

    Most importantly, the concept of "loaded" (i.e., preloading data and waiting for onload()) with partials is irrelevant due to the way clients are able to pause, cancel and resume requests.

    - -
      -
    • Playback begins after a small amount of buffering, once the download has started.
    • -
    • The HTML5-native canplay() event fires when playback is ready to begin. This will cause SoundManager 2 to fire a sound's onload() callback. At this point, the sound's duration should be known, but the SM2-provided bytesLoaded and bytesTotal sound properties may not be known and thus are 0/0 during load time, and 1/1 if still undefined at load time.
    • -
    • SoundManager 2 attempts to fire whileloading() events as the HTML5-native progress() event fires, but keep in mind that any "bytes loaded" data may refer to blocks (i.e., buffered sequences of data) that are non-sequential and thus bytesLoaded and bytesTotal should not be relied on as an indicator of "total load progress".
    • -
    • HTML5 clients may use their own heuristic to determine how much to buffer, if and when to pause, cancel or resume requesting data.
    • -
    • Clients may request metadata from the end of a file in some cases, as with OGG formats, in order to determine information like the total duration of the sound.
    • -
    • During load (and once the duration is known), the user can seek to any position within the file.
    • -
    • A client may drop an open request in order to request a new byte range - for example, to buffer and resume playback if the user jumps to half-way through the file where that data has not been downloaded yet.
    • -
    - -
    - -
    - -
    - -
    -

    Mobile Device Limitations

    -

    Known restrictions, quirks and annoyances relating to HTML5 + mobile Webkit (iOS / Android) software.

    -
    - -
    -

    Mobile Device Restrictions, Quirks and Issues

    -

    Mobile devices tend to be somewhat limited in terms of battery life, network connection and other resources. Furthermore, they are unlike larger (laptop/desktop) devices in that audio is often not a "shareable" resource, and only one application may be using the sound hardware at any given time. Thus, mobile devices must be treated slightly differently in terms of playing audio via JavaScript.

    -

    iOS (mobile Safari/Webkit)

    -
      -
    • Sound play() calls are blocked by the OS unless in direct response to a user event like touch or click. ("Auto-play" attempts will be blocked, and the sound may fire a suspend event in this case.) For the curious, setTimeout() calls will also result in playback being blocked.
    • -
    • Sound load() and load-related methods may also have some limitations, similar to play().
    • -
    • Only one sound may be actively playing at a time. If an other sound (or application) is playing audio, it will be stopped by the OS in order to play the new sound.
    • -
    • Chained playback (sequential / playlist-style behaviour) works when using the onfinish event handler. Otherwise, blocking occurs.
    • -
    -

    Possible Alternatives

    -

    The Webkit Audio API (possibly a future standard as the Web Audio API) allows for low-level access, manipulation and control of audio from JavaScript. This API is mostly separate from the HTML5 audio API, but will ultimately allow for better fine-grained control and mixing of sound.

    -

    Once playback is allowed, the Webkit Audio API should be able to get around many of the current HTML5 audio limitations present on iOS including multiple sound playback, volume and pan control, and dynamic filtering / processing effects. However, the API is not a standard and is not consistently supported in Webkit, let alone other browsers.

    -

    SM2 does not presently use the Webkit Audio API. It may be experimentally or more formally added at some point in the future, when the API is more universally-supported.

    -
    - -
    - -
    - -
    -

    Debug + Console Output

    -

    Console-style messaging, useful for troubleshooting start-up and runtime issues.

    -
    - -
    -

    Live Debug Output

    -

    With debug mode enabled via soundManager.setup({debugMode: true}), SM2 can write helpful troubleshooting information to JavaScript console.log()-style interfaces. Additionally, output can be written to an optional DIV element with the ID of soundmanager-debug.

    -

    soundManager.setup({consoleOnly: true}) can be applied to disable HTML output (using console.log()-only methods) as well.

    -

    Additionally, debugging within the Flash portion of SM2 is also available and set using soundManager.setup({debugFlash: true}). Debug messages are written to the flash movie itself.

    -

    For info on SoundManager 2 loading/initialization failures and how to fix them, see troubleshooting.

    - -

    Below is a live example of debug output from SM2:

    - -
    -
    - -
    -
    - -

    Flash debug output, as applicable:

    - -
    - -
    -
    - -
    - - -
    - - - -
    - - - -
    - -
    - -
    - - -
    - - -
    - - -
    - - - - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html deleted file mode 100755 index 5058e802..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/index.html +++ /dev/null @@ -1,691 +0,0 @@ - - - -SoundManager 2: JavaScript Sound For The Web - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - -
    - - - -
    - -
    - -
    - -
    - - -
    -

    - SM2 options:  +html5 -  |  - -html5 -  |  - +debug -

    -
    - -
    - - -
    - -
    - -
    - -
    - -
    - -
    - -
    - SoundManager 2 speaker logo -
    - -

    SoundManager 2 makes it easier to play audio using JavaScript.

    - -

    - Using HTML5 and Flash, SoundManager 2 provides reliable cross-platform audio under a single JavaScript API.  Get SoundManager 2 -

    - -
    - -
    - -
    - -
    - -
    - -

    Speak and be heard

    -

    More sound, in more places

    - -

    Despite being one of the senses, sound has largely been missing from the web due to inconsistent technology support. SoundManager 2 bridges this gap, making it easier to use audio across a growing variety of devices and platforms, both desktop and mobile.

    - -

    Getting started is pretty easy, too.

    - -

    A few live examples:

    - -
    - -
    - -
    - -
    - - - -
    - Random -
    - - - - - -
    - -
    - coins.mp3 -    glass0.mp3 -    glass1.mp3 - - - -
    - -
    - -
    -
    - -
    - -
    - - -
    -
    - -

    HTML5 + flash hybrid

    -

    Complexity, reduced

    - -

    Supporting HTML5 audio can be tedious in modern browsers, let alone legacy ones. With real-world visitors using browsers ranging from mobile Safari to IE 6 across a wide range of devices, there can be many support cases to consider.

    - -

    SoundManager 2 gives you a single, powerful API that supports both new and old, using HTML5 audio where supported and optional Flash-based fallback where needed. Ideally when using SoundManager 2, audio "just works."

    - -
    -
      -
    • Desktop support: Windows, Mac OS, Linux
    • -
    • Laptop/tablet support: Windows, Mac OS, Linux / Blackberry Playbook, Kindle Fire + other HTML5/Flash devices
    • -
    • iPhone support: iOS 4.0 and newer
    • -
    • iPad support: Version 1.0 (iOS 3.2) and newer
    • -
    • Android OS supporting HTML5 and/or Flash (Version 2.3 or newer)
    • -
    - The details: how it works » -
    - -
    -
    - -
    -
    -

    The ginsu knife: 11 KB

    -

    Big features, small footprint

    -

    But wait, there's more!

    -

    Performance is an important metric, too. SoundManager 2 packs a comprehensive, feature-rich API into as little as 11 KB over the wire when optimized; that's less than 8% of the original, uncompressed file size.

    -

    SM2 is self-contained, having no external dependencies, and is compatible with popular JavaScript frameworks.

    -

    The source code is BSD-licensed and is provided in fully-commented, non-debug and compiler-optimized "minified" versions appropriate for development and production use.

    -
    -
    - -
    - - -
    - -
    -
    - -

    Basic

    -

    Playable links and playlists

    - -

    These demos use unordered lists with MP3 links that play in-place; the UI is easily customized via CSS.

    - - - - - -
    - -

    A richer playlist theme with optional time, seekable progress bar and a VU meter where supported:

    - - - - -
    -
    - -
    -
    - -

    Shiny

    -

    Data visualization features

    - -

    The 360° player UI demo uses <canvas> and includes options for waveform and spectrum analysis data via Flash 9, adding beautiful visual feedback to the interface.

    - -

    Seven Or Eight Days courtesy of Adrian Glynn, from the album Bruise. For more, see the music video.

    - - - - - -
    -
    - -
    - -
    - -

    Experimental

    -

    Advanced prototypes

    - -

    The Cassette Tape UI is a skinnable player based on the TDK MA-R90 cassette tape, a classic design from 1982.

    - -
    - Cassette Tape UI Prototype Screenshot -
    - -

    Remember Type IV, Metal & Chromium/CrO2? Those were the days.

    - -

    The "Wheels Of Steel" started as a simple CSS prototype, and evolved to replicate most of the UI and functionality of a traditional DJ set-up. Pitch bending, scratch and EQ effects are present where supported.

    -

    wheelsofsteel.net: Online turntable demo (screenshot)

    -

    The Wheels Of Steel, a browser-based DJ turntable prototype. For the tech details, read An Ode To Turntables (in HTML.)

    - -
    -
    - -
    - -
    - -
    -
    - -

    Getting started

    - -

    Basic SoundManager 2 set-up

    - -

    Including the script, configuring the url and registering an onready() callback:

    - -
    <script src="soundmanager2.js"></script>
    -<script>
    -soundManager.setup({
    -  // where to find flash audio SWFs, as needed
    -  url: '/path/to/swf-files/',
    -  onready: function() {
    -    // SM2 is ready to play audio!
    -  }
    -});
    -</script>
    - -

    Upon execution of soundmanager2.js, SM2 will determine what Flash SWF to load (if any) based on the path defined in soundManager.url.

    -

    After successful initialization, soundManager.onready() will fire and sounds can be played.

    -

    By default, SM2 uses a Flash 8-based SWF build. Some additional features are available when using the Flash 9-based build.

    - -

    For a live example, see the basic template demo.

    - -
    - -
    - - -
    - -
    - -

    Playing audio

    -

    Basic playback control

    - -

    Once soundManager.onready() has fired, sounds can be loaded and played.

    - -

    Creating and playing a sound object

    - -
    // create "mySound"...
    -var mySound = soundManager.createSound({
    -  url: '/path/to/an.mp3'
    -});
    -
    -// ...and play it
    -mySound.play();
    -
    - -

    Additional options and events can be specified when loading and playing sounds. For more examples of playback features, see API Demos.

    - -
    - -
    - -
    - -
    - -
    -
    - -

    Bonus

    -

    Additional demos

    - -

    - Examples using multi-track playback, progress and combinations of sound and animation: -

    - -
      - -
    • -

      Armor Alley (game)

      - Armor Alley: Web Prototype (demo screenshot) -
    • - -
    • -

      SURVIVOR remake

      - SURVIVOR (C64 game remake) demo screenshot -
    • - -
    • -

      Drum Machine

      - MPC (drum machine) demo screenshot -
    • - -
    • -

      Christmas Lights

      - Smash Christmas Lights demo -
    • - -
    - -

    "Audio sprites" (sound segments / samples) demo

    - -

    With sound playback options like from and to, you can play portions of a larger, single-file "sprite" of many sounds.

    - -

    - "Fitter, Happier" waveform screenshot -

    - - -

    - For more live examples, see the API Demos. -

    - -
    -
    - -
    -
    - -

    Elsewhere

    -

    As heard on TV the internets

    - -

    A few nifty places SoundManager 2 has been seen in use on the Wild World Web:

    - - - -

    Articles and presentations

    - -

    Some other words, pictures and video on the subject of HTML5 and web audio:

    - - - -

    Credits and thank-yous

    - -
      -
    • Icons: Desktop / mobile / iOS device iconography via glyphish.com (CC). Tile background: "Tiny Grid". Homepage header typeface: Chunk (Five) by Meredith Mandel (OFL).
    • -
    • Music: Seven Or Eight Days courtesy of Adrian Glynn. Graffiti Sex courtesy of The Fugitives, from the album In Streetlight Communion. I Tried and People Asking courtesy of SonReal.
    • -
    - -
    - -
    - - - - -
    - -
    - -
    -
    - -

    Technical overview

    - -

    HTML5 audio + optional Flash fallback

    - -
      -
    • 100% Flash-free audio on iPad, iPhone (iOS4) and other HTML5-enabled devices + browsers
    • -
    • Invisible Flash SWF provides HTML5 fallback as needed
    • -
    • API is consistent whether using HTML5 or Flash
    • -
    • See useHTML5Audio for implementation details
    • -
    - -
    -
    - -
    -
    - -

    API specifics

    -

    Basic API features (HTML5, Flash 8*)

    - -
      -
    • Load, stop, play, pause, mute, seek, pan*, volume control from JavaScript
    • -
    • Events: onload(), whileloading(), whileplaying(), onfinish() and more
    • -
    • ID3V1 + ID3V2 tag support for MP3s (title, artist, genre etc.)*
    • -
    - -
    - -

    Additional Flash 9-based API features

    - -
      -
    • RTMP / Flash Media Server streaming support (experimental) - see serverURL
    • -
    • MPEG-4 (AAC, HE-AAC, H.264) audio support
    • -
    • "MultiShot" play (layered/chorusing effects)
    • -
    • Waveform/frequency spectrum data
    • -
    • Peak (L/R channel volume) data
    • -
    • Audio buffering state/event handling
    • -
    - -
    -
    - -
    -
    - -

    Everything else

    -

    Documentation, tools and demos

    - - - -
    -

    Not only do you get the ginsu knife...

    -

    Even more demos and examples using the SoundManager 2 API...

    - - - -
    -
    - - - -
    - - - - -
    - -
    - -
     
    - - - -
    - - - -
    - -
    - - - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt deleted file mode 100755 index 1a17182f..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/license.txt +++ /dev/null @@ -1,29 +0,0 @@ -Software License Agreement (BSD License) - -Copyright (c) 2007, Scott Schiller (schillmania.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -* Neither the name of schillmania.com nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission from schillmania.com. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js deleted file mode 100755 index 7a645020..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-jsmin.js +++ /dev/null @@ -1,110 +0,0 @@ -/** @license - - - SoundManager 2: JavaScript Sound for the Web - ---------------------------------------------- - http://schillmania.com/projects/soundmanager2/ - - Copyright (c) 2007, Scott Schiller. All rights reserved. - Code provided under the BSD License: - http://schillmania.com/projects/soundmanager2/license.txt - - V2.97a.20131201 -*/ -(function(k,g){function fa(fa,wa){function ga(b){return c.preferFlash&&F&&!c.ignoreFlash&&c.flash[b]!==g&&c.flash[b]}function s(b){return function(d){var e=this._s;!e||!e._a?(e&&e.id?c._wD(e.id+": Ignoring "+d.type):c._wD(sb+"Ignoring "+d.type),d=null):d=b.call(this,d);return d}}this.setupOptions={url:fa||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3, -wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0,html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null, -usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null,ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1}, -opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1},wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=wa||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20131201";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns= -{flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features={buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={type:null,types:{remote:"remote (domain-based) rules",localWithFile:"local with file access (no internet access)",localWithNetwork:"local with network (internet access only, no local access)",localTrusted:"local, trusted (local+internet access)"},description:null,noRemote:null,noLocal:null};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only= -!1;var Va,c=this,Wa=null,l=null,sb="HTML5::",A,u=navigator.userAgent,U=k.location.href.toString(),p=document,xa,Xa,ya,m,G=[],za=!0,C,V=!1,W=!1,q=!1,t=!1,ha=!1,n,tb=0,X,B,Aa,O,Ba,M,P,Q,Ya,Ca,Da,ia,I,ja,Ea,R,Fa,Y,ka,la,S,Za,Ga,$a=["log","info","warn","error"],ab,Ha,bb,Z=null,Ia=null,r,Ja,T,cb,ma,na,J,w,$=!1,Ka=!1,db,eb,fb,oa=0,aa=null,pa,N=[],ba,z=null,gb,qa,ca,K,ra,La,hb,x,ib=Array.prototype.slice,E=!1,Ma,F,Na,jb,H,kb,Oa,sa,lb=0,ta=u.match(/(ipad|iphone|ipod)/i),mb=u.match(/android/i),L=u.match(/msie/i), -ub=u.match(/webkit/i),ua=u.match(/safari/i)&&!u.match(/chrome/i),Pa=u.match(/opera/i),Qa=u.match(/(mobile|pre\/|xoom)/i)||ta||mb,Ra=!U.match(/usehtml5audio/i)&&!U.match(/sm2\-ignorebadua/i)&&ua&&!u.match(/silk/i)&&u.match(/OS X 10_6_([3-7])/i),da=k.console!==g&&console.log!==g,Sa=p.hasFocus!==g?p.hasFocus():null,va=ua&&(p.hasFocus===g||!p.hasFocus()),nb=!va,ob=/(mp3|mp4|mpa|m4a|m4b)/i,ea=p.location?p.location.protocol.match(/http/i):null,pb=!ea?"http://":"",qb=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, -rb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),vb=RegExp("\\.("+rb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!ea;var Ta;try{Ta=Audio!==g&&(Pa&&opera!==g&&10>opera.version()?new Audio(null):new Audio).canPlayType!==g}catch(wb){Ta=!1}this.hasHTML5=Ta;this.setup=function(b){var d=!c.url;b!==g&&(q&&z&&c.ok()&&(b.flashVersion!==g||b.url!==g||b.html5Test!==g))&&J(r("setupLate"));Aa(b);b&&(d&&(Y&&b.url!==g)&&c.beginDelayedInit(), -!Y&&(b.url!==g&&"complete"===p.readyState)&&setTimeout(R,1));return c};this.supported=this.ok=function(){return z?q&&!t:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(c){return A(c)||p[c]||k[c]};this.createSound=function(b,d){function e(){f=ma(f);c.sounds[f.id]=new Va(f);c.soundIDs.push(f.id);return c.sounds[f.id]}var a,f;a=null;a="soundManager.createSound(): "+r(!q?"notReady":"notOK");if(!q||!c.ok())return J(a),!1;d!==g&&(b={id:b,url:d});f=B(b);f.url=pa(f.url);void 0===f.id&&(f.id=c.setupOptions.idPrefix+ -lb++);f.id.toString().charAt(0).match(/^[0-9]$/)&&c._wD("soundManager.createSound(): "+r("badID",f.id),2);c._wD("soundManager.createSound(): "+f.id+(f.url?" ("+f.url+")":""),1);if(w(f.id,!0))return c._wD("soundManager.createSound(): "+f.id+" exists",1),c.sounds[f.id];if(qa(f))a=e(),c._wD(f.id+": Using HTML5"),a._setup_html5(f);else{if(c.html5Only)return c._wD(f.id+": No HTML5 support for this sound, and no Flash. Exiting."),e();if(c.html5.usingFlash&&f.url&&f.url.match(/data\:/i))return c._wD(f.id+ -": data: URIs not supported via Flash. Exiting."),e();8a.instanceCount?(p(),e=a._setup_html5(),a.setPosition(a._iO.position),e.play()):(c._wD(a.id+": Cloning Audio() for instance #"+a.instanceCount+"..."),h=new Audio(a._iO.url),v=function(){x.remove(h,"ended",v);a._onfinish(a);ra(h);h=null},k=function(){x.remove(h,"canplay",k);try{h.currentTime=a._iO.position/1E3}catch(c){J(a.id+": multiShot play() failed to apply position of "+a._iO.position/1E3)}h.play()},x.add(h,"ended",v),void 0!==a._iO.volume&&(h.volume=Math.max(0,Math.min(1,a._iO.volume/ -100))),a.muted&&(h.muted=!0),a._iO.position?x.add(h,"canplay",k):h.play()):(y=l._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9===m&&!y&&(c._wD(e+"No sound hardware, or 32-sound ceiling hit",2),a._iO.onplayerror&&a._iO.onplayerror.apply(a)))}return a};this.stop=function(b){var d=a._iO;1===a.playState&&(c._wD(a.id+": stop()"),a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),Ua(),d.to&&a.clearOnPosition(d.to),a.isHTML5?a._a&&(b=a.position, -a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),v()):(l._stop(a.id,b),d.serverURL&&a.unload()),a.instanceCount=0,a._iO={},d.onstop&&d.onstop.apply(a));return a};this.setAutoPlay=function(b){c._wD(a.id+": Autoplay turned "+(b?"on":"off"));a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&(!a.instanceCount&&1===a.readyState)&&(a.instanceCount++,c._wD(a.id+": Incremented instance count to "+a.instanceCount)))};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition= -function(b){b===g&&(b=0);var d=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=d;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=d;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!==b){c._wD(a.id+": setPosition("+b+")");try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){c._wD(a.id+": setPosition("+b+") failed: "+e.message,2)}}}else if(b)return c._wD(a.id+": setPosition("+b+"): Cannot seek yet, sound not ready", -2),a;a.paused&&a._onTimer(!0)}}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;c._wD(a.id+": pause()");a.paused=!0;a.isHTML5?(a._setup_html5().pause(),v()):(b||b===g)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b=a._iO;if(!a.paused)return a;c._wD(a.id+": resume()");a.paused=!1; -a.playState=1;a.isHTML5?(a._setup_html5().play(),p()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){c._wD(a.id+": togglePause()");if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===g&&(b=0);c===g&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan=b; -c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,d){b===g&&(b=100);d===g&&(d=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;d||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==g;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id, -b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,d){D.push({position:parseInt(b,10),method:c,scope:d!==g?d:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-= -1;0<=b;b--)c=D[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=D.length;if(!b)return!1;for(b-=1;0<=b;b--)c=D[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};z=function(){var b=a._iO,d=b.from,e=b.to,f,g;g=function(){c._wD(a.id+': "To" time of '+e+" reached.");a.clearOnPosition(e,g);a.stop()};f=function(){c._wD(a.id+': Playing "from" '+d);if(null!==e&&!isNaN(e))a.onPosition(e,g)};null!==d&&!isNaN(d)&& -(b.position=d,b.multiShot=!1,f());return b};q=function(){var b,c=a._iO.onposition;if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};Ua=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};p=function(){a.isHTML5&&db(a)};v=function(){a.isHTML5&&eb(a)};f=function(b){b||(D=[],u=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate= -null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[];a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,g={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,E&&(Wa=c);a.isHTML5=!0;a._a=c;c._s=a;k();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};k=function(){if(a._a._added_events)return!1; -var b;a._a._added_events=!0;for(b in H)H.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,H[b],!1);return!0};h=function(){var b;c._wD(a.id+": Removing event listeners");a._a._added_events=!1;for(b in H)H.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,H[b],!1)};this._onload=function(b){var d=!!b||!a.isHTML5&&8===m&&a.duration;b=a.id+": ";c._wD(b+(d?"onload()":"Failed to load / invalid sound?"+(!a.duration?" Zero-length duration reported.":" -")+" ("+a.url+")"),d?1:2);!d&&!a.isHTML5&&(!0===c.sandbox.noRemote&& -c._wD(b+r("noNet"),1),!0===c.sandbox.noLocal&&c._wD(b+r("noLocal"),1));a.loaded=d;a.readyState=d?3:2;a._onbufferchange(0);a._iO.onload&&sa(a,function(){a._iO.onload.apply(a,[d])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&(c._wD(a.id+": Buffer state change: "+b),a._iO.onbufferchange.apply(a));return!0};this._onsuspend=function(){a._iO.onsuspend&&(c._wD(a.id+": Playback suspended"),a._iO.onsuspend.apply(a)); -return!0};this._onfailure=function(b,d,e){a.failures++;c._wD(a.id+": Failures \x3d "+a.failures);if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,d,e);else c._wD(a.id+": Ignoring failure")};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);if(a.instanceCount&&(a.instanceCount--,a.instanceCount||(Ua(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},v(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b))c._wD(a.id+ -": onfinish()"),sa(a,function(){b.apply(a)})};this._whileloading=function(b,c,d,e){var f=a._iO;a.bytesLoaded=b;a.bytesTotal=c;a.duration=Math.floor(d);a.bufferLength=e;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,d,e,f){var h=a._iO; -if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()? -new Audio(null):new Audio:null,e,a,f={},k,h;k=c.audioFormats;for(e in k)if(k.hasOwnProperty(e)&&(a="audio/"+e,f[e]=b(k[e].type),f[a]=f[e],e.match(ob)?(c.flash[e]=!0,c.flash[a]=!0):(c.flash[e]=!1,c.flash[a]=!1),k[e]&&k[e].related))for(h=k[e].related.length-1;0<=h;h--)f["audio/"+k[e].related[h]]=f[e],c.html5[k[e].related[h]]=f[e],c.flash[k[e].related[h]]=f[e];f.canPlayType=d?b:null;c.html5=B(c.html5,f);c.html5.usingFlash=gb();z=c.html5.usingFlash;return!0};I={notReady:"Unavailable - wait until onready() has fired.", -notOK:"Audio support is not available.",domError:"soundManagerexception caught while appending SWF to DOM.",spcWmode:"Removing wmode, preventing known SWF loading issue(s)",swf404:"soundManager: Verify that %s is a valid path.",tryDebug:"Try soundManager.debugFlash \x3d true for more security details (output goes to SWF.)",checkSWF:"See SWF output for more debug info.",localFail:"soundManager: Non-HTTP page ("+p.location.protocol+" URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/", -waitFocus:"soundManager: Special case: Waiting for SWF to load with window focus...",waitForever:"soundManager: Waiting indefinitely for Flash (will recover if unblocked)...",waitSWF:"soundManager: Waiting for 100% SWF load...",needFunction:"soundManager: Function object expected for %s",badID:'Sound ID "%s" should be a string, starting with a non-numeric character',currentObj:"soundManager: _debug(): Current sound objects",waitOnload:"soundManager: Waiting for window.onload()",docLoaded:"soundManager: Document already loaded", -onload:"soundManager: initComplete(): calling soundManager.onload()",onloadOK:"soundManager.onload() complete",didInit:"soundManager: init(): Already called?",secNote:"Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html",badRemove:"soundManager: Failed to remove Flash node.",shutdown:"soundManager.disable(): Shutting down", -queue:"soundManager: Queueing %s handler",smError:"SMSound.load(): Exception: JS-Flash communication failed, or JS error.",fbTimeout:"No flash response, applying .swf_timedout CSS...",fbLoaded:"Flash loaded",fbHandler:"soundManager: flashBlockHandler()",manURL:"SMSound.load(): Using manually-assigned URL",onURL:"soundManager.load(): current URL already assigned.",badFV:'soundManager.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',as2loop:"Note: Setting stream:false so looping can work (flash 8 limitation)", -noNSLoop:"Note: Looping not implemented for MovieStar formats",needfl9:"Note: Switching to flash 9, required for MP4 formats.",mfTimeout:"Setting flashLoadTimeout \x3d 0 (infinite) for off-screen, mobile flash case",needFlash:"soundManager: Fatal error: Flash is needed to play some required formats, but is not available.",gotFocus:"soundManager: Got window focus.",policy:"Enabling usePolicyFile for data access",setup:"soundManager.setup(): allowed parameters: %s",setupError:'soundManager.setup(): "%s" cannot be assigned with this method.', -setupUndef:'soundManager.setup(): Could not find option "%s"',setupLate:"soundManager.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().",noURL:"soundManager: Flash URL required. Call soundManager.setup({url:...}) to get started.",sm2Loaded:"SoundManager 2: Ready.",reset:"soundManager.reset(): Removing event callbacks",mobileUA:"Mobile UA detected, preferring HTML5 by default.",globalHTML5:"Using singleton HTML5 Audio() pattern for this device."};r=function(){var b, -c,e,a;b=ib.call(arguments);c=b.shift();if((a=I&&I[c]?I[c]:"")&&b&&b.length){c=0;for(e=b.length;cm)&&(c._wD(r("needfl9")),c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)":" (AS2/Flash 8)");8b&&(d=!0));setTimeout(function(){b=c.getMoviePercent();if(d)return $=!1,c._wD(r("waitSWF")),k.setTimeout(Q,1),!1;q||(c._wD("soundManager: No Flash response within expected time. Likely causes: "+(0===b?"SWF load failed, ":"")+"Flash blocked or JS-Flash security error."+(c.debugFlash? -" "+r("checkSWF"):""),2),!ea&&b&&(n("localFail",2),c.debugFlash||n("tryDebug",2)),0===b&&c._wD(r("swf404",c.url),1),C("flashtojs",!1,": Timed out"+ea?" (Check flash security or flash blockers)":" (No plugin/missing SWF?)"));!q&&nb&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?(c.useFlashBlock&&Ja(),n("waitForever")):!c.useFlashBlock&&ba?Ca():(n("waitForever"),M({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}})):0===c.flashLoadTimeout?n("waitForever"):!c.useFlashBlock&&ba?Ca(): -Ha(!0))},c.flashLoadTimeout)};ia=function(){if(Sa||!va)return x.remove(k,"focus",ia),!0;Sa=nb=!0;n("gotFocus");$=!1;Q();x.remove(k,"focus",ia);return!0};Oa=function(){N.length&&(c._wD("SoundManager 2: "+N.join(" "),1),N=[])};kb=function(){Oa();var b,d=[];if(c.useHTML5Audio&&c.hasHTML5){for(b in c.audioFormats)c.audioFormats.hasOwnProperty(b)&&d.push(b+" \x3d "+c.html5[b]+(!c.html5[b]&&z&&c.flash[b]?" (using flash)":c.preferFlash&&c.flash[b]&&z?" (preferring flash)":!c.html5[b]?" ("+(c.audioFormats[b].required? -"required, ":"")+"and no flash support)":""));c._wD("SoundManager 2 HTML5 support: "+d.join(", "),1)}};X=function(b){if(q)return!1;if(c.html5Only)return n("sm2Loaded"),q=!0,P(),C("onload",!0),!0;var d=!0,e;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())q=!0;e={type:!F&&z?"NO_FLASH":"INIT_TIMEOUT"};c._wD("SoundManager 2 "+(t?"failed to load":"loaded")+" ("+(t?"Flash security/load error":"OK")+")",t?2:1);t||b?(c.useFlashBlock&&c.oMC&&(c.oMC.className=T()+" "+(null===c.getMoviePercent()? -"swf_timedout":"swf_error")),M({type:"ontimeout",error:e,ignoreInit:!0}),C("onload",!1),S(e),d=!1):C("onload",!0);t||(c.waitForWindowLoad&&!ha?(n("waitOnload"),x.add(k,"load",P)):(c.waitForWindowLoad&&ha&&n("docLoaded"),P()));return d};Xa=function(){var b,d=c.setupOptions;for(b in d)d.hasOwnProperty(b)&&(c[b]===g?c[b]=d[b]:c[b]!==d[b]&&(c.setupOptions[b]=c[b]))};ya=function(){if(q)return n("didInit"),!1;if(c.html5Only)return q||(x.remove(k,"load",c.beginDelayedInit),c.enabled=!0,X()),!0;ja();try{l._externalInterfaceTest(!1), -Za(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,C("jstoflash",!0),c.html5Only||x.add(k,"unload",xa)}catch(b){return c._wD("js/flash exception: "+b.toString()),C("jstoflash",!1),S({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),Ha(!0),X(),!1}X();x.remove(k,"load",c.beginDelayedInit);return!0};R=function(){if(Y)return!1;Y=!0;Xa();Ga();var b=null,b=null,d=U.toLowerCase();-1!==d.indexOf("sm2-usehtml5audio\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-usehtml5audio\x3d")+ -18),da&&console.log((b?"Enabling ":"Disabling ")+"useHTML5Audio via URL parameter"),c.setup({useHTML5Audio:b}));-1!==d.indexOf("sm2-preferflash\x3d")&&(b="1"===d.charAt(d.indexOf("sm2-preferflash\x3d")+16),da&&console.log((b?"Enabling ":"Disabling ")+"preferFlash via URL parameter"),c.setup({preferFlash:b}));!F&&c.hasHTML5&&(c._wD("SoundManager 2: No Flash detected"+(!c.useHTML5Audio?", enabling HTML5.":". Trying HTML5-only mode."),1),c.setup({useHTML5Audio:!0,preferFlash:!1}));hb();!F&&z&&(N.push(I.needFlash), -c.setup({flashLoadTimeout:1}));p.removeEventListener&&p.removeEventListener("DOMContentLoaded",R,!1);ja();return!0};La=function(){"complete"===p.readyState&&(R(),p.detachEvent("onreadystatechange",La));return!0};Fa=function(){ha=!0;x.remove(k,"load",Fa)};Ea=function(){if(Qa&&((!c.setupOptions.useHTML5Audio||c.setupOptions.preferFlash)&&N.push(I.mobileUA),c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ta||mb&&!u.match(/android\s2\.3/i)))N.push(I.globalHTML5),ta&&(c.ignoreFlash=!0),E= -!0};Ea();Na();x.add(k,"focus",ia);x.add(k,"load",Q);x.add(k,"load",Fa);p.addEventListener?p.addEventListener("DOMContentLoaded",R,!1):p.attachEvent?p.attachEvent("onreadystatechange",La):(C("onload",!1),S({type:"NO_DOM2_EVENTS",fatal:!0}))}var wa=null;if(void 0===k.SM2_DEFER||!SM2_DEFER)wa=new fa;k.SoundManager=fa;k.soundManager=wa})(window); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js deleted file mode 100755 index d7227094..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug-jsmin.js +++ /dev/null @@ -1,81 +0,0 @@ -/** @license - * - * SoundManager 2: JavaScript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code provided under the BSD License: - * http://schillmania.com/projects/soundmanager2/license.txt - * - * V2.97a.20131201 - */ -(function(g,k){function U(U,ka){function V(b){return c.preferFlash&&v&&!c.ignoreFlash&&c.flash[b]!==k&&c.flash[b]}function q(b){return function(c){var d=this._s;return!d||!d._a?null:b.call(this,c)}}this.setupOptions={url:U||null,flashVersion:8,debugMode:!0,debugFlash:!1,useConsole:!0,consoleOnly:!0,waitForWindowLoad:!1,bgColor:"#ffffff",useHighPerformance:!1,flashPollingInterval:null,html5PollingInterval:null,flashLoadTimeout:1E3,wmode:null,allowScriptAccess:"always",useFlashBlock:!1,useHTML5Audio:!0, -html5Test:/^(probably|maybe)$/i,preferFlash:!1,noSWFCache:!1,idPrefix:"sound"};this.defaultOptions={autoLoad:!1,autoPlay:!1,from:null,loops:1,onid3:null,onload:null,whileloading:null,onplay:null,onpause:null,onresume:null,whileplaying:null,onposition:null,onstop:null,onfailure:null,onfinish:null,multiShot:!0,multiShotEvents:!1,position:null,pan:0,stream:!0,to:null,type:null,usePolicyFile:!1,volume:100};this.flash9Options={isMovieStar:null,usePeakData:!1,useWaveformData:!1,useEQData:!1,onbufferchange:null, -ondataerror:null};this.movieStarOptions={bufferTime:3,serverURL:null,onconnect:null,duration:null};this.audioFormats={mp3:{type:['audio/mpeg; codecs\x3d"mp3"',"audio/mpeg","audio/mp3","audio/MPA","audio/mpa-robust"],required:!0},mp4:{related:["aac","m4a","m4b"],type:['audio/mp4; codecs\x3d"mp4a.40.2"',"audio/aac","audio/x-m4a","audio/MP4A-LATM","audio/mpeg4-generic"],required:!1},ogg:{type:["audio/ogg; codecs\x3dvorbis"],required:!1},opus:{type:["audio/ogg; codecs\x3dopus","audio/opus"],required:!1}, -wav:{type:['audio/wav; codecs\x3d"1"',"audio/wav","audio/wave","audio/x-wav"],required:!1}};this.movieID="sm2-container";this.id=ka||"sm2movie";this.debugID="soundmanager-debug";this.debugURLParam=/([#?&])debug=1/i;this.versionNumber="V2.97a.20131201";this.altURL=this.movieURL=this.version=null;this.enabled=this.swfLoaded=!1;this.oMC=null;this.sounds={};this.soundIDs=[];this.didFlashBlock=this.muted=!1;this.filePattern=null;this.filePatterns={flash8:/\.mp3(\?.*)?$/i,flash9:/\.mp3(\?.*)?$/i};this.features= -{buffering:!1,peakData:!1,waveformData:!1,eqData:!1,movieStar:!1};this.sandbox={};this.html5={usingFlash:null};this.flash={};this.ignoreFlash=this.html5Only=!1;var Ja,c=this,Ka=null,l=null,W,s=navigator.userAgent,La=g.location.href.toString(),n=document,la,Ma,ma,m,x=[],K=!1,L=!1,p=!1,y=!1,na=!1,M,w,oa,X,pa,D,E,F,Na,qa,ra,Y,sa,Z,ta,G,ua,N,va,$,H,Oa,wa,Pa,xa,Qa,O=null,ya=null,P,za,I,aa,ba,r,Q=!1,Aa=!1,Ra,Sa,Ta,ca=0,R=null,da,Ua=[],S,u=null,Va,ea,T,z,fa,Ba,Wa,t,fb=Array.prototype.slice,A=!1,Ca,v,Da, -Xa,B,ga,Ya=0,ha=s.match(/(ipad|iphone|ipod)/i),Za=s.match(/android/i),C=s.match(/msie/i),gb=s.match(/webkit/i),ia=s.match(/safari/i)&&!s.match(/chrome/i),Ea=s.match(/opera/i),Fa=s.match(/(mobile|pre\/|xoom)/i)||ha||Za,$a=!La.match(/usehtml5audio/i)&&!La.match(/sm2\-ignorebadua/i)&&ia&&!s.match(/silk/i)&&s.match(/OS X 10_6_([3-7])/i),Ga=n.hasFocus!==k?n.hasFocus():null,ja=ia&&(n.hasFocus===k||!n.hasFocus()),ab=!ja,bb=/(mp3|mp4|mpa|m4a|m4b)/i,Ha=n.location?n.location.protocol.match(/http/i):null,cb= -!Ha?"http://":"",db=/^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,eb="mpeg4 aac flv mov mp4 m4v f4v m4a m4b mp4v 3gp 3g2".split(" "),hb=RegExp("\\.("+eb.join("|")+")(\\?.*)?$","i");this.mimePattern=/^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i;this.useAltURL=!Ha;var Ia;try{Ia=Audio!==k&&(Ea&&opera!==k&&10>opera.version()?new Audio(null):new Audio).canPlayType!==k}catch(ib){Ia=!1}this.hasHTML5=Ia;this.setup=function(b){var e=!c.url;b!==k&&p&&u&&c.ok();oa(b);b&& -(e&&(N&&b.url!==k)&&c.beginDelayedInit(),!N&&(b.url!==k&&"complete"===n.readyState)&&setTimeout(G,1));return c};this.supported=this.ok=function(){return u?p&&!y:c.useHTML5Audio&&c.hasHTML5};this.getMovie=function(b){return W(b)||n[b]||g[b]};this.createSound=function(b,e){function d(){a=aa(a);c.sounds[a.id]=new Ja(a);c.soundIDs.push(a.id);return c.sounds[a.id]}var a,f=null;if(!p||!c.ok())return!1;e!==k&&(b={id:b,url:e});a=w(b);a.url=da(a.url);void 0===a.id&&(a.id=c.setupOptions.idPrefix+Ya++);if(r(a.id, -!0))return c.sounds[a.id];if(ea(a))f=d(),f._setup_html5(a);else{if(c.html5Only||c.html5.usingFlash&&a.url&&a.url.match(/data\:/i))return d();8a.instanceCount?(n(),f=a._setup_html5(),a.setPosition(a._iO.position),f.play()):(h=new Audio(a._iO.url),g=function(){t.remove(h,"ended",g);a._onfinish(a);fa(h);h=null},J=function(){t.remove(h,"canplay",J);try{h.currentTime=a._iO.position/1E3}catch(b){}h.play()},t.add(h,"ended",g),void 0!==a._iO.volume&&(h.volume=Math.max(0,Math.min(1,a._iO.volume/100))),a.muted&&(h.muted=!0),a._iO.position? -t.add(h,"canplay",J):h.play()):(f=l._start(a.id,a._iO.loops||1,9===m?a.position:a.position/1E3,a._iO.multiShot||!1),9===m&&!f&&a._iO.onplayerror&&a._iO.onplayerror.apply(a))}return a};this.stop=function(b){var c=a._iO;1===a.playState&&(a._onbufferchange(0),a._resetOnPosition(0),a.paused=!1,a.isHTML5||(a.playState=0),x(),c.to&&a.clearOnPosition(c.to),a.isHTML5?a._a&&(b=a.position,a.setPosition(0),a.position=b,a._a.pause(),a.playState=0,a._onTimer(),g()):(l._stop(a.id,b),c.serverURL&&a.unload()),a.instanceCount= -0,a._iO={},c.onstop&&c.onstop.apply(a));return a};this.setAutoPlay=function(b){a._iO.autoPlay=b;a.isHTML5||(l._setAutoPlay(a.id,b),b&&!a.instanceCount&&1===a.readyState&&a.instanceCount++)};this.getAutoPlay=function(){return a._iO.autoPlay};this.setPosition=function(b){b===k&&(b=0);var c=a.isHTML5?Math.max(b,0):Math.min(a.duration||a._iO.duration,Math.max(b,0));a.position=c;b=a.position/1E3;a._resetOnPosition(a.position);a._iO.position=c;if(a.isHTML5){if(a._a){if(a._html5_canplay){if(a._a.currentTime!== -b)try{a._a.currentTime=b,(0===a.playState||a.paused)&&a._a.pause()}catch(e){}}else if(b)return a;a.paused&&a._onTimer(!0)}}else b=9===m?a.position:b,a.readyState&&2!==a.readyState&&l._setPosition(a.id,b,a.paused||!a.playState,a._iO.multiShot);return a};this.pause=function(b){if(a.paused||0===a.playState&&1!==a.readyState)return a;a.paused=!0;a.isHTML5?(a._setup_html5().pause(),g()):(b||b===k)&&l._pause(a.id,a._iO.multiShot);a._iO.onpause&&a._iO.onpause.apply(a);return a};this.resume=function(){var b= -a._iO;if(!a.paused)return a;a.paused=!1;a.playState=1;a.isHTML5?(a._setup_html5().play(),n()):(b.isMovieStar&&!b.serverURL&&a.setPosition(a.position),l._pause(a.id,b.multiShot));!s&&b.onplay?(b.onplay.apply(a),s=!0):b.onresume&&b.onresume.apply(a);return a};this.togglePause=function(){if(0===a.playState)return a.play({position:9===m&&!a.isHTML5?a.position:a.position/1E3}),a;a.paused?a.resume():a.pause();return a};this.setPan=function(b,c){b===k&&(b=0);c===k&&(c=!1);a.isHTML5||l._setPan(a.id,b);a._iO.pan= -b;c||(a.pan=b,a.options.pan=b);return a};this.setVolume=function(b,e){b===k&&(b=100);e===k&&(e=!1);a.isHTML5?a._a&&(c.muted&&!a.muted&&(a.muted=!0,a._a.muted=!0),a._a.volume=Math.max(0,Math.min(1,b/100))):l._setVolume(a.id,c.muted&&!a.muted||a.muted?0:b);a._iO.volume=b;e||(a.volume=b,a.options.volume=b);return a};this.mute=function(){a.muted=!0;a.isHTML5?a._a&&(a._a.muted=!0):l._setVolume(a.id,0);return a};this.unmute=function(){a.muted=!1;var b=a._iO.volume!==k;a.isHTML5?a._a&&(a._a.muted=!1):l._setVolume(a.id, -b?a._iO.volume:a.options.volume);return a};this.toggleMute=function(){return a.muted?a.unmute():a.mute()};this.onposition=this.onPosition=function(b,c,e){p.push({position:parseInt(b,10),method:c,scope:e!==k?e:a,fired:!1});return a};this.clearOnPosition=function(a,b){var c;a=parseInt(a,10);if(isNaN(a))return!1;for(c=0;c=b)return!1;for(b-= -1;0<=b;b--)c=p[b],!c.fired&&a.position>=c.position&&(c.fired=!0,u++,c.method.apply(c.scope,[c.position]));return!0};this._resetOnPosition=function(a){var b,c;b=p.length;if(!b)return!1;for(b-=1;0<=b;b--)c=p[b],c.fired&&a<=c.position&&(c.fired=!1,u--);return!0};y=function(){var b=a._iO,c=b.from,e=b.to,d,f;f=function(){a.clearOnPosition(e,f);a.stop()};d=function(){if(null!==e&&!isNaN(e))a.onPosition(e,f)};null!==c&&!isNaN(c)&&(b.position=c,b.multiShot=!1,d());return b};q=function(){var b,c=a._iO.onposition; -if(c)for(b in c)if(c.hasOwnProperty(b))a.onPosition(parseInt(b,10),c[b])};x=function(){var b,c=a._iO.onposition;if(c)for(b in c)c.hasOwnProperty(b)&&a.clearOnPosition(parseInt(b,10))};n=function(){a.isHTML5&&Ra(a)};g=function(){a.isHTML5&&Sa(a)};f=function(b){b||(p=[],u=0);s=!1;a._hasTimer=null;a._a=null;a._html5_canplay=!1;a.bytesLoaded=null;a.bytesTotal=null;a.duration=a._iO&&a._iO.duration?a._iO.duration:null;a.durationEstimate=null;a.buffered=[];a.eqData=[];a.eqData.left=[];a.eqData.right=[]; -a.failures=0;a.isBuffering=!1;a.instanceOptions={};a.instanceCount=0;a.loaded=!1;a.metadata={};a.readyState=0;a.muted=!1;a.paused=!1;a.peakData={left:0,right:0};a.waveformData={left:[],right:[]};a.playState=0;a.position=null;a.id3={}};f();this._onTimer=function(b){var c,f=!1,h={};if(a._hasTimer||b){if(a._a&&(b||(0opera.version()?new Audio(null):new Audio,c=a._a,c._called_load=!1,A&&(Ka=c);a.isHTML5=!0;a._a=c;c._s=a;h();a._apply_loop(c,b.loops);b.autoLoad||b.autoPlay?a.load():(c.autobuffer=!1,c.preload="auto");return c};h=function(){if(a._a._added_events)return!1;var b;a._a._added_events=!0;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.addEventListener(b,B[b],!1);return!0};J=function(){var b;a._a._added_events= -!1;for(b in B)B.hasOwnProperty(b)&&a._a&&a._a.removeEventListener(b,B[b],!1)};this._onload=function(b){var c=!!b||!a.isHTML5&&8===m&&a.duration;a.loaded=c;a.readyState=c?3:2;a._onbufferchange(0);a._iO.onload&&ga(a,function(){a._iO.onload.apply(a,[c])});return!0};this._onbufferchange=function(b){if(0===a.playState||b&&a.isBuffering||!b&&!a.isBuffering)return!1;a.isBuffering=1===b;a._iO.onbufferchange&&a._iO.onbufferchange.apply(a);return!0};this._onsuspend=function(){a._iO.onsuspend&&a._iO.onsuspend.apply(a); -return!0};this._onfailure=function(b,c,e){a.failures++;if(a._iO.onfailure&&1===a.failures)a._iO.onfailure(a,b,c,e)};this._onfinish=function(){var b=a._iO.onfinish;a._onbufferchange(0);a._resetOnPosition(0);a.instanceCount&&(a.instanceCount--,a.instanceCount||(x(),a.playState=0,a.paused=!1,a.instanceCount=0,a.instanceOptions={},a._iO={},g(),a.isHTML5&&(a.position=0)),(!a.instanceCount||a._iO.multiShotEvents)&&b&&ga(a,function(){b.apply(a)}))};this._whileloading=function(b,c,e,d){var f=a._iO;a.bytesLoaded= -b;a.bytesTotal=c;a.duration=Math.floor(e);a.bufferLength=d;a.durationEstimate=!a.isHTML5&&!f.isMovieStar?f.duration?a.duration>f.duration?a.duration:f.duration:parseInt(a.bytesTotal/a.bytesLoaded*a.duration,10):a.duration;a.isHTML5||(a.buffered=[{start:0,end:a.duration}]);(3!==a.readyState||a.isHTML5)&&f.whileloading&&f.whileloading.apply(a)};this._whileplaying=function(b,c,e,d,f){var h=a._iO;if(isNaN(b)||null===b)return!1;a.position=Math.max(0,b);a._processOnPosition();!a.isHTML5&&8opera.version()?new Audio(null):new Audio:null,d,a,f={},h,g;h=c.audioFormats;for(d in h)if(h.hasOwnProperty(d)&&(a="audio/"+d,f[d]=b(h[d].type),f[a]=f[d],d.match(bb)?(c.flash[d]=!0,c.flash[a]=!0):(c.flash[d]=!1,c.flash[a]=!1),h[d]&&h[d].related))for(g=h[d].related.length-1;0<=g;g--)f["audio/"+h[d].related[g]]=f[d],c.html5[h[d].related[g]]=f[d],c.flash[h[d].related[g]]=f[d];f.canPlayType=e?b:null;c.html5=w(c.html5,f);c.html5.usingFlash= -Va();u=c.html5.usingFlash;return!0};sa={};P=function(){};aa=function(b){8===m&&(1m)&&(c.flashVersion=m=9);c.version=c.versionNumber+(c.html5Only?" (HTML5-only mode)":9===m?" (AS3/Flash 9)": -" (AS2/Flash 8)");8b&&(e=!0));setTimeout(function(){b=c.getMoviePercent();if(e)return Q=!1,g.setTimeout(F,1),!1;!p&&ab&&(null===b?c.useFlashBlock||0===c.flashLoadTimeout?c.useFlashBlock&&za():!c.useFlashBlock&&S?qa():D({type:"ontimeout",ignoreInit:!0,error:{type:"INIT_FLASHBLOCK"}}):0!==c.flashLoadTimeout&&(!c.useFlashBlock&&S?qa():xa(!0)))},c.flashLoadTimeout)};Y=function(){if(Ga||!ja)return t.remove(g,"focus", -Y),!0;Ga=ab=!0;Q=!1;F();t.remove(g,"focus",Y);return!0};M=function(b){if(p)return!1;if(c.html5Only)return p=!0,E(),!0;var e=!0,d;if(!c.useFlashBlock||!c.flashLoadTimeout||c.getMoviePercent())p=!0;d={type:!v&&u?"NO_FLASH":"INIT_TIMEOUT"};if(y||b)c.useFlashBlock&&c.oMC&&(c.oMC.className=I()+" "+(null===c.getMoviePercent()?"swf_timedout":"swf_error")),D({type:"ontimeout",error:d,ignoreInit:!0}),H(d),e=!1;y||(c.waitForWindowLoad&&!na?t.add(g,"load",E):E());return e};Ma=function(){var b,e=c.setupOptions; -for(b in e)e.hasOwnProperty(b)&&(c[b]===k?c[b]=e[b]:c[b]!==e[b]&&(c.setupOptions[b]=c[b]))};ma=function(){if(p)return!1;if(c.html5Only)return p||(t.remove(g,"load",c.beginDelayedInit),c.enabled=!0,M()),!0;Z();try{l._externalInterfaceTest(!1),Oa(!0,c.flashPollingInterval||(c.useHighPerformance?10:50)),c.debugMode||l._disableDebug(),c.enabled=!0,c.html5Only||t.add(g,"unload",la)}catch(b){return H({type:"JS_TO_FLASH_EXCEPTION",fatal:!0}),xa(!0),M(),!1}M();t.remove(g,"load",c.beginDelayedInit);return!0}; -G=function(){if(N)return!1;N=!0;Ma();wa();!v&&c.hasHTML5&&c.setup({useHTML5Audio:!0,preferFlash:!1});Wa();!v&&u&&(Ua.push(sa.needFlash),c.setup({flashLoadTimeout:1}));n.removeEventListener&&n.removeEventListener("DOMContentLoaded",G,!1);Z();return!0};Ba=function(){"complete"===n.readyState&&(G(),n.detachEvent("onreadystatechange",Ba));return!0};ua=function(){na=!0;t.remove(g,"load",ua)};ta=function(){if(Fa&&(c.setupOptions.useHTML5Audio=!0,c.setupOptions.preferFlash=!1,ha||Za&&!s.match(/android\s2\.3/i)))ha&& -(c.ignoreFlash=!0),A=!0};ta();Da();t.add(g,"focus",Y);t.add(g,"load",F);t.add(g,"load",ua);n.addEventListener?n.addEventListener("DOMContentLoaded",G,!1):n.attachEvent?n.attachEvent("onreadystatechange",Ba):H({type:"NO_DOM2_EVENTS",fatal:!0})}var ka=null;if(void 0===g.SM2_DEFER||!SM2_DEFER)ka=new U;g.SoundManager=U;g.soundManager=ka})(window); \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js deleted file mode 100755 index 12b30e2b..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2-nodebug.js +++ /dev/null @@ -1,2660 +0,0 @@ -/** @license - * - * SoundManager 2: JavaScript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code provided under the BSD License: - * http://schillmania.com/projects/soundmanager2/license.txt - * - * V2.97a.20131201 - */ - -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */ -/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */ - -(function(window, _undefined) { -"use strict"; -var soundManager = null; -function SoundManager(smURL, smID) { - this.setupOptions = { - 'url': (smURL || null), - 'flashVersion': 8, - 'debugMode': true, - 'debugFlash': false, - 'useConsole': true, - 'consoleOnly': true, - 'waitForWindowLoad': false, - 'bgColor': '#ffffff', - 'useHighPerformance': false, - 'flashPollingInterval': null, - 'html5PollingInterval': null, - 'flashLoadTimeout': 1000, - 'wmode': null, - 'allowScriptAccess': 'always', - 'useFlashBlock': false, - 'useHTML5Audio': true, - 'html5Test': /^(probably|maybe)$/i, - 'preferFlash': false, - 'noSWFCache': false, - 'idPrefix': 'sound' - }; - this.defaultOptions = { - 'autoLoad': false, - 'autoPlay': false, - 'from': null, - 'loops': 1, - 'onid3': null, - 'onload': null, - 'whileloading': null, - 'onplay': null, - 'onpause': null, - 'onresume': null, - 'whileplaying': null, - 'onposition': null, - 'onstop': null, - 'onfailure': null, - 'onfinish': null, - 'multiShot': true, - 'multiShotEvents': false, - 'position': null, - 'pan': 0, - 'stream': true, - 'to': null, - 'type': null, - 'usePolicyFile': false, - 'volume': 100 - }; - this.flash9Options = { - 'isMovieStar': null, - 'usePeakData': false, - 'useWaveformData': false, - 'useEQData': false, - 'onbufferchange': null, - 'ondataerror': null - }; - this.movieStarOptions = { - 'bufferTime': 3, - 'serverURL': null, - 'onconnect': null, - 'duration': null - }; - this.audioFormats = { - 'mp3': { - 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], - 'required': true - }, - 'mp4': { - 'related': ['aac','m4a','m4b'], - 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], - 'required': false - }, - 'ogg': { - 'type': ['audio/ogg; codecs=vorbis'], - 'required': false - }, - 'opus': { - 'type': ['audio/ogg; codecs=opus', 'audio/opus'], - 'required': false - }, - 'wav': { - 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], - 'required': false - } - }; - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - this.versionNumber = 'V2.97a.20131201'; - this.version = null; - this.movieURL = null; - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.didFlashBlock = false; - this.filePattern = null; - this.filePatterns = { - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - }; - this.features = { - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - }; - this.sandbox = { - }; - this.html5 = { - 'usingFlash': null - }; - this.flash = {}; - this.html5Only = false; - this.ignoreFlash = false; - var SMSound, - sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [], - canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, - is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)), - mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid), - isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), - hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000, - emptyURL = 'about:blank', - emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', - overHTTP = (doc.location?doc.location.protocol.match(/http/i):null), - http = (!overHTTP ? 'http:/'+'/' : ''), - netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, - netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'], - netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; - this.useAltURL = !overHTTP; - swfCSS = { - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - }; - this.hasHTML5 = (function() { - try { - return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined); - } catch(e) { - return false; - } - }()); - this.setup = function(options) { - var noURL = (!sm2.url); - if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) { - } - assign(options); - if (options) { - if (noURL && didDCLoaded && options.url !== _undefined) { - sm2.beginDelayedInit(); - } - if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') { - setTimeout(domContentLoaded, 1); - } - } - return sm2; - }; - this.ok = function() { - return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5)); - }; - this.supported = this.ok; - this.getMovie = function(smID) { - return id(smID) || doc[smID] || window[smID]; - }; - this.createSound = function(oOptions, _url) { - var cs, cs_string, options, oSound = null; - if (!didInit || !sm2.ok()) { - return false; - } - if (_url !== _undefined) { - oOptions = { - 'id': oOptions, - 'url': _url - }; - } - options = mixin(oOptions); - options.url = parseURL(options.url); - if (options.id === undefined) { - options.id = sm2.setupOptions.idPrefix + (idCounter++); - } - if (idCheck(options.id, true)) { - return sm2.sounds[options.id]; - } - function make() { - options = loopFix(options); - sm2.sounds[options.id] = new SMSound(options); - sm2.soundIDs.push(options.id); - return sm2.sounds[options.id]; - } - if (html5OK(options)) { - oSound = make(); - oSound._setup_html5(options); - } else { - if (sm2.html5Only) { - return make(); - } - if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) { - return make(); - } - if (fV > 8) { - if (options.isMovieStar === null) { - options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern))); - } - } - options = policyFix(options, cs); - oSound = make(); - if (fV === 8) { - flash._createSound(options.id, options.loops||1, options.usePolicyFile); - } else { - flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile); - if (!options.serverURL) { - oSound.connected = true; - if (options.onconnect) { - options.onconnect.apply(oSound); - } - } - } - if (!options.serverURL && (options.autoLoad || options.autoPlay)) { - oSound.load(options); - } - } - if (!options.serverURL && options.autoPlay) { - oSound.play(); - } - return oSound; - }; - this.destroySound = function(sID, _bFromSound) { - if (!idCheck(sID)) { - return false; - } - var oS = sm2.sounds[sID], i; - oS._iO = {}; - oS.stop(); - oS.unload(); - for (i = 0; i < sm2.soundIDs.length; i++) { - if (sm2.soundIDs[i] === sID) { - sm2.soundIDs.splice(i, 1); - break; - } - } - if (!_bFromSound) { - oS.destruct(true); - } - oS = null; - delete sm2.sounds[sID]; - return true; - }; - this.load = function(sID, oOptions) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].load(oOptions); - }; - this.unload = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].unload(); - }; - this.onPosition = function(sID, nPosition, oMethod, oScope) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].onposition(nPosition, oMethod, oScope); - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(sID, nPosition, oMethod) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].clearOnPosition(nPosition, oMethod); - }; - this.play = function(sID, oOptions) { - var result = null, - overloaded = (oOptions && !(oOptions instanceof Object)); - if (!didInit || !sm2.ok()) { - return false; - } - if (!idCheck(sID, overloaded)) { - if (!overloaded) { - return false; - } - if (overloaded) { - oOptions = { - url: oOptions - }; - } - if (oOptions && oOptions.url) { - oOptions.id = sID; - result = sm2.createSound(oOptions).play(); - } - } else if (overloaded) { - oOptions = { - url: oOptions - }; - } - if (result === null) { - result = sm2.sounds[sID].play(oOptions); - } - return result; - }; - this.start = this.play; - this.setPosition = function(sID, nMsecOffset) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPosition(nMsecOffset); - }; - this.stop = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].stop(); - }; - this.stopAll = function() { - var oSound; - for (oSound in sm2.sounds) { - if (sm2.sounds.hasOwnProperty(oSound)) { - sm2.sounds[oSound].stop(); - } - } - }; - this.pause = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].pause(); - }; - this.pauseAll = function() { - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].pause(); - } - }; - this.resume = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].resume(); - }; - this.resumeAll = function() { - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].resume(); - } - }; - this.togglePause = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].togglePause(); - }; - this.setPan = function(sID, nPan) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPan(nPan); - }; - this.setVolume = function(sID, nVol) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setVolume(nVol); - }; - this.mute = function(sID) { - var i = 0; - if (sID instanceof String) { - sID = null; - } - if (!sID) { - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].mute(); - } - sm2.muted = true; - } else { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].mute(); - } - return true; - }; - this.muteAll = function() { - sm2.mute(); - }; - this.unmute = function(sID) { - var i; - if (sID instanceof String) { - sID = null; - } - if (!sID) { - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].unmute(); - } - sm2.muted = false; - } else { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].unmute(); - } - return true; - }; - this.unmuteAll = function() { - sm2.unmute(); - }; - this.toggleMute = function(sID) { - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].toggleMute(); - }; - this.getMemoryUse = function() { - var ram = 0; - if (flash && fV !== 8) { - ram = parseInt(flash._getMemoryUse(), 10); - } - return ram; - }; - this.disable = function(bNoDisable) { - var i; - if (bNoDisable === _undefined) { - bNoDisable = false; - } - if (disabled) { - return false; - } - disabled = true; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - disableObject(sm2.sounds[sm2.soundIDs[i]]); - } - initComplete(bNoDisable); - event.remove(window, 'load', initUserOnload); - return true; - }; - this.canPlayMIME = function(sMIME) { - var result; - if (sm2.hasHTML5) { - result = html5CanPlay({type:sMIME}); - } - if (!result && needsFlash) { - result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); - } - return result; - }; - this.canPlayURL = function(sURL) { - var result; - if (sm2.hasHTML5) { - result = html5CanPlay({url: sURL}); - } - if (!result && needsFlash) { - result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null); - } - return result; - }; - this.canPlayLink = function(oLink) { - if (oLink.type !== _undefined && oLink.type) { - if (sm2.canPlayMIME(oLink.type)) { - return true; - } - } - return sm2.canPlayURL(oLink.href); - }; - this.getSoundById = function(sID, _suppressDebug) { - if (!sID) { - return null; - } - var result = sm2.sounds[sID]; - return result; - }; - this.onready = function(oMethod, oScope) { - var sType = 'onready', - result = false; - if (typeof oMethod === 'function') { - if (!oScope) { - oScope = window; - } - addOnEvent(sType, oMethod, oScope); - processOnEvents(); - result = true; - } else { - throw str('needFunction', sType); - } - return result; - }; - this.ontimeout = function(oMethod, oScope) { - var sType = 'ontimeout', - result = false; - if (typeof oMethod === 'function') { - if (!oScope) { - oScope = window; - } - addOnEvent(sType, oMethod, oScope); - processOnEvents({type:sType}); - result = true; - } else { - throw str('needFunction', sType); - } - return result; - }; - this._writeDebug = function(sText, sTypeOrObject) { - return true; - }; - this._wD = this._writeDebug; - this._debug = function() { - }; - this.reboot = function(resetEvents, excludeInit) { - var i, j, k; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].destruct(); - } - if (flash) { - try { - if (isIE) { - oRemovedHTML = flash.innerHTML; - } - oRemoved = flash.parentNode.removeChild(flash); - } catch(e) { - } - } - oRemovedHTML = oRemoved = needsFlash = flash = null; - sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false; - sm2.soundIDs = []; - sm2.sounds = {}; - idCounter = 0; - if (!resetEvents) { - for (i in on_queue) { - if (on_queue.hasOwnProperty(i)) { - for (j = 0, k = on_queue[i].length; j < k; j++) { - on_queue[i][j].fired = false; - } - } - } - } else { - on_queue = []; - } - sm2.html5 = { - 'usingFlash': null - }; - sm2.flash = {}; - sm2.html5Only = false; - sm2.ignoreFlash = false; - window.setTimeout(function() { - preInit(); - if (!excludeInit) { - sm2.beginDelayedInit(); - } - }, 20); - return sm2; - }; - this.reset = function() { - return sm2.reboot(true, true); - }; - this.getMoviePercent = function() { - return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); - }; - this.beginDelayedInit = function() { - windowLoaded = true; - domContentLoaded(); - setTimeout(function() { - if (initPending) { - return false; - } - createMovie(); - initMovie(); - initPending = true; - return true; - }, 20); - delayWaitForEI(); - }; - this.destruct = function() { - sm2.disable(true); - }; - SMSound = function(oOptions) { - var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted; - lastHTML5State = { - duration: null, - time: null - }; - this.id = oOptions.id; - this.sID = this.id; - this.url = oOptions.url; - this.options = mixin(oOptions); - this.instanceOptions = this.options; - this._iO = this.instanceOptions; - this.pan = this.options.pan; - this.volume = this.options.volume; - this.isHTML5 = false; - this._a = null; - urlOmitted = (this.url ? false : true); - this.id3 = {}; - this._debug = function() { - }; - this.load = function(oOptions) { - var oSound = null, instanceOptions; - if (oOptions !== _undefined) { - s._iO = mixin(oOptions, s.options); - } else { - oOptions = s.options; - s._iO = oOptions; - if (lastURL && lastURL !== s.url) { - s._iO.url = s.url; - s.url = null; - } - } - if (!s._iO.url) { - s._iO.url = s.url; - } - s._iO.url = parseURL(s._iO.url); - s.instanceOptions = s._iO; - instanceOptions = s._iO; - if (!instanceOptions.url && !s.url) { - return s; - } - if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) { - if (s.readyState === 3 && instanceOptions.onload) { - wrapCallback(s, function() { - instanceOptions.onload.apply(s, [(!!s.duration)]); - }); - } - return s; - } - s.loaded = false; - s.readyState = 1; - s.playState = 0; - s.id3 = {}; - if (html5OK(instanceOptions)) { - oSound = s._setup_html5(instanceOptions); - if (!oSound._called_load) { - s._html5_canplay = false; - if (s.url !== instanceOptions.url) { - s._a.src = instanceOptions.url; - s.setPosition(0); - } - s._a.autobuffer = 'auto'; - s._a.preload = 'auto'; - s._a._called_load = true; - } else { - } - } else { - if (sm2.html5Only) { - return s; - } - if (s._iO.url && s._iO.url.match(/data\:/i)) { - return s; - } - try { - s.isHTML5 = false; - s._iO = policyFix(loopFix(instanceOptions)); - instanceOptions = s._iO; - if (fV === 8) { - flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile); - } else { - flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile); - } - } catch(e) { - catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); - } - } - s.url = instanceOptions.url; - return s; - }; - this.unload = function() { - if (s.readyState !== 0) { - if (!s.isHTML5) { - if (fV === 8) { - flash._unload(s.id, emptyURL); - } else { - flash._unload(s.id); - } - } else { - stop_html5_timer(); - if (s._a) { - s._a.pause(); - lastURL = html5Unload(s._a); - } - } - resetProperties(); - } - return s; - }; - this.destruct = function(_bFromSM) { - if (!s.isHTML5) { - s._iO.onfailure = null; - flash._destroySound(s.id); - } else { - stop_html5_timer(); - if (s._a) { - s._a.pause(); - html5Unload(s._a); - if (!useGlobalHTML5Audio) { - remove_html5_events(); - } - s._a._s = null; - s._a = null; - } - } - if (!_bFromSM) { - sm2.destroySound(s.id, true); - } - }; - this.play = function(oOptions, _updatePlayState) { - var fN, allowMulti, a, onready, - audioClone, onended, oncanplay, - startOK = true, - exit = null; - _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState); - if (!oOptions) { - oOptions = {}; - } - if (s.url) { - s._iO.url = s.url; - } - s._iO = mixin(s._iO, s.options); - s._iO = mixin(oOptions, s._iO); - s._iO.url = parseURL(s._iO.url); - s.instanceOptions = s._iO; - if (!s.isHTML5 && s._iO.serverURL && !s.connected) { - if (!s.getAutoPlay()) { - s.setAutoPlay(true); - } - return s; - } - if (html5OK(s._iO)) { - s._setup_html5(s._iO); - start_html5_timer(); - } - if (s.playState === 1 && !s.paused) { - allowMulti = s._iO.multiShot; - if (!allowMulti) { - if (s.isHTML5) { - s.setPosition(s._iO.position); - } - exit = s; - } else { - } - } - if (exit !== null) { - return exit; - } - if (oOptions.url && oOptions.url !== s.url) { - if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) { - urlOmitted = false; - } else { - s.load(s._iO); - } - } - if (!s.loaded) { - if (s.readyState === 0) { - if (!s.isHTML5 && !sm2.html5Only) { - s._iO.autoPlay = true; - s.load(s._iO); - } else if (s.isHTML5) { - s.load(s._iO); - } else { - exit = s; - } - s.instanceOptions = s._iO; - } else if (s.readyState === 2) { - exit = s; - } else { - } - } else { - } - if (exit !== null) { - return exit; - } - if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) { - oOptions.position = 0; - } - if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) { - s.resume(); - } else { - s._iO = mixin(oOptions, s._iO); - if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) { - onready = function() { - s._iO = mixin(oOptions, s._iO); - s.play(s._iO); - }; - if (s.isHTML5 && !s._html5_canplay) { - s.load({ - _oncanplay: onready - }); - exit = false; - } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) { - s.load({ - onload: onready - }); - exit = false; - } - if (exit !== null) { - return exit; - } - s._iO = applyFromTo(); - } - if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) { - s.instanceCount++; - } - if (s._iO.onposition && s.playState === 0) { - attachOnPosition(s); - } - s.playState = 1; - s.paused = false; - s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0); - if (!s.isHTML5) { - s._iO = policyFix(loopFix(s._iO)); - } - if (s._iO.onplay && _updatePlayState) { - s._iO.onplay.apply(s); - onplay_called = true; - } - s.setVolume(s._iO.volume, true); - s.setPan(s._iO.pan, true); - if (!s.isHTML5) { - startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false); - if (fV === 9 && !startOK) { - if (s._iO.onplayerror) { - s._iO.onplayerror.apply(s); - } - } - } else { - if (s.instanceCount < 2) { - start_html5_timer(); - a = s._setup_html5(); - s.setPosition(s._iO.position); - a.play(); - } else { - audioClone = new Audio(s._iO.url); - onended = function() { - event.remove(audioClone, 'ended', onended); - s._onfinish(s); - html5Unload(audioClone); - audioClone = null; - }; - oncanplay = function() { - event.remove(audioClone, 'canplay', oncanplay); - try { - audioClone.currentTime = s._iO.position/msecScale; - } catch(err) { - } - audioClone.play(); - }; - event.add(audioClone, 'ended', onended); - if (s._iO.volume !== undefined) { - audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100)); - } - if (s.muted) { - audioClone.muted = true; - } - if (s._iO.position) { - event.add(audioClone, 'canplay', oncanplay); - } else { - audioClone.play(); - } - } - } - } - return s; - }; - this.start = this.play; - this.stop = function(bAll) { - var instanceOptions = s._iO, - originalPosition; - if (s.playState === 1) { - s._onbufferchange(0); - s._resetOnPosition(0); - s.paused = false; - if (!s.isHTML5) { - s.playState = 0; - } - detachOnPosition(); - if (instanceOptions.to) { - s.clearOnPosition(instanceOptions.to); - } - if (!s.isHTML5) { - flash._stop(s.id, bAll); - if (instanceOptions.serverURL) { - s.unload(); - } - } else { - if (s._a) { - originalPosition = s.position; - s.setPosition(0); - s.position = originalPosition; - s._a.pause(); - s.playState = 0; - s._onTimer(); - stop_html5_timer(); - } - } - s.instanceCount = 0; - s._iO = {}; - if (instanceOptions.onstop) { - instanceOptions.onstop.apply(s); - } - } - return s; - }; - this.setAutoPlay = function(autoPlay) { - s._iO.autoPlay = autoPlay; - if (!s.isHTML5) { - flash._setAutoPlay(s.id, autoPlay); - if (autoPlay) { - if (!s.instanceCount && s.readyState === 1) { - s.instanceCount++; - } - } - } - }; - this.getAutoPlay = function() { - return s._iO.autoPlay; - }; - this.setPosition = function(nMsecOffset) { - if (nMsecOffset === _undefined) { - nMsecOffset = 0; - } - var position, position1K, - offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0))); - s.position = offset; - position1K = s.position/msecScale; - s._resetOnPosition(s.position); - s._iO.position = offset; - if (!s.isHTML5) { - position = (fV === 9 ? s.position : position1K); - if (s.readyState && s.readyState !== 2) { - flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot); - } - } else if (s._a) { - if (s._html5_canplay) { - if (s._a.currentTime !== position1K) { - try { - s._a.currentTime = position1K; - if (s.playState === 0 || s.paused) { - s._a.pause(); - } - } catch(e) { - } - } - } else if (position1K) { - return s; - } - if (s.paused) { - s._onTimer(true); - } - } - return s; - }; - this.pause = function(_bCallFlash) { - if (s.paused || (s.playState === 0 && s.readyState !== 1)) { - return s; - } - s.paused = true; - if (!s.isHTML5) { - if (_bCallFlash || _bCallFlash === _undefined) { - flash._pause(s.id, s._iO.multiShot); - } - } else { - s._setup_html5().pause(); - stop_html5_timer(); - } - if (s._iO.onpause) { - s._iO.onpause.apply(s); - } - return s; - }; - this.resume = function() { - var instanceOptions = s._iO; - if (!s.paused) { - return s; - } - s.paused = false; - s.playState = 1; - if (!s.isHTML5) { - if (instanceOptions.isMovieStar && !instanceOptions.serverURL) { - s.setPosition(s.position); - } - flash._pause(s.id, instanceOptions.multiShot); - } else { - s._setup_html5().play(); - start_html5_timer(); - } - if (!onplay_called && instanceOptions.onplay) { - instanceOptions.onplay.apply(s); - onplay_called = true; - } else if (instanceOptions.onresume) { - instanceOptions.onresume.apply(s); - } - return s; - }; - this.togglePause = function() { - if (s.playState === 0) { - s.play({ - position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale) - }); - return s; - } - if (s.paused) { - s.resume(); - } else { - s.pause(); - } - return s; - }; - this.setPan = function(nPan, bInstanceOnly) { - if (nPan === _undefined) { - nPan = 0; - } - if (bInstanceOnly === _undefined) { - bInstanceOnly = false; - } - if (!s.isHTML5) { - flash._setPan(s.id, nPan); - } - s._iO.pan = nPan; - if (!bInstanceOnly) { - s.pan = nPan; - s.options.pan = nPan; - } - return s; - }; - this.setVolume = function(nVol, _bInstanceOnly) { - if (nVol === _undefined) { - nVol = 100; - } - if (_bInstanceOnly === _undefined) { - _bInstanceOnly = false; - } - if (!s.isHTML5) { - flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol); - } else if (s._a) { - if (sm2.muted && !s.muted) { - s.muted = true; - s._a.muted = true; - } - s._a.volume = Math.max(0, Math.min(1, nVol/100)); - } - s._iO.volume = nVol; - if (!_bInstanceOnly) { - s.volume = nVol; - s.options.volume = nVol; - } - return s; - }; - this.mute = function() { - s.muted = true; - if (!s.isHTML5) { - flash._setVolume(s.id, 0); - } else if (s._a) { - s._a.muted = true; - } - return s; - }; - this.unmute = function() { - s.muted = false; - var hasIO = (s._iO.volume !== _undefined); - if (!s.isHTML5) { - flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume); - } else if (s._a) { - s._a.muted = false; - } - return s; - }; - this.toggleMute = function() { - return (s.muted?s.unmute():s.mute()); - }; - this.onPosition = function(nPosition, oMethod, oScope) { - onPositionItems.push({ - position: parseInt(nPosition, 10), - method: oMethod, - scope: (oScope !== _undefined ? oScope : s), - fired: false - }); - return s; - }; - this.onposition = this.onPosition; - this.clearOnPosition = function(nPosition, oMethod) { - var i; - nPosition = parseInt(nPosition, 10); - if (isNaN(nPosition)) { - return false; - } - for (i=0; i < onPositionItems.length; i++) { - if (nPosition === onPositionItems[i].position) { - if (!oMethod || (oMethod === onPositionItems[i].method)) { - if (onPositionItems[i].fired) { - onPositionFired--; - } - onPositionItems.splice(i, 1); - } - } - } - }; - this._processOnPosition = function() { - var i, item, j = onPositionItems.length; - if (!j || !s.playState || onPositionFired >= j) { - return false; - } - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (!item.fired && s.position >= item.position) { - item.fired = true; - onPositionFired++; - item.method.apply(item.scope, [item.position]); - j = onPositionItems.length; - } - } - return true; - }; - this._resetOnPosition = function(nPosition) { - var i, item, j = onPositionItems.length; - if (!j) { - return false; - } - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - onPositionFired--; - } - } - return true; - }; - applyFromTo = function() { - var instanceOptions = s._iO, - f = instanceOptions.from, - t = instanceOptions.to, - start, end; - end = function() { - s.clearOnPosition(t, end); - s.stop(); - }; - start = function() { - if (t !== null && !isNaN(t)) { - s.onPosition(t, end); - } - }; - if (f !== null && !isNaN(f)) { - instanceOptions.position = f; - instanceOptions.multiShot = false; - start(); - } - return instanceOptions; - }; - attachOnPosition = function() { - var item, - op = s._iO.onposition; - if (op) { - for (item in op) { - if (op.hasOwnProperty(item)) { - s.onPosition(parseInt(item, 10), op[item]); - } - } - } - }; - detachOnPosition = function() { - var item, - op = s._iO.onposition; - if (op) { - for (item in op) { - if (op.hasOwnProperty(item)) { - s.clearOnPosition(parseInt(item, 10)); - } - } - } - }; - start_html5_timer = function() { - if (s.isHTML5) { - startTimer(s); - } - }; - stop_html5_timer = function() { - if (s.isHTML5) { - stopTimer(s); - } - }; - resetProperties = function(retainPosition) { - if (!retainPosition) { - onPositionItems = []; - onPositionFired = 0; - } - onplay_called = false; - s._hasTimer = null; - s._a = null; - s._html5_canplay = false; - s.bytesLoaded = null; - s.bytesTotal = null; - s.duration = (s._iO && s._iO.duration ? s._iO.duration : null); - s.durationEstimate = null; - s.buffered = []; - s.eqData = []; - s.eqData.left = []; - s.eqData.right = []; - s.failures = 0; - s.isBuffering = false; - s.instanceOptions = {}; - s.instanceCount = 0; - s.loaded = false; - s.metadata = {}; - s.readyState = 0; - s.muted = false; - s.paused = false; - s.peakData = { - left: 0, - right: 0 - }; - s.waveformData = { - left: [], - right: [] - }; - s.playState = 0; - s.position = null; - s.id3 = {}; - }; - resetProperties(); - this._onTimer = function(bForce) { - var duration, isNew = false, time, x = {}; - if (s._hasTimer || bForce) { - if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) { - duration = s._get_html5_duration(); - if (duration !== lastHTML5State.duration) { - lastHTML5State.duration = duration; - s.duration = duration; - isNew = true; - } - s.durationEstimate = s.duration; - time = (s._a.currentTime * msecScale || 0); - if (time !== lastHTML5State.time) { - lastHTML5State.time = time; - isNew = true; - } - if (isNew || bForce) { - s._whileplaying(time,x,x,x,x); - } - } - return isNew; - } - }; - this._get_html5_duration = function() { - var instanceOptions = s._iO, - d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)), - result = (d && !isNaN(d) && d !== Infinity ? d : null); - return result; - }; - this._apply_loop = function(a, nLoops) { - a.loop = (nLoops > 1 ? 'loop' : ''); - }; - this._setup_html5 = function(oOptions) { - var instanceOptions = mixin(s._iO, oOptions), - a = useGlobalHTML5Audio ? globalHTML5Audio : s._a, - dURL = decodeURI(instanceOptions.url), - sameURL; - if (useGlobalHTML5Audio) { - if (dURL === decodeURI(lastGlobalHTML5URL)) { - sameURL = true; - } - } else if (dURL === decodeURI(lastURL)) { - sameURL = true; - } - if (a) { - if (a._s) { - if (useGlobalHTML5Audio) { - if (a._s && a._s.playState && !sameURL) { - a._s.stop(); - } - } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) { - s._apply_loop(a, instanceOptions.loops); - return a; - } - } - if (!sameURL) { - if (lastURL) { - resetProperties(false); - } - a.src = instanceOptions.url; - s.url = instanceOptions.url; - lastURL = instanceOptions.url; - lastGlobalHTML5URL = instanceOptions.url; - a._called_load = false; - } - } else { - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - s._a = new Audio(instanceOptions.url); - s._a.load(); - } else { - s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()); - } - a = s._a; - a._called_load = false; - if (useGlobalHTML5Audio) { - globalHTML5Audio = a; - } - } - s.isHTML5 = true; - s._a = a; - a._s = s; - add_html5_events(); - s._apply_loop(a, instanceOptions.loops); - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - s.load(); - } else { - a.autobuffer = false; - a.preload = 'auto'; - } - return a; - }; - add_html5_events = function() { - if (s._a._added_events) { - return false; - } - var f; - function add(oEvt, oFn, bCapture) { - return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - s._a._added_events = true; - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - add(f, html5_events[f]); - } - } - return true; - }; - remove_html5_events = function() { - var f; - function remove(oEvt, oFn, bCapture) { - return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - s._a._added_events = false; - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - remove(f, html5_events[f]); - } - } - }; - this._onload = function(nSuccess) { - var fN, - loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration); - s.loaded = loadOK; - s.readyState = loadOK?3:2; - s._onbufferchange(0); - if (s._iO.onload) { - wrapCallback(s, function() { - s._iO.onload.apply(s, [loadOK]); - }); - } - return true; - }; - this._onbufferchange = function(nIsBuffering) { - if (s.playState === 0) { - return false; - } - if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) { - return false; - } - s.isBuffering = (nIsBuffering === 1); - if (s._iO.onbufferchange) { - s._iO.onbufferchange.apply(s); - } - return true; - }; - this._onsuspend = function() { - if (s._iO.onsuspend) { - s._iO.onsuspend.apply(s); - } - return true; - }; - this._onfailure = function(msg, level, code) { - s.failures++; - if (s._iO.onfailure && s.failures === 1) { - s._iO.onfailure(s, msg, level, code); - } else { - } - }; - this._onfinish = function() { - var io_onfinish = s._iO.onfinish; - s._onbufferchange(0); - s._resetOnPosition(0); - if (s.instanceCount) { - s.instanceCount--; - if (!s.instanceCount) { - detachOnPosition(); - s.playState = 0; - s.paused = false; - s.instanceCount = 0; - s.instanceOptions = {}; - s._iO = {}; - stop_html5_timer(); - if (s.isHTML5) { - s.position = 0; - } - } - if (!s.instanceCount || s._iO.multiShotEvents) { - if (io_onfinish) { - wrapCallback(s, function() { - io_onfinish.apply(s); - }); - } - } - } - }; - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - var instanceOptions = s._iO; - s.bytesLoaded = nBytesLoaded; - s.bytesTotal = nBytesTotal; - s.duration = Math.floor(nDuration); - s.bufferLength = nBufferLength; - if (!s.isHTML5 && !instanceOptions.isMovieStar) { - if (instanceOptions.duration) { - s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration; - } else { - s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10); - } - } else { - s.durationEstimate = s.duration; - } - if (!s.isHTML5) { - s.buffered = [{ - 'start': 0, - 'end': s.duration - }]; - } - if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) { - instanceOptions.whileloading.apply(s); - } - }; - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - var instanceOptions = s._iO, - eqLeft; - if (isNaN(nPosition) || nPosition === null) { - return false; - } - s.position = Math.max(0, nPosition); - s._processOnPosition(); - if (!s.isHTML5 && fV > 8) { - if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) { - s.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) { - s.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - if (instanceOptions.useEQData) { - if (oEQData !== _undefined && oEQData && oEQData.leftEQ) { - eqLeft = oEQData.leftEQ.split(','); - s.eqData = eqLeft; - s.eqData.left = eqLeft; - if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) { - s.eqData.right = oEQData.rightEQ.split(','); - } - } - } - } - if (s.playState === 1) { - if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) { - s._onbufferchange(0); - } - if (instanceOptions.whileplaying) { - instanceOptions.whileplaying.apply(s); - } - } - return true; - }; - this._oncaptiondata = function(oData) { - s.captiondata = oData; - if (s._iO.oncaptiondata) { - s._iO.oncaptiondata.apply(s, [oData]); - } - }; - this._onmetadata = function(oMDProps, oMDData) { - var oData = {}, i, j; - for (i = 0, j = oMDProps.length; i < j; i++) { - oData[oMDProps[i]] = oMDData[i]; - } - s.metadata = oData; - if (s._iO.onmetadata) { - s._iO.onmetadata.apply(s); - } - }; - this._onid3 = function(oID3Props, oID3Data) { - var oData = [], i, j; - for (i = 0, j = oID3Props.length; i < j; i++) { - oData[oID3Props[i]] = oID3Data[i]; - } - s.id3 = mixin(s.id3, oData); - if (s._iO.onid3) { - s._iO.onid3.apply(s); - } - }; - this._onconnect = function(bSuccess) { - bSuccess = (bSuccess === 1); - s.connected = bSuccess; - if (bSuccess) { - s.failures = 0; - if (idCheck(s.id)) { - if (s.getAutoPlay()) { - s.play(_undefined, s.getAutoPlay()); - } else if (s._iO.autoLoad) { - s.load(); - } - } - if (s._iO.onconnect) { - s._iO.onconnect.apply(s, [bSuccess]); - } - } - }; - this._ondataerror = function(sError) { - if (s.playState > 0) { - if (s._iO.ondataerror) { - s._iO.ondataerror.apply(s); - } - } - }; - }; - getDocument = function() { - return (doc.body || doc.getElementsByTagName('div')[0]); - }; - id = function(sID) { - return doc.getElementById(sID); - }; - mixin = function(oMain, oAdd) { - var o1 = (oMain || {}), o2, o; - o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd); - for (o in o2) { - if (o2.hasOwnProperty(o) && o1[o] === _undefined) { - if (typeof o2[o] !== 'object' || o2[o] === null) { - o1[o] = o2[o]; - } else { - o1[o] = mixin(o1[o], o2[o]); - } - } - } - return o1; - }; - wrapCallback = function(oSound, callback) { - if (!oSound.isHTML5 && fV === 8) { - window.setTimeout(callback, 0); - } else { - callback(); - } - }; - extraOptions = { - 'onready': 1, - 'ontimeout': 1, - 'defaultOptions': 1, - 'flash9Options': 1, - 'movieStarOptions': 1 - }; - assign = function(o, oParent) { - var i, - result = true, - hasParent = (oParent !== _undefined), - setupOptions = sm2.setupOptions, - bonusOptions = extraOptions; - for (i in o) { - if (o.hasOwnProperty(i)) { - if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) { - if (hasParent && bonusOptions[oParent] !== _undefined) { - sm2[oParent][i] = o[i]; - } else if (setupOptions[i] !== _undefined) { - sm2.setupOptions[i] = o[i]; - sm2[i] = o[i]; - } else if (bonusOptions[i] === _undefined) { - result = false; - } else { - if (sm2[i] instanceof Function) { - sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]])); - } else { - sm2[i] = o[i]; - } - } - } else { - if (bonusOptions[i] === _undefined) { - result = false; - } else { - return assign(o[i], i); - } - } - } - } - return result; - }; - function preferFlashCheck(kind) { - return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind])); - } - event = (function() { - var old = (window.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - function getArgs(oArgs) { - var args = slice.call(oArgs), - len = args.length; - if (old) { - args[1] = 'on' + args[1]; - if (len > 3) { - args.pop(); - } - } else if (len === 3) { - args.push(false); - } - return args; - } - function apply(args, sType) { - var element = args.shift(), - method = [evt[sType]]; - if (old) { - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - } - function add() { - apply(getArgs(arguments), 'add'); - } - function remove() { - apply(getArgs(arguments), 'remove'); - } - return { - 'add': add, - 'remove': remove - }; - }()); - function html5_event(oFn) { - return function(e) { - var s = this._s, - result; - if (!s || !s._a) { - result = null; - } else { - result = oFn.call(this, e); - } - return result; - }; - } - html5_events = { - abort: html5_event(function() { - }), - canplay: html5_event(function() { - var s = this._s, - position1K; - if (s._html5_canplay) { - return true; - } - s._html5_canplay = true; - s._onbufferchange(0); - position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null); - if (s.position && this.currentTime !== position1K) { - try { - this.currentTime = position1K; - } catch(ee) { - } - } - if (s._iO._oncanplay) { - s._iO._oncanplay(); - } - }), - canplaythrough: html5_event(function() { - var s = this._s; - if (!s.loaded) { - s._onbufferchange(0); - s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration()); - s._onload(true); - } - }), - ended: html5_event(function() { - var s = this._s; - s._onfinish(); - }), - error: html5_event(function() { - this._s._onload(false); - }), - loadeddata: html5_event(function() { - var s = this._s; - if (!s._loaded && !isSafari) { - s.duration = s._get_html5_duration(); - } - }), - loadedmetadata: html5_event(function() { - }), - loadstart: html5_event(function() { - this._s._onbufferchange(1); - }), - play: html5_event(function() { - this._s._onbufferchange(0); - }), - playing: html5_event(function() { - this._s._onbufferchange(0); - }), - progress: html5_event(function(e) { - var s = this._s, - i, j, progStr, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - loaded = (e.loaded||0), - total = (e.total||1); - s.buffered = []; - if (ranges && ranges.length) { - for (i=0, j=ranges.length; i= 0; i--) { - support['audio/'+aF[item].related[i]] = support[item]; - sm2.html5[aF[item].related[i]] = support[item]; - sm2.flash[aF[item].related[i]] = support[item]; - } - } - } - } - support.canPlayType = (a?cp:null); - sm2.html5 = mixin(sm2.html5, support); - sm2.html5.usingFlash = featureCheck(); - needsFlash = sm2.html5.usingFlash; - return true; - }; - strings = { - }; - str = function() { - }; - loopFix = function(sOpt) { - if (fV === 8 && sOpt.loops > 1 && sOpt.stream) { - sOpt.stream = false; - } - return sOpt; - }; - policyFix = function(sOpt, sPre) { - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - sOpt.usePolicyFile = true; - } - return sOpt; - }; - complain = function(sMsg) { - }; - doNothing = function() { - return false; - }; - disableObject = function(o) { - var oProp; - for (oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = doNothing; - } - } - oProp = null; - }; - failSafely = function(bNoDisable) { - if (bNoDisable === _undefined) { - bNoDisable = false; - } - if (disabled || bNoDisable) { - sm2.disable(bNoDisable); - } - }; - normalizeMovieURL = function(smURL) { - var urlParams = null, url; - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - return smURL; - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - smURL += '/'; - } - } - url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL; - if (sm2.noSWFCache) { - url += ('?ts=' + new Date().getTime()); - } - return url; - }; - setVersionInfo = function() { - fV = parseInt(sm2.flashVersion, 10); - if (fV !== 8 && fV !== 9) { - sm2.flashVersion = fV = defaultFlashVersion; - } - var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf'); - if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) { - sm2.flashVersion = fV = 9; - } - sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - if (fV > 8) { - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options); - sm2.features.buffering = true; - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions); - sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - sm2.features.movieStar = true; - } else { - sm2.features.movieStar = false; - } - sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')]; - sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); - sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8); - }; - setPolling = function(bPolling, bHighPerformance) { - if (!flash) { - return false; - } - flash._setPolling(bPolling, bHighPerformance); - }; - initDebug = function() { - }; - idCheck = this.getSoundById; - getSWFCSS = function() { - var css = []; - if (sm2.debugMode) { - css.push(swfCSS.sm2Debug); - } - if (sm2.debugFlash) { - css.push(swfCSS.flashDebug); - } - if (sm2.useHighPerformance) { - css.push(swfCSS.highPerf); - } - return css.join(' '); - }; - flashBlockHandler = function() { - var name = str('fbHandler'), - p = sm2.getMoviePercent(), - css = swfCSS, - error = {type:'FLASHBLOCK'}; - if (sm2.html5Only) { - return false; - } - if (!sm2.ok()) { - if (needsFlash) { - sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - } - sm2.didFlashBlock = true; - processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); - catchError(error); - } else { - if (sm2.oMC) { - sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - } - }; - addOnEvent = function(sType, oMethod, oScope) { - if (on_queue[sType] === _undefined) { - on_queue[sType] = []; - } - on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - }; - processOnEvents = function(oOptions) { - if (!oOptions) { - oOptions = { - type: (sm2.ok() ? 'onready' : 'ontimeout') - }; - } - if (!didInit && oOptions && !oOptions.ignoreInit) { - return false; - } - if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) { - return false; - } - var status = { - success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled) - }, - srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]), - queue = [], i, j, - args = [status], - canRetry = (needsFlash && !sm2.ok()); - if (oOptions.error) { - args[0].error = oOptions.error; - } - for (i = 0, j = srcQueue.length; i < j; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - if (queue.length) { - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, args); - } else { - queue[i].method.apply(this, args); - } - if (!canRetry) { - queue[i].fired = true; - } - } - } - return true; - }; - initUserOnload = function() { - window.setTimeout(function() { - if (sm2.useFlashBlock) { - flashBlockHandler(); - } - processOnEvents(); - if (typeof sm2.onload === 'function') { - sm2.onload.apply(window); - } - if (sm2.waitForWindowLoad) { - event.add(window, 'load', initUserOnload); - } - },1); - }; - detectFlash = function() { - if (hasFlash !== _undefined) { - return hasFlash; - } - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; - if (nP && nP.length) { - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) { - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - obj = null; - } - hasPlugin = (!!obj); - obj = null; - } - hasFlash = hasPlugin; - return hasPlugin; - }; - featureCheck = function() { - var flashNeeded, - item, - formats = sm2.audioFormats, - isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i))); - if (isSpecial) { - sm2.hasHTML5 = false; - sm2.html5Only = true; - if (sm2.oMC) { - sm2.oMC.style.display = 'none'; - } - } else { - if (sm2.useHTML5Audio) { - if (!sm2.html5 || !sm2.html5.canPlayType) { - sm2.hasHTML5 = false; - } - } - } - if (sm2.useHTML5Audio && sm2.hasHTML5) { - canIgnoreFlash = true; - for (item in formats) { - if (formats.hasOwnProperty(item)) { - if (formats[item].required) { - if (!sm2.html5.canPlayType(formats[item].type)) { - canIgnoreFlash = false; - flashNeeded = true; - } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) { - flashNeeded = true; - } - } - } - } - } - if (sm2.ignoreFlash) { - flashNeeded = false; - canIgnoreFlash = true; - } - sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded); - return (!sm2.html5Only); - }; - parseURL = function(url) { - var i, j, urlResult = 0, result; - if (url instanceof Array) { - for (i=0, j=url.length; i= 0; i--) { - if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) { - sm2.sounds[sm2.soundIDs[i]]._onTimer(); - } - } - }; - catchError = function(options) { - options = (options !== _undefined ? options : {}); - if (typeof sm2.onerror === 'function') { - sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]); - } - if (options.fatal !== _undefined && options.fatal) { - sm2.disable(); - } - }; - badSafariFix = function() { - if (!isBadSafari || !detectFlash()) { - return false; - } - var aF = sm2.audioFormats, i, item; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - if (item === 'mp3' || item === 'mp4') { - sm2.html5[item] = false; - if (aF[item] && aF[item].related) { - for (i = aF[item].related.length-1; i >= 0; i--) { - sm2.html5[aF[item].related[i]] = false; - } - } - } - } - } - }; - this._setSandboxType = function(sandboxType) { - }; - this._externalInterfaceOK = function(swfVersion) { - if (sm2.swfLoaded) { - return false; - } - var e; - sm2.swfLoaded = true; - tryInitOnFocus = false; - if (isBadSafari) { - badSafariFix(); - } - setTimeout(init, isIE ? 100 : 1); - }; - createMovie = function(smID, smURL) { - if (didAppend && appendSuccess) { - return false; - } - function initMsg() { - } - if (sm2.html5Only) { - setVersionInfo(); - initMsg(); - sm2.oMC = id(sm2.movieID); - init(); - didAppend = true; - appendSuccess = true; - return false; - } - var remoteURL = (smURL || sm2.url), - localURL = (sm2.altURL || remoteURL), - swfTitle = 'JS/Flash audio component (SoundManager 2)', - oTarget = getDocument(), - extraClass = getSWFCSS(), - isRTL = null, - html = doc.getElementsByTagName('html')[0], - oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass; - isRTL = (html && html.dir && html.dir.match(/rtl/i)); - smID = (smID === _undefined?sm2.id:smID); - function param(name, value) { - return ''; - } - setVersionInfo(); - sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL); - smURL = sm2.url; - sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode); - if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - messages.push(strings.spcWmode); - sm2.wmode = null; - } - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'quality': 'high', - 'allowScriptAccess': sm2.allowScriptAccess, - 'bgcolor': sm2.bgColor, - 'pluginspage': http+'www.macromedia.com/go/getflashplayer', - 'title': swfTitle, - 'type': 'application/x-shockwave-flash', - 'wmode': sm2.wmode, - 'hasPriority': 'true' - }; - if (sm2.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - if (!sm2.wmode) { - delete oEmbed.wmode; - } - if (isIE) { - oMovie = doc.createElement('div'); - movieHTML = [ - '', - param('movie', smURL), - param('AllowScriptAccess', sm2.allowScriptAccess), - param('quality', oEmbed.quality), - (sm2.wmode? param('wmode', sm2.wmode): ''), - param('bgcolor', sm2.bgColor), - param('hasPriority', 'true'), - (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), - '' - ].join(''); - } else { - oMovie = doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - } - initDebug(); - extraClass = getSWFCSS(); - oTarget = getDocument(); - if (oTarget) { - sm2.oMC = (id(sm2.movieID) || doc.createElement('div')); - if (!sm2.oMC.id) { - sm2.oMC.id = sm2.movieID; - sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass; - s = null; - oEl = null; - if (!sm2.useFlashBlock) { - if (sm2.useHighPerformance) { - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - if (isWebkit) { - sm2.oMC.style.zIndex = 10000; - } - if (!sm2.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - sm2.oMC.style[x] = s[x]; - } - } - } - try { - if (!isIE) { - sm2.oMC.appendChild(oMovie); - } - oTarget.appendChild(sm2.oMC); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - } catch(e) { - throw new Error(str('domError')+' \n'+e.toString()); - } - } else { - sClass = sm2.oMC.className; - sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - sm2.oMC.appendChild(oMovie); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - } - } - didAppend = true; - initMsg(); - return true; - }; - initMovie = function() { - if (sm2.html5Only) { - createMovie(); - return false; - } - if (flash) { - return false; - } - if (!sm2.url) { - return false; - } - flash = sm2.getMovie(sm2.id); - if (!flash) { - if (!oRemoved) { - createMovie(sm2.id, sm2.url); - } else { - if (!isIE) { - sm2.oMC.appendChild(oRemoved); - } else { - sm2.oMC.innerHTML = oRemovedHTML; - } - oRemoved = null; - didAppend = true; - } - flash = sm2.getMovie(sm2.id); - } - if (typeof sm2.oninitmovie === 'function') { - setTimeout(sm2.oninitmovie, 1); - } - return true; - }; - delayWaitForEI = function() { - setTimeout(waitForEI, 1000); - }; - rebootIntoHTML5 = function() { - window.setTimeout(function() { - sm2.setup({ - preferFlash: false - }).reboot(); - sm2.didFlashBlock = true; - sm2.beginDelayedInit(); - }, 1); - }; - waitForEI = function() { - var p, - loadIncomplete = false; - if (!sm2.url) { - return false; - } - if (waitingForEI) { - return false; - } - waitingForEI = true; - event.remove(window, 'load', delayWaitForEI); - if (hasFlash && tryInitOnFocus && !isFocused) { - return false; - } - if (!didInit) { - p = sm2.getMoviePercent(); - if (p > 0 && p < 100) { - loadIncomplete = true; - } - } - setTimeout(function() { - p = sm2.getMoviePercent(); - if (loadIncomplete) { - waitingForEI = false; - window.setTimeout(delayWaitForEI, 1); - return false; - } - if (!didInit && okToDisable) { - if (p === null) { - if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) { - if (sm2.useFlashBlock) { - flashBlockHandler(); - } - } else { - if (!sm2.useFlashBlock && canIgnoreFlash) { - rebootIntoHTML5(); - } else { - processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}}); - } - } - } else { - if (sm2.flashLoadTimeout === 0) { - } else { - if (!sm2.useFlashBlock && canIgnoreFlash) { - rebootIntoHTML5(); - } else { - failSafely(true); - } - } - } - } - }, sm2.flashLoadTimeout); - }; - handleFocus = function() { - function cleanup() { - event.remove(window, 'focus', handleFocus); - } - if (isFocused || !tryInitOnFocus) { - cleanup(); - return true; - } - okToDisable = true; - isFocused = true; - waitingForEI = false; - delayWaitForEI(); - cleanup(); - return true; - }; - flushMessages = function() { - }; - showSupport = function() { - }; - initComplete = function(bNoDisable) { - if (didInit) { - return false; - } - if (sm2.html5Only) { - didInit = true; - initUserOnload(); - return true; - } - var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()), - result = true, - error; - if (!wasTimeout) { - didInit = true; - } - error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; - if (disabled || bNoDisable) { - if (sm2.useFlashBlock && sm2.oMC) { - sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError); - } - processOnEvents({type:'ontimeout', error:error, ignoreInit: true}); - catchError(error); - result = false; - } else { - } - if (!disabled) { - if (sm2.waitForWindowLoad && !windowLoaded) { - event.add(window, 'load', initUserOnload); - } else { - initUserOnload(); - } - } - return result; - }; - setProperties = function() { - var i, - o = sm2.setupOptions; - for (i in o) { - if (o.hasOwnProperty(i)) { - if (sm2[i] === _undefined) { - sm2[i] = o[i]; - } else if (sm2[i] !== o[i]) { - sm2.setupOptions[i] = sm2[i]; - } - } - } - }; - init = function() { - if (didInit) { - return false; - } - function cleanup() { - event.remove(window, 'load', sm2.beginDelayedInit); - } - if (sm2.html5Only) { - if (!didInit) { - cleanup(); - sm2.enabled = true; - initComplete(); - } - return true; - } - initMovie(); - try { - flash._externalInterfaceTest(false); - setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50))); - if (!sm2.debugMode) { - flash._disableDebug(); - } - sm2.enabled = true; - if (!sm2.html5Only) { - event.add(window, 'unload', doNothing); - } - } catch(e) { - catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); - failSafely(true); - initComplete(); - return false; - } - initComplete(); - cleanup(); - return true; - }; - domContentLoaded = function() { - if (didDCLoaded) { - return false; - } - didDCLoaded = true; - setProperties(); - initDebug(); - if (!hasFlash && sm2.hasHTML5) { - sm2.setup({ - 'useHTML5Audio': true, - 'preferFlash': false - }); - } - testHTML5(); - if (!hasFlash && needsFlash) { - messages.push(strings.needFlash); - sm2.setup({ - 'flashLoadTimeout': 1 - }); - } - if (doc.removeEventListener) { - doc.removeEventListener('DOMContentLoaded', domContentLoaded, false); - } - initMovie(); - return true; - }; - domContentLoadedIE = function() { - if (doc.readyState === 'complete') { - domContentLoaded(); - doc.detachEvent('onreadystatechange', domContentLoadedIE); - } - return true; - }; - winOnLoad = function() { - windowLoaded = true; - event.remove(window, 'load', winOnLoad); - }; - preInit = function() { - if (mobileHTML5) { - sm2.setupOptions.useHTML5Audio = true; - sm2.setupOptions.preferFlash = false; - if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) { - if (is_iDevice) { - sm2.ignoreFlash = true; - } - useGlobalHTML5Audio = true; - } - } - }; - preInit(); - detectFlash(); - event.add(window, 'focus', handleFocus); - event.add(window, 'load', delayWaitForEI); - event.add(window, 'load', winOnLoad); - if (doc.addEventListener) { - doc.addEventListener('DOMContentLoaded', domContentLoaded, false); - } else if (doc.attachEvent) { - doc.attachEvent('onreadystatechange', domContentLoadedIE); - } else { - catchError({type:'NO_DOM2_EVENTS', fatal:true}); - } -} -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading -if (window.SM2_DEFER === undefined || !SM2_DEFER) { - soundManager = new SoundManager(); -} -window.SoundManager = SoundManager; -window.soundManager = soundManager; -}(window)); diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js deleted file mode 100755 index ddbe3420..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/script/soundmanager2.js +++ /dev/null @@ -1,5989 +0,0 @@ -/** @license - * - * SoundManager 2: JavaScript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code provided under the BSD License: - * http://schillmania.com/projects/soundmanager2/license.txt - * - * V2.97a.20131201 - */ - -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */ -/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */ - -/** - * About this file - * ------------------------------------------------------------------------------------- - * This is the fully-commented source version of the SoundManager 2 API, - * recommended for use during development and testing. - * - * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.) - * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion - * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.) - * - * You may notice and comments in this source; these are delimiters for - * debug blocks which are removed in the -nodebug builds, further optimizing code size. - * - * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;) - */ - -(function(window, _undefined) { - -"use strict"; - -var soundManager = null; - -/** - * The SoundManager constructor. - * - * @constructor - * @param {string} smURL Optional: Path to SWF files - * @param {string} smID Optional: The ID to use for the SWF container element - * @this {SoundManager} - * @return {SoundManager} The new SoundManager instance - */ - -function SoundManager(smURL, smID) { - - /** - * soundManager configuration options list - * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion) - * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9}) - */ - - this.setupOptions = { - - 'url': (smURL || null), // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/ - 'flashVersion': 8, // flash build to use (8 or 9.) Some API features require 9. - 'debugMode': true, // enable debugging output (console.log() with HTML fallback) - 'debugFlash': false, // enable debugging output inside SWF, troubleshoot Flash/browser issues - 'useConsole': true, // use console.log() if available (otherwise, writes to #soundmanager-debug element) - 'consoleOnly': true, // if console is being used, do not create/write to #soundmanager-debug - 'waitForWindowLoad': false, // force SM2 to wait for window.onload() before trying to call soundManager.onload() - 'bgColor': '#ffffff', // SWF background color. N/A when wmode = 'transparent' - 'useHighPerformance': false, // position:fixed flash movie can help increase js/flash speed, minimize lag - 'flashPollingInterval': null, // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used. - 'html5PollingInterval': null, // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used. - 'flashLoadTimeout': 1000, // msec to wait for flash movie to load before failing (0 = infinity) - 'wmode': null, // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work) - 'allowScriptAccess': 'always', // for scripting the SWF (object/embed property), 'always' or 'sameDomain' - 'useFlashBlock': false, // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable. - 'useHTML5Audio': true, // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible. - 'html5Test': /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative. - 'preferFlash': false, // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky. - 'noSWFCache': false, // if true, appends ?ts={date} to break aggressive SWF caching. - 'idPrefix': 'sound' // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc. - - }; - - this.defaultOptions = { - - /** - * the default configuration for sound objects made with createSound() and related methods - * eg., volume, auto-load behaviour and so forth - */ - - 'autoLoad': false, // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can) - 'autoPlay': false, // enable playing of file as soon as possible (much faster if "stream" is true) - 'from': null, // position to start playback within a sound (msec), default = beginning - 'loops': 1, // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0) - 'onid3': null, // callback function for "ID3 data is added/available" - 'onload': null, // callback function for "load finished" - 'whileloading': null, // callback function for "download progress update" (X of Y bytes received) - 'onplay': null, // callback for "play" start - 'onpause': null, // callback for "pause" - 'onresume': null, // callback for "resume" (pause toggle) - 'whileplaying': null, // callback during play (position update) - 'onposition': null, // object containing times and function callbacks for positions of interest - 'onstop': null, // callback for "user stop" - 'onfailure': null, // callback function for when playing fails - 'onfinish': null, // callback function for "sound finished playing" - 'multiShot': true, // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time - 'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled - 'position': null, // offset (milliseconds) to seek to within loaded sound data. - 'pan': 0, // "pan" settings, left-to-right, -100 to 100 - 'stream': true, // allows playing before entire file has loaded (recommended) - 'to': null, // position to end playback within a sound (msec), default = end - 'type': null, // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3 - 'usePolicyFile': false, // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access) - 'volume': 100 // self-explanatory. 0-100, the latter being the max. - - }; - - this.flash9Options = { - - /** - * flash 9-only options, - * merged into defaultOptions if flash 9 is being used - */ - - 'isMovieStar': null, // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL - 'usePeakData': false, // enable left/right channel peak (level) data - 'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load. - 'useEQData': false, // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load. - 'onbufferchange': null, // callback for "isBuffering" property change - 'ondataerror': null // callback for waveform/eq data access error (flash playing audio in other tabs/domains) - - }; - - this.movieStarOptions = { - - /** - * flash 9.0r115+ MPEG4 audio options, - * merged into defaultOptions if flash 9+movieStar mode is enabled - */ - - 'bufferTime': 3, // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.) - 'serverURL': null, // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants - 'onconnect': null, // rtmp: callback for connection to flash media server - 'duration': null // rtmp: song duration (msec) - - }; - - this.audioFormats = { - - /** - * determines HTML5 support + flash requirements. - * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start. - * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true) - */ - - 'mp3': { - 'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'], - 'required': true - }, - - 'mp4': { - 'related': ['aac','m4a','m4b'], // additional formats under the MP4 container - 'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'], - 'required': false - }, - - 'ogg': { - 'type': ['audio/ogg; codecs=vorbis'], - 'required': false - }, - - 'opus': { - 'type': ['audio/ogg; codecs=opus', 'audio/opus'], - 'required': false - }, - - 'wav': { - 'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'], - 'required': false - } - - }; - - // HTML attributes (id + class names) for the SWF container - - this.movieID = 'sm2-container'; - this.id = (smID || 'sm2movie'); - - this.debugID = 'soundmanager-debug'; - this.debugURLParam = /([#?&])debug=1/i; - - // dynamic attributes - - this.versionNumber = 'V2.97a.20131201'; - this.version = null; - this.movieURL = null; - this.altURL = null; - this.swfLoaded = false; - this.enabled = false; - this.oMC = null; - this.sounds = {}; - this.soundIDs = []; - this.muted = false; - this.didFlashBlock = false; - this.filePattern = null; - - this.filePatterns = { - - 'flash8': /\.mp3(\?.*)?$/i, - 'flash9': /\.mp3(\?.*)?$/i - - }; - - // support indicators, set at init - - this.features = { - - 'buffering': false, - 'peakData': false, - 'waveformData': false, - 'eqData': false, - 'movieStar': false - - }; - - // flash sandbox info, used primarily in troubleshooting - - this.sandbox = { - - // - 'type': null, - 'types': { - 'remote': 'remote (domain-based) rules', - 'localWithFile': 'local with file access (no internet access)', - 'localWithNetwork': 'local with network (internet access only, no local access)', - 'localTrusted': 'local, trusted (local+internet access)' - }, - 'description': null, - 'noRemote': null, - 'noLocal': null - // - - }; - - /** - * format support (html5/flash) - * stores canPlayType() results based on audioFormats. - * eg. { mp3: boolean, mp4: boolean } - * treat as read-only. - */ - - this.html5 = { - 'usingFlash': null // set if/when flash fallback is needed - }; - - // file type support hash - this.flash = {}; - - // determined at init time - this.html5Only = false; - - // used for special cases (eg. iPad/iPhone/palm OS?) - this.ignoreFlash = false; - - /** - * a few private internals (OK, a lot. :D) - */ - - var SMSound, - sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [], - canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0, - is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)), - mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid), - isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159 - hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000, - emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs) - emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading - overHTTP = (doc.location?doc.location.protocol.match(/http/i):null), - http = (!overHTTP ? 'http:/'+'/' : ''), - // mp3, mp4, aac etc. - netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i, - // Flash v9.0r115+ "moviestar" formats - netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'], - netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - - this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set - - // use altURL if not "online" - this.useAltURL = !overHTTP; - - swfCSS = { - - 'swfBox': 'sm2-object-box', - 'swfDefault': 'movieContainer', - 'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error) - 'swfTimedout': 'swf_timedout', - 'swfLoaded': 'swf_loaded', - 'swfUnblocked': 'swf_unblocked', // or loaded OK - 'sm2Debug': 'sm2_debug', - 'highPerf': 'high_performance', - 'flashDebug': 'flash_debug' - - }; - - /** - * basic HTML5 Audio() support test - * try...catch because of IE 9 "not implemented" nonsense - * https://github.com/Modernizr/Modernizr/issues/224 - */ - - this.hasHTML5 = (function() { - try { - // new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise. - return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined); - } catch(e) { - return false; - } - }()); - - /** - * Public SoundManager API - * ----------------------- - */ - - /** - * Configures top-level soundManager properties. - * - * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' } - * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list. - */ - - this.setup = function(options) { - - var noURL = (!sm2.url); - - // warn if flash options have already been applied - - if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) { - complain(str('setupLate')); - } - - // TODO: defer: true? - - assign(options); - - // special case 1: "Late setup". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init. - - if (options) { - - if (noURL && didDCLoaded && options.url !== _undefined) { - sm2.beginDelayedInit(); - } - - // special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP. - - if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') { - setTimeout(domContentLoaded, 1); - } - - } - - return sm2; - - }; - - this.ok = function() { - - return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5)); - - }; - - this.supported = this.ok; // legacy - - this.getMovie = function(smID) { - - // safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version - return id(smID) || doc[smID] || window[smID]; - - }; - - /** - * Creates a SMSound sound object instance. - * - * @param {object} oOptions Sound options (at minimum, id and url parameters are required.) - * @return {object} SMSound The new SMSound object. - */ - - this.createSound = function(oOptions, _url) { - - var cs, cs_string, options, oSound = null; - - // - cs = sm + '.createSound(): '; - cs_string = cs + str(!didInit?'notReady':'notOK'); - // - - if (!didInit || !sm2.ok()) { - complain(cs_string); - return false; - } - - if (_url !== _undefined) { - // function overloading in JS! :) ..assume simple createSound(id, url) use case - oOptions = { - 'id': oOptions, - 'url': _url - }; - } - - // inherit from defaultOptions - options = mixin(oOptions); - - options.url = parseURL(options.url); - - // generate an id, if needed. - if (options.id === undefined) { - options.id = sm2.setupOptions.idPrefix + (idCounter++); - } - - // - if (options.id.toString().charAt(0).match(/^[0-9]$/)) { - sm2._wD(cs + str('badID', options.id), 2); - } - - sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1); - // - - if (idCheck(options.id, true)) { - sm2._wD(cs + options.id + ' exists', 1); - return sm2.sounds[options.id]; - } - - function make() { - - options = loopFix(options); - sm2.sounds[options.id] = new SMSound(options); - sm2.soundIDs.push(options.id); - return sm2.sounds[options.id]; - - } - - if (html5OK(options)) { - - oSound = make(); - sm2._wD(options.id + ': Using HTML5'); - oSound._setup_html5(options); - - } else { - - if (sm2.html5Only) { - sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.'); - return make(); - } - - // TODO: Move HTML5/flash checks into generic URL parsing/handling function. - - if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) { - // data: URIs not supported by Flash, either. - sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.'); - return make(); - } - - if (fV > 8) { - if (options.isMovieStar === null) { - // attempt to detect MPEG-4 formats - options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern))); - } - // - if (options.isMovieStar) { - sm2._wD(cs + 'using MovieStar handling'); - if (options.loops > 1) { - _wDS('noNSLoop'); - } - } - // - } - - options = policyFix(options, cs); - oSound = make(); - - if (fV === 8) { - flash._createSound(options.id, options.loops||1, options.usePolicyFile); - } else { - flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile); - if (!options.serverURL) { - // We are connected immediately - oSound.connected = true; - if (options.onconnect) { - options.onconnect.apply(oSound); - } - } - } - - if (!options.serverURL && (options.autoLoad || options.autoPlay)) { - // call load for non-rtmp streams - oSound.load(options); - } - - } - - // rtmp will play in onconnect - if (!options.serverURL && options.autoPlay) { - oSound.play(); - } - - return oSound; - - }; - - /** - * Destroys a SMSound sound object instance. - * - * @param {string} sID The ID of the sound to destroy - */ - - this.destroySound = function(sID, _bFromSound) { - - // explicitly destroy a sound before normal page unload, etc. - - if (!idCheck(sID)) { - return false; - } - - var oS = sm2.sounds[sID], i; - - // Disable all callbacks while the sound is being destroyed - oS._iO = {}; - - oS.stop(); - oS.unload(); - - for (i = 0; i < sm2.soundIDs.length; i++) { - if (sm2.soundIDs[i] === sID) { - sm2.soundIDs.splice(i, 1); - break; - } - } - - if (!_bFromSound) { - // ignore if being called from SMSound instance - oS.destruct(true); - } - - oS = null; - delete sm2.sounds[sID]; - - return true; - - }; - - /** - * Calls the load() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {object} oOptions Optional: Sound options - */ - - this.load = function(sID, oOptions) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].load(oOptions); - - }; - - /** - * Calls the unload() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - */ - - this.unload = function(sID) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].unload(); - - }; - - /** - * Calls the onPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPosition The position to watch for - * @param {function} oMethod The relevant callback to fire - * @param {object} oScope Optional: The scope to apply the callback to - * @return {SMSound} The SMSound object - */ - - this.onPosition = function(sID, nPosition, oMethod, oScope) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].onposition(nPosition, oMethod, oScope); - - }; - - // legacy/backwards-compability: lower-case method name - this.onposition = this.onPosition; - - /** - * Calls the clearOnPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPosition The position to watch for - * @param {function} oMethod Optional: The relevant callback to fire - * @return {SMSound} The SMSound object - */ - - this.clearOnPosition = function(sID, nPosition, oMethod) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].clearOnPosition(nPosition, oMethod); - - }; - - /** - * Calls the play() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.play = function(sID, oOptions) { - - var result = null, - // legacy function-overloading use case: play('mySound', '/path/to/some.mp3'); - overloaded = (oOptions && !(oOptions instanceof Object)); - - if (!didInit || !sm2.ok()) { - complain(sm + '.play(): ' + str(!didInit?'notReady':'notOK')); - return false; - } - - if (!idCheck(sID, overloaded)) { - - if (!overloaded) { - // no sound found for the given ID. Bail. - return false; - } - - if (overloaded) { - oOptions = { - url: oOptions - }; - } - - if (oOptions && oOptions.url) { - // overloading use case, create+play: .play('someID', {url:'/path/to.mp3'}); - sm2._wD(sm + '.play(): Attempting to create "' + sID + '"', 1); - oOptions.id = sID; - result = sm2.createSound(oOptions).play(); - } - - } else if (overloaded) { - - // existing sound object case - oOptions = { - url: oOptions - }; - - } - - if (result === null) { - // default case - result = sm2.sounds[sID].play(oOptions); - } - - return result; - - }; - - this.start = this.play; // just for convenience - - /** - * Calls the setPosition() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nMsecOffset Position (milliseconds) - * @return {SMSound} The SMSound object - */ - - this.setPosition = function(sID, nMsecOffset) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPosition(nMsecOffset); - - }; - - /** - * Calls the stop() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.stop = function(sID) { - - if (!idCheck(sID)) { - return false; - } - - sm2._wD(sm + '.stop(' + sID + ')', 1); - return sm2.sounds[sID].stop(); - - }; - - /** - * Stops all currently-playing sounds. - */ - - this.stopAll = function() { - - var oSound; - sm2._wD(sm + '.stopAll()', 1); - - for (oSound in sm2.sounds) { - if (sm2.sounds.hasOwnProperty(oSound)) { - // apply only to sound objects - sm2.sounds[oSound].stop(); - } - } - - }; - - /** - * Calls the pause() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.pause = function(sID) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].pause(); - - }; - - /** - * Pauses all currently-playing sounds. - */ - - this.pauseAll = function() { - - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].pause(); - } - - }; - - /** - * Calls the resume() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.resume = function(sID) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].resume(); - - }; - - /** - * Resumes all currently-paused sounds. - */ - - this.resumeAll = function() { - - var i; - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].resume(); - } - - }; - - /** - * Calls the togglePause() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.togglePause = function(sID) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].togglePause(); - - }; - - /** - * Calls the setPan() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nPan The pan value (-100 to 100) - * @return {SMSound} The SMSound object - */ - - this.setPan = function(sID, nPan) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setPan(nPan); - - }; - - /** - * Calls the setVolume() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @param {number} nVol The volume value (0 to 100) - * @return {SMSound} The SMSound object - */ - - this.setVolume = function(sID, nVol) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].setVolume(nVol); - - }; - - /** - * Calls the mute() method of either a single SMSound object by ID, or all sound objects. - * - * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) - */ - - this.mute = function(sID) { - - var i = 0; - - if (sID instanceof String) { - sID = null; - } - - if (!sID) { - - sm2._wD(sm + '.mute(): Muting all sounds'); - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].mute(); - } - sm2.muted = true; - - } else { - - if (!idCheck(sID)) { - return false; - } - sm2._wD(sm + '.mute(): Muting "' + sID + '"'); - return sm2.sounds[sID].mute(); - - } - - return true; - - }; - - /** - * Mutes all sounds. - */ - - this.muteAll = function() { - - sm2.mute(); - - }; - - /** - * Calls the unmute() method of either a single SMSound object by ID, or all sound objects. - * - * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.) - */ - - this.unmute = function(sID) { - - var i; - - if (sID instanceof String) { - sID = null; - } - - if (!sID) { - - sm2._wD(sm + '.unmute(): Unmuting all sounds'); - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].unmute(); - } - sm2.muted = false; - - } else { - - if (!idCheck(sID)) { - return false; - } - sm2._wD(sm + '.unmute(): Unmuting "' + sID + '"'); - return sm2.sounds[sID].unmute(); - - } - - return true; - - }; - - /** - * Unmutes all sounds. - */ - - this.unmuteAll = function() { - - sm2.unmute(); - - }; - - /** - * Calls the toggleMute() method of a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.toggleMute = function(sID) { - - if (!idCheck(sID)) { - return false; - } - return sm2.sounds[sID].toggleMute(); - - }; - - /** - * Retrieves the memory used by the flash plugin. - * - * @return {number} The amount of memory in use - */ - - this.getMemoryUse = function() { - - // flash-only - var ram = 0; - - if (flash && fV !== 8) { - ram = parseInt(flash._getMemoryUse(), 10); - } - - return ram; - - }; - - /** - * Undocumented: NOPs soundManager and all SMSound objects. - */ - - this.disable = function(bNoDisable) { - - // destroy all functions - var i; - - if (bNoDisable === _undefined) { - bNoDisable = false; - } - - if (disabled) { - return false; - } - - disabled = true; - _wDS('shutdown', 1); - - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - disableObject(sm2.sounds[sm2.soundIDs[i]]); - } - - // fire "complete", despite fail - initComplete(bNoDisable); - event.remove(window, 'load', initUserOnload); - - return true; - - }; - - /** - * Determines playability of a MIME type, eg. 'audio/mp3'. - */ - - this.canPlayMIME = function(sMIME) { - - var result; - - if (sm2.hasHTML5) { - result = html5CanPlay({type:sMIME}); - } - - if (!result && needsFlash) { - // if flash 9, test netStream (movieStar) types as well. - result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less "weird" (per JSLint) - } - - return result; - - }; - - /** - * Determines playability of a URL based on audio support. - * - * @param {string} sURL The URL to test - * @return {boolean} URL playability - */ - - this.canPlayURL = function(sURL) { - - var result; - - if (sm2.hasHTML5) { - result = html5CanPlay({url: sURL}); - } - - if (!result && needsFlash) { - result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null); - } - - return result; - - }; - - /** - * Determines playability of an HTML DOM <a> object (or similar object literal) based on audio support. - * - * @param {object} oLink an HTML DOM <a> object or object literal including href and/or type attributes - * @return {boolean} URL playability - */ - - this.canPlayLink = function(oLink) { - - if (oLink.type !== _undefined && oLink.type) { - if (sm2.canPlayMIME(oLink.type)) { - return true; - } - } - - return sm2.canPlayURL(oLink.href); - - }; - - /** - * Retrieves a SMSound object by ID. - * - * @param {string} sID The ID of the sound - * @return {SMSound} The SMSound object - */ - - this.getSoundById = function(sID, _suppressDebug) { - - if (!sID) { - return null; - } - - var result = sm2.sounds[sID]; - - // - if (!result && !_suppressDebug) { - sm2._wD(sm + '.getSoundById(): Sound "' + sID + '" not found.', 2); - } - // - - return result; - - }; - - /** - * Queues a callback for execution when SoundManager has successfully initialized. - * - * @param {function} oMethod The callback method to fire - * @param {object} oScope Optional: The scope to apply to the callback - */ - - this.onready = function(oMethod, oScope) { - - var sType = 'onready', - result = false; - - if (typeof oMethod === 'function') { - - // - if (didInit) { - sm2._wD(str('queue', sType)); - } - // - - if (!oScope) { - oScope = window; - } - - addOnEvent(sType, oMethod, oScope); - processOnEvents(); - - result = true; - - } else { - - throw str('needFunction', sType); - - } - - return result; - - }; - - /** - * Queues a callback for execution when SoundManager has failed to initialize. - * - * @param {function} oMethod The callback method to fire - * @param {object} oScope Optional: The scope to apply to the callback - */ - - this.ontimeout = function(oMethod, oScope) { - - var sType = 'ontimeout', - result = false; - - if (typeof oMethod === 'function') { - - // - if (didInit) { - sm2._wD(str('queue', sType)); - } - // - - if (!oScope) { - oScope = window; - } - - addOnEvent(sType, oMethod, oScope); - processOnEvents({type:sType}); - - result = true; - - } else { - - throw str('needFunction', sType); - - } - - return result; - - }; - - /** - * Writes console.log()-style debug output to a console or in-browser element. - * Applies when debugMode = true - * - * @param {string} sText The console message - * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped. - */ - - this._writeDebug = function(sText, sTypeOrObject) { - - // pseudo-private console.log()-style output - // - - var sDID = 'soundmanager-debug', o, oItem; - - if (!sm2.debugMode) { - return false; - } - - if (hasConsole && sm2.useConsole) { - if (sTypeOrObject && typeof sTypeOrObject === 'object') { - // object passed; dump to console. - console.log(sText, sTypeOrObject); - } else if (debugLevels[sTypeOrObject] !== _undefined) { - console[debugLevels[sTypeOrObject]](sText); - } else { - console.log(sText); - } - if (sm2.consoleOnly) { - return true; - } - } - - o = id(sDID); - - if (!o) { - return false; - } - - oItem = doc.createElement('div'); - - if (++wdCount % 2 === 0) { - oItem.className = 'sm2-alt'; - } - - if (sTypeOrObject === _undefined) { - sTypeOrObject = 0; - } else { - sTypeOrObject = parseInt(sTypeOrObject, 10); - } - - oItem.appendChild(doc.createTextNode(sText)); - - if (sTypeOrObject) { - if (sTypeOrObject >= 2) { - oItem.style.fontWeight = 'bold'; - } - if (sTypeOrObject === 3) { - oItem.style.color = '#ff3333'; - } - } - - // top-to-bottom - // o.appendChild(oItem); - - // bottom-to-top - o.insertBefore(oItem, o.firstChild); - - o = null; - // - - return true; - - }; - - // - // last-resort debugging option - if (wl.indexOf('sm2-debug=alert') !== -1) { - this._writeDebug = function(sText) { - window.alert(sText); - }; - } - // - - // alias - this._wD = this._writeDebug; - - /** - * Provides debug / state information on all SMSound objects. - */ - - this._debug = function() { - - // - var i, j; - _wDS('currentObj', 1); - - for (i = 0, j = sm2.soundIDs.length; i < j; i++) { - sm2.sounds[sm2.soundIDs[i]]._debug(); - } - // - - }; - - /** - * Restarts and re-initializes the SoundManager instance. - * - * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks. - * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2). - * @return {object} soundManager The soundManager instance. - */ - - this.reboot = function(resetEvents, excludeInit) { - - // reset some (or all) state, and re-init unless otherwise specified. - - // - if (sm2.soundIDs.length) { - sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...'); - } - // - - var i, j, k; - - for (i = sm2.soundIDs.length-1; i >= 0; i--) { - sm2.sounds[sm2.soundIDs[i]].destruct(); - } - - // trash ze flash (remove from the DOM) - - if (flash) { - - try { - - if (isIE) { - oRemovedHTML = flash.innerHTML; - } - - oRemoved = flash.parentNode.removeChild(flash); - - } catch(e) { - - // Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue. - - _wDS('badRemove', 2); - - } - - } - - // actually, force recreate of movie. - - oRemovedHTML = oRemoved = needsFlash = flash = null; - - sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false; - - sm2.soundIDs = []; - sm2.sounds = {}; - - idCounter = 0; - - if (!resetEvents) { - // reset callbacks for onready, ontimeout etc. so that they will fire again on re-init - for (i in on_queue) { - if (on_queue.hasOwnProperty(i)) { - for (j = 0, k = on_queue[i].length; j < k; j++) { - on_queue[i][j].fired = false; - } - } - } - } else { - // remove all callbacks entirely - on_queue = []; - } - - // - if (!excludeInit) { - sm2._wD(sm + ': Rebooting...'); - } - // - - // reset HTML5 and flash canPlay test results - - sm2.html5 = { - 'usingFlash': null - }; - - sm2.flash = {}; - - // reset device-specific HTML/flash mode switches - - sm2.html5Only = false; - sm2.ignoreFlash = false; - - window.setTimeout(function() { - - preInit(); - - // by default, re-init - - if (!excludeInit) { - sm2.beginDelayedInit(); - } - - }, 20); - - return sm2; - - }; - - this.reset = function() { - - /** - * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed. - * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit(). - * @return {object} soundManager The soundManager instance. - */ - - _wDS('reset'); - return sm2.reboot(true, true); - - }; - - /** - * Undocumented: Determines the SM2 flash movie's load progress. - * - * @return {number or null} Percent loaded, or if invalid/unsupported, null. - */ - - this.getMoviePercent = function() { - - /** - * Interesting syntax notes... - * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof "function" nor instanceof Function, but are still valid. - * Additionally, JSLint dislikes ('PercentLoaded' in flash)-style syntax and recommends hasOwnProperty(), which does not work in this case. - * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw "object doesn't support this property or method". - * Thus, 'in' syntax must be used. - */ - - return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); // Yes, JSLint. See nearby comment in source for explanation. - - }; - - /** - * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload(). - */ - - this.beginDelayedInit = function() { - - windowLoaded = true; - domContentLoaded(); - - setTimeout(function() { - - if (initPending) { - return false; - } - - createMovie(); - initMovie(); - initPending = true; - - return true; - - }, 20); - - delayWaitForEI(); - - }; - - /** - * Destroys the SoundManager instance and all SMSound instances. - */ - - this.destruct = function() { - - sm2._wD(sm + '.destruct()'); - sm2.disable(true); - - }; - - /** - * SMSound() (sound object) constructor - * ------------------------------------ - * - * @param {object} oOptions Sound options (id and url are required attributes) - * @return {SMSound} The new SMSound object - */ - - SMSound = function(oOptions) { - - var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted; - - lastHTML5State = { - // tracks duration + position (time) - duration: null, - time: null - }; - - this.id = oOptions.id; - - // legacy - this.sID = this.id; - - this.url = oOptions.url; - this.options = mixin(oOptions); - - // per-play-instance-specific options - this.instanceOptions = this.options; - - // short alias - this._iO = this.instanceOptions; - - // assign property defaults - this.pan = this.options.pan; - this.volume = this.options.volume; - - // whether or not this object is using HTML5 - this.isHTML5 = false; - - // internal HTML5 Audio() object reference - this._a = null; - - // for flash 8 special-case createSound() without url, followed by load/play with url case - urlOmitted = (this.url ? false : true); - - /** - * SMSound() public methods - * ------------------------ - */ - - this.id3 = {}; - - /** - * Writes SMSound object parameters to debug console - */ - - this._debug = function() { - - // - sm2._wD(s.id + ': Merged options:', s.options); - // - - }; - - /** - * Begins loading a sound per its *url*. - * - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.load = function(oOptions) { - - var oSound = null, instanceOptions; - - if (oOptions !== _undefined) { - s._iO = mixin(oOptions, s.options); - } else { - oOptions = s.options; - s._iO = oOptions; - if (lastURL && lastURL !== s.url) { - _wDS('manURL'); - s._iO.url = s.url; - s.url = null; - } - } - - if (!s._iO.url) { - s._iO.url = s.url; - } - - s._iO.url = parseURL(s._iO.url); - - // ensure we're in sync - s.instanceOptions = s._iO; - - // local shortcut - instanceOptions = s._iO; - - sm2._wD(s.id + ': load (' + instanceOptions.url + ')'); - - if (!instanceOptions.url && !s.url) { - sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2); - return s; - } - - // - if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) { - // flash 8 load() -> play() won't work before onload has fired. - sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1); - } - // - - if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) { - _wDS('onURL', 1); - // if loaded and an onload() exists, fire immediately. - if (s.readyState === 3 && instanceOptions.onload) { - // assume success based on truthy duration. - wrapCallback(s, function() { - instanceOptions.onload.apply(s, [(!!s.duration)]); - }); - } - return s; - } - - // reset a few state properties - - s.loaded = false; - s.readyState = 1; - s.playState = 0; - s.id3 = {}; - - // TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio. - - if (html5OK(instanceOptions)) { - - oSound = s._setup_html5(instanceOptions); - - if (!oSound._called_load) { - - s._html5_canplay = false; - - // TODO: review called_load / html5_canplay logic - - // if url provided directly to load(), assign it here. - - if (s.url !== instanceOptions.url) { - - sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url); - - s._a.src = instanceOptions.url; - - // TODO: review / re-apply all relevant options (volume, loop, onposition etc.) - - // reset position for new URL - s.setPosition(0); - - } - - // given explicit load call, try to preload. - - // early HTML5 implementation (non-standard) - s._a.autobuffer = 'auto'; - - // standard property, values: none / metadata / auto - // reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx - s._a.preload = 'auto'; - - s._a._called_load = true; - - } else { - - sm2._wD(s.id + ': Ignoring request to load again'); - - } - - } else { - - if (sm2.html5Only) { - sm2._wD(s.id + ': No flash support. Exiting.'); - return s; - } - - if (s._iO.url && s._iO.url.match(/data\:/i)) { - // data: URIs not supported by Flash, either. - sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.'); - return s; - } - - try { - s.isHTML5 = false; - s._iO = policyFix(loopFix(instanceOptions)); - // re-assign local shortcut - instanceOptions = s._iO; - if (fV === 8) { - flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile); - } else { - flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile); - } - } catch(e) { - _wDS('smError', 2); - debugTS('onload', false); - catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true}); - } - - } - - // after all of this, ensure sound url is up to date. - s.url = instanceOptions.url; - - return s; - - }; - - /** - * Unloads a sound, canceling any open HTTP requests. - * - * @return {SMSound} The SMSound object - */ - - this.unload = function() { - - // Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL - // Flash 9/AS3: Close stream, preventing further load - // HTML5: Most UAs will use empty URL - - if (s.readyState !== 0) { - - sm2._wD(s.id + ': unload()'); - - if (!s.isHTML5) { - - if (fV === 8) { - flash._unload(s.id, emptyURL); - } else { - flash._unload(s.id); - } - - } else { - - stop_html5_timer(); - - if (s._a) { - - s._a.pause(); - - // update empty URL, too - lastURL = html5Unload(s._a); - - } - - } - - // reset load/status flags - resetProperties(); - - } - - return s; - - }; - - /** - * Unloads and destroys a sound. - */ - - this.destruct = function(_bFromSM) { - - sm2._wD(s.id + ': Destruct'); - - if (!s.isHTML5) { - - // kill sound within Flash - // Disable the onfailure handler - s._iO.onfailure = null; - flash._destroySound(s.id); - - } else { - - stop_html5_timer(); - - if (s._a) { - s._a.pause(); - html5Unload(s._a); - if (!useGlobalHTML5Audio) { - remove_html5_events(); - } - // break obvious circular reference - s._a._s = null; - s._a = null; - } - - } - - if (!_bFromSM) { - // ensure deletion from controller - sm2.destroySound(s.id, true); - } - - }; - - /** - * Begins playing a sound. - * - * @param {object} oOptions Optional: Sound options - * @return {SMSound} The SMSound object - */ - - this.play = function(oOptions, _updatePlayState) { - - var fN, allowMulti, a, onready, - audioClone, onended, oncanplay, - startOK = true, - exit = null; - - // - fN = s.id + ': play(): '; - // - - // default to true - _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState); - - if (!oOptions) { - oOptions = {}; - } - - // first, use local URL (if specified) - if (s.url) { - s._iO.url = s.url; - } - - // mix in any options defined at createSound() - s._iO = mixin(s._iO, s.options); - - // mix in any options specific to this method - s._iO = mixin(oOptions, s._iO); - - s._iO.url = parseURL(s._iO.url); - - s.instanceOptions = s._iO; - - // RTMP-only - if (!s.isHTML5 && s._iO.serverURL && !s.connected) { - if (!s.getAutoPlay()) { - sm2._wD(fN +' Netstream not connected yet - setting autoPlay'); - s.setAutoPlay(true); - } - // play will be called in onconnect() - return s; - } - - if (html5OK(s._iO)) { - s._setup_html5(s._iO); - start_html5_timer(); - } - - if (s.playState === 1 && !s.paused) { - allowMulti = s._iO.multiShot; - if (!allowMulti) { - sm2._wD(fN + 'Already playing (one-shot)', 1); - if (s.isHTML5) { - // go back to original position. - s.setPosition(s._iO.position); - } - exit = s; - } else { - sm2._wD(fN + 'Already playing (multi-shot)', 1); - } - } - - if (exit !== null) { - return exit; - } - - // edge case: play() with explicit URL parameter - if (oOptions.url && oOptions.url !== s.url) { - - // special case for createSound() followed by load() / play() with url; avoid double-load case. - if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) { - - urlOmitted = false; - - } else { - - // load using merged options - s.load(s._iO); - - } - - } - - if (!s.loaded) { - - if (s.readyState === 0) { - - sm2._wD(fN + 'Attempting to load'); - - // try to get this sound playing ASAP - if (!s.isHTML5 && !sm2.html5Only) { - - // flash: assign directly because setAutoPlay() increments the instanceCount - s._iO.autoPlay = true; - s.load(s._iO); - - } else if (s.isHTML5) { - - // iOS needs this when recycling sounds, loading a new URL on an existing object. - s.load(s._iO); - - } else { - - sm2._wD(fN + 'Unsupported type. Exiting.'); - exit = s; - - } - - // HTML5 hack - re-set instanceOptions? - s.instanceOptions = s._iO; - - } else if (s.readyState === 2) { - - sm2._wD(fN + 'Could not load - exiting', 2); - exit = s; - - } else { - - sm2._wD(fN + 'Loading - attempting to play...'); - - } - - } else { - - // "play()" - sm2._wD(fN.substr(0, fN.lastIndexOf(':'))); - - } - - if (exit !== null) { - return exit; - } - - if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) { - // flash 9 needs a position reset if play() is called while at the end of a sound. - sm2._wD(fN + 'Sound at end, resetting to position:0'); - oOptions.position = 0; - } - - /** - * Streams will pause when their buffer is full if they are being loaded. - * In this case paused is true, but the song hasn't started playing yet. - * If we just call resume() the onplay() callback will never be called. - * So only call resume() if the position is > 0. - * Another reason is because options like volume won't have been applied yet. - * For normal sounds, just resume. - */ - - if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) { - - // https://gist.github.com/37b17df75cc4d7a90bf6 - sm2._wD(fN + 'Resuming from paused state', 1); - s.resume(); - - } else { - - s._iO = mixin(oOptions, s._iO); - - // apply from/to parameters, if they exist (and not using RTMP) - if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) { - - onready = function() { - // sound "canplay" or onload() - // re-apply from/to to instance options, and start playback - s._iO = mixin(oOptions, s._iO); - s.play(s._iO); - }; - - // HTML5 needs to at least have "canplay" fired before seeking. - if (s.isHTML5 && !s._html5_canplay) { - - // this hasn't been loaded yet. load it first, and then do this again. - sm2._wD(fN + 'Beginning load for from/to case'); - - s.load({ - // note: custom HTML5-only event added for from/to implementation. - _oncanplay: onready - }); - - exit = false; - - } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) { - - // to be safe, preload the whole thing in Flash. - - sm2._wD(fN + 'Preloading for from/to case'); - - s.load({ - onload: onready - }); - - exit = false; - - } - - if (exit !== null) { - return exit; - } - - // otherwise, we're ready to go. re-apply local options, and continue - - s._iO = applyFromTo(); - - } - - // sm2._wD(fN + 'Starting to play'); - - // increment instance counter, where enabled + supported - if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) { - s.instanceCount++; - } - - // if first play and onposition parameters exist, apply them now - if (s._iO.onposition && s.playState === 0) { - attachOnPosition(s); - } - - s.playState = 1; - s.paused = false; - - s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0); - - if (!s.isHTML5) { - s._iO = policyFix(loopFix(s._iO)); - } - - if (s._iO.onplay && _updatePlayState) { - s._iO.onplay.apply(s); - onplay_called = true; - } - - s.setVolume(s._iO.volume, true); - s.setPan(s._iO.pan, true); - - if (!s.isHTML5) { - - startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false); - - if (fV === 9 && !startOK) { - // edge case: no sound hardware, or 32-channel flash ceiling hit. - // applies only to Flash 9, non-NetStream/MovieStar sounds. - // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29 - sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2); - if (s._iO.onplayerror) { - s._iO.onplayerror.apply(s); - } - - } - - } else { - - if (s.instanceCount < 2) { - - // HTML5 single-instance case - - start_html5_timer(); - - a = s._setup_html5(); - - s.setPosition(s._iO.position); - - a.play(); - - } else { - - // HTML5 multi-shot case - - sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...'); - - audioClone = new Audio(s._iO.url); - - onended = function() { - event.remove(audioClone, 'ended', onended); - s._onfinish(s); - // cleanup - html5Unload(audioClone); - audioClone = null; - }; - - oncanplay = function() { - event.remove(audioClone, 'canplay', oncanplay); - try { - audioClone.currentTime = s._iO.position/msecScale; - } catch(err) { - complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position/msecScale)); - } - audioClone.play(); - }; - - event.add(audioClone, 'ended', onended); - - // apply volume to clones, too - if (s._iO.volume !== undefined) { - audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100)); - } - - // playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it. - if (s.muted) { - audioClone.muted = true; - } - - if (s._iO.position) { - // HTML5 audio can't seek before onplay() event has fired. - // wait for canplay, then seek to position and start playback. - event.add(audioClone, 'canplay', oncanplay); - } else { - // begin playback at currentTime: 0 - audioClone.play(); - } - - } - - } - - } - - return s; - - }; - - // just for convenience - this.start = this.play; - - /** - * Stops playing a sound (and optionally, all sounds) - * - * @param {boolean} bAll Optional: Whether to stop all sounds - * @return {SMSound} The SMSound object - */ - - this.stop = function(bAll) { - - var instanceOptions = s._iO, - originalPosition; - - if (s.playState === 1) { - - sm2._wD(s.id + ': stop()'); - - s._onbufferchange(0); - s._resetOnPosition(0); - s.paused = false; - - if (!s.isHTML5) { - s.playState = 0; - } - - // remove onPosition listeners, if any - detachOnPosition(); - - // and "to" position, if set - if (instanceOptions.to) { - s.clearOnPosition(instanceOptions.to); - } - - if (!s.isHTML5) { - - flash._stop(s.id, bAll); - - // hack for netStream: just unload - if (instanceOptions.serverURL) { - s.unload(); - } - - } else { - - if (s._a) { - - originalPosition = s.position; - - // act like Flash, though - s.setPosition(0); - - // hack: reflect old position for onstop() (also like Flash) - s.position = originalPosition; - - // html5 has no stop() - // NOTE: pausing means iOS requires interaction to resume. - s._a.pause(); - - s.playState = 0; - - // and update UI - s._onTimer(); - - stop_html5_timer(); - - } - - } - - s.instanceCount = 0; - s._iO = {}; - - if (instanceOptions.onstop) { - instanceOptions.onstop.apply(s); - } - - } - - return s; - - }; - - /** - * Undocumented/internal: Sets autoPlay for RTMP. - * - * @param {boolean} autoPlay state - */ - - this.setAutoPlay = function(autoPlay) { - - sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off')); - s._iO.autoPlay = autoPlay; - - if (!s.isHTML5) { - flash._setAutoPlay(s.id, autoPlay); - if (autoPlay) { - // only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP) - if (!s.instanceCount && s.readyState === 1) { - s.instanceCount++; - sm2._wD(s.id + ': Incremented instance count to '+s.instanceCount); - } - } - } - - }; - - /** - * Undocumented/internal: Returns the autoPlay boolean. - * - * @return {boolean} The current autoPlay value - */ - - this.getAutoPlay = function() { - - return s._iO.autoPlay; - - }; - - /** - * Sets the position of a sound. - * - * @param {number} nMsecOffset Position (milliseconds) - * @return {SMSound} The SMSound object - */ - - this.setPosition = function(nMsecOffset) { - - if (nMsecOffset === _undefined) { - nMsecOffset = 0; - } - - var position, position1K, - // Use the duration from the instance options, if we don't have a track duration yet. - // position >= 0 and <= current available (loaded) duration - offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0))); - - s.position = offset; - position1K = s.position/msecScale; - s._resetOnPosition(s.position); - s._iO.position = offset; - - if (!s.isHTML5) { - - position = (fV === 9 ? s.position : position1K); - - if (s.readyState && s.readyState !== 2) { - // if paused or not playing, will not resume (by playing) - flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot); - } - - } else if (s._a) { - - // Set the position in the canplay handler if the sound is not ready yet - if (s._html5_canplay) { - - if (s._a.currentTime !== position1K) { - - /** - * DOM/JS errors/exceptions to watch out for: - * if seek is beyond (loaded?) position, "DOM exception 11" - * "INDEX_SIZE_ERR": DOM exception 1 - */ - sm2._wD(s.id + ': setPosition('+position1K+')'); - - try { - s._a.currentTime = position1K; - if (s.playState === 0 || s.paused) { - // allow seek without auto-play/resume - s._a.pause(); - } - } catch(e) { - sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2); - } - - } - - } else if (position1K) { - - // warn on non-zero seek attempts - sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2); - return s; - - } - - if (s.paused) { - - // if paused, refresh UI right away - // force update - s._onTimer(true); - - } - - } - - return s; - - }; - - /** - * Pauses sound playback. - * - * @return {SMSound} The SMSound object - */ - - this.pause = function(_bCallFlash) { - - if (s.paused || (s.playState === 0 && s.readyState !== 1)) { - return s; - } - - sm2._wD(s.id + ': pause()'); - s.paused = true; - - if (!s.isHTML5) { - if (_bCallFlash || _bCallFlash === _undefined) { - flash._pause(s.id, s._iO.multiShot); - } - } else { - s._setup_html5().pause(); - stop_html5_timer(); - } - - if (s._iO.onpause) { - s._iO.onpause.apply(s); - } - - return s; - - }; - - /** - * Resumes sound playback. - * - * @return {SMSound} The SMSound object - */ - - /** - * When auto-loaded streams pause on buffer full they have a playState of 0. - * We need to make sure that the playState is set to 1 when these streams "resume". - * When a paused stream is resumed, we need to trigger the onplay() callback if it - * hasn't been called already. In this case since the sound is being played for the - * first time, I think it's more appropriate to call onplay() rather than onresume(). - */ - - this.resume = function() { - - var instanceOptions = s._iO; - - if (!s.paused) { - return s; - } - - sm2._wD(s.id + ': resume()'); - s.paused = false; - s.playState = 1; - - if (!s.isHTML5) { - if (instanceOptions.isMovieStar && !instanceOptions.serverURL) { - // Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition. - s.setPosition(s.position); - } - // flash method is toggle-based (pause/resume) - flash._pause(s.id, instanceOptions.multiShot); - } else { - s._setup_html5().play(); - start_html5_timer(); - } - - if (!onplay_called && instanceOptions.onplay) { - instanceOptions.onplay.apply(s); - onplay_called = true; - } else if (instanceOptions.onresume) { - instanceOptions.onresume.apply(s); - } - - return s; - - }; - - /** - * Toggles sound playback. - * - * @return {SMSound} The SMSound object - */ - - this.togglePause = function() { - - sm2._wD(s.id + ': togglePause()'); - - if (s.playState === 0) { - s.play({ - position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale) - }); - return s; - } - - if (s.paused) { - s.resume(); - } else { - s.pause(); - } - - return s; - - }; - - /** - * Sets the panning (L-R) effect. - * - * @param {number} nPan The pan value (-100 to 100) - * @return {SMSound} The SMSound object - */ - - this.setPan = function(nPan, bInstanceOnly) { - - if (nPan === _undefined) { - nPan = 0; - } - - if (bInstanceOnly === _undefined) { - bInstanceOnly = false; - } - - if (!s.isHTML5) { - flash._setPan(s.id, nPan); - } // else { no HTML5 pan? } - - s._iO.pan = nPan; - - if (!bInstanceOnly) { - s.pan = nPan; - s.options.pan = nPan; - } - - return s; - - }; - - /** - * Sets the volume. - * - * @param {number} nVol The volume value (0 to 100) - * @return {SMSound} The SMSound object - */ - - this.setVolume = function(nVol, _bInstanceOnly) { - - /** - * Note: Setting volume has no effect on iOS "special snowflake" devices. - * Hardware volume control overrides software, and volume - * will always return 1 per Apple docs. (iOS 4 + 5.) - * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html - */ - - if (nVol === _undefined) { - nVol = 100; - } - - if (_bInstanceOnly === _undefined) { - _bInstanceOnly = false; - } - - if (!s.isHTML5) { - flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol); - } else if (s._a) { - if (sm2.muted && !s.muted) { - s.muted = true; - s._a.muted = true; - } - // valid range: 0-1 - s._a.volume = Math.max(0, Math.min(1, nVol/100)); - } - - s._iO.volume = nVol; - - if (!_bInstanceOnly) { - s.volume = nVol; - s.options.volume = nVol; - } - - return s; - - }; - - /** - * Mutes the sound. - * - * @return {SMSound} The SMSound object - */ - - this.mute = function() { - - s.muted = true; - - if (!s.isHTML5) { - flash._setVolume(s.id, 0); - } else if (s._a) { - s._a.muted = true; - } - - return s; - - }; - - /** - * Unmutes the sound. - * - * @return {SMSound} The SMSound object - */ - - this.unmute = function() { - - s.muted = false; - var hasIO = (s._iO.volume !== _undefined); - - if (!s.isHTML5) { - flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume); - } else if (s._a) { - s._a.muted = false; - } - - return s; - - }; - - /** - * Toggles the muted state of a sound. - * - * @return {SMSound} The SMSound object - */ - - this.toggleMute = function() { - - return (s.muted?s.unmute():s.mute()); - - }; - - /** - * Registers a callback to be fired when a sound reaches a given position during playback. - * - * @param {number} nPosition The position to watch for - * @param {function} oMethod The relevant callback to fire - * @param {object} oScope Optional: The scope to apply the callback to - * @return {SMSound} The SMSound object - */ - - this.onPosition = function(nPosition, oMethod, oScope) { - - // TODO: basic dupe checking? - - onPositionItems.push({ - position: parseInt(nPosition, 10), - method: oMethod, - scope: (oScope !== _undefined ? oScope : s), - fired: false - }); - - return s; - - }; - - // legacy/backwards-compability: lower-case method name - this.onposition = this.onPosition; - - /** - * Removes registered callback(s) from a sound, by position and/or callback. - * - * @param {number} nPosition The position to clear callback(s) for - * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position - * @return {SMSound} The SMSound object - */ - - this.clearOnPosition = function(nPosition, oMethod) { - - var i; - - nPosition = parseInt(nPosition, 10); - - if (isNaN(nPosition)) { - // safety check - return false; - } - - for (i=0; i < onPositionItems.length; i++) { - - if (nPosition === onPositionItems[i].position) { - // remove this item if no method was specified, or, if the method matches - if (!oMethod || (oMethod === onPositionItems[i].method)) { - if (onPositionItems[i].fired) { - // decrement "fired" counter, too - onPositionFired--; - } - onPositionItems.splice(i, 1); - } - } - - } - - }; - - this._processOnPosition = function() { - - var i, item, j = onPositionItems.length; - - if (!j || !s.playState || onPositionFired >= j) { - return false; - } - - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (!item.fired && s.position >= item.position) { - item.fired = true; - onPositionFired++; - item.method.apply(item.scope, [item.position]); - j = onPositionItems.length; // reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop. - } - } - - return true; - - }; - - this._resetOnPosition = function(nPosition) { - - // reset "fired" for items interested in this position - var i, item, j = onPositionItems.length; - - if (!j) { - return false; - } - - for (i=j-1; i >= 0; i--) { - item = onPositionItems[i]; - if (item.fired && nPosition <= item.position) { - item.fired = false; - onPositionFired--; - } - } - - return true; - - }; - - /** - * SMSound() private internals - * -------------------------------- - */ - - applyFromTo = function() { - - var instanceOptions = s._iO, - f = instanceOptions.from, - t = instanceOptions.to, - start, end; - - end = function() { - - // end has been reached. - sm2._wD(s.id + ': "To" time of ' + t + ' reached.'); - - // detach listener - s.clearOnPosition(t, end); - - // stop should clear this, too - s.stop(); - - }; - - start = function() { - - sm2._wD(s.id + ': Playing "from" ' + f); - - // add listener for end - if (t !== null && !isNaN(t)) { - s.onPosition(t, end); - } - - }; - - if (f !== null && !isNaN(f)) { - - // apply to instance options, guaranteeing correct start position. - instanceOptions.position = f; - - // multiShot timing can't be tracked, so prevent that. - instanceOptions.multiShot = false; - - start(); - - } - - // return updated instanceOptions including starting position - return instanceOptions; - - }; - - attachOnPosition = function() { - - var item, - op = s._iO.onposition; - - // attach onposition things, if any, now. - - if (op) { - - for (item in op) { - if (op.hasOwnProperty(item)) { - s.onPosition(parseInt(item, 10), op[item]); - } - } - - } - - }; - - detachOnPosition = function() { - - var item, - op = s._iO.onposition; - - // detach any onposition()-style listeners. - - if (op) { - - for (item in op) { - if (op.hasOwnProperty(item)) { - s.clearOnPosition(parseInt(item, 10)); - } - } - - } - - }; - - start_html5_timer = function() { - - if (s.isHTML5) { - startTimer(s); - } - - }; - - stop_html5_timer = function() { - - if (s.isHTML5) { - stopTimer(s); - } - - }; - - resetProperties = function(retainPosition) { - - if (!retainPosition) { - onPositionItems = []; - onPositionFired = 0; - } - - onplay_called = false; - - s._hasTimer = null; - s._a = null; - s._html5_canplay = false; - s.bytesLoaded = null; - s.bytesTotal = null; - s.duration = (s._iO && s._iO.duration ? s._iO.duration : null); - s.durationEstimate = null; - s.buffered = []; - - // legacy: 1D array - s.eqData = []; - - s.eqData.left = []; - s.eqData.right = []; - - s.failures = 0; - s.isBuffering = false; - s.instanceOptions = {}; - s.instanceCount = 0; - s.loaded = false; - s.metadata = {}; - - // 0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success - s.readyState = 0; - - s.muted = false; - s.paused = false; - - s.peakData = { - left: 0, - right: 0 - }; - - s.waveformData = { - left: [], - right: [] - }; - - s.playState = 0; - s.position = null; - - s.id3 = {}; - - }; - - resetProperties(); - - /** - * Pseudo-private SMSound internals - * -------------------------------- - */ - - this._onTimer = function(bForce) { - - /** - * HTML5-only _whileplaying() etc. - * called from both HTML5 native events, and polling/interval-based timers - * mimics flash and fires only when time/duration change, so as to be polling-friendly - */ - - var duration, isNew = false, time, x = {}; - - if (s._hasTimer || bForce) { - - // TODO: May not need to track readyState (1 = loading) - - if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) { - - duration = s._get_html5_duration(); - - if (duration !== lastHTML5State.duration) { - - lastHTML5State.duration = duration; - s.duration = duration; - isNew = true; - - } - - // TODO: investigate why this goes wack if not set/re-set each time. - s.durationEstimate = s.duration; - - time = (s._a.currentTime * msecScale || 0); - - if (time !== lastHTML5State.time) { - - lastHTML5State.time = time; - isNew = true; - - } - - if (isNew || bForce) { - - s._whileplaying(time,x,x,x,x); - - } - - }/* else { - - // sm2._wD('_onTimer: Warn for "'+s.id+'": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK')); - - return false; - - }*/ - - return isNew; - - } - - }; - - this._get_html5_duration = function() { - - var instanceOptions = s._iO, - // if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null - d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)), - result = (d && !isNaN(d) && d !== Infinity ? d : null); - - return result; - - }; - - this._apply_loop = function(a, nLoops) { - - /** - * boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop - * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified. - */ - - // - if (!a.loop && nLoops > 1) { - sm2._wD('Note: Native HTML5 looping is infinite.', 1); - } - // - - a.loop = (nLoops > 1 ? 'loop' : ''); - - }; - - this._setup_html5 = function(oOptions) { - - var instanceOptions = mixin(s._iO, oOptions), - a = useGlobalHTML5Audio ? globalHTML5Audio : s._a, - dURL = decodeURI(instanceOptions.url), - sameURL; - - /** - * "First things first, I, Poppa..." (reset the previous state of the old sound, if playing) - * Fixes case with devices that can only play one sound at a time - * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state - */ - - if (useGlobalHTML5Audio) { - - if (dURL === decodeURI(lastGlobalHTML5URL)) { - // global HTML5 audio: re-use of URL - sameURL = true; - } - - } else if (dURL === decodeURI(lastURL)) { - - // options URL is the same as the "last" URL, and we used (loaded) it - sameURL = true; - - } - - if (a) { - - if (a._s) { - - if (useGlobalHTML5Audio) { - - if (a._s && a._s.playState && !sameURL) { - - // global HTML5 audio case, and loading a new URL. stop the currently-playing one. - a._s.stop(); - - } - - } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) { - - // non-global HTML5 reuse case: same url, ignore request - s._apply_loop(a, instanceOptions.loops); - - return a; - - } - - } - - if (!sameURL) { - - // don't retain onPosition() stuff with new URLs. - - if (lastURL) { - resetProperties(false); - } - - // assign new HTML5 URL - - a.src = instanceOptions.url; - - s.url = instanceOptions.url; - - lastURL = instanceOptions.url; - - lastGlobalHTML5URL = instanceOptions.url; - - a._called_load = false; - - } - - } else { - - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - - s._a = new Audio(instanceOptions.url); - s._a.load(); - - } else { - - // null for stupid Opera 9.64 case - s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()); - - } - - // assign local reference - a = s._a; - - a._called_load = false; - - if (useGlobalHTML5Audio) { - - globalHTML5Audio = a; - - } - - } - - s.isHTML5 = true; - - // store a ref on the track - s._a = a; - - // store a ref on the audio - a._s = s; - - add_html5_events(); - - s._apply_loop(a, instanceOptions.loops); - - if (instanceOptions.autoLoad || instanceOptions.autoPlay) { - - s.load(); - - } else { - - // early HTML5 implementation (non-standard) - a.autobuffer = false; - - // standard ('none' is also an option.) - a.preload = 'auto'; - - } - - return a; - - }; - - add_html5_events = function() { - - if (s._a._added_events) { - return false; - } - - var f; - - function add(oEvt, oFn, bCapture) { - return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null; - } - - s._a._added_events = true; - - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - add(f, html5_events[f]); - } - } - - return true; - - }; - - remove_html5_events = function() { - - // Remove event listeners - - var f; - - function remove(oEvt, oFn, bCapture) { - return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null); - } - - sm2._wD(s.id + ': Removing event listeners'); - s._a._added_events = false; - - for (f in html5_events) { - if (html5_events.hasOwnProperty(f)) { - remove(f, html5_events[f]); - } - } - - }; - - /** - * Pseudo-private event internals - * ------------------------------ - */ - - this._onload = function(nSuccess) { - - var fN, - // check for duration to prevent false positives from flash 8 when loading from cache. - loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration); - - // - fN = s.id + ': '; - sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2)); - if (!loadOK && !s.isHTML5) { - if (sm2.sandbox.noRemote === true) { - sm2._wD(fN + str('noNet'), 1); - } - if (sm2.sandbox.noLocal === true) { - sm2._wD(fN + str('noLocal'), 1); - } - } - // - - s.loaded = loadOK; - s.readyState = loadOK?3:2; - s._onbufferchange(0); - - if (s._iO.onload) { - wrapCallback(s, function() { - s._iO.onload.apply(s, [loadOK]); - }); - } - - return true; - - }; - - this._onbufferchange = function(nIsBuffering) { - - if (s.playState === 0) { - // ignore if not playing - return false; - } - - if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) { - return false; - } - - s.isBuffering = (nIsBuffering === 1); - if (s._iO.onbufferchange) { - sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering); - s._iO.onbufferchange.apply(s); - } - - return true; - - }; - - /** - * Playback may have stopped due to buffering, or related reason. - * This state can be encountered on iOS < 6 when auto-play is blocked. - */ - - this._onsuspend = function() { - - if (s._iO.onsuspend) { - sm2._wD(s.id + ': Playback suspended'); - s._iO.onsuspend.apply(s); - } - - return true; - - }; - - /** - * flash 9/movieStar + RTMP-only method, should fire only once at most - * at this point we just recreate failed sounds rather than trying to reconnect - */ - - this._onfailure = function(msg, level, code) { - - s.failures++; - sm2._wD(s.id + ': Failures = ' + s.failures); - - if (s._iO.onfailure && s.failures === 1) { - s._iO.onfailure(s, msg, level, code); - } else { - sm2._wD(s.id + ': Ignoring failure'); - } - - }; - - this._onfinish = function() { - - // store local copy before it gets trashed... - var io_onfinish = s._iO.onfinish; - - s._onbufferchange(0); - s._resetOnPosition(0); - - // reset some state items - if (s.instanceCount) { - - s.instanceCount--; - - if (!s.instanceCount) { - - // remove onPosition listeners, if any - detachOnPosition(); - - // reset instance options - s.playState = 0; - s.paused = false; - s.instanceCount = 0; - s.instanceOptions = {}; - s._iO = {}; - stop_html5_timer(); - - // reset position, too - if (s.isHTML5) { - s.position = 0; - } - - } - - if (!s.instanceCount || s._iO.multiShotEvents) { - // fire onfinish for last, or every instance - if (io_onfinish) { - sm2._wD(s.id + ': onfinish()'); - wrapCallback(s, function() { - io_onfinish.apply(s); - }); - } - } - - } - - }; - - this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) { - - var instanceOptions = s._iO; - - s.bytesLoaded = nBytesLoaded; - s.bytesTotal = nBytesTotal; - s.duration = Math.floor(nDuration); - s.bufferLength = nBufferLength; - - if (!s.isHTML5 && !instanceOptions.isMovieStar) { - - if (instanceOptions.duration) { - // use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired. - s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration; - } else { - s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10); - } - - } else { - - s.durationEstimate = s.duration; - - } - - // for flash, reflect sequential-load-style buffering - if (!s.isHTML5) { - s.buffered = [{ - 'start': 0, - 'end': s.duration - }]; - } - - // allow whileloading to fire even if "load" fired under HTML5, due to HTTP range/partials - if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) { - instanceOptions.whileloading.apply(s); - } - - }; - - this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) { - - var instanceOptions = s._iO, - eqLeft; - - if (isNaN(nPosition) || nPosition === null) { - // flash safety net - return false; - } - - // Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0. - s.position = Math.max(0, nPosition); - - s._processOnPosition(); - - if (!s.isHTML5 && fV > 8) { - - if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) { - s.peakData = { - left: oPeakData.leftPeak, - right: oPeakData.rightPeak - }; - } - - if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) { - s.waveformData = { - left: oWaveformDataLeft.split(','), - right: oWaveformDataRight.split(',') - }; - } - - if (instanceOptions.useEQData) { - if (oEQData !== _undefined && oEQData && oEQData.leftEQ) { - eqLeft = oEQData.leftEQ.split(','); - s.eqData = eqLeft; - s.eqData.left = eqLeft; - if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) { - s.eqData.right = oEQData.rightEQ.split(','); - } - } - } - - } - - if (s.playState === 1) { - - // special case/hack: ensure buffering is false if loading from cache (and not yet started) - if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) { - s._onbufferchange(0); - } - - if (instanceOptions.whileplaying) { - // flash may call after actual finish - instanceOptions.whileplaying.apply(s); - } - - } - - return true; - - }; - - this._oncaptiondata = function(oData) { - - /** - * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature - * - * @param {object} oData - */ - - sm2._wD(s.id + ': Caption data received.'); - - s.captiondata = oData; - - if (s._iO.oncaptiondata) { - s._iO.oncaptiondata.apply(s, [oData]); - } - - }; - - this._onmetadata = function(oMDProps, oMDData) { - - /** - * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature - * RTMP may include song title, MovieStar content may include encoding info - * - * @param {array} oMDProps (names) - * @param {array} oMDData (values) - */ - - sm2._wD(s.id + ': Metadata received.'); - - var oData = {}, i, j; - - for (i = 0, j = oMDProps.length; i < j; i++) { - oData[oMDProps[i]] = oMDData[i]; - } - s.metadata = oData; - - if (s._iO.onmetadata) { - s._iO.onmetadata.apply(s); - } - - }; - - this._onid3 = function(oID3Props, oID3Data) { - - /** - * internal: flash 8 + flash 9 ID3 feature - * may include artist, song title etc. - * - * @param {array} oID3Props (names) - * @param {array} oID3Data (values) - */ - - sm2._wD(s.id + ': ID3 data received.'); - - var oData = [], i, j; - - for (i = 0, j = oID3Props.length; i < j; i++) { - oData[oID3Props[i]] = oID3Data[i]; - } - s.id3 = mixin(s.id3, oData); - - if (s._iO.onid3) { - s._iO.onid3.apply(s); - } - - }; - - // flash/RTMP-only - - this._onconnect = function(bSuccess) { - - bSuccess = (bSuccess === 1); - sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2)); - s.connected = bSuccess; - - if (bSuccess) { - - s.failures = 0; - - if (idCheck(s.id)) { - if (s.getAutoPlay()) { - // only update the play state if auto playing - s.play(_undefined, s.getAutoPlay()); - } else if (s._iO.autoLoad) { - s.load(); - } - } - - if (s._iO.onconnect) { - s._iO.onconnect.apply(s, [bSuccess]); - } - - } - - }; - - this._ondataerror = function(sError) { - - // flash 9 wave/eq data handler - // hack: called at start, and end from flash at/after onfinish() - if (s.playState > 0) { - sm2._wD(s.id + ': Data error: ' + sError); - if (s._iO.ondataerror) { - s._iO.ondataerror.apply(s); - } - } - - }; - - // - this._debug(); - // - - }; // SMSound() - - /** - * Private SoundManager internals - * ------------------------------ - */ - - getDocument = function() { - - return (doc.body || doc.getElementsByTagName('div')[0]); - - }; - - id = function(sID) { - - return doc.getElementById(sID); - - }; - - mixin = function(oMain, oAdd) { - - // non-destructive merge - var o1 = (oMain || {}), o2, o; - - // if unspecified, o2 is the default options object - o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd); - - for (o in o2) { - - if (o2.hasOwnProperty(o) && o1[o] === _undefined) { - - if (typeof o2[o] !== 'object' || o2[o] === null) { - - // assign directly - o1[o] = o2[o]; - - } else { - - // recurse through o2 - o1[o] = mixin(o1[o], o2[o]); - - } - - } - - } - - return o1; - - }; - - wrapCallback = function(oSound, callback) { - - /** - * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue - * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default). - * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case. - * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash. - * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player - */ - if (!oSound.isHTML5 && fV === 8) { - window.setTimeout(callback, 0); - } else { - callback(); - } - - }; - - // additional soundManager properties that soundManager.setup() will accept - - extraOptions = { - 'onready': 1, - 'ontimeout': 1, - 'defaultOptions': 1, - 'flash9Options': 1, - 'movieStarOptions': 1 - }; - - assign = function(o, oParent) { - - /** - * recursive assignment of properties, soundManager.setup() helper - * allows property assignment based on whitelist - */ - - var i, - result = true, - hasParent = (oParent !== _undefined), - setupOptions = sm2.setupOptions, - bonusOptions = extraOptions; - - // - - // if soundManager.setup() called, show accepted parameters. - - if (o === _undefined) { - - result = []; - - for (i in setupOptions) { - - if (setupOptions.hasOwnProperty(i)) { - result.push(i); - } - - } - - for (i in bonusOptions) { - - if (bonusOptions.hasOwnProperty(i)) { - - if (typeof sm2[i] === 'object') { - - result.push(i+': {...}'); - - } else if (sm2[i] instanceof Function) { - - result.push(i+': function() {...}'); - - } else { - - result.push(i); - - } - - } - - } - - sm2._wD(str('setup', result.join(', '))); - - return false; - - } - - // - - for (i in o) { - - if (o.hasOwnProperty(i)) { - - // if not an {object} we want to recurse through... - - if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) { - - // check "allowed" options - - if (hasParent && bonusOptions[oParent] !== _undefined) { - - // valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } } - sm2[oParent][i] = o[i]; - - } else if (setupOptions[i] !== _undefined) { - - // special case: assign to setupOptions object, which soundManager property references - sm2.setupOptions[i] = o[i]; - - // assign directly to soundManager, too - sm2[i] = o[i]; - - } else if (bonusOptions[i] === _undefined) { - - // invalid or disallowed parameter. complain. - complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2); - - result = false; - - } else { - - /** - * valid extraOptions (bonusOptions) parameter. - * is it a method, like onready/ontimeout? call it. - * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]}); - */ - - if (sm2[i] instanceof Function) { - - sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]])); - - } else { - - // good old-fashioned direct assignment - sm2[i] = o[i]; - - } - - } - - } else { - - // recursion case, eg., { defaultOptions: { ... } } - - if (bonusOptions[i] === _undefined) { - - // invalid or disallowed parameter. complain. - complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2); - - result = false; - - } else { - - // recurse through object - return assign(o[i], i); - - } - - } - - } - - } - - return result; - - }; - - function preferFlashCheck(kind) { - - // whether flash should play a given type - return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind])); - - } - - /** - * Internal DOM2-level event helpers - * --------------------------------- - */ - - event = (function() { - - // normalize event methods - var old = (window.attachEvent), - evt = { - add: (old?'attachEvent':'addEventListener'), - remove: (old?'detachEvent':'removeEventListener') - }; - - // normalize "on" event prefix, optional capture argument - function getArgs(oArgs) { - - var args = slice.call(oArgs), - len = args.length; - - if (old) { - // prefix - args[1] = 'on' + args[1]; - if (len > 3) { - // no capture - args.pop(); - } - } else if (len === 3) { - args.push(false); - } - - return args; - - } - - function apply(args, sType) { - - // normalize and call the event method, with the proper arguments - var element = args.shift(), - method = [evt[sType]]; - - if (old) { - // old IE can't do apply(). - element[method](args[0], args[1]); - } else { - element[method].apply(element, args); - } - - } - - function add() { - - apply(getArgs(arguments), 'add'); - - } - - function remove() { - - apply(getArgs(arguments), 'remove'); - - } - - return { - 'add': add, - 'remove': remove - }; - - }()); - - /** - * Internal HTML5 event handling - * ----------------------------- - */ - - function html5_event(oFn) { - - // wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds - - return function(e) { - - var s = this._s, - result; - - if (!s || !s._a) { - // - if (s && s.id) { - sm2._wD(s.id + ': Ignoring ' + e.type); - } else { - sm2._wD(h5 + 'Ignoring ' + e.type); - } - // - result = null; - } else { - result = oFn.call(this, e); - } - - return result; - - }; - - } - - html5_events = { - - // HTML5 event-name-to-handler map - - abort: html5_event(function() { - - sm2._wD(this._s.id + ': abort'); - - }), - - // enough has loaded to play - - canplay: html5_event(function() { - - var s = this._s, - position1K; - - if (s._html5_canplay) { - // this event has already fired. ignore. - return true; - } - - s._html5_canplay = true; - sm2._wD(s.id + ': canplay'); - s._onbufferchange(0); - - // position according to instance options - position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null); - - // set the position if position was set before the sound loaded - if (s.position && this.currentTime !== position1K) { - sm2._wD(s.id + ': canplay: Setting position to ' + position1K); - try { - this.currentTime = position1K; - } catch(ee) { - sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2); - } - } - - // hack for HTML5 from/to case - if (s._iO._oncanplay) { - s._iO._oncanplay(); - } - - }), - - canplaythrough: html5_event(function() { - - var s = this._s; - - if (!s.loaded) { - s._onbufferchange(0); - s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration()); - s._onload(true); - } - - }), - - // TODO: Reserved for potential use - /* - emptied: html5_event(function() { - - sm2._wD(this._s.id + ': emptied'); - - }), - */ - - ended: html5_event(function() { - - var s = this._s; - - sm2._wD(s.id + ': ended'); - - s._onfinish(); - - }), - - error: html5_event(function() { - - sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code); - /** - * HTML5 error codes, per W3C - * Error 1: Client aborted download at user's request. - * Error 2: Network error after load started. - * Error 3: Decoding issue. - * Error 4: Media (audio file) not supported. - * Reference: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#error-codes - */ - // call load with error state? - this._s._onload(false); - - }), - - loadeddata: html5_event(function() { - - var s = this._s; - - sm2._wD(s.id + ': loadeddata'); - - // safari seems to nicely report progress events, eventually totalling 100% - if (!s._loaded && !isSafari) { - s.duration = s._get_html5_duration(); - } - - }), - - loadedmetadata: html5_event(function() { - - sm2._wD(this._s.id + ': loadedmetadata'); - - }), - - loadstart: html5_event(function() { - - sm2._wD(this._s.id + ': loadstart'); - // assume buffering at first - this._s._onbufferchange(1); - - }), - - play: html5_event(function() { - - // sm2._wD(this._s.id + ': play()'); - // once play starts, no buffering - this._s._onbufferchange(0); - - }), - - playing: html5_event(function() { - - sm2._wD(this._s.id + ': playing'); - // once play starts, no buffering - this._s._onbufferchange(0); - - }), - - progress: html5_event(function(e) { - - // note: can fire repeatedly after "loaded" event, due to use of HTTP range/partials - - var s = this._s, - i, j, progStr, buffered = 0, - isProgress = (e.type === 'progress'), - ranges = e.target.buffered, - // firefox 3.6 implements e.loaded/total (bytes) - loaded = (e.loaded||0), - total = (e.total||1); - - // reset the "buffered" (loaded byte ranges) array - s.buffered = []; - - if (ranges && ranges.length) { - - // if loaded is 0, try TimeRanges implementation as % of load - // https://developer.mozilla.org/en/DOM/TimeRanges - - // re-build "buffered" array - // HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5. - for (i=0, j=ranges.length; i - if (isProgress && ranges.length > 1) { - progStr = []; - j = ranges.length; - for (i=0; i - - } - - if (!isNaN(loaded)) { - - // if progress, likely not buffering - s._onbufferchange(0); - // TODO: prevent calls with duplicate values. - s._whileloading(loaded, total, s._get_html5_duration()); - if (loaded && total && loaded === total) { - // in case "onload" doesn't fire (eg. gecko 1.9.2) - html5_events.canplaythrough.call(this, e); - } - - } - - }), - - ratechange: html5_event(function() { - - sm2._wD(this._s.id + ': ratechange'); - - }), - - suspend: html5_event(function(e) { - - // download paused/stopped, may have finished (eg. onload) - var s = this._s; - - sm2._wD(this._s.id + ': suspend'); - html5_events.progress.call(this, e); - s._onsuspend(); - - }), - - stalled: html5_event(function() { - - sm2._wD(this._s.id + ': stalled'); - - }), - - timeupdate: html5_event(function() { - - this._s._onTimer(); - - }), - - waiting: html5_event(function() { - - var s = this._s; - - // see also: seeking - sm2._wD(this._s.id + ': waiting'); - - // playback faster than download rate, etc. - s._onbufferchange(1); - - }) - - }; - - html5OK = function(iO) { - - // playability test based on URL or MIME type - - var result; - - if (!iO || (!iO.type && !iO.url && !iO.serverURL)) { - - // nothing to check - result = false; - - } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) { - - // RTMP, or preferring flash - result = false; - - } else { - - // Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er - result = ((iO.type ? html5CanPlay({type:iO.type}) : html5CanPlay({url:iO.url}) || sm2.html5Only || iO.url.match(/data\:/i))); - - } - - return result; - - }; - - html5Unload = function(oAudio) { - - /** - * Internal method: Unload media, and cancel any current/pending network requests. - * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download. - * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media - * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload. - * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL. - */ - - var url; - - if (oAudio) { - - // Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME. - // Desktop Safari complains / fails on data: URI, so it gets about:blank. - url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL)); - - oAudio.src = url; - - // reset some state, too - if (oAudio._called_unload !== undefined) { - oAudio._called_load = false; - } - - } - - if (useGlobalHTML5Audio) { - - // ensure URL state is trashed, also - lastGlobalHTML5URL = null; - - } - - return url; - - }; - - html5CanPlay = function(o) { - - /** - * Try to find MIME, test and return truthiness - * o = { - * url: '/path/to/an.mp3', - * type: 'audio/mp3' - * } - */ - - if (!sm2.useHTML5Audio || !sm2.hasHTML5) { - return false; - } - - var url = (o.url || null), - mime = (o.type || null), - aF = sm2.audioFormats, - result, - offset, - fileExt, - item; - - // account for known cases like audio/mp3 - - if (mime && sm2.html5[mime] !== _undefined) { - return (sm2.html5[mime] && !preferFlashCheck(mime)); - } - - if (!html5Ext) { - html5Ext = []; - for (item in aF) { - if (aF.hasOwnProperty(item)) { - html5Ext.push(item); - if (aF[item].related) { - html5Ext = html5Ext.concat(aF[item].related); - } - } - } - html5Ext = new RegExp('\\.('+html5Ext.join('|')+')(\\?.*)?$','i'); - } - - // TODO: Strip URL queries, etc. - fileExt = (url ? url.toLowerCase().match(html5Ext) : null); - - if (!fileExt || !fileExt.length) { - if (!mime) { - result = false; - } else { - // audio/mp3 -> mp3, result should be known - offset = mime.indexOf(';'); - // strip "audio/X; codecs..." - fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6); - } - } else { - // match the raw extension name - "mp3", for example - fileExt = fileExt[1]; - } - - if (fileExt && sm2.html5[fileExt] !== _undefined) { - // result known - result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt)); - } else { - mime = 'audio/'+fileExt; - result = sm2.html5.canPlayType({type:mime}); - sm2.html5[fileExt] = result; - // sm2._wD('canPlayType, found result: ' + result); - result = (result && sm2.html5[mime] && !preferFlashCheck(mime)); - } - - return result; - - }; - - testHTML5 = function() { - - /** - * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on - * assigns results to html5[] and flash[]. - */ - - if (!sm2.useHTML5Audio || !sm2.hasHTML5) { - // without HTML5, we need Flash. - sm2.html5.usingFlash = true; - needsFlash = true; - return false; - } - - // double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/ - var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null), - item, lookup, support = {}, aF, i; - - function cp(m) { - - var canPlay, j, - result = false, - isOK = false; - - if (!a || typeof a.canPlayType !== 'function') { - return result; - } - - if (m instanceof Array) { - // iterate through all mime types, return any successes - for (i=0, j=m.length; i= 0; i--) { - - // eg. audio/m4a - support['audio/'+aF[item].related[i]] = support[item]; - sm2.html5[aF[item].related[i]] = support[item]; - sm2.flash[aF[item].related[i]] = support[item]; - - } - - } - - } - - } - - support.canPlayType = (a?cp:null); - sm2.html5 = mixin(sm2.html5, support); - - sm2.html5.usingFlash = featureCheck(); - needsFlash = sm2.html5.usingFlash; - - return true; - - }; - - strings = { - - // - notReady: 'Unavailable - wait until onready() has fired.', - notOK: 'Audio support is not available.', - domError: sm + 'exception caught while appending SWF to DOM.', - spcWmode: 'Removing wmode, preventing known SWF loading issue(s)', - swf404: smc + 'Verify that %s is a valid path.', - tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)', - checkSWF: 'See SWF output for more debug info.', - localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/', - waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...', - waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...', - waitSWF: smc + 'Waiting for 100% SWF load...', - needFunction: smc + 'Function object expected for %s', - badID: 'Sound ID "%s" should be a string, starting with a non-numeric character', - currentObj: smc + '_debug(): Current sound objects', - waitOnload: smc + 'Waiting for window.onload()', - docLoaded: smc + 'Document already loaded', - onload: smc + 'initComplete(): calling soundManager.onload()', - onloadOK: sm + '.onload() complete', - didInit: smc + 'init(): Already called?', - secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html', - badRemove: smc + 'Failed to remove Flash node.', - shutdown: sm + '.disable(): Shutting down', - queue: smc + 'Queueing %s handler', - smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.', - fbTimeout: 'No flash response, applying .'+swfCSS.swfTimedout+' CSS...', - fbLoaded: 'Flash loaded', - fbHandler: smc + 'flashBlockHandler()', - manURL: 'SMSound.load(): Using manually-assigned URL', - onURL: sm + '.load(): current URL already assigned.', - badFV: sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.', - as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)', - noNSLoop: 'Note: Looping not implemented for MovieStar formats', - needfl9: 'Note: Switching to flash 9, required for MP4 formats.', - mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case', - needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.', - gotFocus: smc + 'Got window focus.', - policy: 'Enabling usePolicyFile for data access', - setup: sm + '.setup(): allowed parameters: %s', - setupError: sm + '.setup(): "%s" cannot be assigned with this method.', - setupUndef: sm + '.setup(): Could not find option "%s"', - setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().', - noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.', - sm2Loaded: 'SoundManager 2: Ready.', - reset: sm + '.reset(): Removing event callbacks', - mobileUA: 'Mobile UA detected, preferring HTML5 by default.', - globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.' - // - - }; - - str = function() { - - // internal string replace helper. - // arguments: o [,items to replace] - // - - var args, - i, j, o, - sstr; - - // real array, please - args = slice.call(arguments); - - // first argument - o = args.shift(); - - sstr = (strings && strings[o] ? strings[o] : ''); - - if (sstr && args && args.length) { - for (i = 0, j = args.length; i < j; i++) { - sstr = sstr.replace('%s', args[i]); - } - } - - return sstr; - // - - }; - - loopFix = function(sOpt) { - - // flash 8 requires stream = false for looping to work - if (fV === 8 && sOpt.loops > 1 && sOpt.stream) { - _wDS('as2loop'); - sOpt.stream = false; - } - - return sOpt; - - }; - - policyFix = function(sOpt, sPre) { - - if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) { - sm2._wD((sPre || '') + str('policy')); - sOpt.usePolicyFile = true; - } - - return sOpt; - - }; - - complain = function(sMsg) { - - // - if (hasConsole && console.warn !== _undefined) { - console.warn(sMsg); - } else { - sm2._wD(sMsg); - } - // - - }; - - doNothing = function() { - - return false; - - }; - - disableObject = function(o) { - - var oProp; - - for (oProp in o) { - if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') { - o[oProp] = doNothing; - } - } - - oProp = null; - - }; - - failSafely = function(bNoDisable) { - - // general failure exception handler - - if (bNoDisable === _undefined) { - bNoDisable = false; - } - - if (disabled || bNoDisable) { - sm2.disable(bNoDisable); - } - - }; - - normalizeMovieURL = function(smURL) { - - var urlParams = null, url; - - if (smURL) { - if (smURL.match(/\.swf(\?.*)?$/i)) { - urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4); - if (urlParams) { - // assume user knows what they're doing - return smURL; - } - } else if (smURL.lastIndexOf('/') !== smURL.length - 1) { - // append trailing slash, if needed - smURL += '/'; - } - } - - url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL; - - if (sm2.noSWFCache) { - url += ('?ts=' + new Date().getTime()); - } - - return url; - - }; - - setVersionInfo = function() { - - // short-hand for internal use - - fV = parseInt(sm2.flashVersion, 10); - - if (fV !== 8 && fV !== 9) { - sm2._wD(str('badFV', fV, defaultFlashVersion)); - sm2.flashVersion = fV = defaultFlashVersion; - } - - // debug flash movie, if applicable - - var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf'); - - if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) { - sm2._wD(str('needfl9')); - sm2.flashVersion = fV = 9; - } - - sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)')); - - // set up default options - if (fV > 8) { - // +flash 9 base options - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options); - sm2.features.buffering = true; - // +moviestar support - sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions); - sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i'); - sm2.features.movieStar = true; - } else { - sm2.features.movieStar = false; - } - - // regExp for flash canPlay(), etc. - sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')]; - - // if applicable, use _debug versions of SWFs - sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug); - - sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8); - - }; - - setPolling = function(bPolling, bHighPerformance) { - - if (!flash) { - return false; - } - - flash._setPolling(bPolling, bHighPerformance); - - }; - - initDebug = function() { - - // starts debug mode, creating output
    for UAs without console object - - // allow force of debug mode via URL - // - if (sm2.debugURLParam.test(wl)) { - sm2.debugMode = true; - } - - if (id(sm2.debugID)) { - return false; - } - - var oD, oDebug, oTarget, oToggle, tmp; - - if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) { - - oD = doc.createElement('div'); - oD.id = sm2.debugID + '-toggle'; - - oToggle = { - 'position': 'fixed', - 'bottom': '0px', - 'right': '0px', - 'width': '1.2em', - 'height': '1.2em', - 'lineHeight': '1.2em', - 'margin': '2px', - 'textAlign': 'center', - 'border': '1px solid #999', - 'cursor': 'pointer', - 'background': '#fff', - 'color': '#333', - 'zIndex': 10001 - }; - - oD.appendChild(doc.createTextNode('-')); - oD.onclick = toggleDebug; - oD.title = 'Toggle SM2 debug console'; - - if (ua.match(/msie 6/i)) { - oD.style.position = 'absolute'; - oD.style.cursor = 'hand'; - } - - for (tmp in oToggle) { - if (oToggle.hasOwnProperty(tmp)) { - oD.style[tmp] = oToggle[tmp]; - } - } - - oDebug = doc.createElement('div'); - oDebug.id = sm2.debugID; - oDebug.style.display = (sm2.debugMode?'block':'none'); - - if (sm2.debugMode && !id(oD.id)) { - try { - oTarget = getDocument(); - oTarget.appendChild(oD); - } catch(e2) { - throw new Error(str('domError')+' \n'+e2.toString()); - } - oTarget.appendChild(oDebug); - } - - } - - oTarget = null; - // - - }; - - idCheck = this.getSoundById; - - // - _wDS = function(o, errorLevel) { - - return (!o ? '' : sm2._wD(str(o), errorLevel)); - - }; - - toggleDebug = function() { - - var o = id(sm2.debugID), - oT = id(sm2.debugID + '-toggle'); - - if (!o) { - return false; - } - - if (debugOpen) { - // minimize - oT.innerHTML = '+'; - o.style.display = 'none'; - } else { - oT.innerHTML = '-'; - o.style.display = 'block'; - } - - debugOpen = !debugOpen; - - }; - - debugTS = function(sEventType, bSuccess, sMessage) { - - // troubleshooter debug hooks - - if (window.sm2Debugger !== _undefined) { - try { - sm2Debugger.handleEvent(sEventType, bSuccess, sMessage); - } catch(e) { - // oh well - return false; - } - } - - return true; - - }; - // - - getSWFCSS = function() { - - var css = []; - - if (sm2.debugMode) { - css.push(swfCSS.sm2Debug); - } - - if (sm2.debugFlash) { - css.push(swfCSS.flashDebug); - } - - if (sm2.useHighPerformance) { - css.push(swfCSS.highPerf); - } - - return css.join(' '); - - }; - - flashBlockHandler = function() { - - // *possible* flash block situation. - - var name = str('fbHandler'), - p = sm2.getMoviePercent(), - css = swfCSS, - error = {type:'FLASHBLOCK'}; - - if (sm2.html5Only) { - // no flash, or unused - return false; - } - - if (!sm2.ok()) { - - if (needsFlash) { - // make the movie more visible, so user can fix - sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError); - sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : '')); - } - - sm2.didFlashBlock = true; - - // fire onready(), complain lightly - processOnEvents({type:'ontimeout', ignoreInit:true, error:error}); - catchError(error); - - } else { - - // SM2 loaded OK (or recovered) - - // - if (sm2.didFlashBlock) { - sm2._wD(name + ': Unblocked'); - } - // - - if (sm2.oMC) { - sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' '); - } - - } - - }; - - addOnEvent = function(sType, oMethod, oScope) { - - if (on_queue[sType] === _undefined) { - on_queue[sType] = []; - } - - on_queue[sType].push({ - 'method': oMethod, - 'scope': (oScope || null), - 'fired': false - }); - - }; - - processOnEvents = function(oOptions) { - - // if unspecified, assume OK/error - - if (!oOptions) { - oOptions = { - type: (sm2.ok() ? 'onready' : 'ontimeout') - }; - } - - if (!didInit && oOptions && !oOptions.ignoreInit) { - // not ready yet. - return false; - } - - if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) { - // invalid case - return false; - } - - var status = { - success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled) - }, - - // queue specified by type, or none - srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]), - - queue = [], i, j, - args = [status], - canRetry = (needsFlash && !sm2.ok()); - - if (oOptions.error) { - args[0].error = oOptions.error; - } - - for (i = 0, j = srcQueue.length; i < j; i++) { - if (srcQueue[i].fired !== true) { - queue.push(srcQueue[i]); - } - } - - if (queue.length) { - // sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's')); - for (i = 0, j = queue.length; i < j; i++) { - if (queue[i].scope) { - queue[i].method.apply(queue[i].scope, args); - } else { - queue[i].method.apply(this, args); - } - if (!canRetry) { - // useFlashBlock and SWF timeout case doesn't count here. - queue[i].fired = true; - } - } - } - - return true; - - }; - - initUserOnload = function() { - - window.setTimeout(function() { - - if (sm2.useFlashBlock) { - flashBlockHandler(); - } - - processOnEvents(); - - // call user-defined "onload", scoped to window - - if (typeof sm2.onload === 'function') { - _wDS('onload', 1); - sm2.onload.apply(window); - _wDS('onloadOK', 1); - } - - if (sm2.waitForWindowLoad) { - event.add(window, 'load', initUserOnload); - } - - },1); - - }; - - detectFlash = function() { - - // hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt - - if (hasFlash !== _undefined) { - // this work has already been done. - return hasFlash; - } - - var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject; - - if (nP && nP.length) { - type = 'application/x-shockwave-flash'; - types = n.mimeTypes; - if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) { - hasPlugin = true; - } - } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) { - // Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM. - try { - obj = new AX('ShockwaveFlash.ShockwaveFlash'); - } catch(e) { - // oh well - obj = null; - } - hasPlugin = (!!obj); - // cleanup, because it is ActiveX after all - obj = null; - } - - hasFlash = hasPlugin; - - return hasPlugin; - - }; - - featureCheck = function() { - - var flashNeeded, - item, - formats = sm2.audioFormats, - // iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works. - isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i))); - - if (isSpecial) { - - // has Audio(), but is broken; let it load links directly. - sm2.hasHTML5 = false; - - // ignore flash case, however - sm2.html5Only = true; - - // hide the SWF, if present - if (sm2.oMC) { - sm2.oMC.style.display = 'none'; - } - - } else { - - if (sm2.useHTML5Audio) { - - if (!sm2.html5 || !sm2.html5.canPlayType) { - sm2._wD('SoundManager: No HTML5 Audio() support detected.'); - sm2.hasHTML5 = false; - } - - // - if (isBadSafari) { - sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ?' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1); - } - // - - } - - } - - if (sm2.useHTML5Audio && sm2.hasHTML5) { - - // sort out whether flash is optional, required or can be ignored. - - // innocent until proven guilty. - canIgnoreFlash = true; - - for (item in formats) { - if (formats.hasOwnProperty(item)) { - if (formats[item].required) { - if (!sm2.html5.canPlayType(formats[item].type)) { - // 100% HTML5 mode is not possible. - canIgnoreFlash = false; - flashNeeded = true; - } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) { - // flash may be required, or preferred for this format. - flashNeeded = true; - } - } - } - } - - } - - // sanity check... - if (sm2.ignoreFlash) { - flashNeeded = false; - canIgnoreFlash = true; - } - - sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded); - - return (!sm2.html5Only); - - }; - - parseURL = function(url) { - - /** - * Internal: Finds and returns the first playable URL (or failing that, the first URL.) - * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects. - */ - - var i, j, urlResult = 0, result; - - if (url instanceof Array) { - - // find the first good one - for (i=0, j=url.length; i= 0; i--) { - - if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) { - - sm2.sounds[sm2.soundIDs[i]]._onTimer(); - - } - - } - - }; - - catchError = function(options) { - - options = (options !== _undefined ? options : {}); - - if (typeof sm2.onerror === 'function') { - sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]); - } - - if (options.fatal !== _undefined && options.fatal) { - sm2.disable(); - } - - }; - - badSafariFix = function() { - - // special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4 - if (!isBadSafari || !detectFlash()) { - // doesn't apply - return false; - } - - var aF = sm2.audioFormats, i, item; - - for (item in aF) { - if (aF.hasOwnProperty(item)) { - if (item === 'mp3' || item === 'mp4') { - sm2._wD(sm + ': Using flash fallback for ' + item + ' format'); - sm2.html5[item] = false; - // assign result to related formats, too - if (aF[item] && aF[item].related) { - for (i = aF[item].related.length-1; i >= 0; i--) { - sm2.html5[aF[item].related[i]] = false; - } - } - } - } - } - - }; - - /** - * Pseudo-private flash/ExternalInterface methods - * ---------------------------------------------- - */ - - this._setSandboxType = function(sandboxType) { - - // - var sb = sm2.sandbox; - - sb.type = sandboxType; - sb.description = sb.types[(sb.types[sandboxType] !== _undefined?sandboxType:'unknown')]; - - if (sb.type === 'localWithFile') { - - sb.noRemote = true; - sb.noLocal = false; - _wDS('secNote', 2); - - } else if (sb.type === 'localWithNetwork') { - - sb.noRemote = false; - sb.noLocal = true; - - } else if (sb.type === 'localTrusted') { - - sb.noRemote = false; - sb.noLocal = false; - - } - // - - }; - - this._externalInterfaceOK = function(swfVersion) { - - // flash callback confirming flash loaded, EI working etc. - // swfVersion: SWF build string - - if (sm2.swfLoaded) { - return false; - } - - var e; - - debugTS('swf', true); - debugTS('flashtojs', true); - sm2.swfLoaded = true; - tryInitOnFocus = false; - - if (isBadSafari) { - badSafariFix(); - } - - // complain if JS + SWF build/version strings don't match, excluding +DEV builds - // - if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== sm2.versionNumber.replace(/\+dev/i, '')) { - - e = sm + ': Fatal: JavaScript file build "' + sm2.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + sm2.url + '. Ensure both are up-to-date.'; - - // escape flash -> JS stack so this error fires in window. - setTimeout(function versionMismatch() { - throw new Error(e); - }, 0); - - // exit, init will fail with timeout - return false; - - } - // - - // IE needs a larger timeout - setTimeout(init, isIE ? 100 : 1); - - }; - - /** - * Private initialization helpers - * ------------------------------ - */ - - createMovie = function(smID, smURL) { - - if (didAppend && appendSuccess) { - // ignore if already succeeded - return false; - } - - function initMsg() { - - // - - var options = [], - title, - msg = [], - delimiter = ' + '; - - title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : ''); - - if (!sm2.html5Only) { - - if (sm2.preferFlash) { - options.push('preferFlash'); - } - - if (sm2.useHighPerformance) { - options.push('useHighPerformance'); - } - - if (sm2.flashPollingInterval) { - options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)'); - } - - if (sm2.html5PollingInterval) { - options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)'); - } - - if (sm2.wmode) { - options.push('wmode (' + sm2.wmode + ')'); - } - - if (sm2.debugFlash) { - options.push('debugFlash'); - } - - if (sm2.useFlashBlock) { - options.push('flashBlock'); - } - - } else { - - if (sm2.html5PollingInterval) { - options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)'); - } - - } - - if (options.length) { - msg = msg.concat([options.join(delimiter)]); - } - - sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1); - - showSupport(); - - // - - } - - if (sm2.html5Only) { - - // 100% HTML5 mode - setVersionInfo(); - - initMsg(); - sm2.oMC = id(sm2.movieID); - init(); - - // prevent multiple init attempts - didAppend = true; - - appendSuccess = true; - - return false; - - } - - // flash path - var remoteURL = (smURL || sm2.url), - localURL = (sm2.altURL || remoteURL), - swfTitle = 'JS/Flash audio component (SoundManager 2)', - oTarget = getDocument(), - extraClass = getSWFCSS(), - isRTL = null, - html = doc.getElementsByTagName('html')[0], - oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass; - - isRTL = (html && html.dir && html.dir.match(/rtl/i)); - smID = (smID === _undefined?sm2.id:smID); - - function param(name, value) { - return ''; - } - - // safety check for legacy (change to Flash 9 URL) - setVersionInfo(); - sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL); - smURL = sm2.url; - - sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode); - - if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) { - /** - * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here - * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout - * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?) - */ - messages.push(strings.spcWmode); - sm2.wmode = null; - } - - oEmbed = { - 'name': smID, - 'id': smID, - 'src': smURL, - 'quality': 'high', - 'allowScriptAccess': sm2.allowScriptAccess, - 'bgcolor': sm2.bgColor, - 'pluginspage': http+'www.macromedia.com/go/getflashplayer', - 'title': swfTitle, - 'type': 'application/x-shockwave-flash', - 'wmode': sm2.wmode, - // http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c36cfb8137124318eebc6-7ffd.html - 'hasPriority': 'true' - }; - - if (sm2.debugFlash) { - oEmbed.FlashVars = 'debug=1'; - } - - if (!sm2.wmode) { - // don't write empty attribute - delete oEmbed.wmode; - } - - if (isIE) { - - // IE is "special". - oMovie = doc.createElement('div'); - movieHTML = [ - '', - param('movie', smURL), - param('AllowScriptAccess', sm2.allowScriptAccess), - param('quality', oEmbed.quality), - (sm2.wmode? param('wmode', sm2.wmode): ''), - param('bgcolor', sm2.bgColor), - param('hasPriority', 'true'), - (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''), - '' - ].join(''); - - } else { - - oMovie = doc.createElement('embed'); - for (tmp in oEmbed) { - if (oEmbed.hasOwnProperty(tmp)) { - oMovie.setAttribute(tmp, oEmbed[tmp]); - } - } - - } - - initDebug(); - extraClass = getSWFCSS(); - oTarget = getDocument(); - - if (oTarget) { - - sm2.oMC = (id(sm2.movieID) || doc.createElement('div')); - - if (!sm2.oMC.id) { - - sm2.oMC.id = sm2.movieID; - sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass; - s = null; - oEl = null; - - if (!sm2.useFlashBlock) { - if (sm2.useHighPerformance) { - // on-screen at all times - s = { - 'position': 'fixed', - 'width': '8px', - 'height': '8px', - // >= 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes. - 'bottom': '0px', - 'left': '0px', - 'overflow': 'hidden' - }; - } else { - // hide off-screen, lower priority - s = { - 'position': 'absolute', - 'width': '6px', - 'height': '6px', - 'top': '-9999px', - 'left': '-9999px' - }; - if (isRTL) { - s.left = Math.abs(parseInt(s.left,10))+'px'; - } - } - } - - if (isWebkit) { - // soundcloud-reported render/crash fix, safari 5 - sm2.oMC.style.zIndex = 10000; - } - - if (!sm2.debugFlash) { - for (x in s) { - if (s.hasOwnProperty(x)) { - sm2.oMC.style[x] = s[x]; - } - } - } - - try { - if (!isIE) { - sm2.oMC.appendChild(oMovie); - } - oTarget.appendChild(sm2.oMC); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - } catch(e) { - throw new Error(str('domError')+' \n'+e.toString()); - } - - } else { - - // SM2 container is already in the document (eg. flashblock use case) - sClass = sm2.oMC.className; - sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:''); - sm2.oMC.appendChild(oMovie); - if (isIE) { - oEl = sm2.oMC.appendChild(doc.createElement('div')); - oEl.className = swfCSS.swfBox; - oEl.innerHTML = movieHTML; - } - appendSuccess = true; - - } - - } - - didAppend = true; - initMsg(); - // sm2._wD(sm + ': Trying to load ' + smURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1); - - return true; - - }; - - initMovie = function() { - - if (sm2.html5Only) { - createMovie(); - return false; - } - - // attempt to get, or create, movie (may already exist) - if (flash) { - return false; - } - - if (!sm2.url) { - - /** - * Something isn't right - we've reached init, but the soundManager url property has not been set. - * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time. - * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case. - */ - - _wDS('noURL'); - return false; - - } - - // inline markup case - flash = sm2.getMovie(sm2.id); - - if (!flash) { - if (!oRemoved) { - // try to create - createMovie(sm2.id, sm2.url); - } else { - // try to re-append removed movie after reboot() - if (!isIE) { - sm2.oMC.appendChild(oRemoved); - } else { - sm2.oMC.innerHTML = oRemovedHTML; - } - oRemoved = null; - didAppend = true; - } - flash = sm2.getMovie(sm2.id); - } - - if (typeof sm2.oninitmovie === 'function') { - setTimeout(sm2.oninitmovie, 1); - } - - // - flushMessages(); - // - - return true; - - }; - - delayWaitForEI = function() { - - setTimeout(waitForEI, 1000); - - }; - - rebootIntoHTML5 = function() { - - // special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled. - - window.setTimeout(function() { - - complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...'); - - sm2.setup({ - preferFlash: false - }).reboot(); - - // if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true. - sm2.didFlashBlock = true; - - sm2.beginDelayedInit(); - - }, 1); - - }; - - waitForEI = function() { - - var p, - loadIncomplete = false; - - if (!sm2.url) { - // No SWF url to load (noURL case) - exit for now. Will be retried when url is set. - return false; - } - - if (waitingForEI) { - return false; - } - - waitingForEI = true; - event.remove(window, 'load', delayWaitForEI); - - if (hasFlash && tryInitOnFocus && !isFocused) { - // Safari won't load flash in background tabs, only when focused. - _wDS('waitFocus'); - return false; - } - - if (!didInit) { - p = sm2.getMoviePercent(); - if (p > 0 && p < 100) { - loadIncomplete = true; - } - } - - setTimeout(function() { - - p = sm2.getMoviePercent(); - - if (loadIncomplete) { - // special case: if movie *partially* loaded, retry until it's 100% before assuming failure. - waitingForEI = false; - sm2._wD(str('waitSWF')); - window.setTimeout(delayWaitForEI, 1); - return false; - } - - // - if (!didInit) { - - sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ':'') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash?' ' + str('checkSWF'):''), 2); - - if (!overHTTP && p) { - - _wDS('localFail', 2); - - if (!sm2.debugFlash) { - _wDS('tryDebug', 2); - } - - } - - if (p === 0) { - - // if 0 (not null), probably a 404. - sm2._wD(str('swf404', sm2.url), 1); - - } - - debugTS('flashtojs', false, ': Timed out' + overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)'); - - } - // - - // give up / time-out, depending - - if (!didInit && okToDisable) { - - if (p === null) { - - // SWF failed to report load progress. Possibly blocked. - - if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) { - - if (sm2.useFlashBlock) { - - flashBlockHandler(); - - } - - _wDS('waitForever'); - - } else { - - // no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load. - - if (!sm2.useFlashBlock && canIgnoreFlash) { - - rebootIntoHTML5(); - - } else { - - _wDS('waitForever'); - - // fire any regular registered ontimeout() listeners. - processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}}); - - } - - } - - } else { - - // SWF loaded? Shouldn't be a blocking issue, then. - - if (sm2.flashLoadTimeout === 0) { - - _wDS('waitForever'); - - } else { - - if (!sm2.useFlashBlock && canIgnoreFlash) { - - rebootIntoHTML5(); - - } else { - - failSafely(true); - - } - - } - - } - - } - - }, sm2.flashLoadTimeout); - - }; - - handleFocus = function() { - - function cleanup() { - event.remove(window, 'focus', handleFocus); - } - - if (isFocused || !tryInitOnFocus) { - // already focused, or not special Safari background tab case - cleanup(); - return true; - } - - okToDisable = true; - isFocused = true; - _wDS('gotFocus'); - - // allow init to restart - waitingForEI = false; - - // kick off ExternalInterface timeout, now that the SWF has started - delayWaitForEI(); - - cleanup(); - return true; - - }; - - flushMessages = function() { - - // - - // SM2 pre-init debug messages - if (messages.length) { - sm2._wD('SoundManager 2: ' + messages.join(' '), 1); - messages = []; - } - - // - - }; - - showSupport = function() { - - // - - flushMessages(); - - var item, tests = []; - - if (sm2.useHTML5Audio && sm2.hasHTML5) { - for (item in sm2.audioFormats) { - if (sm2.audioFormats.hasOwnProperty(item)) { - tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)': (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : '')))); - } - } - sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1); - } - - // - - }; - - initComplete = function(bNoDisable) { - - if (didInit) { - return false; - } - - if (sm2.html5Only) { - // all good. - _wDS('sm2Loaded'); - didInit = true; - initUserOnload(); - debugTS('onload', true); - return true; - } - - var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()), - result = true, - error; - - if (!wasTimeout) { - didInit = true; - } - - error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')}; - - sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ')', disabled ? 2: 1); - - if (disabled || bNoDisable) { - if (sm2.useFlashBlock && sm2.oMC) { - sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError); - } - processOnEvents({type:'ontimeout', error:error, ignoreInit: true}); - debugTS('onload', false); - catchError(error); - result = false; - } else { - debugTS('onload', true); - } - - if (!disabled) { - if (sm2.waitForWindowLoad && !windowLoaded) { - _wDS('waitOnload'); - event.add(window, 'load', initUserOnload); - } else { - // - if (sm2.waitForWindowLoad && windowLoaded) { - _wDS('docLoaded'); - } - // - initUserOnload(); - } - } - - return result; - - }; - - /** - * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion) - * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup(). - */ - - setProperties = function() { - - var i, - o = sm2.setupOptions; - - for (i in o) { - - if (o.hasOwnProperty(i)) { - - // assign local property if not already defined - - if (sm2[i] === _undefined) { - - sm2[i] = o[i]; - - } else if (sm2[i] !== o[i]) { - - // legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync - sm2.setupOptions[i] = sm2[i]; - - } - - } - - } - - }; - - - init = function() { - - // called after onload() - - if (didInit) { - _wDS('didInit'); - return false; - } - - function cleanup() { - event.remove(window, 'load', sm2.beginDelayedInit); - } - - if (sm2.html5Only) { - if (!didInit) { - // we don't need no steenking flash! - cleanup(); - sm2.enabled = true; - initComplete(); - } - return true; - } - - // flash path - initMovie(); - - try { - - // attempt to talk to Flash - flash._externalInterfaceTest(false); - - // apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling - // (determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates) - setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50))); - - if (!sm2.debugMode) { - // stop the SWF from making debug output calls to JS - flash._disableDebug(); - } - - sm2.enabled = true; - debugTS('jstoflash', true); - - if (!sm2.html5Only) { - // prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead - // http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/ - event.add(window, 'unload', doNothing); - } - - } catch(e) { - - sm2._wD('js/flash exception: ' + e.toString()); - debugTS('jstoflash', false); - catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true}); - // don't disable, for reboot() - failSafely(true); - initComplete(); - - return false; - - } - - initComplete(); - - // disconnect events - cleanup(); - - return true; - - }; - - domContentLoaded = function() { - - if (didDCLoaded) { - return false; - } - - didDCLoaded = true; - - // assign top-level soundManager properties eg. soundManager.url - setProperties(); - - initDebug(); - - /** - * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1 - * Ditto for sm2-preferFlash, too. - */ - // - (function(){ - - var a = 'sm2-usehtml5audio=', - a2 = 'sm2-preferflash=', - b = null, - b2 = null, - l = wl.toLowerCase(); - - if (l.indexOf(a) !== -1) { - b = (l.charAt(l.indexOf(a)+a.length) === '1'); - if (hasConsole) { - console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter'); - } - sm2.setup({ - 'useHTML5Audio': b - }); - } - - if (l.indexOf(a2) !== -1) { - b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1'); - if (hasConsole) { - console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter'); - } - sm2.setup({ - 'preferFlash': b2 - }); - } - - }()); - // - - if (!hasFlash && sm2.hasHTML5) { - sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1); - sm2.setup({ - 'useHTML5Audio': true, - // make sure we aren't preferring flash, either - // TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak. - 'preferFlash': false - }); - } - - testHTML5(); - - if (!hasFlash && needsFlash) { - messages.push(strings.needFlash); - // TODO: Fatal here vs. timeout approach, etc. - // hack: fail sooner. - sm2.setup({ - 'flashLoadTimeout': 1 - }); - } - - if (doc.removeEventListener) { - doc.removeEventListener('DOMContentLoaded', domContentLoaded, false); - } - - initMovie(); - - return true; - - }; - - domContentLoadedIE = function() { - - if (doc.readyState === 'complete') { - domContentLoaded(); - doc.detachEvent('onreadystatechange', domContentLoadedIE); - } - - return true; - - }; - - winOnLoad = function() { - - // catch edge case of initComplete() firing after window.load() - windowLoaded = true; - event.remove(window, 'load', winOnLoad); - - }; - - /** - * miscellaneous run-time, pre-init stuff - */ - - preInit = function() { - - if (mobileHTML5) { - - // prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point. - - // - if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) { - // notify that defaults are being changed. - messages.push(strings.mobileUA); - } - // - - sm2.setupOptions.useHTML5Audio = true; - sm2.setupOptions.preferFlash = false; - - if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) { - // iOS and Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence. - // common use case: exiting sound onfinish() -> createSound() -> play() - // - messages.push(strings.globalHTML5); - // - if (is_iDevice) { - sm2.ignoreFlash = true; - } - useGlobalHTML5Audio = true; - } - - } - - }; - - preInit(); - - // sniff up-front - detectFlash(); - - // focus and window load, init (primarily flash-driven) - event.add(window, 'focus', handleFocus); - event.add(window, 'load', delayWaitForEI); - event.add(window, 'load', winOnLoad); - - if (doc.addEventListener) { - - doc.addEventListener('DOMContentLoaded', domContentLoaded, false); - - } else if (doc.attachEvent) { - - doc.attachEvent('onreadystatechange', domContentLoadedIE); - - } else { - - // no add/attachevent support - safe to assume no JS -> Flash either - debugTS('onload', false); - catchError({type:'NO_DOM2_EVENTS', fatal:true}); - - } - -} // SoundManager() - -// SM2_DEFER details: http://www.schillmania.com/projects/soundmanager2/doc/getstarted/#lazy-loading - -if (window.SM2_DEFER === undefined || !SM2_DEFER) { - soundManager = new SoundManager(); -} - -/** - * SoundManager public interfaces - * ------------------------------ - */ - -window.SoundManager = SoundManager; // constructor -window.soundManager = soundManager; // public API, flash callbacks etc. - -}(window)); diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as deleted file mode 100755 index 6527594e..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2.as +++ /dev/null @@ -1,421 +0,0 @@ -/** - * SoundManager 2: Javascript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code licensed under the BSD License: - * http://www.schillmania.com/projects/soundmanager2/license.txt - * - * Flash 8 / ActionScript 2 version - * - * Compiling AS to Flash 8 SWF using MTASC (free compiler - http://www.mtasc.org/): - * mtasc -swf soundmanager2.swf -main -header 16:16:30 SoundManager2.as -version 8 - * - * ActionScript Sound class reference (Macromedia), documentation download: - * http://livedocs.macromedia.com/flash/8/ - * Previously-live URL: - * http://livedocs.macromedia.com/flash/8/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00002668.html - * - * *** NOTE ON LOCAL FILE SYSTEM ACCESS *** - * - * Flash security allows local OR network access, but not both - * unless explicitly whitelisted/allowed by the flash player's - * security settings. - * - * To enable in-flash messaging for troubleshooting, pass debug=1 in FlashVars (within object/embed code) - * SM2 will do this by default when soundManager.debugFlash = true. - * - */ - -import flash.external.ExternalInterface; // woo - -class SoundManager2 { - - static var app: SoundManager2; - - function SoundManager2() { - - var version = "V2.97a.20131201"; - var version_as = "(AS2/Flash 8)"; - - /** - * Cross-domain security options - * HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work. - * // allow_xdomain_scripting = true; - * // xdomain = "foo.com"; - * For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*"); - * When loading from HTTPS, use System.security.allowInsecureDomain(); - * See "allowDomain (security.allowDomain method)" in Flash 8/AS2 liveDocs documentation (AS2 reference -> classes -> security) - * download from http://livedocs.macromedia.com/flash/8/ - * Related AS3 documentation: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain%28%29 - */ - - var allow_xdomain_scripting = false; - var xdomain = "*"; - - if (allow_xdomain_scripting && xdomain) { - System.security.allowDomain(xdomain); - version_as += ' - cross-domain enabled'; - } - - // externalInterface references (for Javascript callbacks) - var baseJSController = "soundManager"; - var baseJSObject = baseJSController + ".sounds"; - - // internal objects - var sounds = []; // indexed string array - var soundObjects = []; // associative Sound() object array - var timer = null; - var pollingEnabled = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call - var debugEnabled = true; // Flash debug output enabled by default, disabled by JS call - var flashDebugEnabled = false; // debug output to flash movie, off by default - var didSandboxMessage = false; - var caughtFatal = false; - - // for flash text output, debugging etc. - var _messages = []; - var _messageObj = null; - flashDebugEnabled = (_root.debug == 1); - - // display stuffs - Stage.scaleMode = 'noScale'; - Stage.align = 'TL'; - - // context menu item with version info - - var doNothing = function() {} - - var sm2Menu:ContextMenu = new ContextMenu(); - var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as, doNothing); - sm2MenuItem.enabled = false; - sm2Menu.customItems.push(sm2MenuItem); - _root.menu = sm2Menu; - - var writeDebug = function(s, logLevel) { - // - if (!debugEnabled) return false; - ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, (logLevel || 0)); - // - } - - var flashDebug = function(messageText) { - // - _messages.push(messageText); - if (!flashDebugEnabled) { - return false; - } - var sans = new TextFormat(); - sans.size = 12; - sans.font = "Arial"; - - // 320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.) - var w = Stage.width?Stage.width:320; - var h = Stage.height?Stage.height:240; - if (!_messageObj) { - _messageObj = _root.createTextField("_messageObj", 0, 0, 0, w, h); - _messageObj.x = 0; - _messageObj.y = 0; - _messageObj.multiline = true; - _messageObj.html = true; - _messageObj.wordWrap = true; - _messageObj.align = 'left'; - _messageObj.autoSize = false; - } - _messageObj.htmlText = _messages.join('\n'); - _messageObj.setTextFormat(sans); - _messageObj.width = w; - _messageObj.height = h; - // - } - - var _externalInterfaceTest = function(isFirstCall) { - var sandboxType = System.security['sandboxType']; - try { - if (isFirstCall) { - flashDebug('Testing Flash -> JS...') - if (!didSandboxMessage && sandboxType != 'remote' && sandboxType != 'localTrusted') { - didSandboxMessage = true; - flashDebug('
    Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".
    Additional security permissions need to be granted.
    See flash security settings panel for non-HTTP, eg. file:// use.

    http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html

    You may also be able to right-click this movie and choose from the menu:
    "Global Settings" -> "Advanced" tab -> "Trusted Location Settings"
    '); - } - ExternalInterface.call(baseJSController + "._externalInterfaceOK", version); - if (!didSandboxMessage) { - flashDebug('Flash -> JS OK'); - flashDebug('Waiting for JS -> Flash...'); - } - } else { - // writeDebug('SM2 SWF ' + version + ' ' + version_as, 1); - ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType); - flashDebug('JS -> Flash OK'); - } - } catch(e) { - flashDebug(e.toString()); - if (!caughtFatal) { - caughtFatal = true; - } - return false; - } - return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.) - } - - var _disableDebug = function() { - // prevent future debug calls from Flash going to client (maybe improve performance) - writeDebug('_disableDebug()'); - debugEnabled = false; - } - - var checkProgress = function() { - var bL = 0; - var bT = 0; - var nD = 0; - var nP = 0; - var oSound = null; - for (var i = 0, j = sounds.length; i < j; i++) { - oSound = soundObjects[sounds[i]]; - bL = oSound.getBytesLoaded(); - bT = oSound.getBytesTotal(); - nD = oSound.duration || 0; // can sometimes be null with short MP3s? Wack. - nP = oSound.position; - if (bL && bT && bL != oSound.lastValues.bytes) { - oSound.lastValues.bytes = bL; - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", bL, bT, nD); - } - if (typeof nP != 'undefined' && nP != oSound.lastValues.position) { - oSound.lastValues.position = nP; - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileplaying", nP); - // if position changed, check for near-end - } - } - } - - var onLoad = function(bSuccess) { - checkProgress(); // ensure progress stats are up-to-date - // force duration update (doesn't seem to be always accurate) - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.getBytesLoaded(), this.getBytesTotal(), this.duration); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", this.duration > 0 ? 1 : 0); // bSuccess doesn't always seem to work, so check MP3 duration instead. - } - - var onID3 = function() { - // --- NOTE: BUGGY? --- - // -------------------- - // TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) - // ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) - // iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. - // May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33 - var id3Data = []; - var id3Props = []; - for (var prop in this.id3) { - id3Props.push(prop); - id3Data.push(this.id3[prop]); - // writeDebug('id3['+prop+']: '+this.id3[prop]); - } - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onid3", id3Props, id3Data); - // unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) - // Therefore if ID3V2 data is received, ID3V1 is ignored. - soundObjects[this.sID].onID3 = null; - } - - var registerOnComplete = function(sID) { - soundObjects[sID].onSoundComplete = function() { - checkProgress(); - ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); - } - } - - var _setPosition = function(sID, nSecOffset, isPaused, _allowMultiShot) { - // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. - var s = soundObjects[sID]; - // writeDebug('_setPosition()'); - s.lastValues.position = s.position; - if (s.lastValues.loops > 1 && nSecOffset != 0) { - writeDebug('Warning: Looping functionality being disabled due to Flash limitation.', 240); - s.lastValues.loops = 1; - } - s.start(nSecOffset, s.lastValues.nLoops || 1); // start playing at new position - if (isPaused) { - s.stop(); - } - } - - var _load = function(sID, sURL, bStream, bAutoPlay, bCheckPolicyFile) { - // writeDebug('_load(): '+sID+', '+sURL+', '+bStream+', '+bAutoPlay+', '+bCheckPolicyFile); - if (typeof bAutoPlay == 'undefined') { - bAutoPlay = false; - } - if (typeof bStream == 'undefined') { - bStream = true; - } - if (typeof bCheckPolicyFile == 'undefined') { - bCheckPolicyFile = false; - } - // writeDebug('bStream: '+bStream); - // writeDebug('bAutoPlay: '+bAutoPlay); - // checkProgress(); - var s = soundObjects[sID]; - s.onID3 = onID3; - s.onLoad = onLoad; - s.loaded = true; - s.checkPolicyFile = bCheckPolicyFile; - s.loadSound(sURL, bStream); - if (bAutoPlay != true) { - s.stop(); // prevent default auto-play behaviour - } else { - writeDebug('auto-play allowed'); - } - registerOnComplete(sID); - } - - var _unload = function(sID, sURL) { - // effectively "stop" loading by loading a tiny MP3 - var s = soundObjects[sID]; - s.onID3 = null; - s.onLoad = null; - s.loaded = false; - // ensure position is reset, if unload fails - s.start(0,1); - s.stop(); - s.loadSound(sURL, true); - s.stop(); // prevent auto-play - } - - var _createSound = function(sID, loops, checkPolicyFile) { - var s = new Sound(); - if (!soundObjects[sID]) { - sounds.push(sID); - } - soundObjects[sID] = s; - s.setVolume(100); - s.sID = sID; - s.paused = false; - s.loaded = false; - s.checkPolicyFile = checkPolicyFile; - s.lastValues = { - bytes: 0, - position: 0, - nLoops: loops||1 - }; - } - - var _destroySound = function(sID) { - // for the power of garbage collection! .. er, Greyskull! - var s = (soundObjects[sID] || null); - if (!s) { - return false; - } - for (var i = 0; i < sounds.length; i++) { - if (sounds[i] == sID) { - sounds.splice(i, 1); - break; - } - } - s = null; - delete soundObjects[sID]; - } - - var _stop = function(sID, bStopAll) { - // stop this particular instance (or "all", based on parameter) - if (bStopAll) { - _root.stop(); - } else { - soundObjects[sID].stop(); - soundObjects[sID].paused = false; - } - } - - var _start = function(sID, nLoops, nMsecOffset, _allowMultiShot) { - // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. - // writeDebug('_start: ' + sID + ', loops: ' + nLoops + ', nMsecOffset: ' + nMsecOffset); - registerOnComplete(); - var s = soundObjects[sID]; - s.lastValues.paused = false; // reset pause if applicable - s.lastValues.nLoops = (nLoops || 1); - s.start(nMsecOffset, nLoops); - return true; - } - - var _pause = function(sID, _allowMultiShot) { - // note: multiShot is Flash 9-only; retained so JS/Flash function signatures are identical. - // writeDebug('_pause()'); - var s = soundObjects[sID]; - if (!s.paused) { - // reference current position, stop sound - s.paused = true; - s.lastValues.position = s.position; - // writeDebug('_pause(): position: '+s.lastValues.position); - s.stop(); - } else { - // resume playing from last position - // writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.nLoops+' times'); - s.paused = false; - s.start(s.lastValues.position / 1000, s.lastValues.nLoops); - } - } - - var _setPan = function(sID, nPan) { - soundObjects[sID].setPan(nPan); - } - - var _setVolume = function(sID, nVol) { - soundObjects[sID].setVolume(nVol); - } - - var _setPolling = function(bPolling, timerInterval) { - if (typeof timerInterval === 'undefined') { - timerInterval = 50; - } - pollingEnabled = bPolling; - if (timer == null && pollingEnabled) { - flashDebug('Enabling polling, ' + timerInterval + ' ms interval'); - timer = setInterval(checkProgress, timerInterval); - } else if (timer && !pollingEnabled) { - flashDebug('Disabling polling'); - clearInterval(timer); - timer = null; - } - } - - var _init = function() { - - // OK now stuff should be available - try { - flashDebug('Adding ExternalInterface callbacks...'); - ExternalInterface.addCallback('_load', this, _load); - ExternalInterface.addCallback('_unload', this, _unload); - ExternalInterface.addCallback('_stop', this, _stop); - ExternalInterface.addCallback('_start', this, _start); - ExternalInterface.addCallback('_pause', this, _pause); - ExternalInterface.addCallback('_setPosition', this, _setPosition); - ExternalInterface.addCallback('_setPan', this, _setPan); - ExternalInterface.addCallback('_setVolume', this, _setVolume); - ExternalInterface.addCallback('_setPolling', this, _setPolling); - ExternalInterface.addCallback('_externalInterfaceTest', this, _externalInterfaceTest); - ExternalInterface.addCallback('_disableDebug', this, _disableDebug); - ExternalInterface.addCallback('_createSound', this, _createSound); - ExternalInterface.addCallback('_destroySound', this, _destroySound); - } catch(e) { - flashDebug('Fatal: ExternalInterface error: ' + e.toString()); - } - // try to talk to JS, do init etc. - _externalInterfaceTest(true); - // flashDebug('Init OK'); - } - - flashDebug('SM2 SWF ' + version + ' ' + version_as); - - if (ExternalInterface.available) { - flashDebug('ExternalInterface available'); - _init(); - } else { - // d'oh! - may be from a corrupt install, ancient (pre-Netscape 6?) browser etc. - flashDebug('Fatal: ExternalInterface (Flash <-> JS) not available'); - } - - - } // SoundManager2() - - // entry point - static function main(mc) { - app = new SoundManager2(); - } - -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as deleted file mode 100755 index 6568129e..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_AS3.as +++ /dev/null @@ -1,925 +0,0 @@ -/** - * SoundManager 2: Javascript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code licensed under the BSD License: - * http://www.schillmania.com/projects/soundmanager2/license.txt - * - * Flash 9 / ActionScript 3 version - */ - -package { - - import flash.display.Sprite; - import flash.events.Event; - import flash.events.IOErrorEvent; - import flash.events.MouseEvent; - import flash.events.SecurityErrorEvent; - import flash.events.AsyncErrorEvent; - import flash.events.NetStatusEvent; - import flash.events.TimerEvent; - import flash.external.ExternalInterface; // woo - import flash.media.Sound; - import flash.media.SoundChannel; - import flash.media.SoundMixer; - import flash.net.URLLoader; - import flash.net.URLRequest; - import flash.system.Security; - import flash.system.System; - import flash.text.TextField; - import flash.text.TextFormat; - import flash.text.TextFieldAutoSize; - import flash.ui.ContextMenu; - import flash.ui.ContextMenuItem; - import flash.utils.setInterval; - import flash.utils.clearInterval; - import flash.utils.Dictionary; - import flash.utils.Timer; - - public class SoundManager2_AS3 extends Sprite { - - public var version:String = "V2.97a.20131201"; - public var version_as:String = "(AS3/Flash 9)"; - - /** - * Cross-domain security options - * HTML on foo.com loading .swf hosted on bar.com? Define your "HTML domain" here to allow JS+Flash communication to work. - * // allow_xdomain_scripting = true; - * // xdomain = "foo.com"; - * For all domains (possible security risk?), use xdomain = "*"; which ends up as System.security.allowDomain("*"); - * When loading from HTTPS, use System.security.allowInsecureDomain(); - * See http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html#allowDomain() - */ - public var allow_xdomain_scripting:Boolean = false; - public var xdomain:String = "*"; - - // externalInterface references (for Javascript callbacks) - public var baseJSController:String = "soundManager"; - public var baseJSObject:String = baseJSController + ".sounds"; - - // internal objects - public var sounds:Array = []; // indexed string array - public var soundObjects: Dictionary = new Dictionary(); // associative Sound() object Dictionary type - public var timer: Timer = null; - public var pollingEnabled: Boolean = false; // polling (timer) flag - disabled by default, enabled by JS->Flash call - public var debugEnabled: Boolean = true; // Flash debug output enabled by default, disabled by JS call - public var flashDebugEnabled: Boolean = false; // Flash internal debug output (write to visible SWF in browser) - public var loaded: Boolean = false; - public var currentObject: SoundManager2_SMSound_AS3 = null; - public var paramList:Object = null; - public var messages:Array = []; - public var textField: TextField = null; - public var textStyle: TextFormat = new TextFormat(); - public var didSandboxMessage: Boolean = false; - public var caughtFatal: Boolean = false; - - public function SoundManager2_AS3() { - - if (allow_xdomain_scripting && xdomain) { - Security.allowDomain(xdomain); - version_as += ' - cross-domain enabled'; - } - - this.paramList = this.root.loaderInfo.parameters; - - // - if (this.paramList['debug'] == 1) { - this.flashDebugEnabled = true; - } - - if (this.flashDebugEnabled) { - var canvas: Sprite = new Sprite(); - canvas.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); - addChild(canvas); - } - // - - flashDebug('SM2 SWF ' + version + ' ' + version_as); - - // context menu item with version info - - var sm2Menu:ContextMenu = new ContextMenu(); - var sm2MenuItem:ContextMenuItem = new ContextMenuItem('SoundManager ' + version + ' ' + version_as); - sm2MenuItem.enabled = false; - sm2Menu.customItems.push(sm2MenuItem); - contextMenu = sm2Menu; - - if (ExternalInterface.available) { - flashDebug('ExternalInterface available'); - try { - flashDebug('Adding ExternalInterface callbacks...'); - ExternalInterface.addCallback('_load', _load); - ExternalInterface.addCallback('_unload', _unload); - ExternalInterface.addCallback('_stop', _stop); - ExternalInterface.addCallback('_start', _start); - ExternalInterface.addCallback('_pause', _pause); - ExternalInterface.addCallback('_setPosition', _setPosition); - ExternalInterface.addCallback('_setPan', _setPan); - ExternalInterface.addCallback('_setVolume', _setVolume); - ExternalInterface.addCallback('_setPolling', _setPolling); - ExternalInterface.addCallback('_externalInterfaceTest', _externalInterfaceTest); - ExternalInterface.addCallback('_disableDebug', _disableDebug); - ExternalInterface.addCallback('_getMemoryUse', _getMemoryUse); - ExternalInterface.addCallback('_createSound', _createSound); - ExternalInterface.addCallback('_destroySound', _destroySound); - ExternalInterface.addCallback('_setAutoPlay', _setAutoPlay); - } catch(e: Error) { - flashDebug('Fatal: ExternalInterface error: ' + e.toString()); - } - } else { - flashDebug('Fatal: ExternalInterface (Flash <-> JS) not available'); - }; - - // call after delay, to be safe (ensure callbacks are registered by the time JS is called below) - var timer: Timer = new Timer(20, 0); - timer.addEventListener(TimerEvent.TIMER, function() : void { - timer.reset(); - _externalInterfaceTest(true); - // timer.reset(); - // flashDebug('Init OK'); - }); - timer.start(); - // delayed, see above - // _externalInterfaceTest(true); - } // SoundManager2() - - public function flashDebug (txt:String) : void { - // - messages.push(txt); - if (this.flashDebugEnabled) { - var didCreate: Boolean = false; - textStyle.font = 'Arial'; - textStyle.size = 12; - // 320x240 if no stage dimensions (happens in IE, apparently 0 before stage resize event fires.) - var w:Number = this.stage.width?this.stage.width:320; - var h:Number = this.stage.height?this.stage.height:240; - if (textField == null) { - didCreate = true; - textField = new TextField(); - textField.autoSize = TextFieldAutoSize.LEFT; - textField.x = 0; - textField.y = 0; - textField.multiline = true; - textField.textColor = 0; - textField.wordWrap = true; - } - textField.htmlText = messages.join('\n'); - textField.setTextFormat(textStyle); - textField.width = w; - textField.height = h; - if (didCreate) { - this.addChild(textField); - } - } - // - } - - public function _setAutoPlay(sID:String, autoPlay:Boolean) : void { - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (s) { - s.setAutoPlay(autoPlay); - } - } - - // methods - // ----------------------------------- - - public function writeDebug (s:String, logLevel:Number = 0) : Boolean { - if (!debugEnabled) { - return false; - } - // - ExternalInterface.call(baseJSController + "['_writeDebug']", "(Flash): " + s, null, logLevel); - // - return true; - } - - public function _externalInterfaceTest(isFirstCall: Boolean) : Boolean { - var sandboxType:String = flash.system.Security['sandboxType']; - if (!didSandboxMessage && sandboxType != 'localTrusted' && sandboxType != 'remote') { - didSandboxMessage = true; - flashDebug('
    Fatal: Security sandbox error: Got "' + sandboxType + '", expected "remote" or "localTrusted".
    Additional security permissions need to be granted.
    See flash security settings panel for non-HTTP, eg., file:// use.

    http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html

    You may also be able to right-click this movie and choose from the menu:
    "Global Settings" -> "Advanced" tab -> "Trusted Location Settings"
    '); - } - try { - if (isFirstCall == true) { - flashDebug('Testing Flash -> JS...'); - ExternalInterface.call(baseJSController + "._externalInterfaceOK", version); - flashDebug('Flash -> JS OK'); - flashDebug('Waiting for JS -> Flash...'); - } else { - // writeDebug('SM2 SWF ' + version + ' ' + version_as, 1); - ExternalInterface.call(baseJSController + "._setSandboxType", sandboxType); - flashDebug('JS -> Flash OK'); - } - } catch(e: Error) { - flashDebug('Fatal: Flash <-> JS error: ' + e.toString()); - writeDebug('_externalInterfaceTest: Error: ' + e.toString(), 2); - if (!caughtFatal) { - caughtFatal = true; - } - return false; - } - return true; // to verify that a call from JS to here, works. (eg. JS receives "true", thus OK.) - } - - public function _disableDebug() : void { - // prevent future debug calls from Flash going to client (maybe improve performance) - writeDebug('_disableDebug()'); - debugEnabled = false; - } - - public function checkLoadProgress(e: Event) : void { - try { - var oSound:Object = e.target; - var bL: int = oSound.bytesLoaded; - var bT: int = oSound.bytesTotal; - var nD: int = oSound.length || oSound.duration || 0; - var sMethod:String = baseJSObject + "['" + oSound.sID + "']._whileloading"; - ExternalInterface.call(sMethod, bL, bT, nD); - if (bL && bT && bL != oSound.lastValues.bytes) { - oSound.lastValues.bytes = bL; - ExternalInterface.call(sMethod, bL, bT, nD); - } - } catch(e: Error) { - writeDebug('checkLoadProgress(): ' + e.toString()); - } - } - - public function checkSoundProgress(oSound:SoundManager2_SMSound_AS3, forceCheck:Boolean = false, forceEndCheck:Boolean = false) : void { - var bL: int = 0; - var bT: int = 0; - var nD: int = 0; - var nP: int = 0; - var bufferLength: int = 0; - var lP:Number = 0; - var rP:Number = 0; - var isBuffering:Object = null; - var oSoundChannel: flash.media.SoundChannel = null; - var sMethod:String = null; - var newPeakData: Boolean = false; - var newWaveformData: Boolean = false; - var newEQData: Boolean = false; - var areSoundsInaccessible: Boolean = SoundMixer.areSoundsInaccessible(); - var isPlaying: Boolean = true; // special case for NetStream when ending - var hasNew:Boolean = false; - var hasNewLoaded:Boolean = false; - - if (!oSound || !oSound.useEvents || oSound.failed || !oSound.connected) { - // edge cases for ignoring: if sounds are destructed within event handlers while checkProgress() is running, may be null - return; - } - - sMethod = baseJSObject + "['" + oSound.sID + "']._whileloading"; - - if (oSound.useNetstream) { - - // Don't do anything if there is no NetStream object yet - if (!oSound.ns) { - return; - } - - // stream - bufferLength = oSound.ns.bufferLength; - bL = oSound.ns.bytesLoaded; - bT = oSound.ns.bytesTotal; - nD = int(oSound.duration || 0); // can sometimes be null with short MP3s? Wack. - nP = oSound.ns.time * 1000; - - if (oSound.paused) { - // special case: paused netStreams don't update if setPosition() is called while they are paused. - // instead, return lastValues.position which should reflect setPosition() call. - // writeDebug('paused case, setting nP of '+nP+' to -1'); - // writeDebug('lastValues: '+oSound.lastValues.position); - nP = oSound.lastValues.position; - } - - if (nP >= 0 && nP != oSound.lastValues.position) { - oSound.lastValues.position = nP; - hasNew = true; - } - if (nD > oSound.lastValues.duration) { - oSound.lastValues.duration = nD; - hasNew = true; - } - if (bL > oSound.lastValues.bytesLoaded) { - oSound.lastValues.bytesLoaded = bL; - hasNew = true; - } - if (bT > oSound.lastValues.bytes) { - oSound.lastValues.bytes = bT; - hasNew = true; - } - if (bufferLength != oSound.lastValues.bufferLength) { - oSound.lastValues.bufferLength = bufferLength; - hasNew = true; - } - - // Don't set loaded for streams because bytesLoaded and bytesTotal are always 0 - // writeDebug('ns: time/duration, bytesloaded/total: '+nP+'/'+nD+', '+bL+'/'+bT); - if (oSound.loaded != true && nD > 0 && bL == bT && bL != 0 && bT != 0) { - // non-MP3 has loaded - oSound.loaded = true; - try { - ExternalInterface.call(sMethod, bL, bT, nD, bufferLength); - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", oSound.duration > 0 ? 1 : 0); - } catch(e: Error) { - writeDebug('_whileLoading/_onload error: ' + e.toString(), 2); - } - } else if (oSound.loaded != true && hasNew) { - ExternalInterface.call(sMethod, bL, bT, nD, bufferLength); - } - - } else { - - // MP3 sound - oSoundChannel = oSound.soundChannel; - bL = oSound.bytesLoaded; - bT = oSound.bytesTotal; - nD = int(oSound.length || 0); // can sometimes be null with short MP3s? Wack. - isBuffering = oSound.isBuffering; - - if (oSoundChannel) { - nP = (oSoundChannel.position || 0); - if (oSound.lastValues.loops > 1 && nP > oSound.length) { - // round down to nearest loop - var playedLoops:Number = Math.floor(nP/oSound.length); - nP = nP - (oSound.length*playedLoops); - } - if (oSound.usePeakData) { - lP = int((oSoundChannel.leftPeak) * 1000) / 1000; - rP = int((oSoundChannel.rightPeak) * 1000) / 1000; - } else { - lP = 0; - rP = 0; - } - } else { - // stopped, not loaded or feature not used - nP = 0; - } - - if (forceEndCheck) { - // sound finish case: Ensure position is at end (sound duration), as flash 9 does not always correctly match the two. - if (nP < nD) { - writeDebug('correcting sound ' + oSound.sID + ' end position ('+nP+') to length: '+ nD, 2); - nP = nD; - } - } - - if (nP != oSound.lastValues.position && nP !== 0 && !oSound.didFinish) { // once "completed", sound is locked via didFinish so no more position-type events fire. - oSound.lastValues.position = nP; - hasNew = true; - } - - if (nD > oSound.lastValues.duration) { // original sound duration * number of sound loops - oSound.lastValues.duration = nD; - hasNew = true; - } - - if (bL > oSound.lastValues.bytesLoaded) { - oSound.lastValues.bytesLoaded = bL; - hasNew = true; - } - - if (bT > oSound.lastValues.bytes) { - oSound.lastValues.bytes = bT; - hasNew = true; - hasNewLoaded = true; - } - - // loading progress - if (hasNewLoaded) { - oSound.lastValues.bytes = bL; - ExternalInterface.call(sMethod, bL, bT, nD); - } - - } - - // peak data - if (oSoundChannel && oSound.usePeakData) { - if (lP != oSound.lastValues.leftPeak) { - oSound.lastValues.leftPeak = lP; - newPeakData = true; - } - if (rP != oSound.lastValues.rightPeak) { - oSound.lastValues.rightPeak = rP; - newPeakData = true; - } - } - - var newDataError:Boolean = false; - var dataError:String; - - // special case: Netstream may try to fire whileplaying() after finishing. check that stop hasn't fired. - isPlaying = (oSound.didLoad && !oSound.paused && (!oSound.useNetstream || (oSound.useNetstream && oSound.lastNetStatus != "NetStream.Play.Stop"))); // don't update if stream has ended - - // raw waveform + EQ spectrum data - if (isPlaying && (oSoundChannel || oSound.useNetstream)) { - - if (oSound.useWaveformData) { - if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) { - try { - oSound.getWaveformData(); - } catch(e: Error) { - if (!oSound.handledDataError) { - writeDebug('getWaveformData() (waveform data) '+e.toString()); - } - // oSound.useWaveformData = false; - newDataError = true; - dataError = e.toString(); - } - } - } - - if (oSound.useEQData) { - if (!areSoundsInaccessible && !oSound.handledDataError && !oSound.ignoreDataError) { - try { - oSound.getEQData(); - } catch(e: Error) { - if (!oSound.handledDataError) { - writeDebug('computeSpectrum() (EQ data) '+e.toString()); - } - // oSound.useEQData = false; - newDataError = true; - dataError = e.toString(); - } - } - } - - if (oSound.waveformDataArray != oSound.lastValues.waveformDataArray) { - oSound.lastValues.waveformDataArray = oSound.waveformDataArray; - newWaveformData = true; - } - - if (oSound.eqDataArray != oSound.lastValues.eqDataArray) { - oSound.lastValues.eqDataArray = oSound.eqDataArray; - newEQData = true; - } - - if (newDataError && !oSound.handledDataError) { - sMethod = baseJSObject + "['" + oSound.sID + "']._ondataerror"; - ExternalInterface.call(sMethod, 'data unavailable: ' + dataError); - oSound.handledDataError = true; - } - - } - - if (typeof nP != 'undefined' && (hasNew && (oSound.soundChannel || oSound.useNetstream || forceCheck || forceEndCheck))) { // && isPlaying - removed to allow updates while paused, eg. from setPosition() calls. Also be more liberal if we're using netStream. - - // oSound.lastValues.position = nP; - sMethod = baseJSObject + "['" + oSound.sID + "']._whileplaying"; - var waveDataLeft:String = (newWaveformData ? oSound.waveformDataArray.slice(0, 256).join(',') : null); - var waveDataRight:String = (newWaveformData ? oSound.waveformDataArray.slice(256).join(',') : null); - var eqDataLeft:String = (newEQData ? oSound.eqDataArray.slice(0, 256).join(',') : null); - var eqDataRight:String = (newEQData ? oSound.eqDataArray.slice(256).join(',') : null); - ExternalInterface.call(sMethod, nP, (newPeakData ? { - leftPeak: lP, - rightPeak: rP - } : null), waveDataLeft, waveDataRight, (newEQData ? { - leftEQ: eqDataLeft, - rightEQ: eqDataRight - } : null)); - } - - // check isBuffering - if (!oSound.useNetstream && oSound.isBuffering != oSound.lastValues.isBuffering) { - // property has changed - oSound.lastValues.isBuffering = oSound.isBuffering; - sMethod = baseJSObject + "['" + oSound.sID + "']._onbufferchange"; - ExternalInterface.call(sMethod, oSound.isBuffering ? 1 : 0); - } - - } - - public function checkProgress() : void { - for (var i: int = 0, j: int = sounds.length; i < j; i++) { - checkSoundProgress(soundObjects[sounds[i]]); - } - } - - public function onLoadError(oSound:Object) : void { - // something went wrong. 404, bad format etc. - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", 0); - } - - public function onLoad(e: Event) : void { - var oSound:Object = e.target; - checkSoundProgress(soundObjects[oSound.sID]); // ensure progress stats are up-to-date - if (!oSound.useNetstream) { // FLV must also have metadata - oSound.loaded = true; - // force duration update (doesn't seem to be always accurate) - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._whileloading", oSound.bytesLoaded, oSound.bytesTotal, oSound.length || oSound.duration); - // duration > 0 means a valid sound was loaded. - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onload", (oSound.length || oSound.duration ? 1 : 0)); - } - } - - public function onID3(e: Event) : void { - - // --- NOTE: BUGGY (Flash 8 only? Haven't really checked 9 + 10.) --- - // TODO: Investigate holes in ID3 parsing - for some reason, Album will be populated with Date if empty and date is provided. (?) - // ID3V1 seem to parse OK, but "holes" / blanks in ID3V2 data seem to get messed up (eg. missing album gets filled with date.) - // iTunes issues: onID3 was not called with a test MP3 encoded with iTunes 7.01, and what appeared to be valid ID3V2 data. - // May be related to thumbnails for album art included in MP3 file by iTunes. See http://mabblog.com/blog/?p=33 - try { - var oSound:Object = e.target; - - var id3Data:Array = []; - var id3Props:Array = []; - for (var prop:String in oSound.id3) { - id3Props.push(prop); - id3Data.push(oSound.id3[prop]); - // writeDebug('id3['+prop+']: '+oSound.id3[prop]); - } - ExternalInterface.call(baseJSObject + "['" + oSound.sID + "']._onid3", id3Props, id3Data); - // unhook own event handler, prevent second call (can fire twice as data is received - ID3V2 at beginning, ID3V1 at end.) - // Therefore if ID3V2 data is received, ID3V1 is ignored. - // soundObjects[oSound.sID].onID3 = null; - } catch(e: Error) { - writeDebug('onID3(): Unable to get ID3 info for ' + oSound.sID + '.'); - } - oSound.removeEventListener(Event.ID3, onID3); - } - - public function registerOnComplete(sID:String) : void { - var oSound: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (oSound && oSound.soundChannel) { - oSound.didFinish = false; // reset this flag - oSound.soundChannel.addEventListener(Event.SOUND_COMPLETE, function() : void { - if (oSound) { - // force progress check, catching special end-of-sound case where position may not match duration. - checkSoundProgress(oSound, true, true); - try { - oSound.ignoreDataError = true; // workaround: avoid data error handling for this manual step.. - // oSound.soundChannel.stop(); - oSound.didFinish = true; // "lock" sound, prevent extra whileplaying() position-type updates - // call onfinish first (with end position)... - ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); - // then reset sound so it can be played again. - // oSound.start(0, 1); // go back to 0 - } catch(e: Error) { - writeDebug('Could not set position on ' + sID + ': ' + e.toString()); - } - oSound.ignoreDataError = false; // ..and reset - oSound.handledDataError = false; // reset this flag - } else { - // safety net - ExternalInterface.call(baseJSObject + "['" + sID + "']._onfinish"); - } - }); - } - } - - public function doSecurityError(oSound: SoundManager2_SMSound_AS3, e: SecurityErrorEvent) : void { - writeDebug('securityError: ' + e.text); - // when this happens, you don't have security rights on the server containing the FLV file - // a crossdomain.xml file would fix the problem easily - } - - public function _setPosition(sID:String, nSecOffset:Number, isPaused: Boolean, allowMultiShot: Boolean) : void { - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (!s) return void; - // writeDebug('_setPosition()'); - - // stop current channel, start new one. - if (s.lastValues) { - s.lastValues.position = nSecOffset; // s.soundChannel.position; - } - if (s.useNetstream) { - // Minimize the buffer so playback starts ASAP - s.ns.bufferTime = s.bufferTime; - writeDebug('setPosition ('+ sID + '): setting buffer to '+s.ns.bufferTime+' secs'); - - nSecOffset = nSecOffset > 0 ? nSecOffset / 1000 : 0; - s.ns.seek(nSecOffset); - checkSoundProgress(s); // force UI update - } else { - if (s.soundChannel) { - s.soundChannel.stop(); - } - writeDebug('setPosition ('+ sID + '): ' + nSecOffset); // +', '+(s.lastValues.loops?s.lastValues.loops:1)); - if (s.lastValues.loops > 1 && nSecOffset != 0) { - writeDebug('Warning: Looping functionality being disabled due to Flash limitation.'); - s.lastValues.loops = 1; - } - try { - s.start(nSecOffset, s.lastValues.loops || 1, allowMultiShot); // start playing at new position - } catch(e: Error) { - writeDebug('Warning: Could not set position on ' + sID + ': ' + e.toString()); - } - checkSoundProgress(s); // force UI update - try { - registerOnComplete(sID); - } catch(e: Error) { - writeDebug('_setPosition(): Could not register onComplete'); - } - if (isPaused && s.soundChannel) { - // writeDebug('_setPosition: stopping (paused) sound'); - // writeDebug('last position: '+s.lastValues.position+' vs '+s.soundChannel.position); - s.soundChannel.stop(); - } - } - } - - public function _load(sID:String, sURL:String, bStream: Boolean, bAutoPlay: Boolean, nLoops: Number, bAutoLoad: Boolean, bCheckPolicyFile: Boolean) : void { - // writeDebug('_load()'); - if (typeof bAutoPlay == 'undefined') bAutoPlay = false; - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (!s) return void; - var didRecreate: Boolean = false; - if (s.didLoad == true) { - // need to recreate sound - didRecreate = true; - writeDebug('recreating sound ' + sID + ' in order to load ' + sURL); - var ns:Object = new Object(); - ns.sID = s.sID; - ns.loops = nLoops||1; - ns.usePeakData = s.usePeakData; - ns.useWaveformData = s.useWaveformData; - ns.useEQData = s.useEQData; - ns.useNetstream = s.useNetstream; - ns.bufferTime = s.bufferTime; - ns.serverUrl = s.serverUrl; - ns.duration = s.duration; - ns.checkPolicyFile = s.checkPolicyFile; - ns.useEvents = true; - _destroySound(s.sID); - _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, bAutoPlay, ns.useEvents, bAutoLoad, ns.checkPolicyFile); - s = soundObjects[sID]; - // writeDebug('Sound object replaced'); - } - checkSoundProgress(s); - - if (!s.didLoad) { - try { - s.addEventListener(Event.ID3, onID3); - s.addEventListener(Event.COMPLETE, onLoad); - } catch(e: Error) { - writeDebug('_load(): could not assign ID3/complete event handlers'); - } - } - - // don't try to load if same request already made - s.sURL = sURL; - - try { - if (!s.useNetstream) { - s.addEventListener(IOErrorEvent.IO_ERROR, function(e: IOErrorEvent) : void { - s.doIOError(e); - }); - } - s.loadSound(sURL); - } catch(e: Error) { - // oh well - writeDebug('_load: Error loading ' + sURL + '. Flash error detail: ' + e.toString()); - } - - } - - public function _unload(sID:String) : void { - var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null); - if (!s) return void; - var sURL:String = s.sURL; // save existing sound URL for object recreation - try { - removeEventListener(Event.ID3, onID3); - removeEventListener(Event.COMPLETE, onLoad); - } catch(e: Error) { - writeDebug('_unload() warn: Could not remove ID3/complete events'); - } - s.paused = false; - if (s.soundChannel) { - s.soundChannel.stop(); - } - try { - if (s.didLoad && !s.loaded && !s.useNetstream) { - s.close(); // close stream only if still loading? - } - } catch(e: Error) { - // stream may already have closed if sound loaded, etc. - writeDebug(sID + '._unload(): Note: Unable to close stream: ' + e.toString()); - // oh well - } - // destroy and recreate Flash sound object, try to reclaim memory - // writeDebug('sound._unload(): recreating sound '+sID+' to free memory'); - if (s.useNetstream) { - // writeDebug('_unload(): closing netStream stuff'); - try { - s.removeNetstreamEvents(); - s.ns.close(); - s.nc.close(); - // s.nc = null; - // s.ns = null; - } catch(e: Error) { - // oh well - writeDebug('_unload(): caught exception during netConnection/netStream close'); - } - } - var ns:Object = new Object(); - ns.sID = s.sID; - ns.loops = s.loops; - ns.usePeakData = s.usePeakData; - ns.useWaveformData = s.useWaveformData; - ns.useEQData = s.useEQData; - ns.useNetstream = s.useNetstream; - ns.bufferTime = s.bufferTime; - ns.serverUrl = s.serverUrl; - ns.duration = s.duration; - ns.autoPlay = s.autoPlay; - ns.autoLoad = s.autoLoad; - ns.checkPolicyFile = s.checkPolicyFile; - _destroySound(s.sID); - _createSound(ns.sID, sURL, ns.usePeakData, ns.useWaveformData, ns.useEQData, ns.useNetstream, ns.bufferTime, ns.loops, ns.serverUrl, ns.duration, ns.autoPlay, false, ns.autoLoad, ns.checkPolicyFile); // false: don't allow events just yet - soundObjects[sID].connected = true; // fake it? - writeDebug(s.sID + '.unload(): ok'); - } - - public function _createSound(sID:String, sURL:String, usePeakData: Boolean, useWaveformData: Boolean, useEQData: Boolean, useNetstream: Boolean, bufferTime:Number, loops:Number, serverUrl:String, duration:Number, autoPlay:Boolean, useEvents:Boolean, autoLoad:Boolean, checkPolicyFile:Boolean) : void { - var s: SoundManager2_SMSound_AS3 = new SoundManager2_SMSound_AS3(this, sID, sURL, usePeakData, useWaveformData, useEQData, useNetstream, bufferTime, serverUrl, duration, autoPlay, useEvents, autoLoad, checkPolicyFile); - if (!soundObjects[sID]) { - sounds.push(sID); - } - soundObjects[sID] = s; - this.currentObject = s; - s.sID = sID; - s.sURL = sURL; - s.paused = false; - s.loaded = false; - s.checkPolicyFile = checkPolicyFile; - s.lastValues = { - bytes: 0, - duration: 0, - position: 0, - loops: loops||1, - leftPeak: 0, - rightPeak: 0, - bufferLength: 0 - }; - } - - public function _destroySound(sID:String) : void { - // for the power of garbage collection! .. er, Greyskull! - var s: SoundManager2_SMSound_AS3 = (soundObjects[sID] || null); - if (!s) return void; - // try to unload the sound - for (var i: int = 0, j: int = sounds.length; i < j; i++) { - if (sounds[i] == sID) { - sounds.splice(i, 1); - break; - } - } - if (s.soundChannel) { - s.soundChannel.stop(); - } - // if is a movie, remove that as well. - if (s.useNetstream) { - // s.nc.client = null; - try { - s.removeNetstreamEvents(); - // s.nc.removeEventListener(NetStatusEvent.NET_STATUS, s.doNetStatus); - } catch(e: Error) { - writeDebug('_destroySound(): Events already removed from netStream/netConnection?'); - } - if (s.didLoad) { - // TODO: figure out if stream is still open first, can't close an already-closed stream. - try { - s.ns.close(); - s.nc.close(); - } catch(e: Error) { - // oh well - writeDebug('_destroySound(): caught exception: '+e.toString()); - } - } - } else if (s.didLoad) { - // non-netstream case - try { - s.close(); // close stream only if still loading? - } catch(e: Error) { - // oh well - } - } - s = null; - soundObjects[sID] = null; - delete soundObjects[sID]; - } - - public function _stop(sID:String, bStopAll: Boolean) : void { - // stop this particular instance (or "all", based on parameter) - if (bStopAll) { - SoundMixer.stopAll(); - } else { - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (!s) return void; - if (s.useNetstream && s.ns) { - s.ns.pause(); - } else if (s.soundChannel) { - s.soundChannel.stop(); - } - s.paused = false; - } - } - - public function _start(sID:String, nLoops: int, nMsecOffset: int, allowMultiShot: Boolean) : Boolean { - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - var result: Boolean; - if (!s) return true; - writeDebug('start (' + sID + '): ' + nMsecOffset + (nLoops > 1 ? ', loops: ' + nLoops : '')); - s.lastValues.paused = false; // reset pause if applicable - s.lastValues.loops = (nLoops || 1); - if (!s.useNetstream) { - s.lastValues.position = nMsecOffset; - } - s.handledDataError = false; // reset this flag - try { - result = s.start(nMsecOffset, nLoops, allowMultiShot); - } catch(e: Error) { - writeDebug('Could not start ' + sID + ': ' + e.toString()); - } - try { - registerOnComplete(sID); - } catch(e: Error) { - writeDebug('_start(): registerOnComplete failed'); - } - return result; - } - - public function _pause(sID:String, allowMultiShot: Boolean) : void { - // writeDebug('_pause(): ' + sID); - var s: SoundManager2_SMSound_AS3 = soundObjects[sID]; - if (!s) return void; - // writeDebug('s.paused: '+s.paused); - if (!s.paused) { - // reference current position, stop sound - s.paused = true; - // writeDebug('_pause(): position: '+s.lastValues.position); - if (s.useNetstream) { - if (s.ns) { - s.lastValues.position = s.ns.time*1000; - s.ns.pause(); - } else if (s.autoPlay) { - s.setAutoPlay(false); - } - } else { - if (s.soundChannel) { - s.lastValues.position = s.soundChannel.position; - s.soundChannel.stop(); - } - } - } else { - // resume playing from last position - // writeDebug('resuming - playing at '+s.lastValues.position+', '+s.lastValues.loops+' times'); - s.paused = false; - if (s.useNetstream) { - s.ns.resume(); - } else { - s.start(s.lastValues.position, s.lastValues.loops, allowMultiShot); - } - try { - registerOnComplete(sID); - } catch(e: Error) { - writeDebug('_pause(): registerOnComplete() failed'); - } - } - } - - public function _setPan(sID:String, nPan:Number) : void { - if (soundObjects[sID]) { - soundObjects[sID].setPan(nPan); - } - } - - public function _setVolume(sID:String, nVol:Number) : void { - // writeDebug('_setVolume: '+nVol); - if (soundObjects[sID]) { - soundObjects[sID].setVolume(nVol); - } - } - - public function _setPolling(bPolling: Boolean = false, nTimerInterval: uint = 50) : void { - pollingEnabled = bPolling; - if (timer == null && pollingEnabled) { - flashDebug('Enabling polling, ' + nTimerInterval + ' ms interval'); - timer = new Timer(nTimerInterval, 0); - timer.addEventListener(TimerEvent.TIMER, function() : void { - checkProgress(); - }); // direct reference eg. checkProgress doesn't work? .. odd. - timer.start(); - } else if (timer && !pollingEnabled) { - flashDebug('Disabling polling'); - // flash.utils.clearInterval(timer); - timer.reset(); - } - } - - public function _getMemoryUse() : String { - return System.totalMemory.toString(); - } - - // ----------------------------------- - // end methods - - } - - // package - -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as deleted file mode 100755 index d240bc5b..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/SoundManager2_SMSound_AS3.as +++ /dev/null @@ -1,585 +0,0 @@ -/** - * SoundManager 2: Javascript Sound for the Web - * ---------------------------------------------- - * http://schillmania.com/projects/soundmanager2/ - * - * Copyright (c) 2007, Scott Schiller. All rights reserved. - * Code licensed under the BSD License: - * http://www.schillmania.com/projects/soundmanager2/license.txt - * - * Flash 9 / ActionScript 3 version - */ - -package { - - import flash.external.*; - import flash.events.*; - import flash.media.Sound; - import flash.media.SoundChannel; - import flash.media.SoundLoaderContext; - import flash.media.SoundTransform; - import flash.media.SoundMixer; - import flash.net.URLRequest; - import flash.utils.ByteArray; - import flash.utils.getTimer; - import flash.net.NetConnection; - import flash.net.NetStream; - import flash.net.Responder; - - public class SoundManager2_SMSound_AS3 extends Sound { - - public var sm: SoundManager2_AS3 = null; - // externalInterface references (for Javascript callbacks) - public var baseJSController: String = "soundManager"; - public var baseJSObject: String = baseJSController + ".sounds"; - public var soundChannel: SoundChannel = new SoundChannel(); - public var urlRequest: URLRequest; - public var soundLoaderContext: SoundLoaderContext; - public var waveformData: ByteArray = new ByteArray(); - public var waveformDataArray: Array = []; - public var eqData: ByteArray = new ByteArray(); - public var eqDataArray: Array = []; - public var usePeakData: Boolean = false; - public var useWaveformData: Boolean = false; - public var useEQData: Boolean = false; - public var sID: String; - public var sURL: String; - public var didFinish: Boolean; - public var loaded: Boolean; - public var connected: Boolean; - public var failed: Boolean; - public var paused: Boolean; - public var finished: Boolean; - public var duration: Number; - public var handledDataError: Boolean = false; - public var ignoreDataError: Boolean = false; - public var autoPlay: Boolean = false; - public var autoLoad: Boolean = false; - public var pauseOnBufferFull: Boolean = false; // only applies to RTMP - public var loops: Number = 1; - public var lastValues: Object = { - bytes: 0, - position: 0, - duration: 0, - volume: 100, - pan: 0, - loops: 1, - leftPeak: 0, - rightPeak: 0, - waveformDataArray: null, - eqDataArray: null, - isBuffering: null, - bufferLength: 0 - }; - public var didLoad: Boolean = false; - public var useEvents: Boolean = false; - public var sound: Sound = new Sound(); - - public var cc: Object; - public var nc: NetConnection; - public var ns: NetStream = null; - public var st: SoundTransform; - public var useNetstream: Boolean; - public var bufferTime: Number = 3; // previously 0.1 - public var lastNetStatus: String = null; - public var serverUrl: String = null; - - public var checkPolicyFile:Boolean = false; - - public function SoundManager2_SMSound_AS3(oSoundManager: SoundManager2_AS3, sIDArg: String = null, sURLArg: String = null, usePeakData: Boolean = false, useWaveformData: Boolean = false, useEQData: Boolean = false, useNetstreamArg: Boolean = false, netStreamBufferTime: Number = 1, serverUrl: String = null, duration: Number = 0, autoPlay: Boolean = false, useEvents: Boolean = false, autoLoad: Boolean = false, checkPolicyFile: Boolean = false) { - this.sm = oSoundManager; - this.sID = sIDArg; - this.sURL = sURLArg; - this.usePeakData = usePeakData; - this.useWaveformData = useWaveformData; - this.useEQData = useEQData; - this.urlRequest = new URLRequest(sURLArg); - this.didFinish = false; - this.loaded = false; - this.connected = false; - this.failed = false; - this.finished = false; - this.soundChannel = null; - this.lastNetStatus = null; - this.useNetstream = useNetstreamArg; - this.serverUrl = serverUrl; - this.duration = duration; - this.useEvents = useEvents; - this.autoLoad = autoLoad; - if (netStreamBufferTime) { - this.bufferTime = netStreamBufferTime; - } - this.checkPolicyFile = checkPolicyFile; - - writeDebug('SoundManager2_SMSound_AS3: Got duration: '+duration+', autoPlay: '+autoPlay); - - if (this.useNetstream) { - // Pause on buffer full if auto-loading an RTMP stream - if (this.serverUrl && this.autoLoad) { - this.pauseOnBufferFull = true; - } - - this.cc = new Object(); - this.nc = new NetConnection(); - - // Handle FMS bandwidth check callback. - // @see onBWDone - // @see http://www.adobe.com/devnet/flashmediaserver/articles/dynamic_stream_switching_04.html - // @see http://www.johncblandii.com/index.php/2007/12/fms-a-quick-fix-for-missing-onbwdone-onfcsubscribe-etc.html - this.nc.client = this; - - // TODO: security/IO error handling - // this.nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, doSecurityError); - nc.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - - if (this.serverUrl != null) { - writeDebug('SoundManager2_SMSound_AS3: NetConnection: connecting to server ' + this.serverUrl + '...'); - } - this.nc.connect(serverUrl); - } else { - this.connected = true; - } - - } - - public function rtmpResponder(result:Object):void { - // callback from Flash Media Server (RTMP) for 'getStreamLength' server-side method - result should be a floating-point. - // http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html - writeDebug('RTMP server getStreamLength() response: ' + result); - // we now know the duration. type cast to floating-point - this will update JS-land during whileloading() / whileplaying(). - this.duration = Number(result) * 1000; - } - - public function netStatusHandler(event:NetStatusEvent):void { - - if (this.useEvents) { - writeDebug('netStatusHandler: '+event.info.code); - } - - switch (event.info.code) { - - case "NetConnection.Connect.Success": - try { - this.ns = new NetStream(this.nc); - this.ns.checkPolicyFile = this.checkPolicyFile; - // bufferTime reference: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/net/NetStream.html#bufferTime - this.ns.bufferTime = this.bufferTime; // set to 0.1 or higher. 0 is reported to cause playback issues with static files. - this.st = new SoundTransform(); - this.cc.onMetaData = this.onMetaData; - this.cc.setCaption = this.captionHandler; - this.ns.client = this.cc; - this.ns.receiveAudio(true); - this.addNetstreamEvents(); - this.connected = true; - // RTMP-only - if (this.serverUrl && this.useEvents) { - var responder:Responder = new Responder(rtmpResponder); - // call a method on server to get the length of the stream (like onMetaData, but Flash Media Server-specific) - // Red5 and other RTMP servers appear to provide duration via onMetaData event(s) in the stream. - // http://help.adobe.com/en_US/FlashMediaServer/3.5_Deving/WS5b3ccc516d4fbf351e63e3d11a0773d117-7ffe.html - nc.call('getStreamLength', responder, this.sURL); - writeDebug('NetConnection: connected'); - writeDebug('firing _onconnect for '+this.sID); - ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._onconnect", 1); - } - } catch(e: Error) { - this.failed = true; - writeDebug('netStream error: ' + e.toString()); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code); - } - break; - - case "NetStream.Play.StreamNotFound": - this.failed = true; - writeDebug("NetConnection: Stream not found!"); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Stream not found!', event.info.level, event.info.code); - break; - - // This is triggered when the sound loses the connection with the server. - // In some cases one could just try to reconnect to the server and resume playback. - // However for streams protected by expiring tokens, I don't think that will work. - // - // Flash says that this is not an error code, but a status code... - // should this call the onFailure handler? - case "NetConnection.Connect.Closed": - this.failed = true; - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection closed!', event.info.level, event.info.code); - writeDebug("NetConnection: Connection closed!"); - break; - - // Couldn't establish a connection with the server. Attempts to connect to the server - // can also fail if the permissible number of socket connections on either the client - // or the server computer is at its limit. This also happens when the internet - // connection is lost. - case "NetConnection.Connect.Failed": - this.failed = true; - writeDebug("NetConnection: Connection failed! Lost internet connection? Try again... Description: " + event.info.description); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Connection failed!', event.info.level, event.info.code); - break; - - // A change has occurred to the network status. This could mean that the network - // connection is back, or it could mean that it has been lost...just try to resume - // playback. - - // KJV: Can't use this yet because by the time you get your connection back the - // song has reached it's maximum retries, so it doesn't retry again. We need - // a new _ondisconnect handler. - //case "NetConnection.Connect.NetworkChange": - // this.failed = true; - // writeDebug("NetConnection: Network connection status changed"); - // ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", 'Reconnecting...'); - // break; - - // Consider everything else a failure... - default: - this.failed = true; - writeDebug("NetConnection: got unhandled code '" + event.info.code + "'! Description: " + event.info.description); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', event.info.level, event.info.code); - break; - } - - } - - public function writeDebug (s: String, logLevel: Number = 0) : Boolean { - return this.sm.writeDebug (s,logLevel); // defined in main SM object - } - - public function onMetaData(infoObject: Object) : void { - var prop:String; - if (sm.debugEnabled) { - var data:String = new String(); - for (prop in infoObject) { - data += prop+': '+infoObject[prop]+' \n'; - } - writeDebug('Metadata: '+data); - } - this.duration = infoObject.duration * 1000; - if (!this.loaded) { - // writeDebug('not loaded yet: '+this.ns.bytesLoaded+', '+this.ns.bytesTotal+', '+infoObject.duration*1000); - // TODO: investigate loaded/total values - // ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.ns.bytesLoaded, this.ns.bytesTotal, infoObject.duration*1000); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._whileloading", this.bytesLoaded, this.bytesTotal, (this.duration || infoObject.duration)) - } - var metaData:Array = []; - var metaDataProps:Array = []; - for (prop in infoObject) { - metaData.push(prop); - metaDataProps.push(infoObject[prop]); - } - // pass infoObject to _onmetadata, too - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onmetadata", metaData, metaDataProps); - // this handler may fire multiple times, eg., when a song changes while playing an RTMP stream. - if (!this.serverUrl) { - // disconnect for non-RTMP cases, since multiple firings may mess up duration. - this.cc.onMetaData = function(infoObject: Object) : void {} - } - } - - public function captionHandler(infoObject: Object) : void { - - if (sm.debugEnabled) { - var data:String = new String(); - for (var prop:* in infoObject) { - data += prop+': '+infoObject[prop]+' \n'; - } - writeDebug('Caption: '+data); - } - - // null this out for the duration of this object's existence. - // it may be called multiple times. - // this.cc.setCaption = function(infoObject: Object) : void {} - - // writeDebug('Caption\n'+infoObject['dynamicMetadata']); - // writeDebug('firing _oncaptiondata for '+this.sID); - - ExternalInterface.call(this.sm.baseJSObject + "['" + this.sID + "']._oncaptiondata", infoObject['dynamicMetadata']); - - } - - public function getWaveformData() : void { - // http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum() - SoundMixer.computeSpectrum(this.waveformData, false, 0); // sample wave data at 44.1 KHz - this.waveformDataArray = []; - for (var i: int = 0, j: int = this.waveformData.length / 4; i < j; i++) { // get all 512 values (256 per channel) - this.waveformDataArray.push(int(this.waveformData.readFloat() * 1000) / 1000); - } - } - - public function getEQData() : void { - // http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundMixer.html#computeSpectrum() - SoundMixer.computeSpectrum(this.eqData, true, 0); // sample EQ data at 44.1 KHz - this.eqDataArray = []; - for (var i: int = 0, j: int = this.eqData.length / 4; i < j; i++) { // get all 512 values (256 per channel) - this.eqDataArray.push(int(this.eqData.readFloat() * 1000) / 1000); - } - } - - public function start(nMsecOffset: int, nLoops: int, allowMultiShot:Boolean) : Boolean { - - this.useEvents = true; - - if (this.useNetstream) { - - writeDebug("SMSound::start nMsecOffset "+ nMsecOffset+ ' nLoops '+nLoops + ' current bufferTime '+this.ns.bufferTime+' current bufferLength '+this.ns.bufferLength+ ' this.lastValues.position '+this.lastValues.position); - - // mark for later Netstream.Play.Stop / sound completion - this.finished = false; - - this.cc.onMetaData = this.onMetaData; - - // Don't seek if we don't have to because it destroys the buffer - var set_position:Boolean = this.lastValues.position != null && this.lastValues.position != nMsecOffset; - - if (set_position) { - // Minimize the buffer so playback starts ASAP - this.ns.bufferTime = this.bufferTime; - } - - if (this.paused) { - writeDebug('start: resuming from paused state'); - this.ns.resume(); // get the sound going again - if (!this.didLoad) { - this.didLoad = true; - } - this.paused = false; - } else if (!this.didLoad) { - writeDebug('start: !didLoad - playing '+this.sURL); - this.ns.play(this.sURL); - this.pauseOnBufferFull = false; // SAS: playing behaviour overrides buffering behaviour - this.didLoad = true; - this.paused = false; - } else { - // previously loaded, perhaps stopped/finished. play again? - writeDebug('playing again (not paused, didLoad = true)'); - this.pauseOnBufferFull = false; - this.ns.play(this.sURL); - } - - // KJV seek after calling play otherwise some streams get a NetStream.Seek.Failed - // Should only apply to the !didLoad case, but do it for all for simplicity. - // nMsecOffset is in milliseconds for streams but in seconds for progressive - // download. - if (set_position) { - this.ns.seek(this.serverUrl ? nMsecOffset / 1000 : nMsecOffset); - this.lastValues.position = nMsecOffset; // https://gist.github.com/1de8a3113cf33d0cff67 - } - - // this.ns.addEventListener(Event.SOUND_COMPLETE, _onfinish); - this.applyTransform(); - - } else { - // writeDebug('start: seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); - if (!this.soundChannel || allowMultiShot) { - this.soundChannel = this.play(nMsecOffset, nLoops); - this.addEventListener(Event.SOUND_COMPLETE, _onfinish); - this.applyTransform(); - } else { - // writeDebug('start: was already playing, no-multishot case. Seeking to '+nMsecOffset+', '+nLoops+(nLoops==1?' loop':' loops')); - // already playing and no multi-shot allowed, so re-start and set position - if (this.soundChannel) { - this.soundChannel.stop(); - } - this.soundChannel = this.play(nMsecOffset, nLoops); // start playing at new position - this.addEventListener(Event.SOUND_COMPLETE, _onfinish); - this.applyTransform(); - } - } - - // if soundChannel is null (and not a netStream), there is no sound card (or 32-channel ceiling has been hit.) - // http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29 - return (!this.useNetstream && this.soundChannel === null ? false : true); - - } - - private function _onfinish() : void { - this.removeEventListener(Event.SOUND_COMPLETE, _onfinish); - } - - public function loadSound(sURL: String) : void { - if (this.useNetstream) { - this.useEvents = true; - if (this.didLoad != true) { - this.ns.play(this.sURL); // load streams by playing them - if (!this.autoPlay) { - this.pauseOnBufferFull = true; - } - this.paused = false; - } - // this.addEventListener(Event.SOUND_COMPLETE, _onfinish); - this.applyTransform(); - } else { - try { - this.didLoad = true; - this.urlRequest = new URLRequest(sURL); - this.soundLoaderContext = new SoundLoaderContext(1000, this.checkPolicyFile); // check for policy (crossdomain.xml) file on remote domains - http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/media/SoundLoaderContext.html - this.load(this.urlRequest, this.soundLoaderContext); - } catch(e: Error) { - writeDebug('error during loadSound(): ' + e.toString()); - } - } - } - - // Set the value of autoPlay - public function setAutoPlay(autoPlay: Boolean) : void { - if (!this.serverUrl) { - this.autoPlay = autoPlay; - } else { - this.autoPlay = autoPlay; - if (this.autoPlay) { - this.pauseOnBufferFull = false; - } else if (!this.autoPlay) { - this.pauseOnBufferFull = true; - } - } - } - - public function setVolume(nVolume: Number) : void { - this.lastValues.volume = nVolume / 100; - this.applyTransform(); - } - - public function setPan(nPan: Number) : void { - this.lastValues.pan = nPan / 100; - this.applyTransform(); - } - - public function applyTransform() : void { - var st: SoundTransform = new SoundTransform(this.lastValues.volume, this.lastValues.pan); - if (this.useNetstream) { - if (this.ns) { - this.ns.soundTransform = st; - } else { - // writeDebug('applyTransform(): Note: No active netStream'); - } - } else if (this.soundChannel) { - this.soundChannel.soundTransform = st; // new SoundTransform(this.lastValues.volume, this.lastValues.pan); - } - } - - // Handle FMS bandwidth check callback. - // @see http://www.adobe.com/devnet/flashmediaserver/articles/dynamic_stream_switching_04.html - // @see http://www.johncblandii.com/index.php/2007/12/fms-a-quick-fix-for-missing-onbwdone-onfcsubscribe-etc.html - public function onBWDone() : void { - // writeDebug('onBWDone: called and ignored'); - } - - // NetStream client callback. Invoked when the song is complete. - public function onPlayStatus(info:Object):void { - writeDebug('onPlayStatus called with '+info); - switch(info.code) { - case "NetStream.Play.Complete": - writeDebug('Song has finished!'); - break; - } - } - - public function doIOError(e: IOErrorEvent) : void { - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onload", 0); // call onload, assume it failed. - // there was a connection drop, a loss of internet connection, or something else wrong. 404 error too. - } - - public function doAsyncError(e: AsyncErrorEvent) : void { - writeDebug('asyncError: ' + e.text); - } - - public function doNetStatus(e: NetStatusEvent) : void { - - // Handle failures - if (e.info.code == "NetStream.Failed" - || e.info.code == "NetStream.Play.FileStructureInvalid" - || e.info.code == "NetStream.Play.StreamNotFound") { - - this.lastNetStatus = e.info.code; - writeDebug('netStatusEvent: ' + e.info.code); - this.failed = true; - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfailure", '', e.info.level, e.info.code); - return; - } - - writeDebug('netStatusEvent: ' + e.info.code); // KJV we like to see all events - - // When streaming, Stop is called when buffering stops, not when the stream is actually finished. - // @see http://www.actionscript.org/forums/archive/index.php3/t-159194.html - if (e.info.code == "NetStream.Play.Stop") { - - if (!this.finished && (!this.useNetstream || !this.serverUrl)) { - - // finished playing, and not RTMP - writeDebug('calling onfinish for a sound'); - // reset the sound? Move back to position 0? - this.sm.checkProgress(); - this.finished = true; // will be reset via JS callback - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish"); - - } - - } else if (e.info.code == "NetStream.Play.Start" || e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Buffer.Full") { - - // RTMP case.. - // We wait for the buffer to fill up before pausing the just-loaded song because only if the - // buffer is full will the song continue to buffer until the user hits play. - if (this.serverUrl && e.info.code == "NetStream.Buffer.Full" && this.pauseOnBufferFull) { - this.ns.pause(); - this.paused = true; - this.pauseOnBufferFull = false; - // Call pause in JS. This will call back to us to pause again, but - // that should be harmless. - writeDebug('Pausing on buffer full'); - ExternalInterface.call(baseJSObject + "['" + this.sID + "'].pause", false); - } - - var isNetstreamBuffering: Boolean = (e.info.code == "NetStream.Buffer.Empty" || e.info.code == "NetStream.Play.Start"); - // assume buffering when we start playing, eg. initial load. - if (isNetstreamBuffering != this.lastValues.isBuffering) { - this.lastValues.isBuffering = isNetstreamBuffering; - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onbufferchange", this.lastValues.isBuffering ? 1 : 0); - } - - // We can detect the end of the stream when Play.Stop is called followed by Buffer.Empty. - // However, if you pause and let the whole song buffer, Buffer.Flush is called followed by - // Buffer.Empty, so handle that case too. - // - // Ignore this event if we are more than 3 seconds from the end of the song. - if (e.info.code == "NetStream.Buffer.Empty" && (this.lastNetStatus == 'NetStream.Play.Stop' || this.lastNetStatus == 'NetStream.Buffer.Flush')) { - if (this.duration && (this.ns.time * 1000) < (this.duration - 3000)) { - writeDebug('Ignoring Buffer.Empty because this is too early to be the end of the stream! (sID: '+this.sID+', time: '+(this.ns.time*1000)+', duration: '+this.duration+')'); - } else if (!this.finished) { - this.finished = true; - writeDebug('calling onfinish for sound '+this.sID); - this.sm.checkProgress(); - ExternalInterface.call(baseJSObject + "['" + this.sID + "']._onfinish"); - } - - } else if (e.info.code == "NetStream.Buffer.Empty") { - // The buffer is empty. Start from the smallest buffer again. - this.ns.bufferTime = this.bufferTime; - } - } - - // Remember the last NetStatus event - this.lastNetStatus = e.info.code; - } - - // KJV The sound adds some of its own netstatus handlers so we don't need to do it here. - public function addNetstreamEvents() : void { - ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError); - ns.addEventListener(NetStatusEvent.NET_STATUS, doNetStatus); - ns.addEventListener(IOErrorEvent.IO_ERROR, doIOError); - } - - public function removeNetstreamEvents() : void { - ns.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, doAsyncError); - ns.removeEventListener(NetStatusEvent.NET_STATUS, doNetStatus); - ns.addEventListener(NetStatusEvent.NET_STATUS, dummyNetStatusHandler); - ns.removeEventListener(IOErrorEvent.IO_ERROR, doIOError); - // KJV Stop listening for NetConnection events on the sound - nc.removeEventListener(NetStatusEvent.NET_STATUS, netStatusHandler); - } - - // Prevents possible 'Unhandled NetStatusEvent' condition if a sound is being - // destroyed and interacted with at the same time. - public function dummyNetStatusHandler(e: NetStatusEvent) : void { - // Don't do anything - } - } -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat deleted file mode 100755 index fcab4234..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.bat +++ /dev/null @@ -1,5 +0,0 @@ -@REM this builds the soundmanager 2 SWF from source - -mtasc -swf ../swf/soundmanager2_debug.swf -main -header 16:16:30 SoundManager2.as -version 8 -@pause - diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh deleted file mode 100755 index 8857d152..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash8.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -/Applications/mtasc/mtasc -swf ../swf/soundmanager2_debug.swf -main -header 16:16:30 SoundManager2.as -version 8 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat deleted file mode 100755 index ed63934a..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.bat +++ /dev/null @@ -1,4 +0,0 @@ -@REM this builds the soundmanager 2 SWF from source -@REM using mxmlc from the Adobe open-source Flex SDK - -c:\progra~1\flexsdk\bin\mxmlc -debug=true -use-network=false -static-link-runtime-shared-libraries=true -optimize=true -o ../swf/soundmanager2_flash9_debug.swf -file-specs SoundManager2_AS3.as diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh deleted file mode 100755 index ec6041c1..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/src/make-flash9.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -/Applications/flexsdk/bin/mxmlc -debug=true -static-link-runtime-shared-libraries=true -optimize=true -o ../swf/soundmanager2_flash9_debug.swf -file-specs SoundManager2_AS3.as diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2.swf deleted file mode 100755 index e900766a8250814f69718b07c18fa252ffd71bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2908 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 Gjdg9jBfGT# diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_debug.swf deleted file mode 100755 index a6809121ff0b315591d2f031302b9749497c5b2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3282 zcmV;@3@!6RS5pYD9RL7$+O%2AcN=FFzmjIGab8XBG%BqeriLbQiRCm2lsdL!$Eh7R zw&Y5#(+7<*(tMUC8O?~9ksYU{4J0E@CU$Q!-56pu;K6zu;3iFEcpuv z_ug+_vXhDpUP#~Le)svi_q(6`0N^|T{087m1{SlA@Naks7hpYuAJ-BY` zdEaOWzf^O3j=5$yIPosQqZ3DoX8qGYYQKd3t$NFL8-@+r!t*WHfz3;$S6?womoC11 z`DOfo^9!|0Q%kntxAkvNz)Miu^#joXUo?B373_jx+wRT{w_{ii=#zTWbA5l(! zqhSjZ8ip@kuPwSx;JLOfJn&O0gu9i-J<$xH#9Kb3zvPw=fz?6sF0!zk)@vbeQ#5+< zWQ+8?kzO$^vt~GE!+o$Od>`dO)9AI@!IBZ6(e;j8^y3lAg1YCrfn*G|fX?_$!xn3< zDZp`SG)A+nmIE8BKvszd!J2S-eV)}pPw%ae(;|N~dw$?{Xvv3e&u>GAPVb;U1uGBd z+2Iq@I=p+Xo~)mHPg)4bRCo>=@LD)nK|$V@(IoS1JLL!1K-wkO>lgv})_~nJKhe0?)22u z&dyG$V_+t9glQS2rrVkFd)=<<1yiQm>|wA2gG5aUXNn`$wT)fjO|^yHokH)CGyHl- z;^^X)5;=H$jwut}B09ZmIKrNpGUoIxw9Ijx$(tJ+>u7kZq;FZaK!x<4FG@30jXBcz z|EQ!4jW_qU+tWM7u5Q>qJB(0IzViralTF)d-q(Y+ldAXaWcKjd^= zxoubsMsg;u$So!#K$hxgdM$z$f<2mUxKyspp2wzP4fGkTfI@>!!|q`PYY-jQ3-DKNz`6HI z^_@0G-$p*93Kk}@g_&$7TNF^*avc)J>#jrexUzENGFawi=z4B9+@Yx_S{6Flt2m2p zr)vw$P1oV77tbXzin6dyk+;@kU0t{9qklaIrA}j<+%7x1=QL&F5v&`6)Io<56TZWMZz(c3 zywon>tU(=8wNv!Fq7WaQUbxOR#rnIbRkY19b~Pr%hb z5vDx8JhPt%?L?kbxz6LKqHzwilUb&IS_S?dQ8WBK8qQCJ-_OuD9zC5pT98LawP#t- zSIYY;u#PKZG=Hv0yU%OIN-`VM&QzpRvJ?1$N~;BA%S^Se&f|Qjus;Nfs_9y`xJ(CM zpid>cOk`Oi8z-_nljXIqsZiNJiX#@R3~66y$Gli&r#{O<&niQ#!nwU?P%bDFko6&F zyRB8REo^w3!#5(sHv}A(IT;9C7{)lLQbFQ%o-{#n>Dvj`Do0wq#0%eG=@D>rv;lh=K{NHeh{7P8{35Nx#*RNpz3{Dgk5lMO_A6g+#t$&Dz zZ&t_TDZNI470@qjW?4V zc`O=31&Do-bz4bT;q3Kzh7gzrsgC4)YY=BVzM4M1#O7#g3RevYjx|16t{ybu8L5&6 zvd(12B<#P)N@uE>ISxruH%_zi>ypX2*@CQFFvetW#5MOHnJ95(ZA>P)^h8Nd5a>uN z%TThKXFX4_{#6RNMm8ShQ0Lbr0eUO1XgA4{CZpu3Vth!+m&=mpu;ht#s#cX+B`X_M zshUEQH_Hc#kJOa+Hsh33vJ4&_QWwW4aB0jU;cbr3TV)BU3drNQiVk~A$yW9?yj7GO z-XF(U*|(P^#XDt2+q)cf<;(D-s5fZxoe;&LY&Dj>8OpxZCwmjqjOOa&<-RunZRq=t z|HHw)vo}I%n!_}0)OyV(HLHJv7;$efHk1r{Gxl=^{hXTAs>CO)M&^GuKVlt5s1=t{ zkY!YZ=t6v=jQRjm*~+^T(pZfC60^VFhw1Avax$7xeiLUvI9@@G<~Xeyl!(ZxQ6$^> zs?70q6CRO!<#;non`pux9!V_a9)B~W{oP&?_%GMS(v!Gc1y6mLYI``je z^bzK+TCJB4)17p zqM<`w0FPYi=#F#olD6lyt^~8HW~6sV6Z`XI{}-W4wC^VOM$&(ov(iD{-YB(*YM+Dr zgVEMN{%-#)A3@4X0+wb+zj_xf6BhN~*e#iGo{9a#h-cmJ->(R5UW=t9oPE3UsYPT!63 zjjXK4ccl_v+I%rzh2%N4g|w@&iBGoA09ll z>Do^|)eBF3wD&@EsuBIzlH>m$#J`vPRpLe#&8?BRvA7iXuk>VBvi!h0S>(H(ubDh| zg4)x?5bj9!{qXJZgZ{SzI`kx7>u(g}21Nd5@x$sE`t&A9&a1LBkC@VIlB?*C`davt z#hAC`@-ZTUe_R-wiEr^nmR?EEXG{D_LLNWvi~ z0Nulo?%@Es_d~k(2hg=by4C=?4??;R2GD&N(tS99?xT?IqXBdaA>G0Nx=Kh_89?WU zbp8Okose$lOXv`JrPRw2G4e_O+p!PB@`X5zg-0$e%og}acFU!+_w*UYD diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9.swf deleted file mode 100755 index 3d4222a345f039a12aad81b24c2b74017bc21074..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8758 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/swf/soundmanager2_flash9_debug.swf deleted file mode 100755 index c1a129d8871b60f8cc09f42c5c6ac7534f6d28e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17258 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 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css deleted file mode 100755 index 5bccf9a9..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.css +++ /dev/null @@ -1,119 +0,0 @@ -/* SM2 troubleshooting CSS */ - -#sm2-test { - position:relative; - background:#f6f6f6; - border:1px solid #eee; - padding:3px; -} - -#sm2-test, -#sm2-test ul.items { - border-radius:3px; -} - -#sm2-test ul.items { - position:relative; - background:#fff; - list-style-type:none; - margin:0px; - padding:0px; - border:1px solid #ccc; -} - -#sm2-test ul.items li { - position:relative; - margin-left:0.5em; - padding-left:0.5em; - margin-right:0.5em; - padding-right:0.5em; -} - -#sm2-test ul.items li h3 { - padding-top:0.3em; - margin-top:0px; - border-bottom:1px solid #ccc; - border-top: none; -} - -#sm2-test ul.items li:last-child h3 { - border-bottom:none; -} - -#sm2-test ul.items li div.details { - border-bottom:1px solid #ccc; -} - -#sm2-test ul.items li:hover div.details { - border-bottom:1px solid #ccc; -} - -#sm2-test ul.items li.open:last-child h3, -#sm2-test ul.items li.fail:last-child h3, -#sm2-test ul.items li:last-child div.details:last-child { - border-bottom:1px solid #fff; -} - -#sm2-test ul.items li div.details { - display:none; -} - -#sm2-test ul.items li.open div.details, -#sm2-test ul.items li.unknown div.details, -#sm2-test ul.items li.fail div.details { - display:block; -} - -#sm2-test ul.items li span.yay, -#sm2-test ul.items li span.boo, -#sm2-test ul.items li span.default, -#sm2-test ul.items li span.unknown { - display:none; -} - -#sm2-test ul.items li span.yay, -#sm2-test ul.items li.pass span.msg { - color:green; -} - -#sm2-test ul.items li span.boo, -#sm2-test ul.items li.fail span.msg { - color:red; -} - -#sm2-test ul.items li span.default, -#sm2-test ul.items li.default span.msg { - color:#ccc; -} - -#sm2-test ul.items li span.unknown, -#sm2-test ul.items li.unknown span.msg { - color:#666; -} - -#sm2-test ul.items li.default span.msg { - display:none; /* hide messages in the event a reset occurs */ -} - -#sm2-test ul.items li.pass span.yay, -#sm2-test ul.items li.fail span.boo, -#sm2-test ul.items li.default span.default, -#sm2-test ul.items li.unknown span.unknown { - float:right; - display:inline; -} - -#sm2-container.flash_debug { - /* flash movie, when soundManager.debugFlash = true */ - position:relative; - width:auto; - height:300px; - width:100%; - background:#f6f6f6; - border:1px solid #ccc; -} - -#sm2-container.flash_debug object, -#sm2-container.flash_debug embed { - border:1px solid #fff; -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js deleted file mode 100755 index 8b0f851a..00000000 --- a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/debug.js +++ /dev/null @@ -1,187 +0,0 @@ -// SoundManager 2 start-up troubleshooting tool - -// FlashDetect, by Carl Yestrau -// http://www.featureblend.com/license.txt -var FlashDetect=new function(){var self=this;self.installed=false;self.raw="";self.major=-1;self.minor=-1;self.revision=-1;self.revisionStr="";var activeXDetectRules=[{"name":"ShockwaveFlash.ShockwaveFlash.7","version":function(obj){return getActiveXVersion(obj);}},{"name":"ShockwaveFlash.ShockwaveFlash.6","version":function(obj){var version="6,0,21";try{obj.AllowScriptAccess="always";version=getActiveXVersion(obj);}catch(err){} -return version;}},{"name":"ShockwaveFlash.ShockwaveFlash","version":function(obj){return getActiveXVersion(obj);}}];var getActiveXVersion=function(activeXObj){var version=-1;try{version=activeXObj.GetVariable("$version");}catch(err){} -return version;};var getActiveXObject=function(name){var obj=-1;try{obj=new ActiveXObject(name);}catch(err){} -return obj;};var parseActiveXVersion=function(str){var versionArray=str.split(",");return{"raw":str,"major":parseInt(versionArray[0].split(" ")[1],10),"minor":parseInt(versionArray[1],10),"revision":parseInt(versionArray[2],10),"revisionStr":versionArray[2]};};var parseStandardVersion=function(str){var descParts=str.split(/ +/);var majorMinor=descParts[2].split(/\./);var revisionStr=descParts[3];return{"raw":str,"major":parseInt(majorMinor[0],10),"minor":parseInt(majorMinor[1],10),"revisionStr":revisionStr,"revision":parseRevisionStrToInt(revisionStr)};};var parseRevisionStrToInt=function(str){return parseInt(str.replace(/[a-zA-Z]/g,""),10)||self.revision;};self.majorAtLeast=function(version){return self.major>=version;};self.FlashDetect=function(){if(navigator.plugins&&navigator.plugins.length>0){var type='application/x-shockwave-flash';var mimeTypes=navigator.mimeTypes;if(mimeTypes&&mimeTypes[type]&&mimeTypes[type].enabledPlugin&&mimeTypes[type].enabledPlugin.description){var version=mimeTypes[type].enabledPlugin.description;var versionObj=parseStandardVersion(version);self.raw=versionObj.raw;self.major=versionObj.major;self.minor=versionObj.minor;self.revisionStr=versionObj.revisionStr;self.revision=versionObj.revision;self.installed=true;}}else if(navigator.appVersion.indexOf("Mac")==-1&&window.execScript){var version=-1;for(var i=0;i'+soundManager.url+''; - if (soundManager.getMoviePercent() == 100) { - // SWF may have already loaded - fOnComplete(true,msg); - } else { - try { - xhr.open("HEAD",sURL,true); - xhr.onreadystatechange = function() { - if (xhr.readyState == 4) { - if (xhr.status == '200') { - fOnComplete(true,msg); - } else if (xhr.status == '404') { - fOnComplete(false,msg); - } else { - // some other response - fOnComplete('unknown',(xhr.status != '0'?'HTTP response: '+xhr.status+', ':'')+msg); // safari returns 0 when offline - } - } - } - xhr.send(null); - - } catch(e) { - // fail (cross-domain, or no XHR) unless offline - fOnComplete('unknown',msg); - return false; - } - } - } - - this.handleEvent = function(sEventType,bSuccess,sMessage) { - var o = elements[sEventType]; - if (o) { - o.className = (bSuccess == true?'pass':(bSuccess != false?bSuccess:'fail')); // true = pass, className as argument, or false == fail - if (sMessage) { - var oSpan = o.getElementsByTagName('span')[4]; - if (oSpan) { - oSpan.innerHTML = (oSpan.innerHTML +' '+sMessage+''); - } else { - o.title = sMessage; - } - } - // associated events - if (sEventType == 'onload') { - if (bSuccess) { - self.doSoundTest(); - } else { - self.testURL(soundManager.url,function(bSuccess,sMessage) { - if (typeof sMessage == 'undefined') { - sMessage = null; - } - self.handleEvent('swf',bSuccess,sMessage); - }); - } - } else if (sEventType == 'swf') { - if (bSuccess == false) { - // don't show flashtojs at all if SWF failed to load - self.handleEvent('flashtojs','default'); // reset to N/A status - } - } else if (sEventType == 'flashtojs') { - if (bSuccess != true) { - // online or offline help messages - if (soundManager._overHTTP) { - document.getElementById('d-flashtojs-offline').style.display = 'none'; - } else { - document.getElementById('d-flashtojs-online').style.display = 'none'; - } - } - } - } else { - soundManager._writeDebug('SM2 debugger warning: Undefined event type "'+sEventType+'"',1); - } - } - - this.doSoundTest = function() { - var foo = soundManager.createSound({ - id: 'sm2TestSound', - url: ('http://www.schillmania.com/projects/soundmanager2/demo/_mp3/mouseover.mp3') - }); - if (!soundManager._disabled) { - foo.play(); - // looks to be OK.. - if (!soundManager._disabled) { - // still OK.. - self.handleEvent('soundtest',true); - } else { - self.handleEvent('soundtest',false,': Failed after play()'); - } - } else { - self.handleEvent('soundtest',false,': Failed after createSound()'); - } - } - - this.init = function() { - // map event elements to DOM nodes - eg. elements.flashtojs = document.getElementById('d-flashtojs'); - for (var i=elementIDs.length; i--;) { - elements[elementIDs[i]] = document.getElementById('d-'+elementIDs[i]); - } - self.doFlashTest(); - } - - this.doFlashTest = function() { - var fd = FlashDetect; - var hasFlash = fd.installed; - var fv = soundManager.setupOptions.flashVersion; - var isSupported = (hasFlash && fd.major >= fv); - var flashVersion = fd.major+'.'+fd.minor+'.'+fd.revisionStr; - var flashInfo = ' version '+(!isSupported?'unsupported ('+flashVersion+', SWF version '+fv+')':flashVersion); - document.getElementById('d-flashversion').innerHTML = 'soundManager.flashVersion = '+fv+';'; - if (hasFlash) { - self.handleEvent('hasflash',isSupported,hasFlash?flashInfo:null); - } else { - self.handleEvent('hasflash','default',hasFlash?flashInfo:null); - } - } - - soundManager.setup({ - debugFlash: true // try to get flash debug output, as well - }); - - this.init(); - -} - -function sm2DebugInit() { - sm2Debugger = new SM2Debugger(); -} \ No newline at end of file diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-add-location.png deleted file mode 100755 index 78e827102aed043c6f33f11820128fbf898e6017..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21317 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 AtN;K2 diff --git a/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png b/app/assets/javascripts/librariesForAllPages/soundmanagerv297a-20131201/troubleshoot/fpgss-added-location.png deleted file mode 100755 index df005d4c15d25fc083093e04940bc2820da900ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20131 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 z zN@L~Qs-yOhVJd`_#+Ub1kHL^ymb>i3wE$ffcf$0LT9%ItDe?7u2Diku03r2yX^&ys z)$$<~^=47AHte5^el_QH+j-j;-YPY1w;DB_QNh(uP}NNfom2rXq%vKKGPza6?q$>q z^|rghh5pt^SuX+zDJ{Fkt@=~FSyZfz`RANp?a=GyZ(vqUH+({@v16etiT8|5&UY^n zQq{J*!i6M%O0*SbgFaXfr4OkyUo{`D9?qx!% z)OJ_+`+xD+rBN%~2fw5e%D0ApF8bA+*UjI+teUQK!i5&Ps(8=ITcmoIhbIz}J=ymfElU36-Pv~3dJibd_Cg-|$YTB!|-4(9jQ?J|`F_-`o=M?~y zXgoHA6uW!h?bI<1fKUttKyge@NZr%|0&q!~e!>V04Y?C>fTRE<1xQL#fTRFPNeYk@ zfTRFPNecK^QjY*s)%&CXMvxRBDd1a@0vMvZ?@8?d!>pu|Yyk5lxso~n20H - - -SoundManager 2 Start-up Test / Troubleshooting Tool - - - - - - - - - - - - - - - - - - - - - - - -
    - -

    Flash options: Flash 8 (default), Flash 9 (normal) or Flash 9 + highPerformance + fastPolling modes.

    - -
    -
      - -
    • -

      OKFAILN/AUnknownSoundManager 2 start-up

      -
      -

      soundManager onready() or ontimeout() events are ultimately called when start-up completes.

      -

      If you're seeing a failure, refer to the below for troubleshooting details for common causes.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash

      -
      -

      Flash 8 or 9 may be required for SoundManager 2 to start, depending on HTML5 support. You are currently using [unknown].

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash SWF

      -
      -

      SoundManager 2 must load a flash movie before initialisation can proceed. If you have errors here, check that soundManager.url is correctly defined and that the URL being loaded is correct.

      -

      If the Flash movie URL is OK, Flash security or flash blockers are the likely cause. Check the section below.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownFlash -> JS

      -
      -

      Once the flash component of SM2 has loaded, it tries to make a call to Javascript-land. This is a common point of failure, for security reasons:

      -
        -
      • -

        Have a flash blocker? Check that the SM2 flash movie (below) is loading and is not being blocked.

        -
      • -
      • - Is your browser URL at file:// or c:/path/ or otherwise not using HTTP? Flash security "whitelisting" is required to allow Flash + JS to work when offline, placing it in the "LocalTrusted" Flash security sandbox rather than "localWithFile". - -
        -

        Offline viewing: Adding a "trusted location" to the Flash Security Settings Panel

        -

        The Flash Player Global Security Settings Panel is a web-based control panel which allows you to configure Flash security. You will need to add the path of the SoundManager 2 project in order for it to work "offline" (ie., when viewing via file:// or c:/)

        -

        Show me how: Adding a "trusted location"

        - -

        Launch the Flash Security Settings Panel

        -
        - -
      • -
      • Flash blockers (FlashBlock, "click to flash" etc.) preventing flash load and start-up - need whitelisting/"allow this domain" to work smoothly. If you suspect blocking is the issue, try the SoundManager 2 Flashblock demo.
      • -
      • Online viewing (HTTP/S): Same-domain security rules apply to HTML + Flash content by default (crossdomain.xml/allowDomain() in .AS source required to override.)
      • -
      -

      See Flash debug output for more security error details.

      - -
      -

      Online viewing: Cross-domain security restrictions

      -

      HTML page on domain A loading .SWF from domain B: Flash security prevents JS + Flash when a cross-domain XML permission file is not available on domain B, and/or flash movie was not compiled with allowDomain('domainA') or allowDomain('*') - note that the SWF distributed with SM2 does not use this by default; try using the cross-domain version of the SWF, or compile your own which whitelists your own domain(s).

      - -

      Flash Blockers

      -

      Browser extensions/add-ons like "FlashBlock" and "click to flash" can prevent the .SWF from loading, and this will mean SM2 will time-out and fail waiting for a response from Flash. For development, it's best to whitelist the domain(s) or the .SWF for SM2 to allow it to work.

      -

      Have a flash blocker installed? Want to test it? Try the SoundManager 2 Flashblock demo.

      - -
      - -
      -
    • - -
    • -

      OKErrorN/AUnknownJS -> Flash

      -
      -

      At this point, Javascript attempts to respond to Flash's initial outgoing Flash -> JS call, completing the test for JS/flash communication. If SM2 does not receive a response from flash, it will eventually fail.

      -

      Offline viewing conditions and cross-domain security rules will prevent Flash <-> JS communication. See the details of Flash -> JS for information.

      -

      Special Firefox Note: Some versions of Firefox (9.0 and newer?) may break JS/Flash in the file:// or offline case even when the path has been whitelisted in the Flash player security settings panel. IE, Chrome, Safari and Opera do not have this issue.

      -
      -
    • - -
    • -

      OKErrorN/AUnknownSound test

      -
      -

      Here, a simple createSound() call is made to test SM2's actual operation. A sound should load and play provided SM2 was able to start successfully.

      -
      -
    • - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - - - -
    - - diff --git a/app/assets/javascripts/metamaps/JIT.js b/app/assets/javascripts/src/JIT.js similarity index 100% rename from app/assets/javascripts/metamaps/JIT.js rename to app/assets/javascripts/src/JIT.js diff --git a/app/assets/javascripts/metamaps/Metamaps.Backbone.js b/app/assets/javascripts/src/Metamaps.Backbone.js similarity index 100% rename from app/assets/javascripts/metamaps/Metamaps.Backbone.js rename to app/assets/javascripts/src/Metamaps.Backbone.js diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/src/Metamaps.GlobalUI.js similarity index 100% rename from app/assets/javascripts/metamaps/Metamaps.GlobalUI.js rename to app/assets/javascripts/src/Metamaps.GlobalUI.js diff --git a/app/assets/javascripts/metamaps/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js similarity index 100% rename from app/assets/javascripts/metamaps/Metamaps.JIT.js rename to app/assets/javascripts/src/Metamaps.JIT.js diff --git a/app/assets/javascripts/metamaps/Metamaps.Router.js b/app/assets/javascripts/src/Metamaps.Router.js similarity index 100% rename from app/assets/javascripts/metamaps/Metamaps.Router.js rename to app/assets/javascripts/src/Metamaps.Router.js diff --git a/app/assets/javascripts/metamaps/Metamaps.Views.js b/app/assets/javascripts/src/Metamaps.Views.js similarity index 100% rename from app/assets/javascripts/metamaps/Metamaps.Views.js rename to app/assets/javascripts/src/Metamaps.Views.js diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/src/Metamaps.js similarity index 94% rename from app/assets/javascripts/metamaps/Metamaps.js rename to app/assets/javascripts/src/Metamaps.js index c907b531..fcbedaf3 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -672,7 +672,6 @@ Metamaps.TopicCard = { // get mapper image var setMapperImage = function (mapper) { - console.log(mapper); $('.contributorIcon').attr('src', mapper.get('image')); }; Metamaps.Mapper.get(topic.get('user_id'), setMapperImage) @@ -767,36 +766,26 @@ Metamaps.TopicCard = { selectingMetacode = true; $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow $('.metacodeSelect').show(); - // add the scroll bar to the list of metacode select options if it isn't already there - if (!$('.metacodeSelect ul').hasClass('mCustomScrollbar')) { - $('.metacodeSelect ul').mCustomScrollbar({ - mouseWheelPixels: 200, - advanced: { - updateOnContentResize: true - } + $('.metacodeSelect li').click(function () { + selectingMetacode = false; + var metacodeName = $(this).find('.mSelectName').text(); + var metacode = Metamaps.Metacodes.findWhere({ + name: metacodeName }); - - $('.metacodeSelect li').click(function () { - selectingMetacode = false; - var metacodeName = $(this).find('.mSelectName').text(); - var metacode = Metamaps.Metacodes.findWhere({ - name: metacodeName - }); - $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) - .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); - $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); - topic.save({ - metacode_id: metacode.id - }); - Metamaps.Visualize.mGraph.plot(); - $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - setTimeout(function () { - $('.metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - }, 500); + $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) + .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); + $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); + topic.save({ + metacode_id: metacode.id }); - } + Metamaps.Visualize.mGraph.plot(); + $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.metacodeSelect').hide(); + setTimeout(function () { + $('.metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + }, 500); + }); } else { selectingMetacode = false; $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow @@ -837,23 +826,38 @@ Metamaps.TopicCard = { }); } - // when you're typing a description, resize the scroll box to have space - $('.best_in_place_desc textarea').bind('keyup', function () { - var s = $('.showcard').find('.scroll'); - s.height(s.height()).mCustomScrollbar('update'); - }); + if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { + var bipName = $(showCard).find('.best_in_place_name'); + bipName.best_in_place(); + bipName.bind("best_in_place:activate", function () { + var $el = bipName.find('textarea'); + var el = $el[0]; - //bind best_in_place ajax callbacks - $(showCard).find('.best_in_place_name').bind("ajax:success", function () { - var name = Metamaps.Util.decodeEntities($(this).html()); - topic.set("name", name); - }); + $el.attr('maxlength', '140'); - $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { - this.innerHTML = this.innerHTML.replace(/\r/g, '') - var desc = $(this).html(); - topic.set("desc", desc); - }); + $('.showcard .title').append('
    '); + + var callback = function (data) { + $('.titleCounter').html(data.all + '/140'); + }; + Countable.live(el, callback); + }); + bipName.bind("best_in_place:deactivate", function () { + $('.titleCounter').remove(); + }); + + //bind best_in_place ajax callbacks + bipName.bind("ajax:success", function () { + var name = Metamaps.Util.decodeEntities($(this).html()); + topic.set("name", name); + }); + + $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { + this.innerHTML = this.innerHTML.replace(/\r/g, '') + var desc = $(this).html(); + topic.set("desc", desc); + }); + } }, populateShowCard: function (topic) { var self = Metamaps.TopicCard; @@ -2311,7 +2315,7 @@ Metamaps.Filter = { $('#filter_by_' + listToModify + ' li[data-id="' + identifier + '"]').fadeOut('fast',function(){ $(this).remove(); }); - index = self.visible[filtersToUser].indexOf(identifier); + index = self.visible[filtersToUse].indexOf(identifier); self.visible[filtersToUse].splice(index, 1); }); @@ -3304,3 +3308,57 @@ Metamaps.Mapper = { }); } }; // end Metamaps.Mapper + + +/* + * + * ADMIN + * + */ + +Metamaps.Admin = { + selectMetacodes: [], + allMetacodes: [], + init: function () { + var self = Metamaps.Admin; + + $('#metacodes_value').val(self.selectMetacodes.toString()); + }, + selectAll: function () { + var self = Metamaps.Admin; + + $('.editMetacodes li').removeClass('toggledOff'); + self.selectMetacodes = self.allMetacodes.slice(0); + $('#metacodes_value').val(self.selectMetacodes.toString()); + }, + deselectAll: function () { + var self = Metamaps.Admin; + + $('.editMetacodes li').addClass('toggledOff'); + self.selectMetacodes = []; + $('#metacodes_value').val(0); + }, + liClickHandler: function () { + var self = Metamaps.Admin; + + if ($(this).attr('class') != 'toggledOff') { + $(this).addClass('toggledOff'); + var value_to_remove = $(this).attr('id'); + self.selectMetacodes.splice(self.selectMetacodes.indexOf(value_to_remove), 1); + $('#metacodes_value').val(self.selectMetacodes.toString()); + } + else if ($(this).attr('class') == 'toggledOff') { + $(this).removeClass('toggledOff'); + self.selectMetacodes.push($(this).attr('id')); + $('#metacodes_value').val(self.selectMetacodes.toString()); + } + }, + validate: function () { + var self = Metamaps.Admin; + + if (self.selectMetacodes.length == 0) { + alert('Would you pretty please select at least one metacode for the set?'); + return false; + } + } +}; diff --git a/app/assets/javascripts/metamaps/codeleft.js b/app/assets/javascripts/src/codeleft.js similarity index 100% rename from app/assets/javascripts/metamaps/codeleft.js rename to app/assets/javascripts/src/codeleft.js diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 56ca99b9..aba37d09 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1752,17 +1752,16 @@ float: left; color: #00bcd4; } #upYourSkillz { - margin: 0 70px; + margin: 0 68px; } /* Admin Pages */ -#wrapper > div.blackBox { - width: 700px; +.blackBox { + width: 760px; margin: 0 auto; - padding: 20px 0 20px 20px; + padding: 20px 0 60px 20px; background: rgba(0, 0, 0, 0.4); color: white; - height: 100%; overflow: hidden; position: relative; } diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 60621130..eccc8365 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -50,16 +50,23 @@ font-size: 18px; line-height: 22px; display: table; - padding: 8px 16px; + padding: 8px 0 16px; height: 80px; text-align: center; font-family: 'din-regular', sans-serif; - width: 268px; + width: 300px; + position: relative; } .CardOnGraph .titleWrapper { display: table-cell; vertical-align: middle; + padding: 0 16px; +} +.canEdit #titleActivator:hover { + background-image: url(edit.png); + background-repeat: no-repeat; + background-position: bottom right; } .best_in_place_name textarea, .best_in_place_name input { @@ -67,19 +74,29 @@ color: #424242; font-size: 18px; line-height: 22px; -height: 15px; -padding: 5px 0; -width: 100%; -margin: 0; -border: 0; -outline: none; -background: none; -text-align:center; + height: 15px; + padding: 5px 0; + width: 100%; + margin: 0; + border: 0; + outline: none; + background: none; + text-align:center; + resize: none; +} +.titleCounter { + position: absolute; + bottom: 1px; + right: 2px; + font-size: 11px; + font-family: helvetica; + color: #727272; + line-height: 11px; } .CardOnGraph .scroll { display:block; - padding: 8px 16px; + padding: 8px 0 8px 16px; height: 152px; font-size: 12px; line-height:15px; @@ -109,15 +126,16 @@ background: none; margin-top:5px; } -.CardOnGraph .best_in_place_desc input { - float: right; - margin: 2px 0px 0px 2px; - padding: 1px 5px; -} - .CardOnGraph .best_in_place_desc { display:block; margin-top:2px; + padding-right: 18px; + margin-right: 8px; +} +.canEdit .CardOnGraph .best_in_place_desc:hover { + background-image: url(edit.png); + background-position: top right; + background-repeat: no-repeat; } #edit_synapse .best_in_place_desc { @@ -155,7 +173,7 @@ background: none; .linkItem.contributor { margin-left:32px; z-index:1; - padding:17px 16px 17px 40px; + padding:17px 16px 17px 32px; position: relative; } .contributor .contributorIcon { @@ -164,6 +182,9 @@ background: none; left: 0; border-radius: 16px; } +.contributorName { + display:none; +} .linkItem.mapCount { width: 24px; padding:17px 0 17px 35px; diff --git a/app/assets/stylesheets/gh-fork-ribbon.css b/app/assets/stylesheets/gh-fork-ribbon.css new file mode 100644 index 00000000..1f1bf802 --- /dev/null +++ b/app/assets/stylesheets/gh-fork-ribbon.css @@ -0,0 +1,140 @@ +/*! + * "Fork me on GitHub" CSS ribbon v0.1.1 | MIT License + * https://github.com/simonwhitaker/github-fork-ribbon-css +*/ + +/* Left will inherit from right (so we don't need to duplicate code) */ +.github-fork-ribbon { + /* The right and left classes determine the side we attach our banner to */ + position: absolute; + + /* Add a bit of padding to give some substance outside the "stitching" */ + padding: 2px 0; + + /* Set the base colour */ + background-color: #9150bc; + + /* Set a gradient: transparent black at the top to almost-transparent black at the bottom */ + background-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0, 0, 0, 0)), to(rgba(0, 0, 0, 0.15))); + background-image: -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); + background-image: -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); + background-image: -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); + background-image: -o-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); + background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.15)); + + /* Add a drop shadow */ + -webkit-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); + -moz-box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); + box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.5); + + /* Set the font */ + font: 700 13px "Helvetica Neue", Helvetica, Arial, sans-serif; + + z-index: 9999; + pointer-events: auto; +} + +.github-fork-ribbon a, +.github-fork-ribbon a:hover { + /* Set the text properties */ + color: #fff; + text-decoration: none; + text-shadow: 0 -1px rgba(0, 0, 0, 0.5); + text-align: center; + + /* Set the geometry. If you fiddle with these you'll also need + to tweak the top and right values in .github-fork-ribbon. */ + width: 200px; + line-height: 20px; + + /* Set the layout properties */ + display: inline-block; + padding: 2px 0; + + /* Add "stitching" effect */ + border-width: 1px 0; + border-style: dotted; + border-color: #fff; + border-color: rgba(255, 255, 255, 0.7); +} + +.github-fork-ribbon-wrapper { + width: 150px; + height: 150px; + position: absolute; + overflow: hidden; + top: 0; + z-index: 9999; + pointer-events: none; +} + +.github-fork-ribbon-wrapper.fixed { + position: fixed; +} + +.github-fork-ribbon-wrapper.left { + left: 0; +} + +.github-fork-ribbon-wrapper.right { + right: 0; +} + +.github-fork-ribbon-wrapper.left-bottom { + position: fixed; + top: inherit; + bottom: 0; + left: 0; +} + +.github-fork-ribbon-wrapper.right-bottom { + position: fixed; + top: inherit; + bottom: 0; + right: 0; +} + +.github-fork-ribbon-wrapper.right .github-fork-ribbon { + top: 42px; + right: -43px; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} + +.github-fork-ribbon-wrapper.left .github-fork-ribbon { + top: 42px; + left: -43px; + + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); +} + + +.github-fork-ribbon-wrapper.left-bottom .github-fork-ribbon { + top: 80px; + left: -43px; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); +} + +.github-fork-ribbon-wrapper.right-bottom .github-fork-ribbon { + top: 80px; + right: -43px; + + -webkit-transform: rotate(-45deg); + -moz-transform: rotate(-45deg); + -ms-transform: rotate(-45deg); + -o-transform: rotate(-45deg); + transform: rotate(-45deg); +} diff --git a/app/views/admin/_adminpanel.html.erb b/app/views/admin/_adminpanel.html.erb index 11f341e6..cbc9bb69 100644 --- a/app/views/admin/_adminpanel.html.erb +++ b/app/views/admin/_adminpanel.html.erb @@ -1,6 +1,6 @@ -<%= link_to 'Metacode Sets', metacode_sets_path, { :class => 'button' }%> -<%= link_to 'New Set', new_metacode_set_path, { :class => 'button' }%> -<%= link_to 'Metacodes', metacodes_path, { :class => 'button' }%> -<%= link_to 'New Metacode', new_metacode_path, { :class => 'button' }%> +<%= link_to 'Metacode Sets', metacode_sets_path, { :class => 'button', 'data-bypass' => 'true' }%> +<%= link_to 'New Set', new_metacode_set_path, { :class => 'button', 'data-bypass' => 'true' }%> +<%= link_to 'Metacodes', metacodes_path, { :class => 'button', 'data-bypass' => 'true' }%> +<%= link_to 'New Metacode', new_metacode_path, { :class => 'button', 'data-bypass' => 'true' }%>

    diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index a0d531f6..28943e6a 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -77,9 +77,9 @@

    We welcome contributions in many forms. One of the easiest and best things you can do is to keep on mapping your ideas into the commons on the platform!

    -

    We welcome people of all skillsets to contribute to the project in different ways. Designers, researchers, academics, strategists, and facilitators can get in touch about opportunities to contribute to the project. If you're a developer, help us advance the code and take a look around our Github.

    +

    We welcome people of all skillsets to contribute to the project in different ways. Designers, researchers, academics, strategists, and facilitators can get in touch about opportunities to contribute to the project. If you're a developer, help us advance the code and take a look around our Github.

    -

    Financial contributions are greatly appreciated in support of our work. All financial contributions are transparently governed and recorded in our value account system.

    +

    Financial contributions are greatly appreciated in support of our work. All financial contributions are transparently governed and recorded in our value accounting system.

    @@ -98,8 +98,8 @@

    SHARE INVITE

    -

    The Metamaps platform is currently in an invite-only beta with the express purpose of creating a high value knowledge ecosystem, as well as buidling a community of contributers. As a valued beta tester, you have the ability to invite your peer, colleagues and collaborators onto the platform.

    -

    Copy and send the link + access code below, or enter an email to send an invite. The access code below is your personal code and can be used multiple times.

    +

    The Metamaps platform is currently in an invite-only beta with the express purpose of creating a high value knowledge ecosystem, as well as building a community of contributors. As a valued beta tester, you have the ability to invite your peers, colleagues and collaborators onto the platform.

    +

    Copy and send the link + access code below. The access code below is your personal code and can be used multiple times.

    HTTP://METAMAPS.CC/JOIN

    <% mapper = current_user %> diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 9f1e40ea..e48dc57b 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -180,11 +180,12 @@ diff --git a/app/views/metacode_sets/index.html.erb b/app/views/metacode_sets/index.html.erb index 4222c091..7a93d97f 100644 --- a/app/views/metacode_sets/index.html.erb +++ b/app/views/metacode_sets/index.html.erb @@ -1,40 +1,37 @@ -
    -<%= render :partial => 'admin/adminpanel' %> -
    - - - - - - +
    +
    + <%= render :partial => 'admin/adminpanel' %> +
    +
    NameDescriptionMetacodes
    + + + + + -<% @metacode_sets.each do |metacode_set| %> - - - - + + + - -<% end %> -
    NameDescriptionMetacodes
    - <%= metacode_set.name %>
    - <%= link_to 'Edit', edit_metacode_set_path(metacode_set) %>
    - <%= link_to 'Delete', metacode_set, method: :delete, data: { confirm: 'Are you sure?' } %> -
    <%= metacode_set.desc %> - <% metacode_set.metacodes.each_with_index do |metacode, index| %> - - <% if (index+1)%4 == 0 %> -
    + <% @metacode_sets.each do |metacode_set| %> +
    + <%= metacode_set.name %>
    + <%= link_to 'Edit', + edit_metacode_set_path(metacode_set), :data => { :bypass => 'true'} %> +
    + <%= link_to 'Delete', + metacode_set, method: :delete, + data: { confirm: 'Are you sure?', bypass: 'true' } %> +
    <%= metacode_set.desc %> + <% metacode_set.metacodes.each_with_index do |metacode, index| %> + + <% if (index+1)%4 == 0 %> +
    + <% end %> <% end %> - <% end %> -
    -
    -
    - - \ No newline at end of file +
    + + + <% end %> + +
    +
    -
    - -
    - -
      - -
    • -
      -

      soundmanager2.js

      -
      -
    • - - - -
    • -
      - -
      - -
      - -
      - -
      /** @license
      - *
      - * SoundManager 2: JavaScript Sound for the Web
      - * ----------------------------------------------
      - * http://schillmania.com/projects/soundmanager2/
      - *
      - * Copyright (c) 2007, Scott Schiller. All rights reserved.
      - * Code provided under the BSD License:
      - * http://schillmania.com/projects/soundmanager2/license.txt
      - *
      - * V2.97a.20131201
      - */
      -
      -/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */
      -/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */
      -
      -/**
      - * About this file
      - * -------------------------------------------------------------------------------------
      - * This is the fully-commented source version of the SoundManager 2 API,
      - * recommended for use during development and testing.
      - *
      - * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)
      - * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion
      - * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)
      - *
      - * You may notice <d> and </d> comments in this source; these are delimiters for
      - * debug blocks which are removed in the -nodebug builds, further optimizing code size.
      - *
      - * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)
      - */
      -
      -(function(window, _undefined) {
      -
      -"use strict";
      -
      -var soundManager = null;
      -
      -/**
      - * The SoundManager constructor.
      - *
      - * @constructor
      - * @param {string} smURL Optional: Path to SWF files
      - * @param {string} smID Optional: The ID to use for the SWF container element
      - * @this {SoundManager}
      - * @return {SoundManager} The new SoundManager instance
      - */
      -
      -function SoundManager(smURL, smID) {
      -
      -  /**
      -   * soundManager configuration options list
      -   * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)
      -   * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})
      -   */
      -
      -  this.setupOptions = {
      -
      -    'url': (smURL || null),             // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/
      -    'flashVersion': 8,                  // flash build to use (8 or 9.) Some API features require 9.
      -    'debugMode': true,                  // enable debugging output (console.log() with HTML fallback)
      -    'debugFlash': false,                // enable debugging output inside SWF, troubleshoot Flash/browser issues
      -    'useConsole': true,                 // use console.log() if available (otherwise, writes to #soundmanager-debug element)
      -    'consoleOnly': true,                // if console is being used, do not create/write to #soundmanager-debug
      -    'waitForWindowLoad': false,         // force SM2 to wait for window.onload() before trying to call soundManager.onload()
      -    'bgColor': '#ffffff',               // SWF background color. N/A when wmode = 'transparent'
      -    'useHighPerformance': false,        // position:fixed flash movie can help increase js/flash speed, minimize lag
      -    'flashPollingInterval': null,       // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.
      -    'html5PollingInterval': null,       // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.
      -    'flashLoadTimeout': 1000,           // msec to wait for flash movie to load before failing (0 = infinity)
      -    'wmode': null,                      // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)
      -    'allowScriptAccess': 'always',      // for scripting the SWF (object/embed property), 'always' or 'sameDomain'
      -    'useFlashBlock': false,             // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.
      -    'useHTML5Audio': true,              // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible.
      -    'html5Test': /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.
      -    'preferFlash': false,               // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.
      -    'noSWFCache': false,                // if true, appends ?ts={date} to break aggressive SWF caching.
      -    'idPrefix': 'sound'                 // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.
      -
      -  };
      -
      -  this.defaultOptions = {
      -
      -    /**
      -     * the default configuration for sound objects made with createSound() and related methods
      -     * eg., volume, auto-load behaviour and so forth
      -     */
      -
      -    'autoLoad': false,        // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)
      -    'autoPlay': false,        // enable playing of file as soon as possible (much faster if "stream" is true)
      -    'from': null,             // position to start playback within a sound (msec), default = beginning
      -    'loops': 1,               // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)
      -    'onid3': null,            // callback function for "ID3 data is added/available"
      -    'onload': null,           // callback function for "load finished"
      -    'whileloading': null,     // callback function for "download progress update" (X of Y bytes received)
      -    'onplay': null,           // callback for "play" start
      -    'onpause': null,          // callback for "pause"
      -    'onresume': null,         // callback for "resume" (pause toggle)
      -    'whileplaying': null,     // callback during play (position update)
      -    'onposition': null,       // object containing times and function callbacks for positions of interest
      -    'onstop': null,           // callback for "user stop"
      -    'onfailure': null,        // callback function for when playing fails
      -    'onfinish': null,         // callback function for "sound finished playing"
      -    'multiShot': true,        // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
      -    'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled
      -    'position': null,         // offset (milliseconds) to seek to within loaded sound data.
      -    'pan': 0,                 // "pan" settings, left-to-right, -100 to 100
      -    'stream': true,           // allows playing before entire file has loaded (recommended)
      -    'to': null,               // position to end playback within a sound (msec), default = end
      -    'type': null,             // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3
      -    'usePolicyFile': false,   // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)
      -    'volume': 100             // self-explanatory. 0-100, the latter being the max.
      -
      -  };
      -
      -  this.flash9Options = {
      -
      -    /**
      -     * flash 9-only options,
      -     * merged into defaultOptions if flash 9 is being used
      -     */
      -
      -    'isMovieStar': null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
      -    'usePeakData': false,     // enable left/right channel peak (level) data
      -    'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.
      -    'useEQData': false,       // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.
      -    'onbufferchange': null,   // callback for "isBuffering" property change
      -    'ondataerror': null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
      -
      -  };
      -
      -  this.movieStarOptions = {
      -
      -    /**
      -     * flash 9.0r115+ MPEG4 audio options,
      -     * merged into defaultOptions if flash 9+movieStar mode is enabled
      -     */
      -
      -    'bufferTime': 3,          // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)
      -    'serverURL': null,        // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants
      -    'onconnect': null,        // rtmp: callback for connection to flash media server
      -    'duration': null          // rtmp: song duration (msec)
      -
      -  };
      -
      -  this.audioFormats = {
      -
      -    /**
      -     * determines HTML5 support + flash requirements.
      -     * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start.
      -     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)
      -     */
      -
      -    'mp3': {
      -      'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
      -      'required': true
      -    },
      -
      -    'mp4': {
      -      'related': ['aac','m4a','m4b'], // additional formats under the MP4 container
      -      'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
      -      'required': false
      -    },
      -
      -    'ogg': {
      -      'type': ['audio/ogg; codecs=vorbis'],
      -      'required': false
      -    },
      -
      -    'opus': {
      -      'type': ['audio/ogg; codecs=opus', 'audio/opus'],
      -      'required': false
      -    },
      -
      -    'wav': {
      -      'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
      -      'required': false
      -    }
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML attributes (id + class names) for the SWF container

      - -
      - -
      -  this.movieID = 'sm2-container';
      -  this.id = (smID || 'sm2movie');
      -
      -  this.debugID = 'soundmanager-debug';
      -  this.debugURLParam = /([#?&])debug=1/i;
      - -
    • - - -
    • -
      - -
      - -
      -

      dynamic attributes

      - -
      - -
      -  this.versionNumber = 'V2.97a.20131201';
      -  this.version = null;
      -  this.movieURL = null;
      -  this.altURL = null;
      -  this.swfLoaded = false;
      -  this.enabled = false;
      -  this.oMC = null;
      -  this.sounds = {};
      -  this.soundIDs = [];
      -  this.muted = false;
      -  this.didFlashBlock = false;
      -  this.filePattern = null;
      -
      -  this.filePatterns = {
      -
      -    'flash8': /\.mp3(\?.*)?$/i,
      -    'flash9': /\.mp3(\?.*)?$/i
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      support indicators, set at init

      - -
      - -
      -  this.features = {
      -
      -    'buffering': false,
      -    'peakData': false,
      -    'waveformData': false,
      -    'eqData': false,
      -    'movieStar': false
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      flash sandbox info, used primarily in troubleshooting

      - -
      - -
      -  this.sandbox = {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          'type': null,
      -    'types': {
      -      'remote': 'remote (domain-based) rules',
      -      'localWithFile': 'local with file access (no internet access)',
      -      'localWithNetwork': 'local with network (internet access only, no local access)',
      -      'localTrusted': 'local, trusted (local+internet access)'
      -    },
      -    'description': null,
      -    'noRemote': null,
      -    'noLocal': null
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  /**
      -   * format support (html5/flash)
      -   * stores canPlayType() results based on audioFormats.
      -   * eg. { mp3: boolean, mp4: boolean }
      -   * treat as read-only.
      -   */
      -
      -  this.html5 = {
      -    'usingFlash': null // set if/when flash fallback is needed
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      file type support hash

      - -
      - -
        this.flash = {};
      - -
    • - - -
    • -
      - -
      - -
      -

      determined at init time

      - -
      - -
        this.html5Only = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      used for special cases (eg. iPad/iPhone/palm OS?)

      - -
      - -
        this.ignoreFlash = false;
      -
      -  /**
      -   * a few private internals (OK, a lot. :D)
      -   */
      -
      -  var SMSound,
      -  sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],
      -  canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0,
      -  is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)),
      -  mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid),
      -  isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159
      -  hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000,
      -  emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)
      -  emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading
      -  overHTTP = (doc.location?doc.location.protocol.match(/http/i):null),
      -  http = (!overHTTP ? 'http:/'+'/' : ''),
      - -
    • - - -
    • -
      - -
      - -
      -

      mp3, mp4, aac etc.

      - -
      - -
        netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,
      - -
    • - - -
    • -
      - -
      - -
      -

      Flash v9.0r115+ "moviestar" formats

      - -
      - -
        netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],
      -  netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
      -
      -  this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set
      - -
    • - - -
    • -
      - -
      - -
      -

      use altURL if not "online"

      - -
      - -
        this.useAltURL = !overHTTP;
      -
      -  swfCSS = {
      -
      -    'swfBox': 'sm2-object-box',
      -    'swfDefault': 'movieContainer',
      -    'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error)
      -    'swfTimedout': 'swf_timedout',
      -    'swfLoaded': 'swf_loaded',
      -    'swfUnblocked': 'swf_unblocked', // or loaded OK
      -    'sm2Debug': 'sm2_debug',
      -    'highPerf': 'high_performance',
      -    'flashDebug': 'flash_debug'
      -
      -  };
      -
      -  /**
      -   * basic HTML5 Audio() support test
      -   * try...catch because of IE 9 "not implemented" nonsense
      -   * https://github.com/Modernizr/Modernizr/issues/224
      -   */
      -
      -  this.hasHTML5 = (function() {
      -    try {
      - -
    • - - -
    • -
      - -
      - -
      -

      new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.

      - -
      - -
            return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);
      -    } catch(e) {
      -      return false;
      -    }
      -  }());
      -
      -  /**
      -   * Public SoundManager API
      -   * -----------------------
      -   */
      -
      -  /**
      -   * Configures top-level soundManager properties.
      -   *
      -   * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }
      -   * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.
      -   */
      -
      -  this.setup = function(options) {
      -
      -    var noURL = (!sm2.url);
      - -
    • - - -
    • -
      - -
      - -
      -

      warn if flash options have already been applied

      - -
      - -
      -    if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {
      -      complain(str('setupLate'));
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: defer: true?

      - -
      - -
      -    assign(options);
      - -
    • - - -
    • -
      - -
      - -
      -

      special case 1: "Late setup". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.

      - -
      - -
      -    if (options) {
      -
      -      if (noURL && didDCLoaded && options.url !== _undefined) {
      -        sm2.beginDelayedInit();
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.

      - -
      - -
      -      if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {
      -        setTimeout(domContentLoaded, 1);
      -      }
      -
      -    }
      -
      -    return sm2;
      -
      -  };
      -
      -  this.ok = function() {
      -
      -    return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));
      -
      -  };
      -
      -  this.supported = this.ok; // legacy
      -
      -  this.getMovie = function(smID) {
      - -
    • - - -
    • -
      - -
      - -
      -

      safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version

      - -
      - -
          return id(smID) || doc[smID] || window[smID];
      -
      -  };
      -
      -  /**
      -   * Creates a SMSound sound object instance.
      -   *
      -   * @param {object} oOptions Sound options (at minimum, id and url parameters are required.)
      -   * @return {object} SMSound The new SMSound object.
      -   */
      -
      -  this.createSound = function(oOptions, _url) {
      -
      -    var cs, cs_string, options, oSound = null;
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          cs = sm + '.createSound(): ';
      -    cs_string = cs + str(!didInit?'notReady':'notOK');
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    if (!didInit || !sm2.ok()) {
      -      complain(cs_string);
      -      return false;
      -    }
      -
      -    if (_url !== _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      function overloading in JS! :) ..assume simple createSound(id, url) use case

      - -
      - -
            oOptions = {
      -        'id': oOptions,
      -        'url': _url
      -      };
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      inherit from defaultOptions

      - -
      - -
          options = mixin(oOptions);
      -
      -    options.url = parseURL(options.url);
      - -
    • - - -
    • -
      - -
      - -
      -

      generate an id, if needed.

      - -
      - -
          if (options.id === undefined) {
      -      options.id = sm2.setupOptions.idPrefix + (idCounter++);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          if (options.id.toString().charAt(0).match(/^[0-9]$/)) {
      -      sm2._wD(cs + str('badID', options.id), 2);
      -    }
      -
      -    sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    if (idCheck(options.id, true)) {
      -      sm2._wD(cs + options.id + ' exists', 1);
      -      return sm2.sounds[options.id];
      -    }
      -
      -    function make() {
      -
      -      options = loopFix(options);
      -      sm2.sounds[options.id] = new SMSound(options);
      -      sm2.soundIDs.push(options.id);
      -      return sm2.sounds[options.id];
      -
      -    }
      -
      -    if (html5OK(options)) {
      -
      -      oSound = make();
      -      sm2._wD(options.id + ': Using HTML5');
      -      oSound._setup_html5(options);
      -
      -    } else {
      -
      -      if (sm2.html5Only) {
      -        sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');
      -        return make();
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: Move HTML5/flash checks into generic URL parsing/handling function.

      - -
      - -
      -      if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      data: URIs not supported by Flash, either.

      - -
      - -
              sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');
      -        return make();
      -      }
      -
      -      if (fV > 8) {
      -        if (options.isMovieStar === null) {
      - -
    • - - -
    • -
      - -
      - -
      -

      attempt to detect MPEG-4 formats

      - -
      - -
                options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));
      -        }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
              if (options.isMovieStar) {
      -          sm2._wD(cs + 'using MovieStar handling');
      -          if (options.loops > 1) {
      -            _wDS('noNSLoop');
      -          }
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
            }
      -
      -      options = policyFix(options, cs);
      -      oSound = make();
      -
      -      if (fV === 8) {
      -        flash._createSound(options.id, options.loops||1, options.usePolicyFile);
      -      } else {
      -        flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);
      -        if (!options.serverURL) {
      - -
    • - - -
    • -
      - -
      - -
      -

      We are connected immediately

      - -
      - -
                oSound.connected = true;
      -          if (options.onconnect) {
      -            options.onconnect.apply(oSound);
      -          }
      -        }
      -      }
      -
      -      if (!options.serverURL && (options.autoLoad || options.autoPlay)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      call load for non-rtmp streams

      - -
      - -
              oSound.load(options);
      -      }
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      rtmp will play in onconnect

      - -
      - -
          if (!options.serverURL && options.autoPlay) {
      -      oSound.play();
      -    }
      -
      -    return oSound;
      -
      -  };
      -
      -  /**
      -   * Destroys a SMSound sound object instance.
      -   *
      -   * @param {string} sID The ID of the sound to destroy
      -   */
      -
      -  this.destroySound = function(sID, _bFromSound) {
      - -
    • - - -
    • -
      - -
      - -
      -

      explicitly destroy a sound before normal page unload, etc.

      - -
      - -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -
      -    var oS = sm2.sounds[sID], i;
      - -
    • - - -
    • -
      - -
      - -
      -

      Disable all callbacks while the sound is being destroyed

      - -
      - -
          oS._iO = {};
      -
      -    oS.stop();
      -    oS.unload();
      -
      -    for (i = 0; i < sm2.soundIDs.length; i++) {
      -      if (sm2.soundIDs[i] === sID) {
      -        sm2.soundIDs.splice(i, 1);
      -        break;
      -      }
      -    }
      -
      -    if (!_bFromSound) {
      - -
    • - - -
    • -
      - -
      - -
      -

      ignore if being called from SMSound instance

      - -
      - -
            oS.destruct(true);
      -    }
      -
      -    oS = null;
      -    delete sm2.sounds[sID];
      -
      -    return true;
      -
      -  };
      -
      -  /**
      -   * Calls the load() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {object} oOptions Optional: Sound options
      -   */
      -
      -  this.load = function(sID, oOptions) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].load(oOptions);
      -
      -  };
      -
      -  /**
      -   * Calls the unload() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   */
      -
      -  this.unload = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].unload();
      -
      -  };
      -
      -  /**
      -   * Calls the onPosition() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {number} nPosition The position to watch for
      -   * @param {function} oMethod The relevant callback to fire
      -   * @param {object} oScope Optional: The scope to apply the callback to
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.onPosition = function(sID, nPosition, oMethod, oScope) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy/backwards-compability: lower-case method name

      - -
      - -
        this.onposition = this.onPosition;
      -
      -  /**
      -   * Calls the clearOnPosition() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {number} nPosition The position to watch for
      -   * @param {function} oMethod Optional: The relevant callback to fire
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.clearOnPosition = function(sID, nPosition, oMethod) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);
      -
      -  };
      -
      -  /**
      -   * Calls the play() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {object} oOptions Optional: Sound options
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.play = function(sID, oOptions) {
      -
      -    var result = null,
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy function-overloading use case: play('mySound', '/path/to/some.mp3');

      - -
      - -
              overloaded = (oOptions && !(oOptions instanceof Object));
      -
      -    if (!didInit || !sm2.ok()) {
      -      complain(sm + '.play(): ' + str(!didInit?'notReady':'notOK'));
      -      return false;
      -    }
      -
      -    if (!idCheck(sID, overloaded)) {
      -
      -      if (!overloaded) {
      - -
    • - - -
    • -
      - -
      - -
      -

      no sound found for the given ID. Bail.

      - -
      - -
              return false;
      -      }
      -
      -      if (overloaded) {
      -        oOptions = {
      -          url: oOptions
      -        };
      -      }
      -
      -      if (oOptions && oOptions.url) {
      - -
    • - - -
    • -
      - -
      - -
      -

      overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});

      - -
      - -
              sm2._wD(sm + '.play(): Attempting to create "' + sID + '"', 1);
      -        oOptions.id = sID;
      -        result = sm2.createSound(oOptions).play();
      -      }
      -
      -    } else if (overloaded) {
      - -
    • - - -
    • -
      - -
      - -
      -

      existing sound object case

      - -
      - -
            oOptions = {
      -        url: oOptions
      -      };
      -
      -    }
      -
      -    if (result === null) {
      - -
    • - - -
    • -
      - -
      - -
      -

      default case

      - -
      - -
            result = sm2.sounds[sID].play(oOptions);
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  this.start = this.play; // just for convenience
      -
      -  /**
      -   * Calls the setPosition() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {number} nMsecOffset Position (milliseconds)
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.setPosition = function(sID, nMsecOffset) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].setPosition(nMsecOffset);
      -
      -  };
      -
      -  /**
      -   * Calls the stop() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.stop = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -
      -    sm2._wD(sm + '.stop(' + sID + ')', 1);
      -    return sm2.sounds[sID].stop();
      -
      -  };
      -
      -  /**
      -   * Stops all currently-playing sounds.
      -   */
      -
      -  this.stopAll = function() {
      -
      -    var oSound;
      -    sm2._wD(sm + '.stopAll()', 1);
      -
      -    for (oSound in sm2.sounds) {
      -      if (sm2.sounds.hasOwnProperty(oSound)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      apply only to sound objects

      - -
      - -
              sm2.sounds[oSound].stop();
      -      }
      -    }
      -
      -  };
      -
      -  /**
      -   * Calls the pause() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.pause = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].pause();
      -
      -  };
      -
      -  /**
      -   * Pauses all currently-playing sounds.
      -   */
      -
      -  this.pauseAll = function() {
      -
      -    var i;
      -    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -      sm2.sounds[sm2.soundIDs[i]].pause();
      -    }
      -
      -  };
      -
      -  /**
      -   * Calls the resume() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.resume = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].resume();
      -
      -  };
      -
      -  /**
      -   * Resumes all currently-paused sounds.
      -   */
      -
      -  this.resumeAll = function() {
      -
      -    var i;
      -    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -      sm2.sounds[sm2.soundIDs[i]].resume();
      -    }
      -
      -  };
      -
      -  /**
      -   * Calls the togglePause() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.togglePause = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].togglePause();
      -
      -  };
      -
      -  /**
      -   * Calls the setPan() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {number} nPan The pan value (-100 to 100)
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.setPan = function(sID, nPan) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].setPan(nPan);
      -
      -  };
      -
      -  /**
      -   * Calls the setVolume() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @param {number} nVol The volume value (0 to 100)
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.setVolume = function(sID, nVol) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].setVolume(nVol);
      -
      -  };
      -
      -  /**
      -   * Calls the mute() method of either a single SMSound object by ID, or all sound objects.
      -   *
      -   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
      -   */
      -
      -  this.mute = function(sID) {
      -
      -    var i = 0;
      -
      -    if (sID instanceof String) {
      -      sID = null;
      -    }
      -
      -    if (!sID) {
      -
      -      sm2._wD(sm + '.mute(): Muting all sounds');
      -      for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -        sm2.sounds[sm2.soundIDs[i]].mute();
      -      }
      -      sm2.muted = true;
      -
      -    } else {
      -
      -      if (!idCheck(sID)) {
      -        return false;
      -      }
      -      sm2._wD(sm + '.mute(): Muting "' + sID + '"');
      -      return sm2.sounds[sID].mute();
      -
      -    }
      -
      -    return true;
      -
      -  };
      -
      -  /**
      -   * Mutes all sounds.
      -   */
      -
      -  this.muteAll = function() {
      -
      -    sm2.mute();
      -
      -  };
      -
      -  /**
      -   * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.
      -   *
      -   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
      -   */
      -
      -  this.unmute = function(sID) {
      -
      -    var i;
      -
      -    if (sID instanceof String) {
      -      sID = null;
      -    }
      -
      -    if (!sID) {
      -
      -      sm2._wD(sm + '.unmute(): Unmuting all sounds');
      -      for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -        sm2.sounds[sm2.soundIDs[i]].unmute();
      -      }
      -      sm2.muted = false;
      -
      -    } else {
      -
      -      if (!idCheck(sID)) {
      -        return false;
      -      }
      -      sm2._wD(sm + '.unmute(): Unmuting "' + sID + '"');
      -      return sm2.sounds[sID].unmute();
      -
      -    }
      -
      -    return true;
      -
      -  };
      -
      -  /**
      -   * Unmutes all sounds.
      -   */
      -
      -  this.unmuteAll = function() {
      -
      -    sm2.unmute();
      -
      -  };
      -
      -  /**
      -   * Calls the toggleMute() method of a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.toggleMute = function(sID) {
      -
      -    if (!idCheck(sID)) {
      -      return false;
      -    }
      -    return sm2.sounds[sID].toggleMute();
      -
      -  };
      -
      -  /**
      -   * Retrieves the memory used by the flash plugin.
      -   *
      -   * @return {number} The amount of memory in use
      -   */
      -
      -  this.getMemoryUse = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash-only

      - -
      - -
          var ram = 0;
      -
      -    if (flash && fV !== 8) {
      -      ram = parseInt(flash._getMemoryUse(), 10);
      -    }
      -
      -    return ram;
      -
      -  };
      -
      -  /**
      -   * Undocumented: NOPs soundManager and all SMSound objects.
      -   */
      -
      -  this.disable = function(bNoDisable) {
      - -
    • - - -
    • -
      - -
      - -
      -

      destroy all functions

      - -
      - -
          var i;
      -
      -    if (bNoDisable === _undefined) {
      -      bNoDisable = false;
      -    }
      -
      -    if (disabled) {
      -      return false;
      -    }
      -
      -    disabled = true;
      -    _wDS('shutdown', 1);
      -
      -    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -      disableObject(sm2.sounds[sm2.soundIDs[i]]);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      fire "complete", despite fail

      - -
      - -
          initComplete(bNoDisable);
      -    event.remove(window, 'load', initUserOnload);
      -
      -    return true;
      -
      -  };
      -
      -  /**
      -   * Determines playability of a MIME type, eg. 'audio/mp3'.
      -   */
      -
      -  this.canPlayMIME = function(sMIME) {
      -
      -    var result;
      -
      -    if (sm2.hasHTML5) {
      -      result = html5CanPlay({type:sMIME});
      -    }
      -
      -    if (!result && needsFlash) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if flash 9, test netStream (movieStar) types as well.

      - -
      - -
            result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less "weird" (per JSLint)
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * Determines playability of a URL based on audio support.
      -   *
      -   * @param {string} sURL The URL to test
      -   * @return {boolean} URL playability
      -   */
      -
      -  this.canPlayURL = function(sURL) {
      -
      -    var result;
      -
      -    if (sm2.hasHTML5) {
      -      result = html5CanPlay({url: sURL});
      -    }
      -
      -    if (!result && needsFlash) {
      -      result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.
      -   *
      -   * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes
      -   * @return {boolean} URL playability
      -   */
      -
      -  this.canPlayLink = function(oLink) {
      -
      -    if (oLink.type !== _undefined && oLink.type) {
      -      if (sm2.canPlayMIME(oLink.type)) {
      -        return true;
      -      }
      -    }
      -
      -    return sm2.canPlayURL(oLink.href);
      -
      -  };
      -
      -  /**
      -   * Retrieves a SMSound object by ID.
      -   *
      -   * @param {string} sID The ID of the sound
      -   * @return {SMSound} The SMSound object
      -   */
      -
      -  this.getSoundById = function(sID, _suppressDebug) {
      -
      -    if (!sID) {
      -      return null;
      -    }
      -
      -    var result = sm2.sounds[sID];
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          if (!result && !_suppressDebug) {
      -      sm2._wD(sm + '.getSoundById(): Sound "' + sID + '" not found.', 2);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * Queues a callback for execution when SoundManager has successfully initialized.
      -   *
      -   * @param {function} oMethod The callback method to fire
      -   * @param {object} oScope Optional: The scope to apply to the callback
      -   */
      -
      -  this.onready = function(oMethod, oScope) {
      -
      -    var sType = 'onready',
      -        result = false;
      -
      -    if (typeof oMethod === 'function') {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (didInit) {
      -        sm2._wD(str('queue', sType));
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      if (!oScope) {
      -        oScope = window;
      -      }
      -
      -      addOnEvent(sType, oMethod, oScope);
      -      processOnEvents();
      -
      -      result = true;
      -
      -    } else {
      -
      -      throw str('needFunction', sType);
      -
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * Queues a callback for execution when SoundManager has failed to initialize.
      -   *
      -   * @param {function} oMethod The callback method to fire
      -   * @param {object} oScope Optional: The scope to apply to the callback
      -   */
      -
      -  this.ontimeout = function(oMethod, oScope) {
      -
      -    var sType = 'ontimeout',
      -        result = false;
      -
      -    if (typeof oMethod === 'function') {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (didInit) {
      -        sm2._wD(str('queue', sType));
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      if (!oScope) {
      -        oScope = window;
      -      }
      -
      -      addOnEvent(sType, oMethod, oScope);
      -      processOnEvents({type:sType});
      -
      -      result = true;
      -
      -    } else {
      -
      -      throw str('needFunction', sType);
      -
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * Writes console.log()-style debug output to a console or in-browser element.
      -   * Applies when debugMode = true
      -   *
      -   * @param {string} sText The console message
      -   * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.
      -   */
      -
      -  this._writeDebug = function(sText, sTypeOrObject) {
      - -
    • - - -
    • -
      - -
      - -
      -

      pseudo-private console.log()-style output

      - - -
      - -
      -    var sDID = 'soundmanager-debug', o, oItem;
      -
      -    if (!sm2.debugMode) {
      -      return false;
      -    }
      -
      -    if (hasConsole && sm2.useConsole) {
      -      if (sTypeOrObject && typeof sTypeOrObject === 'object') {
      - -
    • - - -
    • -
      - -
      - -
      -

      object passed; dump to console.

      - -
      - -
              console.log(sText, sTypeOrObject);
      -      } else if (debugLevels[sTypeOrObject] !== _undefined) {
      -        console[debugLevels[sTypeOrObject]](sText);
      -      } else {
      -        console.log(sText);
      -      }
      -      if (sm2.consoleOnly) {
      -        return true;
      -      }
      -    }
      -
      -    o = id(sDID);
      -
      -    if (!o) {
      -      return false;
      -    }
      -
      -    oItem = doc.createElement('div');
      -
      -    if (++wdCount % 2 === 0) {
      -      oItem.className = 'sm2-alt';
      -    }
      -
      -    if (sTypeOrObject === _undefined) {
      -      sTypeOrObject = 0;
      -    } else {
      -      sTypeOrObject = parseInt(sTypeOrObject, 10);
      -    }
      -
      -    oItem.appendChild(doc.createTextNode(sText));
      -
      -    if (sTypeOrObject) {
      -      if (sTypeOrObject >= 2) {
      -        oItem.style.fontWeight = 'bold';
      -      }
      -      if (sTypeOrObject === 3) {
      -        oItem.style.color = '#ff3333';
      -      }
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      top-to-bottom -o.appendChild(oItem);

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      bottom-to-top

      - -
      - -
          o.insertBefore(oItem, o.firstChild);
      -
      -    o = null;
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    return true;
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      -last-resort debugging option

      - -
      - -
        if (wl.indexOf('sm2-debug=alert') !== -1) {
      -    this._writeDebug = function(sText) {
      -      window.alert(sText);
      -    };
      -  }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      alias

      - -
      - -
        this._wD = this._writeDebug;
      -
      -  /**
      -   * Provides debug / state information on all SMSound objects.
      -   */
      -
      -  this._debug = function() {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          var i, j;
      -    _wDS('currentObj', 1);
      -
      -    for (i = 0, j = sm2.soundIDs.length; i < j; i++) {
      -      sm2.sounds[sm2.soundIDs[i]]._debug();
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  /**
      -   * Restarts and re-initializes the SoundManager instance.
      -   *
      -   * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.
      -   * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).
      -   * @return {object} soundManager The soundManager instance.
      -   */
      -
      -  this.reboot = function(resetEvents, excludeInit) {
      - -
    • - - -
    • -
      - -
      - -
      -

      reset some (or all) state, and re-init unless otherwise specified.

      - -
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          if (sm2.soundIDs.length) {
      -      sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    var i, j, k;
      -
      -    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -      sm2.sounds[sm2.soundIDs[i]].destruct();
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      trash ze flash (remove from the DOM)

      - -
      - -
      -    if (flash) {
      -
      -      try {
      -
      -        if (isIE) {
      -          oRemovedHTML = flash.innerHTML;
      -        }
      -
      -        oRemoved = flash.parentNode.removeChild(flash);
      -
      -      } catch(e) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.

      - -
      - -
      -        _wDS('badRemove', 2);
      -
      -      }
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      actually, force recreate of movie.

      - -
      - -
      -    oRemovedHTML = oRemoved = needsFlash = flash = null;
      -
      -    sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;
      -
      -    sm2.soundIDs = [];
      -    sm2.sounds = {};
      -
      -    idCounter = 0;
      -
      -    if (!resetEvents) {
      - -
    • - - -
    • -
      - -
      - -
      -

      reset callbacks for onready, ontimeout etc. so that they will fire again on re-init

      - -
      - -
            for (i in on_queue) {
      -        if (on_queue.hasOwnProperty(i)) {
      -          for (j = 0, k = on_queue[i].length; j < k; j++) {
      -            on_queue[i][j].fired = false;
      -          }
      -        }
      -      }
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      remove all callbacks entirely

      - -
      - -
            on_queue = [];
      -    }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          if (!excludeInit) {
      -      sm2._wD(sm + ': Rebooting...');
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      reset HTML5 and flash canPlay test results

      - -
      - -
      -    sm2.html5 = {
      -      'usingFlash': null
      -    };
      -
      -    sm2.flash = {};
      - -
    • - - -
    • -
      - -
      - -
      -

      reset device-specific HTML/flash mode switches

      - -
      - -
      -    sm2.html5Only = false;
      -    sm2.ignoreFlash = false;
      -
      -    window.setTimeout(function() {
      -
      -      preInit();
      - -
    • - - -
    • -
      - -
      - -
      -

      by default, re-init

      - -
      - -
      -      if (!excludeInit) {
      -        sm2.beginDelayedInit();
      -      }
      -
      -    }, 20);
      -
      -    return sm2;
      -
      -  };
      -
      -  this.reset = function() {
      -
      -    /**
      -     * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.
      -     * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().
      -     * @return {object} soundManager The soundManager instance.
      -     */
      -
      -    _wDS('reset');
      -    return sm2.reboot(true, true);
      -
      -  };
      -
      -  /**
      -   * Undocumented: Determines the SM2 flash movie's load progress.
      -   *
      -   * @return {number or null} Percent loaded, or if invalid/unsupported, null.
      -   */
      -
      -  this.getMoviePercent = function() {
      -
      -    /**
      -     * Interesting syntax notes...
      -     * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof "function" nor instanceof Function, but are still valid.
      -     * Additionally, JSLint dislikes ('PercentLoaded' in flash)-style syntax and recommends hasOwnProperty(), which does not work in this case.
      -     * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw "object doesn't support this property or method".
      -     * Thus, 'in' syntax must be used.
      -     */
      -
      -    return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); // Yes, JSLint. See nearby comment in source for explanation.
      -
      -  };
      -
      -  /**
      -   * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().
      -   */
      -
      -  this.beginDelayedInit = function() {
      -
      -    windowLoaded = true;
      -    domContentLoaded();
      -
      -    setTimeout(function() {
      -
      -      if (initPending) {
      -        return false;
      -      }
      -
      -      createMovie();
      -      initMovie();
      -      initPending = true;
      -
      -      return true;
      -
      -    }, 20);
      -
      -    delayWaitForEI();
      -
      -  };
      -
      -  /**
      -   * Destroys the SoundManager instance and all SMSound instances.
      -   */
      -
      -  this.destruct = function() {
      -
      -    sm2._wD(sm + '.destruct()');
      -    sm2.disable(true);
      -
      -  };
      -
      -  /**
      -   * SMSound() (sound object) constructor
      -   * ------------------------------------
      -   *
      -   * @param {object} oOptions Sound options (id and url are required attributes)
      -   * @return {SMSound} The new SMSound object
      -   */
      -
      -  SMSound = function(oOptions) {
      -
      -    var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;
      -
      -    lastHTML5State = {
      - -
    • - - -
    • -
      - -
      - -
      -

      tracks duration + position (time)

      - -
      - -
            duration: null,
      -      time: null
      -    };
      -
      -    this.id = oOptions.id;
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy

      - -
      - -
          this.sID = this.id;
      -
      -    this.url = oOptions.url;
      -    this.options = mixin(oOptions);
      - -
    • - - -
    • -
      - -
      - -
      -

      per-play-instance-specific options

      - -
      - -
          this.instanceOptions = this.options;
      - -
    • - - -
    • -
      - -
      - -
      -

      short alias

      - -
      - -
          this._iO = this.instanceOptions;
      - -
    • - - -
    • -
      - -
      - -
      -

      assign property defaults

      - -
      - -
          this.pan = this.options.pan;
      -    this.volume = this.options.volume;
      - -
    • - - -
    • -
      - -
      - -
      -

      whether or not this object is using HTML5

      - -
      - -
          this.isHTML5 = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      internal HTML5 Audio() object reference

      - -
      - -
          this._a = null;
      - -
    • - - -
    • -
      - -
      - -
      -

      for flash 8 special-case createSound() without url, followed by load/play with url case

      - -
      - -
          urlOmitted = (this.url ? false : true);
      -
      -    /**
      -     * SMSound() public methods
      -     * ------------------------
      -     */
      -
      -    this.id3 = {};
      -
      -    /**
      -     * Writes SMSound object parameters to debug console
      -     */
      -
      -    this._debug = function() {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            sm2._wD(s.id + ': Merged options:', s.options);
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    };
      -
      -    /**
      -     * Begins loading a sound per its *url*.
      -     *
      -     * @param {object} oOptions Optional: Sound options
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.load = function(oOptions) {
      -
      -      var oSound = null, instanceOptions;
      -
      -      if (oOptions !== _undefined) {
      -        s._iO = mixin(oOptions, s.options);
      -      } else {
      -        oOptions = s.options;
      -        s._iO = oOptions;
      -        if (lastURL && lastURL !== s.url) {
      -          _wDS('manURL');
      -          s._iO.url = s.url;
      -          s.url = null;
      -        }
      -      }
      -
      -      if (!s._iO.url) {
      -        s._iO.url = s.url;
      -      }
      -
      -      s._iO.url = parseURL(s._iO.url);
      - -
    • - - -
    • -
      - -
      - -
      -

      ensure we're in sync

      - -
      - -
            s.instanceOptions = s._iO;
      - -
    • - - -
    • -
      - -
      - -
      -

      local shortcut

      - -
      - -
            instanceOptions = s._iO;
      -
      -      sm2._wD(s.id + ': load (' + instanceOptions.url + ')');
      -
      -      if (!instanceOptions.url && !s.url) {
      -        sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);
      -        return s;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash 8 load() -> play() won't work before onload has fired.

      - -
      - -
              sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {
      -        _wDS('onURL', 1);
      - -
    • - - -
    • -
      - -
      - -
      -

      if loaded and an onload() exists, fire immediately.

      - -
      - -
              if (s.readyState === 3 && instanceOptions.onload) {
      - -
    • - - -
    • -
      - -
      - -
      -

      assume success based on truthy duration.

      - -
      - -
                wrapCallback(s, function() {
      -            instanceOptions.onload.apply(s, [(!!s.duration)]);
      -          });
      -        }
      -        return s;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      reset a few state properties

      - -
      - -
      -      s.loaded = false;
      -      s.readyState = 1;
      -      s.playState = 0;
      -      s.id3 = {};
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.

      - -
      - -
      -      if (html5OK(instanceOptions)) {
      -
      -        oSound = s._setup_html5(instanceOptions);
      -
      -        if (!oSound._called_load) {
      -
      -          s._html5_canplay = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: review called_load / html5_canplay logic

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      if url provided directly to load(), assign it here.

      - -
      - -
      -          if (s.url !== instanceOptions.url) {
      -
      -            sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);
      -
      -            s._a.src = instanceOptions.url;
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: review / re-apply all relevant options (volume, loop, onposition etc.)

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      reset position for new URL

      - -
      - -
                  s.setPosition(0);
      -
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      given explicit load call, try to preload.

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      early HTML5 implementation (non-standard)

      - -
      - -
                s._a.autobuffer = 'auto';
      - -
    • - - -
    • -
      - -
      - -
      -

      standard property, values: none / metadata / auto -reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx

      - -
      - -
                s._a.preload = 'auto';
      -
      -          s._a._called_load = true;
      -
      -        } else {
      -
      -          sm2._wD(s.id + ': Ignoring request to load again');
      -
      -        }
      -
      -      } else {
      -
      -        if (sm2.html5Only) {
      -          sm2._wD(s.id + ': No flash support. Exiting.');
      -          return s;
      -        }
      -
      -        if (s._iO.url && s._iO.url.match(/data\:/i)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      data: URIs not supported by Flash, either.

      - -
      - -
                sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');
      -          return s;
      -        }
      -
      -        try {
      -          s.isHTML5 = false;
      -          s._iO = policyFix(loopFix(instanceOptions));
      - -
    • - - -
    • -
      - -
      - -
      -

      re-assign local shortcut

      - -
      - -
                instanceOptions = s._iO;
      -          if (fV === 8) {
      -            flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);
      -          } else {
      -            flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);
      -          }
      -        } catch(e) {
      -          _wDS('smError', 2);
      -          debugTS('onload', false);
      -          catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
      -        }
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      after all of this, ensure sound url is up to date.

      - -
      - -
            s.url = instanceOptions.url;
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Unloads a sound, canceling any open HTTP requests.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.unload = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL -Flash 9/AS3: Close stream, preventing further load -HTML5: Most UAs will use empty URL

      - -
      - -
      -      if (s.readyState !== 0) {
      -
      -        sm2._wD(s.id + ': unload()');
      -
      -        if (!s.isHTML5) {
      -
      -          if (fV === 8) {
      -            flash._unload(s.id, emptyURL);
      -          } else {
      -            flash._unload(s.id);
      -          }
      -
      -        } else {
      -
      -          stop_html5_timer();
      -
      -          if (s._a) {
      -
      -            s._a.pause();
      - -
    • - - -
    • -
      - -
      - -
      -

      update empty URL, too

      - -
      - -
                  lastURL = html5Unload(s._a);
      -
      -          }
      -
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      reset load/status flags

      - -
      - -
              resetProperties();
      -
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Unloads and destroys a sound.
      -     */
      -
      -    this.destruct = function(_bFromSM) {
      -
      -      sm2._wD(s.id + ': Destruct');
      -
      -      if (!s.isHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      kill sound within Flash -Disable the onfailure handler

      - -
      - -
              s._iO.onfailure = null;
      -        flash._destroySound(s.id);
      -
      -      } else {
      -
      -        stop_html5_timer();
      -
      -        if (s._a) {
      -          s._a.pause();
      -          html5Unload(s._a);
      -          if (!useGlobalHTML5Audio) {
      -            remove_html5_events();
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      break obvious circular reference

      - -
      - -
                s._a._s = null;
      -          s._a = null;
      -        }
      -
      -      }
      -
      -      if (!_bFromSM) {
      - -
    • - - -
    • -
      - -
      - -
      -

      ensure deletion from controller

      - -
      - -
              sm2.destroySound(s.id, true);
      -      }
      -
      -    };
      -
      -    /**
      -     * Begins playing a sound.
      -     *
      -     * @param {object} oOptions Optional: Sound options
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.play = function(oOptions, _updatePlayState) {
      -
      -      var fN, allowMulti, a, onready,
      -          audioClone, onended, oncanplay,
      -          startOK = true,
      -          exit = null;
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            fN = s.id + ': play(): ';
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      default to true

      - -
      - -
            _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);
      -
      -      if (!oOptions) {
      -        oOptions = {};
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      first, use local URL (if specified)

      - -
      - -
            if (s.url) {
      -        s._iO.url = s.url;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      mix in any options defined at createSound()

      - -
      - -
            s._iO = mixin(s._iO, s.options);
      - -
    • - - -
    • -
      - -
      - -
      -

      mix in any options specific to this method

      - -
      - -
            s._iO = mixin(oOptions, s._iO);
      -
      -      s._iO.url = parseURL(s._iO.url);
      -
      -      s.instanceOptions = s._iO;
      - -
    • - - -
    • -
      - -
      - -
      -

      RTMP-only

      - -
      - -
            if (!s.isHTML5 && s._iO.serverURL && !s.connected) {
      -        if (!s.getAutoPlay()) {
      -          sm2._wD(fN +' Netstream not connected yet - setting autoPlay');
      -          s.setAutoPlay(true);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      play will be called in onconnect()

      - -
      - -
              return s;
      -      }
      -
      -      if (html5OK(s._iO)) {
      -        s._setup_html5(s._iO);
      -        start_html5_timer();
      -      }
      -
      -      if (s.playState === 1 && !s.paused) {
      -        allowMulti = s._iO.multiShot;
      -        if (!allowMulti) {
      -          sm2._wD(fN + 'Already playing (one-shot)', 1);
      -          if (s.isHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      go back to original position.

      - -
      - -
                  s.setPosition(s._iO.position);
      -          }
      -          exit = s;
      -        } else {
      -          sm2._wD(fN + 'Already playing (multi-shot)', 1);
      -        }
      -      }
      -
      -      if (exit !== null) {
      -        return exit;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      edge case: play() with explicit URL parameter

      - -
      - -
            if (oOptions.url && oOptions.url !== s.url) {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case for createSound() followed by load() / play() with url; avoid double-load case.

      - -
      - -
              if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {
      -
      -          urlOmitted = false;
      -
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      load using merged options

      - -
      - -
                s.load(s._iO);
      -
      -        }
      -
      -      }
      -
      -      if (!s.loaded) {
      -
      -        if (s.readyState === 0) {
      -
      -          sm2._wD(fN + 'Attempting to load');
      - -
    • - - -
    • -
      - -
      - -
      -

      try to get this sound playing ASAP

      - -
      - -
                if (!s.isHTML5 && !sm2.html5Only) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash: assign directly because setAutoPlay() increments the instanceCount

      - -
      - -
                  s._iO.autoPlay = true;
      -            s.load(s._iO);
      -
      -          } else if (s.isHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      iOS needs this when recycling sounds, loading a new URL on an existing object.

      - -
      - -
                  s.load(s._iO);
      -
      -          } else {
      -
      -            sm2._wD(fN + 'Unsupported type. Exiting.');
      -            exit = s;
      -
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 hack - re-set instanceOptions?

      - -
      - -
                s.instanceOptions = s._iO;
      -
      -        } else if (s.readyState === 2) {
      -
      -          sm2._wD(fN + 'Could not load - exiting', 2);
      -          exit = s;
      -
      -        } else {
      -
      -          sm2._wD(fN + 'Loading - attempting to play...');
      -
      -        }
      -
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      "play()"

      - -
      - -
              sm2._wD(fN.substr(0, fN.lastIndexOf(':')));
      -
      -      }
      -
      -      if (exit !== null) {
      -        return exit;
      -      }
      -
      -      if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash 9 needs a position reset if play() is called while at the end of a sound.

      - -
      - -
              sm2._wD(fN + 'Sound at end, resetting to position:0');
      -        oOptions.position = 0;
      -      }
      -
      -      /**
      -       * Streams will pause when their buffer is full if they are being loaded.
      -       * In this case paused is true, but the song hasn't started playing yet.
      -       * If we just call resume() the onplay() callback will never be called.
      -       * So only call resume() if the position is > 0.
      -       * Another reason is because options like volume won't have been applied yet.
      -       * For normal sounds, just resume.
      -       */
      -
      -      if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {
      - -
    • - - -
    • - - -
              sm2._wD(fN + 'Resuming from paused state', 1);
      -        s.resume();
      -
      -      } else {
      -
      -        s._iO = mixin(oOptions, s._iO);
      - -
    • - - -
    • -
      - -
      - -
      -

      apply from/to parameters, if they exist (and not using RTMP)

      - -
      - -
              if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {
      -
      -          onready = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      sound "canplay" or onload() -re-apply from/to to instance options, and start playback

      - -
      - -
                  s._iO = mixin(oOptions, s._iO);
      -            s.play(s._iO);
      -          };
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 needs to at least have "canplay" fired before seeking.

      - -
      - -
                if (s.isHTML5 && !s._html5_canplay) {
      - -
    • - - -
    • -
      - -
      - -
      -

      this hasn't been loaded yet. load it first, and then do this again.

      - -
      - -
                  sm2._wD(fN + 'Beginning load for from/to case');
      -
      -            s.load({
      - -
    • - - -
    • -
      - -
      - -
      -

      note: custom HTML5-only event added for from/to implementation.

      - -
      - -
                    _oncanplay: onready
      -            });
      -
      -            exit = false;
      -
      -          } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      to be safe, preload the whole thing in Flash.

      - -
      - -
      -            sm2._wD(fN + 'Preloading for from/to case');
      -
      -            s.load({
      -              onload: onready
      -            });
      -
      -            exit = false;
      -
      -          }
      -
      -          if (exit !== null) {
      -            return exit;
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      otherwise, we're ready to go. re-apply local options, and continue

      - -
      - -
      -          s._iO = applyFromTo();
      -
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD(fN + 'Starting to play');

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      increment instance counter, where enabled + supported

      - -
      - -
              if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {
      -          s.instanceCount++;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      if first play and onposition parameters exist, apply them now

      - -
      - -
              if (s._iO.onposition && s.playState === 0) {
      -          attachOnPosition(s);
      -        }
      -
      -        s.playState = 1;
      -        s.paused = false;
      -
      -        s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);
      -
      -        if (!s.isHTML5) {
      -          s._iO = policyFix(loopFix(s._iO));
      -        }
      -
      -        if (s._iO.onplay && _updatePlayState) {
      -          s._iO.onplay.apply(s);
      -          onplay_called = true;
      -        }
      -
      -        s.setVolume(s._iO.volume, true);
      -        s.setPan(s._iO.pan, true);
      -
      -        if (!s.isHTML5) {
      -
      -          startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);
      -
      -          if (fV === 9 && !startOK) {
      - -
    • - - -
    • -
      - -
      - -
      -

      edge case: no sound hardware, or 32-channel flash ceiling hit. -applies only to Flash 9, non-NetStream/MovieStar sounds. -http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29

      - -
      - -
                  sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);
      -            if (s._iO.onplayerror) {
      -              s._iO.onplayerror.apply(s);
      -            }
      -
      -          }
      -
      -        } else {
      -
      -          if (s.instanceCount < 2) {
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 single-instance case

      - -
      - -
      -            start_html5_timer();
      -
      -            a = s._setup_html5();
      -
      -            s.setPosition(s._iO.position);
      -
      -            a.play();
      -
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 multi-shot case

      - -
      - -
      -            sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');
      -
      -            audioClone = new Audio(s._iO.url);
      -
      -            onended = function() {
      -              event.remove(audioClone, 'ended', onended);
      -              s._onfinish(s);
      - -
    • - - -
    • -
      - -
      - -
      -

      cleanup

      - -
      - -
                    html5Unload(audioClone);
      -              audioClone = null;
      -            };
      -
      -            oncanplay = function() {
      -              event.remove(audioClone, 'canplay', oncanplay);
      -              try {
      -                audioClone.currentTime = s._iO.position/msecScale;
      -              } catch(err) {
      -                complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position/msecScale));
      -              }
      -              audioClone.play();
      -            };
      -
      -            event.add(audioClone, 'ended', onended);
      - -
    • - - -
    • -
      - -
      - -
      -

      apply volume to clones, too

      - -
      - -
                  if (s._iO.volume !== undefined) {
      -              audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100));
      -            }
      - -
    • - - -
    • -
      - -
      - -
      -

      playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.

      - -
      - -
                  if (s.muted) {
      -              audioClone.muted = true;
      -            }
      -
      -            if (s._iO.position) {
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 audio can't seek before onplay() event has fired. -wait for canplay, then seek to position and start playback.

      - -
      - -
                    event.add(audioClone, 'canplay', oncanplay);
      -            } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      begin playback at currentTime: 0

      - -
      - -
                    audioClone.play();
      -            }
      -
      -          }
      -
      -        }
      -
      -      }
      -
      -      return s;
      -
      -    };
      - -
    • - - -
    • -
      - -
      - -
      -

      just for convenience

      - -
      - -
          this.start = this.play;
      -
      -    /**
      -     * Stops playing a sound (and optionally, all sounds)
      -     *
      -     * @param {boolean} bAll Optional: Whether to stop all sounds
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.stop = function(bAll) {
      -
      -      var instanceOptions = s._iO,
      -          originalPosition;
      -
      -      if (s.playState === 1) {
      -
      -        sm2._wD(s.id + ': stop()');
      -
      -        s._onbufferchange(0);
      -        s._resetOnPosition(0);
      -        s.paused = false;
      -
      -        if (!s.isHTML5) {
      -          s.playState = 0;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      remove onPosition listeners, if any

      - -
      - -
              detachOnPosition();
      - -
    • - - -
    • -
      - -
      - -
      -

      and "to" position, if set

      - -
      - -
              if (instanceOptions.to) {
      -          s.clearOnPosition(instanceOptions.to);
      -        }
      -
      -        if (!s.isHTML5) {
      -
      -          flash._stop(s.id, bAll);
      - -
    • - - -
    • -
      - -
      - -
      -

      hack for netStream: just unload

      - -
      - -
                if (instanceOptions.serverURL) {
      -            s.unload();
      -          }
      -
      -        } else {
      -
      -          if (s._a) {
      -
      -            originalPosition = s.position;
      - -
    • - - -
    • -
      - -
      - -
      -

      act like Flash, though

      - -
      - -
                  s.setPosition(0);
      - -
    • - - -
    • -
      - -
      - -
      -

      hack: reflect old position for onstop() (also like Flash)

      - -
      - -
                  s.position = originalPosition;
      - -
    • - - -
    • -
      - -
      - -
      -

      html5 has no stop() -NOTE: pausing means iOS requires interaction to resume.

      - -
      - -
                  s._a.pause();
      -
      -            s.playState = 0;
      - -
    • - - -
    • -
      - -
      - -
      -

      and update UI

      - -
      - -
                  s._onTimer();
      -
      -            stop_html5_timer();
      -
      -          }
      -
      -        }
      -
      -        s.instanceCount = 0;
      -        s._iO = {};
      -
      -        if (instanceOptions.onstop) {
      -          instanceOptions.onstop.apply(s);
      -        }
      -
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Undocumented/internal: Sets autoPlay for RTMP.
      -     *
      -     * @param {boolean} autoPlay state
      -     */
      -
      -    this.setAutoPlay = function(autoPlay) {
      -
      -      sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));
      -      s._iO.autoPlay = autoPlay;
      -
      -      if (!s.isHTML5) {
      -        flash._setAutoPlay(s.id, autoPlay);
      -        if (autoPlay) {
      - -
    • - - -
    • -
      - -
      - -
      -

      only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)

      - -
      - -
                if (!s.instanceCount && s.readyState === 1) {
      -            s.instanceCount++;
      -            sm2._wD(s.id + ': Incremented instance count to '+s.instanceCount);
      -          }
      -        }
      -      }
      -
      -    };
      -
      -    /**
      -     * Undocumented/internal: Returns the autoPlay boolean.
      -     *
      -     * @return {boolean} The current autoPlay value
      -     */
      -
      -    this.getAutoPlay = function() {
      -
      -      return s._iO.autoPlay;
      -
      -    };
      -
      -    /**
      -     * Sets the position of a sound.
      -     *
      -     * @param {number} nMsecOffset Position (milliseconds)
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.setPosition = function(nMsecOffset) {
      -
      -      if (nMsecOffset === _undefined) {
      -        nMsecOffset = 0;
      -      }
      -
      -      var position, position1K,
      - -
    • - - -
    • -
      - -
      - -
      -

      Use the duration from the instance options, if we don't have a track duration yet. -position >= 0 and <= current available (loaded) duration

      - -
      - -
                offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));
      -
      -      s.position = offset;
      -      position1K = s.position/msecScale;
      -      s._resetOnPosition(s.position);
      -      s._iO.position = offset;
      -
      -      if (!s.isHTML5) {
      -
      -        position = (fV === 9 ? s.position : position1K);
      -
      -        if (s.readyState && s.readyState !== 2) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if paused or not playing, will not resume (by playing)

      - -
      - -
                flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);
      -        }
      -
      -      } else if (s._a) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Set the position in the canplay handler if the sound is not ready yet

      - -
      - -
              if (s._html5_canplay) {
      -
      -          if (s._a.currentTime !== position1K) {
      -
      -            /**
      -             * DOM/JS errors/exceptions to watch out for:
      -             * if seek is beyond (loaded?) position, "DOM exception 11"
      -             * "INDEX_SIZE_ERR": DOM exception 1
      -             */
      -            sm2._wD(s.id + ': setPosition('+position1K+')');
      -
      -            try {
      -              s._a.currentTime = position1K;
      -              if (s.playState === 0 || s.paused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      allow seek without auto-play/resume

      - -
      - -
                      s._a.pause();
      -              }
      -            } catch(e) {
      -              sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);
      -            }
      -
      -          }
      -
      -        } else if (position1K) {
      - -
    • - - -
    • -
      - -
      - -
      -

      warn on non-zero seek attempts

      - -
      - -
                sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);
      -          return s;
      -
      -        }
      -
      -        if (s.paused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if paused, refresh UI right away -force update

      - -
      - -
                s._onTimer(true);
      -
      -        }
      -
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Pauses sound playback.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.pause = function(_bCallFlash) {
      -
      -      if (s.paused || (s.playState === 0 && s.readyState !== 1)) {
      -        return s;
      -      }
      -
      -      sm2._wD(s.id + ': pause()');
      -      s.paused = true;
      -
      -      if (!s.isHTML5) {
      -        if (_bCallFlash || _bCallFlash === _undefined) {
      -          flash._pause(s.id, s._iO.multiShot);
      -        }
      -      } else {
      -        s._setup_html5().pause();
      -        stop_html5_timer();
      -      }
      -
      -      if (s._iO.onpause) {
      -        s._iO.onpause.apply(s);
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Resumes sound playback.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    /**
      -     * When auto-loaded streams pause on buffer full they have a playState of 0.
      -     * We need to make sure that the playState is set to 1 when these streams "resume".
      -     * When a paused stream is resumed, we need to trigger the onplay() callback if it
      -     * hasn't been called already. In this case since the sound is being played for the
      -     * first time, I think it's more appropriate to call onplay() rather than onresume().
      -     */
      -
      -    this.resume = function() {
      -
      -      var instanceOptions = s._iO;
      -
      -      if (!s.paused) {
      -        return s;
      -      }
      -
      -      sm2._wD(s.id + ': resume()');
      -      s.paused = false;
      -      s.playState = 1;
      -
      -      if (!s.isHTML5) {
      -        if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.

      - -
      - -
                s.setPosition(s.position);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      flash method is toggle-based (pause/resume)

      - -
      - -
              flash._pause(s.id, instanceOptions.multiShot);
      -      } else {
      -        s._setup_html5().play();
      -        start_html5_timer();
      -      }
      -
      -      if (!onplay_called && instanceOptions.onplay) {
      -        instanceOptions.onplay.apply(s);
      -        onplay_called = true;
      -      } else if (instanceOptions.onresume) {
      -        instanceOptions.onresume.apply(s);
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Toggles sound playback.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.togglePause = function() {
      -
      -      sm2._wD(s.id + ': togglePause()');
      -
      -      if (s.playState === 0) {
      -        s.play({
      -          position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)
      -        });
      -        return s;
      -      }
      -
      -      if (s.paused) {
      -        s.resume();
      -      } else {
      -        s.pause();
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Sets the panning (L-R) effect.
      -     *
      -     * @param {number} nPan The pan value (-100 to 100)
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.setPan = function(nPan, bInstanceOnly) {
      -
      -      if (nPan === _undefined) {
      -        nPan = 0;
      -      }
      -
      -      if (bInstanceOnly === _undefined) {
      -        bInstanceOnly = false;
      -      }
      -
      -      if (!s.isHTML5) {
      -        flash._setPan(s.id, nPan);
      -      } // else { no HTML5 pan? }
      -
      -      s._iO.pan = nPan;
      -
      -      if (!bInstanceOnly) {
      -        s.pan = nPan;
      -        s.options.pan = nPan;
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Sets the volume.
      -     *
      -     * @param {number} nVol The volume value (0 to 100)
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.setVolume = function(nVol, _bInstanceOnly) {
      -
      -      /**
      -       * Note: Setting volume has no effect on iOS "special snowflake" devices.
      -       * Hardware volume control overrides software, and volume
      -       * will always return 1 per Apple docs. (iOS 4 + 5.)
      -       * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html
      -       */
      -
      -      if (nVol === _undefined) {
      -        nVol = 100;
      -      }
      -
      -      if (_bInstanceOnly === _undefined) {
      -        _bInstanceOnly = false;
      -      }
      -
      -      if (!s.isHTML5) {
      -        flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol);
      -      } else if (s._a) {
      -        if (sm2.muted && !s.muted) {
      -          s.muted = true;
      -          s._a.muted = true;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      valid range: 0-1

      - -
      - -
              s._a.volume = Math.max(0, Math.min(1, nVol/100));
      -      }
      -
      -      s._iO.volume = nVol;
      -
      -      if (!_bInstanceOnly) {
      -        s.volume = nVol;
      -        s.options.volume = nVol;
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Mutes the sound.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.mute = function() {
      -
      -      s.muted = true;
      -
      -      if (!s.isHTML5) {
      -        flash._setVolume(s.id, 0);
      -      } else if (s._a) {
      -        s._a.muted = true;
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Unmutes the sound.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.unmute = function() {
      -
      -      s.muted = false;
      -      var hasIO = (s._iO.volume !== _undefined);
      -
      -      if (!s.isHTML5) {
      -        flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume);
      -      } else if (s._a) {
      -        s._a.muted = false;
      -      }
      -
      -      return s;
      -
      -    };
      -
      -    /**
      -     * Toggles the muted state of a sound.
      -     *
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.toggleMute = function() {
      -
      -      return (s.muted?s.unmute():s.mute());
      -
      -    };
      -
      -    /**
      -     * Registers a callback to be fired when a sound reaches a given position during playback.
      -     *
      -     * @param {number} nPosition The position to watch for
      -     * @param {function} oMethod The relevant callback to fire
      -     * @param {object} oScope Optional: The scope to apply the callback to
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.onPosition = function(nPosition, oMethod, oScope) {
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: basic dupe checking?

      - -
      - -
      -      onPositionItems.push({
      -        position: parseInt(nPosition, 10),
      -        method: oMethod,
      -        scope: (oScope !== _undefined ? oScope : s),
      -        fired: false
      -      });
      -
      -      return s;
      -
      -    };
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy/backwards-compability: lower-case method name

      - -
      - -
          this.onposition = this.onPosition;
      -
      -    /**
      -     * Removes registered callback(s) from a sound, by position and/or callback.
      -     *
      -     * @param {number} nPosition The position to clear callback(s) for
      -     * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position
      -     * @return {SMSound} The SMSound object
      -     */
      -
      -    this.clearOnPosition = function(nPosition, oMethod) {
      -
      -      var i;
      -
      -      nPosition = parseInt(nPosition, 10);
      -
      -      if (isNaN(nPosition)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      safety check

      - -
      - -
              return false;
      -      }
      -
      -      for (i=0; i < onPositionItems.length; i++) {
      -
      -        if (nPosition === onPositionItems[i].position) {
      - -
    • - - -
    • -
      - -
      - -
      -

      remove this item if no method was specified, or, if the method matches

      - -
      - -
                if (!oMethod || (oMethod === onPositionItems[i].method)) {
      -            if (onPositionItems[i].fired) {
      - -
    • - - -
    • -
      - -
      - -
      -

      decrement "fired" counter, too

      - -
      - -
                    onPositionFired--;
      -            }
      -            onPositionItems.splice(i, 1);
      -          }
      -        }
      -
      -      }
      -
      -    };
      -
      -    this._processOnPosition = function() {
      -
      -      var i, item, j = onPositionItems.length;
      -		
      -      if (!j || !s.playState || onPositionFired >= j) {
      -        return false;
      -      }
      -
      -      for (i=j-1; i >= 0; i--) {
      -        item = onPositionItems[i];
      -        if (!item.fired && s.position >= item.position) {
      -          item.fired = true;
      -          onPositionFired++;
      -          item.method.apply(item.scope, [item.position]);
      -		  j = onPositionItems.length; //  reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.
      -        }
      -      }
      -	
      -      return true;
      -
      -    };
      -
      -    this._resetOnPosition = function(nPosition) {
      - -
    • - - -
    • -
      - -
      - -
      -

      reset "fired" for items interested in this position

      - -
      - -
            var i, item, j = onPositionItems.length;
      -
      -      if (!j) {
      -        return false;
      -      }
      -
      -      for (i=j-1; i >= 0; i--) {
      -        item = onPositionItems[i];
      -        if (item.fired && nPosition <= item.position) {
      -          item.fired = false;
      -          onPositionFired--;
      -        }
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    /**
      -     * SMSound() private internals
      -     * --------------------------------
      -     */
      -
      -    applyFromTo = function() {
      -
      -      var instanceOptions = s._iO,
      -          f = instanceOptions.from,
      -          t = instanceOptions.to,
      -          start, end;
      -
      -      end = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      end has been reached.

      - -
      - -
              sm2._wD(s.id + ': "To" time of ' + t + ' reached.');
      - -
    • - - -
    • -
      - -
      - -
      -

      detach listener

      - -
      - -
              s.clearOnPosition(t, end);
      - -
    • - - -
    • -
      - -
      - -
      -

      stop should clear this, too

      - -
      - -
              s.stop();
      -
      -      };
      -
      -      start = function() {
      -
      -        sm2._wD(s.id + ': Playing "from" ' + f);
      - -
    • - - -
    • -
      - -
      - -
      -

      add listener for end

      - -
      - -
              if (t !== null && !isNaN(t)) {
      -          s.onPosition(t, end);
      -        }
      -
      -      };
      -
      -      if (f !== null && !isNaN(f)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      apply to instance options, guaranteeing correct start position.

      - -
      - -
              instanceOptions.position = f;
      - -
    • - - -
    • -
      - -
      - -
      -

      multiShot timing can't be tracked, so prevent that.

      - -
      - -
              instanceOptions.multiShot = false;
      -
      -        start();
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      return updated instanceOptions including starting position

      - -
      - -
            return instanceOptions;
      -
      -    };
      -
      -    attachOnPosition = function() {
      -
      -      var item,
      -          op = s._iO.onposition;
      - -
    • - - -
    • -
      - -
      - -
      -

      attach onposition things, if any, now.

      - -
      - -
      -      if (op) {
      -
      -        for (item in op) {
      -          if (op.hasOwnProperty(item)) {
      -            s.onPosition(parseInt(item, 10), op[item]);
      -          }
      -        }
      -
      -      }
      -
      -    };
      -
      -    detachOnPosition = function() {
      -
      -      var item,
      -          op = s._iO.onposition;
      - -
    • - - -
    • -
      - -
      - -
      -

      detach any onposition()-style listeners.

      - -
      - -
      -      if (op) {
      -
      -        for (item in op) {
      -          if (op.hasOwnProperty(item)) {
      -            s.clearOnPosition(parseInt(item, 10));
      -          }
      -        }
      -
      -      }
      -
      -    };
      -
      -    start_html5_timer = function() {
      -
      -      if (s.isHTML5) {
      -        startTimer(s);
      -      }
      -
      -    };
      -
      -    stop_html5_timer = function() {
      -
      -      if (s.isHTML5) {
      -        stopTimer(s);
      -      }
      -
      -    };
      -
      -    resetProperties = function(retainPosition) {
      -
      -      if (!retainPosition) {
      -        onPositionItems = [];
      -        onPositionFired = 0;
      -      }
      -
      -      onplay_called = false;
      -
      -      s._hasTimer = null;
      -      s._a = null;
      -      s._html5_canplay = false;
      -      s.bytesLoaded = null;
      -      s.bytesTotal = null;
      -      s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);
      -      s.durationEstimate = null;
      -      s.buffered = [];
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy: 1D array

      - -
      - -
            s.eqData = [];
      -
      -      s.eqData.left = [];
      -      s.eqData.right = [];
      -
      -      s.failures = 0;
      -      s.isBuffering = false;
      -      s.instanceOptions = {};
      -      s.instanceCount = 0;
      -      s.loaded = false;
      -      s.metadata = {};
      - -
    • - - -
    • -
      - -
      - -
      -

      0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success

      - -
      - -
            s.readyState = 0;
      -
      -      s.muted = false;
      -      s.paused = false;
      -
      -      s.peakData = {
      -        left: 0,
      -        right: 0
      -      };
      -
      -      s.waveformData = {
      -        left: [],
      -        right: []
      -      };
      -
      -      s.playState = 0;
      -      s.position = null;
      -
      -      s.id3 = {};
      -
      -    };
      -
      -    resetProperties();
      -
      -    /**
      -     * Pseudo-private SMSound internals
      -     * --------------------------------
      -     */
      -
      -    this._onTimer = function(bForce) {
      -
      -      /**
      -       * HTML5-only _whileplaying() etc.
      -       * called from both HTML5 native events, and polling/interval-based timers
      -       * mimics flash and fires only when time/duration change, so as to be polling-friendly
      -       */
      -
      -      var duration, isNew = false, time, x = {};
      -
      -      if (s._hasTimer || bForce) {
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: May not need to track readyState (1 = loading)

      - -
      - -
      -        if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {
      -
      -          duration = s._get_html5_duration();
      -
      -          if (duration !== lastHTML5State.duration) {
      -
      -            lastHTML5State.duration = duration;
      -            s.duration = duration;
      -            isNew = true;
      -
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: investigate why this goes wack if not set/re-set each time.

      - -
      - -
                s.durationEstimate = s.duration;
      -
      -          time = (s._a.currentTime * msecScale || 0);
      -
      -          if (time !== lastHTML5State.time) {
      -
      -            lastHTML5State.time = time;
      -            isNew = true;
      -
      -          }
      -
      -          if (isNew || bForce) {
      -
      -            s._whileplaying(time,x,x,x,x);
      -
      -          }
      -
      -        }/* else {
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD('_onTimer: Warn for "'+s.id+'": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));

      - -
      - -
      -          return false;
      -
      -        }*/
      -
      -        return isNew;
      -
      -      }
      -
      -    };
      -
      -    this._get_html5_duration = function() {
      -
      -      var instanceOptions = s._iO,
      - -
    • - - -
    • -
      - -
      - -
      -

      if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null

      - -
      - -
                d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),
      -          result = (d && !isNaN(d) && d !== Infinity ? d : null);
      -
      -      return result;
      -
      -    };
      -
      -    this._apply_loop = function(a, nLoops) {
      -
      -      /**
      -       * boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop
      -       * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.
      -       */
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (!a.loop && nLoops > 1) {
      -        sm2._wD('Note: Native HTML5 looping is infinite.', 1);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      a.loop = (nLoops > 1 ? 'loop' : '');
      -
      -    };
      -
      -    this._setup_html5 = function(oOptions) {
      -
      -      var instanceOptions = mixin(s._iO, oOptions),
      -          a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,
      -          dURL = decodeURI(instanceOptions.url),
      -          sameURL;
      -
      -      /**
      -       * "First things first, I, Poppa..." (reset the previous state of the old sound, if playing)
      -       * Fixes case with devices that can only play one sound at a time
      -       * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state
      -       */
      -
      -      if (useGlobalHTML5Audio) {
      -
      -        if (dURL === decodeURI(lastGlobalHTML5URL)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      global HTML5 audio: re-use of URL

      - -
      - -
                sameURL = true;
      -        }
      -
      -      } else if (dURL === decodeURI(lastURL)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      options URL is the same as the "last" URL, and we used (loaded) it

      - -
      - -
              sameURL = true;
      -
      -      }
      -
      -      if (a) {
      -
      -        if (a._s) {
      -
      -          if (useGlobalHTML5Audio) {
      -
      -            if (a._s && a._s.playState && !sameURL) {
      - -
    • - - -
    • -
      - -
      - -
      -

      global HTML5 audio case, and loading a new URL. stop the currently-playing one.

      - -
      - -
                    a._s.stop();
      -
      -            }
      -
      -          } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      non-global HTML5 reuse case: same url, ignore request

      - -
      - -
                  s._apply_loop(a, instanceOptions.loops);
      -
      -            return a;
      -
      -          }
      -
      -        }
      -
      -        if (!sameURL) {
      - -
    • - - -
    • -
      - -
      - -
      -

      don't retain onPosition() stuff with new URLs.

      - -
      - -
      -          if (lastURL) {
      -            resetProperties(false);
      -          }
      - -
    • - - -
    • -
      - -
      - -
      -

      assign new HTML5 URL

      - -
      - -
      -          a.src = instanceOptions.url;
      -
      -          s.url = instanceOptions.url;
      -
      -          lastURL = instanceOptions.url;
      -
      -          lastGlobalHTML5URL = instanceOptions.url;
      -
      -          a._called_load = false;
      -
      -        }
      -
      -      } else {
      -
      -        if (instanceOptions.autoLoad || instanceOptions.autoPlay) {
      -
      -          s._a = new Audio(instanceOptions.url);
      -          s._a.load();
      -
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      null for stupid Opera 9.64 case

      - -
      - -
                s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());
      -
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      assign local reference

      - -
      - -
              a = s._a;
      -
      -        a._called_load = false;
      -
      -        if (useGlobalHTML5Audio) {
      -
      -          globalHTML5Audio = a;
      -
      -        }
      -
      -      }
      -
      -      s.isHTML5 = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      store a ref on the track

      - -
      - -
            s._a = a;
      - -
    • - - -
    • -
      - -
      - -
      -

      store a ref on the audio

      - -
      - -
            a._s = s;
      -
      -      add_html5_events();
      -
      -      s._apply_loop(a, instanceOptions.loops);
      -
      -      if (instanceOptions.autoLoad || instanceOptions.autoPlay) {
      -
      -        s.load();
      -
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      early HTML5 implementation (non-standard)

      - -
      - -
              a.autobuffer = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      standard ('none' is also an option.)

      - -
      - -
              a.preload = 'auto';
      -
      -      }
      -
      -      return a;
      -
      -    };
      -
      -    add_html5_events = function() {
      -
      -      if (s._a._added_events) {
      -        return false;
      -      }
      -
      -      var f;
      -
      -      function add(oEvt, oFn, bCapture) {
      -        return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null;
      -      }
      -
      -      s._a._added_events = true;
      -
      -      for (f in html5_events) {
      -        if (html5_events.hasOwnProperty(f)) {
      -          add(f, html5_events[f]);
      -        }
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    remove_html5_events = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      Remove event listeners

      - -
      - -
      -      var f;
      -
      -      function remove(oEvt, oFn, bCapture) {
      -        return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
      -      }
      -
      -      sm2._wD(s.id + ': Removing event listeners');
      -      s._a._added_events = false;
      -
      -      for (f in html5_events) {
      -        if (html5_events.hasOwnProperty(f)) {
      -          remove(f, html5_events[f]);
      -        }
      -      }
      -
      -    };
      -
      -    /**
      -     * Pseudo-private event internals
      -     * ------------------------------
      -     */
      -
      -    this._onload = function(nSuccess) {
      -
      -      var fN,
      - -
    • - - -
    • -
      - -
      - -
      -

      check for duration to prevent false positives from flash 8 when loading from cache.

      - -
      - -
                loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            fN = s.id + ': ';
      -      sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));
      -      if (!loadOK && !s.isHTML5) {
      -        if (sm2.sandbox.noRemote === true) {
      -          sm2._wD(fN + str('noNet'), 1);
      -        }
      -        if (sm2.sandbox.noLocal === true) {
      -          sm2._wD(fN + str('noLocal'), 1);
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      s.loaded = loadOK;
      -      s.readyState = loadOK?3:2;
      -      s._onbufferchange(0);
      -
      -      if (s._iO.onload) {
      -        wrapCallback(s, function() {
      -          s._iO.onload.apply(s, [loadOK]);
      -        });
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    this._onbufferchange = function(nIsBuffering) {
      -
      -      if (s.playState === 0) {
      - -
    • - - -
    • -
      - -
      - -
      -

      ignore if not playing

      - -
      - -
              return false;
      -      }
      -
      -      if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) {
      -        return false;
      -      }
      -
      -      s.isBuffering = (nIsBuffering === 1);
      -      if (s._iO.onbufferchange) {
      -        sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);
      -        s._iO.onbufferchange.apply(s);
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    /**
      -     * Playback may have stopped due to buffering, or related reason.
      -     * This state can be encountered on iOS < 6 when auto-play is blocked.
      -     */
      -
      -    this._onsuspend = function() {
      -
      -      if (s._iO.onsuspend) {
      -        sm2._wD(s.id + ': Playback suspended');
      -        s._iO.onsuspend.apply(s);
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    /**
      -     * flash 9/movieStar + RTMP-only method, should fire only once at most
      -     * at this point we just recreate failed sounds rather than trying to reconnect
      -     */
      -
      -    this._onfailure = function(msg, level, code) {
      -
      -      s.failures++;
      -      sm2._wD(s.id + ': Failures = ' + s.failures);
      -
      -      if (s._iO.onfailure && s.failures === 1) {
      -        s._iO.onfailure(s, msg, level, code);
      -      } else {
      -        sm2._wD(s.id + ': Ignoring failure');
      -      }
      -
      -    };
      -
      -    this._onfinish = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      store local copy before it gets trashed...

      - -
      - -
            var io_onfinish = s._iO.onfinish;
      -
      -      s._onbufferchange(0);
      -      s._resetOnPosition(0);
      - -
    • - - -
    • -
      - -
      - -
      -

      reset some state items

      - -
      - -
            if (s.instanceCount) {
      -
      -        s.instanceCount--;
      -
      -        if (!s.instanceCount) {
      - -
    • - - -
    • -
      - -
      - -
      -

      remove onPosition listeners, if any

      - -
      - -
                detachOnPosition();
      - -
    • - - -
    • -
      - -
      - -
      -

      reset instance options

      - -
      - -
                s.playState = 0;
      -          s.paused = false;
      -          s.instanceCount = 0;
      -          s.instanceOptions = {};
      -          s._iO = {};
      -          stop_html5_timer();
      - -
    • - - -
    • -
      - -
      - -
      -

      reset position, too

      - -
      - -
                if (s.isHTML5) {
      -            s.position = 0;
      -          }
      -
      -        }
      -
      -        if (!s.instanceCount || s._iO.multiShotEvents) {
      - -
    • - - -
    • -
      - -
      - -
      -

      fire onfinish for last, or every instance

      - -
      - -
                if (io_onfinish) {
      -            sm2._wD(s.id + ': onfinish()');
      -            wrapCallback(s, function() {
      -              io_onfinish.apply(s);
      -            });
      -          }
      -        }
      -
      -      }
      -
      -    };
      -
      -    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
      -
      -      var instanceOptions = s._iO;
      -
      -      s.bytesLoaded = nBytesLoaded;
      -      s.bytesTotal = nBytesTotal;
      -      s.duration = Math.floor(nDuration);
      -      s.bufferLength = nBufferLength;
      -
      -      if (!s.isHTML5 && !instanceOptions.isMovieStar) {
      -
      -        if (instanceOptions.duration) {
      - -
    • - - -
    • -
      - -
      - -
      -

      use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.

      - -
      - -
                s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;
      -        } else {
      -          s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);
      -        }
      -
      -      } else {
      -
      -        s.durationEstimate = s.duration;
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      for flash, reflect sequential-load-style buffering

      - -
      - -
            if (!s.isHTML5) {
      -        s.buffered = [{
      -          'start': 0,
      -          'end': s.duration
      -        }];
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      allow whileloading to fire even if "load" fired under HTML5, due to HTTP range/partials

      - -
      - -
            if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {
      -        instanceOptions.whileloading.apply(s);
      -      }
      -
      -    };
      -
      -    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
      -
      -      var instanceOptions = s._iO,
      -          eqLeft;
      -
      -      if (isNaN(nPosition) || nPosition === null) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash safety net

      - -
      - -
              return false;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.

      - -
      - -
            s.position = Math.max(0, nPosition);
      -
      -      s._processOnPosition();
      -
      -      if (!s.isHTML5 && fV > 8) {
      -
      -        if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {
      -          s.peakData = {
      -            left: oPeakData.leftPeak,
      -            right: oPeakData.rightPeak
      -          };
      -        }
      -
      -        if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {
      -          s.waveformData = {
      -            left: oWaveformDataLeft.split(','),
      -            right: oWaveformDataRight.split(',')
      -          };
      -        }
      -
      -        if (instanceOptions.useEQData) {
      -          if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {
      -            eqLeft = oEQData.leftEQ.split(',');
      -            s.eqData = eqLeft;
      -            s.eqData.left = eqLeft;
      -            if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {
      -              s.eqData.right = oEQData.rightEQ.split(',');
      -            }
      -          }
      -        }
      -
      -      }
      -
      -      if (s.playState === 1) {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case/hack: ensure buffering is false if loading from cache (and not yet started)

      - -
      - -
              if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {
      -          s._onbufferchange(0);
      -        }
      -
      -        if (instanceOptions.whileplaying) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash may call after actual finish

      - -
      - -
                instanceOptions.whileplaying.apply(s);
      -        }
      -
      -      }
      -
      -      return true;
      -
      -    };
      -
      -    this._oncaptiondata = function(oData) {
      -
      -      /**
      -       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature
      -       *
      -       * @param {object} oData
      -       */
      -
      -      sm2._wD(s.id + ': Caption data received.');
      -
      -      s.captiondata = oData;
      -
      -      if (s._iO.oncaptiondata) {
      -        s._iO.oncaptiondata.apply(s, [oData]);
      -      }
      -
      -    };
      -
      -    this._onmetadata = function(oMDProps, oMDData) {
      -
      -      /**
      -       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature
      -       * RTMP may include song title, MovieStar content may include encoding info
      -       *
      -       * @param {array} oMDProps (names)
      -       * @param {array} oMDData (values)
      -       */
      -
      -      sm2._wD(s.id + ': Metadata received.');
      -
      -      var oData = {}, i, j;
      -
      -      for (i = 0, j = oMDProps.length; i < j; i++) {
      -        oData[oMDProps[i]] = oMDData[i];
      -      }
      -      s.metadata = oData;
      -
      -      if (s._iO.onmetadata) {
      -        s._iO.onmetadata.apply(s);
      -      }
      -
      -    };
      -
      -    this._onid3 = function(oID3Props, oID3Data) {
      -
      -      /**
      -       * internal: flash 8 + flash 9 ID3 feature
      -       * may include artist, song title etc.
      -       *
      -       * @param {array} oID3Props (names)
      -       * @param {array} oID3Data (values)
      -       */
      -
      -      sm2._wD(s.id + ': ID3 data received.');
      -
      -      var oData = [], i, j;
      -
      -      for (i = 0, j = oID3Props.length; i < j; i++) {
      -        oData[oID3Props[i]] = oID3Data[i];
      -      }
      -      s.id3 = mixin(s.id3, oData);
      -
      -      if (s._iO.onid3) {
      -        s._iO.onid3.apply(s);
      -      }
      -
      -    };
      - -
    • - - -
    • -
      - -
      - -
      -

      flash/RTMP-only

      - -
      - -
      -    this._onconnect = function(bSuccess) {
      -
      -      bSuccess = (bSuccess === 1);
      -      sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));
      -      s.connected = bSuccess;
      -
      -      if (bSuccess) {
      -
      -        s.failures = 0;
      -
      -        if (idCheck(s.id)) {
      -          if (s.getAutoPlay()) {
      - -
    • - - -
    • -
      - -
      - -
      -

      only update the play state if auto playing

      - -
      - -
                  s.play(_undefined, s.getAutoPlay());
      -          } else if (s._iO.autoLoad) {
      -            s.load();
      -          }
      -        }
      -
      -        if (s._iO.onconnect) {
      -          s._iO.onconnect.apply(s, [bSuccess]);
      -        }
      -
      -      }
      -
      -    };
      -
      -    this._ondataerror = function(sError) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash 9 wave/eq data handler -hack: called at start, and end from flash at/after onfinish()

      - -
      - -
            if (s.playState > 0) {
      -        sm2._wD(s.id + ': Data error: ' + sError);
      -        if (s._iO.ondataerror) {
      -          s._iO.ondataerror.apply(s);
      -        }
      -      }
      -
      -    };
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          this._debug();
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  }; // SMSound()
      -
      -  /**
      -   * Private SoundManager internals
      -   * ------------------------------
      -   */
      -
      -  getDocument = function() {
      -
      -    return (doc.body || doc.getElementsByTagName('div')[0]);
      -
      -  };
      -
      -  id = function(sID) {
      -
      -    return doc.getElementById(sID);
      -
      -  };
      -
      -  mixin = function(oMain, oAdd) {
      - -
    • - - -
    • -
      - -
      - -
      -

      non-destructive merge

      - -
      - -
          var o1 = (oMain || {}), o2, o;
      - -
    • - - -
    • -
      - -
      - -
      -

      if unspecified, o2 is the default options object

      - -
      - -
          o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);
      -
      -    for (o in o2) {
      -
      -      if (o2.hasOwnProperty(o) && o1[o] === _undefined) {
      -
      -        if (typeof o2[o] !== 'object' || o2[o] === null) {
      - -
    • - - -
    • -
      - -
      - -
      -

      assign directly

      - -
      - -
                o1[o] = o2[o];
      -
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      recurse through o2

      - -
      - -
                o1[o] = mixin(o1[o], o2[o]);
      -
      -        }
      -
      -      }
      -
      -    }
      -
      -    return o1;
      -
      -  };
      -
      -  wrapCallback = function(oSound, callback) {
      -
      -    /**
      -     * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue
      -     * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).
      -     * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.
      -     * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.
      -     * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player
      -     */
      -    if (!oSound.isHTML5 && fV === 8) {
      -      window.setTimeout(callback, 0);
      -    } else {
      -      callback();
      -    }
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      additional soundManager properties that soundManager.setup() will accept

      - -
      - -
      -  extraOptions = {
      -    'onready': 1,
      -    'ontimeout': 1,
      -    'defaultOptions': 1,
      -    'flash9Options': 1,
      -    'movieStarOptions': 1
      -  };
      -
      -  assign = function(o, oParent) {
      -
      -    /**
      -     * recursive assignment of properties, soundManager.setup() helper
      -     * allows property assignment based on whitelist
      -     */
      -
      -    var i,
      -        result = true,
      -        hasParent = (oParent !== _undefined),
      -        setupOptions = sm2.setupOptions,
      -        bonusOptions = extraOptions;
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
    • - - -
    • -
      - -
      - -
      -

      if soundManager.setup() called, show accepted parameters.

      - -
      - -
      -    if (o === _undefined) {
      -
      -      result = [];
      -
      -      for (i in setupOptions) {
      -
      -        if (setupOptions.hasOwnProperty(i)) {
      -          result.push(i);
      -        }
      -
      -      }
      -
      -      for (i in bonusOptions) {
      -
      -        if (bonusOptions.hasOwnProperty(i)) {
      -
      -          if (typeof sm2[i] === 'object') {
      -
      -            result.push(i+': {...}');
      -
      -          } else if (sm2[i] instanceof Function) {
      -
      -            result.push(i+': function() {...}');
      -
      -          } else {
      -
      -            result.push(i);
      -
      -          }
      -
      -        }
      -
      -      }
      -
      -      sm2._wD(str('setup', result.join(', ')));
      -
      -      return false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    for (i in o) {
      -
      -      if (o.hasOwnProperty(i)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if not an {object} we want to recurse through...

      - -
      - -
      -        if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {
      - -
    • - - -
    • -
      - -
      - -
      -

      check "allowed" options

      - -
      - -
      -          if (hasParent && bonusOptions[oParent] !== _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }

      - -
      - -
                  sm2[oParent][i] = o[i];
      -
      -          } else if (setupOptions[i] !== _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: assign to setupOptions object, which soundManager property references

      - -
      - -
                  sm2.setupOptions[i] = o[i];
      - -
    • - - -
    • -
      - -
      - -
      -

      assign directly to soundManager, too

      - -
      - -
                  sm2[i] = o[i];
      -
      -          } else if (bonusOptions[i] === _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      invalid or disallowed parameter. complain.

      - -
      - -
                  complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);
      -
      -            result = false;
      -
      -          } else {
      -
      -            /**
      -             * valid extraOptions (bonusOptions) parameter.
      -             * is it a method, like onready/ontimeout? call it.
      -             * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});
      -             */
      -
      -            if (sm2[i] instanceof Function) {
      -
      -              sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]]));
      -
      -            } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      good old-fashioned direct assignment

      - -
      - -
                    sm2[i] = o[i];
      -
      -            }
      -
      -          }
      -
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      recursion case, eg., { defaultOptions: { ... } }

      - -
      - -
      -          if (bonusOptions[i] === _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      invalid or disallowed parameter. complain.

      - -
      - -
                  complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);
      -
      -            result = false;
      -
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      recurse through object

      - -
      - -
                  return assign(o[i], i);
      -
      -          }
      -
      -        }
      -
      -      }
      -
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  function preferFlashCheck(kind) {
      - -
    • - - -
    • -
      - -
      - -
      -

      whether flash should play a given type

      - -
      - -
          return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));
      -
      -  }
      -
      -  /**
      -   * Internal DOM2-level event helpers
      -   * ---------------------------------
      -   */
      -
      -  event = (function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      normalize event methods

      - -
      - -
          var old = (window.attachEvent),
      -    evt = {
      -      add: (old?'attachEvent':'addEventListener'),
      -      remove: (old?'detachEvent':'removeEventListener')
      -    };
      - -
    • - - -
    • -
      - -
      - -
      -

      normalize "on" event prefix, optional capture argument

      - -
      - -
          function getArgs(oArgs) {
      -
      -      var args = slice.call(oArgs),
      -          len = args.length;
      -
      -      if (old) {
      - -
    • - - -
    • -
      - -
      - -
      -

      prefix

      - -
      - -
              args[1] = 'on' + args[1];
      -        if (len > 3) {
      - -
    • - - -
    • -
      - -
      - -
      -

      no capture

      - -
      - -
                args.pop();
      -        }
      -      } else if (len === 3) {
      -        args.push(false);
      -      }
      -
      -      return args;
      -
      -    }
      -
      -    function apply(args, sType) {
      - -
    • - - -
    • -
      - -
      - -
      -

      normalize and call the event method, with the proper arguments

      - -
      - -
            var element = args.shift(),
      -          method = [evt[sType]];
      -
      -      if (old) {
      - -
    • - - -
    • -
      - -
      - -
      -

      old IE can't do apply().

      - -
      - -
              element[method](args[0], args[1]);
      -      } else {
      -        element[method].apply(element, args);
      -      }
      -
      -    }
      -
      -    function add() {
      -
      -      apply(getArgs(arguments), 'add');
      -
      -    }
      -
      -    function remove() {
      -
      -      apply(getArgs(arguments), 'remove');
      -
      -    }
      -
      -    return {
      -      'add': add,
      -      'remove': remove
      -    };
      -
      -  }());
      -
      -  /**
      -   * Internal HTML5 event handling
      -   * -----------------------------
      -   */
      -
      -  function html5_event(oFn) {
      - -
    • - - -
    • -
      - -
      - -
      -

      wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds

      - -
      - -
      -    return function(e) {
      -
      -      var s = this._s,
      -          result;
      -
      -      if (!s || !s._a) {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
              if (s && s.id) {
      -          sm2._wD(s.id + ': Ignoring ' + e.type);
      -        } else {
      -          sm2._wD(h5 + 'Ignoring ' + e.type);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
              result = null;
      -      } else {
      -        result = oFn.call(this, e);
      -      }
      -
      -      return result;
      -
      -    };
      -
      -  }
      -
      -  html5_events = {
      - -
    • - - -
    • -
      - -
      - -
      -

      HTML5 event-name-to-handler map

      - -
      - -
      -    abort: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': abort');
      -
      -    }),
      - -
    • - - -
    • -
      - -
      - -
      -

      enough has loaded to play

      - -
      - -
      -    canplay: html5_event(function() {
      -
      -      var s = this._s,
      -          position1K;
      -
      -      if (s._html5_canplay) {
      - -
    • - - -
    • -
      - -
      - -
      -

      this event has already fired. ignore.

      - -
      - -
              return true;
      -      }
      -
      -      s._html5_canplay = true;
      -      sm2._wD(s.id + ': canplay');
      -      s._onbufferchange(0);
      - -
    • - - -
    • -
      - -
      - -
      -

      position according to instance options

      - -
      - -
            position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null);
      - -
    • - - -
    • -
      - -
      - -
      -

      set the position if position was set before the sound loaded

      - -
      - -
            if (s.position && this.currentTime !== position1K) {
      -        sm2._wD(s.id + ': canplay: Setting position to ' + position1K);
      -        try {
      -          this.currentTime = position1K;
      -        } catch(ee) {
      -          sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);
      -        }
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      hack for HTML5 from/to case

      - -
      - -
            if (s._iO._oncanplay) {
      -        s._iO._oncanplay();
      -      }
      -
      -    }),
      -
      -    canplaythrough: html5_event(function() {
      -
      -      var s = this._s;
      -
      -      if (!s.loaded) {
      -        s._onbufferchange(0);
      -        s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());
      -        s._onload(true);
      -      }
      -
      -    }),
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: Reserved for potential use

      - -
      - -
          /*
      -    emptied: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': emptied');
      -
      -    }),
      -    */
      -
      -    ended: html5_event(function() {
      -
      -      var s = this._s;
      -
      -      sm2._wD(s.id + ': ended');
      -
      -      s._onfinish();
      -
      -    }),
      -
      -    error: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code);
      -      /**
      -       * HTML5 error codes, per W3C
      -       * Error 1: Client aborted download at user's request.
      -       * Error 2: Network error after load started.
      -       * Error 3: Decoding issue.
      -       * Error 4: Media (audio file) not supported.
      -       * Reference: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#error-codes
      -       */
      - -
    • - - -
    • -
      - -
      - -
      -

      call load with error state?

      - -
      - -
            this._s._onload(false);
      -
      -    }),
      -
      -    loadeddata: html5_event(function() {
      -
      -      var s = this._s;
      -
      -      sm2._wD(s.id + ': loadeddata');
      - -
    • - - -
    • -
      - -
      - -
      -

      safari seems to nicely report progress events, eventually totalling 100%

      - -
      - -
            if (!s._loaded && !isSafari) {
      -        s.duration = s._get_html5_duration();
      -      }
      -
      -    }),
      -
      -    loadedmetadata: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': loadedmetadata');
      -
      -    }),
      -
      -    loadstart: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': loadstart');
      - -
    • - - -
    • -
      - -
      - -
      -

      assume buffering at first

      - -
      - -
            this._s._onbufferchange(1);
      -
      -    }),
      -
      -    play: html5_event(function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD(this._s.id + ': play()'); -once play starts, no buffering

      - -
      - -
            this._s._onbufferchange(0);
      -
      -    }),
      -
      -    playing: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': playing');
      - -
    • - - -
    • -
      - -
      - -
      -

      once play starts, no buffering

      - -
      - -
            this._s._onbufferchange(0);
      -
      -    }),
      -
      -    progress: html5_event(function(e) {
      - -
    • - - -
    • -
      - -
      - -
      -

      note: can fire repeatedly after "loaded" event, due to use of HTTP range/partials

      - -
      - -
      -      var s = this._s,
      -          i, j, progStr, buffered = 0,
      -          isProgress = (e.type === 'progress'),
      -          ranges = e.target.buffered,
      - -
    • - - -
    • -
      - -
      - -
      -

      firefox 3.6 implements e.loaded/total (bytes)

      - -
      - -
                loaded = (e.loaded||0),
      -          total = (e.total||1);
      - -
    • - - -
    • -
      - -
      - -
      -

      reset the "buffered" (loaded byte ranges) array

      - -
      - -
            s.buffered = [];
      -
      -      if (ranges && ranges.length) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if loaded is 0, try TimeRanges implementation as % of load -https://developer.mozilla.org/en/DOM/TimeRanges

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      re-build "buffered" array -HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.

      - -
      - -
              for (i=0, j=ranges.length; i<j; i++) {
      -          s.buffered.push({
      -            'start': ranges.start(i) * msecScale,
      -            'end': ranges.end(i) * msecScale
      -          });
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      use the last value locally

      - -
      - -
              buffered = (ranges.end(0) - ranges.start(0)) * msecScale;
      - -
    • - - -
    • -
      - -
      - -
      -

      linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges

      - -
      - -
              loaded = Math.min(1, buffered/(e.target.duration*msecScale));
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
              if (isProgress && ranges.length > 1) {
      -          progStr = [];
      -          j = ranges.length;
      -          for (i=0; i<j; i++) {
      -            progStr.push(e.target.buffered.start(i)*msecScale +'-'+ e.target.buffered.end(i)*msecScale);
      -          }
      -          sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));
      -        }
      -
      -        if (isProgress && !isNaN(loaded)) {
      -          sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded*100) + '% loaded');
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      }
      -
      -      if (!isNaN(loaded)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if progress, likely not buffering

      - -
      - -
              s._onbufferchange(0);
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: prevent calls with duplicate values.

      - -
      - -
              s._whileloading(loaded, total, s._get_html5_duration());
      -        if (loaded && total && loaded === total) {
      - -
    • - - -
    • -
      - -
      - -
      -

      in case "onload" doesn't fire (eg. gecko 1.9.2)

      - -
      - -
                html5_events.canplaythrough.call(this, e);
      -        }
      -
      -      }
      -
      -    }),
      -
      -    ratechange: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': ratechange');
      -
      -    }),
      -
      -    suspend: html5_event(function(e) {
      - -
    • - - -
    • -
      - -
      - -
      -

      download paused/stopped, may have finished (eg. onload)

      - -
      - -
            var s = this._s;
      -
      -      sm2._wD(this._s.id + ': suspend');
      -      html5_events.progress.call(this, e);
      -      s._onsuspend();
      -
      -    }),
      -
      -    stalled: html5_event(function() {
      -
      -      sm2._wD(this._s.id + ': stalled');
      -
      -    }),
      -
      -    timeupdate: html5_event(function() {
      -
      -      this._s._onTimer();
      -
      -    }),
      -
      -    waiting: html5_event(function() {
      -
      -      var s = this._s;
      - -
    • - - -
    • -
      - -
      - -
      -

      see also: seeking

      - -
      - -
            sm2._wD(this._s.id + ': waiting');
      - -
    • - - -
    • -
      - -
      - -
      -

      playback faster than download rate, etc.

      - -
      - -
            s._onbufferchange(1);
      -
      -    })
      -
      -  };
      -
      -  html5OK = function(iO) {
      - -
    • - - -
    • -
      - -
      - -
      -

      playability test based on URL or MIME type

      - -
      - -
      -    var result;
      -
      -    if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      nothing to check

      - -
      - -
            result = false;
      -
      -    } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {
      - -
    • - - -
    • -
      - -
      - -
      -

      RTMP, or preferring flash

      - -
      - -
            result = false;
      -
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er

      - -
      - -
            result = ((iO.type ? html5CanPlay({type:iO.type}) : html5CanPlay({url:iO.url}) || sm2.html5Only || iO.url.match(/data\:/i)));
      -
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  html5Unload = function(oAudio) {
      -
      -    /**
      -     * Internal method: Unload media, and cancel any current/pending network requests.
      -     * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.
      -     * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
      -     * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.
      -     * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.
      -     */
      -
      -    var url;
      -
      -    if (oAudio) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME. -Desktop Safari complains / fails on data: URI, so it gets about:blank.

      - -
      - -
            url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));
      -
      -      oAudio.src = url;
      - -
    • - - -
    • -
      - -
      - -
      -

      reset some state, too

      - -
      - -
            if (oAudio._called_unload !== undefined) {
      -        oAudio._called_load = false;
      -      }
      -
      -    }
      -
      -    if (useGlobalHTML5Audio) {
      - -
    • - - -
    • -
      - -
      - -
      -

      ensure URL state is trashed, also

      - -
      - -
            lastGlobalHTML5URL = null;
      -
      -    }
      -
      -    return url;
      -
      -  };
      -
      -  html5CanPlay = function(o) {
      -
      -    /**
      -     * Try to find MIME, test and return truthiness
      -     * o = {
      -     *  url: '/path/to/an.mp3',
      -     *  type: 'audio/mp3'
      -     * }
      -     */
      -
      -    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {
      -      return false;
      -    }
      -
      -    var url = (o.url || null),
      -        mime = (o.type || null),
      -        aF = sm2.audioFormats,
      -        result,
      -        offset,
      -        fileExt,
      -        item;
      - -
    • - - -
    • -
      - -
      - -
      -

      account for known cases like audio/mp3

      - -
      - -
      -    if (mime && sm2.html5[mime] !== _undefined) {
      -      return (sm2.html5[mime] && !preferFlashCheck(mime));
      -    }
      -
      -    if (!html5Ext) {
      -      html5Ext = [];
      -      for (item in aF) {
      -        if (aF.hasOwnProperty(item)) {
      -          html5Ext.push(item);
      -          if (aF[item].related) {
      -            html5Ext = html5Ext.concat(aF[item].related);
      -          }
      -        }
      -      }
      -      html5Ext = new RegExp('\\.('+html5Ext.join('|')+')(\\?.*)?$','i');
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: Strip URL queries, etc.

      - -
      - -
          fileExt = (url ? url.toLowerCase().match(html5Ext) : null);
      -
      -    if (!fileExt || !fileExt.length) {
      -      if (!mime) {
      -        result = false;
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      audio/mp3 -> mp3, result should be known

      - -
      - -
              offset = mime.indexOf(';');
      - -
    • - - -
    • -
      - -
      - -
      -

      strip "audio/X; codecs..."

      - -
      - -
              fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6);
      -      }
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      match the raw extension name - "mp3", for example

      - -
      - -
            fileExt = fileExt[1];
      -    }
      -
      -    if (fileExt && sm2.html5[fileExt] !== _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      result known

      - -
      - -
            result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));
      -    } else {
      -      mime = 'audio/'+fileExt;
      -      result = sm2.html5.canPlayType({type:mime});
      -      sm2.html5[fileExt] = result;
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD('canPlayType, found result: ' + result);

      - -
      - -
            result = (result && sm2.html5[mime] && !preferFlashCheck(mime));
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  testHTML5 = function() {
      -
      -    /**
      -     * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on
      -     * assigns results to html5[] and flash[].
      -     */
      -
      -    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      without HTML5, we need Flash.

      - -
      - -
            sm2.html5.usingFlash = true;
      -      needsFlash = true;
      -      return false;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/

      - -
      - -
          var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),
      -        item, lookup, support = {}, aF, i;
      -
      -    function cp(m) {
      -
      -      var canPlay, j,
      -          result = false,
      -          isOK = false;
      -
      -      if (!a || typeof a.canPlayType !== 'function') {
      -        return result;
      -      }
      -
      -      if (m instanceof Array) {
      - -
    • - - -
    • -
      - -
      - -
      -

      iterate through all mime types, return any successes

      - -
      - -
              for (i=0, j=m.length; i<j; i++) {
      -          if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {
      -            isOK = true;
      -            sm2.html5[m[i]] = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      note flash support, too

      - -
      - -
                  sm2.flash[m[i]] = !!(m[i].match(flashMIME));
      -          }
      -        }
      -        result = isOK;
      -      } else {
      -        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
      -        result = !!(canPlay && (canPlay.match(sm2.html5Test)));
      -      }
      -
      -      return result;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      test all registered formats + codecs

      - -
      - -
      -    aF = sm2.audioFormats;
      -
      -    for (item in aF) {
      -
      -      if (aF.hasOwnProperty(item)) {
      -
      -        lookup = 'audio/' + item;
      -
      -        support[item] = cp(aF[item].type);
      - -
    • - - -
    • -
      - -
      - -
      -

      write back generic type too, eg. audio/mp3

      - -
      - -
              support[lookup] = support[item];
      - -
    • - - -
    • -
      - -
      - -
      -

      assign flash

      - -
      - -
              if (item.match(flashMIME)) {
      -
      -          sm2.flash[item] = true;
      -          sm2.flash[lookup] = true;
      -
      -        } else {
      -
      -          sm2.flash[item] = false;
      -          sm2.flash[lookup] = false;
      -
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      assign result to related formats, too

      - -
      - -
      -        if (aF[item] && aF[item].related) {
      -
      -          for (i=aF[item].related.length-1; i >= 0; i--) {
      - -
    • - - -
    • -
      - -
      - -
      -

      eg. audio/m4a

      - -
      - -
                  support['audio/'+aF[item].related[i]] = support[item];
      -            sm2.html5[aF[item].related[i]] = support[item];
      -            sm2.flash[aF[item].related[i]] = support[item];
      -
      -          }
      -
      -        }
      -
      -      }
      -
      -    }
      -
      -    support.canPlayType = (a?cp:null);
      -    sm2.html5 = mixin(sm2.html5, support);
      -
      -    sm2.html5.usingFlash = featureCheck();
      -    needsFlash = sm2.html5.usingFlash;
      -
      -    return true;
      -
      -  };
      -
      -  strings = {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          notReady: 'Unavailable - wait until onready() has fired.',
      -    notOK: 'Audio support is not available.',
      -    domError: sm + 'exception caught while appending SWF to DOM.',
      -    spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',
      -    swf404: smc + 'Verify that %s is a valid path.',
      -    tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',
      -    checkSWF: 'See SWF output for more debug info.',
      -    localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',
      -    waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',
      -    waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',
      -    waitSWF: smc + 'Waiting for 100% SWF load...',
      -    needFunction: smc + 'Function object expected for %s',
      -    badID: 'Sound ID "%s" should be a string, starting with a non-numeric character',
      -    currentObj: smc + '_debug(): Current sound objects',
      -    waitOnload: smc + 'Waiting for window.onload()',
      -    docLoaded: smc + 'Document already loaded',
      -    onload: smc + 'initComplete(): calling soundManager.onload()',
      -    onloadOK: sm + '.onload() complete',
      -    didInit: smc + 'init(): Already called?',
      -    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',
      -    badRemove: smc + 'Failed to remove Flash node.',
      -    shutdown: sm + '.disable(): Shutting down',
      -    queue: smc + 'Queueing %s handler',
      -    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',
      -    fbTimeout: 'No flash response, applying .'+swfCSS.swfTimedout+' CSS...',
      -    fbLoaded: 'Flash loaded',
      -    fbHandler: smc + 'flashBlockHandler()',
      -    manURL: 'SMSound.load(): Using manually-assigned URL',
      -    onURL: sm + '.load(): current URL already assigned.',
      -    badFV: sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',
      -    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',
      -    noNSLoop: 'Note: Looping not implemented for MovieStar formats',
      -    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',
      -    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',
      -    needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',
      -    gotFocus: smc + 'Got window focus.',
      -    policy: 'Enabling usePolicyFile for data access',
      -    setup: sm + '.setup(): allowed parameters: %s',
      -    setupError: sm + '.setup(): "%s" cannot be assigned with this method.',
      -    setupUndef: sm + '.setup(): Could not find option "%s"',
      -    setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',
      -    noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',
      -    sm2Loaded: 'SoundManager 2: Ready.',
      -    reset: sm + '.reset(): Removing event callbacks',
      -    mobileUA: 'Mobile UA detected, preferring HTML5 by default.',
      -    globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.'
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  str = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      internal string replace helper. -arguments: o [,items to replace]

      - - -
      - -
      -    var args,
      -        i, j, o,
      -        sstr;
      - -
    • - - -
    • -
      - -
      - -
      -

      real array, please

      - -
      - -
          args = slice.call(arguments);
      - -
    • - - -
    • -
      - -
      - -
      -

      first argument

      - -
      - -
          o = args.shift();
      -
      -    sstr = (strings && strings[o] ? strings[o] : '');
      -
      -    if (sstr && args && args.length) {
      -      for (i = 0, j = args.length; i < j; i++) {
      -        sstr = sstr.replace('%s', args[i]);
      -      }
      -    }
      -
      -    return sstr;
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  loopFix = function(sOpt) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash 8 requires stream = false for looping to work

      - -
      - -
          if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {
      -      _wDS('as2loop');
      -      sOpt.stream = false;
      -    }
      -
      -    return sOpt;
      -
      -  };
      -
      -  policyFix = function(sOpt, sPre) {
      -
      -    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
      -      sm2._wD((sPre || '') + str('policy'));
      -      sOpt.usePolicyFile = true;
      -    }
      -
      -    return sOpt;
      -
      -  };
      -
      -  complain = function(sMsg) {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          if (hasConsole && console.warn !== _undefined) {
      -      console.warn(sMsg);
      -    } else {
      -      sm2._wD(sMsg);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  doNothing = function() {
      -
      -    return false;
      -
      -  };
      -
      -  disableObject = function(o) {
      -
      -    var oProp;
      -
      -    for (oProp in o) {
      -      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
      -        o[oProp] = doNothing;
      -      }
      -    }
      -
      -    oProp = null;
      -
      -  };
      -
      -  failSafely = function(bNoDisable) {
      - -
    • - - -
    • -
      - -
      - -
      -

      general failure exception handler

      - -
      - -
      -    if (bNoDisable === _undefined) {
      -      bNoDisable = false;
      -    }
      -
      -    if (disabled || bNoDisable) {
      -      sm2.disable(bNoDisable);
      -    }
      -
      -  };
      -
      -  normalizeMovieURL = function(smURL) {
      -
      -    var urlParams = null, url;
      -
      -    if (smURL) {
      -      if (smURL.match(/\.swf(\?.*)?$/i)) {
      -        urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
      -        if (urlParams) {
      - -
    • - - -
    • -
      - -
      - -
      -

      assume user knows what they're doing

      - -
      - -
                return smURL;
      -        }
      -      } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
      - -
    • - - -
    • -
      - -
      - -
      -

      append trailing slash, if needed

      - -
      - -
              smURL += '/';
      -      }
      -    }
      -
      -    url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;
      -
      -    if (sm2.noSWFCache) {
      -      url += ('?ts=' + new Date().getTime());
      -    }
      -
      -    return url;
      -
      -  };
      -
      -  setVersionInfo = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      short-hand for internal use

      - -
      - -
      -    fV = parseInt(sm2.flashVersion, 10);
      -
      -    if (fV !== 8 && fV !== 9) {
      -      sm2._wD(str('badFV', fV, defaultFlashVersion));
      -      sm2.flashVersion = fV = defaultFlashVersion;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      debug flash movie, if applicable

      - -
      - -
      -    var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf');
      -
      -    if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {
      -      sm2._wD(str('needfl9'));
      -      sm2.flashVersion = fV = 9;
      -    }
      -
      -    sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
      - -
    • - - -
    • -
      - -
      - -
      -

      set up default options

      - -
      - -
          if (fV > 8) {
      - -
    • - - -
    • -
      - -
      - -
      -

      +flash 9 base options

      - -
      - -
            sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);
      -      sm2.features.buffering = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      +moviestar support

      - -
      - -
            sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);
      -      sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
      -      sm2.features.movieStar = true;
      -    } else {
      -      sm2.features.movieStar = false;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      regExp for flash canPlay(), etc.

      - -
      - -
          sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')];
      - -
    • - - -
    • -
      - -
      - -
      -

      if applicable, use _debug versions of SWFs

      - -
      - -
          sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug);
      -
      -    sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);
      -
      -  };
      -
      -  setPolling = function(bPolling, bHighPerformance) {
      -
      -    if (!flash) {
      -      return false;
      -    }
      -
      -    flash._setPolling(bPolling, bHighPerformance);
      -
      -  };
      -
      -  initDebug = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      starts debug mode, creating output

      for UAs without console object

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      allow force of debug mode via URL

      - - -
      - -
          if (sm2.debugURLParam.test(wl)) {
      -      sm2.debugMode = true;
      -    }
      -
      -    if (id(sm2.debugID)) {
      -      return false;
      -    }
      -
      -    var oD, oDebug, oTarget, oToggle, tmp;
      -
      -    if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {
      -
      -      oD = doc.createElement('div');
      -      oD.id = sm2.debugID + '-toggle';
      -
      -      oToggle = {
      -        'position': 'fixed',
      -        'bottom': '0px',
      -        'right': '0px',
      -        'width': '1.2em',
      -        'height': '1.2em',
      -        'lineHeight': '1.2em',
      -        'margin': '2px',
      -        'textAlign': 'center',
      -        'border': '1px solid #999',
      -        'cursor': 'pointer',
      -        'background': '#fff',
      -        'color': '#333',
      -        'zIndex': 10001
      -      };
      -
      -      oD.appendChild(doc.createTextNode('-'));
      -      oD.onclick = toggleDebug;
      -      oD.title = 'Toggle SM2 debug console';
      -
      -      if (ua.match(/msie 6/i)) {
      -        oD.style.position = 'absolute';
      -        oD.style.cursor = 'hand';
      -      }
      -
      -      for (tmp in oToggle) {
      -        if (oToggle.hasOwnProperty(tmp)) {
      -          oD.style[tmp] = oToggle[tmp];
      -        }
      -      }
      -
      -      oDebug = doc.createElement('div');
      -      oDebug.id = sm2.debugID;
      -      oDebug.style.display = (sm2.debugMode?'block':'none');
      -
      -      if (sm2.debugMode && !id(oD.id)) {
      -        try {
      -          oTarget = getDocument();
      -          oTarget.appendChild(oD);
      -        } catch(e2) {
      -          throw new Error(str('domError')+' \n'+e2.toString());
      -        }
      -        oTarget.appendChild(oDebug);
      -      }
      -
      -    }
      -
      -    oTarget = null;
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  idCheck = this.getSoundById;
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
        _wDS = function(o, errorLevel) {
      -
      -    return (!o ? '' : sm2._wD(str(o), errorLevel));
      -
      -  };
      -
      -  toggleDebug = function() {
      -
      -    var o = id(sm2.debugID),
      -    oT = id(sm2.debugID + '-toggle');
      -
      -    if (!o) {
      -      return false;
      -    }
      -
      -    if (debugOpen) {
      - -
    • - - -
    • -
      - -
      - -
      -

      minimize

      - -
      - -
            oT.innerHTML = '+';
      -      o.style.display = 'none';
      -    } else {
      -      oT.innerHTML = '-';
      -      o.style.display = 'block';
      -    }
      -
      -    debugOpen = !debugOpen;
      -
      -  };
      -
      -  debugTS = function(sEventType, bSuccess, sMessage) {
      - -
    • - - -
    • -
      - -
      - -
      -

      troubleshooter debug hooks

      - -
      - -
      -    if (window.sm2Debugger !== _undefined) {
      -      try {
      -        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);
      -      } catch(e) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
              return false;
      -      }
      -    }
      -
      -    return true;
      -
      -  };
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  getSWFCSS = function() {
      -
      -    var css = [];
      -
      -    if (sm2.debugMode) {
      -      css.push(swfCSS.sm2Debug);
      -    }
      -
      -    if (sm2.debugFlash) {
      -      css.push(swfCSS.flashDebug);
      -    }
      -
      -    if (sm2.useHighPerformance) {
      -      css.push(swfCSS.highPerf);
      -    }
      -
      -    return css.join(' ');
      -
      -  };
      -
      -  flashBlockHandler = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      possible flash block situation.

      - -
      - -
      -    var name = str('fbHandler'),
      -        p = sm2.getMoviePercent(),
      -        css = swfCSS,
      -        error = {type:'FLASHBLOCK'};
      -
      -    if (sm2.html5Only) {
      - -
    • - - -
    • -
      - -
      - -
      -

      no flash, or unused

      - -
      - -
            return false;
      -    }
      -
      -    if (!sm2.ok()) {
      -
      -      if (needsFlash) {
      - -
    • - - -
    • -
      - -
      - -
      -

      make the movie more visible, so user can fix

      - -
      - -
              sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
      -        sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));
      -      }
      -
      -      sm2.didFlashBlock = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      fire onready(), complain lightly

      - -
      - -
            processOnEvents({type:'ontimeout', ignoreInit:true, error:error});
      -      catchError(error);
      -
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      SM2 loaded OK (or recovered)

      - -
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (sm2.didFlashBlock) {
      -        sm2._wD(name + ': Unblocked');
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      if (sm2.oMC) {
      -        sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
      -      }
      -
      -    }
      -
      -  };
      -
      -  addOnEvent = function(sType, oMethod, oScope) {
      -
      -    if (on_queue[sType] === _undefined) {
      -      on_queue[sType] = [];
      -    }
      -
      -    on_queue[sType].push({
      -      'method': oMethod,
      -      'scope': (oScope || null),
      -      'fired': false
      -    });
      -
      -  };
      -
      -  processOnEvents = function(oOptions) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if unspecified, assume OK/error

      - -
      - -
      -    if (!oOptions) {
      -      oOptions = {
      -        type: (sm2.ok() ? 'onready' : 'ontimeout')
      -      };
      -    }
      -
      -    if (!didInit && oOptions && !oOptions.ignoreInit) {
      - -
    • - - -
    • -
      - -
      - -
      -

      not ready yet.

      - -
      - -
            return false;
      -    }
      -
      -    if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) {
      - -
    • - - -
    • -
      - -
      - -
      -

      invalid case

      - -
      - -
            return false;
      -    }
      -
      -    var status = {
      -          success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled)
      -        },
      - -
    • - - -
    • -
      - -
      - -
      -

      queue specified by type, or none

      - -
      - -
              srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]),
      -
      -        queue = [], i, j,
      -        args = [status],
      -        canRetry = (needsFlash && !sm2.ok());
      -
      -    if (oOptions.error) {
      -      args[0].error = oOptions.error;
      -    }
      -
      -    for (i = 0, j = srcQueue.length; i < j; i++) {
      -      if (srcQueue[i].fired !== true) {
      -        queue.push(srcQueue[i]);
      -      }
      -    }
      -
      -    if (queue.length) {
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));

      - -
      - -
            for (i = 0, j = queue.length; i < j; i++) {
      -        if (queue[i].scope) {
      -          queue[i].method.apply(queue[i].scope, args);
      -        } else {
      -          queue[i].method.apply(this, args);
      -        }
      -        if (!canRetry) {
      - -
    • - - -
    • -
      - -
      - -
      -

      useFlashBlock and SWF timeout case doesn't count here.

      - -
      - -
                queue[i].fired = true;
      -        }
      -      }
      -    }
      -
      -    return true;
      -
      -  };
      -
      -  initUserOnload = function() {
      -
      -    window.setTimeout(function() {
      -
      -      if (sm2.useFlashBlock) {
      -        flashBlockHandler();
      -      }
      -
      -      processOnEvents();
      - -
    • - - -
    • -
      - -
      - -
      -

      call user-defined "onload", scoped to window

      - -
      - -
      -      if (typeof sm2.onload === 'function') {
      -        _wDS('onload', 1);
      -        sm2.onload.apply(window);
      -        _wDS('onloadOK', 1);
      -      }
      -
      -      if (sm2.waitForWindowLoad) {
      -        event.add(window, 'load', initUserOnload);
      -      }
      -
      -    },1);
      -
      -  };
      -
      -  detectFlash = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt

      - -
      - -
      -    if (hasFlash !== _undefined) {
      - -
    • - - -
    • -
      - -
      - -
      -

      this work has already been done.

      - -
      - -
            return hasFlash;
      -    }
      -
      -    var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject;
      -
      -    if (nP && nP.length) {
      -      type = 'application/x-shockwave-flash';
      -      types = n.mimeTypes;
      -      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
      -        hasPlugin = true;
      -      }
      -    } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.

      - -
      - -
            try {
      -        obj = new AX('ShockwaveFlash.ShockwaveFlash');
      -      } catch(e) {
      - -
    • - - -
    • -
      - -
      - -
      -

      oh well

      - -
      - -
              obj = null;
      -      }
      -      hasPlugin = (!!obj);
      - -
    • - - -
    • -
      - -
      - -
      -

      cleanup, because it is ActiveX after all

      - -
      - -
            obj = null;
      -    }
      -
      -    hasFlash = hasPlugin;
      -
      -    return hasPlugin;
      -
      -  };
      -
      -  featureCheck = function() {
      -
      -    var flashNeeded,
      -        item,
      -        formats = sm2.audioFormats,
      - -
    • - - -
    • -
      - -
      - -
      -

      iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.

      - -
      - -
              isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i)));
      -
      -    if (isSpecial) {
      - -
    • - - -
    • -
      - -
      - -
      -

      has Audio(), but is broken; let it load links directly.

      - -
      - -
            sm2.hasHTML5 = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      ignore flash case, however

      - -
      - -
            sm2.html5Only = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      hide the SWF, if present

      - -
      - -
            if (sm2.oMC) {
      -        sm2.oMC.style.display = 'none';
      -      }
      -
      -    } else {
      -
      -      if (sm2.useHTML5Audio) {
      -
      -        if (!sm2.html5 || !sm2.html5.canPlayType) {
      -          sm2._wD('SoundManager: No HTML5 Audio() support detected.');
      -          sm2.hasHTML5 = false;
      -        }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
              if (isBadSafari) {
      -          sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ?' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      }
      -
      -    }
      -
      -    if (sm2.useHTML5Audio && sm2.hasHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      sort out whether flash is optional, required or can be ignored.

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      innocent until proven guilty.

      - -
      - -
            canIgnoreFlash = true;
      -
      -      for (item in formats) {
      -        if (formats.hasOwnProperty(item)) {
      -          if (formats[item].required) {
      -            if (!sm2.html5.canPlayType(formats[item].type)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      100% HTML5 mode is not possible.

      - -
      - -
                    canIgnoreFlash = false;
      -              flashNeeded = true;
      -            } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash may be required, or preferred for this format.

      - -
      - -
                    flashNeeded = true;
      -            }
      -          }
      -        }
      -      }
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      sanity check...

      - -
      - -
          if (sm2.ignoreFlash) {
      -      flashNeeded = false;
      -      canIgnoreFlash = true;
      -    }
      -
      -    sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);
      -
      -    return (!sm2.html5Only);
      -
      -  };
      -
      -  parseURL = function(url) {
      -
      -    /**
      -     * Internal: Finds and returns the first playable URL (or failing that, the first URL.)
      -     * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.
      -     */
      -
      -    var i, j, urlResult = 0, result;
      -
      -    if (url instanceof Array) {
      - -
    • - - -
    • -
      - -
      - -
      -

      find the first good one

      - -
      - -
            for (i=0, j=url.length; i<j; i++) {
      -
      -        if (url[i] instanceof Object) {
      - -
    • - - -
    • -
      - -
      - -
      -

      MIME check

      - -
      - -
                if (sm2.canPlayMIME(url[i].type)) {
      -            urlResult = i;
      -            break;
      -          }
      -
      -        } else if (sm2.canPlayURL(url[i])) {
      - -
    • - - -
    • -
      - -
      - -
      -

      URL string check

      - -
      - -
                urlResult = i;
      -          break;
      -        }
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      normalize to string

      - -
      - -
            if (url[urlResult].url) {
      -        url[urlResult] = url[urlResult].url;
      -      }
      -
      -      result = url[urlResult];
      -
      -    } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      single URL case

      - -
      - -
            result = url;
      -
      -    }
      -
      -    return result;
      -
      -  };
      -
      -
      -  startTimer = function(oSound) {
      -
      -    /**
      -     * attach a timer to this sound, and start an interval if needed
      -     */
      -
      -    if (!oSound._hasTimer) {
      -
      -      oSound._hasTimer = true;
      -
      -      if (!mobileHTML5 && sm2.html5PollingInterval) {
      -
      -        if (h5IntervalTimer === null && h5TimerCount === 0) {
      -
      -          h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);
      -
      -        }
      -
      -        h5TimerCount++;
      -
      -      }
      -
      -    }
      -
      -  };
      -
      -  stopTimer = function(oSound) {
      -
      -    /**
      -     * detach a timer
      -     */
      -
      -    if (oSound._hasTimer) {
      -
      -      oSound._hasTimer = false;
      -
      -      if (!mobileHTML5 && sm2.html5PollingInterval) {
      - -
    • - - -
    • -
      - -
      - -
      -

      interval will stop itself at next execution.

      - -
      - -
      -        h5TimerCount--;
      -
      -      }
      -
      -    }
      -
      -  };
      -
      -  timerExecute = function() {
      -
      -    /**
      -     * manual polling for HTML5 progress events, ie., whileplaying() (can achieve greater precision than conservative default HTML5 interval)
      -     */
      -
      -    var i;
      -
      -    if (h5IntervalTimer !== null && !h5TimerCount) {
      - -
    • - - -
    • -
      - -
      - -
      -

      no active timers, stop polling interval.

      - -
      - -
      -      clearInterval(h5IntervalTimer);
      -
      -      h5IntervalTimer = null;
      -
      -      return false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      check all HTML5 sounds with timers

      - -
      - -
      -    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      -
      -      if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {
      -
      -        sm2.sounds[sm2.soundIDs[i]]._onTimer();
      -
      -      }
      -
      -    }
      -
      -  };
      -
      -  catchError = function(options) {
      -
      -    options = (options !== _undefined ? options : {});
      -
      -    if (typeof sm2.onerror === 'function') {
      -      sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]);
      -    }
      -
      -    if (options.fatal !== _undefined && options.fatal) {
      -      sm2.disable();
      -    }
      -
      -  };
      -
      -  badSafariFix = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4

      - -
      - -
          if (!isBadSafari || !detectFlash()) {
      - -
    • - - -
    • -
      - -
      - -
      -

      doesn't apply

      - -
      - -
            return false;
      -    }
      -
      -    var aF = sm2.audioFormats, i, item;
      -
      -    for (item in aF) {
      -      if (aF.hasOwnProperty(item)) {
      -        if (item === 'mp3' || item === 'mp4') {
      -          sm2._wD(sm + ': Using flash fallback for ' + item + ' format');
      -          sm2.html5[item] = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      assign result to related formats, too

      - -
      - -
                if (aF[item] && aF[item].related) {
      -            for (i = aF[item].related.length-1; i >= 0; i--) {
      -              sm2.html5[aF[item].related[i]] = false;
      -            }
      -          }
      -        }
      -      }
      -    }
      -
      -  };
      -
      -  /**
      -   * Pseudo-private flash/ExternalInterface methods
      -   * ----------------------------------------------
      -   */
      -
      -  this._setSandboxType = function(sandboxType) {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          var sb = sm2.sandbox;
      -
      -    sb.type = sandboxType;
      -    sb.description = sb.types[(sb.types[sandboxType] !== _undefined?sandboxType:'unknown')];
      -
      -    if (sb.type === 'localWithFile') {
      -
      -      sb.noRemote = true;
      -      sb.noLocal = false;
      -      _wDS('secNote', 2);
      -
      -    } else if (sb.type === 'localWithNetwork') {
      -
      -      sb.noRemote = false;
      -      sb.noLocal = true;
      -
      -    } else if (sb.type === 'localTrusted') {
      -
      -      sb.noRemote = false;
      -      sb.noLocal = false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  this._externalInterfaceOK = function(swfVersion) {
      - -
    • - - -
    • -
      - -
      - -
      -

      flash callback confirming flash loaded, EI working etc. -swfVersion: SWF build string

      - -
      - -
      -    if (sm2.swfLoaded) {
      -      return false;
      -    }
      -
      -    var e;
      -
      -    debugTS('swf', true);
      -    debugTS('flashtojs', true);
      -    sm2.swfLoaded = true;
      -    tryInitOnFocus = false;
      -
      -    if (isBadSafari) {
      -      badSafariFix();
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      complain if JS + SWF build/version strings don't match, excluding +DEV builds

      - - -
      - -
          if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== sm2.versionNumber.replace(/\+dev/i, '')) {
      -
      -      e = sm + ': Fatal: JavaScript file build "' + sm2.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + sm2.url + '. Ensure both are up-to-date.';
      - -
    • - - -
    • -
      - -
      - -
      -

      escape flash -> JS stack so this error fires in window.

      - -
      - -
            setTimeout(function versionMismatch() {
      -        throw new Error(e);
      -      }, 0);
      - -
    • - - -
    • -
      - -
      - -
      -

      exit, init will fail with timeout

      - -
      - -
            return false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      IE needs a larger timeout

      - -
      - -
          setTimeout(init, isIE ? 100 : 1);
      -
      -  };
      -
      -  /**
      -   * Private initialization helpers
      -   * ------------------------------
      -   */
      -
      -  createMovie = function(smID, smURL) {
      -
      -    if (didAppend && appendSuccess) {
      - -
    • - - -
    • -
      - -
      - -
      -

      ignore if already succeeded

      - -
      - -
            return false;
      -    }
      -
      -    function initMsg() {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
      -      var options = [],
      -          title,
      -          msg = [],
      -          delimiter = ' + ';
      -
      -      title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');
      -
      -      if (!sm2.html5Only) {
      -
      -        if (sm2.preferFlash) {
      -          options.push('preferFlash');
      -        }
      -
      -        if (sm2.useHighPerformance) {
      -          options.push('useHighPerformance');
      -        }
      -
      -        if (sm2.flashPollingInterval) {
      -          options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');
      -        }
      -
      -        if (sm2.html5PollingInterval) {
      -          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');
      -        }
      -
      -        if (sm2.wmode) {
      -          options.push('wmode (' + sm2.wmode + ')');
      -        }
      -
      -        if (sm2.debugFlash) {
      -          options.push('debugFlash');
      -        }
      -
      -        if (sm2.useFlashBlock) {
      -          options.push('flashBlock');
      -        }
      -
      -      } else {
      -
      -        if (sm2.html5PollingInterval) {
      -          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');
      -        }
      -
      -      }
      -
      -      if (options.length) {
      -        msg = msg.concat([options.join(delimiter)]);
      -      }
      -
      -      sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);
      -
      -      showSupport();
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    }
      -
      -    if (sm2.html5Only) {
      - -
    • - - -
    • -
      - -
      - -
      -

      100% HTML5 mode

      - -
      - -
            setVersionInfo();
      -
      -      initMsg();
      -      sm2.oMC = id(sm2.movieID);
      -      init();
      - -
    • - - -
    • -
      - -
      - -
      -

      prevent multiple init attempts

      - -
      - -
            didAppend = true;
      -
      -      appendSuccess = true;
      -
      -      return false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      flash path

      - -
      - -
          var remoteURL = (smURL || sm2.url),
      -    localURL = (sm2.altURL || remoteURL),
      -    swfTitle = 'JS/Flash audio component (SoundManager 2)',
      -    oTarget = getDocument(),
      -    extraClass = getSWFCSS(),
      -    isRTL = null,
      -    html = doc.getElementsByTagName('html')[0],
      -    oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;
      -
      -    isRTL = (html && html.dir && html.dir.match(/rtl/i));
      -    smID = (smID === _undefined?sm2.id:smID);
      -
      -    function param(name, value) {
      -      return '<param name="'+name+'" value="'+value+'" />';
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      safety check for legacy (change to Flash 9 URL)

      - -
      - -
          setVersionInfo();
      -    sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL);
      -    smURL = sm2.url;
      -
      -    sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);
      -
      -    if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
      -      /**
      -       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here
      -       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout
      -       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)
      -       */
      -       messages.push(strings.spcWmode);
      -      sm2.wmode = null;
      -    }
      -
      -    oEmbed = {
      -      'name': smID,
      -      'id': smID,
      -      'src': smURL,
      -      'quality': 'high',
      -      'allowScriptAccess': sm2.allowScriptAccess,
      -      'bgcolor': sm2.bgColor,
      -      'pluginspage': http+'www.macromedia.com/go/getflashplayer',
      -      'title': swfTitle,
      -      'type': 'application/x-shockwave-flash',
      -      'wmode': sm2.wmode,
      - -
    • - - -
    • - - -
            'hasPriority': 'true'
      -    };
      -
      -    if (sm2.debugFlash) {
      -      oEmbed.FlashVars = 'debug=1';
      -    }
      -
      -    if (!sm2.wmode) {
      - -
    • - - -
    • -
      - -
      - -
      -

      don't write empty attribute

      - -
      - -
            delete oEmbed.wmode;
      -    }
      -
      -    if (isIE) {
      - -
    • - - -
    • -
      - -
      - -
      -

      IE is "special".

      - -
      - -
            oMovie = doc.createElement('div');
      -      movieHTML = [
      -        '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + http+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">',
      -        param('movie', smURL),
      -        param('AllowScriptAccess', sm2.allowScriptAccess),
      -        param('quality', oEmbed.quality),
      -        (sm2.wmode? param('wmode', sm2.wmode): ''),
      -        param('bgcolor', sm2.bgColor),
      -        param('hasPriority', 'true'),
      -        (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
      -        '</object>'
      -      ].join('');
      -
      -    } else {
      -
      -      oMovie = doc.createElement('embed');
      -      for (tmp in oEmbed) {
      -        if (oEmbed.hasOwnProperty(tmp)) {
      -          oMovie.setAttribute(tmp, oEmbed[tmp]);
      -        }
      -      }
      -
      -    }
      -
      -    initDebug();
      -    extraClass = getSWFCSS();
      -    oTarget = getDocument();
      -
      -    if (oTarget) {
      -
      -      sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));
      -
      -      if (!sm2.oMC.id) {
      -
      -        sm2.oMC.id = sm2.movieID;
      -        sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;
      -        s = null;
      -        oEl = null;
      -
      -        if (!sm2.useFlashBlock) {
      -          if (sm2.useHighPerformance) {
      - -
    • - - -
    • -
      - -
      - -
      -

      on-screen at all times

      - -
      - -
                  s = {
      -              'position': 'fixed',
      -              'width': '8px',
      -              'height': '8px',
      - -
    • - - -
    • -
      - -
      - -
      -
      -

      = 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.

      -
      - -
      - -
                    'bottom': '0px',
      -              'left': '0px',
      -              'overflow': 'hidden'
      -            };
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      hide off-screen, lower priority

      - -
      - -
                  s = {
      -              'position': 'absolute',
      -              'width': '6px',
      -              'height': '6px',
      -              'top': '-9999px',
      -              'left': '-9999px'
      -            };
      -            if (isRTL) {
      -              s.left = Math.abs(parseInt(s.left,10))+'px';
      -            }
      -          }
      -        }
      -
      -        if (isWebkit) {
      - -
    • - - -
    • -
      - -
      - -
      -

      soundcloud-reported render/crash fix, safari 5

      - -
      - -
                sm2.oMC.style.zIndex = 10000;
      -        }
      -
      -        if (!sm2.debugFlash) {
      -          for (x in s) {
      -            if (s.hasOwnProperty(x)) {
      -              sm2.oMC.style[x] = s[x];
      -            }
      -          }
      -        }
      -
      -        try {
      -          if (!isIE) {
      -            sm2.oMC.appendChild(oMovie);
      -          }
      -          oTarget.appendChild(sm2.oMC);
      -          if (isIE) {
      -            oEl = sm2.oMC.appendChild(doc.createElement('div'));
      -            oEl.className = swfCSS.swfBox;
      -            oEl.innerHTML = movieHTML;
      -          }
      -          appendSuccess = true;
      -        } catch(e) {
      -          throw new Error(str('domError')+' \n'+e.toString());
      -        }
      -
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      SM2 container is already in the document (eg. flashblock use case)

      - -
      - -
              sClass = sm2.oMC.className;
      -        sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
      -        sm2.oMC.appendChild(oMovie);
      -        if (isIE) {
      -          oEl = sm2.oMC.appendChild(doc.createElement('div'));
      -          oEl.className = swfCSS.swfBox;
      -          oEl.innerHTML = movieHTML;
      -        }
      -        appendSuccess = true;
      -
      -      }
      -
      -    }
      -
      -    didAppend = true;
      -    initMsg();
      - -
    • - - -
    • -
      - -
      - -
      -

      sm2._wD(sm + ': Trying to load ' + smURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);

      - -
      - -
      -    return true;
      -
      -  };
      -
      -  initMovie = function() {
      -
      -    if (sm2.html5Only) {
      -      createMovie();
      -      return false;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      attempt to get, or create, movie (may already exist)

      - -
      - -
          if (flash) {
      -      return false;
      -    }
      -
      -    if (!sm2.url) {
      -
      -      /**
      -       * Something isn't right - we've reached init, but the soundManager url property has not been set.
      -       * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.
      -       * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.
      -       */
      -
      -       _wDS('noURL');
      -       return false;
      -
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      inline markup case

      - -
      - -
          flash = sm2.getMovie(sm2.id);
      -
      -    if (!flash) {
      -      if (!oRemoved) {
      - -
    • - - -
    • -
      - -
      - -
      -

      try to create

      - -
      - -
              createMovie(sm2.id, sm2.url);
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      try to re-append removed movie after reboot()

      - -
      - -
              if (!isIE) {
      -          sm2.oMC.appendChild(oRemoved);
      -        } else {
      -          sm2.oMC.innerHTML = oRemovedHTML;
      -        }
      -        oRemoved = null;
      -        didAppend = true;
      -      }
      -      flash = sm2.getMovie(sm2.id);
      -    }
      -
      -    if (typeof sm2.oninitmovie === 'function') {
      -      setTimeout(sm2.oninitmovie, 1);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          flushMessages();
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    return true;
      -
      -  };
      -
      -  delayWaitForEI = function() {
      -
      -    setTimeout(waitForEI, 1000);
      -
      -  };
      -
      -  rebootIntoHTML5 = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.

      - -
      - -
      -    window.setTimeout(function() {
      -
      -      complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');
      -
      -      sm2.setup({
      -        preferFlash: false
      -      }).reboot();
      - -
    • - - -
    • -
      - -
      - -
      -

      if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.

      - -
      - -
            sm2.didFlashBlock = true;
      -
      -      sm2.beginDelayedInit();
      -
      -    }, 1);
      -
      -  };
      -
      -  waitForEI = function() {
      -
      -    var p,
      -        loadIncomplete = false;
      -
      -    if (!sm2.url) {
      - -
    • - - -
    • -
      - -
      - -
      -

      No SWF url to load (noURL case) - exit for now. Will be retried when url is set.

      - -
      - -
            return false;
      -    }
      -
      -    if (waitingForEI) {
      -      return false;
      -    }
      -
      -    waitingForEI = true;
      -    event.remove(window, 'load', delayWaitForEI);
      -
      -    if (hasFlash && tryInitOnFocus && !isFocused) {
      - -
    • - - -
    • -
      - -
      - -
      -

      Safari won't load flash in background tabs, only when focused.

      - -
      - -
            _wDS('waitFocus');
      -      return false;
      -    }
      -
      -    if (!didInit) {
      -      p = sm2.getMoviePercent();
      -      if (p > 0 && p < 100) {
      -        loadIncomplete = true;
      -      }
      -    }
      -
      -    setTimeout(function() {
      -
      -      p = sm2.getMoviePercent();
      -
      -      if (loadIncomplete) {
      - -
    • - - -
    • -
      - -
      - -
      -

      special case: if movie partially loaded, retry until it's 100% before assuming failure.

      - -
      - -
              waitingForEI = false;
      -        sm2._wD(str('waitSWF'));
      -        window.setTimeout(delayWaitForEI, 1);
      -        return false;
      -      }
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (!didInit) {
      -
      -        sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ':'') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash?' ' + str('checkSWF'):''), 2);
      -
      -        if (!overHTTP && p) {
      -
      -          _wDS('localFail', 2);
      -
      -          if (!sm2.debugFlash) {
      -            _wDS('tryDebug', 2);
      -          }
      -
      -        }
      -
      -        if (p === 0) {
      - -
    • - - -
    • -
      - -
      - -
      -

      if 0 (not null), probably a 404.

      - -
      - -
                sm2._wD(str('swf404', sm2.url), 1);
      -
      -        }
      -
      -        debugTS('flashtojs', false, ': Timed out' + overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)');
      -
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
    • - - -
    • -
      - -
      - -
      -

      give up / time-out, depending

      - -
      - -
      -      if (!didInit && okToDisable) {
      -
      -        if (p === null) {
      - -
    • - - -
    • -
      - -
      - -
      -

      SWF failed to report load progress. Possibly blocked.

      - -
      - -
      -          if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {
      -
      -            if (sm2.useFlashBlock) {
      -
      -              flashBlockHandler();
      -
      -            }
      -
      -            _wDS('waitForever');
      -
      -          } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.

      - -
      - -
      -            if (!sm2.useFlashBlock && canIgnoreFlash) {
      -
      -              rebootIntoHTML5();
      -
      -            } else {
      -
      -              _wDS('waitForever');
      - -
    • - - -
    • -
      - -
      - -
      -

      fire any regular registered ontimeout() listeners.

      - -
      - -
                    processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}});
      -
      -            }
      -
      -          }
      -
      -        } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      SWF loaded? Shouldn't be a blocking issue, then.

      - -
      - -
      -          if (sm2.flashLoadTimeout === 0) {
      -
      -            _wDS('waitForever');
      -
      -          } else {
      -
      -            if (!sm2.useFlashBlock && canIgnoreFlash) {
      -
      -              rebootIntoHTML5();
      -
      -            } else {
      -
      -              failSafely(true);
      -
      -            }
      -
      -          }
      -
      -        }
      -
      -      }
      -
      -    }, sm2.flashLoadTimeout);
      -
      -  };
      -
      -  handleFocus = function() {
      -
      -    function cleanup() {
      -      event.remove(window, 'focus', handleFocus);
      -    }
      -
      -    if (isFocused || !tryInitOnFocus) {
      - -
    • - - -
    • -
      - -
      - -
      -

      already focused, or not special Safari background tab case

      - -
      - -
            cleanup();
      -      return true;
      -    }
      -
      -    okToDisable = true;
      -    isFocused = true;
      -    _wDS('gotFocus');
      - -
    • - - -
    • -
      - -
      - -
      -

      allow init to restart

      - -
      - -
          waitingForEI = false;
      - -
    • - - -
    • -
      - -
      - -
      -

      kick off ExternalInterface timeout, now that the SWF has started

      - -
      - -
          delayWaitForEI();
      -
      -    cleanup();
      -    return true;
      -
      -  };
      -
      -  flushMessages = function() {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
    • - - -
    • -
      - -
      - -
      -

      SM2 pre-init debug messages

      - -
      - -
          if (messages.length) {
      -      sm2._wD('SoundManager 2: ' + messages.join(' '), 1);
      -      messages = [];
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  showSupport = function() {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
      -    flushMessages();
      -
      -    var item, tests = [];
      -
      -    if (sm2.useHTML5Audio && sm2.hasHTML5) {
      -      for (item in sm2.audioFormats) {
      -        if (sm2.audioFormats.hasOwnProperty(item)) {
      -          tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)': (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
      -        }
      -      }
      -      sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -  };
      -
      -  initComplete = function(bNoDisable) {
      -
      -    if (didInit) {
      -      return false;
      -    }
      -
      -    if (sm2.html5Only) {
      - -
    • - - -
    • -
      - -
      - -
      -

      all good.

      - -
      - -
            _wDS('sm2Loaded');
      -      didInit = true;
      -      initUserOnload();
      -      debugTS('onload', true);
      -      return true;
      -    }
      -
      -    var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),
      -        result = true,
      -        error;
      -
      -    if (!wasTimeout) {
      -      didInit = true;
      -    }
      -
      -    error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
      -
      -    sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ')', disabled ? 2: 1);
      -
      -    if (disabled || bNoDisable) {
      -      if (sm2.useFlashBlock && sm2.oMC) {
      -        sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError);
      -      }
      -      processOnEvents({type:'ontimeout', error:error, ignoreInit: true});
      -      debugTS('onload', false);
      -      catchError(error);
      -      result = false;
      -    } else {
      -      debugTS('onload', true);
      -    }
      -
      -    if (!disabled) {
      -      if (sm2.waitForWindowLoad && !windowLoaded) {
      -        _wDS('waitOnload');
      -        event.add(window, 'load', initUserOnload);
      -      } else {
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
              if (sm2.waitForWindowLoad && windowLoaded) {
      -          _wDS('docLoaded');
      -        }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
              initUserOnload();
      -      }
      -    }
      -
      -    return result;
      -
      -  };
      -
      -  /**
      -   * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)
      -   * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().
      -   */
      -
      -  setProperties = function() {
      -
      -    var i,
      -        o = sm2.setupOptions;
      -
      -    for (i in o) {
      -
      -      if (o.hasOwnProperty(i)) {
      - -
    • - - -
    • -
      - -
      - -
      -

      assign local property if not already defined

      - -
      - -
      -        if (sm2[i] === _undefined) {
      -
      -          sm2[i] = o[i];
      -
      -        } else if (sm2[i] !== o[i]) {
      - -
    • - - -
    • -
      - -
      - -
      -

      legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync

      - -
      - -
                sm2.setupOptions[i] = sm2[i];
      -
      -        }
      -
      -      }
      -
      -    }
      -
      -  };
      -
      -
      -  init = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      called after onload()

      - -
      - -
      -    if (didInit) {
      -      _wDS('didInit');
      -      return false;
      -    }
      -
      -    function cleanup() {
      -      event.remove(window, 'load', sm2.beginDelayedInit);
      -    }
      -
      -    if (sm2.html5Only) {
      -      if (!didInit) {
      - -
    • - - -
    • -
      - -
      - -
      -

      we don't need no steenking flash!

      - -
      - -
              cleanup();
      -        sm2.enabled = true;
      -        initComplete();
      -      }
      -      return true;
      -    }
      - -
    • - - -
    • -
      - -
      - -
      -

      flash path

      - -
      - -
          initMovie();
      -
      -    try {
      - -
    • - - -
    • -
      - -
      - -
      -

      attempt to talk to Flash

      - -
      - -
            flash._externalInterfaceTest(false);
      - -
    • - - -
    • -
      - -
      - -
      -

      apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling -(determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)

      - -
      - -
            setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));
      -
      -      if (!sm2.debugMode) {
      - -
    • - - -
    • -
      - -
      - -
      -

      stop the SWF from making debug output calls to JS

      - -
      - -
              flash._disableDebug();
      -      }
      -
      -      sm2.enabled = true;
      -      debugTS('jstoflash', true);
      -
      -      if (!sm2.html5Only) {
      - -
    • - - -
    • -
      - -
      - -
      -

      prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead -http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

      - -
      - -
              event.add(window, 'unload', doNothing);
      -      }
      -
      -    } catch(e) {
      -
      -      sm2._wD('js/flash exception: ' + e.toString());
      -      debugTS('jstoflash', false);
      -      catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
      - -
    • - - -
    • -
      - -
      - -
      -

      don't disable, for reboot()

      - -
      - -
            failSafely(true);
      -      initComplete();
      -
      -      return false;
      -
      -    }
      -
      -    initComplete();
      - -
    • - - -
    • -
      - -
      - -
      -

      disconnect events

      - -
      - -
          cleanup();
      -
      -    return true;
      -
      -  };
      -
      -  domContentLoaded = function() {
      -
      -    if (didDCLoaded) {
      -      return false;
      -    }
      -
      -    didDCLoaded = true;
      - -
    • - - -
    • -
      - -
      - -
      -

      assign top-level soundManager properties eg. soundManager.url

      - -
      - -
          setProperties();
      -
      -    initDebug();
      -
      -    /**
      -     * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1
      -     * Ditto for sm2-preferFlash, too.
      -     */
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
          (function(){
      -
      -      var a = 'sm2-usehtml5audio=',
      -          a2 = 'sm2-preferflash=',
      -          b = null,
      -          b2 = null,
      -          l = wl.toLowerCase();
      -
      -      if (l.indexOf(a) !== -1) {
      -        b = (l.charAt(l.indexOf(a)+a.length) === '1');
      -        if (hasConsole) {
      -          console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter');
      -        }
      -        sm2.setup({
      -          'useHTML5Audio': b
      -        });
      -      }
      -
      -      if (l.indexOf(a2) !== -1) {
      -        b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1');
      -        if (hasConsole) {
      -          console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter');
      -        }
      -        sm2.setup({
      -          'preferFlash': b2
      -        });
      -      }
      -
      -    }());
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -    if (!hasFlash && sm2.hasHTML5) {
      -      sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);
      -      sm2.setup({
      -        'useHTML5Audio': true,
      - -
    • - - -
    • -
      - -
      - -
      -

      make sure we aren't preferring flash, either -TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.

      - -
      - -
              'preferFlash': false
      -      });
      -    }
      -
      -    testHTML5();
      -
      -    if (!hasFlash && needsFlash) {
      -      messages.push(strings.needFlash);
      - -
    • - - -
    • -
      - -
      - -
      -

      TODO: Fatal here vs. timeout approach, etc. -hack: fail sooner.

      - -
      - -
            sm2.setup({
      -        'flashLoadTimeout': 1
      -      });
      -    }
      -
      -    if (doc.removeEventListener) {
      -      doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);
      -    }
      -
      -    initMovie();
      -
      -    return true;
      -
      -  };
      -
      -  domContentLoadedIE = function() {
      -
      -    if (doc.readyState === 'complete') {
      -      domContentLoaded();
      -      doc.detachEvent('onreadystatechange', domContentLoadedIE);
      -    }
      -
      -    return true;
      -
      -  };
      -
      -  winOnLoad = function() {
      - -
    • - - -
    • -
      - -
      - -
      -

      catch edge case of initComplete() firing after window.load()

      - -
      - -
          windowLoaded = true;
      -    event.remove(window, 'load', winOnLoad);
      -
      -  };
      -
      -  /**
      -   * miscellaneous run-time, pre-init stuff
      -   */
      -
      -  preInit = function() {
      -
      -    if (mobileHTML5) {
      - -
    • - - -
    • -
      - -
      - -
      -

      prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.

      - -
      - -
    • - - -
    • -
      - -
      - -
      - - -
      - -
            if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {
      - -
    • - - -
    • -
      - -
      - -
      -

      notify that defaults are being changed.

      - -
      - -
              messages.push(strings.mobileUA);
      -      }
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
      -      sm2.setupOptions.useHTML5Audio = true;
      -      sm2.setupOptions.preferFlash = false;
      -
      -      if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) {
      - -
    • - - -
    • -
      - -
      - -
      -

      iOS and Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence. -common use case: exiting sound onfinish() -> createSound() -> play()

      - - -
      - -
              messages.push(strings.globalHTML5);
      - -
    • - - -
    • -
      - -
      - -
      -

      - -
      - -
              if (is_iDevice) {
      -          sm2.ignoreFlash = true;
      -        }
      -        useGlobalHTML5Audio = true;
      -      }
      -
      -    }
      -
      -  };
      -
      -  preInit();
      - -
    • - - -
    • -
      - -
      - -
      -

      sniff up-front

      - -
      - -
        detectFlash();
      - -
    • - - -
    • -
      - -
      - -
      -

      focus and window load, init (primarily flash-driven)

      - -
      - -
        event.add(window, 'focus', handleFocus);
      -  event.add(window, 'load', delayWaitForEI);
      -  event.add(window, 'load', winOnLoad);
      -
      -  if (doc.addEventListener) {
      -
      -    doc.addEventListener('DOMContentLoaded', domContentLoaded, false);
      -
      -  } else if (doc.attachEvent) {
      -
      -    doc.attachEvent('onreadystatechange', domContentLoadedIE);
      -
      -  } else {
      - -
    • - - -
    • -
      - -
      - -
      -

      no add/attachevent support - safe to assume no JS -> Flash either

      - -
      - -
          debugTS('onload', false);
      -    catchError({type:'NO_DOM2_EVENTS', fatal:true});
      -
      -  }
      -
      -} // SoundManager()
      - -
    • - - -
    • - - -
      -if (window.SM2_DEFER === undefined || !SM2_DEFER) {
      -  soundManager = new SoundManager();
      -}
      -
      -/**
      - * SoundManager public interfaces
      - * ------------------------------
      - */
      -
      -window.SoundManager = SoundManager; // constructor
      -window.soundManager = soundManager; // public API, flash callbacks etc.
      -
      -}(window));
      - -
    • - -
    -
    \ No newline at end of file diff --git a/app/views/metacode_sets/new.html.erb b/app/views/metacode_sets/new.html.erb index d854d2c2..1ff5e852 100644 --- a/app/views/metacode_sets/new.html.erb +++ b/app/views/metacode_sets/new.html.erb @@ -1,54 +1,14 @@ -
    -<%= render 'form' %> +
    +
    + <%= render 'form' %> +
    \ No newline at end of file diff --git a/app/views/metacode_sets/show.html.erb b/app/views/metacode_sets/show.html.erb deleted file mode 100644 index 27760317..00000000 --- a/app/views/metacode_sets/show.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -
    -

    - Name: - <%= @metacode_set.name %> -

    - -

    - Description: - <%= @metacode_set.desc %> -

    - - -<%= link_to 'Edit', edit_metacode_set_path(@metacode_set) %> | -<%= link_to 'Back', metacode_sets_path %> -
    \ No newline at end of file diff --git a/app/views/metacodes/_form.html.erb b/app/views/metacodes/_form.html.erb index b41f409d..de815bbc 100644 --- a/app/views/metacodes/_form.html.erb +++ b/app/views/metacodes/_form.html.erb @@ -22,7 +22,7 @@
    - <%= link_to 'Cancel', metacodes_path, { :class => 'button' }%> + <%= link_to 'Cancel', metacodes_path, { :class => 'button', 'data-bypass' => 'true' } %> <%= f.submit :class => 'add' %>
    <% end %> diff --git a/app/views/metacodes/edit.html.erb b/app/views/metacodes/edit.html.erb index bfb27aa0..de8c85c1 100644 --- a/app/views/metacodes/edit.html.erb +++ b/app/views/metacodes/edit.html.erb @@ -1,7 +1,5 @@ -

    - Edit -

    - -
    -<%= render 'form' %> +
    +
    + <%= render 'form' %> +
    \ No newline at end of file diff --git a/app/views/metacodes/index.html.erb b/app/views/metacodes/index.html.erb index 71a78f4c..36901d56 100644 --- a/app/views/metacodes/index.html.erb +++ b/app/views/metacodes/index.html.erb @@ -1,30 +1,23 @@ -
    -<%= render :partial => 'admin/adminpanel' %> -
    - - - - - - - +
    +
    + <%= render :partial => 'admin/adminpanel' %> +
    +
    NameIcon
    + + + + + + -<% @metacodes.each do |metacode| %> - - - - - - -<% end %> -
    NameIcon
    <%= metacode.name %><%= metacode.icon %><%= link_to 'Edit', edit_metacode_path(metacode) %>
    -
    - - \ No newline at end of file + <% @metacodes.each do |metacode| %> + + <%= metacode.name %> + <%= metacode.icon %> + + <%= link_to 'Edit', edit_metacode_path(metacode), :data => { :bypass => 'true'} %> + + <% end %> + +
    +
    \ No newline at end of file diff --git a/app/views/metacodes/new.html.erb b/app/views/metacodes/new.html.erb index a6f8512c..8520bb6c 100644 --- a/app/views/metacodes/new.html.erb +++ b/app/views/metacodes/new.html.erb @@ -1,3 +1,5 @@ -
    -<%= render 'form' %> +
    +
    + <%= render 'form' %> +
    \ No newline at end of file diff --git a/app/views/metacodes/show.html.erb b/app/views/metacodes/show.html.erb deleted file mode 100644 index fe37ce81..00000000 --- a/app/views/metacodes/show.html.erb +++ /dev/null @@ -1,15 +0,0 @@ -
    -

    - Name: - <%= @metacode.name %> -

    - -

    - Icon: - <%= @metacode.icon %> -

    - - -<%= link_to 'Edit', edit_metacode_path(@metacode) %> | -<%= link_to 'Back', metacodes_path %> -
    \ No newline at end of file diff --git a/app/views/shared/_cheatsheet.html.erb b/app/views/shared/_cheatsheet.html.erb index 361d615b..c1ae23bf 100644 --- a/app/views/shared/_cheatsheet.html.erb +++ b/app/views/shared/_cheatsheet.html.erb @@ -7,7 +7,7 @@
    diff --git a/app/views/shared/_metacodeoptions.html.erb b/app/views/shared/_metacodeoptions.html.erb index 75915159..d05c5763 100644 --- a/app/views/shared/_metacodeoptions.html.erb +++ b/app/views/shared/_metacodeoptions.html.erb @@ -5,12 +5,31 @@
      -<% Metacode.order("name").all.each do |m| %> -
    • - <%= m.name %> - <%= m.name %> -
      + <% MetacodeSet.order("name").all.each do |set| %> +
    • + <%= set.name %> +
        + <% set.metacodes.sort { |a, b| a.name <=> b.name }.each do |m| %> +
      • + <%= m.name %> + <%= m.name %> +
        +
      • + <% end %> +
      +
    • + <% end %> +
    • + All +
        + <% Metacode.order("name").all.each do |m| %> +
      • + <%= m.name %> + <%= m.name %> +
        +
      • + <% end %> +
    • -<% end %>
    \ No newline at end of file diff --git a/public/famous/main.js b/public/famous/main.js index 364b5904..67265c9f 100644 --- a/public/famous/main.js +++ b/public/famous/main.js @@ -106,11 +106,15 @@ define(function(require, exports, module) { f.loadYield = function () { Metamaps.Loading.hide(); - var yield = document.getElementById('yield') ? document.getElementById('yield').innerHTML : false; + + var y = document.getElementById('yield'); + var yield = y ? y.innerHTML : false; if (yield) { f.yield.surf.setContent(yield); f.yield.surf.deploy(f.yield.surf._currTarget); f.yield.show(); + + y.parentNode.removeChild(y); } }; From f62ca67d9f444e9b1334993c632923f1d5fdd648 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 15 Sep 2014 22:04:44 -0400 Subject: [PATCH 098/600] prevent self showing up on realtime problem --- app/assets/javascripts/src/Metamaps.js | 72 ++++++++++++++------------ 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index fcbedaf3..7ace955f 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1591,16 +1591,18 @@ Metamaps.Realtime = { mapperListItem += '
    '; mapperListItem += ''; - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); + if (data.userid !== Metamaps.Active.Mapper.id) { + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); - // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
    ', { - id: 'compass' + data.userid, - text: data.username, - class: 'collabCompass' - }).appendTo('#wrapper'); + // create a div for the collaborators compass + $('#compass' + data.userid).remove(); + $('
    ', { + id: 'compass' + data.userid, + text: data.username, + class: 'collabCompass' + }).appendTo('#wrapper'); + } }, newPeerOnMap: function (data) { var self = Metamaps.Realtime; @@ -1617,34 +1619,36 @@ Metamaps.Realtime = { }; // create an item for them in the realtime box - var mapperListItem = '
  • '; - mapperListItem += ''; - mapperListItem += data.username; - mapperListItem += '
    '; - mapperListItem += '
  • '; - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); + if (data.userid !== Metamaps.Active.Mapper.id) { + var mapperListItem = '
  • '; + mapperListItem += ''; + mapperListItem += data.username; + mapperListItem += '
    '; + mapperListItem += '
  • '; + $('#mapper' + data.userid).remove(); + $('.realtimeMapperList ul').append(mapperListItem); - // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
    ', { - id: 'compass' + data.userid, - text: data.username, - class: 'collabCompass' - }).appendTo('#wrapper'); + // create a div for the collaborators compass + $('#compass' + data.userid).remove(); + $('
    ', { + id: 'compass' + data.userid, + text: data.username, + class: 'collabCompass' + }).appendTo('#wrapper'); - Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); + Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); - // send this new mapper back your details, and the awareness that you've loaded the map - var update = { - userToNotify: data.userid, - username: Metamaps.Active.Mapper.get("name"), - userimage: Metamaps.Active.Mapper.get("image"), - userid: Metamaps.Active.Mapper.id, - userrealtime: self.status, - mapid: Metamaps.Active.Map.id - }; - socket.emit('updateNewMapperList', update); + // send this new mapper back your details, and the awareness that you've loaded the map + var update = { + userToNotify: data.userid, + username: Metamaps.Active.Mapper.get("name"), + userimage: Metamaps.Active.Mapper.get("image"), + userid: Metamaps.Active.Mapper.id, + userrealtime: self.status, + mapid: Metamaps.Active.Map.id + }; + socket.emit('updateNewMapperList', update); + } }, lostPeerOnMap: function (data) { var self = Metamaps.Realtime; From 0bf28410e67a9e83c735fd903d6960f7ba7b6f62 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 17 Sep 2014 10:59:36 -0400 Subject: [PATCH 099/600] switch metaset view changes --- app/assets/stylesheets/application.css | 16 +++++++++++++++- app/views/shared/_switchmetacodes.html.erb | 7 ++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index aba37d09..8cdea3d6 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1413,6 +1413,7 @@ float: left; font-size: 17px; line-height: 21px; border: none; + background: none; } #metacodeSwitchTabs .setTitle { @@ -1420,12 +1421,24 @@ float: left; #metacodeSwitchTabs .setDesc { margin-bottom: 5px; } +#switchMetacodes > p { + margin: 16px 0 16px 0; +} +#metacodeSwitchTabs > ul { + width: 130px; +} +#metacodeSwitchTabs > ul li { + font-size: 14px; +} +#metacodeSwitchTabs li.ui-state-active a { + color: #00BCD4; +} .customMetacodeList, .metacodeSetList { height: 301px; overflow: hidden; margin: 5px 0 15px 0; - border-bottom: 1px solid #BBB; + /* border-bottom: 1px solid #BBB;*/ } .customMetacodeList ul li { cursor: pointer; @@ -1461,6 +1474,7 @@ float: left; width: auto !important; padding: 0 10px; font-weight: normal; + float: right; } /* about, getInvolved */ diff --git a/app/views/shared/_switchmetacodes.html.erb b/app/views/shared/_switchmetacodes.html.erb index 2fae5a70..238a83a3 100644 --- a/app/views/shared/_switchmetacodes.html.erb +++ b/app/views/shared/_switchmetacodes.html.erb @@ -13,18 +13,19 @@ index = allMetacodeSets.index(set) end %>

    Switch Metacode Set

    + +

    Use metacode sets to enter different modes of mapping.

    <% allMetacodeSets.each_with_index do |m, localindex| %>
    -

    <%= m.name %>

    <% @list = '' %> <% m.metacodes.sort{|x,y| x.name <=> y.name }.each_with_index do |m, index| %> <% @list += '
  • ' + m.name + '

    ' + m.name.downcase + '

  • ' %> @@ -37,7 +38,7 @@
    <% end %> From af5560b495937419ff34c78eaa094615d1009c27 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 18 Sep 2014 02:33:38 -0400 Subject: [PATCH 100/600] updates to metacode select within topic card --- app/assets/javascripts/src/Metamaps.js | 2 +- app/assets/stylesheets/base.css | 45 +++++++++++++++----------- app/views/layouts/_templates.html.erb | 2 +- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 7ace955f..7cd87cbb 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -766,7 +766,7 @@ Metamaps.TopicCard = { selectingMetacode = true; $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow $('.metacodeSelect').show(); - $('.metacodeSelect li').click(function () { + $('.metacodeSelect li li').click(function () { selectingMetacode = false; var metacodeName = $(this).find('.mSelectName').text(); var metacode = Metamaps.Metacodes.findWhere({ diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index eccc8365..1d9b9cb1 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -322,39 +322,46 @@ cursor: pointer; } .CardOnGraph .metacodeSelect { display:none; - width:100%; + width:200px; z-index: 2; position: absolute; background: #EAEAEA; - height: 150px; + left: 300px; } .CardOnGraph .metacodeSelect ul { -font-style: italic; -font-family: 'vinyl'; -text-transform: uppercase; -position: absolute; -line-height: 36px; -font-size: 20px; -display:block; -width: 100%; -margin:0; -padding: 0; -list-style:none; -height:150px; -overflow:hidden; + position: relative; + line-height: 14px; + font-size: 14px; + display:block; + width: 100%; + margin:0; + padding: 0; + list-style:none; + border: 1px solid #BDBDBD; } .CardOnGraph .metacodeSelect ul li { -background-color: #EAEAEA; -width:100%; -border-bottom:1px solid #AAAAAA; +background-color: #F5F5F5; cursor:pointer; +position: relative; +padding: 9px 12px; } .CardOnGraph .metacodeSelect ul li:hover { -background-color: #F8F8F8; +background-color: #E0E0E0; } .CardOnGraph .metacodeSelect ul li img, .CardOnGraph .metacodeSelect ul li .mSelectName { float:left; } +.CardOnGraph .metacodeSelect ul ul { + display:none; + position: absolute; + left: 200px; + top: 0; + max-height: 270px; + overflow-y: auto; +} +.CardOnGraph .metacodeSelect li:hover ul { + display: block; +} .CardOnGraph .hoverForTip:hover .tip, .mapCard .hoverForTip:hover .tip { display:block; diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index e48dc57b..18da1d36 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -193,6 +193,7 @@
    {{metacode}}
    +
    {{{metacode_select}}}
    @@ -209,7 +210,6 @@
    -
    {{{metacode_select}}}
    {{desc}} From ac867d00ab16fd3ff1469db0790b376ffc706812 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 18 Sep 2014 02:39:00 -0400 Subject: [PATCH 101/600] m --- app/assets/stylesheets/application.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8cdea3d6..00212f5c 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1429,6 +1429,7 @@ float: left; } #metacodeSwitchTabs > ul li { font-size: 14px; + text-transform: uppercase; } #metacodeSwitchTabs li.ui-state-active a { color: #00BCD4; From 90e974164dcdd4474287dc75f439d6c740c3a084 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 20 Sep 2014 15:11:58 -0400 Subject: [PATCH 102/600] added more resources into help lightbox --- app/assets/javascripts/lib/embedly.js | 2 + app/assets/javascripts/src/Metamaps.js | 237 ++++++++++++--------- app/assets/stylesheets/application.css | 64 ++++-- app/assets/stylesheets/base.css | 71 ++++-- app/views/layouts/_templates.html.erb | 7 +- app/views/layouts/application.html.erb | 3 - app/views/shared/_cheatsheet.html.erb | 44 ++++ app/views/shared/_forkmap.html.erb | 6 +- app/views/shared/_metacodeoptions.html.erb | 6 +- 9 files changed, 289 insertions(+), 151 deletions(-) create mode 100644 app/assets/javascripts/lib/embedly.js diff --git a/app/assets/javascripts/lib/embedly.js b/app/assets/javascripts/lib/embedly.js new file mode 100644 index 00000000..65b52d0f --- /dev/null +++ b/app/assets/javascripts/lib/embedly.js @@ -0,0 +1,2 @@ +!function(){var a=function b(c,d,e){function f(h,i){if(!d[h]){if(!c[h]){var j="function"==typeof a&&a;if(!i&&j)return j(h,!0);if(g)return g(h,!0);throw new Error("Cannot find module '"+h+"'")}var k=d[h]={exports:{}};c[h][0].call(k.exports,function(a){var b=c[h][1][a];return f(b?b:a)},k,k.exports,b,c,d,e)}return d[h].exports}for(var g="function"==typeof a&&a,h=0;ha};0>k&&(l=function(b){return a>b});var m=function(){clearInterval(c),g.console.log("duration",(new Date).getTime()-i),d.detachEvent("scroll",e)};c=setInterval(function(){return f+=k,l(f)?(m(),!1):(window.scrollTo(0,f),void(j=!0))},10),e=function(){j&&f!==g.window.scrollY()&&m()},d.addEvent("scroll",e)},b.exports=g},{"./dom.js":5,"./urlparse.js":14,"./utils.js":15,conf:"AqyHQT"}],3:[function(a,b){var c=!1,d=/xyz/.test(function(){})?/\b_super\b/:/.*/,e=function(){};e.extend=function(a){function b(){!c&&this.init&&this.init.apply(this,arguments)}var e=this.prototype;c=!0;var f=new this;c=!1;for(var g in a)f[g]="function"==typeof a[g]&&"function"==typeof e[g]&&d.test(a[g])?function(a,b){return function(){var c=this._super;this._super=e[a];var d=b.apply(this,arguments);return this._super=c,d}}(g,a[g]):a[g];return b.prototype=f,b.prototype.constructor=b,b.extend=arguments.callee,b},b.exports=e},{}],4:[function(a,b){var c=a("./iframe.js"),d=a("./utils.js"),e={started:!1,instance:null};e.EVENTS=["xcomm.stats.access","xcomm.stats.card.realtime","xcomm.stats.card.week","xcomm.stats.media.realtime","xcomm.stats.media.week","xcomm.stats.media.recommend","xcomm.user.set","xcomm.user.get","xcomm.user.remove","xcomm.page.progress"],e.clear=function(){e.instance&&(e.instance.remove(),e.instance=null),e.started=!1},e.connect=function(a){if(!a||e.started)return!1;e.started=!0;var b=c.createComm(a);return d.each(e.EVENTS,function(c){b.on(c,function(b){a.notify(c+".response",b)}),a.on(c,function(a){b.send(c,a)})}),b.on("xcomm.ready",function(b){a.notify("xcomm.ready",b)}),e.instance=b,b},b.exports=e},{"./iframe.js":6,"./utils.js":15}],5:[function(a,b){var c=a("./utils.js"),d={};d.toArray=function(a){return c.map(a,function(a){return a})},d.all=function(a){var b=[];return document.querySelectorAll?d.toArray(document.querySelectorAll(a)):b},d.one=function(a,b){var c=d.all(a,b);return 0===c.length?null:c[0]},d.create=function(a,b,e,f){if(!a||!c.isString(a))return null;c.isString(b)&&c.isNone(e)&&(e=b,b={});var g;return g=f?document.createElementNS("http://www.w3.org/2000/svg",a):document.createElement(a),c.each(b,function(a,b){g.setAttribute(b,a)}),e&&d.text(g,e),g},d.set=function(a,b,e){if(!a||!c.isString(a))return null;c.isString(b)&&c.isNone(e)&&(e=b,b={});var f=d.one(a);return f?(c.each(b,function(a,b){f.setAttribute(b,a)}),c.isNone(e)||d.text(f,e),f):null},d.replace=function(a,b){c.assert(c.isElement(a),"replace requires an element to be replaced"),c.assert(c.isElement(b),"replace requires an element to replace with."),a.parentNode.replaceChild(b,a)},d.remove=function(a){return c.isElement(a)&&c.isElement(a.parentNode)?void a.parentNode.removeChild(a):!1},d.hide=function(a){return c.isString(a)&&(a=d.one(a)),c.isElement(a)&&(a.style.display="none"),a},d.show=function(a,b){return c.isString(a)&&(a=d.one(a)),c.isElement(a)&&(a.style.display=b?"inline-block":"block"),a},d.svg=function(a,b,c){return d.create(a,b,c,"http://www.w3.org/2000/svg")},d.children=function(a,b){return c.isElement(a)?c.reduce(a.childNodes,function(a,d){if(c.isElement(d)){if(!c.isNone(b))if(d.namespaceURI&&"http://www.w3.org/2000/svg"===d.namespaceURI){if(d.nodeName!==b)return a}else if(b.toUpperCase()!==d.nodeName)return a;a.push(d)}return a},[]):[]},d.child=function(a,b){var c=d.children(a,b);return 0!==c.length?c[0]:null},d.text=function(a,b){if(!a||!c.isElement(a))return null;if(c.isNone(b))return a.innerText||a.textContent;var d=void 0===a.textContent?"innerText":"textContent";a[d]=b},d.hasClass=function(a,b){if(c.isString(a)&&(a=d.one(a)),!c.isElement(a)||!c.isString(b)||!b)return!1;var e=a.getAttribute("class");return c.isNone(e)?!1:(" "+e+" ").indexOf(" "+b+" ")>-1?!0:!1},d.addClass=function(a,b){if(c.isString(a)&&(a=d.one(a)),!c.isElement(a)||!c.isString(b)||!b)return!1;if(d.hasClass(a,b))return!1;var e=a.getAttribute("class");if(c.isNone(e))return a.setAttribute("class",b),!0;var f=e.split(" "),g=[];return c.map(f,function(a){var b=c.trim(a);""!==b&&g.push(b)}),g.push(b),a.setAttribute("class",g.join(" ")),!0},d.removeClass=function(a,b){if(c.isString(a)&&(a=d.one(a)),!c.isElement(a)||!c.isString(b)||!b)return!1;var e=a.getAttribute("class");if(c.isNone(e))return!1;var f=!1,g=c.reduce(e.split(" "),function(a,d){var e=c.trim(d);return e?e===b?(f=!0,a):(a.push(e),a):a},[]);return a.setAttribute("class",g.join(" ")),f},d.data=function(a,b,d){c.assert(a&&c.isElement(a),"dom.data needs an element."),c.assert(b&&c.isString(b),"dom.data needs an attr.");var e=c.camelCase(b);return c.isNone(d)?c.isNone(a.dataset)?a.getAttribute("data-"+b):c.isNone(a.dataset[e])?null:a.dataset[e]:void(c.isNone(a.dataset)?a.setAttribute("data-"+b,d):a.dataset[e]=d)},d.attrize=function(a){return a&&c.isObject(a)?c.map(a,function(a,b){return b+'="'+a+'"'}).sort().join(" "):""},d.event=function(a){var b=c.extend({},a||window.event);return b.target||(b.target=b.srcElement||document),3===b.target.nodeType&&(b.target=b.target.parentNode),!a.metaKey&&a.ctrlKey&&(b.metaKey=b.ctrlKey),b.stop=function(){a.preventDefault?a.preventDefault():a.returnValue=!1},b.pageX||b.pageY||!b.clientX&&!b.clientY||(b.pageX=b.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,b.pageY=b.clientY+document.body.scrollTop+document.documentElement.scrollTop),b},d.addEvent=function(a,b,d){c.isNone(a)||(a.addEventListener?a.addEventListener(b,d,!1):a.attachEvent?a.attachEvent("on"+b,d):a["on"+b]=d)},d.detachEvent=function(a,b,d){c.isNone(a)||(a.removeEventListener?a.removeEventListener(b,d,!1):a.detachEvent?a.detachEvent("on"+b,d):a["on"+b]=null)},d.trigger=function(a,b){c.assert(c.contains(["click"],b),"Not a valid event");var d;a.dispatchEvent?(d=document.createEvent("MouseEvents"),d.initEvent(b,!0,!0),a.dispatchEvent(d,!0)):(d=document.createEventObject(),a.fireEvent("on"+b,d))},d.rect=function(a){try{return a.getBoundingClientRect()}catch(b){}return!1},b.exports=d},{"./utils.js":15}],6:[function(a,b){var c=a("./utils.js"),d=a("./dom.js"),e=a("./urlparse.js"),f=a("./browser.js"),g=a("./class.js"),h=a("./json.js"),i=a("./a.js"),j=a("conf"),k={};k.connect=function(a,b){if(!a||!c.isElement(a.elem))return!1;var d=new i,g=[],j=a.elem.src,k=!1,l=e.getOrigin(j);a.on=function(a,b,c){d.on(a,b,c)},a.one=function(a,b,c){d.one(a,b,c)},a.off=function(a,b){d.off(a,b)},a.send=function(b,d){if(c.isNone(d)&&(d={}),c.isString(d)&&(d={msg:d}),d.method=b,k===!1)return f.console.log("Iframe.queue",d),g.push(d),!1;a.sid&&(d.sid=a.sid),f.console.log("iframe.send",d);var e=h.stringify(d);a.elem.contentWindow&&a.elem.contentWindow.postMessage&&a.elem.contentWindow.postMessage(e,l)},a.ready=function(){k||(f.console.log("iframe.ready",a.name),k=!0,c.each(g,function(b){a.send(b.method,b)}))};var m=function(b,c){if(b.origin===l){if(f.console.log("iframe.message",c),!c.src&&!c.sid&&!c.listener)return!1;if(a.sid&&c.sid!==a.sid)return!1;if(c.src&&c.src!==j)return!1;if(c.listener&&c.listener!==j)return!1;"resize"===c.method&&a.resize&&a.resize(c),!c.method&&c.event&&c.listener?d.notify(c.event,c):c.method&&d.notify(c.method,c)}};return b.on("window.message",m),a._remove=function(){b.off("window.message",m)},a},k.rendering=function(a){return"1"===d.data(a,"rendering")?!0:(d.data(a,"rendering","1"),!1)};var l=g.extend({secure:null,rendered:!1,init:function(a,b){this.sid=c.getUUID(),this.query=a,this.create(b)},getSrc:function(){var a="";return a=this.secure===!0||j.EMB_HTTPS?j.EMB_SECURE_FRAME_SRC:/https?:\/\/sulia\.com\/embed/.test(this.query.url)?"http://embed.sulia.com/widgets/":j.EMB_FRAME_SRC,a+=this.name+".html?"+e.createQuery(this.query)+"#sid="+this.sid},create:function(a){var b=c.extend({},this.attrs);return this.src=this.getSrc(),b.src=this.src,b.id="emb_"+(this.query&&this.query.url?c.hash(this.query.url):this.sid),b["class"]="embedly-"+this.name,this.elem=d.create("iframe",b),c.each(this.style,function(a,b){this.elem.style[b]=a},this),k.connect(this,a),this.after(),this.elem},after:function(){},replace:function(a){d.replace(a,this.elem)},append:function(a){a.appendChild(this.elem)},resize:function(a){a.width&&this.elem.setAttribute("width",a.width),a.height&&this.elem.setAttribute("height",a.height)},remove:function(){d.remove(this.elem),this._remove&&this._remove()}}),m=l.extend({name:"card",attrs:{frameborder:"0",scrolling:"no",allowtransparency:"true",allowfullscreen:"true"},style:{width:"1px",height:"0px",border:"none",position:"absolute",visibility:"hidden"}});k.createCard=function(a,b,f){if(!j.EMB_POST_MESSAGE)return null;if(!c.isElement(a)||!c.isElement(a.parentNode))return null;if(k.rendering(a))return null;var g={};if(b&&c.isFunction(b.off)&&(f=b,b=null),!c.isNone(b)&&b.url)g=b;else if(c.each(["type","via","chrome","theme","image","description","embed","controls","analytics"],function(b){var e=d.data(a,"card-"+b);c.isNone(e)||(g[b]=e)}),"BLOCKQUOTE"===a.nodeName){var h,i=d.child(a,"h4"),l=d.child(a,"p");if(c.isNone(i)){if(!l)return!1;var n=a.getElementsByTagName("a");if(0===n.length)return!1;h=n[n.length-1],g.url=h.getAttribute("href")}else h=d.child(i,"a"),g.url=h.getAttribute("href"),g.title=d.text(h),g.description=c.isNone(l)?"0":d.text(l)}else"A"===a.nodeName&&(g.url=a.getAttribute("href"));var o,p,q;if(c.each(document.getElementsByTagName("meta"),function(a){q=[a.getAttribute("name"),a.getAttribute("property")],c.contains(q,"twitter:site")?p=a.getAttribute("content"):c.contains(q,"twitter:creator")&&(o=a.getAttribute("content"))}),o?g.twitter_via=o:p&&(g.twitter_via=p),!g.url)return null;var r=e.parse(g.url);if(!r.valid())return null;g.url=r.url;var s={url:g.url};c.isNone(g.type)||(s.type=g.type);var t=new m(s,f);t.send("card.content",g);var u=a.parentNode;return u&&u.offsetWidth&&(t.elem.style.width=u.offsetWidth>600?"600px":u.offsetWidth+"px"),u.insertBefore(t.elem,a),t.on("card.repeat",function(a){var b={url:a.url,via:document.location.toString()};a.embed&&(b.embed=a.embed),k.createCardModal(b,f)}),t.on("modal.stats",function(a){k.createStatsModal(a,f)}),t.on("card.ready",function(){t.ready()}),t.on("card.rendered",function(e){return"error"===e.name?(t.remove(),!1):b&&c.isArray(b.types)&&b.types.length>0&&!c.contains(b.types,e.type)?(t.remove(),!1):(t.rendered=!0,t.elem.style.display="block",t.elem.style.margin="10px auto",t.elem.style.visibility="visible",t.elem.style.position="relative",t.elem.width="600",t.elem.height=e.height?e.height:"300",t.elem.style.width=null,t.elem.style.height=null,t.elem.style.maxWidth="99%",t.elem.style.minWidth="200px",void d.remove(a))}),t};var n=l.extend({name:"button",attrs:{frameborder:"0",scrolling:"no",allowtransparency:"true",height:"20",width:"80"},style:{border:"none"}});k.createButton=function(a,b){if(!c.isElement(a))return null;if(k.rendering(a))return null;var e=d.data(a,"url");c.isNone(e)&&(e=document.location.toString());var g,h={url:e};c.each(["theme","target","lang"],function(b){g=d.data(a,b),c.isNone(g)||(h[b]=g)});var i=f.window.center(635,500);h.left=i.left,h.top=i.top;var j=new n({url:e},b);return j.replace(a),j.on("button.click",c.bind(function(){f.window.innerWidth()<=768||f.mobile()?window.location="http://embed.ly/code?url="+encodeURIComponent(h.url):k.createCardModal(this,b)},h)),j.send("button.data",h),j.on("button.ready",function(){j.ready()}),j};var o=l.extend({name:"modal",attrs:{frameborder:"0",allowtransparency:"true"},style:{border:"none",position:"fixed",top:"0",left:"0",zIndex:"2147483647"},after:function(){this.elem.style.width=f.window.innerWidth()+"px",this.elem.style.height=f.window.innerHeight()+"px"}});k.createCardModal=function(a,b){if(c.isNone(a)&&(a={url:document.location.toString()}),c.isNone(a.url)&&(a.url=document.location.toString()),"window"===a.target)return f.open("http://cdn.embedly.com/widgets/embed?url="+encodeURIComponent(a.url),"Embed Code",635,500),!1;a.t="card";var e=new o(a,b);return e.append(document.body),d.addEvent(window,"resize",function(){e.elem.style.width=f.window.innerWidth()+"px",e.elem.style.height=f.window.innerHeight()+"px"}),e.on("modal.close",function(){document.body.removeChild(e.elem)}),e.on("modal.ready",function(){e.ready()}),e},k.createStatsModal=function(a,b){a.t="stats";var c=new o(a,b);c.append(document.body),c.on("modal.close",function(){document.body.removeChild(c.elem)}),c.on("modal.ready",function(){c.ready()}),d.addEvent(window,"resize",function(){c.elem.style.width=f.window.innerWidth()+"px",c.elem.style.height=f.window.innerHeight()+"px"})};var p=l.extend({name:"xcomm",attrs:{frameborder:"0",allowtransparency:"true"},style:{border:"none",position:"absolute",top:"-9999em",width:"10px",height:"10px"},secure:!0});k.createComm=function(a){var b=new p({},a);return b.append(document.body),b.on("xcomm.ready",function(){b.ready()}),b},b.exports=k},{"./a.js":1,"./browser.js":2,"./class.js":3,"./dom.js":5,"./json.js":7,"./urlparse.js":14,"./utils.js":15,conf:"AqyHQT"}],7:[function(a,b){var c=a("./browser.js");b.exports=function(a){function b(a){return 10>a?"0"+a:a}function c(a){return h.lastIndex=0,h.test(a)?'"'+a.replace(h,function(a){var b=i[a];return"string"==typeof b?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function d(a,e){var h,i,j,k,l,m=f,n=e[a];switch(n&&"[object Date]"===Object.prototype.toString.call(n)&&(n=isFinite(this.valueOf())?this.getUTCFullYear()+"-"+b(this.getUTCMonth()+1)+"-"+b(this.getUTCDate())+"T"+b(this.getUTCHours())+":"+b(this.getUTCMinutes())+":"+b(this.getUTCSeconds())+"Z":null),typeof n){case"string":return c(n);case"number":return isFinite(n)?String(n):"null";case"boolean":case"null":return String(n);case"object":if(!n)return"null";if(f+=g,l=[],"[object Array]"===Object.prototype.toString.apply(n)){for(k=n.length,h=0;k>h;h+=1)l[h]=d(h,n)||"null";return j=0===l.length?"[]":f?"[\n"+f+l.join(",\n"+f)+"\n"+m+"]":"["+l.join(",")+"]",f=m,j}for(i in n)Object.prototype.hasOwnProperty.call(n,i)&&(j=d(i,n),j&&l.push(c(i)+(f?": ":":")+j));return j=0===l.length?"{}":f?"{\n"+f+l.join(",\n"+f)+"\n"+m+"}":"{"+l.join(",")+"}",f=m,j}}var e={};if(window.JSON&&JSON.parse&&JSON.stringify)return window.JSON;var f,g,h=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,i={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};return e.stringify=function(a,b){var c;if(f="",g="","number"==typeof b)for(c=0;b>c;c+=1)g+=" ";else"string"==typeof b&&(g=b);return d("",{"":a})},e.parse=function(){var b,c,d,e,f={'"':'"',"\\":"\\","/":"/",b:"\b",f:"\f",n:"\n",r:"\r",t:" "},g=function(c){a.console.error({name:"SyntaxError",message:c,at:b,text:d})},h=function(a){return a&&a!==c&&g("Expected '"+a+"' instead of '"+c+"'"),c=d.charAt(b),b+=1,c},i=function(){var a,b="";for("-"===c&&(b="-",h("-"));c>="0"&&"9">=c;)b+=c,h();if("."===c)for(b+=".";h()&&c>="0"&&"9">=c;)b+=c;if("e"===c||"E"===c)for(b+=c,h(),("-"===c||"+"===c)&&(b+=c,h());c>="0"&&"9">=c;)b+=c,h();return a=+b,isFinite(a)?a:void g("Bad number")},j=function(){var a,b,d,e="";if('"'===c)for(;h();){if('"'===c)return h(),e;if("\\"===c)if(h(),"u"===c){for(d=0,b=0;4>b&&(a=parseInt(h(),16),isFinite(a));b+=1)d=16*d+a;e+=String.fromCharCode(d)}else{if("string"!=typeof f[c])break;e+=f[c]}else e+=c}g("Bad string")},k=function(){for(;c&&" ">=c;)h()},l=function(){switch(c){case"t":return h("t"),h("r"),h("u"),h("e"),!0;case"f":return h("f"),h("a"),h("l"),h("s"),h("e"),!1;case"n":return h("n"),h("u"),h("l"),h("l"),null}g("Unexpected '"+c+"'")},m=function(){var a=[];if("["===c){if(h("["),k(),"]"===c)return h("]"),a;for(;c;){if(a.push(e()),k(),"]"===c)return h("]"),a;h(","),k()}}g("Bad array")},n=function(){var a,b={};if("{"===c){if(h("{"),k(),"}"===c)return h("}"),b;for(;c;){if(a=j(),k(),h(":"),Object.hasOwnProperty.call(b,a)&&g('Duplicate key "'+a+'"'),b[a]=e(),k(),"}"===c)return h("}"),b;h(","),k()}}g("Bad object")};return e=function(){switch(k(),c){case"{":return n();case"[":return m();case'"':return j();case"-":return i();default:return c>="0"&&"9">=c?i():l()}},function(a){var f;return d=a,b=0,c=" ",f=e(),k(),c&&g("Syntax error"),f}}(),e}(c)},{"./browser.js":2}],8:[function(a,b){var c=a("./browser.js"),d=a("./utils.js"),e=a("./dom.js"),f={_data:null};f.COOKIE_NAME="em_p_uid",f.format=function(a){return a&&d.isObject(a)?d.map(a,function(a,b){return b+":"+a}).sort().join("|"):null},f.parse=function(a){if(!a)return null;var b;return d.reduce(a.split("|"),function(a,c){return null===a?null:(b=c.split(":"),2!==b.length?null:(a[b[0]]=b[1],a))},{})},f.timestamp=function(a){var b;try{b=parseInt(a,10)}catch(c){return!1}return b},f.get=function(){var a=c.cookie.get(f.COOKIE_NAME);if(d.isNone(a))return f.set();var b=f.parse(a),e=f.timestamp(b.t);return e===!1?f.set():d.getTimestamp()-e>15552e6?f.set({u:b.u,l:b.l}):b},f.set=function(a){var b={u:d.getUUID(),t:d.getTimestamp(),l:0};a&&(b=d.extend(b,a));var e=f.format(b);return c.cookie.set(f.COOKIE_NAME,e,365,"https:"===window.location.protocol),e=c.cookie.get(f.COOKIE_NAME),d.isNone(e)?null:f.parse(e)},f.update=function(a){var b=f.get();return b?(b=d.extend(b,a),f.set(b)):!1},f.data=function(){if(f._data)return f._data;var a={mt:d.getTimestamp(),mr:document.referrer,msw:c.window.innerWidth(),msh:c.window.innerHeight()},b=f.get();return b?(a.muu=b.u,a.mut=b.t,a.mul=b.l):a.muu=0,f._data=a,f.update({l:d.getTimestamp()}),f._data},f.send=function(a,b){if(!b||!d.isElement(b.elem))return!1;var c=d.extend(f.data(),{}),g=e.rect(b.elem);g&&(c.mft=g.top,c.mfl=g.left,c.mfw=g.width,c.mfh=g.height),b.send(a,c)},b.exports=f},{"./browser.js":2,"./dom.js":5,"./utils.js":15}],9:[function(a,b){var c=a("./dom.js"),d=a("./utils"),e={_event:null,_observer:null};e.nodeNames=["iframe","a","blockquote"],e.html=function(){var a=document.getElementsByTagName("html");return 0===a.length?null:a[0]},e.recurse=function(a){var b=[];return d.isElement(a)&&b.push(a),d.reduce(a.childNodes,function(a,b){return d.isElement(b)?a.concat(e.recurse(b)):a},b)},e.observer=function(a){var b=e.html();if(null===b)return!1;if(!window.MutationObserver)return!1;e._observer=new window.MutationObserver(function(b){d.each(b,function(b){if("childList"===b.type&&b.addedNodes){var c=Array.prototype.slice.call(b.addedNodes);d.each(c,function(b){d.each(e.recurse(b),function(b){b.nodeName&&d.contains(e.nodeNames,b.nodeName.toLowerCase())&&a.notify("mutation.insert."+b.nodeName.toLowerCase(),b)})})}})});var c={childList:!0,subtree:!0};return e._observer.observe(b,c),!0},e.events=function(a){var b=e.html();return null===b?!1:(e._event=function(b){d.each(e.recurse(b.target),function(b){b.nodeName&&d.contains(e.nodeNames,b.nodeName.toLowerCase())&&a.notify("mutation.insert."+b.nodeName.toLowerCase(),b)})},c.addEvent(b,"DOMNodeInserted",e._event),!0)},e.stop=function(){var a=e.html();return null===a?!1:(e._event&&(c.detachEvent(a,"DOMNodeInserted",e._event),e._event=null),void(e._observer&&(e._observer.disconnect(),e._observer=null)))},e.connect=function(a){return e._event||e._observer?!1:void(e.observer(a)||e.events(a))},b.exports=e},{"./dom.js":5,"./utils":15}],10:[function(a,b){var c=a("./utils.js"),d=a("./urlparse.js"),e=a("./comms.js"),f=a("conf"),g={started:!1};g.connect=function(a,b){var h=d.getDomain(document.location.toString());if(!b&&f.PAGE_PROGRESS_DOMAINS&&!c.contains(f.PAGE_PROGRESS_DOMAINS,h))return!1;if(g.started)return!1;g.started=!0;var i=function(){a.notify("xcomm.page.progress")};e.started?i():(e.connect(a),a.one("xcomm.ready",i))},b.exports=g},{"./comms.js":4,"./urlparse.js":14,"./utils.js":15,conf:"AqyHQT"}],11:[function(a,b){var c=a("./utils.js"),d=a("./dom.js"),e=function(){this.init()};e.prototype.init=function(){var a=this;document.addEventListener?document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,!1),a.ready()},!1):document.attachEvent&&(document.attachEvent("onreadystatechange",function(){"complete"===document.readyState&&(document.detachEvent("onreadystatechange",arguments.callee),a.ready())}),document.documentElement.doScroll&&window===window.top&&!function(){if(!a.isReady){try{document.documentElement.doScroll("left")}catch(b){return void setTimeout(arguments.callee,0)}a.ready()}}()),d.addEvent(window,"load",a.ready)},e.prototype.ready=function(){return this.isReady?!1:(this.isReady=!1,void(this.callback&&this.callback()))},e.prototype.bind=function(a){this.isReady&&a(),this.callback=a},e.prototype.elem=function(a,b,c){var e=!1,f=function(){e===!1&&(e=!0,b.call(c))};a.onload=f,d.addEvent(a,"load",f),a.onreadystatechange=function(){var b=a.readyState;("loaded"===b||"complete"===b)&&(a.onreadystatechange=null,f())}},e.prototype.firstNode=function(){var a=document.getElementsByTagName("head")[0],b=d.child(a,"link");if(b)return b;var c=d.child(a,"style");if(c)return c;var e=d.child(a,"script");return e?e:null},e.prototype.script=function(a,b,d,e){var f=this.firstNode(),g=document.createElement("script");g.type="text/javascript",g.src=a,c.isNone(e)||(g.async=1),this.elem(g,b,d),f.parentNode.insertBefore(g,f)},e.prototype.css=function(a,b,c){var d=this.firstNode(),e=document.createElement("link");e.type="text/css",e.rel="stylesheet",e.href=a,this.elem(e,b,c),d.parentNode.insertBefore(e,d)},b.exports=new e},{"./dom.js":5,"./utils.js":15}],12:[function(a,b){var c=a("./urlparse.js"),d={data:{},results:{},enabled:!1};d.show=function(a){var b=d.data[a],c=d.results[a];d.hub.notify("recommend.show",b,c)},d.add=function(a){var b=c.getQuery(a.elem.src);d.data[b.url]=a,d.enabled&&(a.on("media.stats.recommend",function(c){d.results[c.url]=c.results,a.on("pause",function(){d.show(b.url)}),a.send("addEventListener",{context:"player.js",version:"0.0.8",method:"addEventListener",value:"pause",listener:a.elem.src})}),a.send("media.stats.recommend",{key:b.key,url:b.url}))},d.connect=function(a){a.on("recommend",function(){d.enabled=!0}),a.on("recommend.add",function(a){d.add(a)}),d.hub=a},b.exports=d},{"./urlparse.js":14}],13:[function(a,b){var c=a("./utils.js"),d=a("./urlparse.js"),e=a("conf"),f={};f.youtube={schema:"youtube",re:/youtube\.com\/embed\/([^\/?#]+)/i,url:function(a){var b=f.youtube.re.exec(a);return 2!==b.length?a:"http://www.youtube.com/watch?v="+b[1]}},f.vimeo={schema:"vimeo",re:/player\.vimeo\.com\/video\/([^\/?#]+)/i,url:function(a){var b=f.vimeo.re.exec(a);return 2!==b.length?a:"http://vimeo.com/"+b[1]}},f.soundcloud={schema:"soundcloud",re:/w\.soundcloud\.com\/player\/\?/,url:function(a){var b=d.getQuery(a);if(b.url){var c=/api\.soundcloud\.com\/tracks\/([^\/?#]+)/.exec(b.url);if(2===c.length)return"https://soundcloud.com/track/"+c[1]}return a}},f.providers=[f.youtube,f.vimeo,f.soundcloud],f.provider=function(a){return c.reduce(f.providers,function(b,c){return c.re.test(a)?c:b},null)},f.replace=function(a,b){if(c.isNone(a)||!c.isElement(a))return null;if("IFRAME"!==a.nodeName)return null;if(!a.src||!c.isString(a.src))return null;if(!b.key)return!1;var g=a.src;g=g.replace(/&/g,"&");var h=f.provider(g);if(null===h)return null;var i="https:"===window.location.protocol?"https:":"http:";"file://"===g.substr(0,7)&&(g=g.substr(5)),"//"===g.substr(0,2)&&(g=i+g);var j=c.extend({},b,{url:h.url(g),src:g,schema:h.schema,type:"text/html"}),k=i+"//cdn.embedly.com/widgets/";e.EMB_DEBUG&&(k=e.EMB_FRAME_SRC);var l=k+"media.html?"+d.createQuery(j);return a.src=l,a},b.exports=f},{"./urlparse.js":14,"./utils.js":15,conf:"AqyHQT"}],14:[function(a,b){var c=a("./utils.js"),d={};d.createQuery=function(a){var b=[],d="";return a&&c.isObject(a)&&!c.isEmptyObject(a)?(c.each(a,function(a,c){b.push(encodeURIComponent(c)+"="+encodeURIComponent(a))}),b.sort(),b.join("&")):d},d.parseQuery=function(a){var b={};if(!a||!c.isString(a))return b;("#"===a.substr(0,1)||"?"===a.substr(0,1))&&(a=a.substr(1));var d=a.split("&");return c.each(d,function(a){if(!a)return!0;var c=a.split("="),d=decodeURIComponent(c[0]);b[d]=1===c.length?"":decodeURIComponent(2===c.length?c[1]:c.slice(1).join("="))}),b},d.getQuery=function(a){if(!a||!c.isString(a))return{};var b=a.split("?");return 2===b.length?d.parseQuery(b[1]):b.length>2?d.parseQuery(b.slice(1).join("?")):{}},d.appendQuery=function(a,b){if(!a||!c.isString(a))return null;var e=a.split("?"),f=e[0];if(!b||!c.isObject(b)||c.isEmptyObject(b))return a;var g=d.getQuery(a);return g=c.extend(g,b),c.isEmptyObject(g)?a:[f,d.createQuery(g)].join("?")},d.removeQuery=function(a,b){if(!a||!c.isString(a))return null;var e=a.split("?"),f=e[0],g=d.getQuery(a);return g.hasOwnProperty(b)&&delete g[b],c.isEmptyObject(g)?f:[f,d.createQuery(g)].join("?")},d.getOrigin=function(a){if(!a||!c.isString(a))return null;if(!/^https?:\/\//.test(a))return null;var b=a.split("/").slice(0,3).join("/");return-1===b.indexOf(".")?null:b},d.getDomain=function(a){var b=d.getOrigin(a);return b?b.replace(/^https?:\/\//,""):null},d.Parsed=function(a,b){this.init(a,b)},d.Parsed.prototype.init=function(a,b){this.original=a,this.url=b,this._valid=!1,this.url=b},d.Parsed.prototype.valid=function(a){return(a===!0||a===!1)&&(this._valid=a),this._valid},d.parse=function(a){var b=a,e="https:"===window.location.protocol?"https:":"http:";a=a?c.trim(a):a;var f=new d.Parsed(b,a);return a?/^https?:\/\/[^\/]+\.[^\/]/i.test(a)?(f.valid(!0),f):/^\w+:/i.test(a)?f:"#"===a[0]?f:/^\/\/[^\/]+\.[^\/]/i.test(a)?(f.valid(!0),f.url=e+a,f):/^\/([^\/]+|$)/i.test(a)?(f.valid(!0),f.url=d.getOrigin(window.location.toString())+a,f):/^[^\/]+\.[^\/]/i.test(a)?(f.valid(!0),f.url="http://"+a,f):f:f},d.addHash=function(a,b){return-1===a.indexOf("#")?a+"#"+b:a+"&"+b},b.exports=d},{"./utils.js":15}],15:[function(a,b){var c=a("conf"),d={},e={},f=Array.prototype,g=Object.prototype,h=Function.prototype,i=(f.push,f.slice),j=(f.concat,g.toString),k=f.forEach,l=(f.map,f.reduce),m=(f.reduceRight,f.filter,f.every),n=(f.some,f.indexOf),o=(f.lastIndexOf,Array.isArray,Object.keys,h.bind);d.identity=function(a){return a},d.each=function(a,b,c){if(null!=a)if(k&&a.forEach===k)a.forEach(b,c);else if(a.length===+a.length){for(var d=0,f=a.length;f>d;d++)if(d in a&&b.call(c,a[d],d,a)===e)return}else for(var h in a)if(g.hasOwnProperty.call(a,h)&&b.call(c,a[h],h,a)===e)return},d.map=function(a,b,c){var e=[];return null==a?e:Array.prototype.map&&a.map===Array.prototype.map?a.map(b,c):(d.each(a,function(a,d,f){e[e.length]=b.call(c,a,d,f)}),e)},d.reduce=function(a,b,c,e){var f=arguments.length>2;if(null==a&&(a=[]),l&&a.reduce===l)return e&&(b=d.bind(b,e)),f?a.reduce(b,c):a.reduce(b); +if(d.each(a,function(a,d,g){f?c=b.call(e,c,a,d,g):(c=a,f=!0)}),!f)throw new TypeError("Reduce of empty array with no initial value");return c},d.zip=function(a){return d.map(a[0],function(b,c){return b.map(a,function(a){return a[c]})})},d.extend=function(a){return d.each(Array.prototype.slice.call(arguments,1),function(b){for(var c in b)void 0!==b[c]&&(a[c]=b[c])}),a},d.contains=function(a,b){if(!n){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return!0;return!1}return a.indexOf(b)>-1},d.every=function(a,b,c){b||(b=d.identity);var f=!0;return null==a?f:m&&a.every===m?a.every(b,c):(d.each(a,function(a,d,g){return(f=f&&b.call(c,a,d,g))?void 0:e}),!!f)},d.indexOf=function(a,b){if(null==a)return-1;var c=0,d=a.length;if(n&&a.indexOf===n)return a.indexOf(b);for(;d>c;c++)if(a[c]===b)return c;return-1};var p=function(){};d.bind=function(a,b){var c,e;if(o&&a.bind===o)return o.apply(a,i.call(arguments,1));if(!d.isFunction(a))throw new TypeError;return c=i.call(arguments,2),e=function(){if(!(this instanceof e))return a.apply(b,c.concat(i.call(arguments)));p.prototype=a.prototype;var d=new p;p.prototype=null;var f=a.apply(d,c.concat(i.call(arguments)));return Object(f)===f?f:d}},d.get=function(a,b,c){if(c=d.isNone(c)?null:c,d.isNone(b)||!d.isString(b)||!a)return c;if(""===b)return a;var e=b.split("."),f=e.splice(0,1)[0];return a.hasOwnProperty(f)?d.get(a[f],e.join("."),c):c},d.isFunction=function(a){try{return/^\s*\bfunction\b/.test(a)}catch(b){return!1}},d.isNone=function(a){return null===a||void 0===a},d.isString=function(a){return"[object String]"===j.call(a)},d.isNumber=function(a){return"[object Number]"===j.call(a)},d.isDate=function(a){return"[object Date]"===j.call(a)},d.isObject=function(a){return"[object Object]"===j.call(a)},d.isArray=function(a){return"[object Array]"===j.call(a)},d.isElement=function(a){return!d.isNone(a)&&!d.isNone(a.nodeType)&&1===a.nodeType},d.isEmptyObject=function(a){if(d.isObject(a)){for(var b in a)if(g.hasOwnProperty.call(a,b))return!1;return!0}return!1},d.bool=function(a){return d.isNone(a)?null:"true"===a||"1"===a||1===a||a===!0?!0:"false"===a||"0"===a||0===a||a===!1?!1:null},d.assert=function(a,b){if(!a)throw b||"Assertion Failed"},d.getUUID=function(){return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,function(a){var b=16*Math.random()|0,c="x"===a?b:3&b|8;return c.toString(16)})},d.getTimestamp=function(){var a=new Date;return a.getTime()},d.trim=function(a){return a.replace(/^\s+|\s+$/g,"")},d.capitalize=function(a){return a.charAt(0).toUpperCase()+a.substr(1)},d.camelCase=function(a){var b=a.split("-");return b.length>1&&(a=b[0],a+=d.map(b.slice(1),function(a){return a[0].toUpperCase()+a.substr(1)}).join("")),a},d.truncate=function(a,b){return a?(b=b?b:50,a.lengthc;c++)b=31*b+a.charCodeAt(c)<<0;return(Math.pow(2,31)+b).toString()},d.rgbToHex=function(a,b,c){return"#"+((1<<24)+(a<<16)+(b<<8)+c).toString(16).slice(1)},c.EMB_DEBUG===!0&&(window._=d),b.exports=d},{conf:"AqyHQT"}],16:[function(a,b){var c=a("./utils.js"),d=a("./dom.js"),e=a("./browser.js"),f=function(){this.init()};f.prototype.init=function(){this._elements=[],this._listening=!1},f.prototype.viewable=function(a){if(!a.getBoundingClientRect)return!0;var b;try{b=a.getBoundingClientRect()}catch(c){return!1}return b.bottom>=0&&b.right>=0&&b.top<=(window.innerHeight||document.documentElement.clientHeight)&&b.left<=(window.innerWidth||document.documentElement.clientWidth)},f.prototype.check=function(){this.freeze=!0;var a=[];c.each(this._elements,c.bind(function(b,c){if(this.viewable(b.elem)){try{b.func.call(this)}catch(d){e.console.log(d)}a.push(c)}},this)),c.each(a,function(a){this._elements.splice(a,1)},this),0===this._elements.length&&this.stop(),this.freeze=!1},f.prototype.stop=function(){try{d.detachEvent(window,"DOMContentLoaded",this.handler),d.detachEvent(window,"load",this.handler),d.detachEvent(window,"resize",this.handler),d.detachEvent(window,"scroll",this.handler)}catch(a){}this.handler=null,this._listening=!1},f.prototype.listen=function(){return this._listening?!1:(this._listening=!0,this.handler=c.bind(function(){!this.freeze&&this._elements.length&&this.check()},this),d.addEvent(window,"DOMContentLoaded",this.handler),d.addEvent(window,"load",this.handler),d.addEvent(window,"resize",this.handler),void d.addEvent(window,"scroll",this.handler))},f.prototype.on=function(a,b,c){"viewable"===a&&(this._elements.push({elem:b,func:c}),this.listen(),this.check())},b.exports=f},{"./browser.js":2,"./dom.js":5,"./utils.js":15}],conf:[function(a,b){b.exports=a("AqyHQT")},{}],AqyHQT:[function(a,b){!function(a){a.EMB_DEBUG=!1,a.EMB_HTTPS="https:"===window.location.protocol?!0:!1,a.EMB_ORIGIN=(a.EMB_HTTPS?"https":"http")+"://cdn.embedly.com",a.EMB_FRAME_SRC=a.EMB_ORIGIN+"/widgets/",a.EMB_SECURE_FRAME_SRC="https://cdn.embedly.com/widgets/",a.EMB_POST_MESSAGE=!!window.postMessage,a.EMB_PROGRESS=!0,a.EMB_APP_API="https://app.embed.ly",a.EMB_API_KEY="fd92ebbc52fc43fb98f69e50e7893c13";var b=window.location.pathname.split(".")[0].split("/");a.EMB_GROUP=b[b.length-1].toLowerCase(),a.PAGE_PROGRESS_DOMAINS=[]}("undefined"==typeof b?this.conf={}:b.exports)},{}],19:[function(a){if(window.embedly&&window.embedly.look)return window.embedly.look(),!1;var b=a("./common/iframe.js"),c=a("./common/browser.js"),d=a("./common/utils.js"),e=a("./common/a.js"),f=a("./common/dom.js"),g=a("./common/ready.js"),h=a("./common/mutations.js"),i=a("./common/swap.js"),j=a("./common/meta.js"),k=a("./common/json.js"),l=a("./common/viewport.js"),m=a("./common/page.js"),n=a("./common/recommend.js"),o=new e,p=new l;n.connect(o);var q=function(){var a=/emb_(\d+)/.exec(c.location.hash());return a?a[1]:null},r={cardSelectors:[{selector:".embedly-card"}],buttonSelectors:[".embedly-button"],analytics:null,recommend:!1,shared:q()},s=function(a){var b;try{b=k.parse(a.data)}catch(d){return c.console.error(d),!1}o.notify("window.message",a,b)};f.addEvent(window,"message",s);var t=function(a,c,e){var f;if(d.isFunction(c)&&(e=c,c={}),d.isString(a))return".embedly-card"===a?!1:(r.cardSelectors.push({selector:a}),B(),!0);if(!d.isElement(a)&&d.isObject(a)){if(!a.selector&&!a.types)return!1;var g={};if(d.isArray(a.types)&&a.types.length>0&&(g.types=a.types),a.selector)g.selector=a.selector,r.cardSelectors.push(g);else{var h=r.cardSelectors.reduce(function(a,b){return".embedly-card"===b.selector?b:a},{});if(!h)return!1;h.types=g.types}}return!d.isElement(a)||"a"!==a.nodeName.toLowerCase()&&"blockquote"!==a.nodeName.toLowerCase()||(f=b.createCard(a,c,o)),f&&(f.one("card.rendered",function(){o.notify("card.rendered",f.elem,f),p.on("viewable",f.elem,function(){f.send("card.view")})}),f.on("resize",function(){o.notify("card.resize",f.elem,f)})),d.isFunction(e)&&e.call(f,f),o.notify("card.created",f),f},u=function(a){var c;return d.isString(a)?(r.buttonSelectors.push(a),B(),!0):(d.isElement(a)&&"a"===a.nodeName.toLowerCase()&&(c=b.createButton(a,o)),o.notify("button.created",c),c)},v=function(a,c){var e;e=d.isString(a)?{url:a}:a;var f=b.createCardModal(e,o);return d.isFunction(c)&&c.call(f,f),f},w=function(a){if("1"===f.data(a,"connected"))return!1;f.data(a,"connected","1");var c=b.connect({elem:a},o);c.one("media.ready",function(){c.ready(),p.on("viewable",c.elem,function(){c.send("media.view")}),o.notify("recommend.add",c),o.notify("media.ready",c)}),c.send("media.ready")},x=function(a){return a&&a.key?(r.analytics=a,void B()):!1},y=function(){o.notify("recommend"),B()},z=function(a,b){return"."===a.substr(0,1)?f.hasClass(b,a.substr(1))?!0:!1:d.contains(f.all(a),b)?!0:!1},A=function(a){if(("A"===a.nodeName||"BLOCKQUOTE"===a.nodeName)&&d.each(r.cardSelectors,function(b){z(b.selector,a)&&t(a,b)}),"A"===a.nodeName&&d.each(r.buttonSelectors,function(b){z(b,a)&&u(a)}),"IFRAME"===a.nodeName)if("embedly-embed"===a.className)w(a);else if(a.src&&/\/\/cdn\.embedly\.com\/widgets\/media\.html/.test(a.src))w(a);else if(null!==r.analytics&&r.analytics.replace){var b=i.replace(a,r.analytics);null!==b&&w(b)}},B=function(){d.each(r.cardSelectors,function(a){d.each(f.all(a.selector),function(a){A(a)})}),d.each(r.buttonSelectors,function(a){d.each(f.all(a),function(a){A(a)})}),d.each(f.all("iframe"),function(a){A(a)}),o.notify("look.done")};o.on("mutation.insert.a",A),o.on("mutation.insert.blockquote",A),o.on("mutation.insert.iframe",A),o.on("media.ready",function(a){j.send("media.meta",a)}),o.on("card.rendered",function(a,b){j.send("card.meta",b)}),o.on("card.rendered",function(a,b){if(!r.shared)return!1;if(!b.query||!b.query.url)return!1;var e=d.hash(b.query.url);return e!==r.shared?!1:(r.shared=null,void setTimeout(function(){var a=f.rect(b.elem);return a&&a.top?void c.animateScroll(a.top-5,500):!1},500))});var C=function(a,b){o.on(a,b)},D=function(a,b){o.off(a,b)},E=function(){f.detachEvent(window,"message",s),h.stop(),o.data={},window.embedly=null},F=function(){var a=Array.prototype.slice.call(arguments,0);if(0===a.length)return null;var b=a.splice(0,1)[0];switch(b){case"card":return t.apply(window,a);case"button":return u.apply(window,a);case"modal":return v.apply(window,a);case"look":return B.apply(window,a);case"on":return C.apply(window,a);case"off":return D.apply(window,a);case"kill":return E.apply(window,a);case"analytics":return x.apply(window,a);case"recommend":return y.apply(window,a)}return null},G=[];window.embedly&&d.isFunction(window.embedly)&&d.isArray(window.embedly.q)&&(G=window.embedly.q),window.embedly=function(){return F.apply(window,arguments)},window.embedly.card=function(a){return t(a)},window.embedly.button=function(a){return u(a)},window.embedly.modal=function(a){return v(a)},window.embedly.look=function(a){return B(a)},d.each(G,function(a){window.embedly.apply(window,a)}),h.connect(o),m.connect(o),g.bind(B),B(),d.isFunction(window.onEmbedlyReady)&&window.onEmbedlyReady.apply(this,[window.embedly])},{"./common/a.js":1,"./common/browser.js":2,"./common/dom.js":5,"./common/iframe.js":6,"./common/json.js":7,"./common/meta.js":8,"./common/mutations.js":9,"./common/page.js":10,"./common/ready.js":11,"./common/recommend.js":12,"./common/swap.js":13,"./common/utils.js":15,"./common/viewport.js":16}]},{},[19])}(); \ No newline at end of file diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 7cd87cbb..67eb5517 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -632,9 +632,10 @@ Metamaps.Create = { * */ Metamaps.TopicCard = { - openTopicCard: null, //stores the JIT local ID of the topic with the topic card open - linkActionsString: '
    Remove
    ', + openTopicCard: null, //stores the topic that's currently open + authorizedToEdit: false, // stores boolean for edit permission for open topic card init: function () { + var self = Metamaps.TopicCard; // initialize best_in_place editing $('.authenticated div.permission.canEdit .best_in_place').best_in_place(); @@ -645,31 +646,57 @@ Metamaps.TopicCard = { $('.showcard').draggable({ handle: ".metacodeImage" }); - }, - fadeInShowCard: function (topic) { - $('.showcard').fadeIn('fast'); - Metamaps.TopicCard.openTopicCard = topic.isNew() ? topic.cid : topic.id; + + embedly('on', 'card.rendered', self.embedlyCardRendered); }, /** * Will open the Topic Card for the node that it's passed * @param {$jit.Graph.Node} node */ showCard: function (node) { + var self = Metamaps.TopicCard; var topic = node.getData('topic'); + self.openTopicCard = topic; + self.authorizedToEdit = topic.authorizeToEdit(Metamaps.Active.Mapper); //populate the card that's about to show with the right topics data - Metamaps.TopicCard.populateShowCard(topic); - Metamaps.TopicCard.fadeInShowCard(topic); + self.populateShowCard(topic); + $('.showcard').fadeIn('fast'); }, hideCard: function () { + var self = Metamaps.TopicCard; + $('.showcard').fadeOut('fast'); - Metamaps.TopicCard.openTopicCard = null; + self.openTopicCard = null; + self.authorizedToEdit = false; + }, + embedlyCardRendered: function (iframe) { + var self = Metamaps.TopicCard; + + $('#embedlyLinkLoader').hide(); + $('#embedlyLink').fadeIn('fast'); + if (self.authorizedToEdit) { + $('.embeds').append('
    '); + $('#linkremove').click(self.removeLink); + } + }, + removeLink: function () { + var self = Metamaps.TopicCard; + self.openTopicCard.save({ + link: null + }); + $('.embeds').empty(); + $('.attachments').removeClass('hidden'); + $('.addAttachment').show(); + $('.CardOnGraph').removeClass('hasAttachment'); }, bindShowCardListeners: function (topic) { var self = Metamaps.TopicCard; var showCard = document.getElementById('showcard'); + var authorized = self.authorizedToEdit; + // get mapper image var setMapperImage = function (mapper) { $('.contributorIcon').attr('src', mapper.get('image')); @@ -687,7 +714,6 @@ Metamaps.TopicCard = { $('.attachments').append(addLinkDiv); $('.showcard #addLinkReset').click(resetFunc); $('.showcard #addLinkInput input').bind("paste keyup",inputEmbedFunc); - $('#addLinkInput input').focus(); }; var resetFunc = function () { @@ -712,38 +738,31 @@ Metamaps.TopicCard = { 'data-card-description': '0', href: text }).html(text); - //embedlyEl.embedly({ - // query: {maxwidth: 300}, - // key: '7983300f4c1f48569ca242e3d6bff1e9' - //}); $('.addLink').remove(); + $('.attachments').addClass('hidden'); $('.embeds').append(embedlyEl); + $('.embeds').append('
    '); + var loader = new CanvasLoader('embedlyLinkLoader'); + loader.setColor('#4fb5c0'); // default is '#000000' + loader.setDiameter(28); // default is 40 + loader.setDensity(41); // default is 40 + loader.setRange(0.9); // default is 1.3 + loader.show(); // Hidden by default embedly('card', document.getElementById('embedlyLink')); $('.CardOnGraph').addClass('hasAttachment'); - $('.attachments').append(self.linkActionsString); - bindLinkActionListeners(); } }, 100); }; - var removeLinkFunc = function () { - topic.save({ - link: null - }); - $('.embeds').empty(); - $('.linkActions').remove(); - $('.addAttachment').show(); - $('.CardOnGraph').removeClass('hasAttachment'); - }; - var bindLinkActionListeners = function () { - $('#linkremove').click(removeLinkFunc); - }; - if (topic.get('link')) { - //$('#embedlyLink').embedly({ - // query: {maxwidth: 300}, - // key: '7983300f4c1f48569ca242e3d6bff1e9' - //}); + + // initialize the link card, if there is a link + if (topic.get('link') && topic.get('link') !== '') { + var loader = new CanvasLoader('embedlyLinkLoader'); + loader.setColor('#4fb5c0'); // default is '#000000' + loader.setDiameter(28); // default is 40 + loader.setDensity(41); // default is 40 + loader.setRange(0.9); // default is 1.3 + loader.show(); // Hidden by default embedly('card', document.getElementById('embedlyLink')); - bindLinkActionListeners(); } $('.showcard #addlink').click(addLinkFunc); @@ -761,38 +780,79 @@ Metamaps.TopicCard = { } }); - $('.showcard .metacodeTitle').click(function () { + var metacodeLiClick = function () { + selectingMetacode = false; + var metacodeName = $(this).find('.mSelectName').text(); + var metacode = Metamaps.Metacodes.findWhere({ + name: metacodeName + }); + $('.CardOnGraph').find('.metacodeTitle').html(metacodeName) + .append('
    ') + .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); + $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); + topic.save({ + metacode_id: metacode.id + }); + Metamaps.Visualize.mGraph.plot(); + $('.metacodeSelect').hide(); + $('.metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + }; + + var openMetacodeSelect = function (event) { if (!selectingMetacode) { selectingMetacode = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow $('.metacodeSelect').show(); - $('.metacodeSelect li li').click(function () { - selectingMetacode = false; - var metacodeName = $(this).find('.mSelectName').text(); - var metacode = Metamaps.Metacodes.findWhere({ - name: metacodeName - }); - $('.CardOnGraph').find('.metacodeTitle').text(metacodeName) - .attr('class', 'metacodeTitle mbg' + metacodeName.replace(/\s/g, '')); - $('.CardOnGraph').find('.metacodeImage').css('background-image', 'url(' + metacode.get('icon') + ')'); - topic.save({ - metacode_id: metacode.id - }); - Metamaps.Visualize.mGraph.plot(); - $('.metacodeTitle').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); - setTimeout(function () { - $('.metacodeTitle').hide(); - $('.showcard .icon').css('z-index', '1'); - }, 500); - }); - } else { - selectingMetacode = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.metacodeSelect').hide(); + event.stopPropagation(); } - }); + }; + var hideMetacodeSelect = function () { + selectingMetacode = false; + $('.metacodeSelect').hide(); + $('.metacodeTitle').hide(); + $('.showcard .icon').css('z-index', '1'); + }; + + if (authorized) { + $('.showcard .metacodeTitle').click(openMetacodeSelect); + $('.showcard').click(hideMetacodeSelect); + $('.metacodeSelect > ul li').click(function (event){ + event.stopPropagation(); + }); + $('.metacodeSelect li li').click(metacodeLiClick); + + var bipName = $(showCard).find('.best_in_place_name'); + bipName.best_in_place(); + bipName.bind("best_in_place:activate", function () { + var $el = bipName.find('textarea'); + var el = $el[0]; + + $el.attr('maxlength', '140'); + + $('.showcard .title').append('
    '); + + var callback = function (data) { + $('.titleCounter').html(data.all + '/140'); + }; + Countable.live(el, callback); + }); + bipName.bind("best_in_place:deactivate", function () { + $('.titleCounter').remove(); + }); + + //bind best_in_place ajax callbacks + bipName.bind("ajax:success", function () { + var name = Metamaps.Util.decodeEntities($(this).html()); + topic.set("name", name); + }); + + $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { + this.innerHTML = this.innerHTML.replace(/\r/g, '') + var desc = $(this).html(); + topic.set("desc", desc); + }); + } // ability to change permission var selectingPermission = false; @@ -825,39 +885,6 @@ Metamaps.TopicCard = { } }); } - - if (topic.authorizeToEdit(Metamaps.Active.Mapper)) { - var bipName = $(showCard).find('.best_in_place_name'); - bipName.best_in_place(); - bipName.bind("best_in_place:activate", function () { - var $el = bipName.find('textarea'); - var el = $el[0]; - - $el.attr('maxlength', '140'); - - $('.showcard .title').append('
    '); - - var callback = function (data) { - $('.titleCounter').html(data.all + '/140'); - }; - Countable.live(el, callback); - }); - bipName.bind("best_in_place:deactivate", function () { - $('.titleCounter').remove(); - }); - - //bind best_in_place ajax callbacks - bipName.bind("ajax:success", function () { - var name = Metamaps.Util.decodeEntities($(this).html()); - topic.set("name", name); - }); - - $(showCard).find('.best_in_place_desc').bind("ajax:success", function () { - this.innerHTML = this.innerHTML.replace(/\r/g, '') - var desc = $(this).html(); - topic.set("desc", desc); - }); - } }, populateShowCard: function (topic) { var self = Metamaps.TopicCard; @@ -902,24 +929,28 @@ Metamaps.TopicCard = { } var desc_nil = "Click to add description..."; - var addAttachmentHidden=''; - nodeValues.attachments = ''; - if (topic.get('link') && topic.get('link')!=='') { + nodeValues.attachmentsHidden = ''; + if (topic.get('link') && topic.get('link')!== '') { nodeValues.embeds = ''; nodeValues.embeds += topic.get('link'); - nodeValues.embeds += ''; - addAttachmentHidden='hidden'; - nodeValues.attachments += self.linkActionsString; + nodeValues.embeds += '
    '; + nodeValues.attachmentsHidden = 'hidden'; nodeValues.hasAttachment = "hasAttachment"; } else { nodeValues.embeds = ''; nodeValues.hasAttachment = ''; } - nodeValues.attachments += '
    '; - nodeValues.attachments+= ''; - nodeValues.attachments+= '
    Upload a file
    '; + + if (authorized) { + nodeValues.attachments = '
    '; + nodeValues.attachments += ''; + nodeValues.attachments += '
    Upload a file
    '; + } else { + nodeValues.attachmentsHidden = 'hidden'; + nodeValues.attachments = ''; + } nodeValues.permission = topic.get("permission"); nodeValues.mk_permission = topic.get("permission").substring(0, 2); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 00212f5c..ebb6c2b5 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -273,15 +273,17 @@ input[type="submit"]:active { } .openMetacodeSwitcher { display: block; - height: 20px; - width: 20px; - background-image: url('MMCCicon_metacode_set_change.png'); - background-size: contain; + height: 16px; + width: 16px; + background-image: url(metacodesettings_sprite.png); position: absolute; z-index: 2; top: 20px; left: 30px; } +.openMetacodeSwitcher:hover { + background-position: -16px 0; +} #metacodeImg { height: 120px; } @@ -1195,7 +1197,7 @@ float: left; display: none; } #lightbox_main { - width: 770px; + width: 800px; height: auto; margin: 0 auto; z-index: 2; @@ -1223,24 +1225,22 @@ float: left; border: solid 2px #000; } #lightbox_overlay #lightbox_main a#lightbox_close { - /*background-image: url(../images/barometer_close.png);*/ + background-image: url(xlightbox.png); cursor: pointer; - height: 42px; - outline-color: -moz-use-text-color; + height: 32px; outline-style: none; outline-width: medium; overflow: hidden; position: absolute; - top: -23px; - right: -22px; - width: 42px; + top: -8px; + right: -32px; + width: 32px; z-index: 4; border: none; + background-repeat: no-repeat; + background-position: center center; } #lightbox_content { -/* background: white url(metacode-watermark.png) 443px -30px no-repeat; - padding: 20px; - border-radius: 5px;*/ width: 552px; height: 434px; background-color: #e0e0e0; @@ -1658,6 +1658,7 @@ float: left; } .permText { width: 360px; + height: 32px; margin: 16px 20px 0; text-align: center; float: right; @@ -1735,6 +1736,9 @@ float: left; #helpWrapper li:hover, #helpWrapper li.ui-state-active { border-bottom: 2px solid #00BCD4; } +#helpWrapper li.ui-state-active a, #helpWrapper li.ui-state-hover a { + color: #424242; +} #helpWrapper li a { padding: 0; font-family: 'din-medium', helvetica, sans-serif; @@ -1743,6 +1747,9 @@ float: left; #quickReference { padding: 32px 0 0 0; } +#quickReference .ui-widget-content { + color: #424242; +} #quickReference ul { width: 150px; } @@ -1769,6 +1776,35 @@ float: left; #upYourSkillz { margin: 0 68px; } +#moreResources { + padding: 16px 0 0 0; + font-size: 14px; + line-height: 18px; + color: #424242; +} +.resourcesColumn { + margin-top: 32px; + width: 273px; + display: inline-block; + text-align: center; + text-transform: uppercase; +} +.resourcesColumn ul { + list-style: none; +} +.resourcesColumn li { + margin-top: 16px; +} +.resourcesColumn a.button { + background-color: #00BCD4; + color: #FFF; + padding-top: 8px; + height: 24px; +} +.resourcesColumn li a { + color: #424242; +} + /* Admin Pages */ .blackBox { diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 1d9b9cb1..cfa49d44 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -288,21 +288,29 @@ cursor: pointer; position: absolute; line-height: 24px; height:24px; - font-size: 20px; + font-size: 24px; display: none; width: 90%; - padding: 11px 0 11px 10%; + padding: 13px 0 9px 10%; background-color: #64BC61; - color: #000; + color: #424242; } .permission.canEdit .metacodeTitle { cursor:pointer; - background-image: url(MMCCicon_maximize_arrow_black.png); - background-repeat:no-repeat; - background-position: right center; } -.permission.canEdit .metacodeTitle.minimize { - background-image: url(MMCCicon_minimize_arrow_black.png); + +.permission.canEdit .expandMetacodeSelect { + position: absolute; + top: 16px; + right: 16px; + width: 16px; + height: 16px; + background-image: url(arrowright_sprite.png); + background-repeat: no-repeat; + background-position: 0 -32px; +} +.permission.canEdit .minimize .expandMetacodeSelect { + } .CardOnGraph .metacodeImage { @@ -332,6 +340,7 @@ cursor: pointer; position: relative; line-height: 14px; font-size: 14px; + font-family: helvetica, sans-serif; display:block; width: 100%; margin:0; @@ -348,8 +357,13 @@ padding: 9px 12px; .CardOnGraph .metacodeSelect ul li:hover { background-color: #E0E0E0; } -.CardOnGraph .metacodeSelect ul li img, .CardOnGraph .metacodeSelect ul li .mSelectName { -float:left; +.CardOnGraph .metacodeSelect ul li img { + position: absolute; + top: 4px; + left: 8px; +} +.CardOnGraph .metacodeSelect ul li .mSelectName { + padding-left: 28px; } .CardOnGraph .metacodeSelect ul ul { display:none; @@ -362,6 +376,16 @@ float:left; .CardOnGraph .metacodeSelect li:hover ul { display: block; } +.CardOnGraph .metacodeSelect .expandMetacodeSet { + position: absolute; + top: 8px; + right: 8px; + width: 16px; + height: 16px; + background-image: url(arrowright_sprite.png); + background-repeat: no-repeat; + background-position: 0 -32px; +} .CardOnGraph .hoverForTip:hover .tip, .mapCard .hoverForTip:hover .tip { display:block; @@ -380,6 +404,13 @@ float:left; z-index:100; } +#embedlyLink { + display: none; +} +#embedlyLinkLoader { + margin: 0 auto; + width: 28px; +} .CardOnGraph .attachments { border-top: 1px solid #BDBDBD; @@ -486,23 +517,19 @@ font-family: 'din-regular', helvetica, sans-serif; position: relative; } +.CardOnGraph .embeds { + position: relative; +} #linkremove { - height: 12px; - padding: 26px 0 10px; - font-size: 12px; background-image: url(/assets/remove.png); background-repeat: no-repeat; - background-position: center 8px; - width: 48px; - text-align: center; + background-position: center center; + width: 24px; + height: 24px; position: absolute; - top: 0; - right: 8px; + top: 3px; + right: 0; cursor: pointer; - color: #9E9E9E; -} -#linkremove:hover { - color: #616161; } .cardSettings { diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 18da1d36..ee6d5409 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -191,7 +191,10 @@ \ No newline at end of file diff --git a/app/views/shared/_forkmap.html.erb b/app/views/shared/_forkmap.html.erb index e63c098e..4f45a647 100644 --- a/app/views/shared/_forkmap.html.erb +++ b/app/views/shared/_forkmap.html.erb @@ -5,11 +5,7 @@
    <%= form_for Map.new, url: maps_url, remote: true, html: { class: "new_map", id: "fork_map" } do |form|%> - <% if controller_name == "maps" %> -

    Save To New Map

    - <% elsif controller_name == "topics" %> -

    Save As New Map

    - <% end %> +

    Save To New Map

    diff --git a/app/views/shared/_metacodeoptions.html.erb b/app/views/shared/_metacodeoptions.html.erb index d05c5763..0701be4d 100644 --- a/app/views/shared/_metacodeoptions.html.erb +++ b/app/views/shared/_metacodeoptions.html.erb @@ -8,10 +8,11 @@ <% MetacodeSet.order("name").all.each do |set| %>
  • <%= set.name %> +
      <% set.metacodes.sort { |a, b| a.name <=> b.name }.each do |m| %>
    • - <%= m.name %> + <%= m.name %> <%= m.name %>
    • @@ -21,10 +22,11 @@ <% end %>
    • All +
        <% Metacode.order("name").all.each do |m| %>
      • - <%= m.name %> + <%= m.name %> <%= m.name %>
      • From ff6eef7807ee942e4c0788f7789e1c435778c2a0 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sun, 21 Sep 2014 01:02:21 -0400 Subject: [PATCH 103/600] synapse form styling and positioning --- app/assets/images/mCSB_buttons.png | Bin 1394 -> 0 bytes app/assets/javascripts/lib/cloudcarousel.js | 10 + app/assets/javascripts/src/JIT.js | 6 +- .../javascripts/src/Metamaps.GlobalUI.js | 11 +- app/assets/javascripts/src/Metamaps.JIT.js | 41 ++-- app/assets/javascripts/src/Metamaps.js | 38 ++-- app/assets/stylesheets/application.css | 193 +++++++++++------- app/helpers/topics_helper.rb | 1 + app/views/layouts/_templates.html.erb | 14 +- app/views/main/requestinvite.html.erb | 6 - 10 files changed, 200 insertions(+), 120 deletions(-) delete mode 100644 app/assets/images/mCSB_buttons.png diff --git a/app/assets/images/mCSB_buttons.png b/app/assets/images/mCSB_buttons.png deleted file mode 100644 index 44388680c40e583da65717dadc237a5ee9d2448f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1394 zcmbVLZA=?w9KQ}XUNYFo=H$hV^9W>Q(tB%ry_3S|T?^eP?MfAhV|w%sxWV0Z*Mk;x zfG&$OW^=MPvZqdjusT;{OoJ_3chu=MYLg!3H4!Qo)J73@ z$$Ycu6M3O?*Cnw8f|3NuU#Hi(tC)Z)8~K=yF(L;68iGp7B0)aTD(Y~f*eoeF?9*)RuN{ETrka=DP$gyh_ zf#+59RvWV5RGr%kv#KV-W+PS{z$_SS!Hqa+qA2P~n80uh#RwE9igAh|2?oR9_=f;% zn$X1fIA`1zIN6XET@NxS8V-kzVbZ8-%_vUObc}-_ih)LPs8iATNU;*iPcU#|D4h9S?Ya#Co-TwS2i@*PVkHz$6i68w;e#k{#86p|#Wk-T(tYB;ZY-%C@^=PB z)F+12b}azv(UhM6gWNsbP)rec!+10a6oqf&)Ihr|D!PlaA>hR*NCJc7982OfMUZyZ zf#W!BG1;9Mg|ifmnQ7LP;8+SvI~^91GMQMrox*VkZg&!#lb}palfz1vQ`Q95rG#`| z35W^160jS`k`Ki)tS0ihs`*v5Eztqq7FAb6Eou;EYs_%1qzGy_6f4d`temJx9irgW zR2iPnE+Z{r9pgaQEM>7%tUVUBoy1wEmE>>>f!SGtMB-TC|6~jW&Y-c@_)n`Ou0a3A z#Kp!3hsDtm6)-Ov7>t(IDEqZg^s+qi;>F1y~4!(28!;Sx) z53gP$bgwTfycicZb#n*rR&3s!xiW9)#{)e`R%zp0%E;bs+u+u;jiXrf*~zQ<9WKY( z=t=L?gmuS9@8)2}yX$U7PWSEnV&IqHmV4F${bK*Nnc%U@xwW6W8xNN}@&jADWy7*t z(M<(kLr3IH@5DHSPVTACKl9gx72A{B%-{5;f7iRa@P=!qqIXt%ZO7mhSNA=3&HbT6 z4}Kc!`SU_g=a)VA$9KMO$Q?AC&zLkZ;@b_sfpu*B=TnCLseM_G50gcQ>4sN`yrx3_ zCC_!&KH}sP&m4)4Ht%~n+rTFuxU*VXKa^DQ;&th*7oaQ0`g;ydf0F&cd2M*akUO0W zmEGDnc2=vv(? 0) { @@ -763,8 +762,7 @@ Metamaps.JIT = { temp = eventInfo.getNode(); if (temp != false && temp.id != node.id && Metamaps.Selected.Nodes.indexOf(temp) == -1) { // this means a Node has been returned tempNode2 = temp; - Metamaps.Visualize.mGraph.plot(); - + Metamaps.Mouse.synapseEndCoordinates = { x: tempNode2.pos.getc().x, y: tempNode2.pos.getc().y @@ -775,8 +773,7 @@ Metamaps.JIT = { n.setData('dim', 25, 'current'); }); temp.setData('dim', 35, 'current'); - Metamaps.Visualize.mGraph.fx.plotNode(tempNode, Metamaps.Visualize.mGraph.canvas); - Metamaps.Visualize.mGraph.fx.plotNode(temp, Metamaps.Visualize.mGraph.canvas); + Metamaps.Visualize.mGraph.plot(); } else if (!temp) { tempNode2 = null; Metamaps.Visualize.mGraph.graph.eachNode(function (n) { @@ -787,8 +784,6 @@ Metamaps.JIT = { var myY = e.clientY - 30; $('#new_topic').css('left', myX + "px"); $('#new_topic').css('top', myY + "px"); - $('#new_synapse').css('left', myX + "px"); - $('#new_synapse').css('top', myY + "px"); Metamaps.Create.newTopic.x = eventInfo.getPos().x; Metamaps.Create.newTopic.y = eventInfo.getPos().y; Metamaps.Visualize.mGraph.plot(); @@ -803,6 +798,7 @@ Metamaps.JIT = { }, // onDragMoveTopicHandler onDragCancelHandler: function (node, eventInfo, e) { tempNode = null; + if (tempNode2) tempNode2.setData('dim', 25, 'current'); tempNode2 = null; tempInit = false; // reset the draw synapse positions to false @@ -811,7 +807,7 @@ Metamaps.JIT = { Metamaps.Visualize.mGraph.plot(); }, // onDragCancelHandler onDragEndTopicHandler: function (node, eventInfo, e) { - var mapping; + var midpoint = {}, pixelPos, mapping; if (tempInit && tempNode2 == null) { // this means you want to add a new topic, and then a synapse @@ -822,6 +818,13 @@ Metamaps.JIT = { Metamaps.Create.newTopic.addSynapse = false; Metamaps.Create.newSynapse.topic1id = tempNode.id; Metamaps.Create.newSynapse.topic2id = tempNode2.id; + tempNode2.setData('dim', 25, 'current'); + Metamaps.Visualize.mGraph.plot(); + midpoint.x = tempNode.pos.getc().x + (tempNode2.pos.getc().x - tempNode.pos.getc().x) / 2; + midpoint.y = tempNode.pos.getc().y + (tempNode2.pos.getc().y - tempNode.pos.getc().y) / 2; + pixelPos = Metamaps.Util.coordsToPixels(midpoint); + $('#new_synapse').css('left', pixelPos.x + "px"); + $('#new_synapse').css('top', pixelPos.y + "px"); Metamaps.Create.newSynapse.open(); tempNode = null; tempNode2 = null; @@ -830,11 +833,22 @@ Metamaps.JIT = { // this means you dragged an existing node, autosave that to the database if (Metamaps.Active.Map) { mapping = node.getData('mapping'); - mapping.set({ + mapping.save({ xloc: node.getPos().x, yloc: node.getPos().y }); - mapping.save(); + // also save any other selected nodes that also got dragged along + var l = Metamaps.Selected.Nodes.length; + for (var i = l - 1; i >= 0; i -= 1) { + var n = Metamaps.Selected.Nodes[i]; + if (n !== node) { + mapping = n.getData('mapping'); + mapping.save({ + xloc: n.getPos().x, + yloc: n.getPos().y + }); + } + }; } } }, //onDragEndTopicHandler @@ -1114,6 +1128,9 @@ Metamaps.JIT = { if (Metamaps.Visualize.mGraph.busy) return; + // select the node + Metamaps.Control.selectNode(node, e); + // delete old right click menu $('.rightclickmenu').remove(); // create new menu for clicked on node diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 67eb5517..84700063 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -360,7 +360,6 @@ Metamaps.Backbone.init = function () { */ Metamaps.Create = { isSwitchingSet: false, // indicates whether the metacode set switch lightbox is open - metacodeScrollerInit: false, // indicates whether the scrollbar in the custom metacode set space has been init selectedMetacodeSet: null, selectedMetacodeSetIndex: null, selectedMetacodeNames: [], @@ -438,7 +437,8 @@ Metamaps.Create = { $('#metacodeImg').empty().append(newMetacodes).CloudCarousel({ titleBox: $('#metacodeImgTitle'), yRadius: 40, - xPos: 150, + xRadius: 190, + xPos: 170, yPos: 40, speed: 0.3, mouseWheel: true, @@ -522,7 +522,8 @@ Metamaps.Create = { $("#metacodeImg").CloudCarousel({ titleBox: $('#metacodeImgTitle'), yRadius: 40, - xPos: 150, + xRadius: 190, + xPos: 170, yPos: 40, speed: 0.3, mouseWheel: true, @@ -611,6 +612,8 @@ Metamaps.Create = { Metamaps.Create.newTopic.addSynapse = false; Metamaps.Create.newSynapse.topic1id = 0; Metamaps.Create.newSynapse.topic2id = 0; + Metamaps.Mouse.synapseStartCoordinates = []; + Metamaps.Visualize.mGraph.plot(); }, getSearchQuery: function () { var self = Metamaps.Create.newSynapse; @@ -1400,6 +1403,20 @@ Metamaps.Util = { getDistance: function (p1, p2) { return Math.sqrt(Math.pow((p2.x - p1.x), 2) + Math.pow((p2.y - p1.y), 2)); }, + coordsToPixels: function (coords) { + var canvas = Metamaps.Visualize.mGraph.canvas, + s = canvas.getSize(), + p = canvas.getPos(), + ox = canvas.translateOffsetX, + oy = canvas.translateOffsetY, + sx = canvas.scaleOffsetX, + sy = canvas.scaleOffsetY; + var pixels = { + x: (coords.x / (1/sx)) + p.x + s.width/2 + ox, + y: (coords.y / (1/sy)) + p.y + s.height/2 + oy + }; + return pixels; + }, generateOptionsList: function (data) { var newlist = ""; for (var i = 0; i < data.length; i++) { @@ -1727,18 +1744,7 @@ Metamaps.Realtime = { var self = Metamaps.Realtime; var socket = Metamaps.Realtime.socket; - var c = data.usercoords, - canvas = Metamaps.Visualize.mGraph.canvas, - s = canvas.getSize(), - p = canvas.getPos(), - ox = canvas.translateOffsetX, - oy = canvas.translateOffsetY, - sx = canvas.scaleOffsetX, - sy = canvas.scaleOffsetY; - var pixels = { - x: (c.x / (1/sx)) + p.x + s.width/2 + ox, - y: (c.y / (1/sy)) + p.y + s.height/2 + oy - }; + var pixels = Metamaps.Util.coordsToPixels(data.usercoords); $('#compass' + data.userid).css({ left: pixels.x + 'px', top: pixels.y + 'px' @@ -3099,6 +3105,8 @@ Metamaps.Map = { $('.rightclickmenu').remove(); Metamaps.TopicCard.hideCard(); Metamaps.SynapseCard.hideCard(); + Metamaps.Create.newTopic.hide(); + Metamaps.Create.newSynapse.hide(); Metamaps.Realtime.endActiveMap(); } }, diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index ebb6c2b5..711d0b8f 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -230,46 +230,42 @@ input[type="submit"]:active { -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } -#closenewtopic, -#closenewsynapse { - position: absolute; - top: 3px; - right: 3px; -} .new_topic { /* start it off screen while it initializes the spinner, then it will be hidden with jquery */ top: -1000px; left: -1000px; display: block; position: absolute; - width: 300px; - margin: -40px 0 0 -50px; -} -.new_synapse { - display: none; - position: absolute; + width: 340px; + margin: -40px 0 0 -35px; + z-index: 1; } + #new_topic .twitter-typeahead { position: absolute !important; top: 40px; - left: 50px; + left: 35px; z-index: 9999; - width: 202px; - height: 37px; - font-family: ':atp'; + width: 270px; + height: 42px; } .new_topic #topic_name, .new_topic .tt-hint { - width: 190px; - background: rgba(0, 0, 0, 0.8); - height: 25px; + width: 254px; + background: #FFFFFF; + height: 14px; margin: 0; - padding: 5px 5px; - border: 1px solid black; + padding: 14px 8px; + border: none; + border-radius: 2px; outline: none; - font-size: 25px; - line-height: 35px; - color: rgba(255, 255, 255, 0.7); + font-size: 14px; + line-height: 14px; + color: #424242; + font-family: 'din-medium', helvetica, sans-serif; +} +.new_topic .tt-hint { + color: #BDBDBD; } .openMetacodeSwitcher { display: block; @@ -279,7 +275,7 @@ input[type="submit"]:active { position: absolute; z-index: 2; top: 20px; - left: 30px; + left: 16px; } .openMetacodeSwitcher:hover { background-position: -16px 0; @@ -291,27 +287,15 @@ input[type="submit"]:active { float: left; width: 120px; text-align: center; - margin-left: 90px; + margin-left: 110px; } /* synapse autocomplete */ - -.new_topic #topic_name { - color: white; -} -.new_topic .tt-hint { - color: grey; -} -.new_topic #topic_name, -.new_topic .tt-hint { - width: 190px; - background: rgba(0, 0, 0, 0.8); - height: 25px; - margin: 0; - padding: 5px 5px; - border: 1px solid black; - outline: none; - font-size: 18px; - line-height: 35px; +.new_synapse { + display: none; + position: absolute; + z-index: 1; + margin-left: -135px; + margin-top: -21px; } .new_synapse #synapse_desc { color: rgba(255, 255, 255, 0.7); @@ -321,15 +305,18 @@ input[type="submit"]:active { } .new_synapse #synapse_desc, .new_synapse .tt-hint { - width: 200px; - background: rgba(0, 0, 0, 0.8); - height: 18px; + width: 254px; + background: #FFFFFF; + height: 14px; margin: 0; - padding: 5px 5px; - border: 1px solid black; + padding: 14px 8px; + border: none; + border-radius: 2px; outline: none; - font-size: 16px; - line-height: 20px; + font-size: 14px; + line-height: 14px; + color: #424242; + font-family: 'din-medium', helvetica, sans-serif; } label, select, @@ -909,35 +896,98 @@ float: left; #new_topic .tt-suggestion.tt-is-under-cursor, #new_topic .tt-suggestion.tt-is-under-mouse-cursor { - background: #0E161D; + background: #E0E0E0; } #new_topic .tt-suggestion { - padding: 5px; - background: rgba(42, 52, 60, 0.9); - ; + background: #F5F5F5; + width: 270px; + position: relative; } #new_topic .autocompleteSection { float: left; } +#new_topic .topicType { + padding: 4px 0 0 4px; +} #new_topic .topicTitle { - width: 130px; - line-height: 22px; + width: 190px; + line-height: 14px; + font-size: 14px; + padding: 9px 0 9px 4px; +} +#new_topic .expandTopicMetadata { + display:none; + width: 16px; + height: 16px; + position: absolute; + top: 8px; + right: 8px; + background-repeat: no-repeat; + background-image: url(arrowright_sprite.png); + background-position: 0 -32px; +} +#new_topic .tt-suggestion.tt-is-under-cursor .expandTopicMetadata, +#new_topic .tt-suggestion.tt-is-under-mouse-cursor .expandTopicMetadata { + display: block; +} +#new_topic .tt-suggestion.tt-is-under-cursor .topicMetadata, +#new_topic .tt-suggestion.tt-is-under-mouse-cursor .topicMetadata { + display: block; +} +#new_topic .topicMetadata { + position: absolute; + display: none; + top: -18px; + right: -100px; + width: 100px; + height: 70px; + background-color: #E0E0E0; + font-family: 'din-regular', helvetica, sans-serif; + font-size: 14px; } #new_topic .topicPermission { - width: 20px; - height: 20px; + width: 32px; + height: 32px; background-repeat: no-repeat; - background-position: center center; - background-size: 16px 16px; + background-image: url(permissions32_sprite.png); + position: absolute; + bottom: 4px; + right: 4px; +} +#new_topic .topicPermission.commons { + background-position: 0 0; +} +#new_topic .topicPermission.public { + background-position: -64px 0; +} +#new_topic .topicPermission.private { + background-position: -32px 0; +} +#new_topic .topicNumMaps { + height: 14px; + padding: 1px 0 1px 32px; + background-image: url(metamap16.png); + background-repeat: no-repeat; + background-position: 8px 0; + position: absolute; + top: 10px; +} +#new_topic .topicNumSynapses { + height: 14px; + padding: 1px 0 1px 32px; + background-image: url(synapse16.png); + background-repeat: no-repeat; + background-position: 8px 0; + position: absolute; + bottom: 10px; } #new_topic .topicOriginatorIcon { - position: relative; - width: 20px; - height: 20px; - background-repeat: no-repeat; - background-position: center center; - background-size: 16px 16px; - background-image: url(MMCCicon_mapper.png); + position: absolute; + top: 8px; + right: 8px; +} +#new_topic .topicOriginatorIcon img { + border-radius: 12px; } #new_topic .topicOriginatorIcon:hover .tip { display: block; @@ -1437,9 +1487,8 @@ float: left; .customMetacodeList, .metacodeSetList { height: 301px; - overflow: hidden; + overflow-y: auto; margin: 5px 0 15px 0; - /* border-bottom: 1px solid #BBB;*/ } .customMetacodeList ul li { cursor: pointer; @@ -1937,8 +1986,8 @@ float: left; #wrapper .requestInvite { width: 700px; margin: 0 auto; - padding: 20px; - background: rgba(0, 0, 0, 0.4); + padding: 0 0 60px 0; + background: #FFFFFF; color: white; height: 100%; overflow: hidden; diff --git a/app/helpers/topics_helper.rb b/app/helpers/topics_helper.rb index f6587c4c..84c0d9a7 100644 --- a/app/helpers/topics_helper.rb +++ b/app/helpers/topics_helper.rb @@ -15,6 +15,7 @@ module TopicsHelper topic['mapCount'] = t.maps.count topic['synapseCount'] = t.synapses.count topic['originator'] = t.user.name + topic['originatorImage'] = t.user.image topic['rtype'] = "topic" temp.push topic diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index ee6d5409..a8f10590 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -167,11 +167,17 @@ diff --git a/app/views/main/requestinvite.html.erb b/app/views/main/requestinvite.html.erb index 4f0f2b18..2b147db0 100644 --- a/app/views/main/requestinvite.html.erb +++ b/app/views/main/requestinvite.html.erb @@ -9,9 +9,3 @@
        - - From 069548ef66811a8eb219a7714a02a2c66a90b665 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Sun, 21 Sep 2014 19:18:32 -0400 Subject: [PATCH 104/600] Update MacInstallation.md --- MacInstallation.md | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/MacInstallation.md b/MacInstallation.md index 1333ed77..d954c7bb 100644 --- a/MacInstallation.md +++ b/MacInstallation.md @@ -1 +1,40 @@ -TODO +install homebrew + \curl -sSL https://get.rvm.io | bash -s stable --rails + + rvm install 1.9.3 --with-gcc=clang + + rvm use 1.9.3 + + gem install lunchy + +(http://www.moncefbelyamani.com/how-to-install-postgresql-on-a-mac-with-homebrew-and-lunchy/) + + + brew install postgresql + ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents + createuser metamaps -P -s -d + +set a password + + lunchy start postgres + + +cd into the metamaps directory + + bundle install + + +copy the database.yml.default file and rename it database.yml +make sure the username and password match the POSTGRES username and password you set + + + +http://nodejs.org/ hit install, download, open, install + + + + rake db:create + rake db:schema:load + rake db:fixtures:load + rails s +( to start the server) From f0650bb16fce347b018e3578ae3ea713a2ec3aa1 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Sun, 21 Sep 2014 19:19:19 -0400 Subject: [PATCH 105/600] Update MacInstallation.md --- MacInstallation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MacInstallation.md b/MacInstallation.md index d954c7bb..a6e47436 100644 --- a/MacInstallation.md +++ b/MacInstallation.md @@ -1,4 +1,5 @@ install homebrew + \curl -sSL https://get.rvm.io | bash -s stable --rails rvm install 1.9.3 --with-gcc=clang @@ -28,13 +29,12 @@ copy the database.yml.default file and rename it database.yml make sure the username and password match the POSTGRES username and password you set - http://nodejs.org/ hit install, download, open, install - rake db:create rake db:schema:load rake db:fixtures:load rails s + ( to start the server) From 5e76b44b80f16752a048af59fbc9abf544ecb933 Mon Sep 17 00:00:00 2001 From: Bashar Date: Sun, 21 Sep 2014 20:47:09 -0400 Subject: [PATCH 106/600] centered reset password box --- app/assets/stylesheets/application.css | 12 ++++++++++-- app/views/users/passwords/new.html.erb | 6 +++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 711d0b8f..bb0edb60 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -183,12 +183,20 @@ input[type="submit"]:active { .edit_user, .forgotPassword { display: block; - width: 250px; + width: 300px; background-color: #E0E0E0; - padding: 20px; + padding: 16px; border-radius: 5px; color: black; box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); + top: 50%; + left:50%; + position:absolute; + margin-left: -166px; +} +.forgotPassword { + height: 134px; + margin-top: -83px; } .centerGreyForm input[type="text"], .centerGreyForm input[type="email"], diff --git a/app/views/users/passwords/new.html.erb b/app/views/users/passwords/new.html.erb index bdd7a8bc..88dddb4a 100644 --- a/app/views/users/passwords/new.html.erb +++ b/app/views/users/passwords/new.html.erb @@ -4,12 +4,12 @@ <%= form_for(resource, :as => resource_name, :url => password_path(resource_name), :html => { :method => :post, :class => "forgotPassword centerGreyForm" }) do |f| %> <%= devise_error_messages! %> -

        Forgot your password?

        +

        FORGOT PASSWORD?

        -
        <%= f.label :email %> +
        <%= f.label :email, "Enter Your Email:" %> <%= f.email_field :email, :autofocus => true %>
        -
        <%= f.submit "Send me reset password instructions" %>
        +
        <%= f.submit "Send Reset Password Instructions" %>
        <% end %>
        From d115861584d10423739dd714b3a546e9ab5f3b86 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Mon, 22 Sep 2014 11:36:53 -0400 Subject: [PATCH 107/600] collabCompass img and p for content and styling --- app/assets/javascripts/src/Metamaps.js | 9 ++++----- app/assets/stylesheets/application.css | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index fcbedaf3..45c6240c 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1418,7 +1418,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + self.socket = io.connect('http://localhost:5001'); self.startActiveMap(); }, toggleBox: function (event) { @@ -1598,9 +1598,9 @@ Metamaps.Realtime = { $('#compass' + data.userid).remove(); $('
        ', { id: 'compass' + data.userid, - text: data.username, class: 'collabCompass' - }).appendTo('#wrapper'); + }).html('

        '+data.username+'

        ').appendTo('#wrapper'); + }, newPeerOnMap: function (data) { var self = Metamaps.Realtime; @@ -1629,9 +1629,8 @@ Metamaps.Realtime = { $('#compass' + data.userid).remove(); $('
        ', { id: 'compass' + data.userid, - text: data.username, class: 'collabCompass' - }).appendTo('#wrapper'); + }).html('

        '+data.username+'

        ').appendTo('#wrapper'); Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8cdea3d6..3474ec04 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1924,3 +1924,28 @@ float: left; .templates { display: none; } + +/* collabCompass section */ +.collabCompass:hover p { + display: block; +} +.collabCompass p { + display: none; + background-color: #4fb5c0; + color: #FFFFFF; + padding: 0 8px 0 8px; + position: absolute; + top: 9px; + left:30px; + z-index: 1; + font-size: 14px; + line-height: 14px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} +.collabCompass img { + border-radius: 16px; + border: 2px solid #4fb5c0; + z-index: 2; + +} \ No newline at end of file From aaf2e4c52151273bbbe8be5443ac18716c1910d6 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 22 Sep 2014 23:42:26 -0400 Subject: [PATCH 108/600] right click styling --- app/assets/javascripts/src/Metamaps.JIT.js | 35 +-- app/assets/javascripts/src/Metamaps.js | 19 +- app/assets/stylesheets/application.css | 270 ++++++++++++--------- app/helpers/synapses_helper.rb | 1 + app/views/layouts/_templates.html.erb | 15 +- 5 files changed, 191 insertions(+), 149 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 7cd25ef8..babfc80d 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -1140,23 +1140,23 @@ Metamaps.JIT = { // add the proper options to the menu var menustring = '
          '; - if (Metamaps.Active.Mapper) menustring += '
        • Delete
        • '; - if (Metamaps.Active.Map && Metamaps.Active.Mapper) menustring += '
        • Remove from map
        • '; - menustring += '
        • Hide until refresh
        • '; + if (Metamaps.Active.Mapper) menustring += '
        • Delete
        • '; + if (Metamaps.Active.Map && Metamaps.Active.Mapper) menustring += '
        • Remove from map
        • '; + menustring += '
        • Hide until refresh
        • '; - if (!Metamaps.Active.Map) menustring += '
        • Center this topic
        • '; - menustring += '
        • Open in new tab
        • '; + if (!Metamaps.Active.Map) menustring += '
        • Center this topic
        • '; + menustring += '
        • Open in new tab
        • '; if (Metamaps.Active.Mapper) { - var options = '
          • commons
          • \ -
          • public
          • \ -
          • private
          • \ + var options = '
            • commons
            • \ +
            • public
            • \ +
            • private
            • \
            '; - menustring += '
          • Change permissions' + options + '
          • '; + menustring += '
          • Change permissions' + options + '
          • '; var metacodeOptions = $('#metacodeOptions').html(); - menustring += '
          • Change metacode' + metacodeOptions + '
          • '; + menustring += '
          • Change metacode' + metacodeOptions + '
          • '; } menustring += '
          '; @@ -1288,18 +1288,19 @@ Metamaps.JIT = { // add the proper options to the menu var menustring = '
            '; - if (Metamaps.Active.Mapper) menustring += '
          • Delete
          • '; + if (Metamaps.Active.Mapper) menustring += '
          • Delete
          • '; if (Metamaps.Active.Map && Metamaps.Active.Map.authorizeToEdit(Metamaps.Active.Mapper)) { - menustring += '
          • Remove from map
          • '; + menustring += '
          • Remove from map
          • '; } - menustring += '
          • Hide until refresh
          • '; + menustring += '
          • Hide until refresh
          • '; + if (Metamaps.Active.Mapper) { - var permOptions = '
            • commons
            • \ -
            • public
            • \ -
            • private
            • \ + var permOptions = '
              • commons
              • \ +
              • public
              • \ +
              • private
              • \
              '; - menustring += '
            • Change permissions' + permOptions + '
            • '; + menustring += '
            • Change permissions' + permOptions + '
            • '; } menustring += '
            '; diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 84700063..7455f046 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -492,10 +492,7 @@ Metamaps.Create = { }, newTopic: { init: function () { - $('#new_topic').bind('contextmenu', function (e) { - return false; - }); - + $('#topic_name').keyup(function () { Metamaps.Create.newTopic.name = $(this).val(); }); @@ -554,11 +551,6 @@ Metamaps.Create = { init: function () { var self = Metamaps.Create.newSynapse; - // keep the right click menu from opening - $('#new_synapse').bind('contextmenu', function (e) { - return false; - }); - $('#synapse_desc').keyup(function () { Metamaps.Create.newSynapse.description = $(this).val(); }); @@ -567,7 +559,7 @@ Metamaps.Create = { $('#synapse_desc').typeahead([ { name: 'synapse_autocomplete', - template: "
            {{label}}
            ", + template: "
            {{label}}
            ", remote: { url: '/search/synapses?term=%QUERY' }, @@ -2900,7 +2892,7 @@ Metamaps.Topic = { }); Metamaps.Mappings.add(mapping); - self.renderTopic(mapping, topic, false); + self.renderTopic(mapping, topic, true); } }; // end Metamaps.Topic @@ -3025,8 +3017,6 @@ Metamaps.Synapse = { node1, node2; - Metamaps.Create.newSynapse.hide(); - var synapse = self.get(id); var mapping = new Metamaps.Backbone.Mapping({ @@ -3037,8 +3027,9 @@ Metamaps.Synapse = { node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + Metamaps.Create.newSynapse.hide(); - self.renderSynapse(mapping, synapse, node1, node2, false); + self.renderSynapse(mapping, synapse, node1, node2, true); } }; // end Metamaps.Synapse diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 711d0b8f..23fbacf7 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -318,6 +318,9 @@ input[type="submit"]:active { color: #424242; font-family: 'din-medium', helvetica, sans-serif; } +.new_synapse .tt-hint { + color: #BDBDBD; +} label, select, input, @@ -819,57 +822,67 @@ h3.realtimeBoxTitle { .rightclickmenu { position: absolute; - background: white; + width: 300px; + background: #FFFFFF; z-index: 20; border-radius: 2px; color: black; + box-shadow: 0px 3px 3px rgba(0,0,0,0.12), 0 3px 3px rgba(0,0,0,0.24); } -.rightclickmenu ul { - padding: 2px; +.rightclickmenu > ul { + } -.rightclickmenu ul li { +.rightclickmenu li { list-style: none; - padding: 3px 10px 3px 30px; - font-family: arial, sans-serif; - font-size: 17px; - line-height: 17px; - background-repeat: no-repeat; - background-size: 20px 20px; - background-position: 5px 2px; + padding: 6px 10px 6px 32px; + font-family: helvetica, sans-serif; + font-size: 12px; + line-height: 12px; + position: relative; } -.rightclickmenu ul li:nth-child(odd) { - background-color: #FFF; -} -.rightclickmenu ul li:nth-child(even) { - background-color: #EEE; -} -.rightclickmenu ul li:hover { - background-color: #BBB; - background-position: 7px 2px; +.rightclickmenu li:hover { + background-color: #E0E0E0; cursor: pointer; } -.rightclickmenu .rc-delete { - background-image: url(MMCCicon_delete_black.png); +.rightclickmenu > ul > li .rc-icon { + position: absolute; + top: 0; + left: 4px; + background-image: url(context_sprite.png); + background-repeat: no-repeat; + width: 24px; + height: 24px; } -.rightclickmenu .rc-remove { - background-image: url(MMCCicon_remove_from_map_black.png); +.rightclickmenu .rc-delete .rc-icon { + background-position: 0 -48px; } -.rightclickmenu .rc-hide { - background-image: url(MMCCicon_hide.png); +.rightclickmenu .rc-remove .rc-icon { + background-position: 0 -24px; } -.rightclickmenu .rc-center { - background-image: url(MMCCicon_center.png); +.rightclickmenu .rc-hide .rc-icon { + background-position: 0 0; } -.rightclickmenu .rc-popout { - background-image: url(MMCCicon_pop-out_black.png); +.rightclickmenu .rc-center .rc-icon { + } -.rightclickmenu .rc-permission { - background-image: url(MMCCicon_edit_permission_black.png); - position: relative; +.rightclickmenu .rc-popout .rc-icon { + background-position: 0 -72px; } -.rightclickmenu .rc-metacode { - background-image: url(blank.png); - position: relative; +.rightclickmenu .rc-permission .rc-icon { + background-position: 0 -96px; +} +.rightclickmenu .rc-metacode .rc-icon { + background-position: 0 -120px; +} +.rightclickmenu .expandLi { + position: absolute; + top: 4px; + right: 8px; + width: 16px; + height: 16px; + background-image: url(arrowright_sprite.png); + background-repeat: no-repeat; + background-position: 0 -32px; } .rc-metacode li img { float: left; @@ -883,22 +896,81 @@ float: left; border-bottom-left-radius: 2px; border-bottom-right-radius: 2px; border-top-right-radius: 2px; + box-shadow: 0px 3px 3px rgba(0,0,0,0.12), 0 3px 3px rgba(0,0,0,0.24); } -.rightclickmenu .rc-permission:hover ul, .rightclickmenu .rc-metacode:hover ul { +.rightclickmenu .rc-permission:hover > ul, .rightclickmenu .rc-metacode:hover > ul { display: block; } .rightclickmenu p { padding: 7px; } +.rightclickmenu li.changeP { + +} +.rightclickmenu li.changeP .rc-perm-icon { + position: absolute; + top: 0; + left: 4px; + background-image: url(permissions32_sprite.png); + background-size: 72px 48px; + background-repeat: no-repeat; + width: 24px; + height: 24px; +} +.rightclickmenu li.toCommons .rc-perm-icon { + background-position: 0 0; +} +.rightclickmenu li.toPublic .rc-perm-icon { + background-position: -48px 0; +} +.rightclickmenu li.toPrivate .rc-perm-icon { + background-position: -24px 0; +} +.rightclickmenu .rc-metacode > ul > li { + padding: 6px 10px 6px 8px; + width: 100px; +} +.rightclickmenu .rc-metacode ul ul { + display: none; + max-height: 270px; + overflow-y: auto; + overflow-x: hidden; +} +.rightclickmenu .rc-metacode li:hover ul { + display: block; +} +.rightclickmenu .rc-metacode ul ul li { + padding: 4px 10px 4px 8px; + width: 120px; +} +.rightclickmenu .expandMetacodeSet { + position: absolute; + top: 4px; + right: 4px; + width: 16px; + height: 16px; + background-image: url(arrowright_sprite.png); + background-repeat: no-repeat; + background-position: 0 -32px; +} +.rightclickmenu .rc-metacode .mSelectName { + padding: 6px 0 0 32px; + display: block; +} + + /* end right click menu */ -/* topic autocomplete */ +/* topic and synapse autocomplete */ #new_topic .tt-suggestion.tt-is-under-cursor, -#new_topic .tt-suggestion.tt-is-under-mouse-cursor { +#new_topic .tt-suggestion.tt-is-under-mouse-cursor, +#new_synapse .tt-suggestion.tt-is-under-cursor, +#new_synapse .tt-suggestion.tt-is-under-mouse-cursor { background: #E0E0E0; } -#new_topic .tt-suggestion { +#new_topic .tt-suggestion, +#new_synapse .tt-suggestion { background: #F5F5F5; width: 270px; position: relative; @@ -915,7 +987,15 @@ float: left; font-size: 14px; padding: 9px 0 9px 4px; } -#new_topic .expandTopicMetadata { +#new_synapse .synapseDesc, +#new_synapse .genericSynapseDesc { + width: 190px; + line-height: 14px; + font-size: 14px; + padding: 9px 0 9px 8px; +} +#new_topic .expandTopicMetadata, +#new_synapse .expandSynapseMetadata { display:none; width: 16px; height: 16px; @@ -927,14 +1007,19 @@ float: left; background-position: 0 -32px; } #new_topic .tt-suggestion.tt-is-under-cursor .expandTopicMetadata, -#new_topic .tt-suggestion.tt-is-under-mouse-cursor .expandTopicMetadata { +#new_topic .tt-suggestion.tt-is-under-mouse-cursor .expandTopicMetadata, +#new_synapse .tt-suggestion.tt-is-under-cursor .expandSynapseMetadata, +#new_synapse .tt-suggestion.tt-is-under-mouse-cursor .expandSynapseMetadata { display: block; } #new_topic .tt-suggestion.tt-is-under-cursor .topicMetadata, -#new_topic .tt-suggestion.tt-is-under-mouse-cursor .topicMetadata { +#new_topic .tt-suggestion.tt-is-under-mouse-cursor .topicMetadata, +#new_synapse .tt-suggestion.tt-is-under-cursor .synapseMetadata, +#new_synapse .tt-suggestion.tt-is-under-mouse-cursor .synapseMetadata { display: block; } -#new_topic .topicMetadata { +#new_topic .topicMetadata, +#new_synapse .synapseMetadata { position: absolute; display: none; top: -18px; @@ -945,7 +1030,8 @@ float: left; font-family: 'din-regular', helvetica, sans-serif; font-size: 14px; } -#new_topic .topicPermission { +#new_topic .topicPermission, +#new_synapse .synapsePermission { width: 32px; height: 32px; background-repeat: no-repeat; @@ -954,16 +1040,20 @@ float: left; bottom: 4px; right: 4px; } -#new_topic .topicPermission.commons { +#new_topic .topicPermission.commons, +#new_synapse .synapsePermission.commons { background-position: 0 0; } -#new_topic .topicPermission.public { +#new_topic .topicPermission.public, +#new_synapse .synapsePermission.public { background-position: -64px 0; } -#new_topic .topicPermission.private { +#new_topic .topicPermission.private, +#new_synapse .synapsePermission.private { background-position: -32px 0; } -#new_topic .topicNumMaps { +#new_topic .topicNumMaps, +#new_synapse .synapseNumMaps { height: 14px; padding: 1px 0 1px 32px; background-image: url(metamap16.png); @@ -981,79 +1071,21 @@ float: left; position: absolute; bottom: 10px; } -#new_topic .topicOriginatorIcon { +#new_topic .topicOriginatorIcon, +#new_synapse .synapseOriginatorIcon { position: absolute; top: 8px; right: 8px; } -#new_topic .topicOriginatorIcon img { +#new_topic .topicOriginatorIcon img, +#new_synapse .synapseOriginatorIcon img { border-radius: 12px; } -#new_topic .topicOriginatorIcon:hover .tip { - display: block; -} -#new_topic .tip { - display: none; - position: absolute; - background: white; - width: auto; - top: 0; - left: 23px; - color: black; - white-space: nowrap; - border-radius: 4px; - font-size: 15px !important; - line-height: 15px; - padding: 2px 5px 2px; - z-index: 100; -} -/* synapse autocomplete */ - -#new_synapse .tt-dropdown-menu { - width: 212px; - background: #2A343C; -} -#new_synapse .tt-dropdown-menu h3 { - font-family: 'vinyl', helvetica, sans-serif; - text-transform: uppercase; - font-style: italic; - font-size: 14pxpx; - line-height: 16px; - margin: 3px; -} -#new_synapse .tt-suggestion.tt-is-under-cursor, -#new_synapse .tt-suggestion.tt-is-under-mouse-cursor { - background: #0E161D; -} -#new_synapse .tt-suggestion { - padding: 5px; -} -#new_synapse .autocompleteSection { - float: left; -} -#new_synapse .synapseDesc { - width: 162px; - line-height: 22px; -} -#new_synapse .synapsePermission { - width: 20px; - height: 20px; - background-repeat: no-repeat; - background-position: center center; - background-size: 16px 16px; -} -#new_synapse .synapseOriginatorIcon { - position: relative; - width: 20px; - height: 20px; - background-repeat: no-repeat; - background-position: center center; - background-size: 16px 16px; - background-image: url(MMCCicon_mapper.png); -} +#new_topic .topicOriginatorIcon:hover .tip, #new_synapse .synapseOriginatorIcon:hover .tip { display: block; } +#new_topic .tip, #new_synapse .tip { display: none; position: absolute; @@ -1069,6 +1101,18 @@ float: left; padding: 2px 5px 2px; z-index: 100; } + +#new_synapse .tt-dropdown-menu { + background: #F5F5F5; +} +#new_synapse .tt-dropdown-menu h3 { + font-family: 'vinyl', helvetica, sans-serif; + text-transform: uppercase; + font-style: italic; + font-size: 14pxpx; + line-height: 16px; + margin: 3px; +} #new_synapse .tt-suggestion .resultnoresult .synapsePermission, #new_synapse .tt-suggestion .resultnoresult .synapseOriginatorIcon { display: none; diff --git a/app/helpers/synapses_helper.rb b/app/helpers/synapses_helper.rb index 0bec84cb..350cb0fc 100644 --- a/app/helpers/synapses_helper.rb +++ b/app/helpers/synapses_helper.rb @@ -25,6 +25,7 @@ module SynapsesHelper synapse['permission'] = s.permission synapse['mapCount'] = s.maps.count synapse['originator'] = s.user.name + synapse['originatorImage'] = s.user.image synapse['rtype'] = "synapse" temp.push synapse diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index a8f10590..4a796e18 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -158,11 +158,16 @@ From dd6a21191a596b29d62e592ab6e444bea1708117 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 22 Sep 2014 23:56:47 -0400 Subject: [PATCH 109/600] heroku --- app/assets/javascripts/src/Metamaps.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 053fda2a..156a90f7 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1458,7 +1458,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://localhost:5001'); + self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); self.startActiveMap(); }, toggleBox: function (event) { @@ -1635,7 +1635,7 @@ Metamaps.Realtime = { $('#mapper' + data.userid).remove(); $('.realtimeMapperList ul').append(mapperListItem); -<<<<<<< HEAD +<<<<<<< HEAD // create a div for the collaborators compass $('#compass' + data.userid).remove(); $('
            ', { @@ -1643,7 +1643,7 @@ Metamaps.Realtime = { class: 'collabCompass' }).html('

            '+data.username+'

            ').appendTo('#wrapper'); -======= +======= // create a div for the collaborators compass $('#compass' + data.userid).remove(); $('
            ', { @@ -1652,7 +1652,7 @@ Metamaps.Realtime = { class: 'collabCompass' }).appendTo('#wrapper'); } ->>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 +>>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 }, newPeerOnMap: function (data) { var self = Metamaps.Realtime; @@ -1669,7 +1669,7 @@ Metamaps.Realtime = { }; // create an item for them in the realtime box -<<<<<<< HEAD +<<<<<<< HEAD var mapperListItem = '
          • '; mapperListItem += ''; mapperListItem += data.username; @@ -1697,7 +1697,7 @@ Metamaps.Realtime = { mapid: Metamaps.Active.Map.id }; socket.emit('updateNewMapperList', update); -======= +======= if (data.userid !== Metamaps.Active.Mapper.id) { var mapperListItem = '
          • '; mapperListItem += ''; @@ -1728,7 +1728,7 @@ Metamaps.Realtime = { }; socket.emit('updateNewMapperList', update); } ->>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 +>>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 }, lostPeerOnMap: function (data) { var self = Metamaps.Realtime; From 58ff70717ee818c98b91bc52db536f78706950cb Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 23 Sep 2014 10:37:08 -0400 Subject: [PATCH 110/600] heroku --- app/assets/javascripts/src/Metamaps.js | 48 ++------------------------ 1 file changed, 3 insertions(+), 45 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 156a90f7..aea1ba41 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1458,7 +1458,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); self.startActiveMap(); }, toggleBox: function (event) { @@ -1635,24 +1635,13 @@ Metamaps.Realtime = { $('#mapper' + data.userid).remove(); $('.realtimeMapperList ul').append(mapperListItem); -<<<<<<< HEAD - // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
            ', { - id: 'compass' + data.userid, - class: 'collabCompass' - }).html('

            '+data.username+'

            ').appendTo('#wrapper'); - -======= // create a div for the collaborators compass $('#compass' + data.userid).remove(); $('
            ', { id: 'compass' + data.userid, - text: data.username, class: 'collabCompass' - }).appendTo('#wrapper'); + }).html('

            '+data.username+'

            ').appendTo('#wrapper'); } ->>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 }, newPeerOnMap: function (data) { var self = Metamaps.Realtime; @@ -1669,35 +1658,6 @@ Metamaps.Realtime = { }; // create an item for them in the realtime box -<<<<<<< HEAD - var mapperListItem = '
          • '; - mapperListItem += ''; - mapperListItem += data.username; - mapperListItem += '
            '; - mapperListItem += '
          • '; - $('#mapper' + data.userid).remove(); - $('.realtimeMapperList ul').append(mapperListItem); - - // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
            ', { - id: 'compass' + data.userid, - class: 'collabCompass' - }).html('

            '+data.username+'

            ').appendTo('#wrapper'); - - Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); - - // send this new mapper back your details, and the awareness that you've loaded the map - var update = { - userToNotify: data.userid, - username: Metamaps.Active.Mapper.get("name"), - userimage: Metamaps.Active.Mapper.get("image"), - userid: Metamaps.Active.Mapper.id, - userrealtime: self.status, - mapid: Metamaps.Active.Map.id - }; - socket.emit('updateNewMapperList', update); -======= if (data.userid !== Metamaps.Active.Mapper.id) { var mapperListItem = '
          • '; mapperListItem += ''; @@ -1711,9 +1671,8 @@ Metamaps.Realtime = { $('#compass' + data.userid).remove(); $('
            ', { id: 'compass' + data.userid, - text: data.username, class: 'collabCompass' - }).appendTo('#wrapper'); + }).html('

            '+data.username+'

            ').appendTo('#wrapper'); Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); @@ -1728,7 +1687,6 @@ Metamaps.Realtime = { }; socket.emit('updateNewMapperList', update); } ->>>>>>> fe1f35d63eda20b39e97f11c8bb75135281d5b98 }, lostPeerOnMap: function (data) { var self = Metamaps.Realtime; From b163442163ed9287bfe91a24f1d7c9aa784b9b8e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 24 Sep 2014 08:45:46 -0400 Subject: [PATCH 111/600] collab compass nowrap --- app/assets/stylesheets/application.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index c7c891b2..ac3a0f01 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2080,10 +2080,11 @@ float: left; line-height: 14px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; + white-space: nowrap; } .collabCompass img { border-radius: 16px; border: 2px solid #4fb5c0; z-index: 2; -} +} From d5598819fd9d72bdcd79662267fa537f8d045cba Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 24 Sep 2014 11:00:22 -0400 Subject: [PATCH 112/600] add arrowCompass for collab: direction indication of other users on the map --- app/assets/images/compass_arrow.png | Bin 0 -> 145 bytes app/assets/javascripts/src/Metamaps.js | 80 ++++++++++++++++++++----- app/assets/stylesheets/application.css | 12 ++++ 3 files changed, 77 insertions(+), 15 deletions(-) create mode 100644 app/assets/images/compass_arrow.png diff --git a/app/assets/images/compass_arrow.png b/app/assets/images/compass_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e688df790dff10911de3227937262614f887370b GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5uPrNAr-fh6C~yxxOlO!83-6| zvRPPK{$-acV$A4Zy2<9i`;)=sNJ9>Df<%S~lPjA;tZ`!yGv9<L6x%qgw}P2ZN`ppUXO@geCxSYb*}{ literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index aea1ba41..7628b831 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1458,7 +1458,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + self.socket = io.connect('http://localhost:5001'); self.startActiveMap(); }, toggleBox: function (event) { @@ -1617,7 +1617,11 @@ Metamaps.Realtime = { self.mappersOnMap[data.userid] = { name: data.username, image: data.userimage, - realtime: data.userrealtime + realtime: data.userrealtime, + coords: { + x: 0, + y: 0 + }, }; var onOff = data.userrealtime ? "On" : "Off"; @@ -1636,11 +1640,7 @@ Metamaps.Realtime = { $('.realtimeMapperList ul').append(mapperListItem); // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
            ', { - id: 'compass' + data.userid, - class: 'collabCompass' - }).html('

            '+data.username+'

            ').appendTo('#wrapper'); + self.createCompass(data.username, data.userid, data.userimage); } }, newPeerOnMap: function (data) { @@ -1654,7 +1654,12 @@ Metamaps.Realtime = { self.mappersOnMap[data.userid] = { name: data.username, - realtime: true + image: data.userimage, + realtime: true, + coords: { + x: 0, + y: 0 + }, }; // create an item for them in the realtime box @@ -1668,12 +1673,8 @@ Metamaps.Realtime = { $('.realtimeMapperList ul').append(mapperListItem); // create a div for the collaborators compass - $('#compass' + data.userid).remove(); - $('
            ', { - id: 'compass' + data.userid, - class: 'collabCompass' - }).html('

            '+data.username+'

            ').appendTo('#wrapper'); - + self.createCompass(data.username, data.userid, data.userimage); + Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); // send this new mapper back your details, and the awareness that you've loaded the map @@ -1688,6 +1689,15 @@ Metamaps.Realtime = { socket.emit('updateNewMapperList', update); } }, + createCompass: function(name, id, image) { + var str = '

            '+name+'

            '; + str += '
            '; + $('#compass' + id).remove(); + $('
            ', { + id: 'compass' + id, + class: 'collabCompass' + }).html(str).appendTo('#wrapper'); + }, lostPeerOnMap: function (data) { var self = Metamaps.Realtime; var socket = Metamaps.Realtime.socket; @@ -1733,12 +1743,52 @@ Metamaps.Realtime = { updatePeerCoords: function (data) { var self = Metamaps.Realtime; var socket = Metamaps.Realtime.socket; + var xMax=$(document).width(); + var yMax=$(document).height(); + var compassDiameter=56; + var compassArrowSize=24; - var pixels = Metamaps.Util.coordsToPixels(data.usercoords); + self.mappersOnMap[data.userid].coords={x: data.usercoords.x,y:data.usercoords.y}; + + var origPixels = Metamaps.Util.coordsToPixels(data.usercoords); + var pixels = self.limitPixelsToScreen(origPixels); $('#compass' + data.userid).css({ left: pixels.x + 'px', top: pixels.y + 'px' }); + /* showing the arrow if the collaborator is off of the viewport screen */ + if (origPixels.x !== pixels.x || origPixels.y !== pixels.y) { + + var dy = origPixels.y - pixels.y; //opposite + var dx = origPixels.x - pixels.x; // adjacent + var ratio = dy / dx; + var angle = Math.atan2(dy, dx); + + $('#compassArrow' + data.userid).show().css({ + transform: 'rotate(' + angle + 'rad)', + "-webkit-transform": 'rotate(' + angle + 'rad)', + }); + } else { + $('#compassArrow' + data.userid).hide(); + + } + }, + limitPixelsToScreen: function (pixels) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + var xLimit, yLimit; + var xMax=$(document).width(); + var yMax=$(document).height(); + var compassDiameter=56; + var compassArrowSize=24; + + xLimit = Math.max(0 + compassArrowSize, pixels.x); + xLimit = Math.min(xLimit, xMax - compassDiameter); + yLimit = Math.max(0 + compassArrowSize, pixels.y); + yLimit = Math.min(yLimit, yMax - compassDiameter); + + return {x:xLimit,y:yLimit}; }, sendCoords: function (coords) { var self = Metamaps.Realtime; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index ac3a0f01..3b4f11b4 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2088,3 +2088,15 @@ float: left; z-index: 2; } +.compassArrow { + background-repeat: no-repeat; + background-image: url(compass_arrow.png); + width: 48px; + height: 32px; + position: absolute; + top: 0; + left: 16px; + background-position: 16px 8px; + -webkit-transform-origin: left center; + transform-origin: left center; +} \ No newline at end of file From 74b4659836b65248d289acd7720d4f8046e236f5 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 24 Sep 2014 14:05:18 -0400 Subject: [PATCH 113/600] broke out functionality for positionPeerIcon from updatePeerCoords --- app/assets/javascripts/src/Metamaps.js | 28 +++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 7628b831..b2cdacf1 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1743,16 +1743,31 @@ Metamaps.Realtime = { updatePeerCoords: function (data) { var self = Metamaps.Realtime; var socket = Metamaps.Realtime.socket; + + self.mappersOnMap[data.userid].coords={x: data.usercoords.x,y:data.usercoords.y}; + self.positionPeerIcon(data.userid); + }, + positionPeerIcons: function () { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + for (var key in self.mappersOnMap) { + self.positionPeerIcon(key); + } + }, + positionPeerIcon: function (id) { + var self = Metamaps.Realtime; + var socket = Metamaps.Realtime.socket; + + var mapper = self.mappersOnMap[id]; var xMax=$(document).width(); var yMax=$(document).height(); var compassDiameter=56; var compassArrowSize=24; - - self.mappersOnMap[data.userid].coords={x: data.usercoords.x,y:data.usercoords.y}; - var origPixels = Metamaps.Util.coordsToPixels(data.usercoords); + var origPixels = Metamaps.Util.coordsToPixels(mapper.coords); var pixels = self.limitPixelsToScreen(origPixels); - $('#compass' + data.userid).css({ + $('#compass' + id).css({ left: pixels.x + 'px', top: pixels.y + 'px' }); @@ -1764,13 +1779,12 @@ Metamaps.Realtime = { var ratio = dy / dx; var angle = Math.atan2(dy, dx); - $('#compassArrow' + data.userid).show().css({ + $('#compassArrow' + id).show().css({ transform: 'rotate(' + angle + 'rad)', "-webkit-transform": 'rotate(' + angle + 'rad)', }); } else { - $('#compassArrow' + data.userid).hide(); - + $('#compassArrow' + id).hide(); } }, limitPixelsToScreen: function (pixels) { From 4ec9c4cb98f921e3afe32bc2275b346258c3d304 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 24 Sep 2014 16:25:22 -0400 Subject: [PATCH 114/600] add zoom and pas events for multiple peers and label direction for compassCollab --- app/assets/javascripts/src/JIT.js | 11 +++++- app/assets/javascripts/src/Metamaps.JIT.js | 13 +++++-- app/assets/javascripts/src/Metamaps.js | 43 ++++++++++++++++++++-- app/assets/stylesheets/application.css | 13 +++++-- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/app/assets/javascripts/src/JIT.js b/app/assets/javascripts/src/JIT.js index 1f1c6333..843f1fa8 100644 --- a/app/assets/javascripts/src/JIT.js +++ b/app/assets/javascripts/src/JIT.js @@ -2445,7 +2445,7 @@ Extras.Classes.Navigation = new Class({ this.pressed = false; }, - onMouseWheel: function(e, win, scroll) { + onMouseWheel: function(e, win, scroll) { if(!this.config.zooming) return; // START METAMAPS CODE @@ -2473,6 +2473,11 @@ Extras.Classes.Navigation = new Class({ } // END METAMAPS CODE // ORIGINAL CODE this.canvas.scale(ans, ans); + + // START METAMAPS CODE + jQuery(document).trigger(Metamaps.JIT.events.zoom, [e]); + // END METAMAPS CODE + }, onMouseDown: function(e, win, eventInfo) { @@ -2553,6 +2558,10 @@ Extras.Classes.Navigation = new Class({ this.pos = currentPos; this.canvas.translate(x * 1/sx, y * 1/sy); + + // START METAMAPS CODE + jQuery(document).trigger(Metamaps.JIT.events.pan); + // END METAMAPS CODE }, onMouseUp: function(e, win, eventInfo, isRightClick) { diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index babfc80d..0ffac64e 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -1,6 +1,8 @@ Metamaps.JIT = { events: { - mouseMove: 'Metamaps:JIT:events:mouseMove' + mouseMove: 'Metamaps:JIT:events:mouseMove', + pan: 'Metamaps:JIT:events:pan', + zoom: 'Metamaps:JIT:events:zoom' }, vizData: [], // contains the visualization-compatible graph /** @@ -1472,11 +1474,13 @@ Metamaps.JIT = { }, 13, inv, canvas, 0.3); } }, //renderEdgeArrows - zoomIn: function () { + zoomIn: function (event) { Metamaps.Visualize.mGraph.canvas.scale(1.25,1.25); + $(document).trigger(Metamaps.JIT.events.zoom, [event]); }, - zoomOut: function () { + zoomOut: function (event) { Metamaps.Visualize.mGraph.canvas.scale(0.8,0.8); + $(document).trigger(Metamaps.JIT.events.zoom, [event]); }, centerMap: function () { var canvas = Metamaps.Visualize.mGraph.canvas; @@ -1489,7 +1493,7 @@ Metamaps.JIT = { canvas.translate(-1*offsetX,-1*offsetY); }, - zoomExtents: function () { + zoomExtents: function (event) { Metamaps.JIT.centerMap(); var height = $(document).height(), width = $(document).width(), @@ -1616,5 +1620,6 @@ Metamaps.JIT = { var cogY = (maxY + minY)/2; canvas.translate(-1* cogX, -1* cogY); + $(document).trigger(Metamaps.JIT.events.zoom, [event]); } }; \ No newline at end of file diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index b2cdacf1..85f32da2 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1409,6 +1409,20 @@ Metamaps.Util = { }; return pixels; }, + pixelsToCoords: function (pixels) { + var canvas = Metamaps.Visualize.mGraph.canvas, + s = canvas.getSize(), + p = canvas.getPos(), + ox = canvas.translateOffsetX, + oy = canvas.translateOffsetY, + sx = canvas.scaleOffsetX, + sy = canvas.scaleOffsetY; + var coords = { + x: (pixels.x - p.x - s.width/2 - ox) * (1/sx), + y: (pixels.y - p.y - s.height/2 - oy) * (1/sy), + }; + return coords; + }, generateOptionsList: function (data) { var newlist = ""; for (var i = 0; i < data.length; i++) { @@ -1578,8 +1592,21 @@ Metamaps.Realtime = { var sendCoords = function (event, coords) { self.sendCoords(coords); - } + }; + var zoom = function (event, e) { + if (e) { + var pixels = { + x: e.pageX, + y: e.pageY + }; + var coords = Metamaps.Util.pixelsToCoords(pixels); + self.sendCoords(coords); + } + self.positionPeerIcons(); + }; $(document).on(Metamaps.JIT.events.mouseMove, sendCoords); + $(document).on(Metamaps.JIT.events.zoom, zoom); + $(document).on(Metamaps.JIT.events.pan, self.positionPeerIcons); }, sendRealtimeOn: function () { var self = Metamaps.Realtime; @@ -1751,8 +1778,13 @@ Metamaps.Realtime = { var self = Metamaps.Realtime; var socket = Metamaps.Realtime.socket; - for (var key in self.mappersOnMap) { - self.positionPeerIcon(key); + if (self.status) { // if i have realtime turned on + for (var key in self.mappersOnMap) { + var mapper = self.mappersOnMap[key]; + if (mapper.realtime) { + self.positionPeerIcon(key); + } + } } }, positionPeerIcon: function (id) { @@ -1783,8 +1815,13 @@ Metamaps.Realtime = { transform: 'rotate(' + angle + 'rad)', "-webkit-transform": 'rotate(' + angle + 'rad)', }); + + if (dx > 0) { + $('#compass' + id).addClass('labelLeft'); + } } else { $('#compassArrow' + id).hide(); + $('#compass' + id).removeClass('labelLeft'); } }, limitPixelsToScreen: function (pixels) { diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 3b4f11b4..f98b502c 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2071,10 +2071,10 @@ float: left; display: none; background-color: #4fb5c0; color: #FFFFFF; - padding: 0 8px 0 8px; + padding: 2px 8px 2px 8px; position: absolute; - top: 9px; - left:30px; + top: 7px; + left:28px; z-index: 1; font-size: 14px; line-height: 14px; @@ -2082,13 +2082,18 @@ float: left; border-bottom-right-radius: 2px; white-space: nowrap; } +.collabCompass.labelLeft p { + left: auto; + right: 28px; +} .collabCompass img { border-radius: 16px; border: 2px solid #4fb5c0; z-index: 2; - + position: relative; } .compassArrow { + display: none; background-repeat: no-repeat; background-image: url(compass_arrow.png); width: 48px; From 265295a8a873d4fdd546256f7f8027e637321318 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 24 Sep 2014 17:14:46 -0400 Subject: [PATCH 115/600] added color generator for each collaborator --- app/assets/javascripts/src/Metamaps.JIT.js | 1 + app/assets/javascripts/src/Metamaps.js | 40 ++++++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 0ffac64e..ee405736 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -1373,6 +1373,7 @@ Metamaps.JIT = { function myTimer() { Metamaps.Visualize.mGraph.canvas.translate(x_velocity * easing * 1 / sx, y_velocity * easing * 1 / sy); + $(document).trigger(Metamaps.JIT.events.pan); easing = easing * 0.75; if (easing < 0.1) window.clearInterval(panningInt); diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 85f32da2..ef09e128 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1423,6 +1423,32 @@ Metamaps.Util = { }; return coords; }, + getPastelColor: function () { + var r = (Math.round(Math.random()* 127) + 127).toString(16); + var g = (Math.round(Math.random()* 127) + 127).toString(16); + var b = (Math.round(Math.random()* 127) + 127).toString(16); + return Metamaps.Util.colorLuminance('#' + r + g + b, -0.4); + }, + // darkens a hex value by 'lum' percentage + colorLuminance: function (hex, lum) { + + // validate hex string + hex = String(hex).replace(/[^0-9a-f]/gi, ''); + if (hex.length < 6) { + hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2]; + } + lum = lum || 0; + + // convert to decimal and change luminosity + var rgb = "#", c, i; + for (i = 0; i < 3; i++) { + c = parseInt(hex.substr(i*2,2), 16); + c = Math.round(Math.min(Math.max(0, c + (c * lum)), 255)).toString(16); + rgb += ("00"+c).substr(c.length); + } + + return rgb; + }, generateOptionsList: function (data) { var newlist = ""; for (var i = 0; i < data.length; i++) { @@ -1644,6 +1670,7 @@ Metamaps.Realtime = { self.mappersOnMap[data.userid] = { name: data.username, image: data.userimage, + color: Metamaps.Util.getPastelColor(), realtime: data.userrealtime, coords: { x: 0, @@ -1667,7 +1694,7 @@ Metamaps.Realtime = { $('.realtimeMapperList ul').append(mapperListItem); // create a div for the collaborators compass - self.createCompass(data.username, data.userid, data.userimage); + self.createCompass(data.username, data.userid, data.userimage, self.mappersOnMap[data.userid].color); } }, newPeerOnMap: function (data) { @@ -1682,6 +1709,7 @@ Metamaps.Realtime = { self.mappersOnMap[data.userid] = { name: data.username, image: data.userimage, + color: Metamaps.Util.getPastelColor(), realtime: true, coords: { x: 0, @@ -1700,7 +1728,7 @@ Metamaps.Realtime = { $('.realtimeMapperList ul').append(mapperListItem); // create a div for the collaborators compass - self.createCompass(data.username, data.userid, data.userimage); + self.createCompass(data.username, data.userid, data.userimage, self.mappersOnMap[data.userid].color); Metamaps.GlobalUI.notifyUser(data.username + ' just joined the map'); @@ -1716,7 +1744,7 @@ Metamaps.Realtime = { socket.emit('updateNewMapperList', update); } }, - createCompass: function(name, id, image) { + createCompass: function(name, id, image, color) { var str = '

            '+name+'

            '; str += '
            '; $('#compass' + id).remove(); @@ -1724,6 +1752,12 @@ Metamaps.Realtime = { id: 'compass' + id, class: 'collabCompass' }).html(str).appendTo('#wrapper'); + $('#compass' + id + ' img').css({ + 'border': '2px solid ' + color + }); + $('#compass' + id + ' p').css({ + 'background-color': color + }); }, lostPeerOnMap: function (data) { var self = Metamaps.Realtime; From c817622984994a6a68a73104be8c21937b58e5fc Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 24 Sep 2014 17:15:39 -0400 Subject: [PATCH 116/600] for heroku --- app/assets/javascripts/src/Metamaps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index ef09e128..c112917d 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1498,7 +1498,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://localhost:5001'); + self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); self.startActiveMap(); }, toggleBox: function (event) { From 6f62d59b66d457af0beaec549694e5911118c4bd Mon Sep 17 00:00:00 2001 From: BasharJabbour Date: Thu, 25 Sep 2014 12:25:46 -0400 Subject: [PATCH 117/600] Sign In, Sign Up, Edit User pages have been changed. Edit User page needs lots of work still. --- app/assets/stylesheets/application.css | 179 +++++++++++++++++++-- app/views/users/edit.html.erb | 19 ++- app/views/users/passwords/new.html.erb | 4 +- app/views/users/registrations/new.html.erb | 14 +- app/views/users/sessions/new.html.erb | 21 ++- diff.txt | 130 +++++++++++++++ 6 files changed, 326 insertions(+), 41 deletions(-) create mode 100644 diff.txt diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index bb0edb60..accf32c0 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -74,9 +74,40 @@ body, /* forgot password fix */ .forgotPassword input[type="submit"] { - padding: 0 5px; - width: auto; + width: 300px; + color: #f5f5f5; + font-family: din-regular; } + +.new_user input[type="submit"] { + width: 96px; + padding: 0px; + font-family: din-regular; + text-transform: uppercase; + color: #f5f5f5; + margin-top:16px; + float: right; +} + +.login input[type="submit"]{ + width:84px; + margin-top: 16px; + margin-left: 61px; + margin-right: 35px; + font-family: din-regular; + text-transform: uppercase; +} + +.edit_user input[type="submit"]{ + width: 96px; + padding: 0px; + font-family: din-regular; + text-transform: uppercase; + color: #f5f5f5; + margin-top:16px; + float: right; +} + html { } @@ -181,6 +212,7 @@ input[type="submit"]:active { .new_session, .new_user, .edit_user, +.login, .forgotPassword { display: block; width: 300px; @@ -189,36 +221,132 @@ input[type="submit"]:active { border-radius: 5px; color: black; box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); + position:absolute; top: 50%; left:50%; - position:absolute; - margin-left: -166px; } + +.login{ + width: 322px; + height: 308px; + box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); + margin-left:-166px; + margin-top:-158px; + padding-left: 35px; + font-family: din-medium; + font-size: 18px; + color: #424242; +} + +.login input[type="checkbox"] { + border: 1px #424242; + top: 250px; + float: left; +} + +.new_user{ + height: 412px; + margin-left:-166px; + box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); + font-family: din-medium; + font-size: 18px; + line-height: 18px; + text-transform: uppercase; + color:#424242; + margin-top: -222px; +} + +.edit_user { + width: 300px; + height:531px; + top: 136px; + margin-left: -166px; + box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); + text-transform: uppercase; + font-size: 18px; + line-height: 18px; + font-family: din-medium; + color:#424242; +} + .forgotPassword { height: 134px; + font-family: din-medium; + color:#424242; + text-transform: uppercase; + box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); + font-size: 18px; + margin-left: -166px; margin-top: -83px; } + +.firstFieldText{ + font-family: din-regular; + font-size: 14px; + color:#424242; + padding-top:24px; + padding-bottom: 6px; + text-transform: none; + margin: 0px; + line-height: 14px +} +.fieldText { + font-family: din-regular; + font-size: 14px; + color:#424242; + padding-top:16px; + padding-bottom: 6px; + text-transform: none; + margin: 0px; + line-height: 14px; +} + +.smallText{ + font: din-regular; + font-size: 12px; + line-height: 12px; + color: #c04f4f; + margin-top: 16px; +} + +.forgotPasswordText { + font-family: din-medium; + font-size: 12px; + color:#757575; + margin-left: 35px; +} + +.name { + font-size: 24px; + text-align: center; + font-family: din-meduim; + color:#424242; + margin-top: 24px; + text-transform: none; +} + .centerGreyForm input[type="text"], .centerGreyForm input[type="email"], .centerGreyForm input[type="password"] { - width: 250px; + width: 300px; height: 32px; - font-size: 15px; + font-size: 14px; direction: ltr; -webkit-appearance: none; appearance: none; display: inline-block; - margin: 0; - padding: 0 8px; + margin: 0px 0px; + padding: 10px 0px 0px 9px; background: #fff; + color: #bdbdbd; border: 1px solid #d9d9d9; border-top: 1px solid #c0c0c0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + border-radius: 2px; font: -webkit-small-control; color: initial; letter-spacing: normal; @@ -227,8 +355,28 @@ input[type="submit"]:active { text-indent: 0px; text-shadow: none; display: inline-block; - text-align: start; + font: din-medium; + text-align: left; } + +.login input[type="email"], +.login input[type="password"] { + width: 200px; + height:32px; + border-radius: 2px; + background-color:#ffffff; + color:#bdbdbd; + font-family: din-medium; + font-size: 14px; + text-align: left; + padding: 11px 0px 0px 10px; + margin-left: 61px; +} + +.login input[type="email"] { + margin-bottom:10px; +} + .centerGreyForm input[type="text"]:hover, .centerGreyForm input[type="email"]:hover, .centerGreyForm input[type="password"]:hover { @@ -237,7 +385,9 @@ input[type="submit"]:active { -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + color: #424242; } + .new_topic { /* start it off screen while it initializes the spinner, then it will be hidden with jquery */ top: -1000px; @@ -548,6 +698,7 @@ li.accountInvite span { width:84px; margin: 24px auto; } + .accountInput { margin: 0 35px 10px; } @@ -600,12 +751,14 @@ li.accountInvite span { } #user_remember_me { margin-top: 11px; + display:inline; } #user_remember_me, label[for="user_remember_me"] { - float: left; + float: right; font-size: 12px; color: #424242; + margin-left: 24px; } .accountForgotPass { margin: 8px 0 0 35px; diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 738d5c62..c85dc299 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -6,15 +6,18 @@ <% content_for :title, @user.name + "'s Settings | Metamaps" %>
            -<%= formula_form_for @user, url: user_url do |form| %> +<%= formula_form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %>

            Edit Account

            - - <% if @user.image %><%= image_tag @user.image.url(:round), :size => "48x48" %><% end %> - <%= form.file_field :image %> - <%= form.input :name, label: "Name", class: "name" %> - <%= form.input :email, label: "Email", class: "email" %> - <%= form.input :password, label: "Password", class: "password", :autocomplete => :off %> + <% if @user.image %><%= image_tag @user.image.url(:round), :size => "120x120" %><% end %> +
            <%= @user.name %>
            +
            <%= form.label :email, "Email:", :class => "firstFieldText" %> + <%= form.input :email %>
            +
            <%= form.label :password, "Current Password:", :class => "firstFieldText" %> + <%= form.input :password, :autocomplete => :off%>
            +
            <%= form.label :password, "New Password:", :class => "firstFieldText" %> + <%= form.input :password, :autocomplete => :off%>
            +
            <%= form.label :password, "Confirm New Password:", :class => "firstFieldText" %> + <%= form.input :password, :autocomplete => :off%>
            <%= form.submit "Update", class: "update" %> <% end %>
            - diff --git a/app/views/users/passwords/new.html.erb b/app/views/users/passwords/new.html.erb index 88dddb4a..120bf376 100644 --- a/app/views/users/passwords/new.html.erb +++ b/app/views/users/passwords/new.html.erb @@ -6,10 +6,10 @@

            FORGOT PASSWORD?

            -
            <%= f.label :email, "Enter Your Email:" %> +
            <%= f.label :email, "Enter your email:", :class => "firstFieldText" %> <%= f.email_field :email, :autofocus => true %>
            -
            <%= f.submit "Send Reset Password Instructions" %>
            +
            <%= f.submit "Send Password Reset Instructions" %>
            <% end %>
            diff --git a/app/views/users/registrations/new.html.erb b/app/views/users/registrations/new.html.erb index e7c08256..1f835e30 100644 --- a/app/views/users/registrations/new.html.erb +++ b/app/views/users/registrations/new.html.erb @@ -6,24 +6,24 @@

            Sign Up

            -
            <%= f.label :name %> +
            <%= f.label :name, "Name:", :class => "firstFieldText" %> <%= f.text_field :name, :autofocus => true %>
            -
            <%= f.label :email %> +
            <%= f.label :email, "Email:", :class => "fieldText" %> <%= f.email_field :email %>
            -
            <%= f.label :password %> +
            <%= f.label :password, "Password:", :class => "fieldText" %> <%= f.password_field :password %>
            -
            <%= f.label :password_confirmation %> +
            <%= f.label :password_confirmation, "Password Confirmation:", :class => "fieldText" %> <%= f.password_field :password_confirmation %>
            -
            <%= f.label "Access Code" %> +
            <%= f.label "Access Code:", :class => "fieldText" %> <%= f.text_field :joinedwithcode %>
            -
            <%= f.submit "Sign up" %>
            +
            <%= f.submit "Sign up!" %>
            -

            Don't have an access code?
            Request an Invite
            +

            Don't have an access code?
            Request an Invite
            <% end %>
            diff --git a/app/views/users/sessions/new.html.erb b/app/views/users/sessions/new.html.erb index 6f55203b..0a13b435 100644 --- a/app/views/users/sessions/new.html.erb +++ b/app/views/users/sessions/new.html.erb @@ -1,28 +1,27 @@ <% content_for :title, "Sign In | Metamaps" %>
            -<%= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :method => :post, :class => "new_user centerGreyForm" }) do |f| %> -

            Sign in

            - -
            <%= f.label :email %> +<%= form_for(resource, :as => resource_name, :url => session_path(resource_name), :html => { :method => :post, :class => "centerGreyForm login" }) do |f| %> +

            SIGN IN

            + +
            +
            <%= f.email_field :email, :autofocus => true %>
            -
            <%= f.label :password %> +
            <%= f.password_field :password %>
            +
            <%= f.submit "Sign in" %>
            <% if devise_mapping.rememberable? -%> -
            <%= f.check_box :remember_me %> <%= f.label :remember_me %>
            +
            <%= f.check_box :remember_me %>
            <% end -%> -
            <%= f.submit "Sign in" %>
            -
            <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot your password?", new_password_path(resource_name), - :data => { :bypass => 'true'} %>
            + <%= link_to "Forgot your password?", new_password_path(resource_name), :class => "forgotPasswordText" , + :data => { :bypass => 'true'}%>
            <% end -%>
            -
            Don't have an account?
            Request an Invite
            <% end %>
            diff --git a/diff.txt b/diff.txt new file mode 100644 index 00000000..badb2420 --- /dev/null +++ b/diff.txt @@ -0,0 +1,130 @@ + + +diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css +index bb0edb6..bb56ab0 100644 +--- a/app/assets/stylesheets/application.css ++++ b/app/assets/stylesheets/application.css +@@ -74,8 +74,9 @@ body, + /* forgot password fix */ + + .forgotPassword input[type="submit"] { +- padding: 0 5px; +- width: auto; ++ width: 300px; ++ color: #f5f5f5; ++ font-family: din-regular; + } + html { + +@@ -189,36 +190,55 @@ input[type="submit"]:active { + border-radius: 5px; + color: black; + box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); ++ position:absolute; + top: 50%; + left:50%; +- position:absolute; +- margin-left: -166px; ++ + } ++ + .forgotPassword { + height: 134px; + margin-top: -83px; ++ font-family: din-medium; ++ color:#424242; ++ text-transform: uppercase; ++ box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); ++ font-size: 17px; ++ margin-left: -166px; ++ ++} ++ ++.emailText { ++ font-family: din-regular; ++ font-size: 14px; ++ color:#424242; ++ padding-top:24px; ++ padding-bottom: 6px; ++ text-transform: none; ++ margin: 0px; + } + .centerGreyForm input[type="text"], + .centerGreyForm input[type="email"], + .centerGreyForm input[type="password"] { +- width: 250px; ++ width: 300px; + height: 32px; + font-size: 15px; + direction: ltr; + -webkit-appearance: none; + appearance: none; + display: inline-block; +- margin: 0; +- padding: 0 8px; ++ margin: 0px 0px 6px 0px; ++ padding: 10px 0px 0px 9px; + background: #fff; ++ color: #bdbdbd; + border: 1px solid #d9d9d9; + border-top: 1px solid #c0c0c0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +- -webkit-border-radius: 1px; +- -moz-border-radius: 1px; +- border-radius: 1px; ++ -webkit-border-radius: 2px; ++ -moz-border-radius: 2px; ++ border-radius: 2px; + font: -webkit-small-control; + color: initial; + letter-spacing: normal; +@@ -227,8 +247,10 @@ input[type="submit"]:active { + text-indent: 0px; + text-shadow: none; + display: inline-block; +- text-align: start; ++ font: din-medium; ++ text-align: left; + } ++ + .centerGreyForm input[type="text"]:hover, + .centerGreyForm input[type="email"]:hover, + .centerGreyForm input[type="password"]:hover { +@@ -237,7 +259,9 @@ input[type="submit"]:active { + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); ++ color: #424242; + } ++ + .new_topic { + /* start it off screen while it initializes the spinner, then it will be hidden with jquery */ + top: -1000px; +diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb +index 738d5c6..70d6de7 100644 +--- a/app/views/users/edit.html.erb ++++ b/app/views/users/edit.html.erb +@@ -17,4 +17,3 @@ + <%= form.submit "Update", class: "update" %> + <% end %> +
            +- +diff --git a/app/views/users/passwords/new.html.erb b/app/views/users/passwords/new.html.erb +index 88dddb4..3238a81 100644 +--- a/app/views/users/passwords/new.html.erb ++++ b/app/views/users/passwords/new.html.erb +@@ -6,10 +6,10 @@ + +

            FORGOT PASSWORD?

            + +-
            <%= f.label :email, "Enter Your Email:" %> ++
            <%= f.label :email, "Enter your email:", :class => "emailText" %> + <%= f.email_field :email, :autofocus => true %>
            + +-
            <%= f.submit "Send Reset Password Instructions" %>
            ++
            <%= f.submit "Send Password Reset Instructions" %>
            + + <% end %> +
            From 71247a8f04bc04d8c81fc92978edb1d12b43a4f4 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 25 Sep 2014 13:26:09 -0400 Subject: [PATCH 118/600] fixes for account pages --- app/assets/stylesheets/application.css | 43 +++++++++++--------------- app/views/layouts/_account.html.erb | 18 ++++++----- app/views/users/edit.html.erb | 12 +++---- app/views/users/sessions/new.html.erb | 25 +++++++++------ 4 files changed, 50 insertions(+), 48 deletions(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index cabd6303..e67b6e69 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -92,8 +92,6 @@ body, .login input[type="submit"]{ width:84px; margin-top: 16px; - margin-left: 61px; - margin-right: 35px; font-family: din-regular; text-transform: uppercase; } @@ -227,23 +225,16 @@ input[type="submit"]:active { } .login{ - width: 322px; + width: 200px; height: 308px; box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); - margin-left:-166px; + margin-left:-100px; margin-top:-158px; - padding-left: 35px; font-family: din-medium; font-size: 18px; color: #424242; } -.login input[type="checkbox"] { - border: 1px #424242; - top: 250px; - float: left; -} - .new_user{ height: 412px; margin-left:-166px; @@ -258,8 +249,7 @@ input[type="submit"]:active { .edit_user { width: 300px; - height:531px; - top: 136px; + margin-top: -282px; margin-left: -166px; box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); text-transform: uppercase; @@ -309,13 +299,6 @@ input[type="submit"]:active { margin-top: 16px; } -.forgotPasswordText { - font-family: din-medium; - font-size: 12px; - color:#757575; - margin-left: 35px; -} - .name { font-size: 24px; text-align: center; @@ -370,7 +353,6 @@ input[type="submit"]:active { font-size: 14px; text-align: left; padding: 11px 0px 0px 10px; - margin-left: 61px; } .login input[type="email"] { @@ -745,11 +727,18 @@ li.accountInvite span { box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .accountSubmit { - margin-left: 35px; float:left; } +.loginAnywhere .accountSubmit { + margin-left: 35px; +} .accountRememberMe { float:right; +} +.login .accountRememberMe { + margin-top: 10px; +} +.loginAnywhere .accountRememberMe { margin-right: 35px; } #user_remember_me { @@ -761,12 +750,16 @@ label[for="user_remember_me"] { float: right; font-size: 12px; color: #424242; - margin-left: 24px; } .accountForgotPass { - margin: 8px 0 0 35px; font-size: 12px; } +.loginAnywhere .accountForgotPass { + margin: 8px 0 0 35px; +} +.login .accountForgotPass { + margin: 8px 0 0 0; +} .accountForgotPass a { color: #757575; } @@ -2257,4 +2250,4 @@ float: left; background-position: 16px 8px; -webkit-transform-origin: left center; transform-origin: left center; -} +} diff --git a/app/views/layouts/_account.html.erb b/app/views/layouts/_account.html.erb index 5fe43665..0cee5c7f 100644 --- a/app/views/layouts/_account.html.erb +++ b/app/views/layouts/_account.html.erb @@ -38,14 +38,18 @@
            <%= f.submit "SIGN IN" %>
            <% if devise_mapping.rememberable? -%> -
            <%= f.check_box :remember_me %> <%= f.label :remember_me, "Stay signed in" %>
            +
            + <%= f.label :remember_me, "Stay signed in" %> + <%= f.check_box :remember_me %> +
            +
            <% end -%>
            +
            + <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot password?", new_password_path(resource_name), + :data => { :bypass => 'true'} %> + <% end -%> +
            <% end %> -
            - <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot password?", new_password_path(resource_name), - :data => { :bypass => 'true'} %> - <% end -%> -
            <% end %> diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index c85dc299..5eee44f1 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -6,18 +6,18 @@ <% content_for :title, @user.name + "'s Settings | Metamaps" %>
            -<%= formula_form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %> +<%= form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %>

            Edit Account

            <% if @user.image %><%= image_tag @user.image.url(:round), :size => "120x120" %><% end %>
            <%= @user.name %>
            <%= form.label :email, "Email:", :class => "firstFieldText" %> - <%= form.input :email %>
            + <%= form.email_field :email %>
            <%= form.label :password, "Current Password:", :class => "firstFieldText" %> - <%= form.input :password, :autocomplete => :off%>
            + <%= form.password_field :password, :autocomplete => :off%>
            <%= form.label :password, "New Password:", :class => "firstFieldText" %> - <%= form.input :password, :autocomplete => :off%>
            -
            <%= form.label :password, "Confirm New Password:", :class => "firstFieldText" %> - <%= form.input :password, :autocomplete => :off%>
            + <%= form.password_field :password, :autocomplete => :off%>
            +
            <%= form.label :password_confirmation, "Confirm New Password:", :class => "firstFieldText" %> + <%= form.password_field :password_confirmation, :autocomplete => :off%>
            <%= form.submit "Update", class: "update" %> <% end %>
            diff --git a/app/views/users/sessions/new.html.erb b/app/views/users/sessions/new.html.erb index 0a13b435..0c28a9cb 100644 --- a/app/views/users/sessions/new.html.erb +++ b/app/views/users/sessions/new.html.erb @@ -6,22 +6,27 @@
            - <%= f.email_field :email, :autofocus => true %>
            + <%= f.email_field :email, :autofocus => true, :placeholder => "Email" %>
            - <%= f.password_field :password %>
            + <%= f.password_field :password, :placeholder => "Password" %>
            -
            <%= f.submit "Sign in" %>
            +
            <%= f.submit "Sign in" %>
            <% if devise_mapping.rememberable? -%> -
            <%= f.check_box :remember_me %>
            +
            + <%= f.label :remember_me, "Stay signed in" %> + <%= f.check_box :remember_me %> +
            +
            <% end -%> +
            -
            - <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot your password?", new_password_path(resource_name), :class => "forgotPasswordText" , - :data => { :bypass => 'true'}%>
            - <% end -%> -
            +
            + <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot password?", new_password_path(resource_name), + :data => { :bypass => 'true'}%>
            + <% end -%> +
            <% end %>
            From c46ab1a98b9a8d573194bcd1e45fd612fb02af22 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Thu, 25 Sep 2014 13:41:37 -0400 Subject: [PATCH 119/600] added hover to edit photo --- app/assets/stylesheets/application.css | 19 +++++++++++++++++++ app/views/users/edit.html.erb | 5 ++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index e67b6e69..eb8176b8 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -106,6 +106,25 @@ body, float: right; } +.edit_user .userImage { + width: 120px; + margin: 0 auto; + position: relative; +} +.edit_user .editPhoto { + display: none; + width: 40px; + height: 40px; + background-image: url(photo.png); + position: absolute; + top: 40px; + left: 40px; + cursor: pointer; +} +.edit_user .userImage:hover .editPhoto { + display: block; +} + html { } diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 5eee44f1..ea03ef49 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -8,7 +8,10 @@
            <%= form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %>

            Edit Account

            - <% if @user.image %><%= image_tag @user.image.url(:round), :size => "120x120" %><% end %> +
            + <%= image_tag @user.image.url(:round), :size => "120x120" %> +
            +
            <%= @user.name %>
            <%= form.label :email, "Email:", :class => "firstFieldText" %> <%= form.email_field :email %>
            From 14eb7562b19981bf761b955eb1356149b0102480 Mon Sep 17 00:00:00 2001 From: BasharJabbour Date: Fri, 26 Sep 2014 08:42:11 -0400 Subject: [PATCH 120/600] fixed edit user account page --- app/assets/javascripts/src/Metamaps.js | 36 ++++++++++++++++++ app/assets/stylesheets/application.css | 51 +++++++++++++++++++++++--- app/views/users/edit.html.erb | 4 ++ app/views/users/sessions/new.html.erb | 25 +++++-------- 4 files changed, 95 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index c112917d..7ded91f1 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -3401,6 +3401,7 @@ Metamaps.Map.InfoBox = { }); $('.yourMap .mapPermission').unbind().click(self.onPermissionClick); + }, createContributorList: function () { var self = Metamaps.Map.InfoBox; @@ -3457,6 +3458,41 @@ Metamaps.Map.InfoBox = { } }; // end Metamaps.Map.InfoBox +/* +* +* Account Settings +* +*/ +Metamaps.Account = { + init: function () { + var self = Metamaps.Account; + $(".changePass").click(function(){ + $(".toHide").show(); + $(".changePass").hide(); + }); + }, + + load: function(){ + var self = Metamaps.Account; + $(".changePass").click(function(){ + $(".toHide").show(); + $(".changePass").hide(); + }); + self.attachEventListeners(); + }, + attachEventListeners: function () { + $(".changePass").click(); + $(".noChangePass").click(); + }, + showPass: function(){ + $(".toHide").show(); + $(".changePass").hide(); + }, + hidePass: function(){ + $(".toHide").hide(); + $(".changePass").show(); + } +}; /* * diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index eb8176b8..38b61813 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -77,6 +77,8 @@ body, width: 300px; color: #f5f5f5; font-family: din-regular; + top: 118px; + position: absolute; } .new_user input[type="submit"] { @@ -110,6 +112,7 @@ body, width: 120px; margin: 0 auto; position: relative; + margin-top: 40px; } .edit_user .editPhoto { display: none; @@ -259,7 +262,6 @@ input[type="submit"]:active { margin-left:-166px; box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); font-family: din-medium; - font-size: 18px; line-height: 18px; text-transform: uppercase; color:#424242; @@ -272,21 +274,24 @@ input[type="submit"]:active { margin-left: -166px; box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); text-transform: uppercase; - font-size: 18px; line-height: 18px; font-family: din-medium; color:#424242; } +.toHide { + display:none; +} + .forgotPassword { height: 134px; font-family: din-medium; color:#424242; text-transform: uppercase; box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); - font-size: 18px; margin-left: -166px; margin-top: -83px; + line-height: 18px; } .firstFieldText{ @@ -311,11 +316,12 @@ input[type="submit"]:active { } .smallText{ - font: din-regular; + font-family: din-regular; font-size: 12px; line-height: 12px; color: #c04f4f; - margin-top: 16px; + margin-top: 8px; + text-transform: none; } .name { @@ -325,6 +331,39 @@ input[type="submit"]:active { color:#424242; margin-top: 24px; text-transform: none; + +} + +.name:after { + background:url(edit.png)no-repeat; + content:" "; + position:absolute; + width:25px; + height:25px; + margin:5px 0px 0px 5px; +} + +.changePass { + font-family: din-regular; + font-size: 14px; + line-height: 14px; + color: #4fb5c0; + padding-top: 16px; + float: left; + text-transform: none; + cursor: pointer; +} + +.noChangePass { + font-family: din-regular; + font-size: 12px; + line-height: 12px; + color: #c04f4f; + padding-top: 16px; + float: left; + text-transform: none; + cursor: pointer; + } .centerGreyForm input[type="text"], @@ -357,7 +396,7 @@ input[type="submit"]:active { text-indent: 0px; text-shadow: none; display: inline-block; - font: din-medium; + font-family: din-medium; text-align: left; } diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index ea03ef49..56afbb88 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -15,12 +15,16 @@
            <%= @user.name %>
            <%= form.label :email, "Email:", :class => "firstFieldText" %> <%= form.email_field :email %>
            +
            Change Password
            +
            <%= form.label :password, "Current Password:", :class => "firstFieldText" %> <%= form.password_field :password, :autocomplete => :off%>
            <%= form.label :password, "New Password:", :class => "firstFieldText" %> <%= form.password_field :password, :autocomplete => :off%>
            <%= form.label :password_confirmation, "Confirm New Password:", :class => "firstFieldText" %> <%= form.password_field :password_confirmation, :autocomplete => :off%>
            +
            oops, don't change password
            +
            <%= form.submit "Update", class: "update" %> <% end %>
            diff --git a/app/views/users/sessions/new.html.erb b/app/views/users/sessions/new.html.erb index 0c28a9cb..0ce0e56c 100644 --- a/app/views/users/sessions/new.html.erb +++ b/app/views/users/sessions/new.html.erb @@ -6,27 +6,22 @@
            - <%= f.email_field :email, :autofocus => true, :placeholder => "Email" %>
            + <%= f.email_field :email, :autofocus => true %>
            - <%= f.password_field :password, :placeholder => "Password" %>
            + <%= f.password_field :password %>
            -
            <%= f.submit "Sign in" %>
            +
            <%= f.submit "Sign in" %>
            <% if devise_mapping.rememberable? -%> -
            - <%= f.label :remember_me, "Stay signed in" %> - <%= f.check_box :remember_me %> -
            -
            +
            <%= f.check_box :remember_me %>
            <% end -%> -
            -
            - <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot password?", new_password_path(resource_name), - :data => { :bypass => 'true'}%>
            - <% end -%> -
            +
            + <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot your password?", new_password_path(resource_name), :class => "forgotPasswordText" , + :data => { :bypass => 'true'}%>
            + <% end -%> +
            <% end %>
          • From 32908c7717e80c03b2e0e3886abbdf34e1d3c61e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Fri, 26 Sep 2014 22:31:06 -0400 Subject: [PATCH 121/600] style changes for account pages --- app/assets/javascripts/src/Metamaps.js | 23 +++---- app/assets/stylesheets/application.css | 86 ++++++++++++++------------ app/assets/stylesheets/clean.css | 12 +--- app/views/users/edit.html.erb | 16 +++-- app/views/users/sessions/new.html.erb | 27 ++++---- 5 files changed, 84 insertions(+), 80 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 7ded91f1..d0f6057d 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -3466,23 +3466,12 @@ Metamaps.Map.InfoBox = { Metamaps.Account = { init: function () { var self = Metamaps.Account; - $(".changePass").click(function(){ - $(".toHide").show(); - $(".changePass").hide(); - }); - }, - load: function(){ - var self = Metamaps.Account; - $(".changePass").click(function(){ - $(".toHide").show(); - $(".changePass").hide(); - }); - self.attachEventListeners(); + }, - attachEventListeners: function () { - $(".changePass").click(); - $(".noChangePass").click(); + changeName: function(){ + $('.accountName').hide(); + $('.changeName').show(); }, showPass: function(){ $(".toHide").show(); @@ -3491,6 +3480,10 @@ Metamaps.Account = { hidePass: function(){ $(".toHide").hide(); $(".changePass").show(); + + $('#current_password').val(''); + $('#user_password').val(''); + $('#user_password_confirmation').val(''); } }; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 38b61813..8ae9967a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -51,6 +51,22 @@ img { display: block; text-indent: -9999px; } + +::-webkit-input-placeholder { /* WebKit browsers */ + color: #BDBDBD; +} +:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #BDBDBD; + opacity: 1; +} +::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #BDBDBD; + opacity: 1; +} +:-ms-input-placeholder { /* Internet Explorer 10+ */ + color: #BDBDBD; +} + html, body, .main, @@ -109,10 +125,10 @@ body, } .edit_user .userImage { - width: 120px; + width: 84px; margin: 0 auto; position: relative; - margin-top: 40px; + margin-top: 32px; } .edit_user .editPhoto { display: none; @@ -120,8 +136,8 @@ body, height: 40px; background-image: url(photo.png); position: absolute; - top: 40px; - left: 40px; + top: 22px; + left: 22px; cursor: pointer; } .edit_user .userImage:hover .editPhoto { @@ -294,8 +310,11 @@ input[type="submit"]:active { line-height: 18px; } +.edit_user label.firstFieldText { + padding-top: 8px; +} .firstFieldText{ - font-family: din-regular; + font-family: 'din-regular', helvetica, sans-serif; font-size: 14px; color:#424242; padding-top:24px; @@ -324,17 +343,16 @@ input[type="submit"]:active { text-transform: none; } -.name { +.accountName { font-size: 24px; text-align: center; - font-family: din-meduim; + font-family: 'din-medium', helvetica, sans-serif; color:#424242; margin-top: 24px; text-transform: none; } - -.name:after { +.accountName:hover .nameEdit:after { background:url(edit.png)no-repeat; content:" "; position:absolute; @@ -342,6 +360,10 @@ input[type="submit"]:active { height:25px; margin:5px 0px 0px 5px; } +.changeName { + display: none; + margin-top: 24px; +} .changePass { font-family: din-regular; @@ -377,11 +399,11 @@ input[type="submit"]:active { appearance: none; display: inline-block; margin: 0px 0px; - padding: 10px 0px 0px 9px; + padding: 5px 0px 0px 9px; background: #fff; - color: #bdbdbd; - border: 1px solid #d9d9d9; - border-top: 1px solid #c0c0c0; + color: #424242 !important; + border: none; + outline:none; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; @@ -396,7 +418,7 @@ input[type="submit"]:active { text-indent: 0px; text-shadow: none; display: inline-block; - font-family: din-medium; + font-family: 'din-regular', helvetica, sans-serif; text-align: left; } @@ -406,28 +428,17 @@ input[type="submit"]:active { height:32px; border-radius: 2px; background-color:#ffffff; - color:#bdbdbd; + color: #424242 !important; font-family: din-medium; font-size: 14px; text-align: left; - padding: 11px 0px 0px 10px; + padding: 5px 0px 0px 10px; } .login input[type="email"] { margin-bottom:10px; } -.centerGreyForm input[type="text"]:hover, -.centerGreyForm input[type="email"]:hover, -.centerGreyForm input[type="password"]:hover { - border: 1px solid #b9b9b9; - border-top: 1px solid #a0a0a0; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - color: #424242; -} - .new_topic { /* start it off screen while it initializes the spinner, then it will be hidden with jquery */ top: -1000px; @@ -758,8 +769,7 @@ li.accountInvite span { margin: 0; padding: 0 10px; background: #fff; - border: 1px solid #d9d9d9; - border-top: 1px solid #c0c0c0; + border: none; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; @@ -767,7 +777,7 @@ li.accountInvite span { -moz-border-radius: 2px; border-radius: 2px; font: -webkit-small-control; - color: #BDBDBD; + color: #424242 !important; letter-spacing: normal; word-spacing: normal; text-transform: none; @@ -776,14 +786,6 @@ li.accountInvite span { text-align: start; font-family: 'din-medium', helvetica, sans-serif; } -.sidebarAccountBox input[type="email"]:hover, -.sidebarAccountBox input[type="password"]:hover { - border: 1px solid #b9b9b9; - border-top: 1px solid #a0a0a0; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} .accountSubmit { float:left; } @@ -2267,7 +2269,15 @@ float: left; display: none; } + /* collabCompass section */ +.collabCompass { + position:fixed; + top:50%; + left:50%; + z-index: 4; +} + .collabCompass:hover p { display: block; } diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 4548ad71..918af0c3 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -805,14 +805,4 @@ box-shadow: 0px 1px 1.5px rgba(0,0,0,0.12), 0 1px 1px rgba(0,0,0,0.24); body a#barometer_tab:hover { background-position: 0 -110px; -} - - -/* REALTIME */ - -.collabCompass { - position:fixed; - top:50%; - left:50%; - z-index: 4; -} +} \ No newline at end of file diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 56afbb88..82166dbf 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -9,21 +9,27 @@ <%= form_for @user, url: user_url, :html =>{ :class => "edit_user centerGreyForm"} do |form| %>

            Edit Account

            - <%= image_tag @user.image.url(:round), :size => "120x120" %> + <%= image_tag @user.image.url(:round), :size => "84x84" %>
            -
            <%= @user.name %>
            +
            +
            <%= @user.name %>
            +
            +
            <%= form.label :name, "Name:", :class => "firstFieldText" %> + <%= form.email_field :name %>
            <%= form.label :email, "Email:", :class => "firstFieldText" %> <%= form.email_field :email %>
            Change Password
            -
            <%= form.label :password, "Current Password:", :class => "firstFieldText" %> - <%= form.password_field :password, :autocomplete => :off%>
            +
            + <%= form.label :current_password, "Current Password:", :class => "firstFieldText" %> + <%= password_field_tag :current_password, params[:current_password] %> +
            <%= form.label :password, "New Password:", :class => "firstFieldText" %> <%= form.password_field :password, :autocomplete => :off%>
            <%= form.label :password_confirmation, "Confirm New Password:", :class => "firstFieldText" %> <%= form.password_field :password_confirmation, :autocomplete => :off%>
            -
            oops, don't change password
            +
            Oops, don't change password
            <%= form.submit "Update", class: "update" %> <% end %> diff --git a/app/views/users/sessions/new.html.erb b/app/views/users/sessions/new.html.erb index 0ce0e56c..16836175 100644 --- a/app/views/users/sessions/new.html.erb +++ b/app/views/users/sessions/new.html.erb @@ -6,22 +6,27 @@
            - <%= f.email_field :email, :autofocus => true %>
            + <%= f.email_field :email, :autofocus => true, :placeholder => "Email" %>
            - <%= f.password_field :password %>
            + <%= f.password_field :password, :placeholder => "Password" %>
            -
            <%= f.submit "Sign in" %>
            +
            <%= f.submit "Sign in" %>
            + <% if devise_mapping.rememberable? -%> -
            <%= f.check_box :remember_me %>
            +
            + <%= f.label :remember_me, "Stay signed in" %> + <%= f.check_box :remember_me %> +
            +
            <% end -%> - -
            - <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> - <%= link_to "Forgot your password?", new_password_path(resource_name), :class => "forgotPasswordText" , - :data => { :bypass => 'true'}%>
            - <% end -%> -
            +
            +
            + <%- if devise_mapping.recoverable? && controller_name != 'passwords' %> + <%= link_to "Forgot password?", new_password_path(resource_name), + :data => { :bypass => 'true'} %> + <% end -%> +
            <% end %>
        From 0160f56238b4ffaf8f69f2ef69e36e22f729a675 Mon Sep 17 00:00:00 2001 From: Robert Best Date: Fri, 26 Sep 2014 22:40:31 -0400 Subject: [PATCH 122/600] partially finished fixes to zoomextents --- app/assets/javascripts/metamaps/JIT.js | 6 ++ .../javascripts/metamaps/Metamaps.GlobalUI.js | 17 ++++ .../javascripts/metamaps/Metamaps.JIT.js | 90 +++++++++++++++---- app/assets/javascripts/metamaps/Metamaps.js | 3 + 4 files changed, 99 insertions(+), 17 deletions(-) diff --git a/app/assets/javascripts/metamaps/JIT.js b/app/assets/javascripts/metamaps/JIT.js index de6aacb7..c43788bc 100644 --- a/app/assets/javascripts/metamaps/JIT.js +++ b/app/assets/javascripts/metamaps/JIT.js @@ -2489,7 +2489,11 @@ Extras.Classes.Navigation = new Class({ if (!Metamaps.Mouse.boxStartCoordinates && (e.shiftKey || rightClick)) { Metamaps.Mouse.boxStartCoordinates = eventInfo.getPos(); } + Metamaps.Mouse.didPan = false; + + + // END METAMAPS CODE this.pos = eventInfo.getPos(); @@ -2557,6 +2561,8 @@ Extras.Classes.Navigation = new Class({ // START METAMAPS CODE if (Metamaps.Mouse.didPan) Metamaps.JIT.SmoothPanning(); + + // END METAMAPS CODE } diff --git a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js index 13278b28..f1c40b25 100644 --- a/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/metamaps/Metamaps.GlobalUI.js @@ -372,6 +372,23 @@ Metamaps.GlobalUI.Search = { self.close(0, true); } break; + case 65: + case 97: + e.preventDefault(); + if (e.ctrlKey){ + Metamaps.Visualize.mGraph.graph.eachNode(function (n) { + Metamaps.Control.selectNode(n,e); + }); + + Metamaps.Visualize.mGraph.plot(); + } + + break; + case 69: + case 101: + e.preventDefault(); + Metamaps.JIT.zoomExtents(); + break; default: break; //console.log(e.which); } diff --git a/app/assets/javascripts/metamaps/Metamaps.JIT.js b/app/assets/javascripts/metamaps/Metamaps.JIT.js index c0250038..810f2b2e 100644 --- a/app/assets/javascripts/metamaps/Metamaps.JIT.js +++ b/app/assets/javascripts/metamaps/Metamaps.JIT.js @@ -313,7 +313,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.selectWithBox(e); + Metamaps.JIT.zoomToBox(); return; } @@ -663,8 +663,6 @@ Metamaps.JIT = { var scale = dist / lastDist; - console.log(scale); - if (8 >= Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale && Metamaps.Visualize.mGraph.canvas.scaleOffsetX * scale >= 1) { Metamaps.Visualize.mGraph.canvas.scale(scale, scale); } @@ -945,7 +943,9 @@ Metamaps.JIT = { var fromNodeY = -1 * synapse.get('edge').nodeFrom.pos.y; var toNodeX = synapse.get('edge').nodeTo.pos.x; var toNodeY = -1 * synapse.get('edge').nodeTo.pos.y; - + var from = synapse.get('edge').nodeFrom; + var to = synapse.get('edge').nodeTo; + var maxX = fromNodeX; var maxY = fromNodeY; var minX = fromNodeX; @@ -964,7 +964,7 @@ Metamaps.JIT = { (eX > maxBoxX) ? (maxBoxX = eX):(minBoxX = eX); (eY > maxBoxY) ? (maxBoxY = eY):(minBoxY = eY); - //Fins the slopes from the synapse fromNode to the 4 corners of the selection box + //Find the slopes from the synapse fromNode to the 4 corners of the selection box var slopes = []; slopes.push( (sY - fromNodeY) / (sX - fromNodeX) ); slopes.push( (sY - fromNodeY) / (eX - fromNodeX) ); @@ -983,6 +983,10 @@ Metamaps.JIT = { var b = fromNodeY - synSlope * fromNodeX; var selectTest = false; + if (from.name == 'node 3' && to.name == 'node1'){ + console.log(from.pos.x,-1*from.pos.y,to.pos.x,-1*to.pos.y,sX,sY,eX,eY); + } + //if the synapse slope is within a range that would intersect with the selection box if (synSlope <= maxSlope && synSlope >= minSlope){ @@ -1003,17 +1007,18 @@ Metamaps.JIT = { testY = sY; testX = (testY - b)/synSlope; - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){ + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ selectTest = true; } testY = eY; testX = (testY - b)/synSlope; - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testY <= maxBoxX){ + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ selectTest = true; } } + //console.log('From '+from.name + ' to ' + to.name + ' is a ' +selectTest); //The test synapse was selected! if(selectTest){ if(e.ctrlKey){ @@ -1078,15 +1083,23 @@ Metamaps.JIT = { // wait a certain length of time, then check again, then run this code setTimeout(function () { if (!Metamaps.JIT.nodeWasDoubleClicked()) { - if (!e.shiftKey) { + if (!e.shiftKey && !e.ctrlKey) { Metamaps.Control.deselectAllNodes(); Metamaps.Control.deselectAllEdges(); } - if (node.selected) { - Metamaps.Control.deselectNode(node); - } else { + if(e.ctrlKey || e.shiftKey){ + if (node.selected) { + Metamaps.Control.deselectNode(node); + } else { + Metamaps.Control.selectNode(node,e); + } + } + else{ + Metamaps.Control.deselectAllNodes(); + Metamaps.Control.deselectAllEdges(); Metamaps.Control.selectNode(node,e); } + //trigger animation to final styles Metamaps.Visualize.mGraph.fx.animate({ modes: ['edge-property:lineWidth:color:alpha'], @@ -1111,7 +1124,6 @@ Metamaps.JIT = { // create new menu for clicked on node var rightclickmenu = document.createElement("div"); rightclickmenu.className = "rightclickmenu"; - // add the proper options to the menu var menustring = '
          '; @@ -1139,7 +1151,7 @@ Metamaps.JIT = { top: e.clientY }); //add the menu to the page - $('#center-container').append(rightclickmenu); + $('#infovis-canvaswidget').append(rightclickmenu); // attach events to clicks on the list items @@ -1452,6 +1464,54 @@ Metamaps.JIT = { canvas.translate(-1*offsetX,-1*offsetY); }, + zoomToBox: function () { + var sX = Metamaps.Mouse.boxStartCoordinates.x, + sY = Metamaps.Mouse.boxStartCoordinates.y, + eX = Metamaps.Mouse.boxEndCoordinates.x, + eY = Metamaps.Mouse.boxEndCoordinates.y; + + Metamaps.JIT.centerMap(); + + var height = $(document).height(), + width = $(document).width(); + + var spanX = Math.abs(sX - eX); + var spanY = Math.abs(sY - eY); + var ratioX = width / spanX; + var ratioY = height / spanY; + console.log(ratioX,ratioY); + + var newRatio = Math.min(ratioX,ratioY); + + var canvas = Metamaps.Visualize.mGraph.canvas; + + if(canvas.scaleOffsetX *newRatio<= 5 && canvas.scaleOffsetX*newRatio >= 0.2){ + canvas.scale(newRatio,newRatio); + } + else if(canvas.scaleOffsetX * newRatio > 5){ + newRatio = 5/ canvas.scaleOffsetX; + canvas.scale(newRatio,newRatio); + } + else{ + newRatio = 0.2/ canvas.scaleOffsetX; + canvas.scale(newRatio,newRatio); + } + + + + + + var cogX = (sX + eX)/2; + var cogY = (sY + eY)/2; + + canvas.translate(-1* cogX, -1* cogY); + + + Metamaps.Mouse.boxStartCoordinates = false; + Metamaps.Mouse.boxEndCoordinates = false; + Metamaps.Visualize.mGraph.plot(); + + }, zoomExtents: function () { Metamaps.JIT.centerMap(); var height = $(document).height(), @@ -1482,8 +1542,6 @@ Metamaps.JIT = { dim = n.getData('dim'), ctx = Metamaps.Visualize.mGraph.canvas.getCtx(); - console.log(dim); - var height = 25 * arrayOfLabelLines.length; var index, lineWidths = []; @@ -1539,8 +1597,6 @@ Metamaps.JIT = { dim = n.getData('dim'), ctx = Metamaps.Visualize.mGraph.canvas.getCtx(); - console.log(dim); - var height = 25 * arrayOfLabelLines.length; var index, lineWidths = []; diff --git a/app/assets/javascripts/metamaps/Metamaps.js b/app/assets/javascripts/metamaps/Metamaps.js index c7b6e3e6..6f4473f9 100644 --- a/app/assets/javascripts/metamaps/Metamaps.js +++ b/app/assets/javascripts/metamaps/Metamaps.js @@ -47,6 +47,7 @@ Metamaps.Touch = { Metamaps.Mouse = { didPan: false, + didBoxZoom: false, changeInX: 0, changeInY: 0, edgeHoveringOver: false, @@ -1718,11 +1719,13 @@ Metamaps.Control = { if (Metamaps.Selected.Nodes.indexOf(node) != -1) return; node.selected = true; node.setData('dim', 30, 'current'); + /* if(!(e.ctrlKey) && !(e.altKey)){ node.eachAdjacency(function (adj) { Metamaps.Control.selectEdge(adj); }); } + */ Metamaps.Selected.Nodes.push(node); }, From 2de7167c2c71ff3219ea28c2a8d3834ccff35536 Mon Sep 17 00:00:00 2001 From: Robert Best Date: Sun, 28 Sep 2014 15:29:22 -0400 Subject: [PATCH 123/600] A bunch of fixes for selection with box, and zoom to extents --- .../javascripts/src/Metamaps.GlobalUI.js | 12 +- app/assets/javascripts/src/Metamaps.JIT.js | 114 +++++++++--------- 2 files changed, 66 insertions(+), 60 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.GlobalUI.js b/app/assets/javascripts/src/Metamaps.GlobalUI.js index 4c2d9a05..a425d78f 100644 --- a/app/assets/javascripts/src/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/src/Metamaps.GlobalUI.js @@ -368,8 +368,12 @@ Metamaps.GlobalUI.Search = { break; case 65: case 97: - e.preventDefault(); + if (e.ctrlKey){ + Metamaps.Control.deselectAllNodes(); + Metamaps.Control.deselectAllEdges(); + + e.preventDefault(); Metamaps.Visualize.mGraph.graph.eachNode(function (n) { Metamaps.Control.selectNode(n,e); }); @@ -380,8 +384,10 @@ Metamaps.GlobalUI.Search = { break; case 69: case 101: - e.preventDefault(); - Metamaps.JIT.zoomExtents(); + if (e.ctrlKey){ + e.preventDefault(); + Metamaps.JIT.zoomExtents(); + } break; default: break; //console.log(e.which); diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 9562e2fd..41481c56 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -938,7 +938,7 @@ Metamaps.JIT = { Metamaps.Control.deselectAllEdges(); } - //select all nodes, and their edges, that are within the box + //select all nodes that are within the box Metamaps.Visualize.mGraph.graph.eachNode(function (n) { var x = n.pos.x, y = n.pos.y; @@ -967,10 +967,8 @@ Metamaps.JIT = { var fromNodeY = -1 * synapse.get('edge').nodeFrom.pos.y; var toNodeX = synapse.get('edge').nodeTo.pos.x; var toNodeY = -1 * synapse.get('edge').nodeTo.pos.y; - var from = synapse.get('edge').nodeFrom; - var to = synapse.get('edge').nodeTo; - - var maxX = fromNodeX; + + var maxX = fromNodeX; var maxY = fromNodeY; var minX = fromNodeX; var minY = fromNodeY; @@ -1005,45 +1003,44 @@ Metamaps.JIT = { //Find synapse-in-question's slope var synSlope = (toNodeY - fromNodeY) / (toNodeX - fromNodeX); var b = fromNodeY - synSlope * fromNodeX; + + //Use the selection box edges as test cases for synapse intersection + var testX = sX; + var testY = synSlope * testX + b; + + var selectTest; - var selectTest = false; - if (from.name == 'node 3' && to.name == 'node1'){ - console.log(from.pos.x,-1*from.pos.y,to.pos.x,-1*to.pos.y,sX,sY,eX,eY); - } - - - //if the synapse slope is within a range that would intersect with the selection box - if (synSlope <= maxSlope && synSlope >= minSlope){ - var testX = sX; - var testY = synSlope * testX + b; - - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ - selectTest = true; - } - - testX = eX; - testY = synSlope * testX + b; - - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ - selectTest = true; - } - - testY = sY; - testX = (testY - b)/synSlope; - - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ - selectTest = true; - } - - testY = eY; - testX = (testY - b)/synSlope; - - if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ - selectTest = true; - } + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ + selectTest = true; } - //console.log('From '+from.name + ' to ' + to.name + ' is a ' +selectTest); - //The test synapse was selected! + + testX = eX; + testY = synSlope * testX + b; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testY >= minBoxY && testY <= maxBoxY){ + selectTest = true; + } + + testY = sY; + testX = (testY - b)/synSlope; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ + selectTest = true; + } + + testY = eY; + testX = (testY - b)/synSlope; + + if(testX >= minX && testX <= maxX && testY >= minY && testY <= maxY && testX >= minBoxX && testX <= maxBoxX){ + selectTest = true; + } + + //Case where the synapse is wholly enclosed in the seldction box + if(fromNodeX >= minBoxX && fromNodeX <= maxBoxX && fromNodeY >= minBoxY && fromNodeY <= maxBoxY && toNodeX >= minBoxX && toNodeX <= maxBoxX && toNodeY >= minBoxY && toNodeY <= maxBoxY){ + selectTest = true; + } + + //The test synapse was selected! if(selectTest){ if(e.ctrlKey){ if(Metamaps.Selected.Edges.indexOf(synapse.get('edge')) != -1 ){ @@ -1520,7 +1517,6 @@ Metamaps.JIT = { var spanY = Math.abs(sY - eY); var ratioX = width / spanX; var ratioY = height / spanY; - console.log(ratioX,ratioY); var newRatio = Math.min(ratioX,ratioY); @@ -1536,11 +1532,7 @@ Metamaps.JIT = { else{ newRatio = 0.2/ canvas.scaleOffsetX; canvas.scale(newRatio,newRatio); - } - - - - + } var cogX = (sX + eX)/2; var cogY = (sY + eY)/2; @@ -1558,6 +1550,7 @@ Metamaps.JIT = { var height = $(document).height(), width = $(document).width(), maxX, minX, maxY, minY, counter = 0; + var canvas = Metamaps.Visualize.mGraph.canvas; if (Metamaps.Selected.Nodes.length > 0) { @@ -1581,7 +1574,7 @@ Metamaps.JIT = { var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'), dim = n.getData('dim'), - ctx = Metamaps.Visualize.mGraph.canvas.getCtx(); + ctx = canvas.getCtx(); var height = 25 * arrayOfLabelLines.length; @@ -1607,7 +1600,6 @@ Metamaps.JIT = { var newRatio = Math.max(ratioX,ratioY); var scaleMultiplier = 1/newRatio*0.9; - var canvas = Metamaps.Visualize.mGraph.canvas; if(canvas.scaleOffsetX *scaleMultiplier<= 3 && canvas.scaleOffsetX*scaleMultiplier >= 0.2){ canvas.scale(scaleMultiplier,scaleMultiplier); } @@ -1620,7 +1612,6 @@ Metamaps.JIT = { canvas.scale(scaleMultiplier,scaleMultiplier); } - counter = 0; nodes.forEach(function (n) { @@ -1636,7 +1627,7 @@ Metamaps.JIT = { var arrayOfLabelLines = Metamaps.Util.splitLine(n.name, 30).split('\n'), dim = n.getData('dim'), - ctx = Metamaps.Visualize.mGraph.canvas.getCtx(); + ctx = canvas.getCtx(); var height = 25 * arrayOfLabelLines.length; @@ -1653,12 +1644,21 @@ Metamaps.JIT = { counter++; }); + + var cogX = (maxX + minX)/2; + var cogY = (maxY + minY)/2; + + canvas.translate(-1* cogX, -1* cogY); + $(document).trigger(Metamaps.JIT.events.zoom, [event]); } + else if(nodes.length == 1){ + nodes.forEach(function (n) { + var x = n.pos.x, + y = n.pos.y; - var cogX = (maxX + minX)/2; - var cogY = (maxY + minY)/2; - - canvas.translate(-1* cogX, -1* cogY); - $(document).trigger(Metamaps.JIT.events.zoom, [event]); + canvas.translate(-1* x, -1* y); + $(document).trigger(Metamaps.JIT.events.zoom, [event]); + }); + } } }; \ No newline at end of file From 2b16123a4f5b62db1a922b0692727f2eb58299b6 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 10:45:08 -0400 Subject: [PATCH 124/600] fixed field type error on user edit form --- app/views/users/edit.html.erb | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 82166dbf..069a28a4 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -15,8 +15,10 @@
          <%= @user.name %>
          -
          <%= form.label :name, "Name:", :class => "firstFieldText" %> - <%= form.email_field :name %>
          +
          + <%= form.label :name, "Name:", :class => "firstFieldText" %> + <%= form.text_field :name %> +
          <%= form.label :email, "Email:", :class => "firstFieldText" %> <%= form.email_field :email %>
          Change Password
          From 06f18215dd3484049845518366cc46c494791251 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 16:04:36 -0400 Subject: [PATCH 125/600] bug fixes for mapping experience. able to store multiple references to synapses on each edge --- app/assets/javascripts/src/JIT.js | 3 +- app/assets/javascripts/src/Metamaps.JIT.js | 40 ++++++--- app/assets/javascripts/src/Metamaps.Router.js | 1 + app/assets/javascripts/src/Metamaps.js | 83 +++++++++++++------ app/assets/stylesheets/application.css | 2 +- app/assets/stylesheets/clean.css | 8 ++ 6 files changed, 95 insertions(+), 42 deletions(-) diff --git a/app/assets/javascripts/src/JIT.js b/app/assets/javascripts/src/JIT.js index 1cc4b8e1..bc3f23c3 100644 --- a/app/assets/javascripts/src/JIT.js +++ b/app/assets/javascripts/src/JIT.js @@ -7081,7 +7081,8 @@ Graph.Plot = { var l = Metamaps.Mouse.synapseStartCoordinates.length; for (var i = l - 1; i >= 0; i -= 1) { start = Metamaps.Mouse.synapseStartCoordinates[i]; - Metamaps.JIT.renderMidArrow(start, end, 13, false, canvas, 0.5, true); + Metamaps.JIT.renderMidArrow(start, end, 13, false, canvas, 0.3, true); + Metamaps.JIT.renderMidArrow(start, end, 13, false, canvas, 0.7, true); } ctx.restore(); } diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 41481c56..3c5b79c9 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -20,6 +20,7 @@ Metamaps.JIT = { */ prepareVizData: function () { var self = Metamaps.JIT; + var synapsesToRemove = []; var topic; var mapping; var node; @@ -39,7 +40,12 @@ Metamaps.JIT = { Metamaps.Synapses.each(function (s) { edge = s.createEdge(); - if (nodes[edge.nodeFrom] && nodes[edge.nodeTo]) { + if(Metamaps.Topics.get(s.get('node1_id')) === undefined || Metamaps.Topics.get(s.get('node2_id')) === undefined) { + // this means it's an invalid synapse + synapsesToRemove.push(s); + } + else if (nodes[edge.nodeFrom] && nodes[edge.nodeTo]) { + existingEdge = _.findWhere(edges, { nodeFrom: edge.nodeFrom, nodeTo: edge.nodeTo @@ -53,15 +59,24 @@ Metamaps.JIT = { // for when you're dealing with multiple relationships between the same two topics if (Metamaps.Active.Map) { mapping = s.getMapping(); - existingEdge['$mappingIDs'].push(mapping.isNew() ? mapping.cid : mapping.id); + existingEdge.data['$mappingIDs'].push(mapping.id); } - existingEdge['$synapseIDs'].push(s.id); + existingEdge.data['$synapseIDs'].push(s.id); } else { // for when you're dealing with a topic that has relationships to many different nodes nodes[edge.nodeFrom].adjacencies.push(edge); + edges.push(edge); } } }); + + // clean up the synapses array in case of any faulty data + _.each(synapsesToRemove, function (synapse) { + mapping = synapse.getMapping(); + Metamaps.Synapses.remove(synapse); + Metamaps.Mappings.remove(mapping); + }); + _.each(nodes, function (node) { self.vizData.push(node); }); @@ -319,7 +334,7 @@ Metamaps.JIT = { if (Metamaps.Mouse.boxStartCoordinates) { Metamaps.Visualize.mGraph.busy = false; Metamaps.Mouse.boxEndCoordinates = eventInfo.getPos(); - Metamaps.JIT.zoomToBox(); + Metamaps.JIT.zoomToBox(e); return; } @@ -816,8 +831,8 @@ Metamaps.JIT = { } else if (tempInit && tempNode2 != null) { // this means you want to create a synapse between two existing topics Metamaps.Create.newTopic.addSynapse = false; - Metamaps.Create.newSynapse.topic1id = tempNode.id; - Metamaps.Create.newSynapse.topic2id = tempNode2.id; + Metamaps.Create.newSynapse.topic1id = tempNode.getData('topic').id; + Metamaps.Create.newSynapse.topic2id = tempNode2.getData('topic').id; tempNode2.setData('dim', 25, 'current'); Metamaps.Visualize.mGraph.plot(); midpoint.x = tempNode.pos.getc().x + (tempNode2.pos.getc().x - tempNode.pos.getc().x) / 2; @@ -1414,9 +1429,9 @@ Metamaps.JIT = { var v2 = intermediatePoint.$add(normal.$scale(-1)); if (newSynapse) { - ctx.strokeStyle = "#222222"; + ctx.strokeStyle = "#4fc059"; ctx.lineWidth = 2; - ctx.globalAlpha = 0.4; + ctx.globalAlpha = 1; } ctx.beginPath(); ctx.moveTo(from.x, from.y); @@ -1465,8 +1480,7 @@ Metamaps.JIT = { y: posChild.y }, 13, false, canvas, 0.7); } else if (directionCat == "from-to") { - var direction = adj.data.$direction; - var inv = (direction && direction.length > 1 && direction[0] != adj.nodeFrom.id); + var inv = (direction[0] != adj.nodeFrom.id); self.renderMidArrow({ x: pos.x, y: pos.y @@ -1502,7 +1516,7 @@ Metamaps.JIT = { canvas.translate(-1*offsetX,-1*offsetY); }, - zoomToBox: function () { + zoomToBox: function (event) { var sX = Metamaps.Mouse.boxStartCoordinates.x, sY = Metamaps.Mouse.boxStartCoordinates.y, eX = Metamaps.Mouse.boxEndCoordinates.x, @@ -1538,14 +1552,14 @@ Metamaps.JIT = { var cogY = (sY + eY)/2; canvas.translate(-1* cogX, -1* cogY); - + $(document).trigger(Metamaps.JIT.events.zoom, [event]); Metamaps.Mouse.boxStartCoordinates = false; Metamaps.Mouse.boxEndCoordinates = false; Metamaps.Visualize.mGraph.plot(); }, - zoomExtents: function () { + zoomExtents: function (event) { Metamaps.JIT.centerMap(); var height = $(document).height(), width = $(document).width(), diff --git a/app/assets/javascripts/src/Metamaps.Router.js b/app/assets/javascripts/src/Metamaps.Router.js index dadc3771..b8df146a 100644 --- a/app/assets/javascripts/src/Metamaps.Router.js +++ b/app/assets/javascripts/src/Metamaps.Router.js @@ -130,6 +130,7 @@ Metamaps.GlobalUI.Search.unlock(); Metamaps.GlobalUI.Search.close(0, true); + Metamaps.Loading.show(); Metamaps.Map.end(); Metamaps.Map.launch(id); }, diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index ba648acf..83ece7d7 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -217,15 +217,15 @@ Metamaps.Backbone.init = function () { else return false; }, getTopic1: function () { - return Metamaps.Topic.get(this.get('node1_id')); + return Metamaps.Topics.get(this.get('node1_id')); }, getTopic2: function () { - return Metamaps.Topic.get(this.get('node2_id')); + return Metamaps.Topics.get(this.get('node2_id')); }, getDirection: function () { return [ - this.get('node1_id'), - this.get('node2_id') + this.getTopic1().get('node').id, + this.getTopic2().get('node').id ]; }, getMapping: function () { @@ -1232,11 +1232,15 @@ Metamaps.Visualize = { topic.updateNode(); n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); + if(!edge.getData('init')) { + edge.setData('init', true); + + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } } }); @@ -1254,11 +1258,15 @@ Metamaps.Visualize = { mapping = topic.getMapping(); n.eachAdjacency(function (edge) { - l = edge.getData('synapseIDs').length; - for (i = 0; i < l; i++) { - synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); - synapse.set('edge', edge); - synapse.updateEdge(); + if(!edge.getData('init')) { + edge.setData('init', true); + + l = edge.getData('synapseIDs').length; + for (i = 0; i < l; i++) { + synapse = Metamaps.Synapses.get(edge.getData('synapseIDs')[i]); + synapse.set('edge', edge); + synapse.updateEdge(); + } } }); @@ -1274,7 +1282,6 @@ Metamaps.Visualize = { /** * render does the heavy lifting of creating the engine that renders the graph with the properties we desire * - * @param vizData a json structure containing the data to be rendered. */ render: function () { var self = Metamaps.Visualize, RGraphSettings, FDSettings; @@ -2902,6 +2909,8 @@ Metamaps.Topic = { var newnode = topic.createNode(); + var midpoint = {}, pixelPos; + if (!$.isEmptyObject(Metamaps.Visualize.mGraph.graph.nodes)) { Metamaps.Visualize.mGraph.graph.addNode(newnode); Metamaps.Visualize.mGraph.graph.eachNode(function (n) { @@ -2927,8 +2936,15 @@ Metamaps.Topic = { nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); } if (Metamaps.Create.newTopic.addSynapse) { - Metamaps.Create.newSynapse.topic1id = tempNode.id; - Metamaps.Create.newSynapse.topic2id = nodeOnViz.id; + Metamaps.Create.newSynapse.topic1id = tempNode.getData('topic').id; + + // position the form + midpoint.x = tempNode.pos.getc().x + (nodeOnViz.pos.getc().x - tempNode.pos.getc().x) / 2; + midpoint.y = tempNode.pos.getc().y + (nodeOnViz.pos.getc().y - tempNode.pos.getc().y) / 2; + pixelPos = Metamaps.Util.coordsToPixels(midpoint); + $('#new_synapse').css('left', pixelPos.x + "px"); + $('#new_synapse').css('top', pixelPos.y + "px"); + // show the form Metamaps.Create.newSynapse.open(); Metamaps.Visualize.mGraph.fx.animate({ modes: ["node-property:dim"], @@ -2970,14 +2986,21 @@ Metamaps.Topic = { }); } + + var successCallback = function (topicModel, response) { + if (Metamaps.Active.Map) { + mapping.save({ topic_id: topicModel.id }); + } + + if (Metamaps.Create.newTopic.addSynapse) { + Metamaps.Create.newSynapse.topic2id = topicModel.id; + } + }; + if (!Metamaps.Settings.sandbox && createNewInDB) { if (topic.isNew()) { topic.save(null, { - success: function (topicModel, response) { - if (Metamaps.Active.Map) { - mapping.save({ topic_id: topicModel.id }); - } - }, + success: successCallback, error: function (model, response) { console.log('error saving topic to database'); } @@ -3116,12 +3139,13 @@ Metamaps.Synapse = { //for each node in this array we will create a synapse going to the position2 node. var synapsesToCreate = []; - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); - topic2 = node2.getData('topic'); + topic2 = Metamaps.Topics.get(Metamaps.Create.newSynapse.topic2id); + node2 = topic2.get('node'); var len = Metamaps.Selected.Nodes.length; if (len == 0) { - synapsesToCreate[0] = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); + topic1 = Metamaps.Topics.get(Metamaps.Create.newSynapse.topic1id); + synapsesToCreate[0] = topic1.get('node'); } else if (len > 0) { synapsesToCreate = Metamaps.Selected.Nodes; } @@ -3150,6 +3174,8 @@ Metamaps.Synapse = { }, getSynapseFromAutocomplete: function (id) { var self = Metamaps.Synapse, + topic1, + topic2, node1, node2; @@ -3161,8 +3187,10 @@ Metamaps.Synapse = { }); Metamaps.Mappings.add(mapping); - node1 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic1id); - node2 = Metamaps.Visualize.mGraph.graph.getNode(Metamaps.Create.newSynapse.topic2id); + topic1 = Metamaps.Topics.get(Metamaps.Create.newSynapse.topic1id); + node1 = topic1.get('node'); + topic1 = Metamaps.Topics.get(Metamaps.Create.newSynapse.topic2id); + node2 = topic2.get('node'); Metamaps.Create.newSynapse.hide(); self.renderSynapse(mapping, synapse, node1, node2, true); @@ -3220,6 +3248,7 @@ Metamaps.Map = { Metamaps.Filter.checkMappers(); Metamaps.Realtime.startActiveMap(); + Metamaps.Loading.hide(); } $.ajax({ diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8ae9967a..cebb5434 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -862,7 +862,7 @@ label[for="user_remember_me"] { .sidebarFilterBox { display:none; - width: 304px; + width: 319px; padding: 16px 0; overflow-y: auto; } diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 918af0c3..06f7ea90 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -606,6 +606,14 @@ background-color: #9150bc; } +.github-fork-ribbon-wrapper { + display:none; +} + +.homePage .github-fork-ribbon-wrapper { + display: block; +} + /* end home page */ /* infoAndHelp */ From 2d2f98373efbc0709b8a54c9df22c5c0c42112c7 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 16:41:16 -0400 Subject: [PATCH 126/600] fixed error in _filterBox that was causing maps not to load when a synapse had a nil description --- app/views/shared/_filterBox.html.erb | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb index 4ba9b91a..9f9f2cb7 100644 --- a/app/views/shared/_filterBox.html.erb +++ b/app/views/shared/_filterBox.html.erb @@ -33,9 +33,21 @@ end end - @metacodes.sort! {|x,y| x.name <=> y.name } - @synapses.sort! {|x,y| x.desc <=> y.desc } - @mappers.sort! {|x,y| x.name <=> y.name } + @metacodes.sort! {|x,y| + n1 = x.name || "" + n2 = y.name || "" + n1 <=> n2 + } + @synapses.sort! {|x,y| + d1 = x.desc || "" + d2 = y.desc || "" + d1 <=> d2 + } + @mappers.sort! {|x,y| + n1 = x.name || "" + n2 = y.name || "" + n1 <=> n2 + } @metacodes.each_with_index do |metacode, index| @metacodelist += '
        • ' From f9a24058aa4afc6a9575ab29f428f82584fc3f01 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 16:45:59 -0400 Subject: [PATCH 127/600] fixed error in _filterBox that was causing maps not to load when a synapse had a nil description --- app/views/shared/_filterBox.html.erb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb index 9f9f2cb7..9f6adeb4 100644 --- a/app/views/shared/_filterBox.html.erb +++ b/app/views/shared/_filterBox.html.erb @@ -55,7 +55,8 @@ @metacodelist += '

          ' + metacode.name.downcase + '

        • ' end @synapses.each_with_index do |synapse, index| - @synapselist += '
        • ' + d = synapse.desc || "" + @synapselist += '
        • ' @synapselist += 'synapse icon

          ' + synapse.desc @synapselist += '

        • ' end From f14bdfac577e9aa843c6882cd265decf30b24158 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 16:50:41 -0400 Subject: [PATCH 128/600] fixed error in _filterBox that was causing maps not to load when a synapse had a nil description. for real this time --- app/views/shared/_filterBox.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/shared/_filterBox.html.erb b/app/views/shared/_filterBox.html.erb index 9f6adeb4..e3a633c1 100644 --- a/app/views/shared/_filterBox.html.erb +++ b/app/views/shared/_filterBox.html.erb @@ -57,7 +57,7 @@ @synapses.each_with_index do |synapse, index| d = synapse.desc || "" @synapselist += '
        • ' - @synapselist += 'synapse icon

          ' + synapse.desc + @synapselist += 'synapse icon

          ' + d @synapselist += '

        • ' end @mappers.each_with_index do |mapper, index| From 2138aa89f393ee6879bb096f0e8828baa626a04f Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 22:26:12 -0400 Subject: [PATCH 129/600] closes #368. ability to add in metacode colors --- app/assets/stylesheets/application.css | 3 + app/assets/stylesheets/base.css | 2 +- app/views/layouts/application.html.erb | 1 + app/views/metacodes/_form.html.erb | 5 + app/views/metacodes/index.html.erb | 8 + app/views/shared/_metacodeBgColors.html.erb | 9 + .../20140930013020_add_color_to_metacodes.rb | 5 + .../20140930013020_add_color_to_metacodes.rb~ | 5 + db/schema.rb | 267 +++++++++--------- metacode_backgrounds.css | 120 ++++++++ 10 files changed, 291 insertions(+), 134 deletions(-) create mode 100644 app/views/shared/_metacodeBgColors.html.erb create mode 100644 db/migrate/20140930013020_add_color_to_metacodes.rb create mode 100644 db/migrate/20140930013020_add_color_to_metacodes.rb~ create mode 100644 metacode_backgrounds.css diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index cebb5434..5bd28000 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2151,6 +2151,9 @@ float: left; .blackBox td.iconURL { max-width: 415px; word-wrap: break-word; +} +.blackBox td.iconColor { + } .blackBox .field { margin: 15px 0 5px; diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index cfa49d44..3725297e 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -292,7 +292,7 @@ cursor: pointer; display: none; width: 90%; padding: 13px 0 9px 10%; - background-color: #64BC61; + background-color: #E0E0E0; color: #424242; } .permission.canEdit .metacodeTitle { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9e17a43d..91e9693b 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -77,6 +77,7 @@ <%= render :partial => 'layouts/lightboxes' %> <%= render :partial => 'layouts/templates' %> +<%= render :partial => 'shared/metacodeBgColors' %> diff --git a/app/views/metacodes/_form.html.erb b/app/views/metacodes/_form.html.erb index de815bbc..ee19048b 100644 --- a/app/views/metacodes/_form.html.erb +++ b/app/views/metacodes/_form.html.erb @@ -21,6 +21,11 @@ <%= f.text_field :icon %>
        +
        + <%= f.label :color, "Color (hex with # sign)" %> + <%= f.text_field :color %> +
        +
        <%= link_to 'Cancel', metacodes_path, { :class => 'button', 'data-bypass' => 'true' } %> <%= f.submit :class => 'add' %> diff --git a/app/views/metacodes/index.html.erb b/app/views/metacodes/index.html.erb index 36901d56..c99634d4 100644 --- a/app/views/metacodes/index.html.erb +++ b/app/views/metacodes/index.html.erb @@ -6,6 +6,7 @@ Name Icon + Color @@ -14,6 +15,13 @@ <%= metacode.name %> <%= metacode.icon %> + <% if metacode.color %> + + <%= metacode.color %> + + <% else %> + + <% end %> <%= link_to 'Edit', edit_metacode_path(metacode), :data => { :bypass => 'true'} %> diff --git a/app/views/shared/_metacodeBgColors.html.erb b/app/views/shared/_metacodeBgColors.html.erb new file mode 100644 index 00000000..a1aa030c --- /dev/null +++ b/app/views/shared/_metacodeBgColors.html.erb @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/db/migrate/20140930013020_add_color_to_metacodes.rb b/db/migrate/20140930013020_add_color_to_metacodes.rb new file mode 100644 index 00000000..59c8f89f --- /dev/null +++ b/db/migrate/20140930013020_add_color_to_metacodes.rb @@ -0,0 +1,5 @@ +class AddColorToMetacodes < ActiveRecord::Migration + def change + add_column :metacodes, :color, :string + end +end diff --git a/db/migrate/20140930013020_add_color_to_metacodes.rb~ b/db/migrate/20140930013020_add_color_to_metacodes.rb~ new file mode 100644 index 00000000..59c8f89f --- /dev/null +++ b/db/migrate/20140930013020_add_color_to_metacodes.rb~ @@ -0,0 +1,5 @@ +class AddColorToMetacodes < ActiveRecord::Migration + def change + add_column :metacodes, :color, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 50334775..113dba8a 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,133 +1,134 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20140815162253) do - - create_table "in_metacode_sets", :force => true do |t| - t.integer "metacode_id" - t.integer "metacode_set_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" - add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" - - create_table "mappings", :force => true do |t| - t.text "category" - t.integer "xloc" - t.integer "yloc" - t.integer "topic_id" - t.integer "synapse_id" - t.integer "map_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "maps", :force => true do |t| - t.text "name" - t.boolean "arranged" - t.text "desc" - t.text "permission" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "featured" - t.string "screenshot_file_name" - t.string "screenshot_content_type" - t.integer "screenshot_file_size" - t.datetime "screenshot_updated_at" - end - - create_table "metacode_sets", :force => true do |t| - t.string "name" - t.text "desc" - t.integer "user_id" - t.boolean "mapperContributed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" - - create_table "metacodes", :force => true do |t| - t.text "name" - t.string "icon" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "synapses", :force => true do |t| - t.text "desc" - t.text "category" - t.text "weight" - t.text "permission" - t.integer "node1_id" - t.integer "node2_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "topics", :force => true do |t| - t.text "name" - t.text "desc" - t.text "link" - t.text "permission" - t.integer "user_id" - t.integer "metacode_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - t.string "audio_file_name" - t.string "audio_content_type" - t.integer "audio_file_size" - t.datetime "audio_updated_at" - end - - create_table "users", :force => true do |t| - t.string "name" - t.string "email" - t.text "settings" - t.string "code", :limit => 8 - t.string "joinedwithcode", :limit => 8 - t.string "crypted_password" - t.string "password_salt" - t.string "persistence_token" - t.string "perishable_token" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "encrypted_password", :limit => 128, :default => "" - t.string "remember_token" - t.datetime "remember_created_at" - t.string "reset_password_token" - t.datetime "last_sign_in_at" - t.string "last_sign_in_ip" - t.integer "sign_in_count", :default => 0 - t.datetime "current_sign_in_at" - t.string "current_sign_in_ip" - t.datetime "reset_password_sent_at" - t.boolean "admin" - t.string "image_file_name" - t.string "image_content_type" - t.integer "image_file_size" - t.datetime "image_updated_at" - end - - add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true - -end +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20140930013020) do + + create_table "in_metacode_sets", :force => true do |t| + t.integer "metacode_id" + t.integer "metacode_set_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "in_metacode_sets", ["metacode_id"], :name => "index_in_metacode_sets_on_metacode_id" + add_index "in_metacode_sets", ["metacode_set_id"], :name => "index_in_metacode_sets_on_metacode_set_id" + + create_table "mappings", :force => true do |t| + t.text "category" + t.integer "xloc" + t.integer "yloc" + t.integer "topic_id" + t.integer "synapse_id" + t.integer "map_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "maps", :force => true do |t| + t.text "name" + t.boolean "arranged" + t.text "desc" + t.text "permission" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "featured" + t.string "screenshot_file_name" + t.string "screenshot_content_type" + t.integer "screenshot_file_size" + t.datetime "screenshot_updated_at" + end + + create_table "metacode_sets", :force => true do |t| + t.string "name" + t.text "desc" + t.integer "user_id" + t.boolean "mapperContributed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "metacode_sets", ["user_id"], :name => "index_metacode_sets_on_user_id" + + create_table "metacodes", :force => true do |t| + t.text "name" + t.string "icon" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "color" + end + + create_table "synapses", :force => true do |t| + t.text "desc" + t.text "category" + t.text "weight" + t.text "permission" + t.integer "node1_id" + t.integer "node2_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "topics", :force => true do |t| + t.text "name" + t.text "desc" + t.text "link" + t.text "permission" + t.integer "user_id" + t.integer "metacode_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + t.string "audio_file_name" + t.string "audio_content_type" + t.integer "audio_file_size" + t.datetime "audio_updated_at" + end + + create_table "users", :force => true do |t| + t.string "name" + t.string "email" + t.text "settings" + t.string "code", :limit => 8 + t.string "joinedwithcode", :limit => 8 + t.string "crypted_password" + t.string "password_salt" + t.string "persistence_token" + t.string "perishable_token" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "encrypted_password", :limit => 128, :default => "" + t.string "remember_token" + t.datetime "remember_created_at" + t.string "reset_password_token" + t.datetime "last_sign_in_at" + t.string "last_sign_in_ip" + t.integer "sign_in_count", :default => 0 + t.datetime "current_sign_in_at" + t.string "current_sign_in_ip" + t.datetime "reset_password_sent_at" + t.boolean "admin" + t.string "image_file_name" + t.string "image_content_type" + t.integer "image_file_size" + t.datetime "image_updated_at" + end + + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + +end diff --git a/metacode_backgrounds.css b/metacode_backgrounds.css new file mode 100644 index 00000000..adf69d4e --- /dev/null +++ b/metacode_backgrounds.css @@ -0,0 +1,120 @@ +.mbgAction { + background-color: #bd6c85 !important; +} +.mbgActivity { + background-color: #6ebf65 !important; +} +.mbgArgument { + background-color: #7FAEFD !important; +} +.mbgBizarre { + background-color: #bdb25e !important; +} +.mbgCatalyst { + background-color: #EF8964 !important; +} +.mbgClosed { + background-color: #ABB49F !important; +} +.mbgCon { + background-color: #CF7C74 !important; +} +.mbgDecision { + background-color: #cca866 !important; +} +.mbgExample { + background-color: #598559 !important; +} +.mbgExperience { + background-color: #BE995F !important; +} +.mbgForesight { + background-color: #b0b0b0 !important; +} +.mbgFutureDev { + background-color: #25A17F !important; +} +.mbgGoodPractice { + background-color: #BD9E86 !important; +} +.mbgGroup { + background-color: #7076BC !important; +} +.mbgIdea { + background-color: #c4bc5e !important; +} +.mbgImplication { + background-color: #83DECA !important; +} +.mbgInsight { + background-color: #B074AD !important; +} +.mbgIntention { + background-color: #baeaff !important; +} +.mbgKnowledge { + background-color: #60acf7 !important; +} +.mbgList { + background-color: #B7A499 !important; +} +.mbgLocation { + background-color: #abd9a7 !important; +} +.mbgMovieMap { + background-color: #a5a0de !important; +} +.mbgNote { + background-color: #a389a1 !important; +} +.mbgOpenIssue { + background-color: #9bbf71 !important; +} +.mbgOpinion { + background-color: #54a19d !important; +} +.mbgOpportunity { + background-color: #889F64 !important; +} +.mbgPerson { + background-color: #de925f !important; +} +.mbgPlatform { + background-color: #21C8FE !important; +} +.mbgPro { + background-color: #89b879 !important; +} +.mbgProblem { + background-color: #99cfc4 !important; +} +.mbgQuestion { + background-color: #709899 !important; +} +.mbgReference { + background-color: #A7A7A7 !important; +} +.mbgRequirement { + background-color: #d2a7d4 !important; +} +.mbgResearch { + background-color: #CD8E89 !important; +} +.mbgResource { + background-color: #c98c63 !important; +} +.mbgRole { + background-color: #a8595d !important; +} +.mbgTask { + background-color: #2f89ba !important; +} +.mbgTool { + background-color: #828282 !important; +} +.mbgTrajectory { + background-color: #b3953d !important; +} +.mbgWildcard { + background-color: #73c7de !important; +} \ No newline at end of file From c1885615cda3d003a336e427f1bf444e5942d63e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 22:26:50 -0400 Subject: [PATCH 130/600] remove tilda file --- .../stylesheets/metacode_backgrounds.css | 120 ------------------ .../20140930013020_add_color_to_metacodes.rb~ | 5 - 2 files changed, 125 deletions(-) delete mode 100644 app/assets/stylesheets/metacode_backgrounds.css delete mode 100644 db/migrate/20140930013020_add_color_to_metacodes.rb~ diff --git a/app/assets/stylesheets/metacode_backgrounds.css b/app/assets/stylesheets/metacode_backgrounds.css deleted file mode 100644 index adf69d4e..00000000 --- a/app/assets/stylesheets/metacode_backgrounds.css +++ /dev/null @@ -1,120 +0,0 @@ -.mbgAction { - background-color: #bd6c85 !important; -} -.mbgActivity { - background-color: #6ebf65 !important; -} -.mbgArgument { - background-color: #7FAEFD !important; -} -.mbgBizarre { - background-color: #bdb25e !important; -} -.mbgCatalyst { - background-color: #EF8964 !important; -} -.mbgClosed { - background-color: #ABB49F !important; -} -.mbgCon { - background-color: #CF7C74 !important; -} -.mbgDecision { - background-color: #cca866 !important; -} -.mbgExample { - background-color: #598559 !important; -} -.mbgExperience { - background-color: #BE995F !important; -} -.mbgForesight { - background-color: #b0b0b0 !important; -} -.mbgFutureDev { - background-color: #25A17F !important; -} -.mbgGoodPractice { - background-color: #BD9E86 !important; -} -.mbgGroup { - background-color: #7076BC !important; -} -.mbgIdea { - background-color: #c4bc5e !important; -} -.mbgImplication { - background-color: #83DECA !important; -} -.mbgInsight { - background-color: #B074AD !important; -} -.mbgIntention { - background-color: #baeaff !important; -} -.mbgKnowledge { - background-color: #60acf7 !important; -} -.mbgList { - background-color: #B7A499 !important; -} -.mbgLocation { - background-color: #abd9a7 !important; -} -.mbgMovieMap { - background-color: #a5a0de !important; -} -.mbgNote { - background-color: #a389a1 !important; -} -.mbgOpenIssue { - background-color: #9bbf71 !important; -} -.mbgOpinion { - background-color: #54a19d !important; -} -.mbgOpportunity { - background-color: #889F64 !important; -} -.mbgPerson { - background-color: #de925f !important; -} -.mbgPlatform { - background-color: #21C8FE !important; -} -.mbgPro { - background-color: #89b879 !important; -} -.mbgProblem { - background-color: #99cfc4 !important; -} -.mbgQuestion { - background-color: #709899 !important; -} -.mbgReference { - background-color: #A7A7A7 !important; -} -.mbgRequirement { - background-color: #d2a7d4 !important; -} -.mbgResearch { - background-color: #CD8E89 !important; -} -.mbgResource { - background-color: #c98c63 !important; -} -.mbgRole { - background-color: #a8595d !important; -} -.mbgTask { - background-color: #2f89ba !important; -} -.mbgTool { - background-color: #828282 !important; -} -.mbgTrajectory { - background-color: #b3953d !important; -} -.mbgWildcard { - background-color: #73c7de !important; -} \ No newline at end of file diff --git a/db/migrate/20140930013020_add_color_to_metacodes.rb~ b/db/migrate/20140930013020_add_color_to_metacodes.rb~ deleted file mode 100644 index 59c8f89f..00000000 --- a/db/migrate/20140930013020_add_color_to_metacodes.rb~ +++ /dev/null @@ -1,5 +0,0 @@ -class AddColorToMetacodes < ActiveRecord::Migration - def change - add_column :metacodes, :color, :string - end -end From b1d27d42ff53e65e0a9e11294d783b82287d3d5d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 29 Sep 2014 22:33:03 -0400 Subject: [PATCH 131/600] did one as example, need to do rest --- test/fixtures/metacodes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fixtures/metacodes.yml b/test/fixtures/metacodes.yml index a1c750e1..230bef78 100644 --- a/test/fixtures/metacodes.yml +++ b/test/fixtures/metacodes.yml @@ -7,6 +7,7 @@ one: name: Action icon: /assets/icons/action.png + color: #bd6c85 two: name: Activity From bc59c282a7f8a169c63bdd5c4981394840018d4f Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Tue, 30 Sep 2014 15:34:35 -0400 Subject: [PATCH 132/600] fixed the google analytics tracking code --- app/views/layouts/_googleanalytics.html.erb | 2 +- .../build/node_modules/cheerio/benchmark/documents/jquery.html | 2 +- .../active-x-obfuscator/node_modules/zeparser/benchmark.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_googleanalytics.html.erb b/app/views/layouts/_googleanalytics.html.erb index 1e909cad..104ff8ab 100644 --- a/app/views/layouts/_googleanalytics.html.erb +++ b/app/views/layouts/_googleanalytics.html.erb @@ -11,7 +11,7 @@ (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); diff --git a/realtime/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/string_decoder/build/node_modules/cheerio/benchmark/documents/jquery.html b/realtime/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/string_decoder/build/node_modules/cheerio/benchmark/documents/jquery.html index 219e095a..4bc3edff 100644 --- a/realtime/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/string_decoder/build/node_modules/cheerio/benchmark/documents/jquery.html +++ b/realtime/node_modules/express/node_modules/connect/node_modules/multiparty/node_modules/readable-stream/node_modules/string_decoder/build/node_modules/cheerio/benchmark/documents/jquery.html @@ -1179,7 +1179,7 @@ (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + 'stats.g.doubleclick.net/dc.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); diff --git a/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html b/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html index 1a88d9c1..e4e20cf2 100644 --- a/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html +++ b/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html @@ -18845,7 +18845,7 @@ window._GM_writeInnerHtmlLoaded(); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + 'stats.g.doubleclick.net/dc.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); })(); From 86e78919b35edd4ab07784e57505f8e7a6607568 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 30 Sep 2014 16:55:25 -0400 Subject: [PATCH 133/600] initial code for realtime, got new topic, new synapse, and topic drag working --- app/assets/javascripts/src/Metamaps.JIT.js | 41 ++- app/assets/javascripts/src/Metamaps.js | 330 ++++++++++++++------- realtime/realtime-server.js | 35 +++ 3 files changed, 287 insertions(+), 119 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 3c5b79c9..98b8ba7b 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -1,6 +1,11 @@ Metamaps.JIT = { events: { mouseMove: 'Metamaps:JIT:events:mouseMove', + topicDrag: 'Metamaps:JIT:events:topicDrag', + newTopic: 'Metamaps:JIT:events:newTopic', + removeTopic: 'Metamaps:JIT:events:removeTopic', + newSynapse: 'Metamaps:JIT:events:newSynapse', + removeSynapse: 'Metamaps:JIT:events:removeSynapse', pan: 'Metamaps:JIT:events:pan', zoom: 'Metamaps:JIT:events:zoom' }, @@ -703,6 +708,11 @@ Metamaps.JIT = { var self = Metamaps.JIT; + // this is used to send nodes that are moving to + // other realtime collaborators on the same map + var positionsToSend = {}; + var topic; + if (node && !node.nodeFrom) { var pos = eventInfo.getPos(); // if it's a left click, or a touch, move the node @@ -710,13 +720,23 @@ Metamaps.JIT = { //if the node dragged isn't already selected, select it var whatToDo = self.handleSelectionBeforeDragging(node, e); if (node.pos.rho || node.pos.rho === 0) { + // this means we're in topic view var rho = Math.sqrt(pos.x * pos.x + pos.y * pos.y); var theta = Math.atan2(pos.y, pos.x); node.pos.setp(theta, rho); } else if (whatToDo == 'only-drag-this-one') { node.pos.setc(pos.x, pos.y); - node.setData('xloc', pos.x); - node.setData('yloc', pos.y); + + if (Metamaps.Active.Map) { + topic = node.getData('topic'); + // we use the topic ID not the node id + // because we can't depend on the node id + // to be the same as on other collaborators + // maps + positionsToSend[topic.id] = pos; + $(document).trigger(Metamaps.JIT.events.topicDrag, [positionsToSend]); + $(document).trigger(Metamaps.JIT.events.mouseMove, [pos]); + } } else { var len = Metamaps.Selected.Nodes.length; @@ -734,9 +754,21 @@ Metamaps.JIT = { var x = pos.x + xOffset[i]; var y = pos.y + yOffset[i]; n.pos.setc(x, y); - n.setData('xloc', x); - n.setData('yloc', y); + + if (Metamaps.Active.Map) { + topic = n.getData('topic'); + // we use the topic ID not the node id + // because we can't depend on the node id + // to be the same as on other collaborators + // maps + positionsToSend[topic.id] = n.pos; + } } //for + + if (Metamaps.Active.Map) { + $(document).trigger(Metamaps.JIT.events.topicDrag, [positionsToSend]); + $(document).trigger(Metamaps.JIT.events.mouseMove, [pos]); + } } //if if (whatToDo == 'deselect') { @@ -807,6 +839,7 @@ Metamaps.JIT = { x: pos.x, y: pos.y }; + $(document).trigger(Metamaps.JIT.events.mouseMove, [pos]); } } } diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 83ece7d7..30243247 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1506,7 +1506,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); + self.socket = io.connect('http://localhost:5001'); self.startActiveMap(); }, toggleBox: function (event) { @@ -1619,14 +1619,30 @@ Metamaps.Realtime = { // receive word that there's a mapper turned on realtime socket.on('maps-' + Metamaps.Active.Map.id + '-lostrealtime', self.lostCollaborator); - socket.on('maps-' + Metamaps.Active.Map.id, self.contentUpdate); + // + socket.on('maps-' + Metamaps.Active.Map.id + '-topicDrag', self.topicDrag); + + // + socket.on('maps-' + Metamaps.Active.Map.id + '-newTopic', self.newTopic); + + // + socket.on('maps-' + Metamaps.Active.Map.id + '-removeTopic', self.removeTopic); + + // + socket.on('maps-' + Metamaps.Active.Map.id + '-newSynapse', self.newSynapse); + + // + socket.on('maps-' + Metamaps.Active.Map.id + '-removeSynapse', self.removeSynapse); // update mapper compass position socket.on('maps-' + Metamaps.Active.Map.id + '-updatePeerCoords', self.updatePeerCoords); + // local event listeners that trigger events var sendCoords = function (event, coords) { self.sendCoords(coords); }; + $(document).on(Metamaps.JIT.events.mouseMove, sendCoords); + var zoom = function (event, e) { if (e) { var pixels = { @@ -1638,9 +1654,35 @@ Metamaps.Realtime = { } self.positionPeerIcons(); }; - $(document).on(Metamaps.JIT.events.mouseMove, sendCoords); $(document).on(Metamaps.JIT.events.zoom, zoom); + $(document).on(Metamaps.JIT.events.pan, self.positionPeerIcons); + + var sendTopicDrag = function (event, positions) { + self.sendTopicDrag(positions); + }; + $(document).on(Metamaps.JIT.events.topicDrag, sendTopicDrag); + + var sendNewTopic = function (event, data) { + self.sendNewTopic(data); + }; + $(document).on(Metamaps.JIT.events.newTopic, sendNewTopic); + + var sendRemoveTopic = function (event, data) { + self.sendRemoveTopic(data); + }; + $(document).on(Metamaps.JIT.events.removeTopic, sendRemoveTopic); + + var sendNewSynapse = function (event, data) { + self.sendNewSynapse(data); + }; + $(document).on(Metamaps.JIT.events.newSynapse, sendNewSynapse); + + var sendRemoveSynapse = function (event, data) { + self.sendRemoveSynapse(data); + }; + $(document).on(Metamaps.JIT.events.removeSynapse, sendRemoveSynapse); + }, sendRealtimeOn: function () { var self = Metamaps.Realtime; @@ -1899,120 +1941,150 @@ Metamaps.Realtime = { socket.emit('updateMapperCoords', update); } }, - contentUpdate: function (data) { + sendTopicDrag: function (positions) { var self = Metamaps.Realtime; - var socket = Metamaps.Realtime.socket; - var graph = Metamaps.Visualize.mGraph.graph; + var socket = self.socket; - //as long as you weren't the origin of the changes, update your map - if (data.origin != Metamaps.Active.Mapper.id && self.status) { - if (data.resource == 'Topic') { - topic = $.parseJSON(data.obj); + if (Metamaps.Active.Map && self.status) { + positions.mapid = Metamaps.Active.Map.id; + socket.emit('topicDrag', positions); + } + }, + topicDrag: function (positions) { + var self = Metamaps.Realtime; + var socket = self.socket; - if (data.action == 'create') { - self.addTopicToMap(topic); - } else if (data.action == 'update' && graph.getNode(topic.id) != 'undefined') { - self.updateTopicOnMap(topic); - } else if (data.action == 'destroy' && graph.getNode(topic.id) != 'undefined') { - Metamaps.Control.hideNode(topic.id) - } + var topic; + var node; - return; - } else if (data.resource == 'Synapse') { - synapse = $.parseJSON(data.obj); + if (Metamaps.Active.Map && self.status) { + for (var key in positions) { + topic = Metamaps.Topics.get(key); + if (topic) node = topic.get('node'); + if (node) node.pos.setc(positions[key].x, positions[key].y); + } //for + Metamaps.Visualize.mGraph.plot(); + } + }, + // newTopic + sendNewTopic: function (data) { + var self = Metamaps.Realtime; + var socket = self.socket; - if (data.action == 'create') { - self.addSynapseToMap(synapse); - } else if (data.action == 'update' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - self.updateSynapseOnMap(synapse); - } else if (data.action == 'destroy' && - graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']) != 'undefined') { - var edge = graph.getAdjacence(synapse.data.$direction['0'], synapse.data.$direction['1']); - Metamaps.Control.hideEdge(edge); - } + if (Metamaps.Active.Map && self.status) { + data.mapid = Metamaps.Active.Map.id; + socket.emit('newTopic', data); + } + }, + newTopic: function (data) { + var topic, mapping, cancel; - return; + function test() { + if (topic && mapping) { + Metamaps.Topic.renderTopic(mapping, topic, false, false); + } + else if (!cancel) { + setTimeout(test, 10); } } - }, - addTopicToMap: function (topic) { + test(); - // TODO - var newPos, tempForT; - Metamaps.Visualize.mGraph.graph.addNode(topic); - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.setData('dim', 1, 'start'); - tempForT.setData('dim', 25, 'end'); - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - Metamaps.Visualize.mGraph.fx.plotNode(tempForT, Metamaps.Visualize.mGraph.canvas); + $.ajax({ + url: "/topics/" + data.topicid + ".json", + success: function (response) { + Metamaps.Topics.add(response); + topic = Metamaps.Topics.get(response.id); + }, + error: function () { + cancel = true; + } + }); + $.ajax({ + url: "/mappings/" + data.mappingid + ".json", + success: function (response) { + Metamaps.Mappings.add(response); + mapping = Metamaps.Mappings.get(response.id); + }, + error: function () { + cancel = true; + } + }); }, - updateTopicOnMap: function (topic) { + // removeTopic + sendRemoveTopic: function (data) { + var self = Metamaps.Realtime; + var socket = self.socket; - // TODO - var newPos, tempForT; - tempForT = Metamaps.Visualize.mGraph.graph.getNode(topic.id); - tempForT.data = topic.data; - tempForT.name = topic.name; - if (MetamapsModel.showcardInUse === topic.id) { - populateShowCard(tempForT); + if (Metamaps.Active.Map && self.status) { + data.mapid = Metamaps.Active.Map.id; + socket.emit('removeTopic', data); } - newPos = new $jit.Complex(); - newPos.x = tempForT.data.$xloc; - newPos.y = tempForT.data.$yloc; - tempForT.setPos(newPos, 'start'); - tempForT.setPos(newPos, 'current'); - tempForT.setPos(newPos, 'end'); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 + }, + removeTopic: function (data) { + + }, + // newSynapse + sendNewSynapse: function (data) { + var self = Metamaps.Realtime; + var socket = self.socket; + + if (Metamaps.Active.Map && self.status) { + data.mapid = Metamaps.Active.Map.id; + socket.emit('newSynapse', data); + } + }, + newSynapse: function (data) { + var topic1, topic2, node1, node2, synapse, mapping, cancel; + + function test() { + if (synapse && mapping) { + topic1 = synapse.getTopic1(); + node1 = topic1.get('node'); + topic2 = synapse.getTopic2(); + node2 = topic2.get('node'); + + Metamaps.Synapse.renderSynapse(mapping, synapse, node1, node2, false); + } + else if (!cancel) { + setTimeout(test, 10); + } + } + test(); + + $.ajax({ + url: "/synapses/" + data.synapseid + ".json", + success: function (response) { + Metamaps.Synapses.add(response); + synapse = Metamaps.Synapses.get(response.id); + }, + error: function () { + cancel = true; + } + }); + $.ajax({ + url: "/mappings/" + data.mappingid + ".json", + success: function (response) { + Metamaps.Mappings.add(response); + mapping = Metamaps.Mappings.get(response.id); + }, + error: function () { + cancel = true; + } }); }, - addSynapseToMap: function (synapse) { + // removeSynapse + sendRemoveSynapse: function (data) { + var self = Metamaps.Realtime; + var socket = self.socket; - // TODO - var Node1, Node2, tempForS; - Node1 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[0]); - Node2 = Metamaps.Visualize.mGraph.graph.getNode(synapse.data.$direction[1]); - Metamaps.Visualize.mGraph.graph.addAdjacence(Node1, Node2, {}); - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(Node1.id, Node2.id); - tempForS.setDataset('start', { - lineWidth: 0.4 - }); - tempForS.setDataset('end', { - lineWidth: 2 - }); - tempForS.data = synapse.data; - Metamaps.Visualize.mGraph.fx.plotLine(tempForS, Metamaps.Visualize.mGraph.canvas); - return Metamaps.Visualize.mGraph.fx.animate({ - modes: ['linear', 'node-property:dim', 'edge-property:lineWidth'], - transition: $jit.Trans.Quad.easeInOut, - duration: 500 - }); + if (Metamaps.Active.Map && self.status) { + data.mapid = Metamaps.Active.Map.id; + socket.emit('removeSynapse', data); + } + }, + removeSynapse: function (data) { + }, - updateSynapseOnMap: function (synapse) { - - // TODO - var k, tempForS, v, wasShowDesc, _ref; - tempForS = Metamaps.Visualize.mGraph.graph.getAdjacence(synapse.data.$direction[0], synapse.data.$direction[1]); - wasShowDesc = tempForS.data.$showDesc; - _ref = synapse.data; - for (k in _ref) { - v = _ref[k]; - tempForS.data[k] = v; - } - tempForS.data.$showDesc = wasShowDesc; - if (MetamapsModel.edgecardInUse === synapse.data.$id) { // TODO - editEdge(tempForS, false); - } - return Metamaps.Visualize.mGraph.plot(); - } }; // end Metamaps.Realtime @@ -2902,7 +2974,7 @@ Metamaps.Topic = { * * */ - renderTopic: function (mapping, topic, createNewInDB) { + renderTopic: function (mapping, topic, createNewInDB, permitCreateSynapseAfter) { var self = Metamaps.Topic; var nodeOnViz, tempPos; @@ -2935,7 +3007,7 @@ Metamaps.Topic = { nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "start"); nodeOnViz.setPos(new $jit.Complex(mapping.get('xloc'), mapping.get('yloc')), "end"); } - if (Metamaps.Create.newTopic.addSynapse) { + if (Metamaps.Create.newTopic.addSynapse && permitCreateSynapseAfter) { Metamaps.Create.newSynapse.topic1id = tempNode.getData('topic').id; // position the form @@ -2986,10 +3058,22 @@ Metamaps.Topic = { }); } + var mappingSuccessCallback = function (mappingModel, response) { + var newTopicData = { + mappingid: mappingModel.id, + topicid: mappingModel.get('topic_id') + }; - var successCallback = function (topicModel, response) { + $(document).trigger(Metamaps.JIT.events.newTopic, [newTopicData]); + }; + var topicSuccessCallback = function (topicModel, response) { if (Metamaps.Active.Map) { - mapping.save({ topic_id: topicModel.id }); + mapping.save({ topic_id: topicModel.id }, { + success: mappingSuccessCallback, + error: function (model, response) { + console.log('error saving mapping to database'); + } + }); } if (Metamaps.Create.newTopic.addSynapse) { @@ -3000,13 +3084,15 @@ Metamaps.Topic = { if (!Metamaps.Settings.sandbox && createNewInDB) { if (topic.isNew()) { topic.save(null, { - success: successCallback, + success: topicSuccessCallback, error: function (model, response) { console.log('error saving topic to database'); } }); } else if (!topic.isNew() && Metamaps.Active.Map) { - mapping.save(); + mapping.save(null, { + success: mappingSuccessCallback + }); } } }, @@ -3034,7 +3120,7 @@ Metamaps.Topic = { //these can't happen until the value is retrieved, which happens in the line above Metamaps.Create.newTopic.hide(); - self.renderTopic(mapping, topic, true); // this function also includes the creation of the topic in the database + self.renderTopic(mapping, topic, true, true); // this function also includes the creation of the topic in the database }, getTopicFromAutocomplete: function (id) { var self = Metamaps.Topic; @@ -3051,7 +3137,7 @@ Metamaps.Topic = { }); Metamaps.Mappings.add(mapping); - self.renderTopic(mapping, topic, true); + self.renderTopic(mapping, topic, true, true); } }; // end Metamaps.Topic @@ -3110,20 +3196,34 @@ Metamaps.Synapse = { Metamaps.Visualize.mGraph.fx.plotLine(edgeOnViz, Metamaps.Visualize.mGraph.canvas); Metamaps.Control.selectEdge(edgeOnViz); + var mappingSuccessCallback = function (mappingModel, response) { + var newSynapseData = { + mappingid: mappingModel.id, + synapseid: mappingModel.get('synapse_id') + }; + + $(document).trigger(Metamaps.JIT.events.newSynapse, [newSynapseData]); + }; + var synapseSuccessCallback = function (synapseModel, response) { + if (Metamaps.Active.Map) { + mapping.save({ synapse_id: synapseModel.id }, { + success: mappingSuccessCallback + }); + } + }; + if (!Metamaps.Settings.sandbox && createNewInDB) { if (synapse.isNew()) { synapse.save(null, { - success: function (synapseModel, response) { - if (Metamaps.Active.Map) { - mapping.save({ synapse_id: synapseModel.id }); - } - }, + success: synapseSuccessCallback, error: function (model, response) { console.log('error saving synapse to database'); } }); } else if (!synapse.isNew() && Metamaps.Active.Map) { - mapping.save(); + mapping.save(null, { + success: mappingSuccessCallback + }); } } }, diff --git a/realtime/realtime-server.js b/realtime/realtime-server.js index fe6524cc..28db52cf 100644 --- a/realtime/realtime-server.js +++ b/realtime/realtime-server.js @@ -113,6 +113,41 @@ function start() { socket.broadcast.emit('maps-' + data.mapid + '-updatePeerCoords', peer); }); + socket.on('topicDrag', function (data) { + var mapId = data.mapid; + delete data.mapid; + + socket.broadcast.emit('maps-' + mapId + '-topicDrag', data); + }); + + socket.on('newTopic', function (data) { + var mapId = data.mapid; + delete data.mapid; + + socket.broadcast.emit('maps-' + mapId + '-newTopic', data); + }); + + socket.on('removeTopic', function (data) { + var mapId = data.mapid; + delete data.mapid; + + socket.broadcast.emit('maps-' + mapId + '-removeTopic', data); + }); + + socket.on('newSynapse', function (data) { + var mapId = data.mapid; + delete data.mapid; + + socket.broadcast.emit('maps-' + mapId + '-newSynapse', data); + }); + + socket.on('removeSynapse', function (data) { + var mapId = data.mapid; + delete data.mapid; + + socket.broadcast.emit('maps-' + mapId + '-removeSynapse', data); + }); + }); } From 81f31ea10e376b84d7cb7028d3a5d50fa56bbd9e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 30 Sep 2014 16:59:19 -0400 Subject: [PATCH 134/600] heroku --- app/assets/javascripts/src/Metamaps.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 30243247..eaa8df8e 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1506,7 +1506,7 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://localhost:5001'); + self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); self.startActiveMap(); }, toggleBox: function (event) { From eccc433627805bd951e04bbbfaf50b167714948c Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 30 Sep 2014 18:13:49 -0400 Subject: [PATCH 135/600] fixed realtime bug where couldn't populate filters because it was missing a new mapper model that just added something --- app/assets/javascripts/src/Metamaps.js | 29 +++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index eaa8df8e..83128629 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1972,23 +1972,31 @@ Metamaps.Realtime = { var socket = self.socket; if (Metamaps.Active.Map && self.status) { + data.mapperid = Metamaps.Active.Mapper.id; data.mapid = Metamaps.Active.Map.id; socket.emit('newTopic', data); } }, newTopic: function (data) { - var topic, mapping, cancel; + var topic, mapping, mapper, mapperCallback, cancel; function test() { - if (topic && mapping) { + if (topic && mapping && mapper) { Metamaps.Topic.renderTopic(mapping, topic, false, false); } else if (!cancel) { setTimeout(test, 10); } } - test(); + mapper = Metamaps.Mappers.get(data.mapperid); + if (mapper === undefined) { + mapperCallback = function (m) { + Metamaps.Mappers.add(m); + mapper = m; + }; + Metamaps.Mapper.get(data.mapperid, mapperCallback); + } $.ajax({ url: "/topics/" + data.topicid + ".json", success: function (response) { @@ -2009,6 +2017,8 @@ Metamaps.Realtime = { cancel = true; } }); + + test(); }, // removeTopic sendRemoveTopic: function (data) { @@ -2029,6 +2039,7 @@ Metamaps.Realtime = { var socket = self.socket; if (Metamaps.Active.Map && self.status) { + data.mapperid = Metamaps.Active.Mapper.id; data.mapid = Metamaps.Active.Map.id; socket.emit('newSynapse', data); } @@ -2037,7 +2048,7 @@ Metamaps.Realtime = { var topic1, topic2, node1, node2, synapse, mapping, cancel; function test() { - if (synapse && mapping) { + if (synapse && mapping && mapper) { topic1 = synapse.getTopic1(); node1 = topic1.get('node'); topic2 = synapse.getTopic2(); @@ -2049,8 +2060,15 @@ Metamaps.Realtime = { setTimeout(test, 10); } } - test(); + mapper = Metamaps.Mappers.get(data.mapperid); + if (mapper === undefined) { + mapperCallback = function (m) { + Metamaps.Mappers.add(m); + mapper = m; + }; + Metamaps.Mapper.get(data.mapperid, mapperCallback); + } $.ajax({ url: "/synapses/" + data.synapseid + ".json", success: function (response) { @@ -2071,6 +2089,7 @@ Metamaps.Realtime = { cancel = true; } }); + test(); }, // removeSynapse sendRemoveSynapse: function (data) { From 57fb6a15c404f4e48d2be3aa7c905cc0580879e6 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 1 Oct 2014 09:54:56 -0400 Subject: [PATCH 136/600] start on search results styling, pulled in external js libraries and css --- app/assets/images/arrow_sprite-alt.png | Bin 0 -> 715 bytes app/assets/images/arrowpermswhite_sprite.png | Bin 0 -> 540 bytes app/assets/javascripts/application.js | 5 +- app/assets/javascripts/famous/famous.min.js | 50 ++++++ app/assets/javascripts/lib/barometer.js | 32 ++++ app/assets/javascripts/require/require.js | 36 +++++ app/assets/javascripts/shims/classList.js | 138 ++++++++++++++++ .../shims/functionPrototypeBind.js | 23 +++ .../shims/requestAnimationFrame.js | 13 ++ .../javascripts/src/Metamaps.GlobalUI.js | 3 +- app/assets/stylesheets/application.css | 3 - app/assets/stylesheets/barometer.css | 151 ++++++++++++++++++ app/assets/stylesheets/clean.css | 125 +++++++++------ app/assets/stylesheets/famous.css | 77 +++++++++ app/helpers/topics_helper.rb | 2 +- app/views/layouts/_templates.html.erb | 14 +- app/views/layouts/application.html.erb | 15 -- 17 files changed, 609 insertions(+), 78 deletions(-) create mode 100644 app/assets/images/arrow_sprite-alt.png create mode 100644 app/assets/images/arrowpermswhite_sprite.png create mode 100644 app/assets/javascripts/famous/famous.min.js create mode 100644 app/assets/javascripts/lib/barometer.js create mode 100644 app/assets/javascripts/require/require.js create mode 100644 app/assets/javascripts/shims/classList.js create mode 100644 app/assets/javascripts/shims/functionPrototypeBind.js create mode 100644 app/assets/javascripts/shims/requestAnimationFrame.js create mode 100644 app/assets/stylesheets/barometer.css create mode 100644 app/assets/stylesheets/famous.css diff --git a/app/assets/images/arrow_sprite-alt.png b/app/assets/images/arrow_sprite-alt.png new file mode 100644 index 0000000000000000000000000000000000000000..b60c7af5cc8801251307581231e4ecacfa4b70ef GIT binary patch literal 715 zcmV;+0yO=JP){h{X!Y~lD^W+nE03F0skjzj(D1i>*RDjb#(g7tn1u)}u;B;VjARh2__Q*Lo z$&xJi@R4Q~Y~7yjSXp?}zVDM;j=SW>BQ|huV6|E;E=`=up*T=87E=n8AT>Z9P&g+p z<#;$7d=cl7(eT`8q;v`pRJgw9xwrj(Upf}1`7Pfbz{`v{-S2>BM{l3N26@U=k>$=fRHVba(a%W zax`b-pZx&%(GSE1Vgs>(-v&;n)5U&ZDu?1g&6xHBAT>Z9P&g;9&krCz@&i0K9`sLm zJRTL$GfJAXfntKEEb$De1jhu$GMQub1Ey?)oIXE*c(5N}uI>kTGT0ByX0u8ZxB3Ba znqk{)egJXZ4}cit2au?YU$6NA#7oDsq4@#uGS^-g#&bc}h3DDW0WFZbID(rqcSrZm x*RhZ-k#c&Dq%xK9@Xvk#{OAW_1Idp70|2a=d`;+b3W5Lt002ovPDHLkV1iA)JEs5u literal 0 HcmV?d00001 diff --git a/app/assets/images/arrowpermswhite_sprite.png b/app/assets/images/arrowpermswhite_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..53385c2330fba8de297d7af55960c63520743554 GIT binary patch literal 540 zcmV+%0^|LOP){!upgD?z*e)5xS5H={8pxvPE2H7Cqpmc*|12RFA4d?_V8;}j?2mDg0C+>2b zZ5%oILb}uW4$BYe>0u0U-}lj+?J1hM2?0WY5Fi8y0YZQfAOx_i>$(iQ!0{2u0j>_k zhV`%DxitWf!W?hgR)aU-J&l@+<+#UypEK4j!FNM`wz&A#ZvkL4g`og{F-(7hZ;~Xb z@6de(!xsmeRD(G_UtNBOwa1`GfRd^##Yc3#qPS2?E!cV@N0j@|sCX0Jzj-MDK$pbm zn_>FoxQ-ob0#ty-eE49KGLMGB(LNzIXKjMGiNH`Biu@&6VYk=dm(e`N*R-Bxlr&N;;&I*DR=iUI)OB3A_3VHvevfm3YS>w@k@%JAo^U@sh3g`~BtPuB2H;{s zF(}1_uMBT_rO~6fa)e!|Ic4ZMpfc?6nX7n`ZAlx>X#$V)NFX-u@CQrCfpRRpK|SBY zn)x1AgwZ_UjG#v65XHgqIqYPCiKgJ2dlPVV*vWC^V#M-OR6d4;03kpK5CVh%AwUQa e0_JId0t^8A|Ln`O!Q9ON0000t?-1:1}var r={};r.precision=1e-6,r.identity=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],r.multiply4x4=function(t,i){return[t[0]*i[0]+t[4]*i[1]+t[8]*i[2]+t[12]*i[3],t[1]*i[0]+t[5]*i[1]+t[9]*i[2]+t[13]*i[3],t[2]*i[0]+t[6]*i[1]+t[10]*i[2]+t[14]*i[3],t[3]*i[0]+t[7]*i[1]+t[11]*i[2]+t[15]*i[3],t[0]*i[4]+t[4]*i[5]+t[8]*i[6]+t[12]*i[7],t[1]*i[4]+t[5]*i[5]+t[9]*i[6]+t[13]*i[7],t[2]*i[4]+t[6]*i[5]+t[10]*i[6]+t[14]*i[7],t[3]*i[4]+t[7]*i[5]+t[11]*i[6]+t[15]*i[7],t[0]*i[8]+t[4]*i[9]+t[8]*i[10]+t[12]*i[11],t[1]*i[8]+t[5]*i[9]+t[9]*i[10]+t[13]*i[11],t[2]*i[8]+t[6]*i[9]+t[10]*i[10]+t[14]*i[11],t[3]*i[8]+t[7]*i[9]+t[11]*i[10]+t[15]*i[11],t[0]*i[12]+t[4]*i[13]+t[8]*i[14]+t[12]*i[15],t[1]*i[12]+t[5]*i[13]+t[9]*i[14]+t[13]*i[15],t[2]*i[12]+t[6]*i[13]+t[10]*i[14]+t[14]*i[15],t[3]*i[12]+t[7]*i[13]+t[11]*i[14]+t[15]*i[15]]},r.multiply=function(t,i){return[t[0]*i[0]+t[4]*i[1]+t[8]*i[2],t[1]*i[0]+t[5]*i[1]+t[9]*i[2],t[2]*i[0]+t[6]*i[1]+t[10]*i[2],0,t[0]*i[4]+t[4]*i[5]+t[8]*i[6],t[1]*i[4]+t[5]*i[5]+t[9]*i[6],t[2]*i[4]+t[6]*i[5]+t[10]*i[6],0,t[0]*i[8]+t[4]*i[9]+t[8]*i[10],t[1]*i[8]+t[5]*i[9]+t[9]*i[10],t[2]*i[8]+t[6]*i[9]+t[10]*i[10],0,t[0]*i[12]+t[4]*i[13]+t[8]*i[14]+t[12],t[1]*i[12]+t[5]*i[13]+t[9]*i[14]+t[13],t[2]*i[12]+t[6]*i[13]+t[10]*i[14]+t[14],1]},r.thenMove=function(t,i){return i[2]||(i[2]=0),[t[0],t[1],t[2],0,t[4],t[5],t[6],0,t[8],t[9],t[10],0,t[12]+i[0],t[13]+i[1],t[14]+i[2],1]},r.moveThen=function(t,i){t[2]||(t[2]=0);var e=t[0]*i[0]+t[1]*i[4]+t[2]*i[8],s=t[0]*i[1]+t[1]*i[5]+t[2]*i[9],o=t[0]*i[2]+t[1]*i[6]+t[2]*i[10];return r.thenMove(i,[e,s,o])},r.translate=function(t,i,e){return void 0===e&&(e=0),[1,0,0,0,0,1,0,0,0,0,1,0,t,i,e,1]},r.thenScale=function(t,i){return[i[0]*t[0],i[1]*t[1],i[2]*t[2],0,i[0]*t[4],i[1]*t[5],i[2]*t[6],0,i[0]*t[8],i[1]*t[9],i[2]*t[10],0,i[0]*t[12],i[1]*t[13],i[2]*t[14],1]},r.scale=function(t,i,e){return void 0===e&&(e=1),[t,0,0,0,0,i,0,0,0,0,e,0,0,0,0,1]},r.rotateX=function(t){var i=Math.cos(t),e=Math.sin(t);return[1,0,0,0,0,i,e,0,0,-e,i,0,0,0,0,1]},r.rotateY=function(t){var i=Math.cos(t),e=Math.sin(t);return[i,0,-e,0,0,1,0,0,e,0,i,0,0,0,0,1]},r.rotateZ=function(t){var i=Math.cos(t),e=Math.sin(t);return[i,e,0,0,-e,i,0,0,0,0,1,0,0,0,0,1]},r.rotate=function(t,i,e){var s=Math.cos(t),o=Math.sin(t),n=Math.cos(i),r=Math.sin(i),a=Math.cos(e),h=Math.sin(e),u=[n*a,s*h+o*r*a,o*h-s*r*a,0,-n*h,s*a-o*r*h,o*a+s*r*h,0,r,-o*n,s*n,0,0,0,0,1];return u},r.rotateAxis=function(t,i){var e=Math.sin(i),s=Math.cos(i),o=1-s,n=t[0]*t[0]*o,r=t[0]*t[1]*o,a=t[0]*t[2]*o,h=t[1]*t[1]*o,u=t[1]*t[2]*o,c=t[2]*t[2]*o,p=t[0]*e,l=t[1]*e,f=t[2]*e,d=[n+s,r+f,a-l,0,r-f,h+s,u+p,0,a+l,u-p,c+s,0,0,0,0,1];return d},r.aboutOrigin=function(t,i){var e=t[0]-(t[0]*i[0]+t[1]*i[4]+t[2]*i[8]),s=t[1]-(t[0]*i[1]+t[1]*i[5]+t[2]*i[9]),o=t[2]-(t[0]*i[2]+t[1]*i[6]+t[2]*i[10]);return r.thenMove(i,[e,s,o])},r.skew=function(t,i,e){return[1,0,0,0,Math.tan(e),1,0,0,Math.tan(i),Math.tan(t),1,0,0,0,0,1]},r.skewX=function(t){return[1,0,0,0,Math.tan(t),1,0,0,0,0,1,0,0,0,0,1]},r.skewY=function(t){return[1,Math.tan(t),0,0,0,1,0,0,0,0,1,0,0,0,0,1]},r.perspective=function(t){return[1,0,0,0,0,1,0,0,0,0,1,-1/t,0,0,0,1]},r.getTranslate=function(t){return[t[12],t[13],t[14]]},r.inverse=function(t){var i=t[5]*t[10]-t[6]*t[9],e=t[4]*t[10]-t[6]*t[8],s=t[4]*t[9]-t[5]*t[8],o=t[1]*t[10]-t[2]*t[9],n=t[0]*t[10]-t[2]*t[8],r=t[0]*t[9]-t[1]*t[8],a=t[1]*t[6]-t[2]*t[5],h=t[0]*t[6]-t[2]*t[4],u=t[0]*t[5]-t[1]*t[4],c=t[0]*i-t[1]*e+t[2]*s,p=1/c,l=[p*i,-p*o,p*a,0,-p*e,p*n,-p*h,0,p*s,-p*r,p*u,0,0,0,0,1];return l[12]=-t[12]*l[0]-t[13]*l[4]-t[14]*l[8],l[13]=-t[12]*l[1]-t[13]*l[5]-t[14]*l[9],l[14]=-t[12]*l[2]-t[13]*l[6]-t[14]*l[10],l},r.transpose=function(t){return[t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15]]},r.interpret=function(t){var i=[t[0],t[1],t[2]],e=n(i[0]),a=o(i),h=[i[0]+e*a,i[1],i[2]],u=2/s(h);if(u>=1/0)return{translate:r.getTranslate(t),rotate:[0,0,0],scale:[0,0,0],skew:[0,0,0]};var c=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1];c[0]=1-u*h[0]*h[0],c[5]=1-u*h[1]*h[1],c[10]=1-u*h[2]*h[2],c[1]=-u*h[0]*h[1],c[2]=-u*h[0]*h[2],c[6]=-u*h[1]*h[2],c[4]=c[1],c[8]=c[2],c[9]=c[6];var p=r.multiply(c,t),l=[p[5],p[6]],f=n(l[0]),d=o(l),m=[l[0]+f*d,l[1]],y=2/s(m),_=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1];_[5]=1-y*m[0]*m[0],_[10]=1-y*m[1]*m[1],_[6]=-y*m[0]*m[1],_[9]=_[6];var g=r.multiply(_,c),v=r.multiply(g,t),O=r.scale(v[0]<0?-1:1,v[5]<0?-1:1,v[10]<0?-1:1);v=r.multiply(v,O),g=r.multiply(O,g);var T={};return T.translate=r.getTranslate(t),T.rotate=[Math.atan2(-g[6],g[10]),Math.asin(g[2]),Math.atan2(-g[1],g[0])],T.rotate[0]||(T.rotate[0]=0,T.rotate[2]=Math.atan2(g[4],g[5])),T.scale=[v[0],v[5],v[10]],T.skew=[Math.atan2(v[9],T.scale[2]),Math.atan2(v[8],T.scale[2]),Math.atan2(v[4],T.scale[0])],Math.abs(T.rotate[0])+Math.abs(T.rotate[2])>1.5*Math.PI&&(T.rotate[1]=Math.PI-T.rotate[1],T.rotate[1]>Math.PI&&(T.rotate[1]-=2*Math.PI),T.rotate[1]<-Math.PI&&(T.rotate[1]+=2*Math.PI),T.rotate[0]<0?T.rotate[0]+=Math.PI:T.rotate[0]-=Math.PI,T.rotate[2]<0?T.rotate[2]+=Math.PI:T.rotate[2]-=Math.PI),T},r.average=function(t,i,e){e=void 0===e?.5:e;for(var s=r.interpret(t),o=r.interpret(i),n={translate:[0,0,0],rotate:[0,0,0],scale:[0,0,0],skew:[0,0,0]},a=0;3>a;a++)n.translate[a]=(1-e)*s.translate[a]+e*o.translate[a],n.rotate[a]=(1-e)*s.rotate[a]+e*o.rotate[a],n.scale[a]=(1-e)*s.scale[a]+e*o.scale[a],n.skew[a]=(1-e)*s.skew[a]+e*o.skew[a];return r.build(n)},r.build=function(t){var i=r.scale(t.scale[0],t.scale[1],t.scale[2]),e=r.skew(t.skew[0],t.skew[1],t.skew[2]),s=r.rotate(t.rotate[0],t.rotate[1],t.rotate[2]);return r.thenMove(r.multiply(r.multiply(s,e),i),t.translate)},r.equals=function(t,i){return!r.notEquals(t,i)},r.notEquals=function(t,i){return t===i?!1:!(t&&i)||t[12]!==i[12]||t[13]!==i[13]||t[14]!==i[14]||t[0]!==i[0]||t[1]!==i[1]||t[2]!==i[2]||t[4]!==i[4]||t[5]!==i[5]||t[6]!==i[6]||t[8]!==i[8]||t[9]!==i[9]||t[10]!==i[10]},r.normalizeRotation=function(t){var i=t.slice(0);for((i[0]===.5*Math.PI||i[0]===.5*-Math.PI)&&(i[0]=-i[0],i[1]=Math.PI-i[1],i[2]-=Math.PI),i[0]>.5*Math.PI&&(i[0]=i[0]-Math.PI,i[1]=Math.PI-i[1],i[2]-=Math.PI),i[0]<.5*-Math.PI&&(i[0]=i[0]+Math.PI,i[1]=-Math.PI-i[1],i[2]-=Math.PI);i[1]<-Math.PI;)i[1]+=2*Math.PI;for(;i[1]>=Math.PI;)i[1]-=2*Math.PI;for(;i[2]<-Math.PI;)i[2]+=2*Math.PI;for(;i[2]>=Math.PI;)i[2]-=2*Math.PI;return i},r.inFront=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,.001,1],r.behind=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,-.001,1],e.exports=r}),define("famous/core/SpecParser",["require","exports","module","./Transform"],function(t,i,e){function s(){this.result={}}function o(t,i){return[t[0]*i[0]+t[1]*i[4]+t[2]*i[8],t[0]*i[1]+t[1]*i[5]+t[2]*i[9],t[0]*i[2]+t[1]*i[6]+t[2]*i[10]]}var n=t("./Transform");s._instance=new s,s.parse=function(t,i){return s._instance.parse(t,i)},s.prototype.parse=function(t,i){return this.reset(),this._parseSpec(t,i,n.identity),this.result},s.prototype.reset=function(){this.result={}};var r=[0,0];s.prototype._parseSpec=function(t,i,e){var s,a,h,u,c,p,l;if("number"==typeof t){if(s=t,h=i.transform,p=i.align||i.origin,i.size&&p&&(p[0]||p[1])){var f=[p[0]*i.size[0],p[1]*i.size[1],0];h=n.thenMove(h,o(f,e))}this.result[s]={transform:h,opacity:i.opacity,origin:i.origin||r,align:i.align||i.origin||r,size:i.size}}else{if(!t)return;if(t instanceof Array)for(var d=0;de&&this.listeners[t].push(i),this},s.prototype.addListener=s.prototype.on,s.prototype.removeListener=function(t,i){var e=this.listeners[t].indexOf(i);return e>=0&&this.listeners[t].splice(e,1),this},s.prototype.bindThis=function(t){this._owner=t},e.exports=s}),define("famous/core/EventHandler",["require","exports","module","./EventEmitter"],function(t,i,e){function s(){o.apply(this,arguments),this.downstream=[],this.downstreamFn=[],this.upstream=[],this.upstreamListeners={}}var o=t("./EventEmitter");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.setInputHandler=function(t,i){t.trigger=i.trigger.bind(i),i.subscribe&&i.unsubscribe&&(t.subscribe=i.subscribe.bind(i),t.unsubscribe=i.unsubscribe.bind(i))},s.setOutputHandler=function(t,i){i instanceof s&&i.bindThis(t),t.pipe=i.pipe.bind(i),t.unpipe=i.unpipe.bind(i),t.on=i.on.bind(i),t.addListener=t.on,t.removeListener=i.removeListener.bind(i)},s.prototype.emit=function(t,i){o.prototype.emit.apply(this,arguments);var e=0;for(e=0;ee&&i.push(t),t instanceof Function?t("pipe",null):t.trigger&&t.trigger("pipe",null),t},s.prototype.unpipe=function(t){if(t.unsubscribe instanceof Function)return t.unsubscribe(this);var i=t instanceof Function?this.downstreamFn:this.downstream,e=i.indexOf(t);return e>=0?(i.splice(e,1),t instanceof Function?t("unpipe",null):t.trigger&&t.trigger("unpipe",null),t):!1},s.prototype.on=function(t){if(o.prototype.on.apply(this,arguments),!(t in this.upstreamListeners)){var i=this.trigger.bind(this,t);this.upstreamListeners[t]=i;for(var e=0;ei){this.upstream.push(t);for(var e in this.upstreamListeners)t.on(e,this.upstreamListeners[e])}return this},s.prototype.unsubscribe=function(t){var i=this.upstream.indexOf(t);if(i>=0){this.upstream.splice(i,1);for(var e in this.upstreamListeners)t.removeListener(e,this.upstreamListeners[e])}return this},e.exports=s}),define("famous/core/ElementAllocator",["require","exports","module"],function(t,i,e){function s(t){t||(t=document.createDocumentFragment()),this.container=t,this.detachedNodes={},this.nodeCount=0}s.prototype.migrate=function(t){var i=this.container;if(t!==i){if(i instanceof DocumentFragment)t.appendChild(i);else for(;i.hasChildNodes();)t.appendChild(i.removeChild(i.firstChild));this.container=t}},s.prototype.allocate=function(t){t=t.toLowerCase(),t in this.detachedNodes||(this.detachedNodes[t]=[]);var i,e=this.detachedNodes[t];return e.length>0?i=e.pop():(i=document.createElement(t),this.container.appendChild(i)),this.nodeCount++,i},s.prototype.deallocate=function(t){var i=t.nodeName.toLowerCase(),e=this.detachedNodes[i];e.push(t),this.nodeCount--},s.prototype.getNodeCount=function(){return this.nodeCount},e.exports=s}),define("famous/utilities/Utility",["require","exports","module"],function(t,i,e){var s={};s.Direction={X:0,Y:1,Z:2},s.after=function(t,i){var e=t;return function(){e--,0===e&&i.apply(this,arguments)}},s.loadURL=function(t,i){var e=new XMLHttpRequest;e.onreadystatechange=function(){4===this.readyState&&i&&i(this.responseText)},e.open("GET",t),e.send()},s.createDocumentFragmentFromHTML=function(t){var i=document.createElement("div");i.innerHTML=t;for(var e=document.createDocumentFragment();i.hasChildNodes();)e.appendChild(i.firstChild);return e},e.exports=s}),define("famous/transitions/MultipleTransition",["require","exports","module","famous/utilities/Utility"],function(t,i,e){function s(t){this.method=t,this._instances=[],this.state=[]}var o=t("famous/utilities/Utility");s.SUPPORTS_MULTIPLE=!0,s.prototype.get=function(){for(var t=0;t=t?2*t*t:-2*t*t+4*t-1},easeOutBounce:function(t){return t*(3-2*t)},spring:function(t){return(1-t)*Math.sin(6*Math.PI*t)+t}},s.SUPPORTS_MULTIPLE=!0,s.DEFAULT_OPTIONS={curve:s.Curves.linear,duration:500,speed:0};var u={};s.registerCurve=function(t,i){return u[t]?!1:(u[t]=i,!0)},s.unregisterCurve=function(t){return u[t]?(delete u[t],!0):!1},s.getCurve=function(t){var i=u[t];if(void 0!==i)return i;throw Error("curve not registered")},s.getCurves=function(){return u},s.prototype.setOptions=function(t){void 0!==t.curve&&(this.options.curve=t.curve),void 0!==t.duration&&(this.options.duration=t.duration),void 0!==t.speed&&(this.options.speed=t.speed)},s.prototype.set=function(t,i,e){if(!i)return this.reset(t),void(e&&e());if(this._startValue=n(this.get()),i=r(i,this.options),i.speed){var s=this._startValue;if(s instanceof Object){var o=0;for(var a in s)o+=(t[a]-s[a])*(t[a]-s[a]);i.duration=Math.sqrt(o)/i.speed}else i.duration=Math.abs(t-s)/i.speed}this._startTime=Date.now(),this._endValue=n(t),this._startVelocity=n(i.velocity),this._duration=i.duration,this._curve=i.curve,this._active=!0,this._callback=e},s.prototype.reset=function(t,i){if(this._callback){var e=this._callback;this._callback=void 0,e()}this.state=n(t),this.velocity=n(i),this._startTime=0,this._duration=0,this._updateTime=0,this._startValue=this.state,this._startVelocity=this.velocity,this._endValue=this.state,this._active=!1},s.prototype.getVelocity=function(){return this.velocity},s.prototype.get=function(t){return this.update(t),this.state},s.prototype.update=function(t){if(this._active){if(t||(t=Date.now()),!(this._updateTime>=t)){this._updateTime=t;var i=t-this._startTime;if(i>=this._duration)this.state=this._endValue,this.velocity=a(this.state,this._startValue,this._curve,this._duration,1),this._active=!1;else if(0>i)this.state=this._startValue,this.velocity=this._startVelocity;else{var e=i/this._duration;this.state=h(this._startValue,this._endValue,this._curve(e)),this.velocity=a(this.state,this._startValue,this._curve,this._duration,e)}}}else if(this._callback){var s=this._callback;this._callback=void 0,s()}},s.prototype.isActive=function(){return this._active},s.prototype.halt=function(){this.reset(this.get())},s.registerCurve("linear",s.Curves.linear),s.registerCurve("easeIn",s.Curves.easeIn),s.registerCurve("easeOut",s.Curves.easeOut),s.registerCurve("easeInOut",s.Curves.easeInOut),s.registerCurve("easeOutBounce",s.Curves.easeOutBounce),s.registerCurve("spring",s.Curves.spring),s.customCurve=function(t,i){return t=t||0,i=i||0,function(e){return t*e+(-2*t-i+3)*e*e+(t+i-2)*e*e*e}},e.exports=s}),define("famous/transitions/Transitionable",["require","exports","module","./MultipleTransition","./TweenTransition"],function(t,i,e){function s(t){this.currentAction=null,this.actionQueue=[],this.callbackQueue=[],this.state=0,this.velocity=void 0,this._callback=void 0,this._engineInstance=null,this._currentMethod=null,this.set(t)}function o(){if(this._callback){var t=this._callback;this._callback=void 0,t()}if(this.actionQueue.length<=0)return void this.set(this.get());this.currentAction=this.actionQueue.shift(),this._callback=this.callbackQueue.shift();var i=null,e=this.currentAction[0],s=this.currentAction[1];s instanceof Object&&s.method?(i=s.method,"string"==typeof i&&(i=a[i])):i=r,this._currentMethod!==i&&(this._engineInstance=!(e instanceof Object)||i.SUPPORTS_MULTIPLE===!0||e.length<=i.SUPPORTS_MULTIPLE?new i:new n(i),this._currentMethod=i),this._engineInstance.reset(this.state,this.velocity),void 0!==this.velocity&&(s.velocity=this.velocity),this._engineInstance.set(e,s,o.bind(this))}var n=t("./MultipleTransition"),r=t("./TweenTransition"),a={};s.registerMethod=function(t,i){return t in a?!1:(a[t]=i,!0)},s.unregisterMethod=function(t){return t in a?(delete a[t],!0):!1},s.prototype.set=function(t,i,e){if(!i)return this.reset(t),e&&e(),this;var s=[t,i];return this.actionQueue.push(s),this.callbackQueue.push(e),this.currentAction||o.call(this),this},s.prototype.reset=function(t,i){this._currentMethod=null,this._engineInstance=null,this._callback=void 0,this.state=t,this.velocity=i,this.currentAction=null,this.actionQueue=[],this.callbackQueue=[]},s.prototype.delay=function(t,i){this.set(this.get(),{duration:t,curve:function(){return 0}},i)},s.prototype.get=function(t){return this._engineInstance&&(this._engineInstance.getVelocity&&(this.velocity=this._engineInstance.getVelocity()),this.state=this._engineInstance.get(t)),this.state},s.prototype.isActive=function(){return!!this.currentAction},s.prototype.halt=function(){this.set(this.get())},e.exports=s}),define("famous/core/Context",["require","exports","module","./RenderNode","./EventHandler","./ElementAllocator","./Transform","famous/transitions/Transitionable"],function(t,i,e){function s(t){return[t.clientWidth,t.clientHeight]}function o(t){this.container=t,this._allocator=new a(t),this._node=new n,this._eventOutput=new r,this._size=s(this.container),this._perspectiveState=new u(0),this._perspective=void 0,this._nodeContext={allocator:this._allocator,transform:h.identity,opacity:1,origin:c,align:null,size:this._size},this._eventOutput.on("resize",function(){this.setSize(s(this.container))}.bind(this))}var n=t("./RenderNode"),r=t("./EventHandler"),a=t("./ElementAllocator"),h=t("./Transform"),u=t("famous/transitions/Transitionable"),c=[0,0];o.prototype.getAllocator=function(){return this._allocator},o.prototype.add=function(t){return this._node.add(t)},o.prototype.migrate=function(t){t!==this.container&&(this.container=t,this._allocator.migrate(t))},o.prototype.getSize=function(){return this._size},o.prototype.setSize=function(t){t||(t=s(this.container)),this._size[0]=t[0],this._size[1]=t[1]},o.prototype.update=function(t){t&&(t.transform&&(this._nodeContext.transform=t.transform),t.opacity&&(this._nodeContext.opacity=t.opacity),t.origin&&(this._nodeContext.origin=t.origin),t.align&&(this._nodeContext.align=t.align),t.size&&(this._nodeContext.size=t.size));var i=this._perspectiveState.get();i!==this._perspective&&(this.container.style.perspective=i?i.toFixed()+"px":"",this.container.style.webkitPerspective=i?i.toFixed():"",this._perspective=i),this._node.commit(this._nodeContext)},o.prototype.getPerspective=function(){return this._perspectiveState.get()},o.prototype.setPerspective=function(t,i,e){return this._perspectiveState.set(t,i,e)},o.prototype.emit=function(t,i){return this._eventOutput.emit(t,i)},o.prototype.on=function(t,i){return this._eventOutput.on(t,i)},o.prototype.removeListener=function(t,i){return this._eventOutput.removeListener(t,i)},o.prototype.pipe=function(t){return this._eventOutput.pipe(t)},o.prototype.unpipe=function(t){return this._eventOutput.unpipe(t)},e.exports=o}),define("famous/core/OptionsManager",["require","exports","module","./EventHandler"],function(t,i,e){function s(t){this._value=t,this.eventOutput=null}function o(){this.eventOutput=new n,this.eventOutput.bindThis(this),n.setOutputHandler(this,this.eventOutput)}var n=t("./EventHandler");s.patch=function(t){for(var i=new s(t),e=1;et-d)){var i=0;for(n=t-d,d=t,_.emit("prerender"),i=0;ie;e++)i+=t[e]<1e-6&&t[e]>-1e-6?"0,":t[e]+",";return i+=t[15]+")"}function c(t){return 100*t[0]+"% "+100*t[1]+"%"}function p(t,i){return t&&i?t[0]!==i[0]||t[1]!==i[1]:t!==i}var l=t("./Entity"),f=t("./EventHandler"),d=t("./Transform"),m=window.devicePixelRatio||1,y=void 0!==document.createElement("div").style.webkitTransform;s.prototype.elementType="div",s.prototype.elementClass="famous-surface",s.prototype.on=function(t,i){this._currTarget&&this._currTarget.addEventListener(t,this.eventForwarder),this.eventHandler.on(t,i)},s.prototype.removeListener=function(t,i){this.eventHandler.removeListener(t,i)},s.prototype.emit=function(t,i){i&&!i.origin&&(i.origin=this);var e=this.eventHandler.emit(t,i);return e&&i&&i.stopPropagation&&i.stopPropagation(),e},s.prototype.pipe=function(t){return this.eventHandler.pipe(t)},s.prototype.unpipe=function(t){return this.eventHandler.unpipe(t)},s.prototype.render=function(){return this.id},s.prototype.setProperties=function(t){for(var i in t)this.properties[i]=t[i];this._stylesDirty=!0},s.prototype.getProperties=function(){return this.properties},s.prototype.addClass=function(t){this.classList.indexOf(t)<0&&(this.classList.push(t),this._classesDirty=!0)},s.prototype.removeClass=function(t){var i=this.classList.indexOf(t);i>=0&&(this._dirtyClasses.push(this.classList.splice(i,1)[0]),this._classesDirty=!0)},s.prototype.setClasses=function(t){var i=0,e=[];for(i=0;i-1?function(t,i){t.style.zIndex=1e6*i[14]|0,t.style.transform=u(i)}:y?function(t,i){t.style.webkitTransform=u(i)}:function(t,i){t.style.transform=u(i)};var g=y?function(t,i){t.style.webkitTransformOrigin=c(i)}:function(t,i){t.style.transformOrigin=c(i)},v=y?function(t){t.style.webkitTransform="scale3d(0.0001,0.0001,1)",t.style.opacity=0}:function(t){t.style.transform="scale3d(0.0001,0.0001,1)",t.style.opacity=0};s.prototype.setup=function(t){var i=t.allocate(this.elementType);if(this.elementClass)if(this.elementClass instanceof Array)for(var e=0;e=1?"0.999999":s),p(this._origin,o)||d.notEquals(this._matrix,e)||this._sizeDirty){e||(e=d.identity),this._matrix=e;var l=e;o&&(this._origin||(this._origin=[0,0]),this._origin[0]=o[0],this._origin[1]=o[1],l=d.thenMove(e,[-this._size[0]*o[0],-this._size[1]*o[1],0]),g(i,o)),_(i,l)}this._sizeDirty&&(this._size&&(i.style.width=this.size&&this.size[0]===!0?"":this._size[0]+"px",i.style.height=this.size&&this.size[1]===!0?"":this._size[1]+"px"),this._sizeDirty=!1)},s.prototype.cleanup=function(t){var i=0,e=this._currTarget; +this.eventHandler.emit("recall"),this.recall(e),e.style.display="none",e.style.width="",e.style.height="",this._size=null,h.call(this,e);var s=this.getClassList();for(r.call(this,e),i=0;ii||i>=this.array.length?null:this.array[i]},s.Backing.prototype.setValue=function(t,i){this.array[t-this.firstIndex]=i},s.Backing.prototype.reindex=function(t,i,e){if(this.array[0]){for(var s=0,o=this.firstIndex,n=e-i,r=this.firstNode;t-1>o;)r=r.getNext(),o++;var a=r;for(s=0;i>s;s++)r=r.getNext(),r&&(r._previousNode=a);var h=r?r.getNext():null;for(a._nextNode=null,r=a,s=0;e>s;s++)r=r.getNext();if(o+=e,r!==h&&(r._nextNode=h,h&&(h._previousNode=r)),h)for(r=h,o++;r&&o1e-7?r.call(h,this.mult(t/i)):o.call(h,t,0,0)},s.prototype.clone=function(){return new s(this)},s.prototype.isZero=function(){return!(this.x||this.y||this.z)},s.prototype.set=function(t){return t instanceof Array?n.call(this,t):t instanceof s?r.call(this,t):"number"==typeof t?a.call(this,t):void 0},s.prototype.setXYZ=function(){return o.apply(this,arguments)},s.prototype.set1D=function(t){return a.call(this,t)},s.prototype.put=function(t){r.call(t,h)},s.prototype.clear=function(){return o.call(this,0,0,0)},s.prototype.cap=function u(u){if(1/0===u)return r.call(h,this);var t=this.norm();return t>u?r.call(h,this.mult(u/t)):r.call(h,this)},s.prototype.project=function(t){return t.mult(this.dot(t))},s.prototype.reflectAcross=function(t){return t.normalize().put(t),r(h,this.sub(this.project(t).mult(2)))},s.prototype.get=function(){return[this.x,this.y,this.z]},s.prototype.get1D=function(){return this.x},e.exports=s}),define("famous/math/Matrix",["require","exports","module","./Vector"],function(t,i,e){function s(t){return this.values=t||[[1,0,0],[0,1,0],[0,0,1]],this}var o=t("./Vector"),n=new s,r=new o;s.prototype.get=function(){return this.values},s.prototype.set=function(t){this.values=t},s.prototype.vectorMultiply=function(t){var i=this.get(),e=t.x,s=t.y,o=t.z,n=i[0],a=i[1],h=i[2],u=n[0],c=n[1],p=n[2],l=a[0],f=a[1],d=a[2],m=h[0],y=h[1],_=h[2];return r.setXYZ(u*e+c*s+p*o,l*e+f*s+d*o,m*e+y*s+_*o)},s.prototype.multiply=function(t){for(var i=this.get(),e=[[]],s=0;3>s;s++){e[s]=[];for(var o=0;3>o;o++){for(var r=0,a=0;3>a;a++)r+=i[s][a]*t[a][o];e[s][o]=r}}return n.set(e)},s.prototype.transpose=function(){for(var t=[],i=this.get(),e=0;3>e;e++)for(var s=0;3>s;s++)t[e][s]=i[s][e];return n.set(t)},s.prototype.clone=function(){for(var t=this.get(),i=[],e=0;3>e;e++)i[e]=t[e].slice();return new s(i)},e.exports=s}),define("famous/math/Quaternion",["require","exports","module","./Matrix"],function(t,i,e){function s(t,i,e,s){return 1===arguments.length?this.set(t):(this.w=void 0!==t?t:1,this.x=void 0!==i?i:0,this.y=void 0!==e?e:0,this.z=void 0!==s?s:0),this}var o=t("./Matrix"),n=new s(1,0,0,0);s.prototype.add=function(t){return n.setWXYZ(this.w+t.w,this.x+t.x,this.y+t.y,this.z+t.z)},s.prototype.sub=function(t){return n.setWXYZ(this.w-t.w,this.x-t.x,this.y-t.y,this.z-t.z)},s.prototype.scalarDivide=function(t){return this.scalarMultiply(1/t)},s.prototype.scalarMultiply=function(t){return n.setWXYZ(this.w*t,this.x*t,this.y*t,this.z*t)},s.prototype.multiply=function(t){var i=this.x,e=this.y,s=this.z,o=this.w,r=t.x,a=t.y,h=t.z,u=t.w||0;return n.setWXYZ(o*u-i*r-e*a-s*h,i*u+r*o+a*s-e*h,e*u+a*o+i*h-r*s,s*u+h*o+r*e-i*a)};var r=new s(1,0,0,0);s.prototype.rotateVector=function(t){return r.set(this.conj()),n.set(this.multiply(t).multiply(r))},s.prototype.inverse=function(){return n.set(this.conj().scalarDivide(this.normSquared()))},s.prototype.negate=function(){return this.scalarMultiply(-1)},s.prototype.conj=function(){return n.setWXYZ(this.w,-this.x,-this.y,-this.z)},s.prototype.normalize=function(t){return t=void 0===t?1:t,this.scalarDivide(t*this.norm())},s.prototype.makeFromAngleAndAxis=function(t,i){var e=i.normalize(),s=.5*t,o=-Math.sin(s);return this.x=o*e.x,this.y=o*e.y,this.z=o*e.z,this.w=Math.cos(s),this},s.prototype.setWXYZ=function(t,i,e,s){return n.clear(),this.w=t,this.x=i,this.y=e,this.z=s,this},s.prototype.set=function(t){return t instanceof Array?(this.w=t[0],this.x=t[1],this.y=t[2],this.z=t[3]):(this.w=t.w,this.x=t.x,this.y=t.y,this.z=t.z),this!==n&&n.clear(),this},s.prototype.put=function(t){t.set(n)},s.prototype.clone=function(){return new s(this)},s.prototype.clear=function(){return this.w=1,this.x=0,this.y=0,this.z=0,this},s.prototype.isEqual=function(t){return t.w===this.w&&t.x===this.x&&t.y===this.y&&t.z===this.z},s.prototype.dot=function(t){return this.w*t.w+this.x*t.x+this.y*t.y+this.z*t.z},s.prototype.normSquared=function(){return this.dot(this)},s.prototype.norm=function(){return Math.sqrt(this.normSquared())},s.prototype.isZero=function(){return!(this.x||this.y||this.z)},s.prototype.getTransform=function(){var t=this.normalize(1),i=t.x,e=t.y,s=t.z,o=t.w;return[1-2*e*e-2*s*s,2*i*e-2*s*o,2*i*s+2*e*o,0,2*i*e+2*s*o,1-2*i*i-2*s*s,2*e*s-2*i*o,0,2*i*s-2*e*o,2*e*s+2*i*o,1-2*i*i-2*e*e,0,0,0,0,1]};var a=new o;s.prototype.getMatrix=function(){var t=this.normalize(1),i=t.x,e=t.y,s=t.z,o=t.w;return a.set([[1-2*e*e-2*s*s,2*i*e+2*s*o,2*i*s-2*e*o],[2*i*e-2*s*o,1-2*i*i-2*s*s,2*e*s+2*i*o],[2*i*s+2*e*o,2*e*s-2*i*o,1-2*i*i-2*e*e]])};var h=1e-5;s.prototype.slerp=function(t,i){var e,s,o,r,a;return s=this.dot(t),1-s>h?(e=Math.acos(s),o=Math.sin(e),r=Math.sin((1-i)*e)/o,a=Math.sin(i*e)/o):(r=1-i,a=i),n.set(this.scalarMultiply(r/a).add(t).multiply(a))},e.exports=s}),define("famous/math/Random",["require","exports","module"],function(t,i,e){function s(t,i){return t+n()*(i-t)}function o(t,i){return t+n()*(i-t+1)>>0}var n=Math.random,r={};r.integer=function(t,i,e){if(t=void 0!==t?t:0,i=void 0!==i?i:1,void 0!==e){for(var s=[],n=0;e>n;n++)s.push(o(t,i));return s}return o(t,i)},r.range=function(t,i,e){if(t=void 0!==t?t:0,i=void 0!==i?i:1,void 0!==e){for(var o=[],n=0;e>n;n++)o.push(s(t,i));return o}return s(t,i)},r.sign=function(t){return t=void 0!==t?t:.5,n()n-h){var u=new window.CustomEvent("click",{bubbles:!0,details:a});s[n]=i,i.target.dispatchEvent(u)}delete e[a.identifier]}}),window.addEventListener("click",function(t){var e=o();for(var n in s){var r=s[n];i>e-n?t instanceof window.MouseEvent&&t.target===r.target&&t.stopPropagation():delete s[n]}},!0)}}),define("famous/inputs/GenericSync",["require","exports","module","famous/core/EventHandler"],function(t,i,e){function s(t,i){this._eventInput=new n,this._eventOutput=new n,n.setInputHandler(this,this._eventInput),n.setOutputHandler(this,this._eventOutput),this._syncs={},t&&this.addSync(t),i&&this.setOptions(i)}function o(t,i){r[t]&&(this._syncs[t]=new r[t](i),this.pipeSync(t))}var n=t("famous/core/EventHandler");s.DIRECTION_X=0,s.DIRECTION_Y=1,s.DIRECTION_Z=2;var r={};s.register=function(t){for(var i in t){if(r[i]){if(r[i]===t[i])return;throw Error("this key is registered to a different sync class")}r[i]=t[i]}},s.prototype.setOptions=function(t){for(var i in this._syncs)this._syncs[i].setOptions(t)},s.prototype.pipeSync=function(t){var i=this._syncs[t];this._eventInput.pipe(i),i.pipe(this._eventOutput)},s.prototype.unpipeSync=function(t){var i=this._syncs[t];this._eventInput.unpipe(i),i.unpipe(this._eventOutput)},s.prototype.addSync=function(t){if(t instanceof Array)for(var i=0;iMath.abs(h)?h=0:a=0);var p,l,f=Math.max(r-e,u),d=a/f,m=h/f,y=this.options.scale;this.options.direction===s.DIRECTION_X?(l=y*a,p=y*d,this._position+=l):this.options.direction===s.DIRECTION_Y?(l=y*h,p=y*m,this._position+=l):(l=[y*a,y*h],p=[y*d,y*m],this._position[0]+=l[0],this._position[1]+=l[1]);var _=this._payload;_.delta=l,_.position=this._position,_.velocity=p,_.clientX=o,_.clientY=n,_.offsetX=t.offsetX,_.offsetY=t.offsetY,this._eventOutput.emit("update",_),this._prevCoord=[o,n],this._prevTime=r,this._move=!0}}function r(){this._down&&(this._eventOutput.emit("end",this._payload),this._prevCoord=void 0,this._prevTime=void 0,this._down=!1,this._move=!1)}function a(t){if(this._down&&this._move){var i=n.bind(this),e=function(t){r.call(this,t),document.removeEventListener("mousemove",i),document.removeEventListener("mouseup",e)}.bind(this,t);document.addEventListener("mousemove",i),document.addEventListener("mouseup",e)}}var h=t("famous/core/EventHandler");s.DEFAULT_OPTIONS={direction:void 0,rails:!1,scale:1,propogate:!0},s.DIRECTION_X=0,s.DIRECTION_Y=1;var u=8,c=Date.now;s.prototype.getOptions=function(){return this.options},s.prototype.setOptions=function(t){void 0!==t.direction&&(this.options.direction=t.direction),void 0!==t.rails&&(this.options.rails=t.rails),void 0!==t.scale&&(this.options.scale=t.scale),void 0!==t.propogate&&(this.options.propogate=t.propogate)},e.exports=s}),define("famous/inputs/TwoFingerSync",["require","exports","module","famous/core/EventHandler"],function(t,i,e){function s(){this._eventInput=new o,this._eventOutput=new o,o.setInputHandler(this,this._eventInput),o.setOutputHandler(this,this._eventOutput),this.touchAEnabled=!1,this.touchAId=0,this.posA=null,this.timestampA=0,this.touchBEnabled=!1,this.touchBId=0,this.posB=null,this.timestampB=0,this._eventInput.on("touchstart",this.handleStart.bind(this)),this._eventInput.on("touchmove",this.handleMove.bind(this)),this._eventInput.on("touchend",this.handleEnd.bind(this)),this._eventInput.on("touchcancel",this.handleEnd.bind(this))}var o=t("famous/core/EventHandler");s.calculateAngle=function(t,i){var e=i[0]-t[0],s=i[1]-t[1];return Math.atan2(s,e)},s.calculateDistance=function(t,i){var e=i[0]-t[0],s=i[1]-t[1];return Math.sqrt(e*e+s*s)},s.calculateCenter=function(t,i){return[(t[0]+i[0])/2,(t[1]+i[1])/2]};var n=Date.now;s.prototype.handleStart=function(t){for(var i=0;ithis.options.stallTime){this._position=void 0===this.options.direction?[0,0]:0,this._inProgress=!1;var t=Math.abs(this._prevVel)>=this.options.minimumEndSpeed?this._prevVel:0,i=this._payload;i.position=this._position,i.velocity=t,i.slip=!0,this._eventOutput.emit("end",i)}}function n(t){t.preventDefault(),this._inProgress||(this._inProgress=!0,y=this._payload,y.slip=!0,y.position=this._position,y.clientX=t.clientX,y.clientY=t.clientY,y.offsetX=t.offsetX,y.offsetY=t.offsetY,this._eventOutput.emit("start",y),this._loopBound||(a.on("prerender",o.bind(this)),this._loopBound=!0));var i=u(),e=this._prevTime||i,n=void 0!==t.wheelDeltaX?t.wheelDeltaX:-t.deltaX,r=void 0!==t.wheelDeltaY?t.wheelDeltaY:-t.deltaY;1===t.deltaMode&&(n*=this.options.lineHeight,r*=this.options.lineHeight),this.options.rails&&(Math.abs(n)>Math.abs(r)?r=0:n=0);var c,p,l=Math.max(i-e,h),f=n/l,d=r/l,m=this.options.scale;this.options.direction===s.DIRECTION_X?(p=m*n,c=m*f,this._position+=p):this.options.direction===s.DIRECTION_Y?(p=m*r,c=m*d,this._position+=p):(p=[m*n,m*r],c=[m*f,m*d],this._position[0]+=p[0],this._position[1]+=p[1]);var y=this._payload;y.delta=p,y.velocity=c,y.position=this._position,y.slip=!0,this._eventOutput.emit("update",y),this._prevTime=i,this._prevVel=c}var r=t("famous/core/EventHandler"),a=t("famous/core/Engine");s.DEFAULT_OPTIONS={direction:void 0,minimumEndSpeed:1/0,rails:!1,scale:1,stallTime:50,lineHeight:40},s.DIRECTION_X=0,s.DIRECTION_Y=1;var h=8,u=Date.now;s.prototype.getOptions=function(){return this.options},s.prototype.setOptions=function(t){void 0!==t.direction&&(this.options.direction=t.direction),void 0!==t.minimumEndSpeed&&(this.options.minimumEndSpeed=t.minimumEndSpeed),void 0!==t.rails&&(this.options.rails=t.rails),void 0!==t.scale&&(this.options.scale=t.scale),void 0!==t.stallTime&&(this.options.stallTime=t.stallTime)},e.exports=s}),define("famous/inputs/TouchTracker",["require","exports","module","famous/core/EventHandler"],function(t,i,e){function s(t,i,e){return{x:t.clientX,y:t.clientY,identifier:t.identifier,origin:i.origin,timestamp:c(),count:i.touches.length,history:e}}function o(t){for(var i=0;iMath.abs(h)?h=0:a=0);var c,p,l=Math.max(r-n,u),f=a/l,d=h/l,m=this.options.scale;this.options.direction===s.DIRECTION_X?(p=m*a,c=m*f,this._position+=p):this.options.direction===s.DIRECTION_Y?(p=m*h,c=m*d,this._position+=p):(p=[m*a,m*h],c=[m*f,m*d],this._position[0]+=p[0],this._position[1]+=p[1]);var y=this._payload;y.delta=p,y.velocity=c,y.position=this._position,y.clientX=t.x,y.clientY=t.y,y.count=t.count,y.touch=t.identifier,this._eventOutput.emit("update",y)}function r(t){this._payload.count=t.count,this._eventOutput.emit("end",this._payload)}var a=t("./TouchTracker"),h=t("famous/core/EventHandler");s.DEFAULT_OPTIONS={direction:void 0,rails:!1,scale:1},s.DIRECTION_X=0,s.DIRECTION_Y=1;var u=8;s.prototype.setOptions=function(t){void 0!==t.direction&&(this.options.direction=t.direction),void 0!==t.rails&&(this.options.rails=t.rails),void 0!==t.scale&&(this.options.scale=t.scale)},s.prototype.getOptions=function(){return this.options},e.exports=s}),define("famous/modifiers/Draggable",["require","exports","module","famous/core/Transform","famous/transitions/Transitionable","famous/core/EventHandler","famous/math/Utilities","famous/inputs/GenericSync","famous/inputs/MouseSync","famous/inputs/TouchSync"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),t&&this.setOptions(t),this._positionState=new c([0,0]),this._differential=[0,0],this._active=!0,this.sync=new f(["mouse","touch"],{scale:this.options.scale}),this.eventOutput=new p,p.setInputHandler(this,this.sync),p.setOutputHandler(this,this.eventOutput),h.call(this)}function o(t){var i=this.options,e=i.projection,s=i.snapX,o=i.snapY,n=e&y.x?t[0]:0,r=e&y.y?t[1]:0;return s>0&&(n-=n%s),o>0&&(r-=r%o),[n,r]}function n(){this._active&&(this._positionState.isActive()&&this._positionState.halt(),this.eventOutput.emit("start",{position:this.getPosition()}))}function r(t){if(this._active){var i=this.options;this._differential=t.position;var e=o.call(this,this._differential);this._differential[0]-=e[0],this._differential[1]-=e[1];var s=this.getPosition();if(s[0]+=e[0],s[1]+=e[1],i.xRange){var n=[i.xRange[0]+.5*i.snapX,i.xRange[1]-.5*i.snapX];s[0]=_(s[0],n)}if(i.yRange){var r=[i.yRange[0]+.5*i.snapY,i.yRange[1]-.5*i.snapY];s[1]=_(s[1],r)}this.eventOutput.emit("update",{position:s})}}function a(){this._active&&this.eventOutput.emit("end",{position:this.getPosition()})}function h(){this.sync.on("start",n.bind(this)),this.sync.on("update",r.bind(this)),this.sync.on("end",a.bind(this))}var u=t("famous/core/Transform"),c=t("famous/transitions/Transitionable"),p=t("famous/core/EventHandler"),l=t("famous/math/Utilities"),f=t("famous/inputs/GenericSync"),d=t("famous/inputs/MouseSync"),m=t("famous/inputs/TouchSync");f.register({mouse:d,touch:m});var y={x:1,y:2};s.DIRECTION_X=y.x,s.DIRECTION_Y=y.y;var _=l.clamp;s.DEFAULT_OPTIONS={projection:y.x|y.y,scale:1,xRange:null,yRange:null,snapX:0,snapY:0,transition:{duration:0}},s.prototype.setOptions=function(t){var i=this.options;if(void 0!==t.projection){var e=t.projection;this.options.projection=0,["x","y"].forEach(function(t){-1!==e.indexOf(t)&&(i.projection|=y[t])})}void 0!==t.scale&&(i.scale=t.scale,this.sync.setOptions({scale:t.scale})),void 0!==t.xRange&&(i.xRange=t.xRange),void 0!==t.yRange&&(i.yRange=t.yRange),void 0!==t.snapX&&(i.snapX=t.snapX),void 0!==t.snapY&&(i.snapY=t.snapY)},s.prototype.getPosition=function(){return this._positionState.get()},s.prototype.setRelativePosition=function(t,i,e){var s=this.getPosition(),o=[s[0]+t[0],s[1]+t[1]];this.setPosition(o,i,e)},s.prototype.setPosition=function(t,i,e){this._positionState.isActive()&&this._positionState.halt(),this._positionState.set(t,i,e)},s.prototype.activate=function(){this._active=!0},s.prototype.deactivate=function(){this._active=!1},s.prototype.toggle=function(){this._active=!this._active},s.prototype.modify=function(t){var i=this.getPosition();return{transform:u.translate(i[0],i[1]),target:t}},e.exports=s}),define("famous/modifiers/Fader",["require","exports","module","famous/transitions/Transitionable","famous/core/OptionsManager"],function(t,i,e){function s(t,i){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new n(this.options),t&&this.setOptions(t),i||(i=0),this.transitionHelper=new o(i)}var o=t("famous/transitions/Transitionable"),n=t("famous/core/OptionsManager");s.DEFAULT_OPTIONS={cull:!1,transition:!0,pulseInTransition:!0,pulseOutTransition:!0},s.prototype.setOptions=function(t){return this._optionsManager.setOptions(t)},s.prototype.show=function(t,i){t=t||this.options.transition,this.set(1,t,i)},s.prototype.hide=function(t,i){t=t||this.options.transition,this.set(0,t,i)},s.prototype.set=function(t,i,e){this.halt(),this.transitionHelper.set(t,i,e)},s.prototype.halt=function(){this.transitionHelper.halt()},s.prototype.isVisible=function(){return this.transitionHelper.get()>0},s.prototype.modify=function(t){var i=this.transitionHelper.get();return this.options.cull&&!i?void 0:{opacity:i,target:t}},e.exports=s}),define("famous/modifiers/ModifierChain",["require","exports","module"],function(t,i,e){function s(){this._chain=[],arguments.length&&this.addModifier.apply(this,arguments)}s.prototype.addModifier=function(){Array.prototype.push.apply(this._chain,arguments)},s.prototype.removeModifier=function(t){var i=this._chain.indexOf(t);0>i||this._chain.splice(i,1)},s.prototype.modify=function(t){for(var i=this._chain,e=t,s=0;s-1;t--)a.call(this,t)}function u(t,i){var e=this._agents[this._constraints[t]];return e.agent.applyConstraint(e.targets,e.source,i)}function c(t){for(var i=0;i-1;e--)u.call(this,e,t);i++}}function p(t,i){t.integrateVelocity(i)}function l(t,i){t.integrateAngularMomentum(i),t.updateAngularVelocity()}function f(t,i){t.integrateOrientation(i)}function d(t,i){t.integratePosition(i),t.emit("update",t)}function m(t){h.call(this,t),this.forEach(p,t),this.forEachBody(l,t),c.call(this,t),this.forEachBody(f,t),this.forEach(d,t)}function y(){var t=0,i=0;return this.forEach(function(e){i=e.getEnergy(),t+=i,i-1;i--)t+=this._forces[i].getEnergy()||0;return t}function g(){for(var t=0,i=this._constraints.length-1;i>-1;i--)t+=this._constraints[i].getEnergy()||0;return t}var v=t("famous/core/EventHandler"),O=17,T=1e3/120,S=17;s.DEFAULT_OPTIONS={constraintSteps:1,sleepTolerance:1e-7};var w=function(){return Date.now}();s.prototype.setOptions=function(t){for(var i in t)this.options[i]&&(this.options[i]=t[i])},s.prototype.addBody=function(t){return t._engine=this,t.isBody?(this._bodies.push(t),this._hasBodies=!0):this._particles.push(t),t},s.prototype.removeBody=function(t){var i=t.isBody?this._bodies:this._particles,e=i.indexOf(t);if(e>-1){for(var s=0;s-1&&s.splice(o,1)}},s.prototype.detachAll=function(){this._agents={},this._forces=[],this._constraints=[],this._currAgentId=0},s.prototype.getAgent=function(t){return r.call(this,t).agent},s.prototype.getParticles=function(){return this._particles},s.prototype.getBodies=function(){return this._bodies},s.prototype.getParticlesAndBodies=function(){return this.getParticles().concat(this.getBodies())},s.prototype.forEachParticle=function(t,i){for(var e=this.getParticles(),s=0,o=e.length;o>s;s++)t.call(this,e[s],i)},s.prototype.forEachBody=function(t,i){if(this._hasBodies)for(var e=this.getBodies(),s=0,o=e.length;o>s;s++)t.call(this,e[s],i)},s.prototype.forEach=function(t,i){this.forEachParticle(t,i),this.forEachBody(t,i)},s.prototype.getEnergy=function(){return y.call(this)+_.call(this)+g.call(this)},s.prototype.step=function(){var t=w(),i=t-this._prevTime;this._prevTime=t,T>i||(i>S&&(i=S),m.call(this,O))},s.prototype.isSleeping=function(){return this._isSleeping},s.prototype.sleep=function(){this.emit("end",this),this._isSleeping=!0},s.prototype.wake=function(){this._prevTime=w(),this.emit("start",this),this._isSleeping=!1},s.prototype.emit=function(t,i){null!==this._eventHandler&&this._eventHandler.emit(t,i)},s.prototype.on=function(t,i){null===this._eventHandler&&(this._eventHandler=new v),this._eventHandler.on(t,i)},e.exports=s}),define("famous/surfaces/CanvasSurface",["require","exports","module","famous/core/Surface"],function(t,i,e){function s(t){t&&t.canvasSize&&(this._canvasSize=t.canvasSize),o.apply(this,arguments),this._canvasSize||(this._canvasSize=this.getSize()),this._backBuffer=document.createElement("canvas"),this._canvasSize&&(this._backBuffer.width=this._canvasSize[0],this._backBuffer.height=this._canvasSize[1]),this._contextId=void 0}var o=t("famous/core/Surface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="canvas",s.prototype.elementClass="famous-surface",s.prototype.setContent=function(){},s.prototype.deploy=function(t){this._canvasSize&&(t.width=this._canvasSize[0],t.height=this._canvasSize[1]),"2d"===this._contextId&&(t.getContext(this._contextId).drawImage(this._backBuffer,0,0),this._backBuffer.width=0,this._backBuffer.height=0)},s.prototype.recall=function(t){this.getSize();this._backBuffer.width=t.width,this._backBuffer.height=t.height,"2d"===this._contextId&&(this._backBuffer.getContext(this._contextId).drawImage(t,0,0),t.width=0,t.height=0)},s.prototype.getContext=function(t){return this._contextId=t,this._currTarget?this._currTarget.getContext(t):this._backBuffer.getContext(t)},s.prototype.setSize=function(t,i){o.prototype.setSize.apply(this,arguments),i&&(this._canvasSize=[i[0],i[1]]),this._currTarget&&(this._currTarget.width=this._canvasSize[0],this._currTarget.height=this._canvasSize[1])},e.exports=s}),define("famous/surfaces/ContainerSurface",["require","exports","module","famous/core/Surface","famous/core/Context"],function(t,i,e){function s(t){o.call(this,t),this._container=document.createElement("div"),this._container.classList.add("famous-group"),this._container.classList.add("famous-container-group"),this._shouldRecalculateSize=!1,this.context=new n(this._container),this.setContent(this._container)}var o=t("famous/core/Surface"),n=t("famous/core/Context");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="div",s.prototype.elementClass="famous-surface",s.prototype.add=function(){return this.context.add.apply(this.context,arguments)},s.prototype.render=function(){return this._sizeDirty&&(this._shouldRecalculateSize=!0),o.prototype.render.apply(this,arguments)},s.prototype.deploy=function(){return this._shouldRecalculateSize=!0,o.prototype.deploy.apply(this,arguments)},s.prototype.commit=function(){var t=this._size?[this._size[0],this._size[1]]:null,i=o.prototype.commit.apply(this,arguments);return(this._shouldRecalculateSize||t&&(this._size[0]!==t[0]||this._size[1]!==t[1]))&&(this.context.setSize(),this._shouldRecalculateSize=!1),this.context.update(),i},e.exports=s}),define("famous/surfaces/FormContainerSurface",["require","exports","module","./ContainerSurface"],function(t,i,e){function s(t){t&&(this._method=t.method||""),o.apply(this,arguments)}var o=t("./ContainerSurface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="form",s.prototype.deploy=function(t){return this._method&&(t.method=this._method),o.prototype.deploy.apply(this,arguments)},e.exports=s}),define("famous/surfaces/ImageSurface",["require","exports","module","famous/core/Surface"],function(t,i,e){function s(){this._imageUrl=void 0,o.apply(this,arguments)}var o=t("famous/core/Surface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="img",s.prototype.elementClass="famous-surface",s.prototype.setContent=function(t){this._imageUrl=t,this._contentDirty=!0},s.prototype.deploy=function(t){t.src=this._imageUrl||""},s.prototype.recall=function(t){t.src=""},e.exports=s}),define("famous/surfaces/InputSurface",["require","exports","module","famous/core/Surface"],function(t,i,e){function s(t){this._placeholder=t.placeholder||"",this._value=t.value||"",this._type=t.type||"text",this._name=t.name||"",o.apply(this,arguments),this.on("click",this.focus.bind(this)),window.addEventListener("click",function(t){t.target!==this._currTarget&&this.blur()}.bind(this))}var o=t("famous/core/Surface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="input",s.prototype.elementClass="famous-surface",s.prototype.setPlaceholder=function(t){return this._placeholder=t,this._contentDirty=!0,this},s.prototype.focus=function(){return this._currTarget&&this._currTarget.focus(),this},s.prototype.blur=function(){return this._currTarget&&this._currTarget.blur(),this},s.prototype.setValue=function(t){return this._value=t,this._contentDirty=!0,this},s.prototype.setType=function(t){return this._type=t,this._contentDirty=!0,this},s.prototype.getValue=function(){return this._currTarget?this._currTarget.value:this._value},s.prototype.setName=function(t){return this._name=t,this._contentDirty=!0,this},s.prototype.getName=function(){return this._name},s.prototype.deploy=function(t){""!==this._placeholder&&(t.placeholder=this._placeholder),t.value=this._value,t.type=this._type,t.name=this._name},e.exports=s}),define("famous/surfaces/SubmitInputSurface",["require","exports","module","./InputSurface"],function(t,i,e){function s(t){o.apply(this,arguments),this._type="submit",t&&t.onClick&&this.setOnClick(t.onClick)}var o=t("./InputSurface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.setOnClick=function(t){this.onClick=t},s.prototype.deploy=function(t){this.onclick&&(t.onClick=this.onClick),o.prototype.deploy.apply(this,arguments)},e.exports=s}),define("famous/surfaces/TextareaSurface",["require","exports","module","famous/core/Surface"],function(t,i,e){function s(t){this._placeholder=t.placeholder||"",this._value=t.value||"",this._name=t.name||"",this._wrap=t.wrap||"",this._cols=t.cols||"",this._rows=t.rows||"",o.apply(this,arguments),this.on("click",this.focus.bind(this))}var o=t("famous/core/Surface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.prototype.elementType="textarea",s.prototype.elementClass="famous-surface",s.prototype.setPlaceholder=function(t){return this._placeholder=t,this._contentDirty=!0,this},s.prototype.focus=function(){return this._currTarget&&this._currTarget.focus(),this},s.prototype.blur=function(){return this._currTarget&&this._currTarget.blur(),this},s.prototype.setValue=function(t){return this._value=t,this._contentDirty=!0,this},s.prototype.getValue=function(){return this._currTarget?this._currTarget.value:this._value},s.prototype.setName=function(t){return this._name=t,this._contentDirty=!0,this},s.prototype.getName=function(){return this._name},s.prototype.setWrap=function(t){return this._wrap=t,this._contentDirty=!0,this},s.prototype.setColumns=function(t){return this._cols=t,this._contentDirty=!0,this},s.prototype.setRows=function(t){return this._rows=t,this._contentDirty=!0,this},s.prototype.deploy=function(t){""!==this._placeholder&&(t.placeholder=this._placeholder),""!==this._value&&(t.value=this._value),""!==this._name&&(t.name=this._name),""!==this._wrap&&(t.wrap=this._wrap),""!==this._cols&&(t.cols=this._cols),""!==this._rows&&(t.rows=this._rows)},e.exports=s}),define("famous/surfaces/VideoSurface",["require","exports","module","famous/core/Surface"],function(t,i,e){function s(t){this._videoUrl=void 0,this.options=Object.create(s.DEFAULT_OPTIONS),t&&this.setOptions(t),o.apply(this,arguments)}var o=t("famous/core/Surface");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS={autoplay:!1},s.prototype.elementType="video",s.prototype.elementClass="famous-surface",s.prototype.setOptions=function(t){for(var i in s.DEFAULT_OPTIONS)void 0!==t[i]&&(this.options[i]=t[i])},s.prototype.setContent=function(t){this._videoUrl=t,this._contentDirty=!0},s.prototype.deploy=function(t){t.src=this._videoUrl,t.autoplay=this.options.autoplay},s.prototype.recall=function(t){t.src=""},e.exports=s}),define("famous/transitions/CachedMap",["require","exports","module"],function(t,i,e){function s(t){this._map=t||null,this._cachedOutput=null,this._cachedInput=Number.NaN}s.create=function(t){var i=new s(t);return i.get.bind(i)},s.prototype.get=function(t){return t!==this._cachedInput&&(this._cachedInput=t,this._cachedOutput=this._map(t)),this._cachedOutput},e.exports=s}),define("famous/transitions/Easing",["require","exports","module"],function(t,i,e){var s={inQuad:function(t){return t*t},outQuad:function(t){return-(t-=1)*t+1},inOutQuad:function(t){return(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1)},inCubic:function(t){return t*t*t},outCubic:function(t){return--t*t*t+1},inOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},inQuart:function(t){return t*t*t*t},outQuart:function(t){return-(--t*t*t*t-1)},inOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},inQuint:function(t){return t*t*t*t*t},outQuint:function(t){return--t*t*t*t*t+1},inOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},inSine:function(t){return-1*Math.cos(t*(Math.PI/2))+1},outSine:function(t){return Math.sin(t*(Math.PI/2))},inOutSine:function(t){return-.5*(Math.cos(Math.PI*t)-1)},inExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},outExpo:function(t){return 1===t?1:-Math.pow(2,-10*t)+1},inOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},inCirc:function(t){return-(Math.sqrt(1-t*t)-1)},outCirc:function(t){return Math.sqrt(1- --t*t)},inOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},inElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1===t?1:(e||(e=.3),i=e/(2*Math.PI)*Math.asin(1/s),-(s*Math.pow(2,10*(t-=1))*Math.sin(2*(t-i)*Math.PI/e)))},outElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1===t?1:(e||(e=.3),i=e/(2*Math.PI)*Math.asin(1/s),s*Math.pow(2,-10*t)*Math.sin(2*(t-i)*Math.PI/e)+1)},inOutElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:2===(t/=.5)?1:(e||(e=.3*1.5),i=e/(2*Math.PI)*Math.asin(1/s),1>t?-.5*s*Math.pow(2,10*(t-=1))*Math.sin(2*(t-i)*Math.PI/e):s*Math.pow(2,-10*(t-=1))*Math.sin(2*(t-i)*Math.PI/e)*.5+1)},inBack:function(t,i){return void 0===i&&(i=1.70158),t*t*((i+1)*t-i)},outBack:function(t,i){return void 0===i&&(i=1.70158),--t*t*((i+1)*t+i)+1},inOutBack:function(t,i){return void 0===i&&(i=1.70158),(t/=.5)<1?.5*t*t*(((i*=1.525)+1)*t-i):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},inBounce:function(t){return 1-s.outBounce(1-t)},outBounce:function(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},inOutBounce:function(t){return.5>t?.5*s.inBounce(2*t):.5*s.outBounce(2*t-1)+.5}};e.exports=s}),define("famous/physics/integrators/SymplecticEuler",["require","exports","module","famous/core/OptionsManager"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new o(this.options),t&&this.setOptions(t)}var o=t("famous/core/OptionsManager");s.DEFAULT_OPTIONS={velocityCap:void 0,angularVelocityCap:void 0},s.prototype.setOptions=function(t){this._optionsManager.patch(t)},s.prototype.getOptions=function(){return this._optionsManager.value()},s.prototype.integrateVelocity=function(t,i){var e=t.velocity,s=t.inverseMass,o=t.force;o.isZero()||(e.add(o.mult(i*s)).put(e),o.clear())},s.prototype.integratePosition=function(t,i){var e=t.position,s=t.velocity;this.options.velocityCap&&s.cap(this.options.velocityCap).put(s),e.add(s.mult(i)).put(e)},s.prototype.integrateAngularMomentum=function(t,i){var e=t.angularMomentum,s=t.torque;s.isZero()||(this.options.angularVelocityCap&&s.cap(this.options.angularVelocityCap).put(s),e.add(s.mult(i)).put(e),s.clear())},s.prototype.integrateOrientation=function(t,i){var e=t.orientation,s=t.angularVelocity; +s.isZero()||e.add(e.multiply(s).scalarMultiply(.5*i)).put(e)},e.exports=s}),define("famous/physics/bodies/Particle",["require","exports","module","famous/math/Vector","famous/core/Transform","famous/core/EventHandler","../integrators/SymplecticEuler"],function(t,i,e){function s(t){t=t||{},this.position=new n,this.velocity=new n,this.force=new n;var i=s.DEFAULT_OPTIONS;this.setPosition(t.position||i.position),this.setVelocity(t.velocity||i.velocity),this.force.set(t.force||[0,0,0]),this.mass=void 0!==t.mass?t.mass:i.mass,this.axis=void 0!==t.axis?t.axis:i.axis,this.inverseMass=1/this.mass,this._isSleeping=!1,this._engine=null,this._eventOutput=null,this._positionGetter=null,this.transform=r.identity.slice(),this._spec={transform:this.transform,target:null}}function o(){this._eventOutput=new a,this._eventOutput.bindThis(this),a.setOutputHandler(this,this._eventOutput)}var n=t("famous/math/Vector"),r=t("famous/core/Transform"),a=t("famous/core/EventHandler"),h=t("../integrators/SymplecticEuler");s.DEFAULT_OPTIONS={position:[0,0,0],velocity:[0,0,0],mass:1,axis:void 0},s.SLEEP_TOLERANCE=1e-7,s.AXES={X:0,Y:1,Z:2},s.INTEGRATOR=new h;var u={start:"start",update:"update",end:"end"},c=function(){return Date.now}();s.prototype.sleep=function(){this._isSleeping||(this.emit(u.end,this),this._isSleeping=!0)},s.prototype.wake=function(){this._isSleeping&&(this.emit(u.start,this),this._isSleeping=!1,this._prevTime=c())},s.prototype.isBody=!1,s.prototype.setPosition=function(t){this.position.set(t)},s.prototype.setPosition1D=function(t){this.position.x=t},s.prototype.getPosition=function(){return this._positionGetter instanceof Function&&this.setPosition(this._positionGetter()),this._engine.step(),this.position.get()},s.prototype.getPosition1D=function(){return this._engine.step(),this.position.x},s.prototype.positionFrom=function(t){this._positionGetter=t},s.prototype.setVelocity=function(t){this.velocity.set(t),this.wake()},s.prototype.setVelocity1D=function(t){this.velocity.x=t,this.wake()},s.prototype.getVelocity=function(){return this.velocity.get()},s.prototype.getVelocity1D=function(){return this.velocity.x},s.prototype.setMass=function(t){this.mass=t,this.inverseMass=1/t},s.prototype.getMass=function(){return this.mass},s.prototype.reset=function(t,i){this.setPosition(t||[0,0,0]),this.setVelocity(i||[0,0,0])},s.prototype.applyForce=function(t){t.isZero()||(this.force.add(t).put(this.force),this.wake())},s.prototype.applyImpulse=function(t){if(!t.isZero()){var i=this.velocity;i.add(t.mult(this.inverseMass)).put(i)}},s.prototype.integrateVelocity=function(t){s.INTEGRATOR.integrateVelocity(this,t)},s.prototype.integratePosition=function(t){s.INTEGRATOR.integratePosition(this,t)},s.prototype._integrate=function(t){this.integrateVelocity(t),this.integratePosition(t)},s.prototype.getEnergy=function(){return.5*this.mass*this.velocity.normSquared()},s.prototype.getTransform=function(){this._engine.step();var t=this.position,i=this.axis,e=this.transform;return void 0!==i&&(i&~s.AXES.X&&(t.x=0),i&~s.AXES.Y&&(t.y=0),i&~s.AXES.Z&&(t.z=0)),e[12]=t.x,e[13]=t.y,e[14]=t.z,e},s.prototype.modify=function(t){var i=this._spec;return i.transform=this.getTransform(),i.target=t,i},s.prototype.emit=function(t,i){this._eventOutput&&this._eventOutput.emit(t,i)},s.prototype.on=function(){return o.call(this),this.on.apply(this,arguments)},s.prototype.removeListener=function(){return o.call(this),this.removeListener.apply(this,arguments)},s.prototype.pipe=function(){return o.call(this),this.pipe.apply(this,arguments)},s.prototype.unpipe=function(){return o.call(this),this.unpipe.apply(this,arguments)},e.exports=s}),define("famous/physics/constraints/Constraint",["require","exports","module","famous/core/EventHandler"],function(t,i,e){function s(){this.options=this.options||{},this._energy=0,this._eventOutput=null}function o(){this._eventOutput=new n,this._eventOutput.bindThis(this),n.setOutputHandler(this,this._eventOutput)}var n=t("famous/core/EventHandler");s.prototype.setOptions=function(t){for(var i in t)this.options[i]=t[i]},s.prototype.applyConstraint=function(){},s.prototype.getEnergy=function(){return this._energy},s.prototype.setEnergy=function(t){this._energy=t},s.prototype.on=function(){return o.call(this),this.on.apply(this,arguments)},s.prototype.addListener=function(){return o.call(this),this.addListener.apply(this,arguments)},s.prototype.pipe=function(){return o.call(this),this.pipe.apply(this,arguments)},s.prototype.removeListener=function(){return this.removeListener.apply(this,arguments)},s.prototype.unpipe=function(){return this.unpipe.apply(this,arguments)},e.exports=s}),define("famous/physics/constraints/Snap",["require","exports","module","./Constraint","famous/math/Vector"],function(t,i,e){function s(t){this.options=Object.create(this.constructor.DEFAULT_OPTIONS),t&&this.setOptions(t),this.pDiff=new r,this.vDiff=new r,this.impulse1=new r,this.impulse2=new r,n.call(this)}function o(t,i,e){return Math.abs(t.dot(i)/e)}var n=t("./Constraint"),r=t("famous/math/Vector");s.prototype=Object.create(n.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS={period:300,dampingRatio:.1,length:0,anchor:void 0};var a=Math.PI;s.prototype.setOptions=function(t){void 0!==t.anchor&&(t.anchor instanceof r&&(this.options.anchor=t.anchor),t.anchor.position instanceof r&&(this.options.anchor=t.anchor.position),t.anchor instanceof Array&&(this.options.anchor=new r(t.anchor))),void 0!==t.length&&(this.options.length=t.length),void 0!==t.dampingRatio&&(this.options.dampingRatio=t.dampingRatio),void 0!==t.period&&(this.options.period=t.period)},s.prototype.setAnchor=function(t){void 0!==this.options.anchor&&(this.options.anchor=new r),this.options.anchor.set(t)},s.prototype.getEnergy=function(t,i){var e=this.options,s=e.length,o=e.anchor||i.position,n=Math.pow(2*a/e.period,2),r=o.sub(t.position).norm()-s;return.5*n*r*r},s.prototype.applyConstraint=function(t,i,e){for(var s=this.options,n=this.pDiff,r=this.vDiff,h=this.impulse1,u=this.impulse2,c=s.length,p=s.anchor||i.position,l=s.period,f=s.dampingRatio,d=0;di?-((1+u)*a.dot(n)+p/e*(i-l))/(r*e+f):-((1+u)*a.dot(n))/(r*e+f);c.set(a.mult(e*m)),t.applyImpulse(c),t.setPosition(o.add(a.mult(-i)))}this._eventOutput&&this._eventOutput.emit("postCollision",d)}function a(t,i){var e=this.options.onContact,o=t.position,n=this.options.normal;e===s.ON_CONTACT.REFLECT&&t.setPosition(o.add(n.mult(-i)))}var h=t("./Constraint"),u=t("famous/math/Vector");s.prototype=Object.create(h.prototype),s.prototype.constructor=s,s.ON_CONTACT={REFLECT:0,SILENT:1},s.DEFAULT_OPTIONS={restitution:.5,drift:.5,slop:0,normal:[1,0,0],distance:0,onContact:s.ON_CONTACT.REFLECT},s.prototype.setOptions=function(t){void 0!==t.normal&&(t.normal instanceof u&&(this.options.normal=t.normal.clone()),t.normal instanceof Array&&(this.options.normal=new u(t.normal))),void 0!==t.restitution&&(this.options.restitution=t.restitution),void 0!==t.drift&&(this.options.drift=t.drift),void 0!==t.slop&&(this.options.slop=t.slop),void 0!==t.distance&&(this.options.distance=t.distance),void 0!==t.onContact&&(this.options.onContact=t.onContact)},s.prototype.applyConstraint=function(t,i,e){for(var s=this.options.normal,h=0;h=f&&(0>d?r.call(this,u,f,e):a.call(this,u,f,e))}},e.exports=s}),define("famous/transitions/WallTransition",["require","exports","module","famous/physics/PhysicsEngine","famous/physics/bodies/Particle","famous/physics/forces/Spring","famous/physics/constraints/Wall","famous/math/Vector"],function(t,i,e){function s(t){t=t||0,this.endState=new O(t),this.initState=new O,this.spring=new g({anchor:this.endState}),this.wall=new v,this._restTolerance=1e-10,this._dimensions=1,this._absRestTolerance=this._restTolerance,this._callback=void 0,this.PE=new y,this.particle=new _,this.PE.addBody(this.particle),this.PE.attach([this.wall,this.spring],this.particle)}function o(){return this.particle.getEnergy()+this.spring.getEnergy(this.particle)}function n(){var t=this.endState.sub(this.initState).normSquared();this._absRestTolerance=0===t?this._restTolerance:this._restTolerance*t}function r(){this.PE.wake()}function a(){this.PE.sleep()}function h(t){this.endState.set(t);var i=this.endState.sub(this.initState).norm();this.wall.setOptions({distance:this.endState.norm(),normal:0===i?this.particle.velocity.normalize(-1):this.endState.sub(this.initState).normalize(-1)}),n.call(this)}function u(t){this.particle.position.set(t)}function c(t){this.particle.velocity.set(t)}function p(){return 0===this._dimensions?this.particle.getPosition1D():this.particle.getPosition()}function l(){return 0===this._dimensions?this.particle.getVelocity1D():this.particle.getVelocity()}function f(t){this._callback=t}function d(){if(this.PE.isSleeping()){if(this._callback){var t=this._callback;this._callback=void 0,t()}}else{var i=o.call(this);i=i&&(t.apply(this,arguments),c.removeListener(p,o))};return s(o)}function n(t,i){var e=l(),o=function(){var s=l();s-e>=i&&(t.apply(this,arguments),e=l())};return s(o)}function r(t,i){if(void 0===i)return void 0;var e=function(){i--,0>=i&&(t.apply(this,arguments),h(e))};return s(e)}function a(t,i){i=i||1;var e=i,o=function(){i--,0>=i&&(t.apply(this,arguments),i=e)};return s(o)}function h(t){c.removeListener(p,t)}function u(t,i){var e,s,n,r,a;return function(){s=this,a=arguments,n=l();var u=function(){var h=l-n;i>h?e=o(u,i-h):(e=null,r=t.apply(s,a))};return h(e),e=o(u,i),r}}var c=t("famous/core/Engine"),p="prerender",l=window.performance?function(){return window.performance.now()}:function(){return Date.now()};e.exports={setTimeout:o,setInterval:n,debounce:u,after:r,every:a,clear:h}}),define("famous/views/ContextualView",["require","exports","module","famous/core/Entity","famous/core/Transform","famous/core/EventHandler","famous/core/OptionsManager"],function(t,i,e){function s(t){this.options=Object.create(this.constructor.DEFAULT_OPTIONS||s.DEFAULT_OPTIONS),this._optionsManager=new r(this.options),t&&this.setOptions(t),this._eventInput=new n,this._eventOutput=new n,n.setInputHandler(this,this._eventInput),n.setOutputHandler(this,this._eventOutput),this._id=o.register(this)}var o=t("famous/core/Entity"),n=(t("famous/core/Transform"),t("famous/core/EventHandler")),r=t("famous/core/OptionsManager");s.DEFAULT_OPTIONS={},s.prototype.setOptions=function(t){return this._optionsManager.setOptions(t)},s.prototype.getOptions=function(){return this._optionsManager.getOptions()},s.prototype.render=function(){return this._id},s.prototype.commit=function(){},e.exports=s}),define("famous/views/SequentialLayout",["require","exports","module","famous/core/OptionsManager","famous/core/Transform","famous/core/ViewSequence","famous/utilities/Utility"],function(t,i,e){function s(t){this._items=null,this._size=null,this._outputFunction=s.DEFAULT_OUTPUT_FUNCTION,this.options=Object.create(this.constructor.DEFAULT_OPTIONS),this.optionsManager=new o(this.options),this._itemsCache=[],this._outputCache={size:null,target:this._itemsCache},t&&this.setOptions(t)}var o=t("famous/core/OptionsManager"),n=t("famous/core/Transform"),r=t("famous/core/ViewSequence"),a=t("famous/utilities/Utility");s.DEFAULT_OPTIONS={direction:a.Direction.Y,itemSpacing:0,defaultItemSize:[50,50]},s.DEFAULT_OUTPUT_FUNCTION=function(t,i){var e=this.options.direction===a.Direction.X?n.translate(i,0):n.translate(0,i);return{transform:e,target:t.render()}},s.prototype.getSize=function(){return this._size||this.render(),this._size},s.prototype.sequenceFrom=function(t){return t instanceof Array&&(t=new r(t)),this._items=t,this},s.prototype.setOptions=function(){return this.optionsManager.setOptions.apply(this.optionsManager,arguments),this},s.prototype.setOutputFunction=function(t){return this._outputFunction=t,this},s.prototype.render=function(){for(var t=0,i=0,e=this.options.direction===a.Direction.X?0:1,s=this.options.direction===a.Direction.X?1:0,o=this._items,n=this._itemsCache,r=0;o;){var h=o.get();if(!h)break;var u;h&&h.getSize&&(u=h.getSize()),u||(u=this.options.defaultItemSize),u[s]!==!0&&(i=Math.max(i,u[s]));var c=this._outputFunction.call(this,h,t,r);n[r]=c,u[e]&&u[e]!==!0&&(t+=u[e]+this.options.itemSpacing),o=o.getNext(),r++}return this._itemsCache.splice(r),i||(i=void 0),this._size||(this._size=[0,0]),this._size[e]=t-this.options.itemSpacing,this._size[s]=i,this._outputCache.size=this.getSize(),this._outputCache},e.exports=s}),define("famous/views/Deck",["require","exports","module","famous/core/Transform","famous/core/OptionsManager","famous/transitions/Transitionable","famous/utilities/Utility","./SequentialLayout"],function(t,i,e){function s(){c.apply(this,arguments),this.state=new h(0),this._isOpen=!1,this.setOutputFunction(function(t,i,e){var s=o.call(this),n=this.options.direction===u.Direction.X?r.translate(s*i,0,.001*(s-1)*i):r.translate(0,s*i,.001*(s-1)*i),a=t.render();if(this.options.stackRotation){var h=this.options.stackRotation*e*(1-s);a={transform:r.rotateZ(h),origin:[.5,.5],target:a}}return{transform:n,size:t.getSize(),target:a}})}function o(t){return t?this._isOpen?1:0:this.state.get()}function n(t,i,e){this.state.halt(),this.state.set(t,i,e)}var r=t("famous/core/Transform"),a=t("famous/core/OptionsManager"),h=t("famous/transitions/Transitionable"),u=t("famous/utilities/Utility"),c=t("./SequentialLayout");s.prototype=Object.create(c.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS=a.patch(c.DEFAULT_OPTIONS,{transition:{curve:"easeOutBounce",duration:500},stackRotation:0}),s.prototype.getSize=function(){var t=c.prototype.getSize.apply(this,arguments),i=this._items?this._items.get().getSize():[0,0];i||(i=[0,0]);var e=o.call(this),s=1-e;return[i[0]*s+t[0]*e,i[1]*s+t[1]*e]},s.prototype.isOpen=function(){return this._isOpen},s.prototype.open=function(t){this._isOpen=!0,n.call(this,1,this.options.transition,t)},s.prototype.close=function(t){this._isOpen=!1,n.call(this,0,this.options.transition,t)},s.prototype.toggle=function(t){this._isOpen?this.close(t):this.open(t)},e.exports=s}),define("famous/views/RenderController",["require","exports","module","famous/core/Modifier","famous/core/RenderNode","famous/core/Transform","famous/transitions/Transitionable","famous/core/View"],function(t,i,e){function s(){u.apply(this,arguments),this._showing=-1,this._outgoingRenderables=[],this._nextRenderable=null,this._renderables=[],this._nodes=[],this._modifiers=[],this._states=[],this.inTransformMap=s.DefaultMap.transform,this.inOpacityMap=s.DefaultMap.opacity,this.inOriginMap=s.DefaultMap.origin,this.outTransformMap=s.DefaultMap.transform,this.outOpacityMap=s.DefaultMap.opacity,this.outOriginMap=s.DefaultMap.origin,this._output=[]}function o(t,i){return t(i.get())}var n=t("famous/core/Modifier"),r=t("famous/core/RenderNode"),a=t("famous/core/Transform"),h=t("famous/transitions/Transitionable"),u=t("famous/core/View");s.prototype=Object.create(u.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS={inTransition:!0,outTransition:!0,overlap:!0},s.DefaultMap={transform:function(){return a.identity},opacity:function(t){return t},origin:null},s.prototype.inTransformFrom=function(t){if(t instanceof Function)this.inTransformMap=t;else{if(!t||!t.get)throw Error("inTransformFrom takes only function or getter object");this.inTransformMap=t.get.bind(t)}return this},s.prototype.inOpacityFrom=function(t){if(t instanceof Function)this.inOpacityMap=t;else{if(!t||!t.get)throw Error("inOpacityFrom takes only function or getter object");this.inOpacityMap=t.get.bind(t)}return this},s.prototype.inOriginFrom=function(t){if(t instanceof Function)this.inOriginMap=t;else{if(!t||!t.get)throw Error("inOriginFrom takes only function or getter object");this.inOriginMap=t.get.bind(t)}return this},s.prototype.outTransformFrom=function(t){if(t instanceof Function)this.outTransformMap=t;else{if(!t||!t.get)throw Error("inTransformFrom takes only function or getter object");this.outTransformMap=t.get.bind(t)}return this},s.prototype.outOpacityFrom=function(t){if(t instanceof Function)this.outOpacityMap=t;else{if(!t||!t.get)throw Error("inOpacityFrom takes only function or getter object");this.outOpacityMap=t.get.bind(t)}return this},s.prototype.outOriginFrom=function(t){if(t instanceof Function)this.outOriginMap=t;else{if(!t||!t.get)throw Error("inOriginFrom takes only function or getter object");this.outOriginMap=t.get.bind(t)}return this},s.prototype.show=function(t,i,e){if(!t)return this.hide(e);if(i instanceof Function&&(e=i,i=null),this._showing>=0){if(!this.options.overlap)return void(this._nextRenderable?this._nextRenderable=t:(this._nextRenderable=t,this.hide(function(){this._nextRenderable===t&&this.show(this._nextRenderable,e),this._nextRenderable=null})));this.hide()}var s=null,a=this._renderables.indexOf(t);if(a>=0){this._showing=a,s=this._states[a],s.halt();var u=this._outgoingRenderables.indexOf(t);u>=0&&this._outgoingRenderables.splice(u,1)}else{s=new h(0);var c=new n({transform:this.inTransformMap?o.bind(this,this.inTransformMap,s):null,opacity:this.inOpacityMap?o.bind(this,this.inOpacityMap,s):null,origin:this.inOriginMap?o.bind(this,this.inOriginMap,s):null}),p=new r;p.add(c).add(t),this._showing=this._nodes.length,this._nodes.push(p),this._modifiers.push(c),this._states.push(s),this._renderables.push(t)}i||(i=this.options.inTransition),s.set(1,i,e)},s.prototype.hide=function(t,i){if(!(this._showing<0)){var e=this._showing;this._showing=-1,t instanceof Function&&(i=t,t=void 0);var s=this._nodes[e],n=this._modifiers[e],r=this._states[e],a=this._renderables[e];n.transformFrom(this.outTransformMap?o.bind(this,this.outTransformMap,r):null),n.opacityFrom(this.outOpacityMap?o.bind(this,this.outOpacityMap,r):null),n.originFrom(this.outOriginMap?o.bind(this,this.outOriginMap,r):null),this._outgoingRenderables.indexOf(a)<0&&this._outgoingRenderables.push(a),t||(t=this.options.outTransition),r.halt(),r.set(0,t,function(t,e,s,o){if(this._outgoingRenderables.indexOf(o)>=0){var n=this._nodes.indexOf(t);this._nodes.splice(n,1),this._modifiers.splice(n,1),this._states.splice(n,1),this._renderables.splice(n,1),this._outgoingRenderables.splice(this._outgoingRenderables.indexOf(o),1),this._showing>=n&&this._showing--}i&&i.call(this)}.bind(this,s,n,r,a))}},s.prototype.render=function(){var t=this._output;t.length>this._nodes.length&&t.splice(this._nodes.length);for(var i=0;ip;p++){o=0;for(var l=0;i>l;l++)void 0===this._modifiers[c]?n.call(this,c,[h,a],[o,u,0],1):r.call(this,c,[h,a],[o,u,0],1),c++,o+=h+this.options.gutterSize[0];u+=a+this.options.gutterSize[1]}for(this._dimensionsCache=[this.options.dimensions[0],this.options.dimensions[1]],this._contextSizeCache=[t[0],t[1]],this._activeCount=e*i,p=this._activeCount;p=this._activeCount&&this._states[p].opacity.isActive()&&(this._modifiers.splice(p,1),this._states.splice(p,1)),l&&c.push(f.modify({origin:s,target:l.render()})),u=u.getNext(),p++}return n&&(i=h.moveThen([-n[0]*s[0],-n[1]*s[1],0],i)),{transform:i,opacity:e,size:n,target:c}},e.exports=s}),define("famous/views/HeaderFooterLayout",["require","exports","module","famous/core/Entity","famous/core/RenderNode","famous/core/Transform","famous/core/OptionsManager"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new c(this.options),t&&this.setOptions(t),this._entityId=a.register(this),this.header=new h,this.footer=new h,this.content=new h}function o(t,i){var e=t.getSize();return e?e[this.options.direction]:i}function n(t){return this.options.direction===s.DIRECTION_X?u.translate(t,0,0):u.translate(0,t,0)}function r(t,i){return this.options.direction===s.DIRECTION_X?[t,i[1]]:[i[0],t]}var a=t("famous/core/Entity"),h=t("famous/core/RenderNode"),u=t("famous/core/Transform"),c=t("famous/core/OptionsManager");s.DIRECTION_X=0,s.DIRECTION_Y=1,s.DEFAULT_OPTIONS={direction:s.DIRECTION_Y,headerSize:void 0,footerSize:void 0,defaultHeaderSize:0,defaultFooterSize:0},s.prototype.render=function(){return this._entityId},s.prototype.setOptions=function(t){return this._optionsManager.setOptions(t)},s.prototype.commit=function(t){var i=t.transform,e=t.origin,s=t.size,a=t.opacity,h=void 0!==this.options.headerSize?this.options.headerSize:o.call(this,this.header,this.options.defaultHeaderSize),c=void 0!==this.options.footerSize?this.options.footerSize:o.call(this,this.footer,this.options.defaultFooterSize),p=s[this.options.direction]-h-c;s&&(i=u.moveThen([-s[0]*e[0],-s[1]*e[1],0],i));var l=[{size:r.call(this,h,s),target:this.header.render()},{transform:n.call(this,h),size:r.call(this,p,s),target:this.content.render()},{transform:n.call(this,h+p),size:r.call(this,c,s),target:this.footer.render()}];return{transform:i,opacity:a,size:s,target:l}},e.exports=s}),define("famous/views/Lightbox",["require","exports","module","famous/core/Transform","famous/core/Modifier","famous/core/RenderNode","famous/utilities/Utility","famous/core/OptionsManager","famous/transitions/Transitionable","famous/transitions/TransitionableTransform"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new h(this.options),t&&this.setOptions(t),this._showing=!1,this.nodes=[],this.transforms=[],this.states=[]}var o=t("famous/core/Transform"),n=t("famous/core/Modifier"),r=t("famous/core/RenderNode"),a=t("famous/utilities/Utility"),h=t("famous/core/OptionsManager"),u=t("famous/transitions/Transitionable"),c=t("famous/transitions/TransitionableTransform");s.DEFAULT_OPTIONS={inTransform:o.scale(.001,.001,.001),inOpacity:0,inOrigin:[.5,.5],outTransform:o.scale(.001,.001,.001),outOpacity:0,outOrigin:[.5,.5],showTransform:o.identity,showOpacity:1,showOrigin:[.5,.5],inTransition:!0,outTransition:!0,overlap:!1},s.prototype.setOptions=function(t){return this._optionsManager.setOptions(t)},s.prototype.show=function(t,i,e){if(!t)return this.hide(e);if(i instanceof Function&&(e=i,i=void 0),this._showing){if(!this.options.overlap)return this.hide(this.show.bind(this,t,i,e));this.hide()}this._showing=!0;var s={transform:new c(this.options.inTransform),origin:new u(this.options.inOrigin),opacity:new u(this.options.inOpacity)},o=new n({transform:s.transform,opacity:s.opacity,origin:s.origin}),h=new r;h.add(o).add(t),this.nodes.push(h),this.states.push(s),this.transforms.push(o);var p=e?a.after(3,e):void 0;i||(i=this.options.inTransition),s.transform.set(this.options.showTransform,i,p),s.opacity.set(this.options.showOpacity,i,p),s.origin.set(this.options.showOrigin,i,p)},s.prototype.hide=function(t,i){if(this._showing){this._showing=!1,t instanceof Function&&(i=t,t=void 0);var e=this.nodes[this.nodes.length-1],s=this.transforms[this.transforms.length-1],o=this.states[this.states.length-1],n=a.after(3,function(){this.nodes.splice(this.nodes.indexOf(e),1),this.states.splice(this.states.indexOf(o),1),this.transforms.splice(this.transforms.indexOf(s),1),i&&i.call(this)}.bind(this));t||(t=this.options.outTransition),o.transform.set(this.options.outTransform,t,n),o.opacity.set(this.options.outOpacity,t,n),o.origin.set(this.options.outOrigin,t,n)}},s.prototype.render=function(){for(var t=[],i=0;i=t;)this._positionOffset-=t,this._node=i,t=o.call(this,this._node.getSize()),i=this._node&&this._node.getNext?this._node.getNext():null;for(var e=this._node&&this._node.getPrevious?this._node.getPrevious():null;e&&this._position+this._positionOffset<0;){var s=o.call(this,e.getSize());this._positionOffset+=s,this._node=e,e=this._node&&this._node.getPrevious?this._node.getPrevious():null}}function h(){var t=null,i=this._position,e=[];this._onEdge=0;for(var s=-this._positionOffset,h=r.call(this),u=this._node;u&&s-is){for(;c&&h>p;)c=c.getPrevious(),c&&(p+=o.call(this,c.getSize()));for(c=this._node;c&&h>p;)c=c.getNext(),c&&(p+=o.call(this,c.getSize()))}var l=void 0!==p&&h>p?p:h;for(!u&&l>=s-i?(this._onEdge=1,this._eventOutput.emit("edgeHit",{position:s-l})):!this._node.getPrevious()&&0>=i&&(this._onEdge=-1,this._eventOutput.emit("edgeHit",{position:0})),u=this._node&&this._node.getPrevious?this._node.getPrevious():null,s=-this._positionOffset,u&&(t=u.getSize?u.getSize():this._contextSize,s-=o.call(this,t));u&&s-i>-(r.call(this)+this.options.margin);)n.call(this,u,s,e),u=u.getPrevious?u.getPrevious():null,u&&(t=u.getSize?u.getSize():this._contextSize,s-=o.call(this,t));return a.call(this),e}var u=t("famous/core/Entity"),c=t("famous/core/Group"),p=t("famous/core/OptionsManager"),l=t("famous/core/Transform"),f=t("famous/utilities/Utility"),d=t("famous/core/ViewSequence"),m=t("famous/core/EventHandler");s.DEFAULT_OPTIONS={direction:f.Direction.Y,margin:0,clipSize:void 0,groupScroll:!1},s.prototype.setOptions=function(t){this._optionsManager.setOptions(t),this.options.groupScroll?this.group.pipe(this._eventOutput):this.group.unpipe(this._eventOutput)},s.prototype.onEdge=function(){return this._onEdge},s.prototype.outputFrom=function(t,i){t||(t=function(t){return this.options.direction===f.Direction.X?l.translate(t,0):l.translate(0,t)}.bind(this),i||(i=t)),this._outputFunction=t,this._masterOutputFunction=i?i:function(i){return l.inverse(t(-i))}},s.prototype.positionFrom=function(t){t instanceof Function?this._positionGetter=t:t&&t.get?this._positionGetter=t.get.bind(t):(this._positionGetter=null,this._position=t),this._positionGetter&&(this._position=this._positionGetter.call(this))},s.prototype.sequenceFrom=function(t){t instanceof Array&&(t=new d({array:t})),this._node=t,this._positionOffset=0},s.prototype.getSize=function(t){return t?this._contextSize:this._size},s.prototype.render=function(){return this._node?(this._positionGetter&&(this._position=this._positionGetter.call(this)),this._entityId):null},s.prototype.commit=function(t){var i=t.transform,e=t.opacity,s=t.origin,o=t.size;this.options.clipSize||o[0]===this._contextSize[0]&&o[1]===this._contextSize[1]||(this._onEdge=0,this._contextSize[0]=o[0],this._contextSize[1]=o[1],this.options.direction===f.Direction.X?(this._size[0]=r.call(this),this._size[1]=void 0):(this._size[0]=void 0,this._size[1]=r.call(this)));var n=this._masterOutputFunction(-this._position);return{transform:l.multiply(i,n),size:o,opacity:e,origin:s,target:this.group.render()}},e.exports=s}),define("famous/views/Scrollview",["require","exports","module","famous/physics/PhysicsEngine","famous/physics/bodies/Particle","famous/physics/forces/Drag","famous/physics/forces/Spring","famous/core/EventHandler","famous/core/OptionsManager","famous/core/ViewSequence","famous/views/Scroller","famous/utilities/Utility","famous/inputs/GenericSync","famous/inputs/ScrollSync","famous/inputs/TouchSync"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new T(this.options),this._node=null,this._physicsEngine=new y,this._particle=new _,this._physicsEngine.addBody(this._particle),this.spring=new v({anchor:[0,0,0]}),this.drag=new g({forceFunction:g.FORCE_FUNCTIONS.QUADRATIC}),this.friction=new g({forceFunction:g.FORCE_FUNCTIONS.LINEAR}),this.sync=new x(["scroll","touch"],{direction:this.options.direction}),this._eventInput=new O,this._eventOutput=new O,this._eventInput.pipe(this.sync),this.sync.pipe(this._eventInput),O.setInputHandler(this,this._eventInput),O.setOutputHandler(this,this._eventOutput),this._touchCount=0,this._springState=0,this._onEdge=0,this._pageSpringPosition=0,this._edgeSpringPosition=0,this._touchVelocity=void 0,this._earlyEnd=!1,this._needsPaginationCheck=!1,this._scroller=new w,this._scroller.positionFrom(this.getPosition.bind(this)),this.setOptions(t),a.call(this)}function o(t){this._touchCount=t.count,void 0===t.count&&(this._touchCount=1),u.call(this),this.setVelocity(0),this._touchVelocity=0,this._earlyEnd=!1}function n(t){var i=-t.velocity,e=-t.delta;this._onEdge&&t.slip&&(0>i&&this._onEdge<0||i>0&&this._onEdge>0?this._earlyEnd||(r.call(this,t),this._earlyEnd=!0):this._earlyEnd&&Math.abs(i)>Math.abs(this.getVelocity())&&o.call(this,t)),this._earlyEnd||(this._touchVelocity=i,t.slip?this.setVelocity(i):this.setPosition(this.getPosition()+e))}function r(t){if(this._touchCount=t.count||0,!this._touchCount){u.call(this),this._onEdge&&f.call(this,this._edgeSpringPosition,C.EDGE),h.call(this);var i=-t.velocity,e=this.options.speedLimit;t.slip&&(e*=this.options.edgeGrip),-e>i?i=-e:i>e&&(i=e),this.setVelocity(i),this._touchVelocity=void 0,this._needsPaginationCheck=!0}}function a(){this._eventInput.bindThis(this),this._eventInput.on("start",o),this._eventInput.on("update",n),this._eventInput.on("end",r),this._scroller.on("edgeHit",function(t){this._edgeSpringPosition=t.position}.bind(this))}function h(){this._springState?this._physicsEngine.attach([this.spring],this._particle):this._physicsEngine.attach([this.drag,this.friction],this._particle)}function u(){this._springState=C.NONE,this._physicsEngine.detachAll()}function c(t){var i=this.options.direction,e=(t.getSize()||this._scroller.getSize())[i];return e||(e=this._scroller.getSize()[i]),e}function p(t){!this._onEdge&&t?(this.sync.setOptions({scale:this.options.edgeGrip}),this._touchCount||this._springState===C.EDGE||f.call(this,this._edgeSpringPosition,C.EDGE)):this._onEdge&&!t&&(this.sync.setOptions({scale:1}),this._springState&&Math.abs(this.getVelocity())<.001&&(u.call(this),h.call(this))),this._onEdge=t}function l(){if(this._needsPaginationCheck&&!this._touchCount&&this._springState!==C.EDGE){var t=this.getVelocity();if(!(Math.abs(t)>=this.options.pageStopSpeed)){var i=this.getPosition(),e=Math.abs(t)>this.options.pageSwitchSpeed,s=c.call(this,this._node),o=i>.5*s,n=t>0;o&&!e||e&&n?this.goToNextPage():f.call(this,0,C.PAGE),this._needsPaginationCheck=!1}}}function f(t,i){var e;i===C.EDGE?(this._edgeSpringPosition=t,e={anchor:[this._edgeSpringPosition,0,0],period:this.options.edgePeriod,dampingRatio:this.options.edgeDamp}):i===C.PAGE&&(this._pageSpringPosition=t,e={anchor:[this._pageSpringPosition,0,0],period:this.options.pagePeriod,dampingRatio:this.options.pageDamp}),this.spring.setOptions(e),i&&!this._springState&&(u.call(this),this._springState=i,h.call(this)),this._springState=i}function d(){for(var t=this.getPosition(),i=c.call(this,this._node),e=this._node.getNext();t>i+M&&e;)m.call(this,-i),t-=i,this._scroller.sequenceFrom(e),this._node=e,e=this._node.getNext(),i=c.call(this,this._node);for(var s,o=this._node.getPrevious();-M>t&&o;)s=c.call(this,o),this._scroller.sequenceFrom(o),this._node=o,m.call(this,s),t+=s,o=this._node.getPrevious()}function m(t){this._edgeSpringPosition+=t,this._pageSpringPosition+=t,this.setPosition(this.getPosition()+t),this._springState===C.EDGE?this.spring.setOptions({anchor:[this._edgeSpringPosition,0,0]}):this._springState===C.PAGE&&this.spring.setOptions({anchor:[this._pageSpringPosition,0,0]})}var y=t("famous/physics/PhysicsEngine"),_=t("famous/physics/bodies/Particle"),g=t("famous/physics/forces/Drag"),v=t("famous/physics/forces/Spring"),O=t("famous/core/EventHandler"),T=t("famous/core/OptionsManager"),S=t("famous/core/ViewSequence"),w=t("famous/views/Scroller"),b=t("famous/utilities/Utility"),x=t("famous/inputs/GenericSync"),E=t("famous/inputs/ScrollSync"),I=t("famous/inputs/TouchSync");x.register({scroll:E,touch:I});var M=.5;s.DEFAULT_OPTIONS={direction:b.Direction.Y,rails:!0,friction:.001,drag:1e-4,edgeGrip:.5,edgePeriod:300,edgeDamp:1,margin:1e3,paginated:!1,pagePeriod:500,pageDamp:.8,pageStopSpeed:10,pageSwitchSpeed:.5,speedLimit:10,groupScroll:!1};var C={NONE:0,EDGE:1,PAGE:2};s.prototype.outputFrom=function(){return this._scroller.outputFrom.apply(this._scroller,arguments)},s.prototype.getPosition=function(){return this._particle.getPosition1D()},s.prototype.setPosition=function(t){this._particle.setPosition1D(t)},s.prototype.getVelocity=function(){return this._touchCount?this._touchVelocity:this._particle.getVelocity1D()},s.prototype.setVelocity=function(t){this._particle.setVelocity1D(t)},s.prototype.setOptions=function(t){t&&(void 0!==t.direction&&("x"===t.direction?t.direction=b.Direction.X:"y"===t.direction&&(t.direction=b.Direction.Y)),this._scroller.setOptions(t),this._optionsManager.setOptions(t)),this._scroller.setOptions(this.options),this.options.groupScroll?this._scroller.pipe(this._eventInput):this._scroller.unpipe(this._eventInput),this.drag.setOptions({strength:this.options.drag}),this.friction.setOptions({strength:this.options.friction}),this.spring.setOptions({period:this.options.edgePeriod,dampingRatio:this.options.edgeDamp}),this.sync.setOptions({rails:this.options.rails,direction:this.options.direction===b.Direction.X?x.DIRECTION_X:x.DIRECTION_Y})},s.prototype.goToPreviousPage=function(){if(!this._node)return null;var t=this._node.getPrevious();if(t){var i=this.getPosition(),e=c.call(this,t);this._scroller.sequenceFrom(t),this._node=t;var s=M>i?-e:0;f.call(this,s,C.PAGE),m.call(this,e)}return this._eventOutput.emit("pageChange",{direction:-1}),t},s.prototype.goToNextPage=function(){if(!this._node)return null;var t=this._node.getNext();if(t){var i=this.getPosition(),e=c.call(this,this._node),s=c.call(this,t);this._scroller.sequenceFrom(t),this._node=t;var o=i>e-M?e+s:e;f.call(this,o,C.PAGE),m.call(this,-e)}return this._eventOutput.emit("pageChange",{direction:1}),t},s.prototype.sequenceFrom=function(t){return t instanceof Array&&(t=new S({array:t})),this._node=t,this._scroller.sequenceFrom(t)},s.prototype.getSize=function(){return this._scroller.getSize.apply(this._scroller,arguments)},s.prototype.render=function(){return this._node?(d.call(this),p.call(this,this._scroller.onEdge()),this.options.paginated&&l.call(this),this._scroller.render()):null},e.exports=s}),define("famous/views/ScrollContainer",["require","exports","module","famous/surfaces/ContainerSurface","famous/core/EventHandler","./Scrollview","famous/utilities/Utility","famous/core/OptionsManager"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this._optionsManager=new h(this.options),t&&this.setOptions(t),this.container=new o(this.options.container),this.scrollview=new r(this.options.scrollview),this.container.add(this.scrollview),n.setInputHandler(this,this.scrollview),n.setOutputHandler(this,this.scrollview),this.scrollview.subscribe(this.container)}var o=t("famous/surfaces/ContainerSurface"),n=t("famous/core/EventHandler"),r=t("./Scrollview"),a=t("famous/utilities/Utility"),h=t("famous/core/OptionsManager");s.DEFAULT_OPTIONS={container:{properties:{overflow:"hidden"}},scrollview:{direction:a.Direction.X}},s.prototype.setOptions=function(t){return this._optionsManager.setOptions(t)},s.prototype.sequenceFrom=function(){return this.scrollview.sequenceFrom.apply(this.scrollview,arguments)},s.prototype.render=function(){return this.container.render.apply(this.container,arguments)},e.exports=s}),define("famous/widgets/NavigationBar",["require","exports","module","famous/core/Scene","famous/core/Surface","famous/core/Transform","famous/core/View"],function(t,i,e){function s(){a.apply(this,arguments),this.title=new n({classes:this.options.classes,content:this.options.content}),this.back=new n({size:[this.options.size[1],this.options.size[1]],classes:this.options.classes,content:this.options.backContent}),this.back.on("click",function(){this._eventOutput.emit("back",{})}.bind(this)),this.more=new n({size:[this.options.size[1],this.options.size[1]],classes:this.options.classes,content:this.options.moreContent}),this.more.on("click",function(){this._eventOutput.emit("more",{})}.bind(this)),this.layout=new o({id:"master",size:this.options.size,target:[{transform:r.inFront,origin:[0,.5],target:this.back},{origin:[.5,.5],target:this.title},{transform:r.inFront,origin:[1,.5],target:this.more}]}),this._add(this.layout),this._optionsManager.on("change",function(t){var i=t.id,e=t.value;"size"===i?(this.layout.id.master.setSize(e),this.title.setSize(e),this.back.setSize([e[1],e[1]]),this.more.setSize([e[1],e[1]])):"backClasses"===i?this.back.setOptions({classes:this.options.classes.concat(this.options.backClasses)}):"backContent"===i?this.back.setContent(this.options.backContent):"classes"===i?(this.title.setOptions({classes:this.options.classes}),this.back.setOptions({classes:this.options.classes.concat(this.options.backClasses)}),this.more.setOptions({classes:this.options.classes.concat(this.options.moreClasses)})):"content"===i?this.setContent(this.options.content):"moreClasses"===i?this.more.setOptions({classes:this.options.classes.concat(this.options.moreClasses)}):"moreContent"===i&&this.more.setContent(this.options.content)}.bind(this))}var o=t("famous/core/Scene"),n=t("famous/core/Surface"),r=t("famous/core/Transform"),a=t("famous/core/View");s.prototype=Object.create(a.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS={size:[void 0,50],backClasses:["back"],backContent:"◀",classes:["navigation"],content:"",moreClasses:["more"],moreContent:"✚"},s.prototype.setContent=function(t){return this.title.setContent(t)},e.exports=s}),define("famous/widgets/Slider",["require","exports","module","famous/core/Surface","famous/surfaces/CanvasSurface","famous/core/Transform","famous/core/EventHandler","famous/math/Utilities","famous/core/OptionsManager","famous/inputs/MouseSync","famous/inputs/TouchSync","famous/inputs/GenericSync"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),this.optionsManager=new c(this.options),t&&this.setOptions(t),this.indicator=new r({size:this.options.indicatorSize,classes:["slider-back"]}),this.label=new n({size:this.options.labelSize,content:this.options.label,properties:{pointerEvents:"none"},classes:["slider-label"]}),this.eventOutput=new h,this.eventInput=new h,h.setInputHandler(this,this.eventInput),h.setOutputHandler(this,this.eventOutput);var i=(this.options.range[1]-this.options.range[0])/this.options.indicatorSize[0];this.sync=new f(["mouse","touch"],{scale:i,direction:f.DIRECTION_X}),this.indicator.pipe(this.sync),this.sync.pipe(this),this.eventInput.on("update",function(t){this.set(t.position)}.bind(this)),this._drawPos=0,o.call(this)}function o(){this.label.setContent(this.options.label+''+this.get().toFixed(this.options.precision)+"")}var n=t("famous/core/Surface"),r=t("famous/surfaces/CanvasSurface"),a=t("famous/core/Transform"),h=t("famous/core/EventHandler"),u=t("famous/math/Utilities"),c=t("famous/core/OptionsManager"),p=t("famous/inputs/MouseSync"),l=t("famous/inputs/TouchSync"),f=t("famous/inputs/GenericSync");f.register({mouse:p,touch:l}),s.DEFAULT_OPTIONS={size:[200,60],indicatorSize:[200,30],labelSize:[200,30],range:[0,1],precision:2,value:0,label:"",fillColor:"rgba(170, 170, 170, 1)"},s.prototype.setOptions=function(t){return this.optionsManager.setOptions(t)},s.prototype.get=function(){return this.options.value},s.prototype.set=function(t){t!==this.options.value&&(this.options.value=u.clamp(t,this.options.range),o.call(this),this.eventOutput.emit("change",{value:t}))},s.prototype.getSize=function(){return this.options.size},s.prototype.render=function(){var t=this.options.range,i=Math.floor((this.get()-t[0])/(t[1]-t[0])*this.options.indicatorSize[0]);if(ithis._drawPos){var e=this.indicator.getContext("2d");e.fillStyle=this.options.fillColor,e.fillRect(this._drawPos-1,0,i-this._drawPos+1,this.options.indicatorSize[1])}return this._drawPos=i,{size:this.options.size,target:[{origin:[0,0],target:this.indicator.render()},{transform:a.translate(0,0,1),origin:[0,0],target:this.label.render()}]}},e.exports=s}),define("famous/widgets/ToggleButton",["require","exports","module","famous/core/Surface","famous/core/EventHandler","famous/views/RenderController"],function(t,i,e){function s(t){this.options={content:"",offClasses:["off"],onClasses:["on"],size:void 0,outTransition:{curve:"easeInOut",duration:300},inTransition:{curve:"easeInOut",duration:300},toggleMode:s.TOGGLE,crossfade:!0},this._eventOutput=new n,n.setOutputHandler(this,this._eventOutput),this.offSurface=new o,this.offSurface.on("click",function(){this.options.toggleMode!==s.OFF&&this.select()}.bind(this)),this.offSurface.pipe(this._eventOutput),this.onSurface=new o,this.onSurface.on("click",function(){this.options.toggleMode!==s.ON&&this.deselect()}.bind(this)),this.onSurface.pipe(this._eventOutput),this.arbiter=new r({overlap:this.options.crossfade}),this.deselect(),t&&this.setOptions(t)}var o=t("famous/core/Surface"),n=t("famous/core/EventHandler"),r=t("famous/views/RenderController");s.OFF=0,s.ON=1,s.TOGGLE=2,s.prototype.select=function(){this.selected=!0,this.arbiter.show(this.onSurface,this.options.inTransition),this._eventOutput.emit("select")},s.prototype.deselect=function(){this.selected=!1,this.arbiter.show(this.offSurface,this.options.outTransition),this._eventOutput.emit("deselect")},s.prototype.isSelected=function(){return this.selected},s.prototype.setOptions=function(t){void 0!==t.content&&(this.options.content=t.content,this.offSurface.setContent(this.options.content),this.onSurface.setContent(this.options.content)),t.offClasses&&(this.options.offClasses=t.offClasses,this.offSurface.setClasses(this.options.offClasses)),t.onClasses&&(this.options.onClasses=t.onClasses,this.onSurface.setClasses(this.options.onClasses)),void 0!==t.size&&(this.options.size=t.size,this.onSurface.setSize(this.options.size),this.offSurface.setSize(this.options.size)),void 0!==t.toggleMode&&(this.options.toggleMode=t.toggleMode),void 0!==t.outTransition&&(this.options.outTransition=t.outTransition),void 0!==t.inTransition&&(this.options.inTransition=t.inTransition),void 0!==t.crossfade&&(this.options.crossfade=t.crossfade,this.arbiter.setOptions({overlap:this.options.crossfade}))},s.prototype.getSize=function(){return this.options.size},s.prototype.render=function(){return this.arbiter.render()},e.exports=s}),define("famous/widgets/TabBar",["require","exports","module","famous/utilities/Utility","famous/core/View","famous/views/GridLayout","./ToggleButton"],function(t,i,e){function s(){a.apply(this,arguments),this.layout=new h,this.buttons=[],this._buttonIds={},this._buttonCallbacks={},this.layout.sequenceFrom(this.buttons),this._add(this.layout),this._optionsManager.on("change",o.bind(this))}function o(t){var i=t.id,e=t.value;if("direction"===i)this.layout.setOptions({dimensions:n.call(this.buttons.length,this.options.direction)});else if("buttons"===i)for(var s in this.buttons)this.buttons[s].setOptions(e);else if("sections"===i)for(var o in this.options.sections)this.defineSection(o,this.options.sections[o]) +}function n(t,i){return i===r.Direction.X?[t,1]:[1,t]}var r=t("famous/utilities/Utility"),a=t("famous/core/View"),h=t("famous/views/GridLayout"),u=t("./ToggleButton");s.prototype=Object.create(a.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS={sections:[],widget:u,size:[void 0,50],direction:r.Direction.X,buttons:{toggleMode:u.ON}},s.prototype.defineSection=function(t,i){var e,s=this._buttonIds[t];if(void 0===s){s=this.buttons.length,this._buttonIds[t]=s;var o=this.options.widget;e=new o,this.buttons[s]=e,this.layout.setOptions({dimensions:n(this.buttons.length,this.options.direction)})}else e=this.buttons[s],e.unbind("select",this._buttonCallbacks[t]);this.options.buttons&&e.setOptions(this.options.buttons),e.setOptions(i),this._buttonCallbacks[t]=this.select.bind(this,t),e.on("select",this._buttonCallbacks[t])},s.prototype.select=function(t){var i=this._buttonIds[t];this.buttons[i]&&this.buttons[i].isSelected()?this._eventOutput.emit("select",{id:t}):this.buttons[i]&&this.buttons[i].select();for(var e=0;ey&&y>u&&(s.set(o.normalize(n*d*p(y,h)).cap(a)),f.applyForce(s))}}},e.exports=s}),define("famous/physics/forces/RotationalDrag",["require","exports","module","./Drag"],function(t,i,e){function s(t){o.call(this,t)}var o=t("./Drag");s.prototype=Object.create(o.prototype),s.prototype.constructor=s,s.DEFAULT_OPTIONS=o.DEFAULT_OPTIONS,s.FORCE_FUNCTIONS=o.FORCE_FUNCTIONS,s.FORCE_FUNCTIONS={LINEAR:function(t){return t},QUADRATIC:function(t){return t.mult(t.norm())}},s.prototype.applyForce=function(t){for(var i=this.options.strength,e=this.options.forceFunction,s=this.force,o=0;ow){if(p.set(l.normalize()),this._eventOutput){var E={target:_,source:i,overlap:w,normal:p};this._eventOutput.emit("preCollision",E),this._eventOutput.emit("collision",E)}var I=u>=w?((1+c)*p.dot(f)+h/e*(w-u))/(x+e/b):(1+c)*p.dot(f)/(x+e/b);p.mult(e*I).put(d),d.mult(-1).put(m),i.applyImpulse(d),_.applyImpulse(m),this._eventOutput&&this._eventOutput.emit("postCollision",E)}}}},e.exports=s}),define("famous/physics/constraints/Curve",["require","exports","module","./Constraint","famous/math/Vector"],function(t,i,e){function s(t){this.options=Object.create(s.DEFAULT_OPTIONS),t&&this.setOptions(t),this.J=new n,this.impulse=new n,o.call(this)}var o=t("./Constraint"),n=t("famous/math/Vector");s.prototype=Object.create(o.prototype),s.prototype.constructor=s;var r=1e-7,a=Math.PI;s.DEFAULT_OPTIONS={equation:function(){return 0},plane:function(t,i,e){return e},period:0,dampingRatio:0},s.prototype.setOptions=function(t){for(var i in t)this.options[i]=t[i]},s.prototype.applyConstraint=function(t,i,e){for(var s=this.options,o=this.impulse,n=this.J,h=s.equation,u=s.plane,c=s.dampingRatio,p=s.period,l=0;l' + + '' + + '
        ' + + 'Powered by Barometer' + + '
        ' + + '' + + '
        ' + + '
        ' + + '
        ' + + '
  • '; + + document.write(this.tab_html); + document.write(this.overlay_html); +}; + +BAROMETER.show = function() { + document.getElementById('barometer_iframe').setAttribute("src", this.feedback_url); + document.getElementById('barometer_overlay').style.display = "block"; + return false; +}; \ No newline at end of file diff --git a/app/assets/javascripts/require/require.js b/app/assets/javascripts/require/require.js new file mode 100644 index 00000000..e599a6ab --- /dev/null +++ b/app/assets/javascripts/require/require.js @@ -0,0 +1,36 @@ +/* + RequireJS 2.1.11 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details +*/ +var requirejs,require,define; +(function(ca){function G(b){return"[object Function]"===M.call(b)}function H(b){return"[object Array]"===M.call(b)}function v(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(G(c)){if(this.events.error&&this.map.isDefine||h.onError!==da)try{f=i.execCb(b,c,e,f)}catch(d){a=d}else f=i.execCb(b,c,e,f);this.map.isDefine&&void 0===f&&((e=this.module)?f=e.exports:this.usingExports&& +(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=c;this.exports=f;if(this.map.isDefine&&!this.ignore&&(p[b]=f,h.onResourceLoad))h.onResourceLoad(i,this.map,this.depMaps);y(b);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= +this.map,b=a.id,d=m(a.prefix);this.depMaps.push(d);r(d,"defined",t(this,function(f){var d,g;g=j(ba,this.map.id);var J=this.map.name,u=this.map.parentMap?this.map.parentMap.name:null,p=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(J=f.normalize(J,function(a){return c(a,u,!0)})||""),f=m(a.prefix+"!"+J,this.map.parentMap),r(f,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),g=j(k,f.id)){this.depMaps.push(f); +if(this.events.error)g.on("error",t(this,function(a){this.emit("error",a)}));g.enable()}}else g?(this.map.url=i.nameToUrl(g),this.load()):(d=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),d.error=t(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(k,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),d.fromText=t(this,function(f,c){var g=a.name,J=m(g),k=O;c&&(f=c);k&&(O=!1);q(J);s(l.config,b)&&(l.config[g]=l.config[b]);try{h.exec(f)}catch(j){return w(C("fromtexteval", +"fromText eval for "+b+" failed: "+j,j,[b]))}k&&(O=!0);this.depMaps.push(J);i.completeLoad(g);p([g],d)}),f.load(a.name,p,d,l))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){W[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,t(this,function(a,b){var c,f;if("string"===typeof a){a=m(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=j(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;r(a,"defined",t(this,function(a){this.defineDep(b, +a);this.check()}));this.errback&&r(a,"error",t(this,this.errback))}c=a.id;f=k[c];!s(N,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,t(this,function(a){var b=j(k,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:l,contextName:b,registry:k,defined:p,urlFetched:T,defQueue:A,Module:$,makeModuleMap:m, +nextTick:h.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=l.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(l[b]||(l[b]={}),V(l[b],a,!0,!0)):l[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(ba[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a);b[c]=a}),l.shim=b);a.packages&&v(a.packages,function(a){var b, +a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(l.paths[b]=a.location);l.pkgs[b]=a.name+"/"+(a.main||"main").replace(ja,"").replace(R,"")});B(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=m(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ca,arguments));return b||a.exports&&ea(a.exports)}},makeRequire:function(a,e){function g(f,c,d){var j,l;e.enableBuildCallback&&(c&&G(c))&&(c.__requireJsBuild= +!0);if("string"===typeof f){if(G(c))return w(C("requireargs","Invalid require call"),d);if(a&&s(N,f))return N[f](k[a.id]);if(h.get)return h.get(i,f,a,g);j=m(f,a,!1,!0);j=j.id;return!s(p,j)?w(C("notloaded",'Module name "'+j+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[j]}L();i.nextTick(function(){L();l=q(m(null,a));l.skipMap=e.skipMap;l.init(f,c,d,{enabled:!0});D()});return g}e=e||{};V(g,{isBrowser:z,toUrl:function(b){var e,d=b.lastIndexOf("."),g=b.split("/")[0];if(-1!== +d&&(!("."===g||".."===g)||1g.attachEvent.toString().indexOf("[native code"))&&!Z?(O=!0,g.attachEvent("onreadystatechange",b.onScriptLoad)): +(g.addEventListener("load",b.onScriptLoad,!1),g.addEventListener("error",b.onScriptError,!1)),g.src=d,L=g,D?y.insertBefore(g,D):y.appendChild(g),L=null,g;if(fa)try{importScripts(d),b.completeLoad(c)}catch(j){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,j,[c]))}};z&&!r.skipDataMain&&U(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(K=b.getAttribute("data-main"))return q=K,r.baseUrl||(E=q.split("/"),q=E.pop(),Q=E.length?E.join("/")+"/":"./",r.baseUrl= +Q),q=q.replace(R,""),h.jsExtRegExp.test(q)&&(q=K),r.deps=r.deps?r.deps.concat(q):[q],!0});define=function(b,c,d){var g,h;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(la,"").replace(ma,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(O){if(!(g=L))P&&"interactive"===P.readyState||U(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),g=P;g&&(b|| +(b=g.getAttribute("data-requiremodule")),h=F[g.getAttribute("data-requirecontext")])}(h?h.defQueue:S).push([b,c,d])};define.amd={jQuery:!0};h.exec=function(b){return eval(b)};h(r)}})(this); diff --git a/app/assets/javascripts/shims/classList.js b/app/assets/javascripts/shims/classList.js new file mode 100644 index 00000000..0cf197c0 --- /dev/null +++ b/app/assets/javascripts/shims/classList.js @@ -0,0 +1,138 @@ + +/* + * classList.js: Cross-browser full element.classList implementation. + * 2011-06-15 + * + * By Eli Grey, http://eligrey.com + * Public Domain. + * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + */ + +/*global self, document, DOMException */ + +/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js*/ + +if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) { + +(function (view) { + +"use strict"; + +var + classListProp = "classList" + , protoProp = "prototype" + , elemCtrProto = (view.HTMLElement || view.Element)[protoProp] + , objCtr = Object + , strTrim = String[protoProp].trim || function () { + return this.replace(/^\s+|\s+$/g, ""); + } + , arrIndexOf = Array[protoProp].indexOf || function (item) { + var + i = 0 + , len = this.length + ; + for (; i < len; i++) { + if (i in this && this[i] === item) { + return i; + } + } + return -1; + } + // Vendors: please allow content code to instantiate DOMExceptions + , DOMEx = function (type, message) { + this.name = type; + this.code = DOMException[type]; + this.message = message; + } + , checkTokenAndGetIndex = function (classList, token) { + if (token === "") { + throw new DOMEx( + "SYNTAX_ERR" + , "An invalid or illegal string was specified" + ); + } + if (/\s/.test(token)) { + throw new DOMEx( + "INVALID_CHARACTER_ERR" + , "String contains an invalid character" + ); + } + return arrIndexOf.call(classList, token); + } + , ClassList = function (elem) { + var + trimmedClasses = strTrim.call(elem.className) + , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : [] + , i = 0 + , len = classes.length + ; + for (; i < len; i++) { + this.push(classes[i]); + } + this._updateClassName = function () { + elem.className = this.toString(); + }; + } + , classListProto = ClassList[protoProp] = [] + , classListGetter = function () { + return new ClassList(this); + } +; +// Most DOMException implementations don't allow calling DOMException's toString() +// on non-DOMExceptions. Error's toString() is sufficient here. +DOMEx[protoProp] = Error[protoProp]; +classListProto.item = function (i) { + return this[i] || null; +}; +classListProto.contains = function (token) { + token += ""; + return checkTokenAndGetIndex(this, token) !== -1; +}; +classListProto.add = function (token) { + token += ""; + if (checkTokenAndGetIndex(this, token) === -1) { + this.push(token); + this._updateClassName(); + } +}; +classListProto.remove = function (token) { + token += ""; + var index = checkTokenAndGetIndex(this, token); + if (index !== -1) { + this.splice(index, 1); + this._updateClassName(); + } +}; +classListProto.toggle = function (token) { + token += ""; + if (checkTokenAndGetIndex(this, token) === -1) { + this.add(token); + } else { + this.remove(token); + } +}; +classListProto.toString = function () { + return this.join(" "); +}; + +if (objCtr.defineProperty) { + var classListPropDesc = { + get: classListGetter + , enumerable: true + , configurable: true + }; + try { + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } catch (ex) { // IE 8 doesn't support enumerable:true + if (ex.number === -0x7FF5EC54) { + classListPropDesc.enumerable = false; + objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc); + } + } +} else if (objCtr[protoProp].__defineGetter__) { + elemCtrProto.__defineGetter__(classListProp, classListGetter); +} + +}(self)); + +} diff --git a/app/assets/javascripts/shims/functionPrototypeBind.js b/app/assets/javascripts/shims/functionPrototypeBind.js new file mode 100644 index 00000000..c9d7a41d --- /dev/null +++ b/app/assets/javascripts/shims/functionPrototypeBind.js @@ -0,0 +1,23 @@ +if (!Function.prototype.bind) { + Function.prototype.bind = function (oThis) { + if (typeof this !== "function") { + // closest thing possible to the ECMAScript 5 internal IsCallable function + throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + } + + var aArgs = Array.prototype.slice.call(arguments, 1), + fToBind = this, + fNOP = function () {}, + fBound = function () { + return fToBind.apply(this instanceof fNOP && oThis + ? this + : oThis, + aArgs.concat(Array.prototype.slice.call(arguments))); + }; + + fNOP.prototype = this.prototype; + fBound.prototype = new fNOP(); + + return fBound; + }; +} diff --git a/app/assets/javascripts/shims/requestAnimationFrame.js b/app/assets/javascripts/shims/requestAnimationFrame.js new file mode 100644 index 00000000..4ab22330 --- /dev/null +++ b/app/assets/javascripts/shims/requestAnimationFrame.js @@ -0,0 +1,13 @@ +// adds requestAnimationFrame functionality +// Source: http://strd6.com/2011/05/better-window-requestanimationframe-shim/ + +window.requestAnimationFrame || (window.requestAnimationFrame = + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(callback, element) { + return window.setTimeout(function() { + callback(+new Date()); + }, 1000 / 60); +}); diff --git a/app/assets/javascripts/src/Metamaps.GlobalUI.js b/app/assets/javascripts/src/Metamaps.GlobalUI.js index a425d78f..97435893 100644 --- a/app/assets/javascripts/src/Metamaps.GlobalUI.js +++ b/app/assets/javascripts/src/Metamaps.GlobalUI.js @@ -533,6 +533,7 @@ Metamaps.GlobalUI.Search = { if (dataset.length == 0) { dataset.push({ profile: "/assets/user.png", + value: "No results", label: "No results", rtype: "noresult" @@ -591,14 +592,12 @@ Metamaps.GlobalUI.Search = { if (s.css('height') == '0px') { s.css({ 'height': 'auto', - 'border-top': 'none', 'overflow': 'visible' }); $(this).removeClass('maximizeResults').addClass('minimizeResults'); } else { s.css({ 'height': '0', - 'border-top': '1px solid rgb(56, 56, 56)', 'overflow': 'hidden' }); $(this).removeClass('minimizeResults').addClass('maximizeResults'); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8ae9967a..bb8c1323 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -10,9 +10,6 @@ * *= require_self *= require_tree . - *= require base - *= require jquery.mCustomScrollbar - *= require jquery-ui */ /* clear styles */ diff --git a/app/assets/stylesheets/barometer.css b/app/assets/stylesheets/barometer.css new file mode 100644 index 00000000..fbc21d3f --- /dev/null +++ b/app/assets/stylesheets/barometer.css @@ -0,0 +1,151 @@ +/* =Barometer feedback tab +--------------------------------------------------------*/ + +a#barometer_tab { + background-image:url(../images/feedback_tab.png); + background-color:#222222; + color:#FFFFFF; + cursor:pointer; + height:102px; + left:0; + margin-left:-7px; + overflow:hidden; + position:fixed; + text-indent:-100000px; + top:25%; + width:42px; + z-index:100000; + } + +/* =Barometer Overlay +--------------------------------------------------------*/ + +#barometer_overlay { + top:0; + left:0; + width: 100%; + height: 100%; + position: fixed; + _position: absolute; + z-index: 1000000; + } + +#barometer_overlay * { + margin: 0; + padding: 0; + font-family: Arial, Helvetica, sans-serif; + font-style:normal; + font-variant:normal; + font-size: 12px; + color:#333; + } + +/* =Barometer Overlay -> Main +--------------------------------------------------------*/ + +#barometer_main { + width: 550px; + height: 100%; + margin: 0 auto; + z-index:2; + position:relative; + background-color: transparent; + } + +#barometer_main div { + padding: 5px 20px 0 20px; + margin:0; + background: #EEE; + overflow:none; + border-right: solid 2px #000; + border-left: solid 2px #000; + } + +#barometer_overlay #barometer_main #overlay_loading h2 { + padding: 10px 0; + font-size:28px; + } + +#barometer_overlay #barometer_main #barometer_close:hover { + background-position:-42px 0; + } + +#barometer_overlay #barometer_main a#barometer_close { + background-image:url(../images/barometer_close.png); + cursor:pointer; + height:42px; + outline-color:-moz-use-text-color; + outline-style:none; + outline-width:medium; + overflow:hidden; + position:absolute; + top:-23px; + right:-22px; + width:42px; + z-index:4; + border: none; + } + +#barometer_overlay #barometer_main span { + background:url(../images/close.png) no-repeat scroll 33px 0 transparent; + color:#FFFFFF; + cursor:pointer; + float:right; + font-size:11px; + height:20px; + padding-right:20px; + text-decoration:underline; +} + +#barometer_iframe { + width: 550px; + height: 100%; + background: transparent url(../images/barometer_loading.png) no-repeat; +} +#barometer_iframe.loaded { + background: transparent; +} + + +/* =Barometer Overlay -> Main -> Overlay header +--------------------------------------------------------*/ + +#barometer_overlay #barometer_main #overlay_header { + padding:6px 5px 1px 0; + background-color:#333; + font-weight: bold; + height:18px; + border: solid 2px #000; + } + +#barometer_overlay #barometer_main #overlay_header a { + color:#fff; + float:left; + font-size:15px; + margin-left:5px; + font-weight: normal; + } + +#barometer_overlay #barometer_main #overlay_header span { + float:right; + height:20px; + padding-right:20px; + background: transparent url(../images/close.png) no-repeat 33px 0; + text-decoration:underline; + font-size:11px; + cursor:pointer; + color: #fff; + } + +/* =Barometer screen id - used to close barometer +--------------------------------------------------------*/ + +#barometer_screen { + top:0; + left:0; + z-index:1; + width: 100%; + position: absolute; + background-color: #000; + opacity: 0.42; filter:alpha(opacity=42); -moz-opacity: 0.42; + } \ No newline at end of file diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index 918af0c3..8392699f 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -212,6 +212,7 @@ .searchHeader { height: 42px; width: 100%; + position: relative; } .searchTopicsHeader { background: #4fc4a8; @@ -227,35 +228,44 @@ color: #F5F5F5; font-size: 18px; line-height: 18px; - margin: 10px 0 3px 10px; + margin: 12px 0 3px 16px; float: left; } .sidebarSearch .tt-dropdown-menu .limitToMe { float: left; - width: 15px; - height: 15px; - margin-top: 11px; - margin-left: 15px; + width: 12px; + height: 12px; + border: 1px; + color: #000000; + position: absolute; + top: 15px; + left: 136px; } .sidebarSearch .tt-dropdown-menu .limitToMeLabel { float: left; - margin-top: 11px; + font-family: 'din-medium', helvetica, sans-serif; + font-size: 12px; + color: #f5f5f5; + margin: 0; + position: absolute; + top: 15px; + left: 156px; +} +.sidebarSearch .tt-dropdown-menu .minimizeResults, .sidebarSearch .tt-dropdown-menu .maximizeResults { + float: right; + width: 32px; + height: 32px; + background-image: url(arrowpermswhite_sprite.png); + background-repeat: no-repeat; + cursor: pointer; + margin-top: 5px; + margin-right: 20px; } .sidebarSearch .tt-dropdown-menu .minimizeResults { - float: right; - width: 35px; - height: 35px; - background: url('/assets/MMCCicon_minimize_arrow.png') no-repeat center center; - background-size: 25px 25px; - cursor: pointer; + background-position-x: 0; } .sidebarSearch .tt-dropdown-menu .maximizeResults { - float: right; - width: 35px; - height: 35px; - background: url('/assets/MMCCicon_maximize_arrow.png') no-repeat center center; - background-size: 25px 25px; - cursor: pointer; + background-position-x: -32px; } .sidebarSearch .tt-suggestions { overflow: visible; @@ -292,7 +302,7 @@ .sidebarSearch .tt-dataset-topics .tt-is-under-cursor .topicIcon, .sidebarSearch .tt-dataset-topics .tt-is-under-mouse-cursor .topicIcon { margin: 0 auto; - padding-left: 2px + padding-left: 10px; } .sidebarSearch .tt-dataset-topics .metacodeTip { display: none; @@ -311,7 +321,7 @@ margin: 4px 9px 4px 4px; } .sidebarSearch .resultText { - width: 225px; + width: 260px; display: block; float: left; word-wrap: break-word; @@ -355,14 +365,19 @@ outline: none; } .sidebarSearch button.addToMap { - width: 20px; - height: 20px; - background: url(/assets/MMCCicon_add.png) no-repeat center center; - background-size: 18px 18px; - top: 30px; + width: 24px; + height: 24px; + background: url(addtopic_sprite.png); + background-repeat: no-repeat; + background-size: 48px 24px; + top: 19px; left: 84px; cursor: pointer; } +.sidebarSearch button.addToMap:hover { + background-position: -24px; +} +/* .sidebarSearch div.goTo { width: 20px; height: 20px; @@ -370,25 +385,28 @@ background-size: 18px 18px; top: 7px; left: 84px; -} -.sidebarSearch div.mapCount { - width: 20px; - height: 20px; - background: url(/assets/MMCCicon_map.png) no-repeat 0px center; - background-size: 14px 14px; +}*/ +.sidebarSearch div.topicCount { + width: 16px; + height: 16px; + background: url(topic16.png); + background-repeat: no-repeat; + background-size: 16px 16px; top: 7px; - left: 38px; + left: 13px; padding-left: 18px; font-size: 12px; line-height: 20px; } -.sidebarSearch div.topicCount { + +.sidebarSearch div.mapCount { width: 20px; height: 20px; - background: url(/assets/MMCCicon_topic.png) no-repeat 0px center; + background: url(metamap16.png); + background-repeat: no-repeat; background-size: 14px 14px; top: 7px; - left: 39px; + left: 13px; padding-left: 18px; font-size: 12px; line-height: 20px; @@ -396,21 +414,20 @@ .sidebarSearch div.synapseCount { width: 20px; height: 20px; - background: url(/assets/MMCCicon_synapse.png) no-repeat 0px center; + background: url(synapse16.png); + background-repeat: no-repeat; background-size: 15px 15px; top: 30px; - left: 38px; + left: 13px; padding-left: 19px; font-size: 12px; line-height: 20px; } .sidebarSearch div.topicOriginatorIcon { - width: 20px; - height: 20px; - background: url(/assets/MMCCicon_mapper.png) no-repeat center center; - background-size: 17px 17px; + width: 24px; + height: 24px; top: 7px; - left: 13px; + left: 47px; } .sidebarSearch .tip { position: absolute; @@ -444,10 +461,11 @@ } .sidebarSearch div.mapContributorsIcon { height: 20px; - background: url(/assets/MMCCicon_mapper.png) no-repeat 0px center; + background: url(/assets/MMCCicon_mapper.png); + background-repeat: no-repeat; background-size: 17px 17px; top: 7px; - right: 85px; + right: 25px; padding-left: 19px; font-size: 12px; line-height: 20px; @@ -455,24 +473,27 @@ } .sidebarSearch div.topicPermission, .sidebarSearch div.mapPermission { - width: 20px; - height: 20px; - background-size: 19px 19px !important; - top: 30px; - left: 13px; + width: 24px; + height: 24px; + background-image: url(permissions32_sprite.png); + background-repeat: no-repeat; + background-size: 72px 48px !important; + top: 27px; + left: 47px; } .sidebarSearch div.topicPermission.commons, .sidebarSearch div.mapPermission.commons { - background: url(/assets/MMCCicon_commons.png) no-repeat center center; + background-position: 0 0; } .sidebarSearch div.topicPermission.public, .sidebarSearch div.mapPermission.public { - background: url(/assets/MMCCicon_public.png) no-repeat center center; + background-position: -32px 0; } .sidebarSearch div.topicPermission.private, .sidebarSearch div.mapPermission.private { - background: url(/assets/MMCCicon_private.png) no-repeat center center; + background-position: -16px 0; } + .sidebarSearch .tt-dataset-mappers a.goTo { top: 7px; } diff --git a/app/assets/stylesheets/famous.css b/app/assets/stylesheets/famous.css new file mode 100644 index 00000000..d806be45 --- /dev/null +++ b/app/assets/stylesheets/famous.css @@ -0,0 +1,77 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Owner: mark@famo.us + * @license MPL 2.0 + * @copyright Famous Industries, Inc. 2014 + */ + + +html { + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; + overflow: hidden; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +body { + position: absolute; + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-font-smoothing: antialiased; + -webkit-tap-highlight-color: transparent; + -webkit-perspective: 0; + perspective: none; + overflow: hidden; +} + +.famous-container, .famous-group { + position: absolute; + top: 0px; + left: 0px; + bottom: 0px; + right: 0px; + overflow: visible; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + -webkit-backface-visibility: visible; + backface-visibility: visible; + pointer-events: none; +} + +.famous-group { + width: 0px; + height: 0px; + margin: 0px; + padding: 0px; + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; +} + +.famous-surface { + position: absolute; + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-style: flat; + transform-style: preserve-3d; /* performance */ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -webkit-tap-highlight-color: transparent; + pointer-events: auto; +} + +.famous-container-group { + position: relative; + width: 100%; + height: 100%; +} diff --git a/app/helpers/topics_helper.rb b/app/helpers/topics_helper.rb index 84c0d9a7..05cbc974 100644 --- a/app/helpers/topics_helper.rb +++ b/app/helpers/topics_helper.rb @@ -8,7 +8,7 @@ module TopicsHelper topic['id'] = t.id topic['label'] = t.name topic['value'] = t.name - topic['description'] = t.desc.truncate(35) # make this return matched results + topic['description'] = t.desc.truncate(70) # make this return matched results topic['type'] = t.metacode.name topic['typeImageURL'] = t.metacode.icon topic['permission'] = t.permission diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 4a796e18..dead8f9f 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -83,9 +83,6 @@ add to map <% end %> -
    - open in new tab -
    appears on this # of maps {{mapCount}} @@ -95,7 +92,8 @@ {{synapseCount}}
    - created by {{originator}} + + created by {{originator}}
    topic is {{permission}} @@ -146,6 +144,14 @@
    open in new tab
    +
    + Mapping since: + {{create_at}} +
    +
    + Generation + {{mapCount}} +
    created this # of maps {{mapCount}} diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 9e17a43d..478381d2 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -18,18 +18,6 @@ - - - - - - - - - - - - diff --git a/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html b/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html index e4e20cf2..db8943d4 100644 --- a/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html +++ b/realtime/node_modules/socket.io/node_modules/socket.io-client/node_modules/active-x-obfuscator/node_modules/zeparser/benchmark.html @@ -18845,7 +18845,7 @@ window._GM_writeInnerHtmlLoaded(); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + 'stats.g.doubleclick.net/dc.js'; + ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); })(); From 1a4330ec196ff84e4d8e44ca8a08bf7cc33028b0 Mon Sep 17 00:00:00 2001 From: Shai Mor Date: Wed, 1 Oct 2014 22:55:59 -0400 Subject: [PATCH 148/600] metamaps support resources links --- app/views/shared/_cheatsheet.html.erb | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/views/shared/_cheatsheet.html.erb b/app/views/shared/_cheatsheet.html.erb index e55f1e91..628e4c6b 100644 --- a/app/views/shared/_cheatsheet.html.erb +++ b/app/views/shared/_cheatsheet.html.erb @@ -134,39 +134,39 @@ Feedback Forums
    From b70681ea6ea8d7d1cff66b69045d66b8cb0512ed Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Wed, 1 Oct 2014 23:21:05 -0400 Subject: [PATCH 149/600] updated the 404 page --- app/assets/images/monkeyselfie.jpg | Bin 0 -> 202708 bytes app/assets/stylesheets/application.css | 2 +- public/404.html | 116 +++++++++++++++++++++++-- 3 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 app/assets/images/monkeyselfie.jpg diff --git a/app/assets/images/monkeyselfie.jpg b/app/assets/images/monkeyselfie.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0ee87df193e0f277f0fe0f173cf2f58ecd73c742 GIT binary patch literal 202708 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 z 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�It9@$=ISS}O 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 p, #getInvolved > p, #invite > p, #colophon p { diff --git a/public/404.html b/public/404.html index 9a48320a..c68570fb 100644 --- a/public/404.html +++ b/public/404.html @@ -3,24 +3,122 @@ The page you were looking for doesn't exist (404) - <% end %> <% end %> + +<% # Rails.logger.info(stored_location_for(:user)) %> diff --git a/app/views/layouts/_upperelements.html.erb b/app/views/layouts/_upperelements.html.erb index 25b25301..07aea898 100644 --- a/app/views/layouts/_upperelements.html.erb +++ b/app/views/layouts/_upperelements.html.erb @@ -66,6 +66,7 @@ <% end %> + <% if !(controller_name == "sessions" && action_name == "new") %>
    <% if user && user.image %> @@ -79,5 +80,6 @@ <%= render :partial => 'layouts/account' %>
    + <% end %>
    -

    The page you were looking for doesn't exist.

    -

    You may have mistyped the address or the page may have moved.

    +
    From 80221f1dd4a00a31ac41757848e7f1b72198236b Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Wed, 1 Oct 2014 23:25:49 -0400 Subject: [PATCH 150/600] small updates to colophone --- app/views/layouts/_lightboxes.html.erb | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 413e6799..bac3249c 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -74,7 +74,7 @@

    Metamaps.cc is an initiative of affiliates of the Metamaps Open Value Network, an evolving network of peers working together to create shared value. Metamaps continues to be a constantly developing experiment in progress.

    -

    The peers behind Metamaps have their own respective backgrounds as artists, designers, engineers, advocates, activitists, filmmakers and systems thinkers and share a deep commitment to the creative culture they support. Active peers include:

    +

    The peers behind Metamaps have their own respective backgrounds as artists, designers, engineers, advocates, activitists, filmmakers and systems thinkers and share a deep commitment to the creative culture they support.

    ACTIVE PEERS (as of 10/2014)

    Robert Best, Benjamin Brownell, Marija Coneva, Devin Howard, Bashar Jabbour, Raymon Johnstone, Shai Mor, Ishan Shapiro, Connor Turland

    @@ -127,7 +127,6 @@
    • Git
    • Github*
    -

    Documentation

    • Dropbox *
    • Google Drive *
    • From 10e52284883687feb7c4a28e817147b4d67b0188 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 1 Oct 2014 23:41:39 -0400 Subject: [PATCH 151/600] finalized cheatsheet move help button back into the corner --- app/assets/stylesheets/clean.css | 8 +++++--- app/views/shared/_cheatsheet.html.erb | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/clean.css b/app/assets/stylesheets/clean.css index db5e1938..bd38f717 100644 --- a/app/assets/stylesheets/clean.css +++ b/app/assets/stylesheets/clean.css @@ -678,13 +678,15 @@ /* infoAndHelp */ +.mapPage .infoAndHelp, .topicPage .infoAndHelp{ + right: 70px; +} .infoAndHelp { position: fixed; - bottom: 24px; - right: 66px; + bottom: 20px; + right: 20px; z-index: 3; width: auto; - padding: 1px 10px 0px 10px; font-style: italic; height: 32px; } diff --git a/app/views/shared/_cheatsheet.html.erb b/app/views/shared/_cheatsheet.html.erb index 628e4c6b..338df912 100644 --- a/app/views/shared/_cheatsheet.html.erb +++ b/app/views/shared/_cheatsheet.html.erb @@ -131,7 +131,7 @@

      For more information about Metamaps.cc, visit our Knowledge Base or skip directly to a section by clicking on one of the categories below.

      - Feedback Forums + Feedback Forums
      • Getting Started From 6785a61fd02d0c2879fb71e7c72e29e91eed14c9 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Thu, 2 Oct 2014 15:55:51 -0400 Subject: [PATCH 152/600] updated 404 page --- app/assets/images/.DS_Store | Bin 0 -> 6148 bytes public/404.html | 21 +++++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 app/assets/images/.DS_Store diff --git a/app/assets/images/.DS_Store b/app/assets/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0
        -
      From 499298613bea33c58e804ebefc7d45aae8225780 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Thu, 2 Oct 2014 17:07:09 -0400 Subject: [PATCH 153/600] updated metacodes.yml and deleted metacode_backgrounds.css --- metacode_backgrounds.css | 120 ------------------------------------ test/fixtures/metacodes.yml | 41 +++++++++++- 2 files changed, 40 insertions(+), 121 deletions(-) delete mode 100644 metacode_backgrounds.css diff --git a/metacode_backgrounds.css b/metacode_backgrounds.css deleted file mode 100644 index adf69d4e..00000000 --- a/metacode_backgrounds.css +++ /dev/null @@ -1,120 +0,0 @@ -.mbgAction { - background-color: #bd6c85 !important; -} -.mbgActivity { - background-color: #6ebf65 !important; -} -.mbgArgument { - background-color: #7FAEFD !important; -} -.mbgBizarre { - background-color: #bdb25e !important; -} -.mbgCatalyst { - background-color: #EF8964 !important; -} -.mbgClosed { - background-color: #ABB49F !important; -} -.mbgCon { - background-color: #CF7C74 !important; -} -.mbgDecision { - background-color: #cca866 !important; -} -.mbgExample { - background-color: #598559 !important; -} -.mbgExperience { - background-color: #BE995F !important; -} -.mbgForesight { - background-color: #b0b0b0 !important; -} -.mbgFutureDev { - background-color: #25A17F !important; -} -.mbgGoodPractice { - background-color: #BD9E86 !important; -} -.mbgGroup { - background-color: #7076BC !important; -} -.mbgIdea { - background-color: #c4bc5e !important; -} -.mbgImplication { - background-color: #83DECA !important; -} -.mbgInsight { - background-color: #B074AD !important; -} -.mbgIntention { - background-color: #baeaff !important; -} -.mbgKnowledge { - background-color: #60acf7 !important; -} -.mbgList { - background-color: #B7A499 !important; -} -.mbgLocation { - background-color: #abd9a7 !important; -} -.mbgMovieMap { - background-color: #a5a0de !important; -} -.mbgNote { - background-color: #a389a1 !important; -} -.mbgOpenIssue { - background-color: #9bbf71 !important; -} -.mbgOpinion { - background-color: #54a19d !important; -} -.mbgOpportunity { - background-color: #889F64 !important; -} -.mbgPerson { - background-color: #de925f !important; -} -.mbgPlatform { - background-color: #21C8FE !important; -} -.mbgPro { - background-color: #89b879 !important; -} -.mbgProblem { - background-color: #99cfc4 !important; -} -.mbgQuestion { - background-color: #709899 !important; -} -.mbgReference { - background-color: #A7A7A7 !important; -} -.mbgRequirement { - background-color: #d2a7d4 !important; -} -.mbgResearch { - background-color: #CD8E89 !important; -} -.mbgResource { - background-color: #c98c63 !important; -} -.mbgRole { - background-color: #a8595d !important; -} -.mbgTask { - background-color: #2f89ba !important; -} -.mbgTool { - background-color: #828282 !important; -} -.mbgTrajectory { - background-color: #b3953d !important; -} -.mbgWildcard { - background-color: #73c7de !important; -} \ No newline at end of file diff --git a/test/fixtures/metacodes.yml b/test/fixtures/metacodes.yml index 230bef78..c1244d02 100644 --- a/test/fixtures/metacodes.yml +++ b/test/fixtures/metacodes.yml @@ -12,155 +12,194 @@ one: two: name: Activity icon: /assets/icons/activity.png + color: #6ebf65 three: name: Bizarre icon: /assets/icons/bizarre.png + color: #BDB25E four: name: Catalyst icon: /assets/icons/catalyst.png + color: #EF8964 five: name: Closed icon: /assets/icons/closed.png + color: #ABB49F six: name: Experience icon: /assets/icons/experience.png + color: #BE995F seven: name: Future Dev icon: /assets/icons/futuredev.png + color: #25A17F eight: name: Group icon: /assets/icons/group.png + color: #7076BC nine: name: Idea icon: /assets/icons/idea.png + color: #C4BC5E ten: name: Implication icon: /assets/icons/implication.png + color: #83DECA eleven: name: Insight icon: /assets/icons/insight.png + color: #B074AD twelve: name: Intention icon: /assets/icons/intention.png + color: #BAEAFF thirteen: name: Knowledge icon: /assets/icons/knowledge.png + color: #60ACF7 fourteen: name: Location icon: /assets/icons/location.png + color: #ABD9A7 fifteen: name: Open Issue icon: /assets/icons/openissue.png + color: #9BBF71 sixteen: name: Opinion icon: /assets/icons/opinion.png + color: #54A19D seventeen: name: Opportunity icon: /assets/icons/opportunity.png + color: #889F64 eighteen: name: Person icon: /assets/icons/person.png + color: #DE925F nineteen: name: Platform icon: /assets/icons/platform.png + color: #21C8FE twenty: name: Problem icon: /assets/icons/problem.png + color: #99CFC4 twenty-one: name: Question icon: /assets/icons/question.png + color: #709899 twenty-two: name: Reference icon: /assets/icons/reference.png + color: #A7A7A7 twenty-three: name: Requirement icon: /assets/icons/requirement.png + color: #D2A7D4 twenty-four: name: Resource - icon: /assets/icons/resource.png + icon: /assets/icons/resource.png + color: #C98C63 twenty-five: name: Role icon: /assets/icons/role.png + color: #A8595D twenty-six: name: Task icon: /assets/icons/task.png + color: #2F89BA twenty-seven: name: Tool icon: /assets/icons/tool.png + color: #828282 twenty-eight: name: Trajectory icon: /assets/icons/trajectory.png + color: #B3953D twenty-nine: name: Argument icon: /assets/icons/argument.png + color: #7FAEFD thirty: name: Con icon: /assets/icons/con_icon.png + color: #CF7C74 thirty-one: name: Decision icon: /assets/icons/decision.png + color: #CCA866 thirty-two: name: Example icon: /assets/icons/example.png + color: #598559 thirty-three: name: Foresight icon: /assets/icons/foresight.png + color: #B0B0B0 thirty-four: name: Good Practice icon: /assets/icons/goodpractice.png + color: #BD9E86 thirty-five: name: List icon: /assets/icons/list.png + color: #B7A499 thirty-six: name: Movie Map icon: /assets/icons/moviemap.png + color: #A5A0DE thirty-seven: name: Note icon: /assets/icons/note.png + color: #A389A1 thirty-eight: name: Pro icon: /assets/icons/pro.png + color: #89B879 thirty-nine: name: Research icon: /assets/icons/research.png + color: #CD8E89 forty: name: Wildcard icon: /assets/icons/wildcard.png + color: #73C7DE From cad8af2c1f82dec1ee426b571c61e726e410f9a7 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Thu, 2 Oct 2014 22:33:28 -0400 Subject: [PATCH 154/600] updated the cheatsheet --- .gitignore | 2 + app/assets/stylesheets/application.css | 59 ++++++++++++++++++- app/views/shared/_cheatsheet.html.erb | 79 ++++++++++++++------------ 3 files changed, 102 insertions(+), 38 deletions(-) diff --git a/.gitignore b/.gitignore index cf3d59bc..cd683d45 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,5 @@ db/*.sqlite3 # Ignore all logfiles and tempfiles. log/*.log tmp + +.DS_Store \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 8eaea083..f7a3ba5a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -2050,20 +2050,65 @@ float: left; } #cheatSheet .csItem { margin: 5px 0; - font-size: 15px; + font-size: 14px; line-height: 18px; + font-family: 'din-regular'; } + +#cheatSheet .csItem a { + color: #c04f4f; +} + #cheatSheet .csItem img { display: inline-block; - margin: 0 2px; + margin-bottom: 10px; } #cheatSheet .csTitle { + font-weight: bold; + } #cheatSheet .indented { margin-left: 15px; } +#zoomIn { + background: #424242 url(zoom_sprite.png) no-repeat; + width: 22px; + height: 22px; + display: inline-block; + background-position: -37px -5px; + border-radius: 2px; + margin: 0 4px; + position: relative; + top: 3px; +} + +#zoomOut { + background: #424242 url(zoom_sprite.png) no-repeat; + width: 22px; + height: 22px; + display: inline-block; + background-position: -37px -37px; + border-radius: 2px; + margin: 0 4px; + position: relative; + top: 3px; +} + +#centerMap { + background: #424242 url(extents_sprite.png) no-repeat; + width: 22px; + height: 22px; + display: inline-block; + background-position: -5px -5px; + border-radius: 2px; + margin: 0 4px; + position: relative; + top: 3px; + +} + #helpWrapper { background: none; border: none; @@ -2096,7 +2141,17 @@ float: left; } #quickReference ul { width: 150px; + text-transform: uppercase; + font-size: 14px; + line-height: 14px; + font-family: din-medium; + } + +#quickReference ul li { + padding-bottom: 16px; +} + #quickReference li.ui-state-active a { color: #00BCD4; } diff --git a/app/views/shared/_cheatsheet.html.erb b/app/views/shared/_cheatsheet.html.erb index 628e4c6b..b28bd146 100644 --- a/app/views/shared/_cheatsheet.html.erb +++ b/app/views/shared/_cheatsheet.html.erb @@ -14,7 +14,6 @@
      -
      Alt + click on topic icon: recenter topics around chosen topic
      -
      Right-click + 'center this topic': recenter topics around chosen topic
      +
      Recenter Topics around chosen Topic: Alt + click on the topic OR Right-click + 'center this topic'
      +
      @@ -37,83 +38,89 @@
      Esc: Hides auto-suggestion results
      Enter: create a new topic
      Gear Icon: open up metacode settings
      +
      - Open topic card: double-click on topic icon + Open 'Topic' card: Double-click on topic icon
      - Move topic card: click + drag on topic card metacode + Move 'Topic' card: Click and drag on topic card metacode
      - Change/edit metacode: mouse over metacode icon, then click on solid colored bar + Change/edit metacode: Mouse over metacode icon, then click on solid colored bar
      - Edit topic title, description, link: click on text in respective area + Edit Topic title, description, link: Click on text in respective area
      - Save topic title, description, link: hit enter + Save Topic title, description, link: Hit enter
      - Change topic permission: click on 'permission' icon (only for topic creator) + Change Topic permission: Click on 'Permission' icon (only for topic creator)
      - Open topic view: click on icon within topic card bar + Open Topic view: Click on icon within topic card bar
      - Close topic card: click on canvas + Close 'Topic' card: Click on canvas
      - Open context menu: right-click on topic icon + Open 'Context Menu': Right-click on topic icon
      *Hide/Remove/Delete topic within context menu
      + +
      -
      Right-click & drag from one topic to another: open create synapse prompt
      +
      Open 'Create Synapse' prompt: Right-click & drag from one topic to another
      Enter: Create synapse
      *You do not have to add a description
      -
      Right-click + drag from topic to open canvas: create new topic with synapse
      +
      Create new Topic with Synapse: Right-click + drag from topic to open canvas
      Enter: Create topic
      Enter: Create synapse
      + +
      -
      Open synapse card:double-click on synapse
      -
      Edit synapse description: click on current description text
      -
      Save synapse description: hit enter
      -
      Edit directionality: select appropriate arrow boxes
      -
      Change synapse permission: click on 'permission' icon (only for synapse creator)
      -
      Right-click on synapse: open context menu
      +
      Open 'Synapse' card: Double-click on Synapse
      +
      Edit Synapse description: Click on current description text
      +
      Save Synapse description: Hit enter
      +
      Edit directionality: Select appropriate arrow boxes
      +
      Change synapse permission: Click on 'permission' icon (only for synapse creator)
      +
      Open 'Context Menu': Right-click on Synapse
      *Hide/Remove/Delete synapse within context menu
      + +
      -
      Click + drag: move around canvas
      -
      Scroll: zoom in/out
      -
      Refresh page: center map
      +
      Move around Canvas: Click and drag
      +
      Zoom in/out: Scroll OR click on
      &
      +
      Center Map: Click
      OR Refresh page
      + +
      -
      Click on topic icon: select/deselect topic
      -
      Click on synapse: select/deselect synapse
      -
      Shift + click: select multiple topics / synapses
      -
      Shift + click + drag on canvas: make selection box, select multiple topics
      -
      Click + drag on selected topic(s): move all selected topics & synapses
      -
      Right-click on selected topic(s): open context menu
      +
      Select/Deselect Topic: Click on topic icon
      +
      Select/Deselect Synapse: Click on synapse
      +
      Select multiple Topics/Synapses: Shift + click
      +
      Make Selection box, select multiple Topics: Shift + click + drag on Canvas
      +
      Move all selected Topics & Synapses: Click + drag on selected Topic(s)
      +
      Open 'Context Menu': Right-click on selected topic(s)
      *Hide/Remove/Delete/Change permissions of multiple topics & synapses within context menu
      -
      Click on background: deselect all topics & synapses
      -
      Esc: deselect all topics & synapses
      +
      Deselect all topics & Synapses: Click on background or Esc
      -
      Ctrl + /: open search prompt
      -
      Esc: close search prompt
      -
      Type into the search prompt: search for topics, maps, & mappers
      -
      Click on search result: open in new tab
      +
      Open 'Search' prompt: Ctrl + /
      +
      Close 'Search' prompt: Esc
      <% if controller_name == "maps" && action_name == "show" %> -
      Click "+" on a topic result: add to current map
      +
      Add to current Map: Click "+" on a topic result
      <% end %>
      Search by metacode: type "[name of metacode]:", then your search query. i.e. idea:create...
      Search for map: type "map:", then your search query. i.e. map:exploring...
      From d30417f958442ebc89fd801fe45d6e8058fc9a8e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 4 Oct 2014 00:15:47 -0400 Subject: [PATCH 155/600] fixed right click on topic menu, fixed synapse color when opening for synapse card, removed mCustomScrollbar --- .../lib/jquery.mCustomScrollbar.min.js | 1 - app/assets/javascripts/lib/mCSB_buttons.png | Bin 1394 -> 0 bytes .../javascripts/src/Metamaps.GlobalUI.js | 6 --- app/assets/javascripts/src/Metamaps.JIT.js | 24 +++++++---- app/assets/javascripts/src/Metamaps.js | 38 ++++++++++++++---- app/assets/javascripts/src/codeleft.js | 17 -------- app/controllers/topics_controller.rb | 6 --- app/models/mapping.rb | 26 ------------ app/models/synapse.rb | 19 --------- app/models/topic.rb | 19 --------- 10 files changed, 48 insertions(+), 108 deletions(-) delete mode 100644 app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js delete mode 100644 app/assets/javascripts/lib/mCSB_buttons.png diff --git a/app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js b/app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js deleted file mode 100644 index 7a20d615..00000000 --- a/app/assets/javascripts/lib/jquery.mCustomScrollbar.min.js +++ /dev/null @@ -1 +0,0 @@ -(function(c){var b={init:function(e){var f={set_width:false,set_height:false,horizontalScroll:false,scrollInertia:950,mouseWheel:true,mouseWheelPixels:"auto",autoDraggerLength:true,autoHideScrollbar:false,alwaysShowScrollbar:false,snapAmount:null,snapOffset:0,scrollButtons:{enable:false,scrollType:"continuous",scrollSpeed:"auto",scrollAmount:40},advanced:{updateOnBrowserResize:true,updateOnContentResize:false,autoExpandHorizontalScroll:false,autoScrollOnFocus:true,normalizeMouseWheelDelta:false},contentTouchScroll:true,callbacks:{onScrollStart:function(){},onScroll:function(){},onTotalScroll:function(){},onTotalScrollBack:function(){},onTotalScrollOffset:0,onTotalScrollBackOffset:0,whileScrolling:function(){}},theme:"light"},e=c.extend(true,f,e);return this.each(function(){var m=c(this);if(e.set_width){m.css("width",e.set_width)}if(e.set_height){m.css("height",e.set_height)}if(!c(document).data("mCustomScrollbar-index")){c(document).data("mCustomScrollbar-index","1")}else{var t=parseInt(c(document).data("mCustomScrollbar-index"));c(document).data("mCustomScrollbar-index",t+1)}m.wrapInner("
      ").addClass("mCustomScrollbar _mCS_"+c(document).data("mCustomScrollbar-index"));var g=m.children(".mCustomScrollBox");if(e.horizontalScroll){g.addClass("mCSB_horizontal").wrapInner("
      ");var k=g.children(".mCSB_h_wrapper");k.wrapInner("
      ").children(".mCSB_container").css({width:k.children().outerWidth(),position:"relative"}).unwrap()}else{g.wrapInner("
      ")}var o=g.children(".mCSB_container");if(c.support.touch){o.addClass("mCS_touch")}o.after("
      ");var l=g.children(".mCSB_scrollTools"),h=l.children(".mCSB_draggerContainer"),q=h.children(".mCSB_dragger");if(e.horizontalScroll){q.data("minDraggerWidth",q.width())}else{q.data("minDraggerHeight",q.height())}if(e.scrollButtons.enable){if(e.horizontalScroll){l.prepend("").append("")}else{l.prepend("").append("")}}g.bind("scroll",function(){if(!m.is(".mCS_disabled")){g.scrollTop(0).scrollLeft(0)}});m.data({mCS_Init:true,mCustomScrollbarIndex:c(document).data("mCustomScrollbar-index"),horizontalScroll:e.horizontalScroll,scrollInertia:e.scrollInertia,scrollEasing:"mcsEaseOut",mouseWheel:e.mouseWheel,mouseWheelPixels:e.mouseWheelPixels,autoDraggerLength:e.autoDraggerLength,autoHideScrollbar:e.autoHideScrollbar,alwaysShowScrollbar:e.alwaysShowScrollbar,snapAmount:e.snapAmount,snapOffset:e.snapOffset,scrollButtons_enable:e.scrollButtons.enable,scrollButtons_scrollType:e.scrollButtons.scrollType,scrollButtons_scrollSpeed:e.scrollButtons.scrollSpeed,scrollButtons_scrollAmount:e.scrollButtons.scrollAmount,autoExpandHorizontalScroll:e.advanced.autoExpandHorizontalScroll,autoScrollOnFocus:e.advanced.autoScrollOnFocus,normalizeMouseWheelDelta:e.advanced.normalizeMouseWheelDelta,contentTouchScroll:e.contentTouchScroll,onScrollStart_Callback:e.callbacks.onScrollStart,onScroll_Callback:e.callbacks.onScroll,onTotalScroll_Callback:e.callbacks.onTotalScroll,onTotalScrollBack_Callback:e.callbacks.onTotalScrollBack,onTotalScroll_Offset:e.callbacks.onTotalScrollOffset,onTotalScrollBack_Offset:e.callbacks.onTotalScrollBackOffset,whileScrolling_Callback:e.callbacks.whileScrolling,bindEvent_scrollbar_drag:false,bindEvent_content_touch:false,bindEvent_scrollbar_click:false,bindEvent_mousewheel:false,bindEvent_buttonsContinuous_y:false,bindEvent_buttonsContinuous_x:false,bindEvent_buttonsPixels_y:false,bindEvent_buttonsPixels_x:false,bindEvent_focusin:false,bindEvent_autoHideScrollbar:false,mCSB_buttonScrollRight:false,mCSB_buttonScrollLeft:false,mCSB_buttonScrollDown:false,mCSB_buttonScrollUp:false});if(e.horizontalScroll){if(m.css("max-width")!=="none"){if(!e.advanced.updateOnContentResize){e.advanced.updateOnContentResize=true}}}else{if(m.css("max-height")!=="none"){var s=false,r=parseInt(m.css("max-height"));if(m.css("max-height").indexOf("%")>=0){s=r,r=m.parent().height()*s/100}m.css("overflow","hidden");g.css("max-height",r)}}m.mCustomScrollbar("update");if(e.advanced.updateOnBrowserResize){var i,j=c(window).width(),u=c(window).height();c(window).bind("resize."+m.data("mCustomScrollbarIndex"),function(){if(i){clearTimeout(i)}i=setTimeout(function(){if(!m.is(".mCS_disabled")&&!m.is(".mCS_destroyed")){var w=c(window).width(),v=c(window).height();if(j!==w||u!==v){if(m.css("max-height")!=="none"&&s){g.css("max-height",m.parent().height()*s/100)}m.mCustomScrollbar("update");j=w;u=v}}},150)})}if(e.advanced.updateOnContentResize){var p;if(e.horizontalScroll){var n=o.outerWidth()}else{var n=o.outerHeight()}p=setInterval(function(){if(e.horizontalScroll){if(e.advanced.autoExpandHorizontalScroll){o.css({position:"absolute",width:"auto"}).wrap("
      ").css({width:o.outerWidth(),position:"relative"}).unwrap()}var v=o.outerWidth()}else{var v=o.outerHeight()}if(v!=n){m.mCustomScrollbar("update");n=v}},300)}})},update:function(){var n=c(this),k=n.children(".mCustomScrollBox"),q=k.children(".mCSB_container");q.removeClass("mCS_no_scrollbar");n.removeClass("mCS_disabled mCS_destroyed");k.scrollTop(0).scrollLeft(0);var y=k.children(".mCSB_scrollTools"),o=y.children(".mCSB_draggerContainer"),m=o.children(".mCSB_dragger");if(n.data("horizontalScroll")){var A=y.children(".mCSB_buttonLeft"),t=y.children(".mCSB_buttonRight"),f=k.width();if(n.data("autoExpandHorizontalScroll")){q.css({position:"absolute",width:"auto"}).wrap("
      ").css({width:q.outerWidth(),position:"relative"}).unwrap()}var z=q.outerWidth()}else{var w=y.children(".mCSB_buttonUp"),g=y.children(".mCSB_buttonDown"),r=k.height(),i=q.outerHeight()}if(i>r&&!n.data("horizontalScroll")){y.css("display","block");var s=o.height();if(n.data("autoDraggerLength")){var u=Math.round(r/i*s),l=m.data("minDraggerHeight");if(u<=l){m.css({height:l})}else{if(u>=s-10){var p=s-10;m.css({height:p})}else{m.css({height:u})}}m.children(".mCSB_dragger_bar").css({"line-height":m.height()+"px"})}var B=m.height(),x=(i-r)/(s-B);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().top);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{if(z>f&&n.data("horizontalScroll")){y.css("display","block");var h=o.width();if(n.data("autoDraggerLength")){var j=Math.round(f/z*h),C=m.data("minDraggerWidth");if(j<=C){m.css({width:C})}else{if(j>=h-10){var e=h-10;m.css({width:e})}else{m.css({width:j})}}}var v=m.width(),x=(z-f)/(h-v);n.data("scrollAmount",x).mCustomScrollbar("scrolling",k,q,o,m,w,g,A,t);var D=Math.abs(q.position().left);n.mCustomScrollbar("scrollTo",D,{scrollInertia:0,trigger:"internal"})}else{k.unbind("mousewheel focusin");if(n.data("horizontalScroll")){m.add(q).css("left",0)}else{m.add(q).css("top",0)}if(n.data("alwaysShowScrollbar")){if(!n.data("horizontalScroll")){m.css({height:o.height()})}else{if(n.data("horizontalScroll")){m.css({width:o.width()})}}}else{y.css("display","none");q.addClass("mCS_no_scrollbar")}n.data({bindEvent_mousewheel:false,bindEvent_focusin:false})}}},scrolling:function(i,q,n,k,A,f,D,w){var l=c(this);if(!l.data("bindEvent_scrollbar_drag")){var o,p,C,z,e;if(c.support.pointer){C="pointerdown";z="pointermove";e="pointerup"}else{if(c.support.msPointer){C="MSPointerDown";z="MSPointerMove";e="MSPointerUp"}}if(c.support.pointer||c.support.msPointer){k.bind(C,function(K){K.preventDefault();l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");var J=c(this),M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;if(I0&&L0){o=L;p=I}});c(document).bind(z+"."+l.data("mCustomScrollbarIndex"),function(K){K.preventDefault();if(l.data("on_drag")){var J=k,M=J.offset(),I=K.originalEvent.pageX-M.left,L=K.originalEvent.pageY-M.top;G(o,p,L,I)}}).bind(e+"."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}else{k.bind("mousedown touchstart",function(K){K.preventDefault();K.stopImmediatePropagation();var J=c(this),N=J.offset(),I,M;if(K.type==="touchstart"){var L=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0];I=L.pageX-N.left;M=L.pageY-N.top}else{l.data({on_drag:true});k.addClass("mCSB_dragger_onDrag");I=K.pageX-N.left;M=K.pageY-N.top}if(I0&&M0){o=M;p=I}}).bind("touchmove",function(K){K.preventDefault();K.stopImmediatePropagation();var N=K.originalEvent.touches[0]||K.originalEvent.changedTouches[0],J=c(this),M=J.offset(),I=N.pageX-M.left,L=N.pageY-M.top;G(o,p,L,I)});c(document).bind("mousemove."+l.data("mCustomScrollbarIndex"),function(K){if(l.data("on_drag")){var J=k,M=J.offset(),I=K.pageX-M.left,L=K.pageY-M.top;G(o,p,L,I)}}).bind("mouseup."+l.data("mCustomScrollbarIndex"),function(x){l.data({on_drag:false});k.removeClass("mCSB_dragger_onDrag")})}l.data({bindEvent_scrollbar_drag:true})}function G(J,K,L,I){if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",(k.position().left-(K))+I,{moveDragger:true,trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",(k.position().top-(J))+L,{moveDragger:true,trigger:"internal"})}}if(c.support.touch&&l.data("contentTouchScroll")){if(!l.data("bindEvent_content_touch")){var m,E,s,t,v,F,H;q.bind("touchstart",function(x){x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this);s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;F=t;H=v});q.bind("touchmove",function(x){x.preventDefault();x.stopImmediatePropagation();m=x.originalEvent.touches[0]||x.originalEvent.changedTouches[0];E=c(this).parent();s=E.offset();v=m.pageX-s.left;t=m.pageY-s.top;if(l.data("horizontalScroll")){l.mCustomScrollbar("scrollTo",H-v,{trigger:"internal"})}else{l.mCustomScrollbar("scrollTo",F-t,{trigger:"internal"})}})}}if(!l.data("bindEvent_scrollbar_click")){n.bind("click",function(I){var x=(I.pageY-n.offset().top)*l.data("scrollAmount"),y=c(I.target);if(l.data("horizontalScroll")){x=(I.pageX-n.offset().left)*l.data("scrollAmount")}if(y.hasClass("mCSB_draggerContainer")||y.hasClass("mCSB_draggerRail")){l.mCustomScrollbar("scrollTo",x,{trigger:"internal",scrollEasing:"draggerRailEase"})}});l.data({bindEvent_scrollbar_click:true})}if(l.data("mouseWheel")){if(!l.data("bindEvent_mousewheel")){i.bind("mousewheel",function(K,M){var J,I=l.data("mouseWheelPixels"),x=Math.abs(q.position().top),L=k.position().top,y=n.height()-k.height();if(l.data("normalizeMouseWheelDelta")){if(M<0){M=-1}else{M=1}}if(I==="auto"){I=100+Math.round(l.data("scrollAmount")/2)}if(l.data("horizontalScroll")){L=k.position().left;y=n.width()-k.width();x=Math.abs(q.position().left)}if((M>0&&L!==0)||(M<0&&L!==y)){K.preventDefault();K.stopImmediatePropagation()}J=x-(M*I);l.mCustomScrollbar("scrollTo",J,{trigger:"internal"})});l.data({bindEvent_mousewheel:true})}}if(l.data("scrollButtons_enable")){if(l.data("scrollButtons_scrollType")==="pixels"){if(l.data("horizontalScroll")){w.add(D).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_x:false});if(!l.data("bindEvent_buttonsPixels_x")){w.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)+l.data("scrollButtons_scrollAmount"))});D.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().left)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_x:true})}}else{f.add(A).unbind("mousedown touchstart MSPointerDown pointerdown mouseup MSPointerUp pointerup mouseout MSPointerOut pointerout touchend",j,h);l.data({bindEvent_buttonsContinuous_y:false});if(!l.data("bindEvent_buttonsPixels_y")){f.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)+l.data("scrollButtons_scrollAmount"))});A.bind("click",function(x){x.preventDefault();r(Math.abs(q.position().top)-l.data("scrollButtons_scrollAmount"))});l.data({bindEvent_buttonsPixels_y:true})}}function r(x){if(!k.data("preventAction")){k.data("preventAction",true);l.mCustomScrollbar("scrollTo",x,{trigger:"internal"})}}}else{if(l.data("horizontalScroll")){w.add(D).unbind("click");l.data({bindEvent_buttonsPixels_x:false});if(!l.data("bindEvent_buttonsContinuous_x")){w.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollRight:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var j=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollRight"))};w.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",j);D.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollLeft:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().left)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var h=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollLeft"))};D.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",h);l.data({bindEvent_buttonsContinuous_x:true})}}else{f.add(A).unbind("click");l.data({bindEvent_buttonsPixels_y:false});if(!l.data("bindEvent_buttonsContinuous_y")){f.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollDown:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)+x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var u=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollDown"))};f.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",u);A.bind("mousedown touchstart MSPointerDown pointerdown",function(y){y.preventDefault();var x=B();l.data({mCSB_buttonScrollUp:setInterval(function(){l.mCustomScrollbar("scrollTo",Math.abs(q.position().top)-x,{trigger:"internal",scrollEasing:"easeOutCirc"})},17)})});var g=function(x){x.preventDefault();clearInterval(l.data("mCSB_buttonScrollUp"))};A.bind("mouseup touchend MSPointerUp pointerup mouseout MSPointerOut pointerout",g);l.data({bindEvent_buttonsContinuous_y:true})}}function B(){var x=l.data("scrollButtons_scrollSpeed");if(l.data("scrollButtons_scrollSpeed")==="auto"){x=Math.round((l.data("scrollInertia")+100)/40)}return x}}}if(l.data("autoScrollOnFocus")){if(!l.data("bindEvent_focusin")){i.bind("focusin",function(){i.scrollTop(0).scrollLeft(0);var x=c(document.activeElement);if(x.is("input,textarea,select,button,a[tabindex],area,object")){var J=q.position().top,y=x.position().top,I=i.height()-x.outerHeight();if(l.data("horizontalScroll")){J=q.position().left;y=x.position().left;I=i.width()-x.outerWidth()}if(J+y<0||J+y>I){l.mCustomScrollbar("scrollTo",y,{trigger:"internal"})}}});l.data({bindEvent_focusin:true})}}if(l.data("autoHideScrollbar")&&!l.data("alwaysShowScrollbar")){if(!l.data("bindEvent_autoHideScrollbar")){i.bind("mouseenter",function(x){i.addClass("mCS-mouse-over");d.showScrollbar.call(i.children(".mCSB_scrollTools"))}).bind("mouseleave touchend",function(x){i.removeClass("mCS-mouse-over");if(x.type==="mouseleave"){d.hideScrollbar.call(i.children(".mCSB_scrollTools"))}});l.data({bindEvent_autoHideScrollbar:true})}}},scrollTo:function(e,f){var i=c(this),o={moveDragger:false,trigger:"external",callbacks:true,scrollInertia:i.data("scrollInertia"),scrollEasing:i.data("scrollEasing")},f=c.extend(o,f),p,g=i.children(".mCustomScrollBox"),k=g.children(".mCSB_container"),r=g.children(".mCSB_scrollTools"),j=r.children(".mCSB_draggerContainer"),h=j.children(".mCSB_dragger"),t=draggerSpeed=f.scrollInertia,q,s,m,l;if(!k.hasClass("mCS_no_scrollbar")){i.data({mCS_trigger:f.trigger});if(i.data("mCS_Init")){f.callbacks=false}if(e||e===0){if(typeof(e)==="number"){if(f.moveDragger){p=e;if(i.data("horizontalScroll")){e=h.position().left*i.data("scrollAmount")}else{e=h.position().top*i.data("scrollAmount")}draggerSpeed=0}else{p=e/i.data("scrollAmount")}}else{if(typeof(e)==="string"){var v;if(e==="top"){v=0}else{if(e==="bottom"&&!i.data("horizontalScroll")){v=k.outerHeight()-g.height()}else{if(e==="left"){v=0}else{if(e==="right"&&i.data("horizontalScroll")){v=k.outerWidth()-g.width()}else{if(e==="first"){v=i.find(".mCSB_container").find(":first")}else{if(e==="last"){v=i.find(".mCSB_container").find(":last")}else{v=i.find(e)}}}}}}if(v.length===1){if(i.data("horizontalScroll")){e=v.position().left}else{e=v.position().top}p=e/i.data("scrollAmount")}else{p=e=v}}}if(i.data("horizontalScroll")){if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.width()-k.outerWidth()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollLeft"));if(!s){q=true}}else{if(p>=j.width()-h.width()){p=j.width()-h.width();e=g.width()-k.outerWidth();clearInterval(i.data("mCSB_buttonScrollRight"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"left",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"left",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&&!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&&k.position().left>=s)){u("onTotalScrollBack")}if(m||(l&&k.position().left<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}else{if(i.data("onTotalScrollBack_Offset")){s=-i.data("onTotalScrollBack_Offset")}if(i.data("onTotalScroll_Offset")){l=g.height()-k.outerHeight()+i.data("onTotalScroll_Offset")}if(p<0){p=e=0;clearInterval(i.data("mCSB_buttonScrollUp"));if(!s){q=true}}else{if(p>=j.height()-h.height()){p=j.height()-h.height();e=g.height()-k.outerHeight();clearInterval(i.data("mCSB_buttonScrollDown"));if(!l){m=true}}else{e=-e}}var n=i.data("snapAmount");if(n){e=Math.round(e/n)*n-i.data("snapOffset")}d.mTweenAxis.call(this,h[0],"top",Math.round(p),draggerSpeed,f.scrollEasing);d.mTweenAxis.call(this,k[0],"top",Math.round(e),t,f.scrollEasing,{onStart:function(){if(f.callbacks&&!i.data("mCS_tweenRunning")){u("onScrollStart")}if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){d.showScrollbar.call(r)}},onUpdate:function(){if(f.callbacks){u("whileScrolling")}},onComplete:function(){if(f.callbacks){u("onScroll");if(q||(s&&k.position().top>=s)){u("onTotalScrollBack")}if(m||(l&&k.position().top<=l)){u("onTotalScroll")}}h.data("preventAction",false);i.data("mCS_tweenRunning",false);if(i.data("autoHideScrollbar")&&!i.data("alwaysShowScrollbar")){if(!g.hasClass("mCS-mouse-over")){d.hideScrollbar.call(r)}}}})}if(i.data("mCS_Init")){i.data({mCS_Init:false})}}}function u(w){if(i.data("mCustomScrollbarIndex")){this.mcs={top:k.position().top,left:k.position().left,draggerTop:h.position().top,draggerLeft:h.position().left,topPct:Math.round((100*Math.abs(k.position().top))/Math.abs(k.outerHeight()-g.height())),leftPct:Math.round((100*Math.abs(k.position().left))/Math.abs(k.outerWidth()-g.width()))};switch(w){case"onScrollStart":i.data("mCS_tweenRunning",true).data("onScrollStart_Callback").call(i,this.mcs);break;case"whileScrolling":i.data("whileScrolling_Callback").call(i,this.mcs);break;case"onScroll":i.data("onScroll_Callback").call(i,this.mcs);break;case"onTotalScrollBack":i.data("onTotalScrollBack_Callback").call(i,this.mcs);break;case"onTotalScroll":i.data("onTotalScroll_Callback").call(i,this.mcs);break}}}},stop:function(){var g=c(this),e=g.children().children(".mCSB_container"),f=g.children().children().children().children(".mCSB_dragger");d.mTweenAxisStop.call(this,e[0]);d.mTweenAxisStop.call(this,f[0])},disable:function(e){var j=c(this),f=j.children(".mCustomScrollBox"),h=f.children(".mCSB_container"),g=f.children(".mCSB_scrollTools"),i=g.children().children(".mCSB_dragger");f.unbind("mousewheel focusin mouseenter mouseleave touchend");h.unbind("touchstart touchmove");if(e){if(j.data("horizontalScroll")){i.add(h).css("left",0)}else{i.add(h).css("top",0)}}g.css("display","none");h.addClass("mCS_no_scrollbar");j.data({bindEvent_mousewheel:false,bindEvent_focusin:false,bindEvent_content_touch:false,bindEvent_autoHideScrollbar:false}).addClass("mCS_disabled")},destroy:function(){var e=c(this);e.removeClass("mCustomScrollbar _mCS_"+e.data("mCustomScrollbarIndex")).addClass("mCS_destroyed").children().children(".mCSB_container").unwrap().children().unwrap().siblings(".mCSB_scrollTools").remove();c(document).unbind("mousemove."+e.data("mCustomScrollbarIndex")+" mouseup."+e.data("mCustomScrollbarIndex")+" MSPointerMove."+e.data("mCustomScrollbarIndex")+" MSPointerUp."+e.data("mCustomScrollbarIndex"));c(window).unbind("resize."+e.data("mCustomScrollbarIndex"))}},d={showScrollbar:function(){this.stop().animate({opacity:1},"fast")},hideScrollbar:function(){this.stop().animate({opacity:0},"fast")},mTweenAxis:function(g,i,h,f,o,y){var y=y||{},v=y.onStart||function(){},p=y.onUpdate||function(){},w=y.onComplete||function(){};var n=t(),l,j=0,r=g.offsetTop,s=g.style;if(i==="left"){r=g.offsetLeft}var m=h-r;q();e();function t(){if(window.performance&&window.performance.now){return window.performance.now()}else{if(window.performance&&window.performance.webkitNow){return window.performance.webkitNow()}else{if(Date.now){return Date.now()}else{return new Date().getTime()}}}}function x(){if(!j){v.call()}j=t()-n;u();if(j>=g._time){g._time=(j>g._time)?j+l-(j-g._time):j+l-1;if(g._time0){g.currVal=k(g._time,r,m,f,o);s[i]=Math.round(g.currVal)+"px"}else{s[i]=h+"px"}p.call()}function e(){l=1000/60;g._time=j+l;_request=(!window.requestAnimationFrame)?function(z){u();return setTimeout(z,0.01)}:window.requestAnimationFrame;g._id=_request(x)}function q(){if(g._id==null){return}if(!window.requestAnimationFrame){clearTimeout(g._id)}else{window.cancelAnimationFrame(g._id)}g._id=null}function k(B,A,F,E,C){switch(C){case"linear":return F*B/E+A;break;case"easeOutQuad":B/=E;return -F*B*(B-2)+A;break;case"easeInOutQuad":B/=E/2;if(B<1){return F/2*B*B+A}B--;return -F/2*(B*(B-2)-1)+A;break;case"easeOutCubic":B/=E;B--;return F*(B*B*B+1)+A;break;case"easeOutQuart":B/=E;B--;return -F*(B*B*B*B-1)+A;break;case"easeOutQuint":B/=E;B--;return F*(B*B*B*B*B+1)+A;break;case"easeOutCirc":B/=E;B--;return F*Math.sqrt(1-B*B)+A;break;case"easeOutSine":return F*Math.sin(B/E*(Math.PI/2))+A;break;case"easeOutExpo":return F*(-Math.pow(2,-10*B/E)+1)+A;break;case"mcsEaseOut":var D=(B/=E)*B,z=D*B;return A+F*(0.499999999999997*z*D+-2.5*D*D+5.5*z+-6.5*D+4*B);break;case"draggerRailEase":B/=E/2;if(B<1){return F/2*B*B*B+A}B-=2;return F/2*(B*B*B+2)+A;break}}},mTweenAxisStop:function(e){if(e._id==null){return}if(!window.requestAnimationFrame){clearTimeout(e._id)}else{window.cancelAnimationFrame(e._id)}e._id=null},rafPolyfill:function(){var f=["ms","moz","webkit","o"],e=f.length;while(--e>-1&&!window.requestAnimationFrame){window.requestAnimationFrame=window[f[e]+"RequestAnimationFrame"];window.cancelAnimationFrame=window[f[e]+"CancelAnimationFrame"]||window[f[e]+"CancelRequestAnimationFrame"]}}};d.rafPolyfill.call();c.support.touch=!!("ontouchstart" in window);c.support.pointer=window.navigator.pointerEnabled;c.support.msPointer=window.navigator.msPointerEnabled;var a=("https:"==document.location.protocol)?"https:":"http:";c.event.special.mousewheel||document.write(' <%= render :partial => 'layouts/googleanalytics' if Rails.env.production? %> diff --git a/config/initializers/redis.rb b/config/initializers/redis.rb deleted file mode 100644 index a109199a..00000000 --- a/config/initializers/redis.rb +++ /dev/null @@ -1,6 +0,0 @@ -if Rails.env.development? ## this also applies to metamaps.cc production mode - $redis = Redis.new(:host => 'localhost', :port=> 6379) -elsif Rails.env.production? ## this is for the heroku staging environment - uri = URI.parse(ENV["REDISTOGO_URL"]) - $redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password) -end \ No newline at end of file diff --git a/config/initializers/uservoice.rb b/config/initializers/uservoice.rb new file mode 100644 index 00000000..e9ff069b --- /dev/null +++ b/config/initializers/uservoice.rb @@ -0,0 +1,9 @@ +require 'uservoice-ruby' + +SSO_KEY = '3f0d5e3bbaff5ea7c95e549f75ebba8c' + +def current_sso_token + @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', SSO_KEY, { + :email => current_user.email + }, 300) # Default expiry time is 5 minutes = 300 seconds +end \ No newline at end of file From 9ba6daec90b111c26c6ae43ee25da9c5415eb70c Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 15:39:11 -0400 Subject: [PATCH 165/600] further fixed uservoice to identify user --- app/assets/javascripts/lib/uservoice.js | 9 +++++++-- app/views/layouts/application.html.erb | 2 +- config/initializers/uservoice.rb | 4 +--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/assets/javascripts/lib/uservoice.js b/app/assets/javascripts/lib/uservoice.js index 7676736d..991beff8 100644 --- a/app/assets/javascripts/lib/uservoice.js +++ b/app/assets/javascripts/lib/uservoice.js @@ -3,7 +3,7 @@ if(USERVOICE == undefined) { USERVOICE = {}; } -USERVOICE.load = function (sso_token) { +USERVOICE.load = function (name, id, email, sso_token) { // Include the UserVoice JavaScript SDK (only needed once on a page) UserVoice=window.UserVoice||[];(function(){var uv=document.createElement('script');uv.type='text/javascript';uv.async=true;uv.src='//widget.uservoice.com/wybK0nSMNuhlWkIKzTyWg.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(uv,s)})(); @@ -21,8 +21,13 @@ UserVoice.push(['set', { // Identify the user and pass traits // To enable, replace sample data with actual user traits and uncomment the line -if (sso_token) { +if (name) { UserVoice.push(['setSSO', sso_token]); + UserVoice.push(['identify', { + 'email': email, // User’s email address + 'name': name, // User’s real name + 'id': id, // Optional: Unique id of the user + }]); } // Add default trigger to the bottom-left corner of the window: diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 1aad2082..b0e0dcca 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -90,7 +90,7 @@ // set up uservoice with signed in user <% if authenticated? %> - USERVOICE.load("<%= current_sso_token %>"); + USERVOICE.load(Metamaps.Active.Mapper.name, Metamaps.Active.Mapper.id, "<%= user.email %>", "<%= current_sso_token %>"); <% else %> USERVOICE.load(); <% end %> diff --git a/config/initializers/uservoice.rb b/config/initializers/uservoice.rb index e9ff069b..3b010613 100644 --- a/config/initializers/uservoice.rb +++ b/config/initializers/uservoice.rb @@ -1,9 +1,7 @@ require 'uservoice-ruby' -SSO_KEY = '3f0d5e3bbaff5ea7c95e549f75ebba8c' - def current_sso_token - @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', SSO_KEY, { + @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', ENV['SSO_KEY'], { :email => current_user.email }, 300) # Default expiry time is 5 minutes = 300 seconds end \ No newline at end of file From 8a70d209d16e126a8a818948ff841e0284056cb7 Mon Sep 17 00:00:00 2001 From: Bashar Jabbour Date: Tue, 7 Oct 2014 16:14:00 -0400 Subject: [PATCH 166/600] fixed the links in noIE lightbox --- app/views/layouts/_lightboxes.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 3cd5f9ce..89dd2ecb 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -150,9 +150,9 @@

      OOPS!
      YOUR BROWSER IS NOT SUPPORTED.

      To view this experience, please upgrade to the latest one of these browsers:

      - - - + Chrome + Firefox + Safari

      While it's downloading, explore our blog,
      watch the tutorials, or visit our knowledge base!

      From 629a6a4172fe2bbdc105be8b34698eff4cf39054 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 17:46:09 -0400 Subject: [PATCH 167/600] fixed sign in redirects --- app/controllers/application_controller.rb | 12 +++++------ app/controllers/registrations_controller.rb | 20 +++++++++---------- app/controllers/users/passwords_controller.rb | 6 ++++++ .../users/registrations_controller.rb | 10 ++++++++++ app/views/layouts/_account.html.erb | 4 +++- app/views/layouts/_upperelements.html.erb | 2 ++ config/initializers/uservoice.rb | 10 +++++++--- config/routes.rb | 15 +++++++------- 8 files changed, 51 insertions(+), 28 deletions(-) create mode 100644 app/controllers/users/passwords_controller.rb create mode 100644 app/controllers/users/registrations_controller.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index a29a2360..f9cef729 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -8,12 +8,12 @@ class ApplicationController < ActionController::Base helper_method :authenticated? helper_method :admin? - after_filter :store_location - - def store_location - # store last url - this is needed for post-login redirect to whatever the user last visited. - if (!request.fullpath.match("/users/") && !request.xhr?) # don't store ajax calls - session[:previous_url] = request.fullpath + def after_sign_in_path_for(resource) + sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http') + if request.referer == sign_in_url + super + else + stored_location_for(resource) || request.referer || root_path end end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb index 7062ead0..0f0be9ba 100644 --- a/app/controllers/registrations_controller.rb +++ b/app/controllers/registrations_controller.rb @@ -1,12 +1,10 @@ -class RegistrationsController < Devise::RegistrationsController +class Users::RegistrationsController < Devise::RegistrationsController protected - - def after_sign_in_path_for(resource) - session[:previous_url] || root_path - end - - def after_sign_up_path_for(resource) - root_path - end - -end + def after_sign_up_path_for(resource) + signed_in_root_path(resource) + end + + def after_update_path_for(resource) + signed_in_root_path(resource) + end +end \ No newline at end of file diff --git a/app/controllers/users/passwords_controller.rb b/app/controllers/users/passwords_controller.rb new file mode 100644 index 00000000..d1405f6a --- /dev/null +++ b/app/controllers/users/passwords_controller.rb @@ -0,0 +1,6 @@ +class Users::PasswordsController < Devise::PasswordsController + protected + def after_resetting_password_path_for(resource) + signed_in_root_path(resource) + end +end \ No newline at end of file diff --git a/app/controllers/users/registrations_controller.rb b/app/controllers/users/registrations_controller.rb new file mode 100644 index 00000000..5fff2f1c --- /dev/null +++ b/app/controllers/users/registrations_controller.rb @@ -0,0 +1,10 @@ +class Users::RegistrationsController < Devise::RegistrationsController + protected + def after_sign_up_path_for(resource) + signed_in_root_path(resource) + end + + def after_update_path_for(resource) + signed_in_root_path(resource) + end +end diff --git a/app/views/layouts/_account.html.erb b/app/views/layouts/_account.html.erb index 0cee5c7f..ffe69b7e 100644 --- a/app/views/layouts/_account.html.erb +++ b/app/views/layouts/_account.html.erb @@ -24,7 +24,7 @@
    • - <%= link_to "Sign Out", "/sign_out", id: "Logout", :data => { :bypass => 'true'} %> + <%= link_to "Sign Out", "/logout", id: "Logout", :data => { :bypass => 'true'} %>
    <% else %> @@ -53,3 +53,5 @@
    \ No newline at end of file diff --git a/config/initializers/uservoice.rb b/config/initializers/uservoice.rb index 3b010613..32fdf9e9 100644 --- a/config/initializers/uservoice.rb +++ b/config/initializers/uservoice.rb @@ -1,7 +1,11 @@ require 'uservoice-ruby' def current_sso_token - @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', ENV['SSO_KEY'], { - :email => current_user.email - }, 300) # Default expiry time is 5 minutes = 300 seconds + if ENV['SSO_KEY'] + @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', ENV['SSO_KEY'], { + :email => current_user.email + }, 300) # Default expiry time is 5 minutes = 300 seconds + else + @current_sso_token = '' + end end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index ef03d2e8..4a525575 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,10 +1,6 @@ Metamaps::Application.routes.draw do root to: 'main#home', via: :get - - devise_scope :user do - get "join" => "devise/registrations#new" - end match 'request', to: 'main#requestinvite', via: :get, as: :request @@ -31,10 +27,15 @@ Metamaps::Application.routes.draw do match 'maps/:id/embed', to: 'maps#embed', via: :get, as: :embed match 'maps/:id/contains', to: 'maps#contains', via: :get, as: :contains - devise_for :users, :controllers => { :registrations => "registrations" }, :path_names => { :sign_in => 'login', :sign_out => 'logout' } - devise_scope :user do - get "sign_out", :to => "devise/sessions#destroy" + devise_for :users, controllers: { registrations: 'users/registrations', passwords: 'users/passwords', sessions: 'devise/sessions' }, :skip => [:sessions] + + devise_scope :user do + get 'login' => 'devise/sessions#new', :as => :new_user_session + post 'login' => 'devise/sessions#create', :as => :user_session + get 'logout' => 'devise/sessions#destroy', :as => :destroy_user_session + get 'join' => 'devise/registrations#new', :as => :new_user_registration end + match 'user/updatemetacodes', to: 'users#updatemetacodes', via: :post, as: :updatemetacodes resources :users, except: [:index, :destroy] end From d4c481aac069643881612ae39e08ee7c5699934e Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 17:57:12 -0400 Subject: [PATCH 168/600] internet explorer get browser links open in new tabs --- app/views/layouts/_lightboxes.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 89dd2ecb..1cf1681e 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -150,9 +150,9 @@

    OOPS!
    YOUR BROWSER IS NOT SUPPORTED.

    To view this experience, please upgrade to the latest one of these browsers:

    - Chrome - Firefox - Safari + Chrome + Firefox + Safari

    While it's downloading, explore our blog,
    watch the tutorials, or visit our knowledge base!

    From 9a250d0034093bc4006c7ffd8bd4fcb5903d9b51 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 18:38:33 -0400 Subject: [PATCH 169/600] got redirect for single sign on with uservoice working --- app/controllers/application_controller.rb | 3 +++ config/initializers/uservoice.rb | 10 +++------- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f9cef729..f5a93bd9 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -10,8 +10,11 @@ class ApplicationController < ActionController::Base def after_sign_in_path_for(resource) sign_in_url = url_for(:action => 'new', :controller => 'sessions', :only_path => false, :protocol => 'http') + if request.referer == sign_in_url super + elsif params[:uv_login] == "1" + "https://support.metamaps.cc/login_success?sso=" + current_sso_token else stored_location_for(resource) || request.referer || root_path end diff --git a/config/initializers/uservoice.rb b/config/initializers/uservoice.rb index 32fdf9e9..3a303174 100644 --- a/config/initializers/uservoice.rb +++ b/config/initializers/uservoice.rb @@ -1,11 +1,7 @@ require 'uservoice-ruby' def current_sso_token - if ENV['SSO_KEY'] - @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', ENV['SSO_KEY'], { - :email => current_user.email - }, 300) # Default expiry time is 5 minutes = 300 seconds - else - @current_sso_token = '' - end + @current_sso_token ||= UserVoice.generate_sso_token('metamapscc', ENV['SSO_KEY'], { + :email => current_user.email + }, 300) # Default expiry time is 5 minutes = 300 seconds end \ No newline at end of file From a8d173ff1d16111534060c5e0c768d72caa4c5d8 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 18:49:14 -0400 Subject: [PATCH 170/600] made http protocol for uservoice redirect consistent --- app/controllers/application_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index f5a93bd9..bd95bd64 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -14,7 +14,7 @@ class ApplicationController < ActionController::Base if request.referer == sign_in_url super elsif params[:uv_login] == "1" - "https://support.metamaps.cc/login_success?sso=" + current_sso_token + "http://support.metamaps.cc/login_success?sso=" + current_sso_token else stored_location_for(resource) || request.referer || root_path end From f7f17a29081324fa3f7c9b02d17df636827642d1 Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Tue, 7 Oct 2014 19:00:55 -0400 Subject: [PATCH 171/600] added sidekiq gem and a route to /sidekiq (commented) for devel --- Gemfile | 9 +++++++-- config/routes.rb | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f720116a..01dee73b 100644 --- a/Gemfile +++ b/Gemfile @@ -7,7 +7,7 @@ gem 'rails', '3.2.17' # gem 'rails', :git => 'git://github.com/rails/rails.git' #gem 'watir' -#gem 'phantomjs' +gem 'phantomjs' gem 'devise' gem 'redis', '2.2.2' @@ -17,9 +17,13 @@ gem 'formula' gem 'formtastic' gem 'json' gem 'rails3-jquery-autocomplete' -gem 'best_in_place' +gem 'best_in_place' #in-place editing gem 'kaminari' # pagination +gem 'sidekiq' # worker processes +gem 'sinatra', require: false +gem 'slim' + gem 'paperclip' gem 'aws-sdk' @@ -58,3 +62,4 @@ gem 'jquery-rails', '2.1.2' # To use debugger # gem 'ruby-debug19', :require => 'ruby-debug' + diff --git a/config/routes.rb b/config/routes.rb index ef03d2e8..ee0bd224 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,10 @@ +require 'sidekiq/web' + Metamaps::Application.routes.draw do root to: 'main#home', via: :get + + mount Sidekiq::Web, at: '/sidekiq' devise_scope :user do get "join" => "devise/registrations#new" From c5601686c21a3c3aa1d04b8b128ad0d1749290ee Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Tue, 7 Oct 2014 19:01:41 -0400 Subject: [PATCH 172/600] actually commented sidekiq route --- config/routes.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/routes.rb b/config/routes.rb index ee0bd224..81749181 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -4,7 +4,8 @@ Metamaps::Application.routes.draw do root to: 'main#home', via: :get - mount Sidekiq::Web, at: '/sidekiq' + #To debug sidekiq and monitor processes, enable this route + #mount Sidekiq::Web, at: '/sidekiq' devise_scope :user do get "join" => "devise/registrations#new" From c6c05085adc9cec178c421cb681f9b7675a37b4d Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Tue, 7 Oct 2014 19:11:55 -0400 Subject: [PATCH 173/600] Added phantomjs script to save an image - this doesn't totally work yet, it has a error with famous Added worker process to call the phantomjs script in app/workers Added hook in models/map.rb to call the worker Added calls to map.touch in mappings_controller.rb so it would get triggered correctly - I'm not sure how this will proceed moving forward --- app/controllers/mappings_controller.rb | 10 ++++- app/models/map.rb | 15 ++++++- app/workers/grab_map_screenshot_worker.rb | 10 +++++ script/phantomjs-save-screenshot.js | 54 +++++++++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 app/workers/grab_map_screenshot_worker.rb create mode 100755 script/phantomjs-save-screenshot.js diff --git a/app/controllers/mappings_controller.rb b/app/controllers/mappings_controller.rb index 97225fa6..b28c7638 100644 --- a/app/controllers/mappings_controller.rb +++ b/app/controllers/mappings_controller.rb @@ -15,6 +15,8 @@ class MappingsController < ApplicationController def create @mapping = Mapping.new(params[:mapping]) + @mapping.map.touch(:updated_at) + if @mapping.save render json: @mapping, status: :created else @@ -26,6 +28,8 @@ class MappingsController < ApplicationController def update @mapping = Mapping.find(params[:id]) + @mapping.map.touch(:updated_at) + if @mapping.update_attributes(params[:mapping]) head :no_content else @@ -36,8 +40,12 @@ class MappingsController < ApplicationController # DELETE /mappings/1.json def destroy @mapping = Mapping.find(params[:id]) + @map = @mapping.map + @mapping.destroy + @map.touch(:updated_at) + head :no_content end -end \ No newline at end of file +end diff --git a/app/models/map.rb b/app/models/map.rb index 1c3728e1..87fb358d 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -8,6 +8,8 @@ class Map < ActiveRecord::Base has_many :topics, :through => :topicmappings has_many :synapses, :through => :synapsemappings + after_touch :save_screenshot + # This method associates the attribute ":image" with a file attachment has_attached_file :screenshot, :styles => { :thumb => ['188x126#', :png], @@ -76,7 +78,7 @@ class Map < ActiveRecord::Base json[:updated_at] = self.updated_at_str json end - + ##### PERMISSIONS ###### # returns false if user not allowed to 'show' Topic, Synapse, or Map @@ -105,4 +107,15 @@ class Map < ActiveRecord::Base return true end + def save_screenshot + # TODO - this will grab a map every single frickin' time a map is touched + # we need a system to throttle the amount to 1/hour or something like that + # maybe have a flag - last time this map was screenshotted + # don't update if it was less than an hour ago + # except this has the issue of a user updating map 7x, and it only screenshotting after + # the first time. We only want it to screenhsot the 7th time. + # We need to store a timestamp somewhere and do processing every hour, I think. + GrabMapScreenshotWorker.perform_async(self.id) + end + end diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb new file mode 100644 index 00000000..ed9b2709 --- /dev/null +++ b/app/workers/grab_map_screenshot_worker.rb @@ -0,0 +1,10 @@ +# app/workers/grab_map_screenshot_worker.rb +class GrabMapScreenshotWorker + include Sidekiq::Worker + + def perform(map_id) + Phantomjs.run('./script/phantomjs-save-screenshot.js', map_id.to_s) { |line| + puts line + } + end +end diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js new file mode 100755 index 00000000..9fe0f4c7 --- /dev/null +++ b/script/phantomjs-save-screenshot.js @@ -0,0 +1,54 @@ +//parse arguments passed from command line (or more likely, from rails) +var system = require('system'); +var args = system.args; +if (args.length <= 1) { + phantom.exit(); + throw new Error("no arguments supplied on command line"); +}//if + +//configurable variables - CHANGE ME +var mapID = args[1]; +var url = 'http://localhost:3000/maps/' + mapID; +var width = 400; +var height = 400; +var thumbsDirRelative = 'app/assets/images/map_thumbnails'; + +//set up writing to filesystem +var fs = require('fs'); +var thumbsDirectory = fs.workingDirectory + '/' + thumbsDirRelative; +if (!fs.isDirectory(thumbsDirectory)) { + fs.makeDirectory(thumbsDirectory); +}//if + +//set up page and the area we'll render as a PNG +var page = require('webpage').create(); +page.viewportSize = { + width: width, + height: height +}; +page.clipRect = { + top: 32, + left: 32, + width: width - 32, + height: height - 32 +}; +page.open(url, function (status) { + if (status === 'success') { + //since this isn't evaluateAsync, it should also ensure the asynchronous + //js stuff is loaded too, hopefully? + page.evaluate(function() { + $(document).ready(function(){ + $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, #barometer_tab, .footer').hide(); + });//document.ready + });//page.evaluate + + //render page into map_thumbnails directory + var filename = thumbsDirectory + '/map' + mapID + '.png'; + page.render(filename, 'PNG'); + + } else { + //failed to load + }//if + + phantom.exit(); +}); From db3a4b66addfc3a563dc08c91cae610255b31e7f Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 19:14:25 -0400 Subject: [PATCH 174/600] fixed issue that others might end up having with sso_key --- app/controllers/sessions_controller.rb | 47 -------------------------- app/helpers/sessions_helper.rb | 2 -- app/views/layouts/application.html.erb | 2 +- 3 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 app/controllers/sessions_controller.rb delete mode 100644 app/helpers/sessions_helper.rb diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb deleted file mode 100644 index 0b4eb3ad..00000000 --- a/app/controllers/sessions_controller.rb +++ /dev/null @@ -1,47 +0,0 @@ -class SessionsController < ApplicationController - - before_filter :require_no_user, only: [:new, :create] - before_filter :require_user, only: [:destroy] - - respond_to :html, :json - - def show - end - - # GET /session/new - def new - @session = Session.new - - - respond_with(@session) - end - - # POST /session - def create - @session = Session.create(params[:session]) - - @user = User.new - - @topic = Topic.exists?(260) - - if @topic - respond_with(@user, @session, location: topic_url(260)) do |format| - end - else - respond_with(@user, @session, location: root_url) do |format| - end - end - end - - # DELETE /session - def destroy - @session = Session.find - @session.destroy - - respond_to do |format| - format.html { respond_with(@session, location: restore(default: root_path)) } - end - - end - -end diff --git a/app/helpers/sessions_helper.rb b/app/helpers/sessions_helper.rb deleted file mode 100644 index 309f8b2e..00000000 --- a/app/helpers/sessions_helper.rb +++ /dev/null @@ -1,2 +0,0 @@ -module SessionsHelper -end diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index b0e0dcca..3e56695e 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -89,7 +89,7 @@ Metamaps.Loading.loader.show(); // Hidden by default // set up uservoice with signed in user - <% if authenticated? %> + <% if authenticated? && ENV['SSO_KEY'] %> USERVOICE.load(Metamaps.Active.Mapper.name, Metamaps.Active.Mapper.id, "<%= user.email %>", "<%= current_sso_token %>"); <% else %> USERVOICE.load(); From 68e1a8042a99926fbb18c7e4c3e16d61987258ed Mon Sep 17 00:00:00 2001 From: Devin Howard Date: Tue, 7 Oct 2014 20:25:45 -0400 Subject: [PATCH 175/600] Added animationDone event to Metamaps.JIT.js, tried to hook into it from phantomjs, failed still have debugging stuff in this commit. it's currently rendering the image so I can check output It doesn't seem to be responding to the event, and it's stopped hiding the UI elements around the edge --- app/assets/javascripts/src/Metamaps.JIT.js | 4 ++- app/workers/grab_map_screenshot_worker.rb | 7 ++++ script/phantomjs-save-screenshot.js | 39 +++++++++------------- 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index 3c5b79c9..3075f0cb 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -3,6 +3,7 @@ Metamaps.JIT = { mouseMove: 'Metamaps:JIT:events:mouseMove', pan: 'Metamaps:JIT:events:pan', zoom: 'Metamaps:JIT:events:zoom' + animationDone: 'Metamaps:JIT:events:animationDone', }, vizData: [], // contains the visualization-compatible graph /** @@ -211,6 +212,7 @@ Metamaps.JIT = { duration: 800, onComplete: function () { Metamaps.Visualize.mGraph.busy = false; + $(document).trigger(Metamaps.JIT.events.animationDone, [event]); } }, animateFDLayout: { @@ -1675,4 +1677,4 @@ Metamaps.JIT = { }); } } -}; \ No newline at end of file +}; diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index ed9b2709..730d4a7d 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -3,8 +3,15 @@ class GrabMapScreenshotWorker include Sidekiq::Worker def perform(map_id) + imgBase64 = '' Phantomjs.run('./script/phantomjs-save-screenshot.js', map_id.to_s) { |line| + imgBase64 << line puts line } + + #this doesn't work yet + #map = Map.find(map_id) + #map.add_attachment(imgBase64) + #map.save! end end diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index 9fe0f4c7..f79a894e 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -9,16 +9,8 @@ if (args.length <= 1) { //configurable variables - CHANGE ME var mapID = args[1]; var url = 'http://localhost:3000/maps/' + mapID; -var width = 400; -var height = 400; -var thumbsDirRelative = 'app/assets/images/map_thumbnails'; - -//set up writing to filesystem -var fs = require('fs'); -var thumbsDirectory = fs.workingDirectory + '/' + thumbsDirRelative; -if (!fs.isDirectory(thumbsDirectory)) { - fs.makeDirectory(thumbsDirectory); -}//if +var width = 188; +var height = 126; //set up page and the area we'll render as a PNG var page = require('webpage').create(); @@ -26,29 +18,30 @@ page.viewportSize = { width: width, height: height }; -page.clipRect = { - top: 32, - left: 32, - width: width - 32, - height: height - 32 -}; + page.open(url, function (status) { if (status === 'success') { //since this isn't evaluateAsync, it should also ensure the asynchronous //js stuff is loaded too, hopefully? page.evaluate(function() { - $(document).ready(function(){ - $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, #barometer_tab, .footer').hide(); - });//document.ready + $(document).on(Metamaps.JIT.events.animationDone, function(){ + $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, #barometer_tab').hide(); + Metamaps.Famous.logo.hide() + Metamaps.JIT.zoomExtents(); + console.log('got here'); + });//document.on animationDone });//page.evaluate - //render page into map_thumbnails directory - var filename = thumbsDirectory + '/map' + mapID + '.png'; - page.render(filename, 'PNG'); + //pass to ruby + //console.log(page.renderBase64('PNG')); + + //render to the metamaps_gen002 directory for debug + page.render('map1.png', 'PNG'); } else { //failed to load }//if - phantom.exit(); + setTimeout(phantom.exit,5000); + //phantom.exit(); }); From 84d926149cb8c0b32a0cbb0d0d3ebde20d6c150a Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 7 Oct 2014 21:30:25 -0400 Subject: [PATCH 176/600] removed barometer.js --- Gemfile.lock | 25 +++++++++++++++++++++++++ app/assets/barometer.js | 32 -------------------------------- 2 files changed, 25 insertions(+), 32 deletions(-) delete mode 100644 app/assets/barometer.js diff --git a/Gemfile.lock b/Gemfile.lock index 1fc7e6af..3c159ef2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -39,6 +39,7 @@ GEM rails (~> 3.1) builder (3.0.4) cancan (1.6.10) + celluloid (0.10.0) climate_control (0.0.3) activesupport (>= 3.0) cocaine (0.5.4) @@ -50,6 +51,7 @@ GEM coffee-script-source execjs coffee-script-source (1.7.0) + connection_pool (0.9.3) devise (3.2.4) bcrypt (~> 3.0) orm_adapter (~> 0.1) @@ -94,10 +96,13 @@ GEM mime-types pg (0.17.1) pg (0.17.1-x86-mingw32) + phantomjs (1.9.7.1) polyglot (0.3.4) rack (1.4.5) rack-cache (1.2) rack (>= 0.4) + rack-protection (1.5.3) + rack rack-ssl (1.3.4) rack rack-test (0.6.2) @@ -123,16 +128,32 @@ GEM rdoc (3.12.2) json (~> 1.4) redis (2.2.2) + redis-namespace (1.1.1) + redis (< 3.0.0) sass (3.3.7) sass-rails (3.2.6) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) + sidekiq (1.2.1) + celluloid (~> 0.10.0) + connection_pool (~> 0.9.0) + multi_json (~> 1) + redis + redis-namespace + sinatra (1.4.5) + rack (~> 1.4) + rack-protection (~> 1.4) + tilt (~> 1.3, >= 1.3.4) + slim (2.0.3) + temple (~> 0.6.6) + tilt (>= 1.3.3, < 2.1) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) + temple (0.6.8) thor (0.19.1) thread_safe (0.3.3) tilt (1.4.1) @@ -168,9 +189,13 @@ DEPENDENCIES kaminari paperclip pg + phantomjs rails (= 3.2.17) rails3-jquery-autocomplete redis (= 2.2.2) sass-rails + sidekiq + sinatra + slim uglifier (>= 1.0.3) uservoice-ruby diff --git a/app/assets/barometer.js b/app/assets/barometer.js deleted file mode 100644 index 30b1451e..00000000 --- a/app/assets/barometer.js +++ /dev/null @@ -1,32 +0,0 @@ -var BAROMETER; -if(BAROMETER == undefined) { - BAROMETER = {}; -} - -//BAROMETER.load = function(barometer_id) { - this.barometer_id = barometer_id; - this.empty_url = "http://getbarometer.s3.amazonaws.com/assets/barometer/images/transparent.gif"; - this.feedback_url = 'http://getbarometer.com/system/feedback_form/' + this.barometer_id; - - this.tab_html = 'Feedback'; - this.overlay_html = ''; - - document.write(this.tab_html); - document.write(this.overlay_html); -}; - -BAROMETER.show = function() { - document.getElementById('barometer_iframe').setAttribute("src", this.feedback_url); - document.getElementById('barometer_overlay').style.display = "block"; - return false; -}; \ No newline at end of file From cde771e007a112a78657321b9df87cfd4f9261db Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 00:07:54 -0400 Subject: [PATCH 177/600] got map screenshot working decent --- Procfile | 2 + app/assets/images/missing-map.png | Bin 0 -> 16291 bytes .../javascripts/src/Metamaps.Backbone.js | 1 + app/assets/javascripts/src/Metamaps.JIT.js | 4 +- app/models/map.rb | 26 +++- app/views/layouts/_templates.html.erb | 4 +- app/workers/grab_map_screenshot_worker.rb | 8 +- diff.txt | 130 ------------------ script/phantomjs-save-screenshot.js | 35 ++--- 9 files changed, 51 insertions(+), 159 deletions(-) create mode 100644 Procfile create mode 100644 app/assets/images/missing-map.png delete mode 100644 diff.txt diff --git a/Procfile b/Procfile new file mode 100644 index 00000000..3a5d09e8 --- /dev/null +++ b/Procfile @@ -0,0 +1,2 @@ +web: bundle exec rails server -p $PORT +worker: bundle exec sidekiq -c 5 -v \ No newline at end of file diff --git a/app/assets/images/missing-map.png b/app/assets/images/missing-map.png new file mode 100644 index 0000000000000000000000000000000000000000..5a51221ac597958e5837fda2746dcc22ffa2d4ec GIT binary patch literal 16291 zcmV;UKU~0xP)m|DXEn?p5@uyb^~PfQI>iKm>ynhag40Ouc04 zO5zZM!Qq3sx&7b&=l=%t%fEu*QwU+bQ?b_4!^MZe1HZfL*z_NPj?epGy1qC2wl#-i zYuc_eg>z<8*XCo>n7Xd$XZ`%UuSt+A6Xfd9=a1J)&&SGVxfMQh{Tn+T`-)%xS(?Ag z*OQm7ec*K=0p3TDN5CJB=Fiv8eD3$=7=d3Fh52i{F(LjPH@K=QQAX z4~rk4SLhDotSO4(@r6q04+-Fc`_a>b{UH$!*{;5cP+|-i)EEdZ~P?r(h z+s%doM_B$qp0^=arisBU{CWJ%Df-urOJ?p&`u=XNP58Ha^IB7oy8$bLA3(0FGQQQu zG@C}U6G7gdeRzPrh?d`ELFlT$&(9+R{o7@1{%z@(+=cK8$Uo%Ohb(iW853CXIs#h( zH>MOBdvJ9anB!~Ku)_I!%z^)}_Er8qz=ziu`Za=B0W?yTIq2v4@I05Uzt`W{2ajVB z>~^}3yiHW}oV@(+2K`S2tzqsH-{8*BLja#!Z3X_s@6W&M>+xDV_YR9}XF2$_c8r%^ z@PC6ocjwawZN z!H#T=R|_AEn)1w=8{-FWhJN7uec|H6P6|@tjE|o$oHc{gw{UU(Wk9d#vkd6t{hL)K z6B%U+!0>dde;eQjfZhv84byjBwtFEf)3sfE^z?63Y0EnPwJJ_Pf9@RLjs|>b+rC61 zdQqD4=RtqQs#|N$Zqq4U(*g5PZB8PAatS=~=52Yrh`j?Q-D165uC^fp-CY^3}g} zWv+OSGnJdQt^TDveV(ZyphmERK72faN!bzjK`q#BYqPIGUv0(q>DfCqJWw?CM#uOnG>G>8Dau-ZOU0(x{!9n3z0 zAD{=d*jCY^1Ms1Y);}(s!-3wfkY*Ci?fWpMKG9)?Ux&%{eA3A-eZZ_4<)?vfe;o8D zZp*1vfAr#vDZDc-$jacKF7Pcv9C(-bfT4y7T?Kd(v2%hQ`cqOJWA&4tWL@N zCPOyMFx`}ne34;#3Fz}w<9ELL_2qr(?aWeuBOO-X-(CzqA9i_iMws-u_R+F;JzIEK z@j$+OpB~=#@ihZ2h^}wr0&uhdVEGZ)R!vD%V;ma-S@g!@Jo@-PXeL3UNgKa+l{c=6 ze~aLbtHm7qfj%FA|HpP~w$X2@ZIyamSM}>Jz275g8m9um9SNjx~?buESl=wm$~?g;e9zYncK6MjuSAGyLHJEp-tL_|AE40H=!I%f+J4 z(!vTEmG|6dnZ*DxBNd<+xL4M5Hf-*Evr1~gHL z$#t=GEwL-OqfL4Ky6HK46JLwnV}EGP=WZWAe=uzXeTnx)V+s}&EPdf#3wrwi1b?u& zcoXR7mC}>!!Ah9~t?K~rxY=C{`r7!wcS-|Buvg6{TGWO>L^oW@^h<@CaFUToj?)Cp z>O8sGIptsEzjr;kA721q{C6D#(9$)gsTxz4bvl;0o5jYP1JFW%nv>6vrZmE-uj@MH z`tf@xDERmtJ+*M9VysI&ws`b?V?3lokk*`6ZhzuyDZtH1b=%1B9~kbVphMao>qxM3$wYU1;og9rucyW}LGv^?AI|xmOm80-!g67a4qfxH#y# z+BP*U0xD>g#dLwb3eeXss`+!z!~xg3E%pJxe{bo}0eY#w@+sGq3q8nUARF@ewTr;t znf9=!oA1ibY=%JTI~6rb7Jm->d1W&PKSE6ejuF7S%qH%5B^JGPCp+9K!R)zg&ACAL8n-2TPFUCxpB){Pw_5Zy0*R|?B3^(G_XZVC z{2T#7t<;h|!A`)H%h63)YR;G}P*Eh%j1Yl7?k4~J^=Up22MQ{Ozy86M)CjC#H65sw z0`7DD*fs=m1hS-1wy8N_&9f+(rL#Gp5T^`X+#M|QZd?hUCINr)h}QttKg3v}pqxK1 z8Z0O*bo`BWx(oh%$O}!m@w&xgUwYqbE%Gdxu$G$>ZrmZtZ^6EBVIFOxyO^#_2?4g4 zoX%_LXXLEurpM>tW|!H`z7)_J<)SCRXFM4!s*bg2c5ycWur@_yx++@K_z3wKizP-t z`hjDJpO5#zqM$%kcAHU751%<&Y${NB_~jAsT^pY^5a5e=esI~4i?^Aj5BaBCz7|SD zhGln>^(jO>VSet(7)UKa7onBl`KEidxMP};K21qAEARV#vFw?C{kJp(o2=leEAtb~ zJI%BtaD5m8_s|ci5Ja350a_{Pz_Ww#Bj}^aHn#Uv-SyE= z_wsorYu-rWNbtK0Ztzw%WmC{C;4`qFBdF2Bj<4;7)|p4s%!Lg8O4vu=3ZuM+SQHaz6H@R3@xE$zhQ1T9ZqYvls#1Al7Bl zY^?yDWpCKpfe6-`_PCEAI5Ha&6ox*SI)2Va)zA%VqNS(Y_n9;%zqcjOFug#6RJ{Ly z)arp27U$WE_&dukS|26a0I+1;Z}eII}E!wM@~Q5=;FlnQM5w@eHQ`WnWn8NU`5b?s_dWL zm)XVR#_@F9t?8Sd3<0@#NZ*R!E2lq4L<|JXmXZLU|NLV*yhjB62L;jAY#i^D_6inc zO6wwJOY(&AefO>T{M-}44)5Fd8*Lqkk4moJ_pZ*fu{X~Sm6r}E{J=qmxwTO+ONUWN zx{Dz-l6*&9WqIs@tmW6&-h4%?2hbA*ppIZ`J|fsEVl&oNP1R1_W$Z#Ara;gP6G&!Y zPGSdXkGuHzB8!gT)Y>`*;Q&1^RLccrP%5LPwvxz+?}c4Jj#HJ44e@kf>34MORI!bg z_0Swh+8b$2fPWjUHf3?LRA~y*09BIkmEd{CA`f2+|nlkw89L9i`7gC#)jzKdXI$kgbf1m}@RxJU( zAGRs}LA}6QH#vXe_rp5lc!k!`qXsfCheu)IW+JZP3~hsI8Ys>o#T$2yBjOY404s=J zbU2o5K*YCq^IFG^!ELw#__wBC%Xb6(RVOHZyl%NB@0-m6J3O!z@1rI9j9|z24n@!C z($t%RgW(G9K~0$sBA5Z7-O!QS0#}AZR!jaYXu`<;9FFkk5pxs-bS4)# zT0kzoFD&y1tg@sZP2O54I}*SM-=6|R&jDf~3vv=LYx8jGp&hRh4n26yfH5C`^N+tw zwP`5pQ*U`!AW)H>X8dfaD=Y?`$#s@A?Tce*CGRL^d{ zKv{N%tcdp~D>*1JOo&>r?w{yXI`#y`db2eZ8a629$38Ln$ReJqvU=op44lP5fOCr~t-C3k48?xYkOB|V5tODO`an+Q03$M4id;!3TNMLJNX3JXhV2#GQg z%w(YhU}eq6>}7#l>xqs))?0R#zyA7*7M#X8Sa65|Py>LU-zyQWVt40MaX}Xo*A;M{ zI1fB`8v|D&%~9Qe7g*CYQZ07Z7pz`rT%X3L4_EqGw*r5XX;P~`p&0P@LAK%Ke(a9~ zsJgJC5X^1{wqc?iWT{Vp&1+$-;|{1c2A=!qzU=m2#B;|D-_#%R<}zJ?fy7%ny%(&z z6VN+u`74Ve1)WxQsxqZv4echSFQeu3lN~JQJf+5SYE039I=Ve^$LXb@M^pw0xYe)5 z?lK8Xk-EkBpXjD=Y!i3Ck1c&KN(pXr`9E361-Vjy4KH3CgI1t5lSHZHvb?$$a0%?! zQWS2%(eD&{%B;OrA*9U8>s%)UmjL`>zo(lEu#|Pl7SC~B8L2_Ca%ACMBD&GkkUfBY zpkT6X@o%>D;Ku{heG}r1A85CrBAV6L-CR3~rIi#7@UE%4JK;aWw^YmDf%z<)c?U$e58to@_{DFGZ=>G%i(NMYcs zL_paf-uPHSbXi8oi;F>3+V;rJ99^3%KC+~6X%GYUJ>GNR3Mb*$Nx`h5W^d&Kr3z~< z5t52mQ)Z}}omVQlNe_V+(i;W26i`OjEgs{(?df$Nalv()+H7ejOH48gR}6;iquiwWz}$zm*=JFjv70EPJ8?959+Z*KtYS`7iYVwlY` zJo@E?E5nxDP@oEHs8!Eog-tdPEqJb=(%x;DIVtZ23pWfE0UcnfWspLxY0iSvhHk>7 zbg9zJv;{Nq(-$=-ZC-znK4244YvMuDhF_Rr6?ddV$FyXkH}p;XUuCv^bU!xIUMPVp z?SQnP+xVJj@l{b7@lX6)h14k)02Y=Fr-o>@%epK8w)tGEm9!h|6O3xPwnerpoXoXC zrDkUF(-th;l)@n!gWnaD(I{xl4VTI*E%%F+Qe7r5fg+_R0rFZ(_Us!ltyq8yi>{WG zQ*`Xp)7C#Hj%6;w{2~SumdAG5+*oRXt(U^ko^tPdYAftgFx|xkd!Y8kKDvFL7hNKw z@uK67E!5;df!Oe(&>%KlgZO@aD(|hDnp%N!XN0E`;8&LRxD_{HVaEw;So*N?YP@IB zELnIS9cjrza;8Oc6wlZU zF&Lf)*;$}8GEP?vT(7n86EW#|{BQ#LF?PB;kPS~<4E9cIZ?j6Q5%mNVchIOYK#GGh zCd`ObMFTvs&v+yU5my?7#o5vKL1a0CIYjGMN?Nld>TH!7wi)bU?3RMn1;8hkdd%7c z0jYB5=_%qerQIShkuA?mdFh@~D-BnL;NLplvGL{E1w16SC*EOfSR+( zdZH@2*~XjQREfKyHxKRs075}ssa07=N@G?mTM4BFR3|AgEGGGO9bsQ)dNn~hqtM)) z+!JXU$t|^$CKPjK%nltt7NJy?N%llsA(x~+3R+x)rGCW-(2i1(x|6VKLN|iG?o35$ zYn-9cG^kp5D!v_=cWo>`UYxRPScM7w zSbj#MHvD(YZjCn^xp~Uk2+<3odg|x0@_~(>EC;h-+BWe9W7aEmGnHkgKH#PYJ^}4q zhdzwfTJH=13t$Rw=*0iml%XmhOAoN_ELs&!*&fS4Zw0&^b$u~!A5;SzPua(X+ifvBlri^$k8l` z#t%t8#EyY&!L(&7ZkLz%LU%GN0k{(;WL{9Sk`B!oohjKNK{Kf?)YaIQxN!Y%m2sK? z`zq_c-dA~(xao~OwBgob!UGE{1Z{BWC=H2>3|ad!`m+(d4g6WL#A$GX3a%nYk07hd2HWxPWQ;Z$0lf)Uste0RoPf;r1x$N&JLzMAw8K)(+J(3zk zE}m$UKvWZIO1tu6RIZGb9Z*4Bkk)1+)nryY&Q#unsflYsRar@eQd~3VIz3{|pX9n+ z1$v)11mEP~T-po56$@cmzc^g8Bo_2{f~4P2Nra`gLj*6C<^wAm;DPLgSYjrJl^obQ z&btp@xZ#N=T!^#>?-FA`>NAi}`9Hb!H<=%t0%7g=5`Uf51cs9;XI|t{i=P*LG@C>0 zMl_e3Vw%raIz7+pdeXbvy!8Aja`Qk3+vjGrra>Ayj z3=E0HW|DhK6;{ja#J^1z-kanSuzzgD!cRHUhD>{20F6R(xp?0Q(OzRF@$d6P71REtf$_OZ5!iAf5}NS9LKip5|Xxh@>* zaPvGU#{~MgVBq)TxkPrrLTb>Af{YedW+y&<_$Cm2lktV6x!bn>P=a$ou7m;SXzM0k z3EJ3(Mgl!6V`}nA-Qx3NI>^wnMh)!(CFj7!|1MKb+f34qdDce%?wp;))jr+)QICgd z61{44e(tEhwvtXIC>o@O5q!psrD^Q6LrJ&|$&Jx}=N)7FBliS!66k-@n%@C>d*a?a70UL^=Z-l47Wn)= zj`H$_DhgjP+u0YHzUa%L|7) zkAkxa@Lo7Hl#`d@O)pa0(5N|5&+9=zAGdSp;6z`zt~=B8(7}?l@x4c&v$VIF?LLzNl2R~AQ70g+d#Tcj9AXO4C3Q(% zQaSauER(yW)Ce6BME<<8O^yBWQ92KSe$o}Q-Ze%Jc`8<6+eWXf zFe-bQY67s+Hr}^n-CY3mizv8BR!6-ETZmVmD~^ScR?JSG7M{3OP@CLI1`%$Y_sk(D36pHq+k<{Buv>d38*dk#mZwPxPBIBe zhK?uqfm?#2R8KTw-r9$NP_`nDNv}#{1IvdPvBpXn9u~U$6&zNwCh(IXn97OqFOgzqzH)8yT*x#-0K4@>^K*s%bDG zvpjj8S~DKBMSJcDVnCE;fF!p_YN+5>vTEwji$Vg=c?;5MG`bu~sQ?15kobd6CJm1$ z>GG5`RG~=zE@|JZGO>`km|J5fErq0!iB`atdHof-w4gUrW^qPFXSTEUJ&rvFQBQ~g zdkkm|glioyP!!<`A+ROog={p?rH-f*rR1z47wmfjzr5aWx2FN;4MFBB0MEP|ZUmvs ziZs3gBrHHwnoZNBoP4e!Gbq~Rt?`oA&cQV{jlgZf&|@eJ(1;wQ_oR5_ zgwzE$MCrpA<%#=EQ?a6IwhAn&}Q`shy7a75tE1v;)K_&Q*joI%^kMTt@ zcqc_@%*yhh9S^jFph^oWb?MCQZGaPAP#{hIV1s#F1mua9{tCD!I;njFfS&_AxHfyF z17X#maf4Pr__icJSC89q$VFHO$!mAgcdDRwT#1z&Hn$T7&cq~82>rou?bgjsb}~Xq%1G_Hs<9z_TLzpq;rEj z^JjD|{uv+e<2TW=|D)cRqS>&ZlbzHqdANg@Ob^YU4_(3H*K@2 zfLf@cxMAQiL7njFT`;K=YhJaap$3A7T1Mzpg`2o(WW7_ITn}_$kthhI#7W{Ubj2$%;)}-{#_6wQ)a?y z1BnpORR7&&8k(xV&dpG~P|%2h-c;`7vcl@*!El`vrVgl@5&%OQmARz}BxM34zN3+) z7T2thahztLRIN@h-r>VUFz5$w-0X$E^N1NQ{6i?8=fnm3ZSlb5Xp^M#7g4QJ}!pGr?+q zgi_cS{SDRJu8hA&p{ipI)Y$dpWjFM4DRZNd@5X zZ?gPt!D-I;Xe4;XClK(fD$Q_m!Y@)8!Xz0oXUb|u$T*Soo{A z;4B}a&`B;G)md2hz8y$go`wN}kJE7r9xQ9$vmAyBy*f6LS@)772OiX0od&MiAP$b( zR4>r(EL^ifT}DbN8q?ZQQ(lWsNdb64Tq*c$-j#yi3H{gmw$-dhvlI z!09+*T!6OAk{%@RdB^tt9+{l-yE5yool^E%8uA*2sH_O34G|7qPcB+cRXr15M7MGH zu8y>9>d98mLQJylXYw05J87H|YbSYhoAF=Lybf}4_$Ts{3$Dz$~{(cLlQ70{_{iiCnuy)d0v!fnx(MIDBDn!Q=64sw#;j5ywTFwnZ+_XBJa) z_lO0IF{x0MBy}>`WfIqb^MOWQk!d8{V)+p656n+ z8)&nHM++VrzT@+deL&MhDM|ne&Xm5SEklkM7T9VCCRMH>`j4sA!T#osD% zgE-BnipAm{WK2Z2z;e8F+$tyTtb~J3nqR0}%S&)QE*LLuhBlM`n17znvNU-%jT_66 zA?oN|P|Y=F%dhnX(JST!Kdmj$cu>R~_^;*|CzRuPtkGoj6TmMoWp367zvlFBFKC4& zD=#U+T7-zG!Wu#B4h6Y3(0VLstYkwhOVxQHz|+J)af#Y4ac3~J4BGSxdSowJ(Yn-% zD4H#***vM-@}}cm^0(zNh`tQD5^RF0i3Nn5`9NrE%|sbZzt0y~`kcY1c1dE8c87Q# z2O2I*(^Ddtt0u&M`;pS%>{QkSbp*=MsPxB_vYoPYD~Ptf8u+Wuk$tMKKTA>Of~SQ9 zo8%h6^1`PNY&pGEx|NZpBM~$jIO9W8ua8_Q?S-^nMp;!jpPJc8-yfjri5U*#m;n`G8r6YXsZz3^BC0d8bjVaraWVarf>{Y=3 zQPtvUa zw-f7OYPB_Q;+_v6n+vM?Tx(teL`Y-rj&Vnki6|z-W7?oFRZvQ`6uPmS=|^&vmA|`e zVu_iJ?CeDmfsYT}QFSs99y^L3)ev%bh<7W*8&Gc^QlX72#KmM-HQk5#WWiqm{PJC@ z#+RzO$xXb11Nd%FUVh4%quNR1>Jbw(^<-+dR%JPuW4?@~ z#_8!cpX=V3EbpEB-+A#V4Nq3?3mVkH#g72%qCekbJW%P9Qd{mmpAT)sCyhAyDW;mT7_*;NqUWdjN z%(=Y*_{NSRLfPCVpK(QUNjr6PNcTppHT3rmI%CQ@gT5Jfr*K6z&Wtsq zg0jhc{Z)aV?yh}4=Y#|Mwq zNy4noOn}N_rz~?vlR6>@KwIw0p2pkslm!t^O)kF;kUO`S&u8#Sz#Z84E=xzdNg;BC zY;mW-ae9crlF!-+=ec^WR|In7;GW=6O6*S1?jfm*L8Kut2Ef`gTTLPHwdTs zc$MbxesKW8rL2=?KqwtIH1URVamf$tv-TavWR{~QqXVS)_@2ql`BX9Gg=b6g+;&WSFc=mD|+uBv~Kj0crP=oz1E;!ofju zazbOkC{WVF6fr2zsaevY>{)YX|Fx&{1?bxthqUp18l)#S~{)lsvKXY%)m+@JSF{zAr3tj0r&fQZ)N7zrA<3b=+&%xY$*f?&jP-< zSN8(HocIbxgq?26%G?X|>2t_0h2Ro_rezWsjz?}9(_q6yDtoT8m~&HfayYf*;k|}H z8JQt28n_^)L$Jr?dd{R|fn=7UunX?Gc0AGi)wZSgfIHDf*8-1Tg2=jwL30d%>tja% zBFwECKj+Y^J&dDMcB0aw4)*JLqqMSsKAw({*di7O$^ahbPZ)E%KnGjxval6kU6n z&JH&#fBidDZOg0njuq&m%YbK@4Z6X2e0@gHf03m`nym;C4AH+f@M()Or6HYNQt2Io z5e;zJT61%?ekQd7!i6b?c3_$N0{uxV!6N;=aEp0&BhuVj>PMrr%~}G72*yFODm+`N zr5Uw-r&9#O=tjlAsr{e@B%|)hH%E4bd=}55uLvw7i2nMBvB!ojFc*ZZG>2Fri;3)a z3bczvRmizHI2Lr9(TJYtMj?Qu_yIXhi3i4xF*^xh=X@xNnP9ZwnnETJ8lr7n)M(M% z1X`?P;JluS^*z8R<&1N|$t%9dO^|_L7-W2e9t~){0}G`V_>MWQswOOw9b?6Ef#GL$ zaN$^TA7nISQFQ5M+S)L$M6@Xf8N93`F8!HnkR}+)E&|s?M`KbjD|1}?o`s}}Vjqto z`ucPnylb!;azn2*sz)FATzD!8Qk>bu!XPST5j-D%eURJ1zImq2Dc8ceQARvhSC$Wu zTt9jTqOoZY6fl$W0mcB~7$HMg4=H1I!r7nSLz%wLeaZ*=j#sqV&bKjv6dtO|UUW%c z1AIFJ{kd-Yr?Jd5g(r{b7Q}tgxKOie0d=mT90M_t(@+aH-fz2*dCH1FB3q}0prNiO ztVd(Uk?>;!_;P!ok(6j{Sq4wvtC#IvtH+uKgd4NlZwL%jeMSDet_Z-~#l<32gN(;1 zM1yklrA^woh<8seM@=+{jCnI%^ki?C3MlFM!y?2Q3!5Q492^Qkh~S%3Q4I)xg(QzlJ39xMIlSq9z;b z&VgAiQv;nly>QDX%C|>(ErtdMm#jPE^RY1_BaUa#GO)^`SiC`bdtjjB<1HS$Q7_77 zx}d<5$FU<|?M1?m&bh9VdlG_4qjrJ`sXGe`wJfI1BU-sl*TLB37|Sjt3;am4=#lP> zpzja#+@{7t=h;_y(DklHF29@eiGnnn8Tf>jT6NOB$%Ox`~5&y}!R(=M8%0u8IjHFYK(VxNjI1-?1wLM2OYPA5Lw z@2q{kVjtKQM&@C>`E_1!vY9NjW^BgaT?6?1@U-)2J_c_-x_xPc&H40fILoHX=f@V( zemCXejMkHyK?;}Tvo-zbvfR3vcPnL!_Tr*nAmkxl>N`w0VVXnbxS9TAyQNs6D75lA zjS1$!*W=LGhA0akM-4W;NQ&*uK0?B1DKidSO_m@`F(QWPyK9j8YpJk_bfmq9DUiS zsMAX513KAUL)y!yJI;e`>J6<3SY@V1H=;f7Zkjixpk{Y4EE=!*`Mo4RlH8oBTVqqo za#m8lJD6R`<#}#gaawP%SDzlkkSnK08ob=Ldpd3KV#;zue3kt9_KZeNnDJG(P&}U* z71B;(gCqYRnXco&y78UoAbpF z<0oX=zX$%9%C(n^Q{PY==GmSl>;JH8q=OIa!f!|D-aZBCq#!Zr$z9TtIn7D;l-mYP z;Bfe&_o-qKxY;5oZ}@%uFplF9b+BCSFJ!})S(m-9Q22|A211Z76ndOAQ<%6|6fA$(GZ5No~Ms0AEb=`hSD3bKI%&E@$Q07e;)q zbMDJMF3l3)Cs~|X+uf3-rzwP(Tykj57rLtU2l`tBrLY3reVIgv$|^K%Pz^>^)!R(2 z&yLm{&kfAwVPFU1x#N#CDG|k^xT{dWST;mB+aG)LwLhBA2!0}k#lL-EWT?x6-U~r( zQCP_c6^ky|-}Ng`UzBJ4^j8BV>D)O`l>X2ba93zT5b^P+!=Q*A9iNV-x}PPTvts1T%m?=1^DMK&jT0LF8O8; zc=^||h9=-wxw-`WiRJ>iEJX<_0HX}5VF+X?-%j02M`CcI-Ofbo4E-3C`r8OrDh6%0 zrZO7>{Vv7@JE9PKvu(Dtu#n&0gI*kWldt`bX~%Wk5o$y2e-)l>APHQ zto_RS(o>e3ou=_LepnJBopek|QK6JR*;<=f%&3itpZa<*HDo;?BHCb5#YtWc@d5H_Jrk&qnz}~ z7c733<(czuINvQTdqSL3wX`Z)ed?6zH}q!Iv|h1Vn9jR0G9ghpIpe~TJiBPtlqbBP z5%3d1+;6Ns5wqTLhW(v@x3hb5>FcUMHsk`OF9+gt1K0`EjGNd9jd`f^=NI_$bD&?Fl`74@ z^4FvaZAai6E5jqg@=L^j$mK_L0nDiemiYo%GkZ9B-kE@Fv|>yAowFcNu-nTE|IJ3% z-=Flj4e-~4{%@4CzdD_#dF?p`IRVDzic?cYqv%?W+1%5Pq1-*ug^(|T@gS}P{Do-! zrqlkF8JZhkU)~9cH-~Rn*P4Wp_;6Cm&7ZeG!`1$POR5d#OfyJ6_~Cj>rh=!Zo7qji z{hJ!OrEacUzuZlR@QFdM&3Zjw>=k|=P^4{iIlv9GMR3ABH|G^3f-&c(tSs>R!}n{{ z*k=Sue-psp=+jHM^+c1uj*8%o0qhO=>NE*GoEEd@@0KeNOvlwsz3BY)OJH|1y76_p zZkGA^&eQoNnVe}#(yk=-bg%EbZYcg7%0c+X-M!j#uxF?0<@x-4hHDEuQix{&KAGLLpu@SS zMsPQ5erHfSrX<&GLMiWomRnnm$j=%_<`zEP)TPlok2s6h z=Ir0h&6xmxMP{fyX&3w{i*KJzJ6OTO&ydV&03$u&th_}&F(h|&W-d_f!>`dxIw|Ph zU=&VT?S651v5b{62~Ss#@%N$i*qPNtRQN(ql!`7=T7 z)!X>b`8l_6XukCx>}7JkvHU!bSo?bEMLLVNch)?V}Xg_Ne93J+1U2;{=MmeqZm zP125Wvx(#DdUUsqdVHm!w|8)8CbW+;7Jaqs%`-9~znb(kuK}D%X)5EAHQ_PPY@Zsr z!L1J&d-Ex))qc;j|A}nQt$?>@+?QK0bU)}kSzIb zXTJ7dJOj!w=!;_1dwe8-Th5HBdvoJp-zNkATENdMu=j#}Jxl-FSbFD<_gV$pla8y) zt_2=Cn|6P|K<2&q+Hqej4R^qNCydt7A6am2dK`GqSJA!9U`@eD~!Z zw}RpEyYgCp>gMdsqaTz8vtjDW5hHd65>Lfo68sy#V-?|nI;nIgUG=1`G4`JG3G3YE zsntFY_@rN|TBh0a)^df*N6qFcj17DLr>`3E*%glOoDxAA4p)$NB&LrejaimFfI^#0 zp5m@0BR|)ExY5lqj~2|9+xq72+@tQx^W7V@N_Y66_U(us>-zs{nVd{GRQ*Vuib6Ml z^xZ3&VOu;!h)MHDiIQ-y<-XIEom%TNpkGP$<#nKc@P^!Tl6P6eXT~3A0$!aSQqwd* zBg5IosT@ulzGaSWlIB~x@Hdk_xyRbyQ?Z)6Cni@~n^^SM`MLo8e?DsEIWKMQEBcrh z>6I@5|CZqO((}HF337e*%GXmJccXJ)Z5qVzym=k>mZa~)ebUa)W!ER5|B0Z^{MY{% ZU;zH03AX4(D#HK(002ovPDHLkV1jyu&AI>p literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/src/Metamaps.Backbone.js b/app/assets/javascripts/src/Metamaps.Backbone.js index edc87d12..dd9d5cfb 100644 --- a/app/assets/javascripts/src/Metamaps.Backbone.js +++ b/app/assets/javascripts/src/Metamaps.Backbone.js @@ -72,6 +72,7 @@ Metamaps.Backbone.Map = Backbone.Model.extend({ topic_count_string: this.get('topic_count') == 1 ? ' topic' : ' topics', synapse_count_number: '' + this.get('synapse_count') + '', synapse_count_string: this.get('synapse_count') == 1 ? ' synapse' : ' synapses', + screenshot: '' }; return obj; } diff --git a/app/assets/javascripts/src/Metamaps.JIT.js b/app/assets/javascripts/src/Metamaps.JIT.js index d0d4c70c..29e08dce 100644 --- a/app/assets/javascripts/src/Metamaps.JIT.js +++ b/app/assets/javascripts/src/Metamaps.JIT.js @@ -7,7 +7,7 @@ Metamaps.JIT = { newSynapse: 'Metamaps:JIT:events:newSynapse', removeSynapse: 'Metamaps:JIT:events:removeSynapse', pan: 'Metamaps:JIT:events:pan', - zoom: 'Metamaps:JIT:events:zoom' + zoom: 'Metamaps:JIT:events:zoom', animationDone: 'Metamaps:JIT:events:animationDone', }, vizData: [], // contains the visualization-compatible graph @@ -230,7 +230,7 @@ Metamaps.JIT = { duration: 800, onComplete: function () { Metamaps.Visualize.mGraph.busy = false; - $(document).trigger(Metamaps.JIT.events.animationDone, [event]); + $(document).trigger(Metamaps.JIT.events.animationDone); } }, animateFDLayout: { diff --git a/app/models/map.rb b/app/models/map.rb index 87fb358d..3d6591e5 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -13,8 +13,9 @@ class Map < ActiveRecord::Base # This method associates the attribute ":image" with a file attachment has_attached_file :screenshot, :styles => { :thumb => ['188x126#', :png], - :full => ['1880x1260#', :png] - } + :full => ['940x630#', :png] + }, + :default_url => "/assets/missing-map.png" # Validate the attached image is image/jpg, image/png, etc validates_attachment_content_type :screenshot, :content_type => /\Aimage\/.*\Z/ @@ -64,6 +65,10 @@ class Map < ActiveRecord::Base self.contributors.length end + def screenshot_url + self.screenshot.url(:thumb) + end + def created_at_str self.created_at.strftime("%m/%d/%Y") end @@ -73,7 +78,7 @@ class Map < ActiveRecord::Base end def as_json(options={}) - json = super(:methods =>[:user_name, :user_image, :topic_count, :synapse_count, :contributor_count], :except => [:created_at, :updated_at]) + json = super(:methods =>[:user_name, :user_image, :topic_count, :synapse_count, :contributor_count, :screenshot_url], :except => [:screenshot_content_type, :screenshot_file_size, :screenshot_file_name, :screenshot_updated_at, :created_at, :updated_at]) json[:created_at] = self.created_at_str json[:updated_at] = self.updated_at_str json @@ -118,4 +123,19 @@ class Map < ActiveRecord::Base GrabMapScreenshotWorker.perform_async(self.id) end + def decode_base64(imgBase64) + decoded_data = Base64.decode64(imgBase64) + + data = StringIO.new(decoded_data) + data.class_eval do + attr_accessor :content_type, :original_filename + end + + data.content_type = "image/png" + data.original_filename = File.basename(self.id.to_s + '-' + 'screenshot.png') + + self.screenshot = data + self.save + end + end diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index fd02f3e9..a25999cb 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -46,8 +46,8 @@ {{name}}
    - -
    + {{{screenshot}}} +
    {{desc}} diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index 730d4a7d..71fe2441 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -6,12 +6,8 @@ class GrabMapScreenshotWorker imgBase64 = '' Phantomjs.run('./script/phantomjs-save-screenshot.js', map_id.to_s) { |line| imgBase64 << line - puts line } - - #this doesn't work yet - #map = Map.find(map_id) - #map.add_attachment(imgBase64) - #map.save! + map = Map.find(map_id) + map.decode_base64(imgBase64) end end diff --git a/diff.txt b/diff.txt deleted file mode 100644 index badb2420..00000000 --- a/diff.txt +++ /dev/null @@ -1,130 +0,0 @@ - - -diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css -index bb0edb6..bb56ab0 100644 ---- a/app/assets/stylesheets/application.css -+++ b/app/assets/stylesheets/application.css -@@ -74,8 +74,9 @@ body, - /* forgot password fix */ - - .forgotPassword input[type="submit"] { -- padding: 0 5px; -- width: auto; -+ width: 300px; -+ color: #f5f5f5; -+ font-family: din-regular; - } - html { - -@@ -189,36 +190,55 @@ input[type="submit"]:active { - border-radius: 5px; - color: black; - box-shadow: 6px 6px 8px rgba(0, 0, 0, 0.4); -+ position:absolute; - top: 50%; - left:50%; -- position:absolute; -- margin-left: -166px; -+ - } -+ - .forgotPassword { - height: 134px; - margin-top: -83px; -+ font-family: din-medium; -+ color:#424242; -+ text-transform: uppercase; -+ box-shadow: 0px 3px 3px rgba(0, 0, 0, 0.23), 0px 3px 3px rgba(0, 0, 0, 0.16); -+ font-size: 17px; -+ margin-left: -166px; -+ -+} -+ -+.emailText { -+ font-family: din-regular; -+ font-size: 14px; -+ color:#424242; -+ padding-top:24px; -+ padding-bottom: 6px; -+ text-transform: none; -+ margin: 0px; - } - .centerGreyForm input[type="text"], - .centerGreyForm input[type="email"], - .centerGreyForm input[type="password"] { -- width: 250px; -+ width: 300px; - height: 32px; - font-size: 15px; - direction: ltr; - -webkit-appearance: none; - appearance: none; - display: inline-block; -- margin: 0; -- padding: 0 8px; -+ margin: 0px 0px 6px 0px; -+ padding: 10px 0px 0px 9px; - background: #fff; -+ color: #bdbdbd; - border: 1px solid #d9d9d9; - border-top: 1px solid #c0c0c0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -- -webkit-border-radius: 1px; -- -moz-border-radius: 1px; -- border-radius: 1px; -+ -webkit-border-radius: 2px; -+ -moz-border-radius: 2px; -+ border-radius: 2px; - font: -webkit-small-control; - color: initial; - letter-spacing: normal; -@@ -227,8 +247,10 @@ input[type="submit"]:active { - text-indent: 0px; - text-shadow: none; - display: inline-block; -- text-align: start; -+ font: din-medium; -+ text-align: left; - } -+ - .centerGreyForm input[type="text"]:hover, - .centerGreyForm input[type="email"]:hover, - .centerGreyForm input[type="password"]:hover { -@@ -237,7 +259,9 @@ input[type="submit"]:active { - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -+ color: #424242; - } -+ - .new_topic { - /* start it off screen while it initializes the spinner, then it will be hidden with jquery */ - top: -1000px; -diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb -index 738d5c6..70d6de7 100644 ---- a/app/views/users/edit.html.erb -+++ b/app/views/users/edit.html.erb -@@ -17,4 +17,3 @@ - <%= form.submit "Update", class: "update" %> - <% end %> -
    -- -diff --git a/app/views/users/passwords/new.html.erb b/app/views/users/passwords/new.html.erb -index 88dddb4..3238a81 100644 ---- a/app/views/users/passwords/new.html.erb -+++ b/app/views/users/passwords/new.html.erb -@@ -6,10 +6,10 @@ - -

    FORGOT PASSWORD?

    - --
    <%= f.label :email, "Enter Your Email:" %> -+
    <%= f.label :email, "Enter your email:", :class => "emailText" %> - <%= f.email_field :email, :autofocus => true %>
    - --
    <%= f.submit "Send Reset Password Instructions" %>
    -+
    <%= f.submit "Send Password Reset Instructions" %>
    - - <% end %> -
    diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index f79a894e..c945bb7a 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -8,9 +8,9 @@ if (args.length <= 1) { //configurable variables - CHANGE ME var mapID = args[1]; -var url = 'http://localhost:3000/maps/' + mapID; -var width = 188; -var height = 126; +var url = 'http://metamaps.herokuapp.com/maps/' + mapID; +var width = 940; +var height = 630; //set up page and the area we'll render as a PNG var page = require('webpage').create(); @@ -23,25 +23,28 @@ page.open(url, function (status) { if (status === 'success') { //since this isn't evaluateAsync, it should also ensure the asynchronous //js stuff is loaded too, hopefully? + + page.onCallback = function(data){ + + //pass to ruby + console.log(page.renderBase64('PNG')); + + //render to the metamaps_gen002 directory for debug + //page.render('map1.png', 'PNG'); + + phantom.exit(); + }; + page.evaluate(function() { $(document).on(Metamaps.JIT.events.animationDone, function(){ - $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, #barometer_tab').hide(); - Metamaps.Famous.logo.hide() + $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, .uv-icon, .footer').hide(); Metamaps.JIT.zoomExtents(); - console.log('got here'); + if (typeof window.callPhantom === 'function') { + window.callPhantom(); + } });//document.on animationDone });//page.evaluate - - //pass to ruby - //console.log(page.renderBase64('PNG')); - - //render to the metamaps_gen002 directory for debug - page.render('map1.png', 'PNG'); - } else { //failed to load }//if - - setTimeout(phantom.exit,5000); - //phantom.exit(); }); From 841e6fb3abbb49255bd73a4ca0f79cb14a480430 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 00:47:17 -0400 Subject: [PATCH 178/600] update phantom settings --- Gemfile | 3 +-- app/workers/grab_map_screenshot_worker.rb | 2 ++ script/phantomjs-save-screenshot.js | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f69b125a..f8b6acbe 100644 --- a/Gemfile +++ b/Gemfile @@ -6,11 +6,10 @@ gem 'rails', '3.2.17' # Bundle edge Rails instead: # gem 'rails', :git => 'git://github.com/rails/rails.git' -#gem 'watir' gem 'phantomjs' gem 'devise' -gem 'redis', '2.2.2' +gem 'redis' gem 'pg' gem 'cancan' gem 'formula' diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index 71fe2441..5742782e 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -1,3 +1,5 @@ +require 'phantomjs' + # app/workers/grab_map_screenshot_worker.rb class GrabMapScreenshotWorker include Sidekiq::Worker diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index c945bb7a..d6d615dc 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -46,5 +46,6 @@ page.open(url, function (status) { });//page.evaluate } else { //failed to load + phantom.exit(); }//if }); From 47132f3e60c227981aa0cdea860b8892011e3798 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 01:21:02 -0400 Subject: [PATCH 179/600] ruby 2.1 --- Gemfile | 2 +- Gemfile.lock | 65 ++++++++++++++++------------- script/phantomjs-save-screenshot.js | 4 ++ 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Gemfile b/Gemfile index f8b6acbe..d20ab376 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -#ruby '1.9.3' +ruby '2.1' gem 'rails', '3.2.17' diff --git a/Gemfile.lock b/Gemfile.lock index 3c159ef2..d89e5183 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,7 +29,9 @@ GEM i18n (~> 0.6, >= 0.6.4) multi_json (~> 1.0) arel (3.0.3) - aws-sdk (1.44.0) + aws-sdk (1.54.0) + aws-sdk-v1 (= 1.54.0) + aws-sdk-v1 (1.54.0) json (~> 1.4) nokogiri (>= 1.4.4) bcrypt (3.1.7) @@ -39,7 +41,8 @@ GEM rails (~> 3.1) builder (3.0.4) cancan (1.6.10) - celluloid (0.10.0) + celluloid (0.15.2) + timers (~> 1.1.0) climate_control (0.0.3) activesupport (>= 3.0) cocaine (0.5.4) @@ -47,26 +50,27 @@ GEM coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) - coffee-script (2.2.0) + coffee-script (2.3.0) coffee-script-source execjs - coffee-script-source (1.7.0) - connection_pool (0.9.3) - devise (3.2.4) + coffee-script-source (1.8.0) + connection_pool (2.0.0) + devise (3.4.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) + responders thread_safe (~> 0.1) warden (~> 1.2.3) erubis (2.7.0) - execjs (2.0.2) + execjs (2.2.1) ezcrypto (0.7.2) - formtastic (2.2.1) - actionpack (>= 3.0) + formtastic (3.0.0) + actionpack (>= 3.2.13) formula (1.0.1) rails (> 3.0.0) hike (1.2.3) - i18n (0.6.9) + i18n (0.6.11) jbuilder (0.8.2) activesupport (>= 3.0.0) journey (1.0.4) @@ -82,14 +86,14 @@ GEM treetop (~> 1.4.8) mime-types (1.25.1) mini_portile (0.6.0) - multi_json (1.10.0) - nokogiri (1.6.2.1) + multi_json (1.10.1) + nokogiri (1.6.3.1) mini_portile (= 0.6.0) - nokogiri (1.6.2.1-x86-mingw32) + nokogiri (1.6.3.1-x86-mingw32) mini_portile (= 0.6.0) oauth (0.4.7) orm_adapter (0.5.0) - paperclip (4.1.1) + paperclip (4.2.0) activemodel (>= 3.0.0) activesupport (>= 3.0.0) cocaine (~> 0.5.3) @@ -97,7 +101,7 @@ GEM pg (0.17.1) pg (0.17.1-x86-mingw32) phantomjs (1.9.7.1) - polyglot (0.3.4) + polyglot (0.3.5) rack (1.4.5) rack-cache (1.2) rack (>= 0.4) @@ -127,20 +131,22 @@ GEM rake (10.3.2) rdoc (3.12.2) json (~> 1.4) - redis (2.2.2) - redis-namespace (1.1.1) - redis (< 3.0.0) - sass (3.3.7) + redis (3.1.0) + redis-namespace (1.5.1) + redis (~> 3.0, >= 3.0.4) + responders (1.1.1) + railties (>= 3.2, < 4.2) + sass (3.4.5) sass-rails (3.2.6) railties (~> 3.2.0) sass (>= 3.1.10) tilt (~> 1.3) - sidekiq (1.2.1) - celluloid (~> 0.10.0) - connection_pool (~> 0.9.0) - multi_json (~> 1) - redis - redis-namespace + sidekiq (3.2.5) + celluloid (= 0.15.2) + connection_pool (>= 2.0.0) + json + redis (>= 3.0.6) + redis-namespace (>= 1.3.1) sinatra (1.4.5) rack (~> 1.4) rack-protection (~> 1.4) @@ -155,13 +161,14 @@ GEM tilt (~> 1.1, != 1.3.0) temple (0.6.8) thor (0.19.1) - thread_safe (0.3.3) + thread_safe (0.3.4) tilt (1.4.1) + timers (1.1.0) treetop (1.4.15) polyglot polyglot (>= 0.3.1) - tzinfo (0.3.39) - uglifier (2.5.0) + tzinfo (0.3.41) + uglifier (2.5.3) execjs (>= 0.3.0) json (>= 1.8.0) uservoice-ruby (0.0.11) @@ -192,7 +199,7 @@ DEPENDENCIES phantomjs rails (= 3.2.17) rails3-jquery-autocomplete - redis (= 2.2.2) + redis sass-rails sidekiq sinatra diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index d6d615dc..6c46bc53 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -44,6 +44,10 @@ page.open(url, function (status) { } });//document.on animationDone });//page.evaluate + + setTimeout(function(){ + phantom.exit(); + }, 10000) } else { //failed to load phantom.exit(); From 19987594d64f30314a23082cd5889963b7f38a9f Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 01:22:02 -0400 Subject: [PATCH 180/600] ruby 2.1.2 --- Gemfile | 2 +- script/phantomjs-save-screenshot.js | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index d20ab376..f626def8 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -ruby '2.1' +ruby '2.1.2' gem 'rails', '3.2.17' diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index 6c46bc53..d6d615dc 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -44,10 +44,6 @@ page.open(url, function (status) { } });//document.on animationDone });//page.evaluate - - setTimeout(function(){ - phantom.exit(); - }, 10000) } else { //failed to load phantom.exit(); From bac631ba734c211d42ef54ea1829188fbc2dbca4 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 01:42:16 -0400 Subject: [PATCH 181/600] config sidekiq --- config/initializers/sidekiq.rb | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 config/initializers/sidekiq.rb diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb new file mode 100644 index 00000000..6a2d1b9c --- /dev/null +++ b/config/initializers/sidekiq.rb @@ -0,0 +1,9 @@ +redis_url = Rails.env.development? ? 'redis://localhost:6379/0' : ENV['REDISTOGO_URL'] + +Sidekiq.configure_server do |config| + config.redis = { :url => redis_url, :namespace => 'metamaps' } +end + +Sidekiq.configure_client do |config| + config.redis = { :url => redis_url, :namespace => 'metamaps' } +end \ No newline at end of file From 51cb54a6e0c3e4f61057ffccb586f7a3d156cdcc Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 02:21:32 -0400 Subject: [PATCH 182/600] no change" --- app/workers/grab_map_screenshot_worker.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index 5742782e..fc5d79fc 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -1,6 +1,7 @@ require 'phantomjs' # app/workers/grab_map_screenshot_worker.rb + class GrabMapScreenshotWorker include Sidekiq::Worker From a93fc83bc86a087ee12b56782c703129f6a5d869 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 02:31:25 -0400 Subject: [PATCH 183/600] multi buildpack --- .buildpacks | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .buildpacks diff --git a/.buildpacks b/.buildpacks new file mode 100644 index 00000000..47d4c0e8 --- /dev/null +++ b/.buildpacks @@ -0,0 +1,2 @@ +https://github.com/heroku/heroku-buildpack-ruby.git +https://github.com/stomita/heroku-buildpack-phantomjs.git \ No newline at end of file From c90721ad5c21818c94d0128b464b3a756f2d03a8 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 02:34:17 -0400 Subject: [PATCH 184/600] nothing --- app/workers/grab_map_screenshot_worker.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index fc5d79fc..5742782e 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -1,7 +1,6 @@ require 'phantomjs' # app/workers/grab_map_screenshot_worker.rb - class GrabMapScreenshotWorker include Sidekiq::Worker From 7e182b8bebb44ee35febdac6e09a6f3338f644de Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 03:24:08 -0400 Subject: [PATCH 185/600] figured out phantom? --- app/workers/grab_map_screenshot_worker.rb | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index 5742782e..c7a7a8f0 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -1,14 +1,9 @@ -require 'phantomjs' - # app/workers/grab_map_screenshot_worker.rb class GrabMapScreenshotWorker include Sidekiq::Worker def perform(map_id) - imgBase64 = '' - Phantomjs.run('./script/phantomjs-save-screenshot.js', map_id.to_s) { |line| - imgBase64 << line - } + imgBase64 = `phantomjs ./script/phantomjs-save-screenshot.js #{map_id}` map = Map.find(map_id) map.decode_base64(imgBase64) end From 550e89daef3428d6ff315bc06318664fc44a8c2d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Wed, 8 Oct 2014 03:47:45 -0400 Subject: [PATCH 186/600] progress --- script/phantomjs-save-screenshot.js | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index d6d615dc..a8bfdf04 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -36,14 +36,18 @@ page.open(url, function (status) { }; page.evaluate(function() { - $(document).on(Metamaps.JIT.events.animationDone, function(){ - $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, .uv-icon, .footer').hide(); - Metamaps.JIT.zoomExtents(); - if (typeof window.callPhantom === 'function') { - window.callPhantom(); - } - });//document.on animationDone + + $(document).ready(function () { + //$(document).on(Metamaps.JIT.events.animationDone, function() { + setTimeout(function(){ + $('.upperLeftUI, .upperRightUI, .mapControls, .infoAndHelp, .uv-icon, .footer').hide(); + Metamaps.JIT.zoomExtents(); + window.callPhantom(); + }, 5000); + }); + });//page.evaluate + } else { //failed to load phantom.exit(); From fcdc6d57b2c58488cfca3e0cefed359f6059ee67 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Fri, 10 Oct 2014 21:24:31 -0400 Subject: [PATCH 187/600] setup for automatic config for urls --- app/assets/javascripts/src/Metamaps.js | 13 ++++++------- app/views/layouts/application.html.erb | 2 +- app/workers/grab_map_screenshot_worker.rb | 2 +- script/phantomjs-save-screenshot.js | 4 +++- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index a75fdace..bb9ec307 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -1534,12 +1534,9 @@ Metamaps.Util = { * */ Metamaps.Realtime = { - // this is for the heroku staging environment - //Metamaps.Realtime.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); - // this is for metamaps.cc - //Metamaps.Realtime.socket = io.connect('http://metamaps.cc:5001'); - // this is for localhost development - //Metamaps.Realtime.socket = io.connect('http://localhost:5001'); + stringForLocalhost: 'http://localhost:5001', + stringForMetamaps: 'http://metamaps.cc:5001', + stringForHeroku: 'http://gentle-savannah-1303.herokuapp.com', socket: null, isOpen: false, changing: false, @@ -1560,7 +1557,9 @@ Metamaps.Realtime = { }); $('body').click(self.close); - self.socket = io.connect('http://gentle-savannah-1303.herokuapp.com'); // io.connect('http://localhost:5001'); + var railsEnv = $('body').data('env'); + var whichToConnect = railsEnv === 'development' ? self.stringForLocalhost : self.stringForHeroku; + self.socket = io.connect(whichToConnect); self.startActiveMap(); }, toggleBox: function (event) { diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 3e56695e..1073c805 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -26,7 +26,7 @@ - + <% if notice %>

    <%= notice %>

    diff --git a/app/workers/grab_map_screenshot_worker.rb b/app/workers/grab_map_screenshot_worker.rb index c7a7a8f0..b3d97e4f 100644 --- a/app/workers/grab_map_screenshot_worker.rb +++ b/app/workers/grab_map_screenshot_worker.rb @@ -3,7 +3,7 @@ class GrabMapScreenshotWorker include Sidekiq::Worker def perform(map_id) - imgBase64 = `phantomjs ./script/phantomjs-save-screenshot.js #{map_id}` + imgBase64 = `phantomjs ./script/phantomjs-save-screenshot.js #{map_id} #{Rails.env}` map = Map.find(map_id) map.decode_base64(imgBase64) end diff --git a/script/phantomjs-save-screenshot.js b/script/phantomjs-save-screenshot.js index a8bfdf04..5ca47835 100755 --- a/script/phantomjs-save-screenshot.js +++ b/script/phantomjs-save-screenshot.js @@ -8,7 +8,9 @@ if (args.length <= 1) { //configurable variables - CHANGE ME var mapID = args[1]; -var url = 'http://metamaps.herokuapp.com/maps/' + mapID; +var environment = args[2]; +var address = environment === 'development' ? 'http://localhost:3000' : 'http://metamaps.herokuapp.com'; +var url = address + '/maps/' + mapID; var width = 940; var height = 630; From cd4474a0f0193e9c839a71689c4fb3d939aed2c2 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 11 Oct 2014 22:49:44 -0400 Subject: [PATCH 188/600] created map prompt --- app/assets/images/homepage-bg.png | Bin 0 -> 111348 bytes app/assets/javascripts/src/JIT.js | 3 + .../javascripts/src/Metamaps.GlobalUI.js | 22 +++--- app/assets/javascripts/src/Metamaps.JIT.js | 1 + app/assets/javascripts/src/Metamaps.js | 4 -- app/assets/stylesheets/application.css | 65 +++++++++++++++++- public/famous/templates.js | 2 +- 7 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 app/assets/images/homepage-bg.png diff --git a/app/assets/images/homepage-bg.png b/app/assets/images/homepage-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..9bfb1040dd3545fc42e58fea975800d8748f4b4d GIT binary patch literal 111348 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

    wbOkwSWionrK#G(+d%8jVcYQ*w`$Fe_|DoN- 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

    m5A8L4(%z$z$M0Piw11< zRemUlKm(5+zGAHshKS+t8$58j1?8G;t_GUup}{92bLXgn2TxHLrf#mJ@QIriivgd3 zpT_+TgfR-kJd$$499JqcW*ImY4;F*hL^GY-XjoH|*#m?c&IJUmzZ(Ib&APz{hqBlK zA8;gp7P-m6bpbK|SPY)JK&Yp%a%q}OQeH<)l}7emIIWVBL)3T`M^k}!!ZUfjAFxh8 zUNWvmwRIk1dh=OsDC$pkIb$P!eS3!Q_#2fblqG3--eeVK!Bf>%>r3)_j|Jn4#-*M1 zVchv9DaoYFtc<46sMt7APLc}51G6jv7<*U$4SJ1V!Khmkxu8N;mP}BqA>$wX+lt6M zCk}!nuQDQNSq%U(Mva|Dk%Kt;ATKa3bq0Y;9TI^AiDH7j;@jr{Im%Hkw+A~oLC&jx zLHp_y=e@9Ocgpql#(3xP4kF0B5a?G8i=iqDd+Rq`=dY&i$UBVd)0I7l+K-NwZ#VNJ zpXVCkeCqv^=Ln$|S)en5N;lGeg=f=G9=`|)w@sKYmdE_7PT1wv?L4-Ka&P!|6O_2% zjurvKFM{DMS)NcBl5!BXn?0}DQ)<%gKYBmu_x`NTN7P~&^@hKD5|($MwM-25{SDQO}|_BI%% zg#|$AF`UZ6p&3qgb3v(QB4G~Hw_;`$$`>Z!B z+<@_z_Eo=nFc)iU6|gJ4;43u8IOP=be*8HxWS(UV5PoV1On5byScZS-m4K^EGKK`> zftVe1Xbr;P&^Nr-@rqyYz+eI#y7^^=hgP;;x~VKBJ;&Km=44fQa!;>0#WW z6hzVFGypSr^tAX}YiGKE-We{y{tvYx;0ER%K!2TwPT*k*?*9KwFPoR2uYDB5!aU_BRzLAw+Z=|Lmj4+ezV@0y^WuBoL__fPC2!mme~pn7KmvG*-g1$YX)`YZIps)|@!!F*XWv20$l}K0dA=kJqQ^u3p@Byy zx_^K-mmpLtoeUyR!%sqi_O(J@js`4pNM*s+C=AG(Fled)c9=tx4|#M#EFFPqYfg_x zPIgG7M!4b0Jd%m@f1dmfiTqF;R@4u*2;hmd(2#qwI%RWs0R};G0BuAc1{U+~{XhDP*V6zUIh{erS>$*c4)Ti(x#BDk*$sT$vc^e2eeGU}`!N#-qkSq3p;tR}BFD z3;?CS0yx2Zd5u_AsiW%8=e0hlrPg&AT(u7cAc~izsHz0p9F-)HLD3?3a_9jVa}Az{ zL<%Ve6Cmz1VDC6HU4_ik@I#ir^nXIyHEIK8Y2oRiZv<9oSwT20Nz^hg9G1&oZov)m zC*pCRWDXaWh&X`dBHVQDRFhwUG@js@UaP{~m2)QTnybEMjJ}zv@uVO%Bs(S%K?=bU z_SPsC9yLaaLl}ZxF{n0|5eEID!hf_YiKHzUacT|MF)VpMNeN30BZ7W8gEv8x0A(<^ zBGD&%jB*l;U~%&n&`Qv&K(&7fAj%J+QGzUnD~nzcgWu-oRct}^*I0n0UpK%6IrO7@ zIy_psR>NBaTIF@aAxHvPtkAx>y|qXycp+}Bpqyv&*6Y**#Lq3BLC`Mn+rdWKQ<5bG zG;c@LdYd99pAZIR>Epp5#Pg;1_{(b5JDJ2W`+S6LHr4-J2mG!8m`y+y0Ga-KF@9r7 z31iKMc)=_xB_ry@0Ip7@)e=I93ZhPu{R7iU(Nx`B*-N!5+0HNMt1D)1U|BeUI(}0I zGFa>a+aHSl5IZQiQRxN^$&o(m_oPK!Gz;dHn2dKd4>wt8!p>I@vY>ifl-Uce} k|9=0gF);Y)lD`G|_vbE`)IV(Z@l#QHqNeaw&ivi~11=P6$p8QV literal 0 HcmV?d00001 diff --git a/app/assets/javascripts/src/JIT.js b/app/assets/javascripts/src/JIT.js index d15da8d2..1cfc48c8 100644 --- a/app/assets/javascripts/src/JIT.js +++ b/app/assets/javascripts/src/JIT.js @@ -2826,6 +2826,7 @@ var Canvas; this.getPos(true); this.translateOffsetX = this.translateOffsetY = 0; this.scaleOffsetX = this.scaleOffsetY = 1; + for(var i=0, l=this.canvases.length; iAbout / '; -t.logoContent += '

  • Terms of Use / 
  • '; +t.logoContent += '
  • Terms of Use / 
  • '; t.logoContent += '
  • Colophon / 
  • '; t.logoContent += '
  • Get Involved!
  • '; t.logoContent += ''; From e17cfb4f12a91283b6be0e67c53e177082c7c281 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Sat, 11 Oct 2014 23:08:31 -0400 Subject: [PATCH 189/600] border radius for map created prompt --- app/assets/stylesheets/application.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index d63646f2..d278968a 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -867,6 +867,7 @@ label[for="user_remember_me"] { box-shadow: 0px 3px 3px rgba(0,0,0,0.12), 0 3px 3px rgba(0,0,0,0.24); font-size: 14px; font-family: 'din-regular', helvetica, sans-serif; + border-radius: 2px; } #mapCreatedSuccess h6 { From 51221ee3f7674a0871b0b65636a4f718777c08c6 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Mon, 13 Oct 2014 19:27:30 -0400 Subject: [PATCH 190/600] improvements to map info card, as well as small changes to the permission changers in the topic and synapse cards --- app/assets/javascripts/lib/bip.js | 23 +++- app/assets/javascripts/src/Metamaps.js | 150 ++++++++++++--------- app/assets/stylesheets/application.css | 42 +++++- app/assets/stylesheets/base.css | 3 +- app/assets/stylesheets/uservoice.css | 6 + app/models/map.rb | 10 +- app/views/layouts/_templates.html.erb | 4 +- app/views/maps/_mapinfobox.html (copy).erb | 52 ------- app/views/maps/_mapinfobox.html.erb | 10 +- public/famous/main.js | 3 + 10 files changed, 171 insertions(+), 132 deletions(-) delete mode 100644 app/views/maps/_mapinfobox.html (copy).erb diff --git a/app/assets/javascripts/lib/bip.js b/app/assets/javascripts/lib/bip.js index ee804884..1d575fef 100644 --- a/app/assets/javascripts/lib/bip.js +++ b/app/assets/javascripts/lib/bip.js @@ -332,12 +332,18 @@ BestInPlaceEditor.forms = { this.element.html(output); this.setHtmlAttributes(); - this.element.find("input[type='text']")[0].select(); + // START METAMAPS CODE + //this.element.find("input[type='text']")[0].select(); + this.element.find("input[type='text']")[0].focus(); + // END METAMAPS CODE this.element.find("form").bind('submit', {editor: this}, BestInPlaceEditor.forms.input.submitHandler); if (this.cancelButton) { this.element.find("input[type='button']").bind('click', {editor: this}, BestInPlaceEditor.forms.input.cancelButtonHandler); } this.element.find("input[type='text']").bind('blur', {editor: this}, BestInPlaceEditor.forms.input.inputBlurHandler); + // START METAMAPS CODE + this.element.find("input[type='text']").bind('keydown', {editor: this}, BestInPlaceEditor.forms.input.keydownHandler); + // END METAMAPS CODE this.element.find("input[type='text']").bind('keyup', {editor: this}, BestInPlaceEditor.forms.input.keyupHandler); this.blurTimer = null; this.userClicked = false; @@ -385,6 +391,11 @@ BestInPlaceEditor.forms = { if (event.keyCode == 27) { event.data.editor.abort(); } + // START METAMAPS CODE + else if (event.keyCode == 13 && !event.shiftKey) { + event.data.editor.update(); + } + // END METAMAPS CODE } }, @@ -427,6 +438,16 @@ BestInPlaceEditor.forms = { event.data.editor.update(); }, + // START METAMAPS CODE + keydownHandler : function(event) { + if (event.keyCode == 13 && !event.shiftKey) { + event.preventDefault(); + event.stopPropagation(); + return false; + } + }, + // END METAMAPS CODE + keyupHandler : function(event) { if (event.keyCode == 27) { event.data.editor.abort(); diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 185355c0..2f3cf2f9 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -808,7 +808,7 @@ Metamaps.TopicCard = { if (authorized) { $('.showcard .metacodeTitle').click(openMetacodeSelect); $('.showcard').click(hideMetacodeSelect); - $('.metacodeSelect > ul li').click(function (event){ + $('.metacodeSelect > ul > li').click(function (event){ event.stopPropagation(); }); $('.metacodeSelect li li').click(metacodeLiClick); @@ -845,36 +845,44 @@ Metamaps.TopicCard = { }); } + + var permissionLiClick = function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + topic.save({ + permission: permission + }); + $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('.showcard .permissionSelect').remove(); + event.stopPropagation(); + }; + + var openPermissionSelect = function (event) { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('.showcard .permissionSelect li').click(permissionLiClick); + event.stopPropagation(); + } + }; + + var hidePermissionSelect = function () { + selectingPermission = false; + $('.showcard .yourTopic .mapPerm').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.showcard .permissionSelect').remove(); + }; // ability to change permission var selectingPermission = false; if (topic.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('.showcard .yourTopic .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('.permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - topic.save({ - permission: permission - }); - $('.showcard .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('.permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.permissionSelect').remove(); - } - }); + $('.showcard .yourTopic .mapPerm').click(openPermissionSelect); + $('.showcard').click(hidePermissionSelect); } }, populateShowCard: function (topic) { @@ -1129,34 +1137,42 @@ Metamaps.SynapseCard = { // ability to change permission var selectingPermission = false; - if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { - $('#edit_synapse.yourEdge .mapPerm').click(function () { - if (!selectingPermission) { - selectingPermission = true; - $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow - if ($(this).hasClass('co')) { - $(this).append('
    '); - } else if ($(this).hasClass('pu')) { - $(this).append('
    '); - } else if ($(this).hasClass('pr')) { - $(this).append('
    '); - } - $('#edit_synapse .permissionSelect li').click(function (event) { - selectingPermission = false; - var permission = $(this).attr('class'); - synapse.save({ - permission: permission, - }); - $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); - $('#edit_synapse .permissionSelect').remove(); - event.stopPropagation(); - }); - } else { - selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('#edit_synapse .permissionSelect').remove(); - } + var permissionLiClick = function (event) { + selectingPermission = false; + var permission = $(this).attr('class'); + synapse.save({ + permission: permission }); + $('#edit_synapse .mapPerm').removeClass('co pu pr minimize').addClass(permission.substring(0, 2)); + $('#edit_synapse .permissionSelect').remove(); + event.stopPropagation(); + }; + + var openPermissionSelect = function (event) { + if (!selectingPermission) { + selectingPermission = true; + $(this).addClass('minimize'); // this line flips the drop down arrow to a pull up arrow + if ($(this).hasClass('co')) { + $(this).append('
    '); + } else if ($(this).hasClass('pu')) { + $(this).append('
    '); + } else if ($(this).hasClass('pr')) { + $(this).append('
    '); + } + $('#edit_synapse .permissionSelect li').click(permissionLiClick); + event.stopPropagation(); + } + }; + + var hidePermissionSelect = function () { + selectingPermission = false; + $('#edit_synapse.yourEdge .mapPerm').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('#edit_synapse .permissionSelect').remove(); + }; + + if (synapse.authorizePermissionChange(Metamaps.Active.Mapper)) { + $('#edit_synapse.yourEdge .mapPerm').click(openPermissionSelect); + $('#edit_synapse').click(hidePermissionSelect); } }, //add_perms_form @@ -2887,7 +2903,7 @@ Metamaps.Listeners = { $(window).resize(function () { if (Metamaps.Visualize && Metamaps.Visualize.mGraph) Metamaps.Visualize.mGraph.canvas.resize($(window).width(), $(window).height()); - if (Metamaps.Famous && Metamaps.Famous.maps.surf) Metamaps.Famous.maps.hide(); + if ((Metamaps.Active.Map || Metamaps.Active.Topic) && Metamaps.Famous && Metamaps.Famous.maps.surf) Metamaps.Famous.maps.reposition(); }); } }; // end Metamaps.Listeners @@ -3643,7 +3659,7 @@ Metamaps.Map.InfoBox = { obj["map_creator_tip"] = isCreator ? self.changePermissionText : ""; obj["delete"] = isCreator ? Hogan.compile(self.deleteHTML).render({id: map.id}) : ""; obj["contributor_list"] = self.createContributorList(); - obj["user_name"] = isCreator ? "you" : map.get("user_name"); + obj["user_name"] = isCreator ? "You" : map.get("user_name"); var classes = isCreator ? "yourMap" : ""; classes += canEdit ? " canEdit" : ""; @@ -3656,7 +3672,7 @@ Metamaps.Map.InfoBox = { attachEventListeners: function () { var self = Metamaps.Map.InfoBox; - $('.mapInfoBox .best_in_place').best_in_place(); + $('.mapInfoBox.canEdit .best_in_place').best_in_place(); // because anyone who can edit the map can change the map title $('.mapInfoName .best_in_place_name').unbind("ajax:success").bind("ajax:success", function () { @@ -3666,7 +3682,7 @@ Metamaps.Map.InfoBox = { }); $('.yourMap .mapPermission').unbind().click(self.onPermissionClick); - + $('.mapInfoBox.yourMap').unbind('.yourMap').bind('click.yourMap', self.hidePermissionSelect); }, createContributorList: function () { var self = Metamaps.Map.InfoBox; @@ -3689,7 +3705,7 @@ Metamaps.Map.InfoBox = { $('.mapEditedAt').html('Last edited ' + Metamaps.Util.nowDateFormatted()); }, - onPermissionClick: function () { + onPermissionClick: function (event) { var self = Metamaps.Map.InfoBox; if (!self.selectingPermission) { @@ -3703,13 +3719,17 @@ Metamaps.Map.InfoBox = { $(this).append('
    '); } $('.mapPermission .permissionSelect li').click(self.selectPermission); - } else { - self.selectingPermission = false; - $(this).removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow - $('.mapPermission .permissionSelect').remove(); + event.stopPropagation(); } }, - selectPermission: function () { + hidePermissionSelect: function () { + var self = Metamaps.Map.InfoBox; + + self.selectingPermission = false; + $('.mapPermission').removeClass('minimize'); // this line flips the pull up arrow to a drop down arrow + $('.mapPermission .permissionSelect').remove(); + }, + selectPermission: function (event) { var self = Metamaps.Map.InfoBox; self.selectingPermission = false; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index d278968a..97a4867e 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1415,7 +1415,19 @@ float: left; font-size: 18px; line-height: 20px; height: 20px; - padding: 26px 0; + padding: 26px 16px; +} +.mapInfoName input { + width: 328px; + font-size: 18px; + line-height: 20px; + height: 20px; + color: #F5F5F5; + font-family: 'din-medium', helvetica, sans-serif; + border: 0; + outline: none; + background: none; + text-align: center; } .mapInfoStat { background-color: #E0E0E0; @@ -1539,15 +1551,33 @@ float: left; font-family: helvetica, sans-serif; color: #E0E0E0; margin: 8px; + padding-right: 16px; height: 106px; font-size: 14px; line-height: 16px; overflow-y: auto; + overflow-x: hidden; + font-style: italic; + text-align: left; +} +.mapInfoBox .mapInfoDesc textarea { + font-family: helvetica, sans-serif; + text-align: left; + color: #E0E0E0; + font-size: 14px; + line-height: 16px; + font-style: italic; + border: 0; + outline: 0; + background: none; + resize: none; + width: 340px; } .mapInfoBox .mapInfoMeta { height: 35px; border-top: 1px solid #F5F5F5; - padding: 6px 0 7px; + padding: 6px 0 7px 16px; + text-align: left; } .mapInfoBox .mapInfoMeta p { margin: 4px 0; @@ -1555,6 +1585,14 @@ float: left; color: #F5F5F5; } +.mapCreatedAt span { + color: #4fc059; +} + +.mapEditedAt span { + color: #dab539; +} + /* lightboxes */ #lightbox_overlay { diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 28244194..e2fe0ed3 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -70,7 +70,7 @@ cursor: text; } -.best_in_place_name textarea, .best_in_place_name input { +.showcard .best_in_place_name textarea, .showcard .best_in_place_name input { font-family: 'din-regular', sans-serif; color: #424242; font-size: 18px; @@ -120,6 +120,7 @@ outline: none; font-size: 12px; line-height: 15px; background: none; +resize: none; } .CardOnGraph .desc h3 { diff --git a/app/assets/stylesheets/uservoice.css b/app/assets/stylesheets/uservoice.css index 953a5e5b..7b2bca26 100644 --- a/app/assets/stylesheets/uservoice.css +++ b/app/assets/stylesheets/uservoice.css @@ -13,4 +13,10 @@ div.uv-icon.uv-bottom-left { top:25%; width:25px; z-index:100000; + opacity: 1; + +} + +div.uv-icon.uv-bottom-left:hover { + background-position: 0 -110px; } \ No newline at end of file diff --git a/app/models/map.rb b/app/models/map.rb index 3d6591e5..9cc39fe3 100644 --- a/app/models/map.rb +++ b/app/models/map.rb @@ -87,8 +87,8 @@ class Map < ActiveRecord::Base ##### PERMISSIONS ###### # returns false if user not allowed to 'show' Topic, Synapse, or Map - def authorize_to_show(user) - if (self.permission == "private" && self.user != user) + def authorize_to_show(user) + if (self.permission == "private" && self.user != user) return false end return self @@ -96,7 +96,9 @@ class Map < ActiveRecord::Base # returns false if user not allowed to 'edit' Topic, Synapse, or Map def authorize_to_edit(user) - if (self.permission == "private" && self.user != user) + if !user + return false + elsif (self.permission == "private" && self.user != user) return false elsif (self.permission == "public" && self.user != user) return false @@ -132,7 +134,7 @@ class Map < ActiveRecord::Base end data.content_type = "image/png" - data.original_filename = File.basename(self.id.to_s + '-' + 'screenshot.png') + data.original_filename = File.basename('map-' + self.id.to_s + '-screenshot.png') self.screenshot = data self.save diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index a25999cb..08130955 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -29,8 +29,8 @@
    -

    Created by {{user_name}} on {{created_at}}

    -

    Last edited {{updated_at}}

    +

    Created by: {{user_name}} on {{created_at}}

    +

    Last edited: {{updated_at}}

    diff --git a/app/views/maps/_mapinfobox.html (copy).erb b/app/views/maps/_mapinfobox.html (copy).erb deleted file mode 100644 index 1c808a4e..00000000 --- a/app/views/maps/_mapinfobox.html (copy).erb +++ /dev/null @@ -1,52 +0,0 @@ -<%# - # Partial rendering form for a new topic on a map - # This code is called when viewing a metamap in show.html.erb in the views/maps folder - #%> -
    <%= @map.authorize_to_edit(user) ? " canEdit" : "" %>"> - -
    <%= best_in_place @map, :name, :type => :input, :classes => 'best_in_place_name' %>
    - -
    -
    - <%= @map.contributors.count %> - <% contributorList = '' - @map.contributors.each_with_index do |c, index| - comma = (index+1) == @map.contributors.count ? '' : ', ' - contributorList += c.name + comma - end - if @map.contributors.count == 0 - contributorList = 'No one has added anything yet.' - end %> -
    <%= contributorList %>
    -
    -
    - <%= @map.topics.count %> -
    -
    - <%= @map.synapses.count %> -
    -
    - <% if @map.user == user %> -
    As the creator, you can change the permission of this map, but the permissions of the topics and synapses on it must be changed independently.
    - <% end %> -
    -
    -
    - - <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%> -
    - <%= best_in_place @map, :desc, :type => :textarea, :nil => "Click to add description.", :classes => 'best_in_place_desc' %> -
    - <% end %> - -
    -

    Created by <%= @map.user == user ? "you" : @map.user.name %> on <%= @map.created_at.strftime("%m/%d/%Y") %>

    -

    Last edited <%= @map.updated_at.strftime("%m/%d/%Y") %>

    -
    - -
    - <% if @map.user == user %> - <%= link_to 'Delete', map_path(@map), :class => 'delete', :confirm => 'Delete this map (nodes and synapses will remain)?', :method => :delete %> - <% end %> -
    -
    diff --git a/app/views/maps/_mapinfobox.html.erb b/app/views/maps/_mapinfobox.html.erb index da339a02..ffbae4c0 100644 --- a/app/views/maps/_mapinfobox.html.erb +++ b/app/views/maps/_mapinfobox.html.erb @@ -34,15 +34,15 @@
    - <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%>
    - <%= best_in_place @map, :desc, :type => :textarea, :nil => "Click to add description.", :classes => 'best_in_place_desc' %> + <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%> + <%= best_in_place @map, :desc, :type => :textarea, :nil => "Click to add description.", :classes => 'best_in_place_desc' %> + <% end %>
    - <% end %>
    -

    Created by <%= @map.user == user ? "you" : @map.user.name %> on <%= @map.created_at.strftime("%m/%d/%Y") %>

    -

    Last edited <%= @map.updated_at.strftime("%m/%d/%Y") %>

    +

    Created by: <%= @map.user == user ? "You" : @map.user.name %> on <%= @map.created_at.strftime("%m/%d/%Y") %>

    +

    Last edited: <%= @map.updated_at.strftime("%m/%d/%Y") %>

    diff --git a/public/famous/main.js b/public/famous/main.js index 67265c9f..7e5b32c4 100644 --- a/public/famous/main.js +++ b/public/famous/main.js @@ -165,6 +165,9 @@ define(function(require, exports, module) { } ); }; + f.maps.reposition = function () { + f.maps.mod.setTransform(Transform.translate(window.innerWidth, 94, 0)); + }; var mapsScroll = new Scrollview(); mapsScroll._scroller.on('edgeHit', function(data){ if (data.position > 0 && From b1ae75a896e96e536d71924d453f537b23b9dec0 Mon Sep 17 00:00:00 2001 From: Raymon Johnstone Date: Mon, 13 Oct 2014 23:18:25 -0400 Subject: [PATCH 191/600] updates to all walkthroughs about the fact that we now use rails 2.1.2 as well as a couple changes to the get involved lightbox --- MacInstallation.md | 2 ++ UbuntuInstallation.md | 9 +++++++++ WindowsInstallation.md | 2 ++ app/assets/images/RibbonDonateBitcoin.png | Bin 0 -> 8772 bytes app/views/layouts/_lightboxes.html.erb | 4 ++++ 5 files changed, 17 insertions(+) create mode 100644 app/assets/images/RibbonDonateBitcoin.png diff --git a/MacInstallation.md b/MacInstallation.md index a6e47436..c2b9d80d 100644 --- a/MacInstallation.md +++ b/MacInstallation.md @@ -1,3 +1,5 @@ +If you are doing an upgrade and or recent pull for changes you will need to change your default ruby package from 2.1.1 to ruby 2.1.2 + install homebrew \curl -sSL https://get.rvm.io | bash -s stable --rails diff --git a/UbuntuInstallation.md b/UbuntuInstallation.md index 348ad5c1..77b14757 100644 --- a/UbuntuInstallation.md +++ b/UbuntuInstallation.md @@ -1,3 +1,12 @@ +If you are doing an upgrade and or recent pull for changes you will need to change your default ruby package from 2.1.1 to ruby 2.1.2 +to do this use this command + rvm install ruby-2.1.2 +once the download is finished select that package as your default + rvm default ruby-2.1.2 +then + bundle install +now you are good to go with normal execution + Firstly this walkthrough is done with a 14.04 32bit install of Ubuntu. All commands that I could are terminal based. diff --git a/WindowsInstallation.md b/WindowsInstallation.md index 0e8dcd4e..8d91762e 100644 --- a/WindowsInstallation.md +++ b/WindowsInstallation.md @@ -1,5 +1,7 @@ First off, Metamaps runs on Ruby On Rails. Ruby 1.9.3 and Rails 3.2. You'll need to get Ruby and Rails installed on your computer if you don't already have it. We recommend using the Rails Installer, which you can download from Mac or Windows at http://railsinstaller.org/en (see the notes below about Ubuntu). This will get you set up perfectly with the right versions of Ruby, and Rails for running your local version of Metamaps. +If you are doing an upgrade and or recent pull for changes you will need to change your default ruby package from 2.1.1 to ruby 2.1.2 + It uses postgreSQL 9.2 as a database. You can install that for your computer from here: http://www.enterprisedb.com/products-services-training/pgdownload . During installation you can choose whatever database password you like. Make sure to note it down! Once you install those, open a 'command prompt with ruby and rails'. diff --git a/app/assets/images/RibbonDonateBitcoin.png b/app/assets/images/RibbonDonateBitcoin.png new file mode 100644 index 0000000000000000000000000000000000000000..4ef580d971214d0eaacfd448903427cc7e133987 GIT binary patch literal 8772 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 Z^XuQfe0l|B;E50DzM8ITHNqzP{{W-=Q^f!P literal 0 HcmV?d00001 diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 1cf1681e..1e6ac712 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -170,6 +170,10 @@

    Financial contributions are greatly appreciated in support of our work. All financial contributions are transparently governed and recorded in our value accounting system.

    + + //TODO add bitcoin wallet payment link. + DonatewithBitCoin +
    From f9f147304f74d3f1b113042b6c1da23dbd99847d Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 14 Oct 2014 16:34:09 -0400 Subject: [PATCH 192/600] styling for map info box mostly complete --- app/assets/images/delete_mapinfo.png | Bin 0 -> 348 bytes app/assets/images/share_sprite_mapinfo.png | Bin 0 -> 1060 bytes app/assets/javascripts/src/Metamaps.js | 64 +++++++++++--- app/assets/stylesheets/application.css | 97 ++++++++++++++++++--- app/assets/stylesheets/base.css | 29 ++++-- app/views/layouts/_templates.html.erb | 21 +++-- app/views/maps/_mapinfobox.html.erb | 33 ++++--- 7 files changed, 195 insertions(+), 49 deletions(-) create mode 100644 app/assets/images/delete_mapinfo.png create mode 100644 app/assets/images/share_sprite_mapinfo.png diff --git a/app/assets/images/delete_mapinfo.png b/app/assets/images/delete_mapinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..e6316c2e749ed450b5ce08e72e0d8d27ad5af9d4 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP*AeO zHKHUqKdq!Zu_%?nF(p4KRlzeiF+DXXH8G{K@MNkDP|-_I7srr_TT6lu@-`drm~@EG zUw47`1lwDV90xaVvlkqx%^MuUUoh``$!e*w!;^KDs&?RqxwQ|2D&K4Nrbe1fn_zzH zc!x>u?O9(obg?kRZM2yn`?rttX7h`!f(&am)GO(i=-fMD?Gba9{Ta)Q9c5F4Hb3+0 z$uL$peLty$G5T}s(uW4K#8jr8pR?lXRh#p6*L4{#B+44!*V#b7wv?P7^~+ea7FQ;05MrM3!lnGcq4;UXLbT!*rBz?z)c$@u so@3s#kIR(jI=_8q`1kW1dnO(R=C;!5Q>vWWfSzXXboFyt=akR{01#D(>Hq)$ literal 0 HcmV?d00001 diff --git a/app/assets/images/share_sprite_mapinfo.png b/app/assets/images/share_sprite_mapinfo.png new file mode 100644 index 0000000000000000000000000000000000000000..ebe96f417b08df6dcf1aa037c31cec9995f08c0b GIT binary patch literal 1060 zcmV+<1l#+GP)qJd#$hs<+>(+K#O40kpWE$5v$M1Av$Hc1_9Q9;I-PC`6xAsd z3Kpp_oZQ^ppqZJOUrwjiQ%y~c6^h0P1w&98fG`+vXslN2>g434 zEZjTS*VlWCi;F%;s;a)eUK#8s+_=;R*lac*66T7e97}(H|94z1!4p9l_Na&?Uaz+Y zs^MoW9sZ($v9Ymlv7Xip6lV$X0Ags1QC}Vz-KPf3us*|*zrv<{!P7Z(WWw%0kkt^Q z96%2o{Ii+-Zs0%RqUPr2_;FEpcefGFt6n(L?E?b?;koGW@GvGW0wzMGrKOea?d?13 z>+A91BB4--YHMr7IXOAcxd=S)2MLW97r~V4OH52GCN-PqIDBp$giPF>4 z>2nc4*NR4?5#u=1k%@_kTOdDrT+{}FD}+>zV{Eh80$k*BxdL1SBvC+m22=1dIXPJm z9@FC@NTvy>E}$4gEhr{7H#Z-+2=@WWMWdsm=f}s#>fzyGdR)}n+NzOABs^duyz8~C zt*x+Jgp&$Q<^eBF4Gj%eC>kRa3_&@QF&7C00=)B8v)L>Or~K;bYR_V^_&gqu3i?3! zh>NH_fJE_uiChFhMC78*&dvuef}KalMerx0hr{8-kBguq-xwD`4Bs#p!R}v;i=YSI exrn~}7GMDLfm9V$0Xq5s0000
    '); + $('.showcard .title').append('
    '); var callback = function (data) { - $('.titleCounter').html(data.all + '/140'); + $('.nameCounter.forTopic').html(data.all + '/140'); }; Countable.live(el, callback); }); bipName.bind("best_in_place:deactivate", function () { - $('.titleCounter').remove(); + $('.nameCounter.forTopic').remove(); }); //bind best_in_place ajax callbacks @@ -3247,6 +3247,8 @@ Metamaps.Topic = { createTopicLocally: function () { var self = Metamaps.Topic; + $(document).trigger(Metamaps.Map.events.editedByActiveMapper); + var metacode = Metamaps.Metacodes.findWhere({ name: Metamaps.Create.newTopic.metacode }); @@ -3383,6 +3385,8 @@ Metamaps.Synapse = { synapse, mapping; + $(document).trigger(Metamaps.Map.events.editedByActiveMapper); + //for each node in this array we will create a synapse going to the position2 node. var synapsesToCreate = []; @@ -3451,6 +3455,9 @@ Metamaps.Synapse = { * */ Metamaps.Map = { + events: { + editedByActiveMapper: "Metamaps:Map:events:editedByActiveMapper" + }, init: function () { var self = Metamaps.Map; @@ -3467,6 +3474,8 @@ Metamaps.Map = { self.InfoBox.init(); self.CheatSheet.init(); + + $(document).on(Metamaps.Map.events.editedByActiveMapper, self.editedByActiveMapper); }, launch: function (id) { var bb = Metamaps.Backbone; @@ -3552,6 +3561,11 @@ Metamaps.Map = { Metamaps.GlobalUI.CreateMap.topicsToMap = nodes_data; Metamaps.GlobalUI.CreateMap.synapsesToMap = synapses_data; + }, + editedByActiveMapper: function () { + if (Metamaps.Active.Mapper) { + Metamaps.Mappers.add(Metamaps.Active.Mapper); + } } }; @@ -3598,9 +3612,8 @@ Metamaps.Map.InfoBox = { changing: false, selectingPermission: false, changePermissionText: "
    As the creator, you can change the permission of this map, but the permissions of the topics and synapses on it must be changed independently.
    ", - nameHTML: '{{name}}', - descHTML: '{{desc}}', - deleteHTML: "Delete", + nameHTML: '{{name}}', + descHTML: '{{desc}}', init: function () { var self = Metamaps.Map.InfoBox; @@ -3657,7 +3670,9 @@ Metamaps.Map.InfoBox = { obj["name"] = canEdit ? Hogan.compile(self.nameHTML).render({id: map.id, name: map.get("name")}) : map.get("name"); obj["desc"] = canEdit ? Hogan.compile(self.descHTML).render({id: map.id, desc: map.get("desc")}) : map.get("desc"); obj["map_creator_tip"] = isCreator ? self.changePermissionText : ""; - obj["delete"] = isCreator ? Hogan.compile(self.deleteHTML).render({id: map.id}) : ""; + obj["contributors_class"] = Metamaps.Mappers.length > 1 ? "multiple" : ""; + obj["contributors_class"] += Metamaps.Mappers.length === 2 ? " mTwo" : ""; + obj["contributor_image"] = Metamaps.Mappers.length > 0 ? Metamaps.Mappers.models[0].get("image") : "/assets/user.png"; obj["contributor_list"] = self.createContributorList(); obj["user_name"] = isCreator ? "You" : map.get("user_name"); @@ -3675,6 +3690,24 @@ Metamaps.Map.InfoBox = { $('.mapInfoBox.canEdit .best_in_place').best_in_place(); // because anyone who can edit the map can change the map title + var bipName = $('.mapInfoBox .best_in_place_name'); + bipName.unbind("best_in_place:activate").bind("best_in_place:activate", function () { + var $el = bipName.find('textarea'); + var el = $el[0]; + + $el.attr('maxlength', '140'); + + $('.mapInfoName').append('
    '); + + var callback = function (data) { + $('.nameCounter.forMap').html(data.all + '/140'); + }; + Countable.live(el, callback); + }); + bipName.unbind("best_in_place:deactivate").bind("best_in_place:deactivate", function () { + $('.nameCounter.forMap').remove(); + }); + $('.mapInfoName .best_in_place_name').unbind("ajax:success").bind("ajax:success", function () { var name = $(this).html(); $('.mapName').html(name); @@ -3695,15 +3728,22 @@ Metamaps.Map.InfoBox = { var self = Metamaps.Map.InfoBox; var mapper = Metamaps.Active.Mapper; - if (mapper && Metamaps.Mappers.get(mapper.id) === undefined) { - Metamaps.Mappers.add(mapper); + var contributors_class = ""; + if (Metamaps.Mappers.length === 2) contributors_class = "multiple mTwo"; + else if (Metamaps.Mappers.length > 2) contributors_class = "multiple"; + + var contributors_image = "/assets/user.png"; + if (Metamaps.Mappers.length > 0) { + // get the first contributor and use their image + contributors_image = Metamaps.Mappers.models[0].get("image"); } - $('.mapContributors').text(Metamaps.Mappers.length) - .append('
    ' + self.createContributorList() + '
    '); + $('.mapContributors img').attr('src', contributors_image).removeClass('multiple mTwo').addClass(contributors_class); + $('.mapContributors span').text(Metamaps.Mappers.length) + $('.mapContributors .tip').text(self.createContributorList()); $('.mapTopics').text(Metamaps.Topics.length); $('.mapSynapses').text(Metamaps.Synapses.length); - $('.mapEditedAt').html('Last edited ' + Metamaps.Util.nowDateFormatted()); + $('.mapEditedAt').html('Last edited: ' + Metamaps.Util.nowDateFormatted()); }, onPermissionClick: function (event) { var self = Metamaps.Map.InfoBox; diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index 97a4867e..61b08cc1 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -1405,7 +1405,7 @@ float: left; color: #F5F5F5; border-radius: 2px; width: 360px; - height: 300px; + min-height: 300px; padding: 0; font-style: normal; text-align: center; @@ -1414,21 +1414,29 @@ float: left; .mapInfoName { font-size: 18px; line-height: 20px; - height: 20px; - padding: 26px 16px; + padding: 13px 16px; + margin: 13px 0; + position: relative; } -.mapInfoName input { +.mapInfoName textarea { width: 328px; font-size: 18px; line-height: 20px; - height: 20px; color: #F5F5F5; font-family: 'din-medium', helvetica, sans-serif; border: 0; outline: none; background: none; text-align: center; + resize: none; } +.mapInfoBox.canEdit #mapInfoName:hover { + background-image: url(edit.png); + background-repeat: no-repeat; + background-position: bottom right; + cursor: text; +} + .mapInfoStat { background-color: #E0E0E0; font-size: 18px; @@ -1451,10 +1459,34 @@ float: left; text-align: left; } .mapContributors { - background-image: url(MMCCicon_mapper.png); - background-position: 13px center; position: relative; + height: 30px; + margin: 9px 0px 9px 56px; + padding: 0; + width: 64px; + cursor: pointer; } +#mapContribs { + float: left; + border: 2px solid #424242; + background-color: #fff; + width: 25px; + height: 25px; + border-radius: 15px; +} +#mapContribs.multiple.mTwo { + box-shadow: 1px 1px 0 0 #B5B5B5,3px 2px 0 0 #424242; +} +#mapContribs.multiple { + box-shadow: 1px 1px 0 0 #B5B5B5,3px 2px 0 0 #424242,4px 3px 0 0 #B5B5B5,5px 4px 0 0 #424242; +} +.mapContributors span { + height: 20px; + padding-top: 5px; + padding-left: 8px; + float: left; +} + .infoStatIcon .tip { display: none; position: absolute; @@ -1478,7 +1510,7 @@ float: left; right: 32px; } .mapInfoBox .hoverForTip:hover .tip { - display: block; + display: none; } .mapTopics { background-image: url(topic32.png); @@ -1552,7 +1584,7 @@ float: left; color: #E0E0E0; margin: 8px; padding-right: 16px; - height: 106px; + height: 115px; font-size: 14px; line-height: 16px; overflow-y: auto; @@ -1573,14 +1605,22 @@ float: left; resize: none; width: 340px; } +.mapInfoBox.canEdit .mapInfoDesc:hover { + background-image: url(edit.png); + background-position: top right; + background-repeat: no-repeat; + cursor: text; +} + .mapInfoBox .mapInfoMeta { height: 35px; border-top: 1px solid #F5F5F5; padding: 6px 0 7px 16px; text-align: left; + position: relative; } .mapInfoBox .mapInfoMeta p { - margin: 4px 0; + margin: 2px 0; font-size: 12px; color: #F5F5F5; } @@ -1593,6 +1633,43 @@ float: left; color: #dab539; } +.mapInfoButtonsWrapper { + position: absolute; + top: 0; + right: 4px; +} +.mapInfoButtonsWrapper > div { + float: right; + width: 48px; + height: 48px; + font-size: 12px; + text-align: center; + position: relative; + cursor: pointer; +} +.mapInfoShareIcon { + width: 24px; + height: 24px; + background-image: url(share_sprite_mapinfo.png); + background-repeat: no-repeat; + margin: 4px auto 0; + background-position: 0 -24px; +} +.mapInfoShare:hover .mapInfoShareIcon { + background-position: 0 0; +} +.mapInfoDelete { + background-image: url(delete_mapinfo.png); + background-repeat: no-repeat; + background-position: center 8px; +} +.mapInfoButtonsWrapper span { + position: absolute; + width: 100%; + display: block; + bottom: 8px; +} + /* lightboxes */ #lightbox_overlay { diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index e2fe0ed3..64068181 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -1,3 +1,23 @@ +.nameCounter { + position: absolute; + bottom: 1px; + right: 2px; + font-size: 11px; + font-family: helvetica; + color: #727272; + line-height: 11px; +} + +.nameCounter.forMap { + color: #FFF; + bottom: -11px; +} + +.nameCounter.forTopic { + +} + + #center-container { position:relative; height:100%; @@ -85,15 +105,6 @@ text-align:center; resize: none; } -.titleCounter { - position: absolute; - bottom: 1px; - right: 2px; - font-size: 11px; - font-family: helvetica; - color: #727272; - line-height: 11px; -} .CardOnGraph .scroll { display:block; diff --git a/app/views/layouts/_templates.html.erb b/app/views/layouts/_templates.html.erb index 08130955..e826516c 100644 --- a/app/views/layouts/_templates.html.erb +++ b/app/views/layouts/_templates.html.erb @@ -6,11 +6,13 @@
    diff --git a/app/views/maps/_mapinfobox.html.erb b/app/views/maps/_mapinfobox.html.erb index ffbae4c0..a9536774 100644 --- a/app/views/maps/_mapinfobox.html.erb +++ b/app/views/maps/_mapinfobox.html.erb @@ -5,11 +5,20 @@
    <%= @map && @map.authorize_to_edit(user) ? " canEdit" : "" %>"> <% if @map %> -
    <%= best_in_place @map, :name, :type => :input, :classes => 'best_in_place_name' %>
    +
    <%= best_in_place @map, :name, :type => :textarea, :activator => "#mapInfoName", :classes => 'best_in_place_name' %>
    - <%= @map.contributors.count %> + <% if @map.contributors.count == 0 %> + + <% elsif @map.contributors.count == 1 %> + + <% elsif @map.contributors.count == 2 %> + + <% elsif @map.contributors.count > 2 %> + + <% end %> + <%= @map.contributors.count %> <% contributorList = '' @map.contributors.each_with_index do |c, index| comma = (index+1) == @map.contributors.count ? '' : ', ' @@ -34,22 +43,24 @@
    -
    +
    <% if (authenticated? && @map.authorize_to_edit(user)) || (!authenticated? && @map.desc != "" && @map.desc != nil )%> - <%= best_in_place @map, :desc, :type => :textarea, :nil => "Click to add description.", :classes => 'best_in_place_desc' %> + <%= best_in_place @map, :desc, :activator => "#mapInfoDesc", :type => :textarea, :nil => "Click to add description...", :classes => 'best_in_place_desc' %> <% end %>

    Created by: <%= @map.user == user ? "You" : @map.user.name %> on <%= @map.created_at.strftime("%m/%d/%Y") %>

    Last edited: <%= @map.updated_at.strftime("%m/%d/%Y") %>

    -
    - -
    - <% if @map.user == user %> - <%= link_to 'Delete', map_path(@map), :class => 'delete', :confirm => 'Delete this map (nodes and synapses will remain)?', :method => :delete, - :data => { :bypass => 'true'} %> - <% end %> +
    +
    + Delete +
    +
    +
    + Share +
    +
    <% end %>
    \ No newline at end of file From bfc8c796c7d67d68e6a17914ec2799e5675aab38 Mon Sep 17 00:00:00 2001 From: Connor Turland Date: Tue, 14 Oct 2014 17:00:17 -0400 Subject: [PATCH 193/600] border radius for map card images --- app/assets/stylesheets/base.css | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css index 64068181..2089fe80 100644 --- a/app/assets/stylesheets/base.css +++ b/app/assets/stylesheets/base.css @@ -776,6 +776,7 @@ font-family: 'din-regular', helvetica, sans-serif; .mapCard .mapScreenshot img { width: 188px; height: 126px; + border-radius: 2px; } .mapCard .scroll { From 3c7db77395a17690613270b14bc106ada12e5a49 Mon Sep 17 00:00:00 2001 From: Raymon Johnstone Date: Tue, 14 Oct 2014 23:19:58 -0400 Subject: [PATCH 194/600] backing up bitcoin --- app/assets/javascripts/src/Metamaps.js | 1 - app/views/layouts/_lightboxes.html.erb | 28 ++++++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/src/Metamaps.js b/app/assets/javascripts/src/Metamaps.js index 2f3cf2f9..d28965ad 100644 --- a/app/assets/javascripts/src/Metamaps.js +++ b/app/assets/javascripts/src/Metamaps.js @@ -40,7 +40,6 @@ Metamaps.Settings = { } }; - Metamaps.Touch = { touchPos: null, // this stores the x and y values of a current touch event touchDragNode: null // this stores a reference to a JIT node that is being dragged diff --git a/app/views/layouts/_lightboxes.html.erb b/app/views/layouts/_lightboxes.html.erb index 1e6ac712..9ace06a0 100644 --- a/app/views/layouts/_lightboxes.html.erb +++ b/app/views/layouts/_lightboxes.html.erb @@ -2,9 +2,7 @@ # @file # The inner HTML of the account box that comes up in the bottom left #%> - - -
    +
    + +
    + +
      + +
    • +
      +

      soundmanager2.js

      +
      +
    • + + + +
    • +
      + +
      + +
      + +
      + +
      /** @license
      + *
      + * SoundManager 2: JavaScript Sound for the Web
      + * ----------------------------------------------
      + * http://schillmania.com/projects/soundmanager2/
      + *
      + * Copyright (c) 2007, Scott Schiller. All rights reserved.
      + * Code provided under the BSD License:
      + * http://schillmania.com/projects/soundmanager2/license.txt
      + *
      + * V2.97a.20131201
      + */
      +
      +/*global window, SM2_DEFER, sm2Debugger, console, document, navigator, setTimeout, setInterval, clearInterval, Audio, opera */
      +/*jslint regexp: true, sloppy: true, white: true, nomen: true, plusplus: true, todo: true */
      +
      +/**
      + * About this file
      + * -------------------------------------------------------------------------------------
      + * This is the fully-commented source version of the SoundManager 2 API,
      + * recommended for use during development and testing.
      + *
      + * See soundmanager2-nodebug-jsmin.js for an optimized build (~11KB with gzip.)
      + * http://schillmania.com/projects/soundmanager2/doc/getstarted/#basic-inclusion
      + * Alternately, serve this file with gzip for 75% compression savings (~30KB over HTTP.)
      + *
      + * You may notice <d> and </d> comments in this source; these are delimiters for
      + * debug blocks which are removed in the -nodebug builds, further optimizing code size.
      + *
      + * Also, as you may note: Whoa, reliable cross-platform/device audio support is hard! ;)
      + */
      +
      +(function(window, _undefined) {
      +
      +"use strict";
      +
      +var soundManager = null;
      +
      +/**
      + * The SoundManager constructor.
      + *
      + * @constructor
      + * @param {string} smURL Optional: Path to SWF files
      + * @param {string} smID Optional: The ID to use for the SWF container element
      + * @this {SoundManager}
      + * @return {SoundManager} The new SoundManager instance
      + */
      +
      +function SoundManager(smURL, smID) {
      +
      +  /**
      +   * soundManager configuration options list
      +   * defines top-level configuration properties to be applied to the soundManager instance (eg. soundManager.flashVersion)
      +   * to set these properties, use the setup() method - eg., soundManager.setup({url: '/swf/', flashVersion: 9})
      +   */
      +
      +  this.setupOptions = {
      +
      +    'url': (smURL || null),             // path (directory) where SoundManager 2 SWFs exist, eg., /path/to/swfs/
      +    'flashVersion': 8,                  // flash build to use (8 or 9.) Some API features require 9.
      +    'debugMode': true,                  // enable debugging output (console.log() with HTML fallback)
      +    'debugFlash': false,                // enable debugging output inside SWF, troubleshoot Flash/browser issues
      +    'useConsole': true,                 // use console.log() if available (otherwise, writes to #soundmanager-debug element)
      +    'consoleOnly': true,                // if console is being used, do not create/write to #soundmanager-debug
      +    'waitForWindowLoad': false,         // force SM2 to wait for window.onload() before trying to call soundManager.onload()
      +    'bgColor': '#ffffff',               // SWF background color. N/A when wmode = 'transparent'
      +    'useHighPerformance': false,        // position:fixed flash movie can help increase js/flash speed, minimize lag
      +    'flashPollingInterval': null,       // msec affecting whileplaying/loading callback frequency. If null, default of 50 msec is used.
      +    'html5PollingInterval': null,       // msec affecting whileplaying() for HTML5 audio, excluding mobile devices. If null, native HTML5 update events are used.
      +    'flashLoadTimeout': 1000,           // msec to wait for flash movie to load before failing (0 = infinity)
      +    'wmode': null,                      // flash rendering mode - null, 'transparent', or 'opaque' (last two allow z-index to work)
      +    'allowScriptAccess': 'always',      // for scripting the SWF (object/embed property), 'always' or 'sameDomain'
      +    'useFlashBlock': false,             // *requires flashblock.css, see demos* - allow recovery from flash blockers. Wait indefinitely and apply timeout CSS to SWF, if applicable.
      +    'useHTML5Audio': true,              // use HTML5 Audio() where API is supported (most Safari, Chrome versions), Firefox (no MP3/MP4.) Ideally, transparent vs. Flash API where possible.
      +    'html5Test': /^(probably|maybe)$/i, // HTML5 Audio() format support test. Use /^probably$/i; if you want to be more conservative.
      +    'preferFlash': false,               // overrides useHTML5audio, will use Flash for MP3/MP4/AAC if present. Potential option if HTML5 playback with these formats is quirky.
      +    'noSWFCache': false,                // if true, appends ?ts={date} to break aggressive SWF caching.
      +    'idPrefix': 'sound'                 // if an id is not provided to createSound(), this prefix is used for generated IDs - 'sound0', 'sound1' etc.
      +
      +  };
      +
      +  this.defaultOptions = {
      +
      +    /**
      +     * the default configuration for sound objects made with createSound() and related methods
      +     * eg., volume, auto-load behaviour and so forth
      +     */
      +
      +    'autoLoad': false,        // enable automatic loading (otherwise .load() will be called on demand with .play(), the latter being nicer on bandwidth - if you want to .load yourself, you also can)
      +    'autoPlay': false,        // enable playing of file as soon as possible (much faster if "stream" is true)
      +    'from': null,             // position to start playback within a sound (msec), default = beginning
      +    'loops': 1,               // how many times to repeat the sound (position will wrap around to 0, setPosition() will break out of loop when >0)
      +    'onid3': null,            // callback function for "ID3 data is added/available"
      +    'onload': null,           // callback function for "load finished"
      +    'whileloading': null,     // callback function for "download progress update" (X of Y bytes received)
      +    'onplay': null,           // callback for "play" start
      +    'onpause': null,          // callback for "pause"
      +    'onresume': null,         // callback for "resume" (pause toggle)
      +    'whileplaying': null,     // callback during play (position update)
      +    'onposition': null,       // object containing times and function callbacks for positions of interest
      +    'onstop': null,           // callback for "user stop"
      +    'onfailure': null,        // callback function for when playing fails
      +    'onfinish': null,         // callback function for "sound finished playing"
      +    'multiShot': true,        // let sounds "restart" or layer on top of each other when played multiple times, rather than one-shot/one at a time
      +    'multiShotEvents': false, // fire multiple sound events (currently onfinish() only) when multiShot is enabled
      +    'position': null,         // offset (milliseconds) to seek to within loaded sound data.
      +    'pan': 0,                 // "pan" settings, left-to-right, -100 to 100
      +    'stream': true,           // allows playing before entire file has loaded (recommended)
      +    'to': null,               // position to end playback within a sound (msec), default = end
      +    'type': null,             // MIME-like hint for file pattern / canPlay() tests, eg. audio/mp3
      +    'usePolicyFile': false,   // enable crossdomain.xml request for audio on remote domains (for ID3/waveform access)
      +    'volume': 100             // self-explanatory. 0-100, the latter being the max.
      +
      +  };
      +
      +  this.flash9Options = {
      +
      +    /**
      +     * flash 9-only options,
      +     * merged into defaultOptions if flash 9 is being used
      +     */
      +
      +    'isMovieStar': null,      // "MovieStar" MPEG4 audio mode. Null (default) = auto detect MP4, AAC etc. based on URL. true = force on, ignore URL
      +    'usePeakData': false,     // enable left/right channel peak (level) data
      +    'useWaveformData': false, // enable sound spectrum (raw waveform data) - NOTE: May increase CPU load.
      +    'useEQData': false,       // enable sound EQ (frequency spectrum data) - NOTE: May increase CPU load.
      +    'onbufferchange': null,   // callback for "isBuffering" property change
      +    'ondataerror': null       // callback for waveform/eq data access error (flash playing audio in other tabs/domains)
      +
      +  };
      +
      +  this.movieStarOptions = {
      +
      +    /**
      +     * flash 9.0r115+ MPEG4 audio options,
      +     * merged into defaultOptions if flash 9+movieStar mode is enabled
      +     */
      +
      +    'bufferTime': 3,          // seconds of data to buffer before playback begins (null = flash default of 0.1 seconds - if AAC playback is gappy, try increasing.)
      +    'serverURL': null,        // rtmp: FMS or FMIS server to connect to, required when requesting media via RTMP or one of its variants
      +    'onconnect': null,        // rtmp: callback for connection to flash media server
      +    'duration': null          // rtmp: song duration (msec)
      +
      +  };
      +
      +  this.audioFormats = {
      +
      +    /**
      +     * determines HTML5 support + flash requirements.
      +     * if no support (via flash and/or HTML5) for a "required" format, SM2 will fail to start.
      +     * flash fallback is used for MP3 or MP4 if HTML5 can't play it (or if preferFlash = true)
      +     */
      +
      +    'mp3': {
      +      'type': ['audio/mpeg; codecs="mp3"', 'audio/mpeg', 'audio/mp3', 'audio/MPA', 'audio/mpa-robust'],
      +      'required': true
      +    },
      +
      +    'mp4': {
      +      'related': ['aac','m4a','m4b'], // additional formats under the MP4 container
      +      'type': ['audio/mp4; codecs="mp4a.40.2"', 'audio/aac', 'audio/x-m4a', 'audio/MP4A-LATM', 'audio/mpeg4-generic'],
      +      'required': false
      +    },
      +
      +    'ogg': {
      +      'type': ['audio/ogg; codecs=vorbis'],
      +      'required': false
      +    },
      +
      +    'opus': {
      +      'type': ['audio/ogg; codecs=opus', 'audio/opus'],
      +      'required': false
      +    },
      +
      +    'wav': {
      +      'type': ['audio/wav; codecs="1"', 'audio/wav', 'audio/wave', 'audio/x-wav'],
      +      'required': false
      +    }
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML attributes (id + class names) for the SWF container

      + +
      + +
      +  this.movieID = 'sm2-container';
      +  this.id = (smID || 'sm2movie');
      +
      +  this.debugID = 'soundmanager-debug';
      +  this.debugURLParam = /([#?&])debug=1/i;
      + +
    • + + +
    • +
      + +
      + +
      +

      dynamic attributes

      + +
      + +
      +  this.versionNumber = 'V2.97a.20131201';
      +  this.version = null;
      +  this.movieURL = null;
      +  this.altURL = null;
      +  this.swfLoaded = false;
      +  this.enabled = false;
      +  this.oMC = null;
      +  this.sounds = {};
      +  this.soundIDs = [];
      +  this.muted = false;
      +  this.didFlashBlock = false;
      +  this.filePattern = null;
      +
      +  this.filePatterns = {
      +
      +    'flash8': /\.mp3(\?.*)?$/i,
      +    'flash9': /\.mp3(\?.*)?$/i
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      support indicators, set at init

      + +
      + +
      +  this.features = {
      +
      +    'buffering': false,
      +    'peakData': false,
      +    'waveformData': false,
      +    'eqData': false,
      +    'movieStar': false
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      flash sandbox info, used primarily in troubleshooting

      + +
      + +
      +  this.sandbox = {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          'type': null,
      +    'types': {
      +      'remote': 'remote (domain-based) rules',
      +      'localWithFile': 'local with file access (no internet access)',
      +      'localWithNetwork': 'local with network (internet access only, no local access)',
      +      'localTrusted': 'local, trusted (local+internet access)'
      +    },
      +    'description': null,
      +    'noRemote': null,
      +    'noLocal': null
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  /**
      +   * format support (html5/flash)
      +   * stores canPlayType() results based on audioFormats.
      +   * eg. { mp3: boolean, mp4: boolean }
      +   * treat as read-only.
      +   */
      +
      +  this.html5 = {
      +    'usingFlash': null // set if/when flash fallback is needed
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      file type support hash

      + +
      + +
        this.flash = {};
      + +
    • + + +
    • +
      + +
      + +
      +

      determined at init time

      + +
      + +
        this.html5Only = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      used for special cases (eg. iPad/iPhone/palm OS?)

      + +
      + +
        this.ignoreFlash = false;
      +
      +  /**
      +   * a few private internals (OK, a lot. :D)
      +   */
      +
      +  var SMSound,
      +  sm2 = this, globalHTML5Audio = null, flash = null, sm = 'soundManager', smc = sm + ': ', h5 = 'HTML5::', id, ua = navigator.userAgent, wl = window.location.href.toString(), doc = document, doNothing, setProperties, init, fV, on_queue = [], debugOpen = true, debugTS, didAppend = false, appendSuccess = false, didInit = false, disabled = false, windowLoaded = false, _wDS, wdCount = 0, initComplete, mixin, assign, extraOptions, addOnEvent, processOnEvents, initUserOnload, delayWaitForEI, waitForEI, rebootIntoHTML5, setVersionInfo, handleFocus, strings, initMovie, preInit, domContentLoaded, winOnLoad, didDCLoaded, getDocument, createMovie, catchError, setPolling, initDebug, debugLevels = ['log', 'info', 'warn', 'error'], defaultFlashVersion = 8, disableObject, failSafely, normalizeMovieURL, oRemoved = null, oRemovedHTML = null, str, flashBlockHandler, getSWFCSS, swfCSS, toggleDebug, loopFix, policyFix, complain, idCheck, waitingForEI = false, initPending = false, startTimer, stopTimer, timerExecute, h5TimerCount = 0, h5IntervalTimer = null, parseURL, messages = [],
      +  canIgnoreFlash, needsFlash = null, featureCheck, html5OK, html5CanPlay, html5Ext, html5Unload, domContentLoadedIE, testHTML5, event, slice = Array.prototype.slice, useGlobalHTML5Audio = false, lastGlobalHTML5URL, hasFlash, detectFlash, badSafariFix, html5_events, showSupport, flushMessages, wrapCallback, idCounter = 0,
      +  is_iDevice = ua.match(/(ipad|iphone|ipod)/i), isAndroid = ua.match(/android/i), isIE = ua.match(/msie/i), isWebkit = ua.match(/webkit/i), isSafari = (ua.match(/safari/i) && !ua.match(/chrome/i)), isOpera = (ua.match(/opera/i)),
      +  mobileHTML5 = (ua.match(/(mobile|pre\/|xoom)/i) || is_iDevice || isAndroid),
      +  isBadSafari = (!wl.match(/usehtml5audio/i) && !wl.match(/sm2\-ignorebadua/i) && isSafari && !ua.match(/silk/i) && ua.match(/OS X 10_6_([3-7])/i)), // Safari 4 and 5 (excluding Kindle Fire, "Silk") occasionally fail to load/play HTML5 audio on Snow Leopard 10.6.3 through 10.6.7 due to bug(s) in QuickTime X and/or other underlying frameworks. :/ Confirmed bug. https://bugs.webkit.org/show_bug.cgi?id=32159
      +  hasConsole = (window.console !== _undefined && console.log !== _undefined), isFocused = (doc.hasFocus !== _undefined?doc.hasFocus():null), tryInitOnFocus = (isSafari && (doc.hasFocus === _undefined || !doc.hasFocus())), okToDisable = !tryInitOnFocus, flashMIME = /(mp3|mp4|mpa|m4a|m4b)/i, msecScale = 1000,
      +  emptyURL = 'about:blank', // safe URL to unload, or load nothing from (flash 8 + most HTML5 UAs)
      +  emptyWAV = 'data:audio/wave;base64,/UklGRiYAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQIAAAD//w==', // tiny WAV for HTML5 unloading
      +  overHTTP = (doc.location?doc.location.protocol.match(/http/i):null),
      +  http = (!overHTTP ? 'http:/'+'/' : ''),
      + +
    • + + +
    • +
      + +
      + +
      +

      mp3, mp4, aac etc.

      + +
      + +
        netStreamMimeTypes = /^\s*audio\/(?:x-)?(?:mpeg4|aac|flv|mov|mp4||m4v|m4a|m4b|mp4v|3gp|3g2)\s*(?:$|;)/i,
      + +
    • + + +
    • +
      + +
      + +
      +

      Flash v9.0r115+ "moviestar" formats

      + +
      + +
        netStreamTypes = ['mpeg4', 'aac', 'flv', 'mov', 'mp4', 'm4v', 'f4v', 'm4a', 'm4b', 'mp4v', '3gp', '3g2'],
      +  netStreamPattern = new RegExp('\\.(' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
      +
      +  this.mimePattern = /^\s*audio\/(?:x-)?(?:mp(?:eg|3))\s*(?:$|;)/i; // default mp3 set
      + +
    • + + +
    • +
      + +
      + +
      +

      use altURL if not "online"

      + +
      + +
        this.useAltURL = !overHTTP;
      +
      +  swfCSS = {
      +
      +    'swfBox': 'sm2-object-box',
      +    'swfDefault': 'movieContainer',
      +    'swfError': 'swf_error', // SWF loaded, but SM2 couldn't start (other error)
      +    'swfTimedout': 'swf_timedout',
      +    'swfLoaded': 'swf_loaded',
      +    'swfUnblocked': 'swf_unblocked', // or loaded OK
      +    'sm2Debug': 'sm2_debug',
      +    'highPerf': 'high_performance',
      +    'flashDebug': 'flash_debug'
      +
      +  };
      +
      +  /**
      +   * basic HTML5 Audio() support test
      +   * try...catch because of IE 9 "not implemented" nonsense
      +   * https://github.com/Modernizr/Modernizr/issues/224
      +   */
      +
      +  this.hasHTML5 = (function() {
      +    try {
      + +
    • + + +
    • +
      + +
      + +
      +

      new Audio(null) for stupid Opera 9.64 case, which throws not_enough_arguments exception otherwise.

      + +
      + +
            return (Audio !== _undefined && (isOpera && opera !== _undefined && opera.version() < 10 ? new Audio(null) : new Audio()).canPlayType !== _undefined);
      +    } catch(e) {
      +      return false;
      +    }
      +  }());
      +
      +  /**
      +   * Public SoundManager API
      +   * -----------------------
      +   */
      +
      +  /**
      +   * Configures top-level soundManager properties.
      +   *
      +   * @param {object} options Option parameters, eg. { flashVersion: 9, url: '/path/to/swfs/' }
      +   * onready and ontimeout are also accepted parameters. call soundManager.setup() to see the full list.
      +   */
      +
      +  this.setup = function(options) {
      +
      +    var noURL = (!sm2.url);
      + +
    • + + +
    • +
      + +
      + +
      +

      warn if flash options have already been applied

      + +
      + +
      +    if (options !== _undefined && didInit && needsFlash && sm2.ok() && (options.flashVersion !== _undefined || options.url !== _undefined || options.html5Test !== _undefined)) {
      +      complain(str('setupLate'));
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: defer: true?

      + +
      + +
      +    assign(options);
      + +
    • + + +
    • +
      + +
      + +
      +

      special case 1: "Late setup". SM2 loaded normally, but user didn't assign flash URL eg., setup({url:...}) before SM2 init. Treat as delayed init.

      + +
      + +
      +    if (options) {
      +
      +      if (noURL && didDCLoaded && options.url !== _undefined) {
      +        sm2.beginDelayedInit();
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      special case 2: If lazy-loading SM2 (DOMContentLoaded has already happened) and user calls setup() with url: parameter, try to init ASAP.

      + +
      + +
      +      if (!didDCLoaded && options.url !== _undefined && doc.readyState === 'complete') {
      +        setTimeout(domContentLoaded, 1);
      +      }
      +
      +    }
      +
      +    return sm2;
      +
      +  };
      +
      +  this.ok = function() {
      +
      +    return (needsFlash ? (didInit && !disabled) : (sm2.useHTML5Audio && sm2.hasHTML5));
      +
      +  };
      +
      +  this.supported = this.ok; // legacy
      +
      +  this.getMovie = function(smID) {
      + +
    • + + +
    • +
      + +
      + +
      +

      safety net: some old browsers differ on SWF references, possibly related to ExternalInterface / flash version

      + +
      + +
          return id(smID) || doc[smID] || window[smID];
      +
      +  };
      +
      +  /**
      +   * Creates a SMSound sound object instance.
      +   *
      +   * @param {object} oOptions Sound options (at minimum, id and url parameters are required.)
      +   * @return {object} SMSound The new SMSound object.
      +   */
      +
      +  this.createSound = function(oOptions, _url) {
      +
      +    var cs, cs_string, options, oSound = null;
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          cs = sm + '.createSound(): ';
      +    cs_string = cs + str(!didInit?'notReady':'notOK');
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    if (!didInit || !sm2.ok()) {
      +      complain(cs_string);
      +      return false;
      +    }
      +
      +    if (_url !== _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      function overloading in JS! :) ..assume simple createSound(id, url) use case

      + +
      + +
            oOptions = {
      +        'id': oOptions,
      +        'url': _url
      +      };
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      inherit from defaultOptions

      + +
      + +
          options = mixin(oOptions);
      +
      +    options.url = parseURL(options.url);
      + +
    • + + +
    • +
      + +
      + +
      +

      generate an id, if needed.

      + +
      + +
          if (options.id === undefined) {
      +      options.id = sm2.setupOptions.idPrefix + (idCounter++);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          if (options.id.toString().charAt(0).match(/^[0-9]$/)) {
      +      sm2._wD(cs + str('badID', options.id), 2);
      +    }
      +
      +    sm2._wD(cs + options.id + (options.url ? ' (' + options.url + ')' : ''), 1);
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    if (idCheck(options.id, true)) {
      +      sm2._wD(cs + options.id + ' exists', 1);
      +      return sm2.sounds[options.id];
      +    }
      +
      +    function make() {
      +
      +      options = loopFix(options);
      +      sm2.sounds[options.id] = new SMSound(options);
      +      sm2.soundIDs.push(options.id);
      +      return sm2.sounds[options.id];
      +
      +    }
      +
      +    if (html5OK(options)) {
      +
      +      oSound = make();
      +      sm2._wD(options.id + ': Using HTML5');
      +      oSound._setup_html5(options);
      +
      +    } else {
      +
      +      if (sm2.html5Only) {
      +        sm2._wD(options.id + ': No HTML5 support for this sound, and no Flash. Exiting.');
      +        return make();
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: Move HTML5/flash checks into generic URL parsing/handling function.

      + +
      + +
      +      if (sm2.html5.usingFlash && options.url && options.url.match(/data\:/i)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      data: URIs not supported by Flash, either.

      + +
      + +
              sm2._wD(options.id + ': data: URIs not supported via Flash. Exiting.');
      +        return make();
      +      }
      +
      +      if (fV > 8) {
      +        if (options.isMovieStar === null) {
      + +
    • + + +
    • +
      + +
      + +
      +

      attempt to detect MPEG-4 formats

      + +
      + +
                options.isMovieStar = !!(options.serverURL || (options.type ? options.type.match(netStreamMimeTypes) : false) || (options.url && options.url.match(netStreamPattern)));
      +        }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
              if (options.isMovieStar) {
      +          sm2._wD(cs + 'using MovieStar handling');
      +          if (options.loops > 1) {
      +            _wDS('noNSLoop');
      +          }
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
            }
      +
      +      options = policyFix(options, cs);
      +      oSound = make();
      +
      +      if (fV === 8) {
      +        flash._createSound(options.id, options.loops||1, options.usePolicyFile);
      +      } else {
      +        flash._createSound(options.id, options.url, options.usePeakData, options.useWaveformData, options.useEQData, options.isMovieStar, (options.isMovieStar?options.bufferTime:false), options.loops||1, options.serverURL, options.duration||null, options.autoPlay, true, options.autoLoad, options.usePolicyFile);
      +        if (!options.serverURL) {
      + +
    • + + +
    • +
      + +
      + +
      +

      We are connected immediately

      + +
      + +
                oSound.connected = true;
      +          if (options.onconnect) {
      +            options.onconnect.apply(oSound);
      +          }
      +        }
      +      }
      +
      +      if (!options.serverURL && (options.autoLoad || options.autoPlay)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      call load for non-rtmp streams

      + +
      + +
              oSound.load(options);
      +      }
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      rtmp will play in onconnect

      + +
      + +
          if (!options.serverURL && options.autoPlay) {
      +      oSound.play();
      +    }
      +
      +    return oSound;
      +
      +  };
      +
      +  /**
      +   * Destroys a SMSound sound object instance.
      +   *
      +   * @param {string} sID The ID of the sound to destroy
      +   */
      +
      +  this.destroySound = function(sID, _bFromSound) {
      + +
    • + + +
    • +
      + +
      + +
      +

      explicitly destroy a sound before normal page unload, etc.

      + +
      + +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +
      +    var oS = sm2.sounds[sID], i;
      + +
    • + + +
    • +
      + +
      + +
      +

      Disable all callbacks while the sound is being destroyed

      + +
      + +
          oS._iO = {};
      +
      +    oS.stop();
      +    oS.unload();
      +
      +    for (i = 0; i < sm2.soundIDs.length; i++) {
      +      if (sm2.soundIDs[i] === sID) {
      +        sm2.soundIDs.splice(i, 1);
      +        break;
      +      }
      +    }
      +
      +    if (!_bFromSound) {
      + +
    • + + +
    • +
      + +
      + +
      +

      ignore if being called from SMSound instance

      + +
      + +
            oS.destruct(true);
      +    }
      +
      +    oS = null;
      +    delete sm2.sounds[sID];
      +
      +    return true;
      +
      +  };
      +
      +  /**
      +   * Calls the load() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {object} oOptions Optional: Sound options
      +   */
      +
      +  this.load = function(sID, oOptions) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].load(oOptions);
      +
      +  };
      +
      +  /**
      +   * Calls the unload() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   */
      +
      +  this.unload = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].unload();
      +
      +  };
      +
      +  /**
      +   * Calls the onPosition() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {number} nPosition The position to watch for
      +   * @param {function} oMethod The relevant callback to fire
      +   * @param {object} oScope Optional: The scope to apply the callback to
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.onPosition = function(sID, nPosition, oMethod, oScope) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].onposition(nPosition, oMethod, oScope);
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy/backwards-compability: lower-case method name

      + +
      + +
        this.onposition = this.onPosition;
      +
      +  /**
      +   * Calls the clearOnPosition() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {number} nPosition The position to watch for
      +   * @param {function} oMethod Optional: The relevant callback to fire
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.clearOnPosition = function(sID, nPosition, oMethod) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].clearOnPosition(nPosition, oMethod);
      +
      +  };
      +
      +  /**
      +   * Calls the play() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {object} oOptions Optional: Sound options
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.play = function(sID, oOptions) {
      +
      +    var result = null,
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy function-overloading use case: play('mySound', '/path/to/some.mp3');

      + +
      + +
              overloaded = (oOptions && !(oOptions instanceof Object));
      +
      +    if (!didInit || !sm2.ok()) {
      +      complain(sm + '.play(): ' + str(!didInit?'notReady':'notOK'));
      +      return false;
      +    }
      +
      +    if (!idCheck(sID, overloaded)) {
      +
      +      if (!overloaded) {
      + +
    • + + +
    • +
      + +
      + +
      +

      no sound found for the given ID. Bail.

      + +
      + +
              return false;
      +      }
      +
      +      if (overloaded) {
      +        oOptions = {
      +          url: oOptions
      +        };
      +      }
      +
      +      if (oOptions && oOptions.url) {
      + +
    • + + +
    • +
      + +
      + +
      +

      overloading use case, create+play: .play('someID', {url:'/path/to.mp3'});

      + +
      + +
              sm2._wD(sm + '.play(): Attempting to create "' + sID + '"', 1);
      +        oOptions.id = sID;
      +        result = sm2.createSound(oOptions).play();
      +      }
      +
      +    } else if (overloaded) {
      + +
    • + + +
    • +
      + +
      + +
      +

      existing sound object case

      + +
      + +
            oOptions = {
      +        url: oOptions
      +      };
      +
      +    }
      +
      +    if (result === null) {
      + +
    • + + +
    • +
      + +
      + +
      +

      default case

      + +
      + +
            result = sm2.sounds[sID].play(oOptions);
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  this.start = this.play; // just for convenience
      +
      +  /**
      +   * Calls the setPosition() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {number} nMsecOffset Position (milliseconds)
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.setPosition = function(sID, nMsecOffset) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].setPosition(nMsecOffset);
      +
      +  };
      +
      +  /**
      +   * Calls the stop() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.stop = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +
      +    sm2._wD(sm + '.stop(' + sID + ')', 1);
      +    return sm2.sounds[sID].stop();
      +
      +  };
      +
      +  /**
      +   * Stops all currently-playing sounds.
      +   */
      +
      +  this.stopAll = function() {
      +
      +    var oSound;
      +    sm2._wD(sm + '.stopAll()', 1);
      +
      +    for (oSound in sm2.sounds) {
      +      if (sm2.sounds.hasOwnProperty(oSound)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      apply only to sound objects

      + +
      + +
              sm2.sounds[oSound].stop();
      +      }
      +    }
      +
      +  };
      +
      +  /**
      +   * Calls the pause() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.pause = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].pause();
      +
      +  };
      +
      +  /**
      +   * Pauses all currently-playing sounds.
      +   */
      +
      +  this.pauseAll = function() {
      +
      +    var i;
      +    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +      sm2.sounds[sm2.soundIDs[i]].pause();
      +    }
      +
      +  };
      +
      +  /**
      +   * Calls the resume() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.resume = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].resume();
      +
      +  };
      +
      +  /**
      +   * Resumes all currently-paused sounds.
      +   */
      +
      +  this.resumeAll = function() {
      +
      +    var i;
      +    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +      sm2.sounds[sm2.soundIDs[i]].resume();
      +    }
      +
      +  };
      +
      +  /**
      +   * Calls the togglePause() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.togglePause = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].togglePause();
      +
      +  };
      +
      +  /**
      +   * Calls the setPan() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {number} nPan The pan value (-100 to 100)
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.setPan = function(sID, nPan) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].setPan(nPan);
      +
      +  };
      +
      +  /**
      +   * Calls the setVolume() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @param {number} nVol The volume value (0 to 100)
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.setVolume = function(sID, nVol) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].setVolume(nVol);
      +
      +  };
      +
      +  /**
      +   * Calls the mute() method of either a single SMSound object by ID, or all sound objects.
      +   *
      +   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
      +   */
      +
      +  this.mute = function(sID) {
      +
      +    var i = 0;
      +
      +    if (sID instanceof String) {
      +      sID = null;
      +    }
      +
      +    if (!sID) {
      +
      +      sm2._wD(sm + '.mute(): Muting all sounds');
      +      for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +        sm2.sounds[sm2.soundIDs[i]].mute();
      +      }
      +      sm2.muted = true;
      +
      +    } else {
      +
      +      if (!idCheck(sID)) {
      +        return false;
      +      }
      +      sm2._wD(sm + '.mute(): Muting "' + sID + '"');
      +      return sm2.sounds[sID].mute();
      +
      +    }
      +
      +    return true;
      +
      +  };
      +
      +  /**
      +   * Mutes all sounds.
      +   */
      +
      +  this.muteAll = function() {
      +
      +    sm2.mute();
      +
      +  };
      +
      +  /**
      +   * Calls the unmute() method of either a single SMSound object by ID, or all sound objects.
      +   *
      +   * @param {string} sID Optional: The ID of the sound (if omitted, all sounds will be used.)
      +   */
      +
      +  this.unmute = function(sID) {
      +
      +    var i;
      +
      +    if (sID instanceof String) {
      +      sID = null;
      +    }
      +
      +    if (!sID) {
      +
      +      sm2._wD(sm + '.unmute(): Unmuting all sounds');
      +      for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +        sm2.sounds[sm2.soundIDs[i]].unmute();
      +      }
      +      sm2.muted = false;
      +
      +    } else {
      +
      +      if (!idCheck(sID)) {
      +        return false;
      +      }
      +      sm2._wD(sm + '.unmute(): Unmuting "' + sID + '"');
      +      return sm2.sounds[sID].unmute();
      +
      +    }
      +
      +    return true;
      +
      +  };
      +
      +  /**
      +   * Unmutes all sounds.
      +   */
      +
      +  this.unmuteAll = function() {
      +
      +    sm2.unmute();
      +
      +  };
      +
      +  /**
      +   * Calls the toggleMute() method of a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.toggleMute = function(sID) {
      +
      +    if (!idCheck(sID)) {
      +      return false;
      +    }
      +    return sm2.sounds[sID].toggleMute();
      +
      +  };
      +
      +  /**
      +   * Retrieves the memory used by the flash plugin.
      +   *
      +   * @return {number} The amount of memory in use
      +   */
      +
      +  this.getMemoryUse = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash-only

      + +
      + +
          var ram = 0;
      +
      +    if (flash && fV !== 8) {
      +      ram = parseInt(flash._getMemoryUse(), 10);
      +    }
      +
      +    return ram;
      +
      +  };
      +
      +  /**
      +   * Undocumented: NOPs soundManager and all SMSound objects.
      +   */
      +
      +  this.disable = function(bNoDisable) {
      + +
    • + + +
    • +
      + +
      + +
      +

      destroy all functions

      + +
      + +
          var i;
      +
      +    if (bNoDisable === _undefined) {
      +      bNoDisable = false;
      +    }
      +
      +    if (disabled) {
      +      return false;
      +    }
      +
      +    disabled = true;
      +    _wDS('shutdown', 1);
      +
      +    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +      disableObject(sm2.sounds[sm2.soundIDs[i]]);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      fire "complete", despite fail

      + +
      + +
          initComplete(bNoDisable);
      +    event.remove(window, 'load', initUserOnload);
      +
      +    return true;
      +
      +  };
      +
      +  /**
      +   * Determines playability of a MIME type, eg. 'audio/mp3'.
      +   */
      +
      +  this.canPlayMIME = function(sMIME) {
      +
      +    var result;
      +
      +    if (sm2.hasHTML5) {
      +      result = html5CanPlay({type:sMIME});
      +    }
      +
      +    if (!result && needsFlash) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if flash 9, test netStream (movieStar) types as well.

      + +
      + +
            result = (sMIME && sm2.ok() ? !!((fV > 8 ? sMIME.match(netStreamMimeTypes) : null) || sMIME.match(sm2.mimePattern)) : null); // TODO: make less "weird" (per JSLint)
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * Determines playability of a URL based on audio support.
      +   *
      +   * @param {string} sURL The URL to test
      +   * @return {boolean} URL playability
      +   */
      +
      +  this.canPlayURL = function(sURL) {
      +
      +    var result;
      +
      +    if (sm2.hasHTML5) {
      +      result = html5CanPlay({url: sURL});
      +    }
      +
      +    if (!result && needsFlash) {
      +      result = (sURL && sm2.ok() ? !!(sURL.match(sm2.filePattern)) : null);
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * Determines playability of an HTML DOM &lt;a&gt; object (or similar object literal) based on audio support.
      +   *
      +   * @param {object} oLink an HTML DOM &lt;a&gt; object or object literal including href and/or type attributes
      +   * @return {boolean} URL playability
      +   */
      +
      +  this.canPlayLink = function(oLink) {
      +
      +    if (oLink.type !== _undefined && oLink.type) {
      +      if (sm2.canPlayMIME(oLink.type)) {
      +        return true;
      +      }
      +    }
      +
      +    return sm2.canPlayURL(oLink.href);
      +
      +  };
      +
      +  /**
      +   * Retrieves a SMSound object by ID.
      +   *
      +   * @param {string} sID The ID of the sound
      +   * @return {SMSound} The SMSound object
      +   */
      +
      +  this.getSoundById = function(sID, _suppressDebug) {
      +
      +    if (!sID) {
      +      return null;
      +    }
      +
      +    var result = sm2.sounds[sID];
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          if (!result && !_suppressDebug) {
      +      sm2._wD(sm + '.getSoundById(): Sound "' + sID + '" not found.', 2);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * Queues a callback for execution when SoundManager has successfully initialized.
      +   *
      +   * @param {function} oMethod The callback method to fire
      +   * @param {object} oScope Optional: The scope to apply to the callback
      +   */
      +
      +  this.onready = function(oMethod, oScope) {
      +
      +    var sType = 'onready',
      +        result = false;
      +
      +    if (typeof oMethod === 'function') {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (didInit) {
      +        sm2._wD(str('queue', sType));
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      if (!oScope) {
      +        oScope = window;
      +      }
      +
      +      addOnEvent(sType, oMethod, oScope);
      +      processOnEvents();
      +
      +      result = true;
      +
      +    } else {
      +
      +      throw str('needFunction', sType);
      +
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * Queues a callback for execution when SoundManager has failed to initialize.
      +   *
      +   * @param {function} oMethod The callback method to fire
      +   * @param {object} oScope Optional: The scope to apply to the callback
      +   */
      +
      +  this.ontimeout = function(oMethod, oScope) {
      +
      +    var sType = 'ontimeout',
      +        result = false;
      +
      +    if (typeof oMethod === 'function') {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (didInit) {
      +        sm2._wD(str('queue', sType));
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      if (!oScope) {
      +        oScope = window;
      +      }
      +
      +      addOnEvent(sType, oMethod, oScope);
      +      processOnEvents({type:sType});
      +
      +      result = true;
      +
      +    } else {
      +
      +      throw str('needFunction', sType);
      +
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * Writes console.log()-style debug output to a console or in-browser element.
      +   * Applies when debugMode = true
      +   *
      +   * @param {string} sText The console message
      +   * @param {object} nType Optional log level (number), or object. Number case: Log type/style where 0 = 'info', 1 = 'warn', 2 = 'error'. Object case: Object to be dumped.
      +   */
      +
      +  this._writeDebug = function(sText, sTypeOrObject) {
      + +
    • + + +
    • +
      + +
      + +
      +

      pseudo-private console.log()-style output

      + + +
      + +
      +    var sDID = 'soundmanager-debug', o, oItem;
      +
      +    if (!sm2.debugMode) {
      +      return false;
      +    }
      +
      +    if (hasConsole && sm2.useConsole) {
      +      if (sTypeOrObject && typeof sTypeOrObject === 'object') {
      + +
    • + + +
    • +
      + +
      + +
      +

      object passed; dump to console.

      + +
      + +
              console.log(sText, sTypeOrObject);
      +      } else if (debugLevels[sTypeOrObject] !== _undefined) {
      +        console[debugLevels[sTypeOrObject]](sText);
      +      } else {
      +        console.log(sText);
      +      }
      +      if (sm2.consoleOnly) {
      +        return true;
      +      }
      +    }
      +
      +    o = id(sDID);
      +
      +    if (!o) {
      +      return false;
      +    }
      +
      +    oItem = doc.createElement('div');
      +
      +    if (++wdCount % 2 === 0) {
      +      oItem.className = 'sm2-alt';
      +    }
      +
      +    if (sTypeOrObject === _undefined) {
      +      sTypeOrObject = 0;
      +    } else {
      +      sTypeOrObject = parseInt(sTypeOrObject, 10);
      +    }
      +
      +    oItem.appendChild(doc.createTextNode(sText));
      +
      +    if (sTypeOrObject) {
      +      if (sTypeOrObject >= 2) {
      +        oItem.style.fontWeight = 'bold';
      +      }
      +      if (sTypeOrObject === 3) {
      +        oItem.style.color = '#ff3333';
      +      }
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      top-to-bottom +o.appendChild(oItem);

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      bottom-to-top

      + +
      + +
          o.insertBefore(oItem, o.firstChild);
      +
      +    o = null;
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    return true;
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      +last-resort debugging option

      + +
      + +
        if (wl.indexOf('sm2-debug=alert') !== -1) {
      +    this._writeDebug = function(sText) {
      +      window.alert(sText);
      +    };
      +  }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      alias

      + +
      + +
        this._wD = this._writeDebug;
      +
      +  /**
      +   * Provides debug / state information on all SMSound objects.
      +   */
      +
      +  this._debug = function() {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          var i, j;
      +    _wDS('currentObj', 1);
      +
      +    for (i = 0, j = sm2.soundIDs.length; i < j; i++) {
      +      sm2.sounds[sm2.soundIDs[i]]._debug();
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  /**
      +   * Restarts and re-initializes the SoundManager instance.
      +   *
      +   * @param {boolean} resetEvents Optional: When true, removes all registered onready and ontimeout event callbacks.
      +   * @param {boolean} excludeInit Options: When true, does not call beginDelayedInit() (which would restart SM2).
      +   * @return {object} soundManager The soundManager instance.
      +   */
      +
      +  this.reboot = function(resetEvents, excludeInit) {
      + +
    • + + +
    • +
      + +
      + +
      +

      reset some (or all) state, and re-init unless otherwise specified.

      + +
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          if (sm2.soundIDs.length) {
      +      sm2._wD('Destroying ' + sm2.soundIDs.length + ' SMSound object' + (sm2.soundIDs.length !== 1 ? 's' : '') + '...');
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    var i, j, k;
      +
      +    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +      sm2.sounds[sm2.soundIDs[i]].destruct();
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      trash ze flash (remove from the DOM)

      + +
      + +
      +    if (flash) {
      +
      +      try {
      +
      +        if (isIE) {
      +          oRemovedHTML = flash.innerHTML;
      +        }
      +
      +        oRemoved = flash.parentNode.removeChild(flash);
      +
      +      } catch(e) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Remove failed? May be due to flash blockers silently removing the SWF object/embed node from the DOM. Warn and continue.

      + +
      + +
      +        _wDS('badRemove', 2);
      +
      +      }
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      actually, force recreate of movie.

      + +
      + +
      +    oRemovedHTML = oRemoved = needsFlash = flash = null;
      +
      +    sm2.enabled = didDCLoaded = didInit = waitingForEI = initPending = didAppend = appendSuccess = disabled = useGlobalHTML5Audio = sm2.swfLoaded = false;
      +
      +    sm2.soundIDs = [];
      +    sm2.sounds = {};
      +
      +    idCounter = 0;
      +
      +    if (!resetEvents) {
      + +
    • + + +
    • +
      + +
      + +
      +

      reset callbacks for onready, ontimeout etc. so that they will fire again on re-init

      + +
      + +
            for (i in on_queue) {
      +        if (on_queue.hasOwnProperty(i)) {
      +          for (j = 0, k = on_queue[i].length; j < k; j++) {
      +            on_queue[i][j].fired = false;
      +          }
      +        }
      +      }
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      remove all callbacks entirely

      + +
      + +
            on_queue = [];
      +    }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          if (!excludeInit) {
      +      sm2._wD(sm + ': Rebooting...');
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      reset HTML5 and flash canPlay test results

      + +
      + +
      +    sm2.html5 = {
      +      'usingFlash': null
      +    };
      +
      +    sm2.flash = {};
      + +
    • + + +
    • +
      + +
      + +
      +

      reset device-specific HTML/flash mode switches

      + +
      + +
      +    sm2.html5Only = false;
      +    sm2.ignoreFlash = false;
      +
      +    window.setTimeout(function() {
      +
      +      preInit();
      + +
    • + + +
    • +
      + +
      + +
      +

      by default, re-init

      + +
      + +
      +      if (!excludeInit) {
      +        sm2.beginDelayedInit();
      +      }
      +
      +    }, 20);
      +
      +    return sm2;
      +
      +  };
      +
      +  this.reset = function() {
      +
      +    /**
      +     * Shuts down and restores the SoundManager instance to its original loaded state, without an explicit reboot. All onready/ontimeout handlers are removed.
      +     * After this call, SM2 may be re-initialized via soundManager.beginDelayedInit().
      +     * @return {object} soundManager The soundManager instance.
      +     */
      +
      +    _wDS('reset');
      +    return sm2.reboot(true, true);
      +
      +  };
      +
      +  /**
      +   * Undocumented: Determines the SM2 flash movie's load progress.
      +   *
      +   * @return {number or null} Percent loaded, or if invalid/unsupported, null.
      +   */
      +
      +  this.getMoviePercent = function() {
      +
      +    /**
      +     * Interesting syntax notes...
      +     * Flash/ExternalInterface (ActiveX/NPAPI) bridge methods are not typeof "function" nor instanceof Function, but are still valid.
      +     * Additionally, JSLint dislikes ('PercentLoaded' in flash)-style syntax and recommends hasOwnProperty(), which does not work in this case.
      +     * Furthermore, using (flash && flash.PercentLoaded) causes IE to throw "object doesn't support this property or method".
      +     * Thus, 'in' syntax must be used.
      +     */
      +
      +    return (flash && 'PercentLoaded' in flash ? flash.PercentLoaded() : null); // Yes, JSLint. See nearby comment in source for explanation.
      +
      +  };
      +
      +  /**
      +   * Additional helper for manually invoking SM2's init process after DOM Ready / window.onload().
      +   */
      +
      +  this.beginDelayedInit = function() {
      +
      +    windowLoaded = true;
      +    domContentLoaded();
      +
      +    setTimeout(function() {
      +
      +      if (initPending) {
      +        return false;
      +      }
      +
      +      createMovie();
      +      initMovie();
      +      initPending = true;
      +
      +      return true;
      +
      +    }, 20);
      +
      +    delayWaitForEI();
      +
      +  };
      +
      +  /**
      +   * Destroys the SoundManager instance and all SMSound instances.
      +   */
      +
      +  this.destruct = function() {
      +
      +    sm2._wD(sm + '.destruct()');
      +    sm2.disable(true);
      +
      +  };
      +
      +  /**
      +   * SMSound() (sound object) constructor
      +   * ------------------------------------
      +   *
      +   * @param {object} oOptions Sound options (id and url are required attributes)
      +   * @return {SMSound} The new SMSound object
      +   */
      +
      +  SMSound = function(oOptions) {
      +
      +    var s = this, resetProperties, add_html5_events, remove_html5_events, stop_html5_timer, start_html5_timer, attachOnPosition, onplay_called = false, onPositionItems = [], onPositionFired = 0, detachOnPosition, applyFromTo, lastURL = null, lastHTML5State, urlOmitted;
      +
      +    lastHTML5State = {
      + +
    • + + +
    • +
      + +
      + +
      +

      tracks duration + position (time)

      + +
      + +
            duration: null,
      +      time: null
      +    };
      +
      +    this.id = oOptions.id;
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy

      + +
      + +
          this.sID = this.id;
      +
      +    this.url = oOptions.url;
      +    this.options = mixin(oOptions);
      + +
    • + + +
    • +
      + +
      + +
      +

      per-play-instance-specific options

      + +
      + +
          this.instanceOptions = this.options;
      + +
    • + + +
    • +
      + +
      + +
      +

      short alias

      + +
      + +
          this._iO = this.instanceOptions;
      + +
    • + + +
    • +
      + +
      + +
      +

      assign property defaults

      + +
      + +
          this.pan = this.options.pan;
      +    this.volume = this.options.volume;
      + +
    • + + +
    • +
      + +
      + +
      +

      whether or not this object is using HTML5

      + +
      + +
          this.isHTML5 = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      internal HTML5 Audio() object reference

      + +
      + +
          this._a = null;
      + +
    • + + +
    • +
      + +
      + +
      +

      for flash 8 special-case createSound() without url, followed by load/play with url case

      + +
      + +
          urlOmitted = (this.url ? false : true);
      +
      +    /**
      +     * SMSound() public methods
      +     * ------------------------
      +     */
      +
      +    this.id3 = {};
      +
      +    /**
      +     * Writes SMSound object parameters to debug console
      +     */
      +
      +    this._debug = function() {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            sm2._wD(s.id + ': Merged options:', s.options);
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    };
      +
      +    /**
      +     * Begins loading a sound per its *url*.
      +     *
      +     * @param {object} oOptions Optional: Sound options
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.load = function(oOptions) {
      +
      +      var oSound = null, instanceOptions;
      +
      +      if (oOptions !== _undefined) {
      +        s._iO = mixin(oOptions, s.options);
      +      } else {
      +        oOptions = s.options;
      +        s._iO = oOptions;
      +        if (lastURL && lastURL !== s.url) {
      +          _wDS('manURL');
      +          s._iO.url = s.url;
      +          s.url = null;
      +        }
      +      }
      +
      +      if (!s._iO.url) {
      +        s._iO.url = s.url;
      +      }
      +
      +      s._iO.url = parseURL(s._iO.url);
      + +
    • + + +
    • +
      + +
      + +
      +

      ensure we're in sync

      + +
      + +
            s.instanceOptions = s._iO;
      + +
    • + + +
    • +
      + +
      + +
      +

      local shortcut

      + +
      + +
            instanceOptions = s._iO;
      +
      +      sm2._wD(s.id + ': load (' + instanceOptions.url + ')');
      +
      +      if (!instanceOptions.url && !s.url) {
      +        sm2._wD(s.id + ': load(): url is unassigned. Exiting.', 2);
      +        return s;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (!s.isHTML5 && fV === 8 && !s.url && !instanceOptions.autoPlay) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash 8 load() -> play() won't work before onload has fired.

      + +
      + +
              sm2._wD(s.id + ': Flash 8 load() limitation: Wait for onload() before calling play().', 1);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      if (instanceOptions.url === s.url && s.readyState !== 0 && s.readyState !== 2) {
      +        _wDS('onURL', 1);
      + +
    • + + +
    • +
      + +
      + +
      +

      if loaded and an onload() exists, fire immediately.

      + +
      + +
              if (s.readyState === 3 && instanceOptions.onload) {
      + +
    • + + +
    • +
      + +
      + +
      +

      assume success based on truthy duration.

      + +
      + +
                wrapCallback(s, function() {
      +            instanceOptions.onload.apply(s, [(!!s.duration)]);
      +          });
      +        }
      +        return s;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      reset a few state properties

      + +
      + +
      +      s.loaded = false;
      +      s.readyState = 1;
      +      s.playState = 0;
      +      s.id3 = {};
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: If switching from HTML5 -> flash (or vice versa), stop currently-playing audio.

      + +
      + +
      +      if (html5OK(instanceOptions)) {
      +
      +        oSound = s._setup_html5(instanceOptions);
      +
      +        if (!oSound._called_load) {
      +
      +          s._html5_canplay = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: review called_load / html5_canplay logic

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      if url provided directly to load(), assign it here.

      + +
      + +
      +          if (s.url !== instanceOptions.url) {
      +
      +            sm2._wD(_wDS('manURL') + ': ' + instanceOptions.url);
      +
      +            s._a.src = instanceOptions.url;
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: review / re-apply all relevant options (volume, loop, onposition etc.)

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      reset position for new URL

      + +
      + +
                  s.setPosition(0);
      +
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      given explicit load call, try to preload.

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      early HTML5 implementation (non-standard)

      + +
      + +
                s._a.autobuffer = 'auto';
      + +
    • + + +
    • +
      + +
      + +
      +

      standard property, values: none / metadata / auto +reference: http://msdn.microsoft.com/en-us/library/ie/ff974759%28v=vs.85%29.aspx

      + +
      + +
                s._a.preload = 'auto';
      +
      +          s._a._called_load = true;
      +
      +        } else {
      +
      +          sm2._wD(s.id + ': Ignoring request to load again');
      +
      +        }
      +
      +      } else {
      +
      +        if (sm2.html5Only) {
      +          sm2._wD(s.id + ': No flash support. Exiting.');
      +          return s;
      +        }
      +
      +        if (s._iO.url && s._iO.url.match(/data\:/i)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      data: URIs not supported by Flash, either.

      + +
      + +
                sm2._wD(s.id + ': data: URIs not supported via Flash. Exiting.');
      +          return s;
      +        }
      +
      +        try {
      +          s.isHTML5 = false;
      +          s._iO = policyFix(loopFix(instanceOptions));
      + +
    • + + +
    • +
      + +
      + +
      +

      re-assign local shortcut

      + +
      + +
                instanceOptions = s._iO;
      +          if (fV === 8) {
      +            flash._load(s.id, instanceOptions.url, instanceOptions.stream, instanceOptions.autoPlay, instanceOptions.usePolicyFile);
      +          } else {
      +            flash._load(s.id, instanceOptions.url, !!(instanceOptions.stream), !!(instanceOptions.autoPlay), instanceOptions.loops||1, !!(instanceOptions.autoLoad), instanceOptions.usePolicyFile);
      +          }
      +        } catch(e) {
      +          _wDS('smError', 2);
      +          debugTS('onload', false);
      +          catchError({type:'SMSOUND_LOAD_JS_EXCEPTION', fatal:true});
      +        }
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      after all of this, ensure sound url is up to date.

      + +
      + +
            s.url = instanceOptions.url;
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Unloads a sound, canceling any open HTTP requests.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.unload = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      Flash 8/AS2 can't "close" a stream - fake it by loading an empty URL +Flash 9/AS3: Close stream, preventing further load +HTML5: Most UAs will use empty URL

      + +
      + +
      +      if (s.readyState !== 0) {
      +
      +        sm2._wD(s.id + ': unload()');
      +
      +        if (!s.isHTML5) {
      +
      +          if (fV === 8) {
      +            flash._unload(s.id, emptyURL);
      +          } else {
      +            flash._unload(s.id);
      +          }
      +
      +        } else {
      +
      +          stop_html5_timer();
      +
      +          if (s._a) {
      +
      +            s._a.pause();
      + +
    • + + +
    • +
      + +
      + +
      +

      update empty URL, too

      + +
      + +
                  lastURL = html5Unload(s._a);
      +
      +          }
      +
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      reset load/status flags

      + +
      + +
              resetProperties();
      +
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Unloads and destroys a sound.
      +     */
      +
      +    this.destruct = function(_bFromSM) {
      +
      +      sm2._wD(s.id + ': Destruct');
      +
      +      if (!s.isHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      kill sound within Flash +Disable the onfailure handler

      + +
      + +
              s._iO.onfailure = null;
      +        flash._destroySound(s.id);
      +
      +      } else {
      +
      +        stop_html5_timer();
      +
      +        if (s._a) {
      +          s._a.pause();
      +          html5Unload(s._a);
      +          if (!useGlobalHTML5Audio) {
      +            remove_html5_events();
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      break obvious circular reference

      + +
      + +
                s._a._s = null;
      +          s._a = null;
      +        }
      +
      +      }
      +
      +      if (!_bFromSM) {
      + +
    • + + +
    • +
      + +
      + +
      +

      ensure deletion from controller

      + +
      + +
              sm2.destroySound(s.id, true);
      +      }
      +
      +    };
      +
      +    /**
      +     * Begins playing a sound.
      +     *
      +     * @param {object} oOptions Optional: Sound options
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.play = function(oOptions, _updatePlayState) {
      +
      +      var fN, allowMulti, a, onready,
      +          audioClone, onended, oncanplay,
      +          startOK = true,
      +          exit = null;
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            fN = s.id + ': play(): ';
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      default to true

      + +
      + +
            _updatePlayState = (_updatePlayState === _undefined ? true : _updatePlayState);
      +
      +      if (!oOptions) {
      +        oOptions = {};
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      first, use local URL (if specified)

      + +
      + +
            if (s.url) {
      +        s._iO.url = s.url;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      mix in any options defined at createSound()

      + +
      + +
            s._iO = mixin(s._iO, s.options);
      + +
    • + + +
    • +
      + +
      + +
      +

      mix in any options specific to this method

      + +
      + +
            s._iO = mixin(oOptions, s._iO);
      +
      +      s._iO.url = parseURL(s._iO.url);
      +
      +      s.instanceOptions = s._iO;
      + +
    • + + +
    • +
      + +
      + +
      +

      RTMP-only

      + +
      + +
            if (!s.isHTML5 && s._iO.serverURL && !s.connected) {
      +        if (!s.getAutoPlay()) {
      +          sm2._wD(fN +' Netstream not connected yet - setting autoPlay');
      +          s.setAutoPlay(true);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      play will be called in onconnect()

      + +
      + +
              return s;
      +      }
      +
      +      if (html5OK(s._iO)) {
      +        s._setup_html5(s._iO);
      +        start_html5_timer();
      +      }
      +
      +      if (s.playState === 1 && !s.paused) {
      +        allowMulti = s._iO.multiShot;
      +        if (!allowMulti) {
      +          sm2._wD(fN + 'Already playing (one-shot)', 1);
      +          if (s.isHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      go back to original position.

      + +
      + +
                  s.setPosition(s._iO.position);
      +          }
      +          exit = s;
      +        } else {
      +          sm2._wD(fN + 'Already playing (multi-shot)', 1);
      +        }
      +      }
      +
      +      if (exit !== null) {
      +        return exit;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      edge case: play() with explicit URL parameter

      + +
      + +
            if (oOptions.url && oOptions.url !== s.url) {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case for createSound() followed by load() / play() with url; avoid double-load case.

      + +
      + +
              if (!s.readyState && !s.isHTML5 && fV === 8 && urlOmitted) {
      +
      +          urlOmitted = false;
      +
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      load using merged options

      + +
      + +
                s.load(s._iO);
      +
      +        }
      +
      +      }
      +
      +      if (!s.loaded) {
      +
      +        if (s.readyState === 0) {
      +
      +          sm2._wD(fN + 'Attempting to load');
      + +
    • + + +
    • +
      + +
      + +
      +

      try to get this sound playing ASAP

      + +
      + +
                if (!s.isHTML5 && !sm2.html5Only) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash: assign directly because setAutoPlay() increments the instanceCount

      + +
      + +
                  s._iO.autoPlay = true;
      +            s.load(s._iO);
      +
      +          } else if (s.isHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      iOS needs this when recycling sounds, loading a new URL on an existing object.

      + +
      + +
                  s.load(s._iO);
      +
      +          } else {
      +
      +            sm2._wD(fN + 'Unsupported type. Exiting.');
      +            exit = s;
      +
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 hack - re-set instanceOptions?

      + +
      + +
                s.instanceOptions = s._iO;
      +
      +        } else if (s.readyState === 2) {
      +
      +          sm2._wD(fN + 'Could not load - exiting', 2);
      +          exit = s;
      +
      +        } else {
      +
      +          sm2._wD(fN + 'Loading - attempting to play...');
      +
      +        }
      +
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      "play()"

      + +
      + +
              sm2._wD(fN.substr(0, fN.lastIndexOf(':')));
      +
      +      }
      +
      +      if (exit !== null) {
      +        return exit;
      +      }
      +
      +      if (!s.isHTML5 && fV === 9 && s.position > 0 && s.position === s.duration) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash 9 needs a position reset if play() is called while at the end of a sound.

      + +
      + +
              sm2._wD(fN + 'Sound at end, resetting to position:0');
      +        oOptions.position = 0;
      +      }
      +
      +      /**
      +       * Streams will pause when their buffer is full if they are being loaded.
      +       * In this case paused is true, but the song hasn't started playing yet.
      +       * If we just call resume() the onplay() callback will never be called.
      +       * So only call resume() if the position is > 0.
      +       * Another reason is because options like volume won't have been applied yet.
      +       * For normal sounds, just resume.
      +       */
      +
      +      if (s.paused && s.position >= 0 && (!s._iO.serverURL || s.position > 0)) {
      + +
    • + + +
    • + + +
              sm2._wD(fN + 'Resuming from paused state', 1);
      +        s.resume();
      +
      +      } else {
      +
      +        s._iO = mixin(oOptions, s._iO);
      + +
    • + + +
    • +
      + +
      + +
      +

      apply from/to parameters, if they exist (and not using RTMP)

      + +
      + +
              if (s._iO.from !== null && s._iO.to !== null && s.instanceCount === 0 && s.playState === 0 && !s._iO.serverURL) {
      +
      +          onready = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      sound "canplay" or onload() +re-apply from/to to instance options, and start playback

      + +
      + +
                  s._iO = mixin(oOptions, s._iO);
      +            s.play(s._iO);
      +          };
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 needs to at least have "canplay" fired before seeking.

      + +
      + +
                if (s.isHTML5 && !s._html5_canplay) {
      + +
    • + + +
    • +
      + +
      + +
      +

      this hasn't been loaded yet. load it first, and then do this again.

      + +
      + +
                  sm2._wD(fN + 'Beginning load for from/to case');
      +
      +            s.load({
      + +
    • + + +
    • +
      + +
      + +
      +

      note: custom HTML5-only event added for from/to implementation.

      + +
      + +
                    _oncanplay: onready
      +            });
      +
      +            exit = false;
      +
      +          } else if (!s.isHTML5 && !s.loaded && (!s.readyState || s.readyState !== 2)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      to be safe, preload the whole thing in Flash.

      + +
      + +
      +            sm2._wD(fN + 'Preloading for from/to case');
      +
      +            s.load({
      +              onload: onready
      +            });
      +
      +            exit = false;
      +
      +          }
      +
      +          if (exit !== null) {
      +            return exit;
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      otherwise, we're ready to go. re-apply local options, and continue

      + +
      + +
      +          s._iO = applyFromTo();
      +
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD(fN + 'Starting to play');

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      increment instance counter, where enabled + supported

      + +
      + +
              if (!s.instanceCount || s._iO.multiShotEvents || (s.isHTML5 && s._iO.multiShot && !useGlobalHTML5Audio) || (!s.isHTML5 && fV > 8 && !s.getAutoPlay())) {
      +          s.instanceCount++;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      if first play and onposition parameters exist, apply them now

      + +
      + +
              if (s._iO.onposition && s.playState === 0) {
      +          attachOnPosition(s);
      +        }
      +
      +        s.playState = 1;
      +        s.paused = false;
      +
      +        s.position = (s._iO.position !== _undefined && !isNaN(s._iO.position) ? s._iO.position : 0);
      +
      +        if (!s.isHTML5) {
      +          s._iO = policyFix(loopFix(s._iO));
      +        }
      +
      +        if (s._iO.onplay && _updatePlayState) {
      +          s._iO.onplay.apply(s);
      +          onplay_called = true;
      +        }
      +
      +        s.setVolume(s._iO.volume, true);
      +        s.setPan(s._iO.pan, true);
      +
      +        if (!s.isHTML5) {
      +
      +          startOK = flash._start(s.id, s._iO.loops || 1, (fV === 9 ? s.position : s.position / msecScale), s._iO.multiShot || false);
      +
      +          if (fV === 9 && !startOK) {
      + +
    • + + +
    • +
      + +
      + +
      +

      edge case: no sound hardware, or 32-channel flash ceiling hit. +applies only to Flash 9, non-NetStream/MovieStar sounds. +http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/media/Sound.html#play%28%29

      + +
      + +
                  sm2._wD(fN + 'No sound hardware, or 32-sound ceiling hit', 2);
      +            if (s._iO.onplayerror) {
      +              s._iO.onplayerror.apply(s);
      +            }
      +
      +          }
      +
      +        } else {
      +
      +          if (s.instanceCount < 2) {
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 single-instance case

      + +
      + +
      +            start_html5_timer();
      +
      +            a = s._setup_html5();
      +
      +            s.setPosition(s._iO.position);
      +
      +            a.play();
      +
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 multi-shot case

      + +
      + +
      +            sm2._wD(s.id + ': Cloning Audio() for instance #' + s.instanceCount + '...');
      +
      +            audioClone = new Audio(s._iO.url);
      +
      +            onended = function() {
      +              event.remove(audioClone, 'ended', onended);
      +              s._onfinish(s);
      + +
    • + + +
    • +
      + +
      + +
      +

      cleanup

      + +
      + +
                    html5Unload(audioClone);
      +              audioClone = null;
      +            };
      +
      +            oncanplay = function() {
      +              event.remove(audioClone, 'canplay', oncanplay);
      +              try {
      +                audioClone.currentTime = s._iO.position/msecScale;
      +              } catch(err) {
      +                complain(s.id + ': multiShot play() failed to apply position of ' + (s._iO.position/msecScale));
      +              }
      +              audioClone.play();
      +            };
      +
      +            event.add(audioClone, 'ended', onended);
      + +
    • + + +
    • +
      + +
      + +
      +

      apply volume to clones, too

      + +
      + +
                  if (s._iO.volume !== undefined) {
      +              audioClone.volume = Math.max(0, Math.min(1, s._iO.volume/100));
      +            }
      + +
    • + + +
    • +
      + +
      + +
      +

      playing multiple muted sounds? if you do this, you're weird ;) - but let's cover it.

      + +
      + +
                  if (s.muted) {
      +              audioClone.muted = true;
      +            }
      +
      +            if (s._iO.position) {
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 audio can't seek before onplay() event has fired. +wait for canplay, then seek to position and start playback.

      + +
      + +
                    event.add(audioClone, 'canplay', oncanplay);
      +            } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      begin playback at currentTime: 0

      + +
      + +
                    audioClone.play();
      +            }
      +
      +          }
      +
      +        }
      +
      +      }
      +
      +      return s;
      +
      +    };
      + +
    • + + +
    • +
      + +
      + +
      +

      just for convenience

      + +
      + +
          this.start = this.play;
      +
      +    /**
      +     * Stops playing a sound (and optionally, all sounds)
      +     *
      +     * @param {boolean} bAll Optional: Whether to stop all sounds
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.stop = function(bAll) {
      +
      +      var instanceOptions = s._iO,
      +          originalPosition;
      +
      +      if (s.playState === 1) {
      +
      +        sm2._wD(s.id + ': stop()');
      +
      +        s._onbufferchange(0);
      +        s._resetOnPosition(0);
      +        s.paused = false;
      +
      +        if (!s.isHTML5) {
      +          s.playState = 0;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      remove onPosition listeners, if any

      + +
      + +
              detachOnPosition();
      + +
    • + + +
    • +
      + +
      + +
      +

      and "to" position, if set

      + +
      + +
              if (instanceOptions.to) {
      +          s.clearOnPosition(instanceOptions.to);
      +        }
      +
      +        if (!s.isHTML5) {
      +
      +          flash._stop(s.id, bAll);
      + +
    • + + +
    • +
      + +
      + +
      +

      hack for netStream: just unload

      + +
      + +
                if (instanceOptions.serverURL) {
      +            s.unload();
      +          }
      +
      +        } else {
      +
      +          if (s._a) {
      +
      +            originalPosition = s.position;
      + +
    • + + +
    • +
      + +
      + +
      +

      act like Flash, though

      + +
      + +
                  s.setPosition(0);
      + +
    • + + +
    • +
      + +
      + +
      +

      hack: reflect old position for onstop() (also like Flash)

      + +
      + +
                  s.position = originalPosition;
      + +
    • + + +
    • +
      + +
      + +
      +

      html5 has no stop() +NOTE: pausing means iOS requires interaction to resume.

      + +
      + +
                  s._a.pause();
      +
      +            s.playState = 0;
      + +
    • + + +
    • +
      + +
      + +
      +

      and update UI

      + +
      + +
                  s._onTimer();
      +
      +            stop_html5_timer();
      +
      +          }
      +
      +        }
      +
      +        s.instanceCount = 0;
      +        s._iO = {};
      +
      +        if (instanceOptions.onstop) {
      +          instanceOptions.onstop.apply(s);
      +        }
      +
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Undocumented/internal: Sets autoPlay for RTMP.
      +     *
      +     * @param {boolean} autoPlay state
      +     */
      +
      +    this.setAutoPlay = function(autoPlay) {
      +
      +      sm2._wD(s.id + ': Autoplay turned ' + (autoPlay ? 'on' : 'off'));
      +      s._iO.autoPlay = autoPlay;
      +
      +      if (!s.isHTML5) {
      +        flash._setAutoPlay(s.id, autoPlay);
      +        if (autoPlay) {
      + +
    • + + +
    • +
      + +
      + +
      +

      only increment the instanceCount if the sound isn't loaded (TODO: verify RTMP)

      + +
      + +
                if (!s.instanceCount && s.readyState === 1) {
      +            s.instanceCount++;
      +            sm2._wD(s.id + ': Incremented instance count to '+s.instanceCount);
      +          }
      +        }
      +      }
      +
      +    };
      +
      +    /**
      +     * Undocumented/internal: Returns the autoPlay boolean.
      +     *
      +     * @return {boolean} The current autoPlay value
      +     */
      +
      +    this.getAutoPlay = function() {
      +
      +      return s._iO.autoPlay;
      +
      +    };
      +
      +    /**
      +     * Sets the position of a sound.
      +     *
      +     * @param {number} nMsecOffset Position (milliseconds)
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.setPosition = function(nMsecOffset) {
      +
      +      if (nMsecOffset === _undefined) {
      +        nMsecOffset = 0;
      +      }
      +
      +      var position, position1K,
      + +
    • + + +
    • +
      + +
      + +
      +

      Use the duration from the instance options, if we don't have a track duration yet. +position >= 0 and <= current available (loaded) duration

      + +
      + +
                offset = (s.isHTML5 ? Math.max(nMsecOffset, 0) : Math.min(s.duration || s._iO.duration, Math.max(nMsecOffset, 0)));
      +
      +      s.position = offset;
      +      position1K = s.position/msecScale;
      +      s._resetOnPosition(s.position);
      +      s._iO.position = offset;
      +
      +      if (!s.isHTML5) {
      +
      +        position = (fV === 9 ? s.position : position1K);
      +
      +        if (s.readyState && s.readyState !== 2) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if paused or not playing, will not resume (by playing)

      + +
      + +
                flash._setPosition(s.id, position, (s.paused || !s.playState), s._iO.multiShot);
      +        }
      +
      +      } else if (s._a) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Set the position in the canplay handler if the sound is not ready yet

      + +
      + +
              if (s._html5_canplay) {
      +
      +          if (s._a.currentTime !== position1K) {
      +
      +            /**
      +             * DOM/JS errors/exceptions to watch out for:
      +             * if seek is beyond (loaded?) position, "DOM exception 11"
      +             * "INDEX_SIZE_ERR": DOM exception 1
      +             */
      +            sm2._wD(s.id + ': setPosition('+position1K+')');
      +
      +            try {
      +              s._a.currentTime = position1K;
      +              if (s.playState === 0 || s.paused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      allow seek without auto-play/resume

      + +
      + +
                      s._a.pause();
      +              }
      +            } catch(e) {
      +              sm2._wD(s.id + ': setPosition(' + position1K + ') failed: ' + e.message, 2);
      +            }
      +
      +          }
      +
      +        } else if (position1K) {
      + +
    • + + +
    • +
      + +
      + +
      +

      warn on non-zero seek attempts

      + +
      + +
                sm2._wD(s.id + ': setPosition(' + position1K + '): Cannot seek yet, sound not ready', 2);
      +          return s;
      +
      +        }
      +
      +        if (s.paused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if paused, refresh UI right away +force update

      + +
      + +
                s._onTimer(true);
      +
      +        }
      +
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Pauses sound playback.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.pause = function(_bCallFlash) {
      +
      +      if (s.paused || (s.playState === 0 && s.readyState !== 1)) {
      +        return s;
      +      }
      +
      +      sm2._wD(s.id + ': pause()');
      +      s.paused = true;
      +
      +      if (!s.isHTML5) {
      +        if (_bCallFlash || _bCallFlash === _undefined) {
      +          flash._pause(s.id, s._iO.multiShot);
      +        }
      +      } else {
      +        s._setup_html5().pause();
      +        stop_html5_timer();
      +      }
      +
      +      if (s._iO.onpause) {
      +        s._iO.onpause.apply(s);
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Resumes sound playback.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    /**
      +     * When auto-loaded streams pause on buffer full they have a playState of 0.
      +     * We need to make sure that the playState is set to 1 when these streams "resume".
      +     * When a paused stream is resumed, we need to trigger the onplay() callback if it
      +     * hasn't been called already. In this case since the sound is being played for the
      +     * first time, I think it's more appropriate to call onplay() rather than onresume().
      +     */
      +
      +    this.resume = function() {
      +
      +      var instanceOptions = s._iO;
      +
      +      if (!s.paused) {
      +        return s;
      +      }
      +
      +      sm2._wD(s.id + ': resume()');
      +      s.paused = false;
      +      s.playState = 1;
      +
      +      if (!s.isHTML5) {
      +        if (instanceOptions.isMovieStar && !instanceOptions.serverURL) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Bizarre Webkit bug (Chrome reported via 8tracks.com dudes): AAC content paused for 30+ seconds(?) will not resume without a reposition.

      + +
      + +
                s.setPosition(s.position);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      flash method is toggle-based (pause/resume)

      + +
      + +
              flash._pause(s.id, instanceOptions.multiShot);
      +      } else {
      +        s._setup_html5().play();
      +        start_html5_timer();
      +      }
      +
      +      if (!onplay_called && instanceOptions.onplay) {
      +        instanceOptions.onplay.apply(s);
      +        onplay_called = true;
      +      } else if (instanceOptions.onresume) {
      +        instanceOptions.onresume.apply(s);
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Toggles sound playback.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.togglePause = function() {
      +
      +      sm2._wD(s.id + ': togglePause()');
      +
      +      if (s.playState === 0) {
      +        s.play({
      +          position: (fV === 9 && !s.isHTML5 ? s.position : s.position / msecScale)
      +        });
      +        return s;
      +      }
      +
      +      if (s.paused) {
      +        s.resume();
      +      } else {
      +        s.pause();
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Sets the panning (L-R) effect.
      +     *
      +     * @param {number} nPan The pan value (-100 to 100)
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.setPan = function(nPan, bInstanceOnly) {
      +
      +      if (nPan === _undefined) {
      +        nPan = 0;
      +      }
      +
      +      if (bInstanceOnly === _undefined) {
      +        bInstanceOnly = false;
      +      }
      +
      +      if (!s.isHTML5) {
      +        flash._setPan(s.id, nPan);
      +      } // else { no HTML5 pan? }
      +
      +      s._iO.pan = nPan;
      +
      +      if (!bInstanceOnly) {
      +        s.pan = nPan;
      +        s.options.pan = nPan;
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Sets the volume.
      +     *
      +     * @param {number} nVol The volume value (0 to 100)
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.setVolume = function(nVol, _bInstanceOnly) {
      +
      +      /**
      +       * Note: Setting volume has no effect on iOS "special snowflake" devices.
      +       * Hardware volume control overrides software, and volume
      +       * will always return 1 per Apple docs. (iOS 4 + 5.)
      +       * http://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/AddingSoundtoCanvasAnimations/AddingSoundtoCanvasAnimations.html
      +       */
      +
      +      if (nVol === _undefined) {
      +        nVol = 100;
      +      }
      +
      +      if (_bInstanceOnly === _undefined) {
      +        _bInstanceOnly = false;
      +      }
      +
      +      if (!s.isHTML5) {
      +        flash._setVolume(s.id, (sm2.muted && !s.muted) || s.muted?0:nVol);
      +      } else if (s._a) {
      +        if (sm2.muted && !s.muted) {
      +          s.muted = true;
      +          s._a.muted = true;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      valid range: 0-1

      + +
      + +
              s._a.volume = Math.max(0, Math.min(1, nVol/100));
      +      }
      +
      +      s._iO.volume = nVol;
      +
      +      if (!_bInstanceOnly) {
      +        s.volume = nVol;
      +        s.options.volume = nVol;
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Mutes the sound.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.mute = function() {
      +
      +      s.muted = true;
      +
      +      if (!s.isHTML5) {
      +        flash._setVolume(s.id, 0);
      +      } else if (s._a) {
      +        s._a.muted = true;
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Unmutes the sound.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.unmute = function() {
      +
      +      s.muted = false;
      +      var hasIO = (s._iO.volume !== _undefined);
      +
      +      if (!s.isHTML5) {
      +        flash._setVolume(s.id, hasIO?s._iO.volume:s.options.volume);
      +      } else if (s._a) {
      +        s._a.muted = false;
      +      }
      +
      +      return s;
      +
      +    };
      +
      +    /**
      +     * Toggles the muted state of a sound.
      +     *
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.toggleMute = function() {
      +
      +      return (s.muted?s.unmute():s.mute());
      +
      +    };
      +
      +    /**
      +     * Registers a callback to be fired when a sound reaches a given position during playback.
      +     *
      +     * @param {number} nPosition The position to watch for
      +     * @param {function} oMethod The relevant callback to fire
      +     * @param {object} oScope Optional: The scope to apply the callback to
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.onPosition = function(nPosition, oMethod, oScope) {
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: basic dupe checking?

      + +
      + +
      +      onPositionItems.push({
      +        position: parseInt(nPosition, 10),
      +        method: oMethod,
      +        scope: (oScope !== _undefined ? oScope : s),
      +        fired: false
      +      });
      +
      +      return s;
      +
      +    };
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy/backwards-compability: lower-case method name

      + +
      + +
          this.onposition = this.onPosition;
      +
      +    /**
      +     * Removes registered callback(s) from a sound, by position and/or callback.
      +     *
      +     * @param {number} nPosition The position to clear callback(s) for
      +     * @param {function} oMethod Optional: Identify one callback to be removed when multiple listeners exist for one position
      +     * @return {SMSound} The SMSound object
      +     */
      +
      +    this.clearOnPosition = function(nPosition, oMethod) {
      +
      +      var i;
      +
      +      nPosition = parseInt(nPosition, 10);
      +
      +      if (isNaN(nPosition)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      safety check

      + +
      + +
              return false;
      +      }
      +
      +      for (i=0; i < onPositionItems.length; i++) {
      +
      +        if (nPosition === onPositionItems[i].position) {
      + +
    • + + +
    • +
      + +
      + +
      +

      remove this item if no method was specified, or, if the method matches

      + +
      + +
                if (!oMethod || (oMethod === onPositionItems[i].method)) {
      +            if (onPositionItems[i].fired) {
      + +
    • + + +
    • +
      + +
      + +
      +

      decrement "fired" counter, too

      + +
      + +
                    onPositionFired--;
      +            }
      +            onPositionItems.splice(i, 1);
      +          }
      +        }
      +
      +      }
      +
      +    };
      +
      +    this._processOnPosition = function() {
      +
      +      var i, item, j = onPositionItems.length;
      +		
      +      if (!j || !s.playState || onPositionFired >= j) {
      +        return false;
      +      }
      +
      +      for (i=j-1; i >= 0; i--) {
      +        item = onPositionItems[i];
      +        if (!item.fired && s.position >= item.position) {
      +          item.fired = true;
      +          onPositionFired++;
      +          item.method.apply(item.scope, [item.position]);
      +		  j = onPositionItems.length; //  reset j -- onPositionItems.length can be changed in the item callback above... occasionally breaking the loop.
      +        }
      +      }
      +	
      +      return true;
      +
      +    };
      +
      +    this._resetOnPosition = function(nPosition) {
      + +
    • + + +
    • +
      + +
      + +
      +

      reset "fired" for items interested in this position

      + +
      + +
            var i, item, j = onPositionItems.length;
      +
      +      if (!j) {
      +        return false;
      +      }
      +
      +      for (i=j-1; i >= 0; i--) {
      +        item = onPositionItems[i];
      +        if (item.fired && nPosition <= item.position) {
      +          item.fired = false;
      +          onPositionFired--;
      +        }
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    /**
      +     * SMSound() private internals
      +     * --------------------------------
      +     */
      +
      +    applyFromTo = function() {
      +
      +      var instanceOptions = s._iO,
      +          f = instanceOptions.from,
      +          t = instanceOptions.to,
      +          start, end;
      +
      +      end = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      end has been reached.

      + +
      + +
              sm2._wD(s.id + ': "To" time of ' + t + ' reached.');
      + +
    • + + +
    • +
      + +
      + +
      +

      detach listener

      + +
      + +
              s.clearOnPosition(t, end);
      + +
    • + + +
    • +
      + +
      + +
      +

      stop should clear this, too

      + +
      + +
              s.stop();
      +
      +      };
      +
      +      start = function() {
      +
      +        sm2._wD(s.id + ': Playing "from" ' + f);
      + +
    • + + +
    • +
      + +
      + +
      +

      add listener for end

      + +
      + +
              if (t !== null && !isNaN(t)) {
      +          s.onPosition(t, end);
      +        }
      +
      +      };
      +
      +      if (f !== null && !isNaN(f)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      apply to instance options, guaranteeing correct start position.

      + +
      + +
              instanceOptions.position = f;
      + +
    • + + +
    • +
      + +
      + +
      +

      multiShot timing can't be tracked, so prevent that.

      + +
      + +
              instanceOptions.multiShot = false;
      +
      +        start();
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      return updated instanceOptions including starting position

      + +
      + +
            return instanceOptions;
      +
      +    };
      +
      +    attachOnPosition = function() {
      +
      +      var item,
      +          op = s._iO.onposition;
      + +
    • + + +
    • +
      + +
      + +
      +

      attach onposition things, if any, now.

      + +
      + +
      +      if (op) {
      +
      +        for (item in op) {
      +          if (op.hasOwnProperty(item)) {
      +            s.onPosition(parseInt(item, 10), op[item]);
      +          }
      +        }
      +
      +      }
      +
      +    };
      +
      +    detachOnPosition = function() {
      +
      +      var item,
      +          op = s._iO.onposition;
      + +
    • + + +
    • +
      + +
      + +
      +

      detach any onposition()-style listeners.

      + +
      + +
      +      if (op) {
      +
      +        for (item in op) {
      +          if (op.hasOwnProperty(item)) {
      +            s.clearOnPosition(parseInt(item, 10));
      +          }
      +        }
      +
      +      }
      +
      +    };
      +
      +    start_html5_timer = function() {
      +
      +      if (s.isHTML5) {
      +        startTimer(s);
      +      }
      +
      +    };
      +
      +    stop_html5_timer = function() {
      +
      +      if (s.isHTML5) {
      +        stopTimer(s);
      +      }
      +
      +    };
      +
      +    resetProperties = function(retainPosition) {
      +
      +      if (!retainPosition) {
      +        onPositionItems = [];
      +        onPositionFired = 0;
      +      }
      +
      +      onplay_called = false;
      +
      +      s._hasTimer = null;
      +      s._a = null;
      +      s._html5_canplay = false;
      +      s.bytesLoaded = null;
      +      s.bytesTotal = null;
      +      s.duration = (s._iO && s._iO.duration ? s._iO.duration : null);
      +      s.durationEstimate = null;
      +      s.buffered = [];
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy: 1D array

      + +
      + +
            s.eqData = [];
      +
      +      s.eqData.left = [];
      +      s.eqData.right = [];
      +
      +      s.failures = 0;
      +      s.isBuffering = false;
      +      s.instanceOptions = {};
      +      s.instanceCount = 0;
      +      s.loaded = false;
      +      s.metadata = {};
      + +
    • + + +
    • +
      + +
      + +
      +

      0 = uninitialised, 1 = loading, 2 = failed/error, 3 = loaded/success

      + +
      + +
            s.readyState = 0;
      +
      +      s.muted = false;
      +      s.paused = false;
      +
      +      s.peakData = {
      +        left: 0,
      +        right: 0
      +      };
      +
      +      s.waveformData = {
      +        left: [],
      +        right: []
      +      };
      +
      +      s.playState = 0;
      +      s.position = null;
      +
      +      s.id3 = {};
      +
      +    };
      +
      +    resetProperties();
      +
      +    /**
      +     * Pseudo-private SMSound internals
      +     * --------------------------------
      +     */
      +
      +    this._onTimer = function(bForce) {
      +
      +      /**
      +       * HTML5-only _whileplaying() etc.
      +       * called from both HTML5 native events, and polling/interval-based timers
      +       * mimics flash and fires only when time/duration change, so as to be polling-friendly
      +       */
      +
      +      var duration, isNew = false, time, x = {};
      +
      +      if (s._hasTimer || bForce) {
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: May not need to track readyState (1 = loading)

      + +
      + +
      +        if (s._a && (bForce || ((s.playState > 0 || s.readyState === 1) && !s.paused))) {
      +
      +          duration = s._get_html5_duration();
      +
      +          if (duration !== lastHTML5State.duration) {
      +
      +            lastHTML5State.duration = duration;
      +            s.duration = duration;
      +            isNew = true;
      +
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: investigate why this goes wack if not set/re-set each time.

      + +
      + +
                s.durationEstimate = s.duration;
      +
      +          time = (s._a.currentTime * msecScale || 0);
      +
      +          if (time !== lastHTML5State.time) {
      +
      +            lastHTML5State.time = time;
      +            isNew = true;
      +
      +          }
      +
      +          if (isNew || bForce) {
      +
      +            s._whileplaying(time,x,x,x,x);
      +
      +          }
      +
      +        }/* else {
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD('_onTimer: Warn for "'+s.id+'": '+(!s._a?'Could not find element. ':'')+(s.playState === 0?'playState bad, 0?':'playState = '+s.playState+', OK'));

      + +
      + +
      +          return false;
      +
      +        }*/
      +
      +        return isNew;
      +
      +      }
      +
      +    };
      +
      +    this._get_html5_duration = function() {
      +
      +      var instanceOptions = s._iO,
      + +
    • + + +
    • +
      + +
      + +
      +

      if audio object exists, use its duration - else, instance option duration (if provided - it's a hack, really, and should be retired) OR null

      + +
      + +
                d = (s._a && s._a.duration ? s._a.duration*msecScale : (instanceOptions && instanceOptions.duration ? instanceOptions.duration : null)),
      +          result = (d && !isNaN(d) && d !== Infinity ? d : null);
      +
      +      return result;
      +
      +    };
      +
      +    this._apply_loop = function(a, nLoops) {
      +
      +      /**
      +       * boolean instead of "loop", for webkit? - spec says string. http://www.w3.org/TR/html-markup/audio.html#audio.attrs.loop
      +       * note that loop is either off or infinite under HTML5, unlike Flash which allows arbitrary loop counts to be specified.
      +       */
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (!a.loop && nLoops > 1) {
      +        sm2._wD('Note: Native HTML5 looping is infinite.', 1);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      a.loop = (nLoops > 1 ? 'loop' : '');
      +
      +    };
      +
      +    this._setup_html5 = function(oOptions) {
      +
      +      var instanceOptions = mixin(s._iO, oOptions),
      +          a = useGlobalHTML5Audio ? globalHTML5Audio : s._a,
      +          dURL = decodeURI(instanceOptions.url),
      +          sameURL;
      +
      +      /**
      +       * "First things first, I, Poppa..." (reset the previous state of the old sound, if playing)
      +       * Fixes case with devices that can only play one sound at a time
      +       * Otherwise, other sounds in mid-play will be terminated without warning and in a stuck state
      +       */
      +
      +      if (useGlobalHTML5Audio) {
      +
      +        if (dURL === decodeURI(lastGlobalHTML5URL)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      global HTML5 audio: re-use of URL

      + +
      + +
                sameURL = true;
      +        }
      +
      +      } else if (dURL === decodeURI(lastURL)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      options URL is the same as the "last" URL, and we used (loaded) it

      + +
      + +
              sameURL = true;
      +
      +      }
      +
      +      if (a) {
      +
      +        if (a._s) {
      +
      +          if (useGlobalHTML5Audio) {
      +
      +            if (a._s && a._s.playState && !sameURL) {
      + +
    • + + +
    • +
      + +
      + +
      +

      global HTML5 audio case, and loading a new URL. stop the currently-playing one.

      + +
      + +
                    a._s.stop();
      +
      +            }
      +
      +          } else if (!useGlobalHTML5Audio && dURL === decodeURI(lastURL)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      non-global HTML5 reuse case: same url, ignore request

      + +
      + +
                  s._apply_loop(a, instanceOptions.loops);
      +
      +            return a;
      +
      +          }
      +
      +        }
      +
      +        if (!sameURL) {
      + +
    • + + +
    • +
      + +
      + +
      +

      don't retain onPosition() stuff with new URLs.

      + +
      + +
      +          if (lastURL) {
      +            resetProperties(false);
      +          }
      + +
    • + + +
    • +
      + +
      + +
      +

      assign new HTML5 URL

      + +
      + +
      +          a.src = instanceOptions.url;
      +
      +          s.url = instanceOptions.url;
      +
      +          lastURL = instanceOptions.url;
      +
      +          lastGlobalHTML5URL = instanceOptions.url;
      +
      +          a._called_load = false;
      +
      +        }
      +
      +      } else {
      +
      +        if (instanceOptions.autoLoad || instanceOptions.autoPlay) {
      +
      +          s._a = new Audio(instanceOptions.url);
      +          s._a.load();
      +
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      null for stupid Opera 9.64 case

      + +
      + +
                s._a = (isOpera && opera.version() < 10 ? new Audio(null) : new Audio());
      +
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      assign local reference

      + +
      + +
              a = s._a;
      +
      +        a._called_load = false;
      +
      +        if (useGlobalHTML5Audio) {
      +
      +          globalHTML5Audio = a;
      +
      +        }
      +
      +      }
      +
      +      s.isHTML5 = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      store a ref on the track

      + +
      + +
            s._a = a;
      + +
    • + + +
    • +
      + +
      + +
      +

      store a ref on the audio

      + +
      + +
            a._s = s;
      +
      +      add_html5_events();
      +
      +      s._apply_loop(a, instanceOptions.loops);
      +
      +      if (instanceOptions.autoLoad || instanceOptions.autoPlay) {
      +
      +        s.load();
      +
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      early HTML5 implementation (non-standard)

      + +
      + +
              a.autobuffer = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      standard ('none' is also an option.)

      + +
      + +
              a.preload = 'auto';
      +
      +      }
      +
      +      return a;
      +
      +    };
      +
      +    add_html5_events = function() {
      +
      +      if (s._a._added_events) {
      +        return false;
      +      }
      +
      +      var f;
      +
      +      function add(oEvt, oFn, bCapture) {
      +        return s._a ? s._a.addEventListener(oEvt, oFn, bCapture||false) : null;
      +      }
      +
      +      s._a._added_events = true;
      +
      +      for (f in html5_events) {
      +        if (html5_events.hasOwnProperty(f)) {
      +          add(f, html5_events[f]);
      +        }
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    remove_html5_events = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      Remove event listeners

      + +
      + +
      +      var f;
      +
      +      function remove(oEvt, oFn, bCapture) {
      +        return (s._a ? s._a.removeEventListener(oEvt, oFn, bCapture||false) : null);
      +      }
      +
      +      sm2._wD(s.id + ': Removing event listeners');
      +      s._a._added_events = false;
      +
      +      for (f in html5_events) {
      +        if (html5_events.hasOwnProperty(f)) {
      +          remove(f, html5_events[f]);
      +        }
      +      }
      +
      +    };
      +
      +    /**
      +     * Pseudo-private event internals
      +     * ------------------------------
      +     */
      +
      +    this._onload = function(nSuccess) {
      +
      +      var fN,
      + +
    • + + +
    • +
      + +
      + +
      +

      check for duration to prevent false positives from flash 8 when loading from cache.

      + +
      + +
                loadOK = !!nSuccess || (!s.isHTML5 && fV === 8 && s.duration);
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            fN = s.id + ': ';
      +      sm2._wD(fN + (loadOK ? 'onload()' : 'Failed to load / invalid sound?' + (!s.duration ? ' Zero-length duration reported.' : ' -') + ' (' + s.url + ')'), (loadOK ? 1 : 2));
      +      if (!loadOK && !s.isHTML5) {
      +        if (sm2.sandbox.noRemote === true) {
      +          sm2._wD(fN + str('noNet'), 1);
      +        }
      +        if (sm2.sandbox.noLocal === true) {
      +          sm2._wD(fN + str('noLocal'), 1);
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      s.loaded = loadOK;
      +      s.readyState = loadOK?3:2;
      +      s._onbufferchange(0);
      +
      +      if (s._iO.onload) {
      +        wrapCallback(s, function() {
      +          s._iO.onload.apply(s, [loadOK]);
      +        });
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    this._onbufferchange = function(nIsBuffering) {
      +
      +      if (s.playState === 0) {
      + +
    • + + +
    • +
      + +
      + +
      +

      ignore if not playing

      + +
      + +
              return false;
      +      }
      +
      +      if ((nIsBuffering && s.isBuffering) || (!nIsBuffering && !s.isBuffering)) {
      +        return false;
      +      }
      +
      +      s.isBuffering = (nIsBuffering === 1);
      +      if (s._iO.onbufferchange) {
      +        sm2._wD(s.id + ': Buffer state change: ' + nIsBuffering);
      +        s._iO.onbufferchange.apply(s);
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    /**
      +     * Playback may have stopped due to buffering, or related reason.
      +     * This state can be encountered on iOS < 6 when auto-play is blocked.
      +     */
      +
      +    this._onsuspend = function() {
      +
      +      if (s._iO.onsuspend) {
      +        sm2._wD(s.id + ': Playback suspended');
      +        s._iO.onsuspend.apply(s);
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    /**
      +     * flash 9/movieStar + RTMP-only method, should fire only once at most
      +     * at this point we just recreate failed sounds rather than trying to reconnect
      +     */
      +
      +    this._onfailure = function(msg, level, code) {
      +
      +      s.failures++;
      +      sm2._wD(s.id + ': Failures = ' + s.failures);
      +
      +      if (s._iO.onfailure && s.failures === 1) {
      +        s._iO.onfailure(s, msg, level, code);
      +      } else {
      +        sm2._wD(s.id + ': Ignoring failure');
      +      }
      +
      +    };
      +
      +    this._onfinish = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      store local copy before it gets trashed...

      + +
      + +
            var io_onfinish = s._iO.onfinish;
      +
      +      s._onbufferchange(0);
      +      s._resetOnPosition(0);
      + +
    • + + +
    • +
      + +
      + +
      +

      reset some state items

      + +
      + +
            if (s.instanceCount) {
      +
      +        s.instanceCount--;
      +
      +        if (!s.instanceCount) {
      + +
    • + + +
    • +
      + +
      + +
      +

      remove onPosition listeners, if any

      + +
      + +
                detachOnPosition();
      + +
    • + + +
    • +
      + +
      + +
      +

      reset instance options

      + +
      + +
                s.playState = 0;
      +          s.paused = false;
      +          s.instanceCount = 0;
      +          s.instanceOptions = {};
      +          s._iO = {};
      +          stop_html5_timer();
      + +
    • + + +
    • +
      + +
      + +
      +

      reset position, too

      + +
      + +
                if (s.isHTML5) {
      +            s.position = 0;
      +          }
      +
      +        }
      +
      +        if (!s.instanceCount || s._iO.multiShotEvents) {
      + +
    • + + +
    • +
      + +
      + +
      +

      fire onfinish for last, or every instance

      + +
      + +
                if (io_onfinish) {
      +            sm2._wD(s.id + ': onfinish()');
      +            wrapCallback(s, function() {
      +              io_onfinish.apply(s);
      +            });
      +          }
      +        }
      +
      +      }
      +
      +    };
      +
      +    this._whileloading = function(nBytesLoaded, nBytesTotal, nDuration, nBufferLength) {
      +
      +      var instanceOptions = s._iO;
      +
      +      s.bytesLoaded = nBytesLoaded;
      +      s.bytesTotal = nBytesTotal;
      +      s.duration = Math.floor(nDuration);
      +      s.bufferLength = nBufferLength;
      +
      +      if (!s.isHTML5 && !instanceOptions.isMovieStar) {
      +
      +        if (instanceOptions.duration) {
      + +
    • + + +
    • +
      + +
      + +
      +

      use duration from options, if specified and larger. nobody should be specifying duration in options, actually, and it should be retired.

      + +
      + +
                s.durationEstimate = (s.duration > instanceOptions.duration) ? s.duration : instanceOptions.duration;
      +        } else {
      +          s.durationEstimate = parseInt((s.bytesTotal / s.bytesLoaded) * s.duration, 10);
      +        }
      +
      +      } else {
      +
      +        s.durationEstimate = s.duration;
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      for flash, reflect sequential-load-style buffering

      + +
      + +
            if (!s.isHTML5) {
      +        s.buffered = [{
      +          'start': 0,
      +          'end': s.duration
      +        }];
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      allow whileloading to fire even if "load" fired under HTML5, due to HTTP range/partials

      + +
      + +
            if ((s.readyState !== 3 || s.isHTML5) && instanceOptions.whileloading) {
      +        instanceOptions.whileloading.apply(s);
      +      }
      +
      +    };
      +
      +    this._whileplaying = function(nPosition, oPeakData, oWaveformDataLeft, oWaveformDataRight, oEQData) {
      +
      +      var instanceOptions = s._iO,
      +          eqLeft;
      +
      +      if (isNaN(nPosition) || nPosition === null) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash safety net

      + +
      + +
              return false;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      Safari HTML5 play() may return small -ve values when starting from position: 0, eg. -50.120396875. Unexpected/invalid per W3, I think. Normalize to 0.

      + +
      + +
            s.position = Math.max(0, nPosition);
      +
      +      s._processOnPosition();
      +
      +      if (!s.isHTML5 && fV > 8) {
      +
      +        if (instanceOptions.usePeakData && oPeakData !== _undefined && oPeakData) {
      +          s.peakData = {
      +            left: oPeakData.leftPeak,
      +            right: oPeakData.rightPeak
      +          };
      +        }
      +
      +        if (instanceOptions.useWaveformData && oWaveformDataLeft !== _undefined && oWaveformDataLeft) {
      +          s.waveformData = {
      +            left: oWaveformDataLeft.split(','),
      +            right: oWaveformDataRight.split(',')
      +          };
      +        }
      +
      +        if (instanceOptions.useEQData) {
      +          if (oEQData !== _undefined && oEQData && oEQData.leftEQ) {
      +            eqLeft = oEQData.leftEQ.split(',');
      +            s.eqData = eqLeft;
      +            s.eqData.left = eqLeft;
      +            if (oEQData.rightEQ !== _undefined && oEQData.rightEQ) {
      +              s.eqData.right = oEQData.rightEQ.split(',');
      +            }
      +          }
      +        }
      +
      +      }
      +
      +      if (s.playState === 1) {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case/hack: ensure buffering is false if loading from cache (and not yet started)

      + +
      + +
              if (!s.isHTML5 && fV === 8 && !s.position && s.isBuffering) {
      +          s._onbufferchange(0);
      +        }
      +
      +        if (instanceOptions.whileplaying) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash may call after actual finish

      + +
      + +
                instanceOptions.whileplaying.apply(s);
      +        }
      +
      +      }
      +
      +      return true;
      +
      +    };
      +
      +    this._oncaptiondata = function(oData) {
      +
      +      /**
      +       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature
      +       *
      +       * @param {object} oData
      +       */
      +
      +      sm2._wD(s.id + ': Caption data received.');
      +
      +      s.captiondata = oData;
      +
      +      if (s._iO.oncaptiondata) {
      +        s._iO.oncaptiondata.apply(s, [oData]);
      +      }
      +
      +    };
      +
      +    this._onmetadata = function(oMDProps, oMDData) {
      +
      +      /**
      +       * internal: flash 9 + NetStream (MovieStar/RTMP-only) feature
      +       * RTMP may include song title, MovieStar content may include encoding info
      +       *
      +       * @param {array} oMDProps (names)
      +       * @param {array} oMDData (values)
      +       */
      +
      +      sm2._wD(s.id + ': Metadata received.');
      +
      +      var oData = {}, i, j;
      +
      +      for (i = 0, j = oMDProps.length; i < j; i++) {
      +        oData[oMDProps[i]] = oMDData[i];
      +      }
      +      s.metadata = oData;
      +
      +      if (s._iO.onmetadata) {
      +        s._iO.onmetadata.apply(s);
      +      }
      +
      +    };
      +
      +    this._onid3 = function(oID3Props, oID3Data) {
      +
      +      /**
      +       * internal: flash 8 + flash 9 ID3 feature
      +       * may include artist, song title etc.
      +       *
      +       * @param {array} oID3Props (names)
      +       * @param {array} oID3Data (values)
      +       */
      +
      +      sm2._wD(s.id + ': ID3 data received.');
      +
      +      var oData = [], i, j;
      +
      +      for (i = 0, j = oID3Props.length; i < j; i++) {
      +        oData[oID3Props[i]] = oID3Data[i];
      +      }
      +      s.id3 = mixin(s.id3, oData);
      +
      +      if (s._iO.onid3) {
      +        s._iO.onid3.apply(s);
      +      }
      +
      +    };
      + +
    • + + +
    • +
      + +
      + +
      +

      flash/RTMP-only

      + +
      + +
      +    this._onconnect = function(bSuccess) {
      +
      +      bSuccess = (bSuccess === 1);
      +      sm2._wD(s.id + ': ' + (bSuccess ? 'Connected.' : 'Failed to connect? - ' + s.url), (bSuccess ? 1 : 2));
      +      s.connected = bSuccess;
      +
      +      if (bSuccess) {
      +
      +        s.failures = 0;
      +
      +        if (idCheck(s.id)) {
      +          if (s.getAutoPlay()) {
      + +
    • + + +
    • +
      + +
      + +
      +

      only update the play state if auto playing

      + +
      + +
                  s.play(_undefined, s.getAutoPlay());
      +          } else if (s._iO.autoLoad) {
      +            s.load();
      +          }
      +        }
      +
      +        if (s._iO.onconnect) {
      +          s._iO.onconnect.apply(s, [bSuccess]);
      +        }
      +
      +      }
      +
      +    };
      +
      +    this._ondataerror = function(sError) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash 9 wave/eq data handler +hack: called at start, and end from flash at/after onfinish()

      + +
      + +
            if (s.playState > 0) {
      +        sm2._wD(s.id + ': Data error: ' + sError);
      +        if (s._iO.ondataerror) {
      +          s._iO.ondataerror.apply(s);
      +        }
      +      }
      +
      +    };
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          this._debug();
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  }; // SMSound()
      +
      +  /**
      +   * Private SoundManager internals
      +   * ------------------------------
      +   */
      +
      +  getDocument = function() {
      +
      +    return (doc.body || doc.getElementsByTagName('div')[0]);
      +
      +  };
      +
      +  id = function(sID) {
      +
      +    return doc.getElementById(sID);
      +
      +  };
      +
      +  mixin = function(oMain, oAdd) {
      + +
    • + + +
    • +
      + +
      + +
      +

      non-destructive merge

      + +
      + +
          var o1 = (oMain || {}), o2, o;
      + +
    • + + +
    • +
      + +
      + +
      +

      if unspecified, o2 is the default options object

      + +
      + +
          o2 = (oAdd === _undefined ? sm2.defaultOptions : oAdd);
      +
      +    for (o in o2) {
      +
      +      if (o2.hasOwnProperty(o) && o1[o] === _undefined) {
      +
      +        if (typeof o2[o] !== 'object' || o2[o] === null) {
      + +
    • + + +
    • +
      + +
      + +
      +

      assign directly

      + +
      + +
                o1[o] = o2[o];
      +
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      recurse through o2

      + +
      + +
                o1[o] = mixin(o1[o], o2[o]);
      +
      +        }
      +
      +      }
      +
      +    }
      +
      +    return o1;
      +
      +  };
      +
      +  wrapCallback = function(oSound, callback) {
      +
      +    /**
      +     * 03/03/2013: Fix for Flash Player 11.6.602.171 + Flash 8 (flashVersion = 8) SWF issue
      +     * setTimeout() fix for certain SMSound callbacks like onload() and onfinish(), where subsequent calls like play() and load() fail when Flash Player 11.6.602.171 is installed, and using soundManager with flashVersion = 8 (which is the default).
      +     * Not sure of exact cause. Suspect race condition and/or invalid (NaN-style) position argument trickling down to the next JS -> Flash _start() call, in the play() case.
      +     * Fix: setTimeout() to yield, plus safer null / NaN checking on position argument provided to Flash.
      +     * https://getsatisfaction.com/schillmania/topics/recent_chrome_update_seems_to_have_broken_my_sm2_audio_player
      +     */
      +    if (!oSound.isHTML5 && fV === 8) {
      +      window.setTimeout(callback, 0);
      +    } else {
      +      callback();
      +    }
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      additional soundManager properties that soundManager.setup() will accept

      + +
      + +
      +  extraOptions = {
      +    'onready': 1,
      +    'ontimeout': 1,
      +    'defaultOptions': 1,
      +    'flash9Options': 1,
      +    'movieStarOptions': 1
      +  };
      +
      +  assign = function(o, oParent) {
      +
      +    /**
      +     * recursive assignment of properties, soundManager.setup() helper
      +     * allows property assignment based on whitelist
      +     */
      +
      +    var i,
      +        result = true,
      +        hasParent = (oParent !== _undefined),
      +        setupOptions = sm2.setupOptions,
      +        bonusOptions = extraOptions;
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
    • + + +
    • +
      + +
      + +
      +

      if soundManager.setup() called, show accepted parameters.

      + +
      + +
      +    if (o === _undefined) {
      +
      +      result = [];
      +
      +      for (i in setupOptions) {
      +
      +        if (setupOptions.hasOwnProperty(i)) {
      +          result.push(i);
      +        }
      +
      +      }
      +
      +      for (i in bonusOptions) {
      +
      +        if (bonusOptions.hasOwnProperty(i)) {
      +
      +          if (typeof sm2[i] === 'object') {
      +
      +            result.push(i+': {...}');
      +
      +          } else if (sm2[i] instanceof Function) {
      +
      +            result.push(i+': function() {...}');
      +
      +          } else {
      +
      +            result.push(i);
      +
      +          }
      +
      +        }
      +
      +      }
      +
      +      sm2._wD(str('setup', result.join(', ')));
      +
      +      return false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    for (i in o) {
      +
      +      if (o.hasOwnProperty(i)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if not an {object} we want to recurse through...

      + +
      + +
      +        if (typeof o[i] !== 'object' || o[i] === null || o[i] instanceof Array || o[i] instanceof RegExp) {
      + +
    • + + +
    • +
      + +
      + +
      +

      check "allowed" options

      + +
      + +
      +          if (hasParent && bonusOptions[oParent] !== _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      valid recursive / nested object option, eg., { defaultOptions: { volume: 50 } }

      + +
      + +
                  sm2[oParent][i] = o[i];
      +
      +          } else if (setupOptions[i] !== _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: assign to setupOptions object, which soundManager property references

      + +
      + +
                  sm2.setupOptions[i] = o[i];
      + +
    • + + +
    • +
      + +
      + +
      +

      assign directly to soundManager, too

      + +
      + +
                  sm2[i] = o[i];
      +
      +          } else if (bonusOptions[i] === _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      invalid or disallowed parameter. complain.

      + +
      + +
                  complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);
      +
      +            result = false;
      +
      +          } else {
      +
      +            /**
      +             * valid extraOptions (bonusOptions) parameter.
      +             * is it a method, like onready/ontimeout? call it.
      +             * multiple parameters should be in an array, eg. soundManager.setup({onready: [myHandler, myScope]});
      +             */
      +
      +            if (sm2[i] instanceof Function) {
      +
      +              sm2[i].apply(sm2, (o[i] instanceof Array? o[i] : [o[i]]));
      +
      +            } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      good old-fashioned direct assignment

      + +
      + +
                    sm2[i] = o[i];
      +
      +            }
      +
      +          }
      +
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      recursion case, eg., { defaultOptions: { ... } }

      + +
      + +
      +          if (bonusOptions[i] === _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      invalid or disallowed parameter. complain.

      + +
      + +
                  complain(str((sm2[i] === _undefined ? 'setupUndef' : 'setupError'), i), 2);
      +
      +            result = false;
      +
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      recurse through object

      + +
      + +
                  return assign(o[i], i);
      +
      +          }
      +
      +        }
      +
      +      }
      +
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  function preferFlashCheck(kind) {
      + +
    • + + +
    • +
      + +
      + +
      +

      whether flash should play a given type

      + +
      + +
          return (sm2.preferFlash && hasFlash && !sm2.ignoreFlash && (sm2.flash[kind] !== _undefined && sm2.flash[kind]));
      +
      +  }
      +
      +  /**
      +   * Internal DOM2-level event helpers
      +   * ---------------------------------
      +   */
      +
      +  event = (function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      normalize event methods

      + +
      + +
          var old = (window.attachEvent),
      +    evt = {
      +      add: (old?'attachEvent':'addEventListener'),
      +      remove: (old?'detachEvent':'removeEventListener')
      +    };
      + +
    • + + +
    • +
      + +
      + +
      +

      normalize "on" event prefix, optional capture argument

      + +
      + +
          function getArgs(oArgs) {
      +
      +      var args = slice.call(oArgs),
      +          len = args.length;
      +
      +      if (old) {
      + +
    • + + +
    • +
      + +
      + +
      +

      prefix

      + +
      + +
              args[1] = 'on' + args[1];
      +        if (len > 3) {
      + +
    • + + +
    • +
      + +
      + +
      +

      no capture

      + +
      + +
                args.pop();
      +        }
      +      } else if (len === 3) {
      +        args.push(false);
      +      }
      +
      +      return args;
      +
      +    }
      +
      +    function apply(args, sType) {
      + +
    • + + +
    • +
      + +
      + +
      +

      normalize and call the event method, with the proper arguments

      + +
      + +
            var element = args.shift(),
      +          method = [evt[sType]];
      +
      +      if (old) {
      + +
    • + + +
    • +
      + +
      + +
      +

      old IE can't do apply().

      + +
      + +
              element[method](args[0], args[1]);
      +      } else {
      +        element[method].apply(element, args);
      +      }
      +
      +    }
      +
      +    function add() {
      +
      +      apply(getArgs(arguments), 'add');
      +
      +    }
      +
      +    function remove() {
      +
      +      apply(getArgs(arguments), 'remove');
      +
      +    }
      +
      +    return {
      +      'add': add,
      +      'remove': remove
      +    };
      +
      +  }());
      +
      +  /**
      +   * Internal HTML5 event handling
      +   * -----------------------------
      +   */
      +
      +  function html5_event(oFn) {
      + +
    • + + +
    • +
      + +
      + +
      +

      wrap html5 event handlers so we don't call them on destroyed and/or unloaded sounds

      + +
      + +
      +    return function(e) {
      +
      +      var s = this._s,
      +          result;
      +
      +      if (!s || !s._a) {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
              if (s && s.id) {
      +          sm2._wD(s.id + ': Ignoring ' + e.type);
      +        } else {
      +          sm2._wD(h5 + 'Ignoring ' + e.type);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
              result = null;
      +      } else {
      +        result = oFn.call(this, e);
      +      }
      +
      +      return result;
      +
      +    };
      +
      +  }
      +
      +  html5_events = {
      + +
    • + + +
    • +
      + +
      + +
      +

      HTML5 event-name-to-handler map

      + +
      + +
      +    abort: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': abort');
      +
      +    }),
      + +
    • + + +
    • +
      + +
      + +
      +

      enough has loaded to play

      + +
      + +
      +    canplay: html5_event(function() {
      +
      +      var s = this._s,
      +          position1K;
      +
      +      if (s._html5_canplay) {
      + +
    • + + +
    • +
      + +
      + +
      +

      this event has already fired. ignore.

      + +
      + +
              return true;
      +      }
      +
      +      s._html5_canplay = true;
      +      sm2._wD(s.id + ': canplay');
      +      s._onbufferchange(0);
      + +
    • + + +
    • +
      + +
      + +
      +

      position according to instance options

      + +
      + +
            position1K = (s._iO.position !== _undefined && !isNaN(s._iO.position)?s._iO.position/msecScale:null);
      + +
    • + + +
    • +
      + +
      + +
      +

      set the position if position was set before the sound loaded

      + +
      + +
            if (s.position && this.currentTime !== position1K) {
      +        sm2._wD(s.id + ': canplay: Setting position to ' + position1K);
      +        try {
      +          this.currentTime = position1K;
      +        } catch(ee) {
      +          sm2._wD(s.id + ': canplay: Setting position of ' + position1K + ' failed: ' + ee.message, 2);
      +        }
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      hack for HTML5 from/to case

      + +
      + +
            if (s._iO._oncanplay) {
      +        s._iO._oncanplay();
      +      }
      +
      +    }),
      +
      +    canplaythrough: html5_event(function() {
      +
      +      var s = this._s;
      +
      +      if (!s.loaded) {
      +        s._onbufferchange(0);
      +        s._whileloading(s.bytesLoaded, s.bytesTotal, s._get_html5_duration());
      +        s._onload(true);
      +      }
      +
      +    }),
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: Reserved for potential use

      + +
      + +
          /*
      +    emptied: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': emptied');
      +
      +    }),
      +    */
      +
      +    ended: html5_event(function() {
      +
      +      var s = this._s;
      +
      +      sm2._wD(s.id + ': ended');
      +
      +      s._onfinish();
      +
      +    }),
      +
      +    error: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': HTML5 error, code ' + this.error.code);
      +      /**
      +       * HTML5 error codes, per W3C
      +       * Error 1: Client aborted download at user's request.
      +       * Error 2: Network error after load started.
      +       * Error 3: Decoding issue.
      +       * Error 4: Media (audio file) not supported.
      +       * Reference: http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#error-codes
      +       */
      + +
    • + + +
    • +
      + +
      + +
      +

      call load with error state?

      + +
      + +
            this._s._onload(false);
      +
      +    }),
      +
      +    loadeddata: html5_event(function() {
      +
      +      var s = this._s;
      +
      +      sm2._wD(s.id + ': loadeddata');
      + +
    • + + +
    • +
      + +
      + +
      +

      safari seems to nicely report progress events, eventually totalling 100%

      + +
      + +
            if (!s._loaded && !isSafari) {
      +        s.duration = s._get_html5_duration();
      +      }
      +
      +    }),
      +
      +    loadedmetadata: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': loadedmetadata');
      +
      +    }),
      +
      +    loadstart: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': loadstart');
      + +
    • + + +
    • +
      + +
      + +
      +

      assume buffering at first

      + +
      + +
            this._s._onbufferchange(1);
      +
      +    }),
      +
      +    play: html5_event(function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD(this._s.id + ': play()'); +once play starts, no buffering

      + +
      + +
            this._s._onbufferchange(0);
      +
      +    }),
      +
      +    playing: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': playing');
      + +
    • + + +
    • +
      + +
      + +
      +

      once play starts, no buffering

      + +
      + +
            this._s._onbufferchange(0);
      +
      +    }),
      +
      +    progress: html5_event(function(e) {
      + +
    • + + +
    • +
      + +
      + +
      +

      note: can fire repeatedly after "loaded" event, due to use of HTTP range/partials

      + +
      + +
      +      var s = this._s,
      +          i, j, progStr, buffered = 0,
      +          isProgress = (e.type === 'progress'),
      +          ranges = e.target.buffered,
      + +
    • + + +
    • +
      + +
      + +
      +

      firefox 3.6 implements e.loaded/total (bytes)

      + +
      + +
                loaded = (e.loaded||0),
      +          total = (e.total||1);
      + +
    • + + +
    • +
      + +
      + +
      +

      reset the "buffered" (loaded byte ranges) array

      + +
      + +
            s.buffered = [];
      +
      +      if (ranges && ranges.length) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if loaded is 0, try TimeRanges implementation as % of load +https://developer.mozilla.org/en/DOM/TimeRanges

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      re-build "buffered" array +HTML5 returns seconds. SM2 API uses msec for setPosition() etc., whether Flash or HTML5.

      + +
      + +
              for (i=0, j=ranges.length; i<j; i++) {
      +          s.buffered.push({
      +            'start': ranges.start(i) * msecScale,
      +            'end': ranges.end(i) * msecScale
      +          });
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      use the last value locally

      + +
      + +
              buffered = (ranges.end(0) - ranges.start(0)) * msecScale;
      + +
    • + + +
    • +
      + +
      + +
      +

      linear case, buffer sum; does not account for seeking and HTTP partials / byte ranges

      + +
      + +
              loaded = Math.min(1, buffered/(e.target.duration*msecScale));
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
              if (isProgress && ranges.length > 1) {
      +          progStr = [];
      +          j = ranges.length;
      +          for (i=0; i<j; i++) {
      +            progStr.push(e.target.buffered.start(i)*msecScale +'-'+ e.target.buffered.end(i)*msecScale);
      +          }
      +          sm2._wD(this._s.id + ': progress, timeRanges: ' + progStr.join(', '));
      +        }
      +
      +        if (isProgress && !isNaN(loaded)) {
      +          sm2._wD(this._s.id + ': progress, ' + Math.floor(loaded*100) + '% loaded');
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      }
      +
      +      if (!isNaN(loaded)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if progress, likely not buffering

      + +
      + +
              s._onbufferchange(0);
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: prevent calls with duplicate values.

      + +
      + +
              s._whileloading(loaded, total, s._get_html5_duration());
      +        if (loaded && total && loaded === total) {
      + +
    • + + +
    • +
      + +
      + +
      +

      in case "onload" doesn't fire (eg. gecko 1.9.2)

      + +
      + +
                html5_events.canplaythrough.call(this, e);
      +        }
      +
      +      }
      +
      +    }),
      +
      +    ratechange: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': ratechange');
      +
      +    }),
      +
      +    suspend: html5_event(function(e) {
      + +
    • + + +
    • +
      + +
      + +
      +

      download paused/stopped, may have finished (eg. onload)

      + +
      + +
            var s = this._s;
      +
      +      sm2._wD(this._s.id + ': suspend');
      +      html5_events.progress.call(this, e);
      +      s._onsuspend();
      +
      +    }),
      +
      +    stalled: html5_event(function() {
      +
      +      sm2._wD(this._s.id + ': stalled');
      +
      +    }),
      +
      +    timeupdate: html5_event(function() {
      +
      +      this._s._onTimer();
      +
      +    }),
      +
      +    waiting: html5_event(function() {
      +
      +      var s = this._s;
      + +
    • + + +
    • +
      + +
      + +
      +

      see also: seeking

      + +
      + +
            sm2._wD(this._s.id + ': waiting');
      + +
    • + + +
    • +
      + +
      + +
      +

      playback faster than download rate, etc.

      + +
      + +
            s._onbufferchange(1);
      +
      +    })
      +
      +  };
      +
      +  html5OK = function(iO) {
      + +
    • + + +
    • +
      + +
      + +
      +

      playability test based on URL or MIME type

      + +
      + +
      +    var result;
      +
      +    if (!iO || (!iO.type && !iO.url && !iO.serverURL)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      nothing to check

      + +
      + +
            result = false;
      +
      +    } else if (iO.serverURL || (iO.type && preferFlashCheck(iO.type))) {
      + +
    • + + +
    • +
      + +
      + +
      +

      RTMP, or preferring flash

      + +
      + +
            result = false;
      +
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      Use type, if specified. Pass data: URIs to HTML5. If HTML5-only mode, no other options, so just give 'er

      + +
      + +
            result = ((iO.type ? html5CanPlay({type:iO.type}) : html5CanPlay({url:iO.url}) || sm2.html5Only || iO.url.match(/data\:/i)));
      +
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  html5Unload = function(oAudio) {
      +
      +    /**
      +     * Internal method: Unload media, and cancel any current/pending network requests.
      +     * Firefox can load an empty URL, which allegedly destroys the decoder and stops the download.
      +     * https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox#Stopping_the_download_of_media
      +     * However, Firefox has been seen loading a relative URL from '' and thus requesting the hosting page on unload.
      +     * Other UA behaviour is unclear, so everyone else gets an about:blank-style URL.
      +     */
      +
      +    var url;
      +
      +    if (oAudio) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Firefox and Chrome accept short WAVe data: URIs. Chome dislikes audio/wav, but accepts audio/wav for data: MIME. +Desktop Safari complains / fails on data: URI, so it gets about:blank.

      + +
      + +
            url = (isSafari ? emptyURL : (sm2.html5.canPlayType('audio/wav') ? emptyWAV : emptyURL));
      +
      +      oAudio.src = url;
      + +
    • + + +
    • +
      + +
      + +
      +

      reset some state, too

      + +
      + +
            if (oAudio._called_unload !== undefined) {
      +        oAudio._called_load = false;
      +      }
      +
      +    }
      +
      +    if (useGlobalHTML5Audio) {
      + +
    • + + +
    • +
      + +
      + +
      +

      ensure URL state is trashed, also

      + +
      + +
            lastGlobalHTML5URL = null;
      +
      +    }
      +
      +    return url;
      +
      +  };
      +
      +  html5CanPlay = function(o) {
      +
      +    /**
      +     * Try to find MIME, test and return truthiness
      +     * o = {
      +     *  url: '/path/to/an.mp3',
      +     *  type: 'audio/mp3'
      +     * }
      +     */
      +
      +    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {
      +      return false;
      +    }
      +
      +    var url = (o.url || null),
      +        mime = (o.type || null),
      +        aF = sm2.audioFormats,
      +        result,
      +        offset,
      +        fileExt,
      +        item;
      + +
    • + + +
    • +
      + +
      + +
      +

      account for known cases like audio/mp3

      + +
      + +
      +    if (mime && sm2.html5[mime] !== _undefined) {
      +      return (sm2.html5[mime] && !preferFlashCheck(mime));
      +    }
      +
      +    if (!html5Ext) {
      +      html5Ext = [];
      +      for (item in aF) {
      +        if (aF.hasOwnProperty(item)) {
      +          html5Ext.push(item);
      +          if (aF[item].related) {
      +            html5Ext = html5Ext.concat(aF[item].related);
      +          }
      +        }
      +      }
      +      html5Ext = new RegExp('\\.('+html5Ext.join('|')+')(\\?.*)?$','i');
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: Strip URL queries, etc.

      + +
      + +
          fileExt = (url ? url.toLowerCase().match(html5Ext) : null);
      +
      +    if (!fileExt || !fileExt.length) {
      +      if (!mime) {
      +        result = false;
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      audio/mp3 -> mp3, result should be known

      + +
      + +
              offset = mime.indexOf(';');
      + +
    • + + +
    • +
      + +
      + +
      +

      strip "audio/X; codecs..."

      + +
      + +
              fileExt = (offset !== -1?mime.substr(0,offset):mime).substr(6);
      +      }
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      match the raw extension name - "mp3", for example

      + +
      + +
            fileExt = fileExt[1];
      +    }
      +
      +    if (fileExt && sm2.html5[fileExt] !== _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      result known

      + +
      + +
            result = (sm2.html5[fileExt] && !preferFlashCheck(fileExt));
      +    } else {
      +      mime = 'audio/'+fileExt;
      +      result = sm2.html5.canPlayType({type:mime});
      +      sm2.html5[fileExt] = result;
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD('canPlayType, found result: ' + result);

      + +
      + +
            result = (result && sm2.html5[mime] && !preferFlashCheck(mime));
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  testHTML5 = function() {
      +
      +    /**
      +     * Internal: Iterates over audioFormats, determining support eg. audio/mp3, audio/mpeg and so on
      +     * assigns results to html5[] and flash[].
      +     */
      +
      +    if (!sm2.useHTML5Audio || !sm2.hasHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      without HTML5, we need Flash.

      + +
      + +
            sm2.html5.usingFlash = true;
      +      needsFlash = true;
      +      return false;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      double-whammy: Opera 9.64 throws WRONG_ARGUMENTS_ERR if no parameter passed to Audio(), and Webkit + iOS happily tries to load "null" as a URL. :/

      + +
      + +
          var a = (Audio !== _undefined ? (isOpera && opera.version() < 10 ? new Audio(null) : new Audio()) : null),
      +        item, lookup, support = {}, aF, i;
      +
      +    function cp(m) {
      +
      +      var canPlay, j,
      +          result = false,
      +          isOK = false;
      +
      +      if (!a || typeof a.canPlayType !== 'function') {
      +        return result;
      +      }
      +
      +      if (m instanceof Array) {
      + +
    • + + +
    • +
      + +
      + +
      +

      iterate through all mime types, return any successes

      + +
      + +
              for (i=0, j=m.length; i<j; i++) {
      +          if (sm2.html5[m[i]] || a.canPlayType(m[i]).match(sm2.html5Test)) {
      +            isOK = true;
      +            sm2.html5[m[i]] = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      note flash support, too

      + +
      + +
                  sm2.flash[m[i]] = !!(m[i].match(flashMIME));
      +          }
      +        }
      +        result = isOK;
      +      } else {
      +        canPlay = (a && typeof a.canPlayType === 'function' ? a.canPlayType(m) : false);
      +        result = !!(canPlay && (canPlay.match(sm2.html5Test)));
      +      }
      +
      +      return result;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      test all registered formats + codecs

      + +
      + +
      +    aF = sm2.audioFormats;
      +
      +    for (item in aF) {
      +
      +      if (aF.hasOwnProperty(item)) {
      +
      +        lookup = 'audio/' + item;
      +
      +        support[item] = cp(aF[item].type);
      + +
    • + + +
    • +
      + +
      + +
      +

      write back generic type too, eg. audio/mp3

      + +
      + +
              support[lookup] = support[item];
      + +
    • + + +
    • +
      + +
      + +
      +

      assign flash

      + +
      + +
              if (item.match(flashMIME)) {
      +
      +          sm2.flash[item] = true;
      +          sm2.flash[lookup] = true;
      +
      +        } else {
      +
      +          sm2.flash[item] = false;
      +          sm2.flash[lookup] = false;
      +
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      assign result to related formats, too

      + +
      + +
      +        if (aF[item] && aF[item].related) {
      +
      +          for (i=aF[item].related.length-1; i >= 0; i--) {
      + +
    • + + +
    • +
      + +
      + +
      +

      eg. audio/m4a

      + +
      + +
                  support['audio/'+aF[item].related[i]] = support[item];
      +            sm2.html5[aF[item].related[i]] = support[item];
      +            sm2.flash[aF[item].related[i]] = support[item];
      +
      +          }
      +
      +        }
      +
      +      }
      +
      +    }
      +
      +    support.canPlayType = (a?cp:null);
      +    sm2.html5 = mixin(sm2.html5, support);
      +
      +    sm2.html5.usingFlash = featureCheck();
      +    needsFlash = sm2.html5.usingFlash;
      +
      +    return true;
      +
      +  };
      +
      +  strings = {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          notReady: 'Unavailable - wait until onready() has fired.',
      +    notOK: 'Audio support is not available.',
      +    domError: sm + 'exception caught while appending SWF to DOM.',
      +    spcWmode: 'Removing wmode, preventing known SWF loading issue(s)',
      +    swf404: smc + 'Verify that %s is a valid path.',
      +    tryDebug: 'Try ' + sm + '.debugFlash = true for more security details (output goes to SWF.)',
      +    checkSWF: 'See SWF output for more debug info.',
      +    localFail: smc + 'Non-HTTP page (' + doc.location.protocol + ' URL?) Review Flash player security settings for this special case:\nhttp://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html\nMay need to add/allow path, eg. c:/sm2/ or /users/me/sm2/',
      +    waitFocus: smc + 'Special case: Waiting for SWF to load with window focus...',
      +    waitForever: smc + 'Waiting indefinitely for Flash (will recover if unblocked)...',
      +    waitSWF: smc + 'Waiting for 100% SWF load...',
      +    needFunction: smc + 'Function object expected for %s',
      +    badID: 'Sound ID "%s" should be a string, starting with a non-numeric character',
      +    currentObj: smc + '_debug(): Current sound objects',
      +    waitOnload: smc + 'Waiting for window.onload()',
      +    docLoaded: smc + 'Document already loaded',
      +    onload: smc + 'initComplete(): calling soundManager.onload()',
      +    onloadOK: sm + '.onload() complete',
      +    didInit: smc + 'init(): Already called?',
      +    secNote: 'Flash security note: Network/internet URLs will not load due to security restrictions. Access can be configured via Flash Player Global Security Settings Page: http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html',
      +    badRemove: smc + 'Failed to remove Flash node.',
      +    shutdown: sm + '.disable(): Shutting down',
      +    queue: smc + 'Queueing %s handler',
      +    smError: 'SMSound.load(): Exception: JS-Flash communication failed, or JS error.',
      +    fbTimeout: 'No flash response, applying .'+swfCSS.swfTimedout+' CSS...',
      +    fbLoaded: 'Flash loaded',
      +    fbHandler: smc + 'flashBlockHandler()',
      +    manURL: 'SMSound.load(): Using manually-assigned URL',
      +    onURL: sm + '.load(): current URL already assigned.',
      +    badFV: sm + '.flashVersion must be 8 or 9. "%s" is invalid. Reverting to %s.',
      +    as2loop: 'Note: Setting stream:false so looping can work (flash 8 limitation)',
      +    noNSLoop: 'Note: Looping not implemented for MovieStar formats',
      +    needfl9: 'Note: Switching to flash 9, required for MP4 formats.',
      +    mfTimeout: 'Setting flashLoadTimeout = 0 (infinite) for off-screen, mobile flash case',
      +    needFlash: smc + 'Fatal error: Flash is needed to play some required formats, but is not available.',
      +    gotFocus: smc + 'Got window focus.',
      +    policy: 'Enabling usePolicyFile for data access',
      +    setup: sm + '.setup(): allowed parameters: %s',
      +    setupError: sm + '.setup(): "%s" cannot be assigned with this method.',
      +    setupUndef: sm + '.setup(): Could not find option "%s"',
      +    setupLate: sm + '.setup(): url, flashVersion and html5Test property changes will not take effect until reboot().',
      +    noURL: smc + 'Flash URL required. Call soundManager.setup({url:...}) to get started.',
      +    sm2Loaded: 'SoundManager 2: Ready.',
      +    reset: sm + '.reset(): Removing event callbacks',
      +    mobileUA: 'Mobile UA detected, preferring HTML5 by default.',
      +    globalHTML5: 'Using singleton HTML5 Audio() pattern for this device.'
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  str = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      internal string replace helper. +arguments: o [,items to replace]

      + + +
      + +
      +    var args,
      +        i, j, o,
      +        sstr;
      + +
    • + + +
    • +
      + +
      + +
      +

      real array, please

      + +
      + +
          args = slice.call(arguments);
      + +
    • + + +
    • +
      + +
      + +
      +

      first argument

      + +
      + +
          o = args.shift();
      +
      +    sstr = (strings && strings[o] ? strings[o] : '');
      +
      +    if (sstr && args && args.length) {
      +      for (i = 0, j = args.length; i < j; i++) {
      +        sstr = sstr.replace('%s', args[i]);
      +      }
      +    }
      +
      +    return sstr;
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  loopFix = function(sOpt) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash 8 requires stream = false for looping to work

      + +
      + +
          if (fV === 8 && sOpt.loops > 1 && sOpt.stream) {
      +      _wDS('as2loop');
      +      sOpt.stream = false;
      +    }
      +
      +    return sOpt;
      +
      +  };
      +
      +  policyFix = function(sOpt, sPre) {
      +
      +    if (sOpt && !sOpt.usePolicyFile && (sOpt.onid3 || sOpt.usePeakData || sOpt.useWaveformData || sOpt.useEQData)) {
      +      sm2._wD((sPre || '') + str('policy'));
      +      sOpt.usePolicyFile = true;
      +    }
      +
      +    return sOpt;
      +
      +  };
      +
      +  complain = function(sMsg) {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          if (hasConsole && console.warn !== _undefined) {
      +      console.warn(sMsg);
      +    } else {
      +      sm2._wD(sMsg);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  doNothing = function() {
      +
      +    return false;
      +
      +  };
      +
      +  disableObject = function(o) {
      +
      +    var oProp;
      +
      +    for (oProp in o) {
      +      if (o.hasOwnProperty(oProp) && typeof o[oProp] === 'function') {
      +        o[oProp] = doNothing;
      +      }
      +    }
      +
      +    oProp = null;
      +
      +  };
      +
      +  failSafely = function(bNoDisable) {
      + +
    • + + +
    • +
      + +
      + +
      +

      general failure exception handler

      + +
      + +
      +    if (bNoDisable === _undefined) {
      +      bNoDisable = false;
      +    }
      +
      +    if (disabled || bNoDisable) {
      +      sm2.disable(bNoDisable);
      +    }
      +
      +  };
      +
      +  normalizeMovieURL = function(smURL) {
      +
      +    var urlParams = null, url;
      +
      +    if (smURL) {
      +      if (smURL.match(/\.swf(\?.*)?$/i)) {
      +        urlParams = smURL.substr(smURL.toLowerCase().lastIndexOf('.swf?') + 4);
      +        if (urlParams) {
      + +
    • + + +
    • +
      + +
      + +
      +

      assume user knows what they're doing

      + +
      + +
                return smURL;
      +        }
      +      } else if (smURL.lastIndexOf('/') !== smURL.length - 1) {
      + +
    • + + +
    • +
      + +
      + +
      +

      append trailing slash, if needed

      + +
      + +
              smURL += '/';
      +      }
      +    }
      +
      +    url = (smURL && smURL.lastIndexOf('/') !== - 1 ? smURL.substr(0, smURL.lastIndexOf('/') + 1) : './') + sm2.movieURL;
      +
      +    if (sm2.noSWFCache) {
      +      url += ('?ts=' + new Date().getTime());
      +    }
      +
      +    return url;
      +
      +  };
      +
      +  setVersionInfo = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      short-hand for internal use

      + +
      + +
      +    fV = parseInt(sm2.flashVersion, 10);
      +
      +    if (fV !== 8 && fV !== 9) {
      +      sm2._wD(str('badFV', fV, defaultFlashVersion));
      +      sm2.flashVersion = fV = defaultFlashVersion;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      debug flash movie, if applicable

      + +
      + +
      +    var isDebug = (sm2.debugMode || sm2.debugFlash?'_debug.swf':'.swf');
      +
      +    if (sm2.useHTML5Audio && !sm2.html5Only && sm2.audioFormats.mp4.required && fV < 9) {
      +      sm2._wD(str('needfl9'));
      +      sm2.flashVersion = fV = 9;
      +    }
      +
      +    sm2.version = sm2.versionNumber + (sm2.html5Only?' (HTML5-only mode)':(fV === 9?' (AS3/Flash 9)':' (AS2/Flash 8)'));
      + +
    • + + +
    • +
      + +
      + +
      +

      set up default options

      + +
      + +
          if (fV > 8) {
      + +
    • + + +
    • +
      + +
      + +
      +

      +flash 9 base options

      + +
      + +
            sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.flash9Options);
      +      sm2.features.buffering = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      +moviestar support

      + +
      + +
            sm2.defaultOptions = mixin(sm2.defaultOptions, sm2.movieStarOptions);
      +      sm2.filePatterns.flash9 = new RegExp('\\.(mp3|' + netStreamTypes.join('|') + ')(\\?.*)?$', 'i');
      +      sm2.features.movieStar = true;
      +    } else {
      +      sm2.features.movieStar = false;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      regExp for flash canPlay(), etc.

      + +
      + +
          sm2.filePattern = sm2.filePatterns[(fV !== 8?'flash9':'flash8')];
      + +
    • + + +
    • +
      + +
      + +
      +

      if applicable, use _debug versions of SWFs

      + +
      + +
          sm2.movieURL = (fV === 8?'soundmanager2.swf':'soundmanager2_flash9.swf').replace('.swf', isDebug);
      +
      +    sm2.features.peakData = sm2.features.waveformData = sm2.features.eqData = (fV > 8);
      +
      +  };
      +
      +  setPolling = function(bPolling, bHighPerformance) {
      +
      +    if (!flash) {
      +      return false;
      +    }
      +
      +    flash._setPolling(bPolling, bHighPerformance);
      +
      +  };
      +
      +  initDebug = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      starts debug mode, creating output

      for UAs without console object

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      allow force of debug mode via URL

      + + +
      + +
          if (sm2.debugURLParam.test(wl)) {
      +      sm2.debugMode = true;
      +    }
      +
      +    if (id(sm2.debugID)) {
      +      return false;
      +    }
      +
      +    var oD, oDebug, oTarget, oToggle, tmp;
      +
      +    if (sm2.debugMode && !id(sm2.debugID) && (!hasConsole || !sm2.useConsole || !sm2.consoleOnly)) {
      +
      +      oD = doc.createElement('div');
      +      oD.id = sm2.debugID + '-toggle';
      +
      +      oToggle = {
      +        'position': 'fixed',
      +        'bottom': '0px',
      +        'right': '0px',
      +        'width': '1.2em',
      +        'height': '1.2em',
      +        'lineHeight': '1.2em',
      +        'margin': '2px',
      +        'textAlign': 'center',
      +        'border': '1px solid #999',
      +        'cursor': 'pointer',
      +        'background': '#fff',
      +        'color': '#333',
      +        'zIndex': 10001
      +      };
      +
      +      oD.appendChild(doc.createTextNode('-'));
      +      oD.onclick = toggleDebug;
      +      oD.title = 'Toggle SM2 debug console';
      +
      +      if (ua.match(/msie 6/i)) {
      +        oD.style.position = 'absolute';
      +        oD.style.cursor = 'hand';
      +      }
      +
      +      for (tmp in oToggle) {
      +        if (oToggle.hasOwnProperty(tmp)) {
      +          oD.style[tmp] = oToggle[tmp];
      +        }
      +      }
      +
      +      oDebug = doc.createElement('div');
      +      oDebug.id = sm2.debugID;
      +      oDebug.style.display = (sm2.debugMode?'block':'none');
      +
      +      if (sm2.debugMode && !id(oD.id)) {
      +        try {
      +          oTarget = getDocument();
      +          oTarget.appendChild(oD);
      +        } catch(e2) {
      +          throw new Error(str('domError')+' \n'+e2.toString());
      +        }
      +        oTarget.appendChild(oDebug);
      +      }
      +
      +    }
      +
      +    oTarget = null;
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  idCheck = this.getSoundById;
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
        _wDS = function(o, errorLevel) {
      +
      +    return (!o ? '' : sm2._wD(str(o), errorLevel));
      +
      +  };
      +
      +  toggleDebug = function() {
      +
      +    var o = id(sm2.debugID),
      +    oT = id(sm2.debugID + '-toggle');
      +
      +    if (!o) {
      +      return false;
      +    }
      +
      +    if (debugOpen) {
      + +
    • + + +
    • +
      + +
      + +
      +

      minimize

      + +
      + +
            oT.innerHTML = '+';
      +      o.style.display = 'none';
      +    } else {
      +      oT.innerHTML = '-';
      +      o.style.display = 'block';
      +    }
      +
      +    debugOpen = !debugOpen;
      +
      +  };
      +
      +  debugTS = function(sEventType, bSuccess, sMessage) {
      + +
    • + + +
    • +
      + +
      + +
      +

      troubleshooter debug hooks

      + +
      + +
      +    if (window.sm2Debugger !== _undefined) {
      +      try {
      +        sm2Debugger.handleEvent(sEventType, bSuccess, sMessage);
      +      } catch(e) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
              return false;
      +      }
      +    }
      +
      +    return true;
      +
      +  };
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  getSWFCSS = function() {
      +
      +    var css = [];
      +
      +    if (sm2.debugMode) {
      +      css.push(swfCSS.sm2Debug);
      +    }
      +
      +    if (sm2.debugFlash) {
      +      css.push(swfCSS.flashDebug);
      +    }
      +
      +    if (sm2.useHighPerformance) {
      +      css.push(swfCSS.highPerf);
      +    }
      +
      +    return css.join(' ');
      +
      +  };
      +
      +  flashBlockHandler = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      possible flash block situation.

      + +
      + +
      +    var name = str('fbHandler'),
      +        p = sm2.getMoviePercent(),
      +        css = swfCSS,
      +        error = {type:'FLASHBLOCK'};
      +
      +    if (sm2.html5Only) {
      + +
    • + + +
    • +
      + +
      + +
      +

      no flash, or unused

      + +
      + +
            return false;
      +    }
      +
      +    if (!sm2.ok()) {
      +
      +      if (needsFlash) {
      + +
    • + + +
    • +
      + +
      + +
      +

      make the movie more visible, so user can fix

      + +
      + +
              sm2.oMC.className = getSWFCSS() + ' ' + css.swfDefault + ' ' + (p === null?css.swfTimedout:css.swfError);
      +        sm2._wD(name + ': ' + str('fbTimeout') + (p ? ' (' + str('fbLoaded') + ')' : ''));
      +      }
      +
      +      sm2.didFlashBlock = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      fire onready(), complain lightly

      + +
      + +
            processOnEvents({type:'ontimeout', ignoreInit:true, error:error});
      +      catchError(error);
      +
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      SM2 loaded OK (or recovered)

      + +
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (sm2.didFlashBlock) {
      +        sm2._wD(name + ': Unblocked');
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      if (sm2.oMC) {
      +        sm2.oMC.className = [getSWFCSS(), css.swfDefault, css.swfLoaded + (sm2.didFlashBlock?' '+css.swfUnblocked:'')].join(' ');
      +      }
      +
      +    }
      +
      +  };
      +
      +  addOnEvent = function(sType, oMethod, oScope) {
      +
      +    if (on_queue[sType] === _undefined) {
      +      on_queue[sType] = [];
      +    }
      +
      +    on_queue[sType].push({
      +      'method': oMethod,
      +      'scope': (oScope || null),
      +      'fired': false
      +    });
      +
      +  };
      +
      +  processOnEvents = function(oOptions) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if unspecified, assume OK/error

      + +
      + +
      +    if (!oOptions) {
      +      oOptions = {
      +        type: (sm2.ok() ? 'onready' : 'ontimeout')
      +      };
      +    }
      +
      +    if (!didInit && oOptions && !oOptions.ignoreInit) {
      + +
    • + + +
    • +
      + +
      + +
      +

      not ready yet.

      + +
      + +
            return false;
      +    }
      +
      +    if (oOptions.type === 'ontimeout' && (sm2.ok() || (disabled && !oOptions.ignoreInit))) {
      + +
    • + + +
    • +
      + +
      + +
      +

      invalid case

      + +
      + +
            return false;
      +    }
      +
      +    var status = {
      +          success: (oOptions && oOptions.ignoreInit?sm2.ok():!disabled)
      +        },
      + +
    • + + +
    • +
      + +
      + +
      +

      queue specified by type, or none

      + +
      + +
              srcQueue = (oOptions && oOptions.type?on_queue[oOptions.type]||[]:[]),
      +
      +        queue = [], i, j,
      +        args = [status],
      +        canRetry = (needsFlash && !sm2.ok());
      +
      +    if (oOptions.error) {
      +      args[0].error = oOptions.error;
      +    }
      +
      +    for (i = 0, j = srcQueue.length; i < j; i++) {
      +      if (srcQueue[i].fired !== true) {
      +        queue.push(srcQueue[i]);
      +      }
      +    }
      +
      +    if (queue.length) {
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD(sm + ': Firing ' + queue.length + ' ' + oOptions.type + '() item' + (queue.length === 1 ? '' : 's'));

      + +
      + +
            for (i = 0, j = queue.length; i < j; i++) {
      +        if (queue[i].scope) {
      +          queue[i].method.apply(queue[i].scope, args);
      +        } else {
      +          queue[i].method.apply(this, args);
      +        }
      +        if (!canRetry) {
      + +
    • + + +
    • +
      + +
      + +
      +

      useFlashBlock and SWF timeout case doesn't count here.

      + +
      + +
                queue[i].fired = true;
      +        }
      +      }
      +    }
      +
      +    return true;
      +
      +  };
      +
      +  initUserOnload = function() {
      +
      +    window.setTimeout(function() {
      +
      +      if (sm2.useFlashBlock) {
      +        flashBlockHandler();
      +      }
      +
      +      processOnEvents();
      + +
    • + + +
    • +
      + +
      + +
      +

      call user-defined "onload", scoped to window

      + +
      + +
      +      if (typeof sm2.onload === 'function') {
      +        _wDS('onload', 1);
      +        sm2.onload.apply(window);
      +        _wDS('onloadOK', 1);
      +      }
      +
      +      if (sm2.waitForWindowLoad) {
      +        event.add(window, 'load', initUserOnload);
      +      }
      +
      +    },1);
      +
      +  };
      +
      +  detectFlash = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      hat tip: Flash Detect library (BSD, (C) 2007) by Carl "DocYes" S. Yestrau - http://featureblend.com/javascript-flash-detection-library.html / http://featureblend.com/license.txt

      + +
      + +
      +    if (hasFlash !== _undefined) {
      + +
    • + + +
    • +
      + +
      + +
      +

      this work has already been done.

      + +
      + +
            return hasFlash;
      +    }
      +
      +    var hasPlugin = false, n = navigator, nP = n.plugins, obj, type, types, AX = window.ActiveXObject;
      +
      +    if (nP && nP.length) {
      +      type = 'application/x-shockwave-flash';
      +      types = n.mimeTypes;
      +      if (types && types[type] && types[type].enabledPlugin && types[type].enabledPlugin.description) {
      +        hasPlugin = true;
      +      }
      +    } else if (AX !== _undefined && !ua.match(/MSAppHost/i)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Windows 8 Store Apps (MSAppHost) are weird (compatibility?) and won't complain here, but will barf if Flash/ActiveX object is appended to the DOM.

      + +
      + +
            try {
      +        obj = new AX('ShockwaveFlash.ShockwaveFlash');
      +      } catch(e) {
      + +
    • + + +
    • +
      + +
      + +
      +

      oh well

      + +
      + +
              obj = null;
      +      }
      +      hasPlugin = (!!obj);
      + +
    • + + +
    • +
      + +
      + +
      +

      cleanup, because it is ActiveX after all

      + +
      + +
            obj = null;
      +    }
      +
      +    hasFlash = hasPlugin;
      +
      +    return hasPlugin;
      +
      +  };
      +
      +  featureCheck = function() {
      +
      +    var flashNeeded,
      +        item,
      +        formats = sm2.audioFormats,
      + +
    • + + +
    • +
      + +
      + +
      +

      iPhone <= 3.1 has broken HTML5 audio(), but firmware 3.2 (original iPad) + iOS4 works.

      + +
      + +
              isSpecial = (is_iDevice && !!(ua.match(/os (1|2|3_0|3_1)/i)));
      +
      +    if (isSpecial) {
      + +
    • + + +
    • +
      + +
      + +
      +

      has Audio(), but is broken; let it load links directly.

      + +
      + +
            sm2.hasHTML5 = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      ignore flash case, however

      + +
      + +
            sm2.html5Only = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      hide the SWF, if present

      + +
      + +
            if (sm2.oMC) {
      +        sm2.oMC.style.display = 'none';
      +      }
      +
      +    } else {
      +
      +      if (sm2.useHTML5Audio) {
      +
      +        if (!sm2.html5 || !sm2.html5.canPlayType) {
      +          sm2._wD('SoundManager: No HTML5 Audio() support detected.');
      +          sm2.hasHTML5 = false;
      +        }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
              if (isBadSafari) {
      +          sm2._wD(smc + 'Note: Buggy HTML5 Audio in Safari on this OS X release, see https://bugs.webkit.org/show_bug.cgi?id=32159 - ' + (!hasFlash ?' would use flash fallback for MP3/MP4, but none detected.' : 'will use flash fallback for MP3/MP4, if available'), 1);
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      }
      +
      +    }
      +
      +    if (sm2.useHTML5Audio && sm2.hasHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      sort out whether flash is optional, required or can be ignored.

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      innocent until proven guilty.

      + +
      + +
            canIgnoreFlash = true;
      +
      +      for (item in formats) {
      +        if (formats.hasOwnProperty(item)) {
      +          if (formats[item].required) {
      +            if (!sm2.html5.canPlayType(formats[item].type)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      100% HTML5 mode is not possible.

      + +
      + +
                    canIgnoreFlash = false;
      +              flashNeeded = true;
      +            } else if (sm2.preferFlash && (sm2.flash[item] || sm2.flash[formats[item].type])) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash may be required, or preferred for this format.

      + +
      + +
                    flashNeeded = true;
      +            }
      +          }
      +        }
      +      }
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      sanity check...

      + +
      + +
          if (sm2.ignoreFlash) {
      +      flashNeeded = false;
      +      canIgnoreFlash = true;
      +    }
      +
      +    sm2.html5Only = (sm2.hasHTML5 && sm2.useHTML5Audio && !flashNeeded);
      +
      +    return (!sm2.html5Only);
      +
      +  };
      +
      +  parseURL = function(url) {
      +
      +    /**
      +     * Internal: Finds and returns the first playable URL (or failing that, the first URL.)
      +     * @param {string or array} url A single URL string, OR, an array of URL strings or {url:'/path/to/resource', type:'audio/mp3'} objects.
      +     */
      +
      +    var i, j, urlResult = 0, result;
      +
      +    if (url instanceof Array) {
      + +
    • + + +
    • +
      + +
      + +
      +

      find the first good one

      + +
      + +
            for (i=0, j=url.length; i<j; i++) {
      +
      +        if (url[i] instanceof Object) {
      + +
    • + + +
    • +
      + +
      + +
      +

      MIME check

      + +
      + +
                if (sm2.canPlayMIME(url[i].type)) {
      +            urlResult = i;
      +            break;
      +          }
      +
      +        } else if (sm2.canPlayURL(url[i])) {
      + +
    • + + +
    • +
      + +
      + +
      +

      URL string check

      + +
      + +
                urlResult = i;
      +          break;
      +        }
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      normalize to string

      + +
      + +
            if (url[urlResult].url) {
      +        url[urlResult] = url[urlResult].url;
      +      }
      +
      +      result = url[urlResult];
      +
      +    } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      single URL case

      + +
      + +
            result = url;
      +
      +    }
      +
      +    return result;
      +
      +  };
      +
      +
      +  startTimer = function(oSound) {
      +
      +    /**
      +     * attach a timer to this sound, and start an interval if needed
      +     */
      +
      +    if (!oSound._hasTimer) {
      +
      +      oSound._hasTimer = true;
      +
      +      if (!mobileHTML5 && sm2.html5PollingInterval) {
      +
      +        if (h5IntervalTimer === null && h5TimerCount === 0) {
      +
      +          h5IntervalTimer = setInterval(timerExecute, sm2.html5PollingInterval);
      +
      +        }
      +
      +        h5TimerCount++;
      +
      +      }
      +
      +    }
      +
      +  };
      +
      +  stopTimer = function(oSound) {
      +
      +    /**
      +     * detach a timer
      +     */
      +
      +    if (oSound._hasTimer) {
      +
      +      oSound._hasTimer = false;
      +
      +      if (!mobileHTML5 && sm2.html5PollingInterval) {
      + +
    • + + +
    • +
      + +
      + +
      +

      interval will stop itself at next execution.

      + +
      + +
      +        h5TimerCount--;
      +
      +      }
      +
      +    }
      +
      +  };
      +
      +  timerExecute = function() {
      +
      +    /**
      +     * manual polling for HTML5 progress events, ie., whileplaying() (can achieve greater precision than conservative default HTML5 interval)
      +     */
      +
      +    var i;
      +
      +    if (h5IntervalTimer !== null && !h5TimerCount) {
      + +
    • + + +
    • +
      + +
      + +
      +

      no active timers, stop polling interval.

      + +
      + +
      +      clearInterval(h5IntervalTimer);
      +
      +      h5IntervalTimer = null;
      +
      +      return false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      check all HTML5 sounds with timers

      + +
      + +
      +    for (i = sm2.soundIDs.length-1; i >= 0; i--) {
      +
      +      if (sm2.sounds[sm2.soundIDs[i]].isHTML5 && sm2.sounds[sm2.soundIDs[i]]._hasTimer) {
      +
      +        sm2.sounds[sm2.soundIDs[i]]._onTimer();
      +
      +      }
      +
      +    }
      +
      +  };
      +
      +  catchError = function(options) {
      +
      +    options = (options !== _undefined ? options : {});
      +
      +    if (typeof sm2.onerror === 'function') {
      +      sm2.onerror.apply(window, [{type:(options.type !== _undefined ? options.type : null)}]);
      +    }
      +
      +    if (options.fatal !== _undefined && options.fatal) {
      +      sm2.disable();
      +    }
      +
      +  };
      +
      +  badSafariFix = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: "bad" Safari (OS X 10.3 - 10.7) must fall back to flash for MP3/MP4

      + +
      + +
          if (!isBadSafari || !detectFlash()) {
      + +
    • + + +
    • +
      + +
      + +
      +

      doesn't apply

      + +
      + +
            return false;
      +    }
      +
      +    var aF = sm2.audioFormats, i, item;
      +
      +    for (item in aF) {
      +      if (aF.hasOwnProperty(item)) {
      +        if (item === 'mp3' || item === 'mp4') {
      +          sm2._wD(sm + ': Using flash fallback for ' + item + ' format');
      +          sm2.html5[item] = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      assign result to related formats, too

      + +
      + +
                if (aF[item] && aF[item].related) {
      +            for (i = aF[item].related.length-1; i >= 0; i--) {
      +              sm2.html5[aF[item].related[i]] = false;
      +            }
      +          }
      +        }
      +      }
      +    }
      +
      +  };
      +
      +  /**
      +   * Pseudo-private flash/ExternalInterface methods
      +   * ----------------------------------------------
      +   */
      +
      +  this._setSandboxType = function(sandboxType) {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          var sb = sm2.sandbox;
      +
      +    sb.type = sandboxType;
      +    sb.description = sb.types[(sb.types[sandboxType] !== _undefined?sandboxType:'unknown')];
      +
      +    if (sb.type === 'localWithFile') {
      +
      +      sb.noRemote = true;
      +      sb.noLocal = false;
      +      _wDS('secNote', 2);
      +
      +    } else if (sb.type === 'localWithNetwork') {
      +
      +      sb.noRemote = false;
      +      sb.noLocal = true;
      +
      +    } else if (sb.type === 'localTrusted') {
      +
      +      sb.noRemote = false;
      +      sb.noLocal = false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  this._externalInterfaceOK = function(swfVersion) {
      + +
    • + + +
    • +
      + +
      + +
      +

      flash callback confirming flash loaded, EI working etc. +swfVersion: SWF build string

      + +
      + +
      +    if (sm2.swfLoaded) {
      +      return false;
      +    }
      +
      +    var e;
      +
      +    debugTS('swf', true);
      +    debugTS('flashtojs', true);
      +    sm2.swfLoaded = true;
      +    tryInitOnFocus = false;
      +
      +    if (isBadSafari) {
      +      badSafariFix();
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      complain if JS + SWF build/version strings don't match, excluding +DEV builds

      + + +
      + +
          if (!swfVersion || swfVersion.replace(/\+dev/i,'') !== sm2.versionNumber.replace(/\+dev/i, '')) {
      +
      +      e = sm + ': Fatal: JavaScript file build "' + sm2.versionNumber + '" does not match Flash SWF build "' + swfVersion + '" at ' + sm2.url + '. Ensure both are up-to-date.';
      + +
    • + + +
    • +
      + +
      + +
      +

      escape flash -> JS stack so this error fires in window.

      + +
      + +
            setTimeout(function versionMismatch() {
      +        throw new Error(e);
      +      }, 0);
      + +
    • + + +
    • +
      + +
      + +
      +

      exit, init will fail with timeout

      + +
      + +
            return false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      IE needs a larger timeout

      + +
      + +
          setTimeout(init, isIE ? 100 : 1);
      +
      +  };
      +
      +  /**
      +   * Private initialization helpers
      +   * ------------------------------
      +   */
      +
      +  createMovie = function(smID, smURL) {
      +
      +    if (didAppend && appendSuccess) {
      + +
    • + + +
    • +
      + +
      + +
      +

      ignore if already succeeded

      + +
      + +
            return false;
      +    }
      +
      +    function initMsg() {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
      +      var options = [],
      +          title,
      +          msg = [],
      +          delimiter = ' + ';
      +
      +      title = 'SoundManager ' + sm2.version + (!sm2.html5Only && sm2.useHTML5Audio ? (sm2.hasHTML5 ? ' + HTML5 audio' : ', no HTML5 audio support') : '');
      +
      +      if (!sm2.html5Only) {
      +
      +        if (sm2.preferFlash) {
      +          options.push('preferFlash');
      +        }
      +
      +        if (sm2.useHighPerformance) {
      +          options.push('useHighPerformance');
      +        }
      +
      +        if (sm2.flashPollingInterval) {
      +          options.push('flashPollingInterval (' + sm2.flashPollingInterval + 'ms)');
      +        }
      +
      +        if (sm2.html5PollingInterval) {
      +          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');
      +        }
      +
      +        if (sm2.wmode) {
      +          options.push('wmode (' + sm2.wmode + ')');
      +        }
      +
      +        if (sm2.debugFlash) {
      +          options.push('debugFlash');
      +        }
      +
      +        if (sm2.useFlashBlock) {
      +          options.push('flashBlock');
      +        }
      +
      +      } else {
      +
      +        if (sm2.html5PollingInterval) {
      +          options.push('html5PollingInterval (' + sm2.html5PollingInterval + 'ms)');
      +        }
      +
      +      }
      +
      +      if (options.length) {
      +        msg = msg.concat([options.join(delimiter)]);
      +      }
      +
      +      sm2._wD(title + (msg.length ? delimiter + msg.join(', ') : ''), 1);
      +
      +      showSupport();
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    }
      +
      +    if (sm2.html5Only) {
      + +
    • + + +
    • +
      + +
      + +
      +

      100% HTML5 mode

      + +
      + +
            setVersionInfo();
      +
      +      initMsg();
      +      sm2.oMC = id(sm2.movieID);
      +      init();
      + +
    • + + +
    • +
      + +
      + +
      +

      prevent multiple init attempts

      + +
      + +
            didAppend = true;
      +
      +      appendSuccess = true;
      +
      +      return false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      flash path

      + +
      + +
          var remoteURL = (smURL || sm2.url),
      +    localURL = (sm2.altURL || remoteURL),
      +    swfTitle = 'JS/Flash audio component (SoundManager 2)',
      +    oTarget = getDocument(),
      +    extraClass = getSWFCSS(),
      +    isRTL = null,
      +    html = doc.getElementsByTagName('html')[0],
      +    oEmbed, oMovie, tmp, movieHTML, oEl, s, x, sClass;
      +
      +    isRTL = (html && html.dir && html.dir.match(/rtl/i));
      +    smID = (smID === _undefined?sm2.id:smID);
      +
      +    function param(name, value) {
      +      return '<param name="'+name+'" value="'+value+'" />';
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      safety check for legacy (change to Flash 9 URL)

      + +
      + +
          setVersionInfo();
      +    sm2.url = normalizeMovieURL(overHTTP?remoteURL:localURL);
      +    smURL = sm2.url;
      +
      +    sm2.wmode = (!sm2.wmode && sm2.useHighPerformance ? 'transparent' : sm2.wmode);
      +
      +    if (sm2.wmode !== null && (ua.match(/msie 8/i) || (!isIE && !sm2.useHighPerformance)) && navigator.platform.match(/win32|win64/i)) {
      +      /**
      +       * extra-special case: movie doesn't load until scrolled into view when using wmode = anything but 'window' here
      +       * does not apply when using high performance (position:fixed means on-screen), OR infinite flash load timeout
      +       * wmode breaks IE 8 on Vista + Win7 too in some cases, as of January 2011 (?)
      +       */
      +       messages.push(strings.spcWmode);
      +      sm2.wmode = null;
      +    }
      +
      +    oEmbed = {
      +      'name': smID,
      +      'id': smID,
      +      'src': smURL,
      +      'quality': 'high',
      +      'allowScriptAccess': sm2.allowScriptAccess,
      +      'bgcolor': sm2.bgColor,
      +      'pluginspage': http+'www.macromedia.com/go/getflashplayer',
      +      'title': swfTitle,
      +      'type': 'application/x-shockwave-flash',
      +      'wmode': sm2.wmode,
      + +
    • + + +
    • + + +
            'hasPriority': 'true'
      +    };
      +
      +    if (sm2.debugFlash) {
      +      oEmbed.FlashVars = 'debug=1';
      +    }
      +
      +    if (!sm2.wmode) {
      + +
    • + + +
    • +
      + +
      + +
      +

      don't write empty attribute

      + +
      + +
            delete oEmbed.wmode;
      +    }
      +
      +    if (isIE) {
      + +
    • + + +
    • +
      + +
      + +
      +

      IE is "special".

      + +
      + +
            oMovie = doc.createElement('div');
      +      movieHTML = [
      +        '<object id="' + smID + '" data="' + smURL + '" type="' + oEmbed.type + '" title="' + oEmbed.title +'" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="' + http+'download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0">',
      +        param('movie', smURL),
      +        param('AllowScriptAccess', sm2.allowScriptAccess),
      +        param('quality', oEmbed.quality),
      +        (sm2.wmode? param('wmode', sm2.wmode): ''),
      +        param('bgcolor', sm2.bgColor),
      +        param('hasPriority', 'true'),
      +        (sm2.debugFlash ? param('FlashVars', oEmbed.FlashVars) : ''),
      +        '</object>'
      +      ].join('');
      +
      +    } else {
      +
      +      oMovie = doc.createElement('embed');
      +      for (tmp in oEmbed) {
      +        if (oEmbed.hasOwnProperty(tmp)) {
      +          oMovie.setAttribute(tmp, oEmbed[tmp]);
      +        }
      +      }
      +
      +    }
      +
      +    initDebug();
      +    extraClass = getSWFCSS();
      +    oTarget = getDocument();
      +
      +    if (oTarget) {
      +
      +      sm2.oMC = (id(sm2.movieID) || doc.createElement('div'));
      +
      +      if (!sm2.oMC.id) {
      +
      +        sm2.oMC.id = sm2.movieID;
      +        sm2.oMC.className = swfCSS.swfDefault + ' ' + extraClass;
      +        s = null;
      +        oEl = null;
      +
      +        if (!sm2.useFlashBlock) {
      +          if (sm2.useHighPerformance) {
      + +
    • + + +
    • +
      + +
      + +
      +

      on-screen at all times

      + +
      + +
                  s = {
      +              'position': 'fixed',
      +              'width': '8px',
      +              'height': '8px',
      + +
    • + + +
    • +
      + +
      + +
      +
      +

      = 6px for flash to run fast, >= 8px to start up under Firefox/win32 in some cases. odd? yes.

      +
      + +
      + +
                    'bottom': '0px',
      +              'left': '0px',
      +              'overflow': 'hidden'
      +            };
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      hide off-screen, lower priority

      + +
      + +
                  s = {
      +              'position': 'absolute',
      +              'width': '6px',
      +              'height': '6px',
      +              'top': '-9999px',
      +              'left': '-9999px'
      +            };
      +            if (isRTL) {
      +              s.left = Math.abs(parseInt(s.left,10))+'px';
      +            }
      +          }
      +        }
      +
      +        if (isWebkit) {
      + +
    • + + +
    • +
      + +
      + +
      +

      soundcloud-reported render/crash fix, safari 5

      + +
      + +
                sm2.oMC.style.zIndex = 10000;
      +        }
      +
      +        if (!sm2.debugFlash) {
      +          for (x in s) {
      +            if (s.hasOwnProperty(x)) {
      +              sm2.oMC.style[x] = s[x];
      +            }
      +          }
      +        }
      +
      +        try {
      +          if (!isIE) {
      +            sm2.oMC.appendChild(oMovie);
      +          }
      +          oTarget.appendChild(sm2.oMC);
      +          if (isIE) {
      +            oEl = sm2.oMC.appendChild(doc.createElement('div'));
      +            oEl.className = swfCSS.swfBox;
      +            oEl.innerHTML = movieHTML;
      +          }
      +          appendSuccess = true;
      +        } catch(e) {
      +          throw new Error(str('domError')+' \n'+e.toString());
      +        }
      +
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      SM2 container is already in the document (eg. flashblock use case)

      + +
      + +
              sClass = sm2.oMC.className;
      +        sm2.oMC.className = (sClass?sClass+' ':swfCSS.swfDefault) + (extraClass?' '+extraClass:'');
      +        sm2.oMC.appendChild(oMovie);
      +        if (isIE) {
      +          oEl = sm2.oMC.appendChild(doc.createElement('div'));
      +          oEl.className = swfCSS.swfBox;
      +          oEl.innerHTML = movieHTML;
      +        }
      +        appendSuccess = true;
      +
      +      }
      +
      +    }
      +
      +    didAppend = true;
      +    initMsg();
      + +
    • + + +
    • +
      + +
      + +
      +

      sm2._wD(sm + ': Trying to load ' + smURL + (!overHTTP && sm2.altURL ? ' (alternate URL)' : ''), 1);

      + +
      + +
      +    return true;
      +
      +  };
      +
      +  initMovie = function() {
      +
      +    if (sm2.html5Only) {
      +      createMovie();
      +      return false;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      attempt to get, or create, movie (may already exist)

      + +
      + +
          if (flash) {
      +      return false;
      +    }
      +
      +    if (!sm2.url) {
      +
      +      /**
      +       * Something isn't right - we've reached init, but the soundManager url property has not been set.
      +       * User has not called setup({url: ...}), or has not set soundManager.url (legacy use case) directly before init time.
      +       * Notify and exit. If user calls setup() with a url: property, init will be restarted as in the deferred loading case.
      +       */
      +
      +       _wDS('noURL');
      +       return false;
      +
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      inline markup case

      + +
      + +
          flash = sm2.getMovie(sm2.id);
      +
      +    if (!flash) {
      +      if (!oRemoved) {
      + +
    • + + +
    • +
      + +
      + +
      +

      try to create

      + +
      + +
              createMovie(sm2.id, sm2.url);
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      try to re-append removed movie after reboot()

      + +
      + +
              if (!isIE) {
      +          sm2.oMC.appendChild(oRemoved);
      +        } else {
      +          sm2.oMC.innerHTML = oRemovedHTML;
      +        }
      +        oRemoved = null;
      +        didAppend = true;
      +      }
      +      flash = sm2.getMovie(sm2.id);
      +    }
      +
      +    if (typeof sm2.oninitmovie === 'function') {
      +      setTimeout(sm2.oninitmovie, 1);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          flushMessages();
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    return true;
      +
      +  };
      +
      +  delayWaitForEI = function() {
      +
      +    setTimeout(waitForEI, 1000);
      +
      +  };
      +
      +  rebootIntoHTML5 = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: try for a reboot with preferFlash: false, if 100% HTML5 mode is possible and useFlashBlock is not enabled.

      + +
      + +
      +    window.setTimeout(function() {
      +
      +      complain(smc + 'useFlashBlock is false, 100% HTML5 mode is possible. Rebooting with preferFlash: false...');
      +
      +      sm2.setup({
      +        preferFlash: false
      +      }).reboot();
      + +
    • + + +
    • +
      + +
      + +
      +

      if for some reason you want to detect this case, use an ontimeout() callback and look for html5Only and didFlashBlock == true.

      + +
      + +
            sm2.didFlashBlock = true;
      +
      +      sm2.beginDelayedInit();
      +
      +    }, 1);
      +
      +  };
      +
      +  waitForEI = function() {
      +
      +    var p,
      +        loadIncomplete = false;
      +
      +    if (!sm2.url) {
      + +
    • + + +
    • +
      + +
      + +
      +

      No SWF url to load (noURL case) - exit for now. Will be retried when url is set.

      + +
      + +
            return false;
      +    }
      +
      +    if (waitingForEI) {
      +      return false;
      +    }
      +
      +    waitingForEI = true;
      +    event.remove(window, 'load', delayWaitForEI);
      +
      +    if (hasFlash && tryInitOnFocus && !isFocused) {
      + +
    • + + +
    • +
      + +
      + +
      +

      Safari won't load flash in background tabs, only when focused.

      + +
      + +
            _wDS('waitFocus');
      +      return false;
      +    }
      +
      +    if (!didInit) {
      +      p = sm2.getMoviePercent();
      +      if (p > 0 && p < 100) {
      +        loadIncomplete = true;
      +      }
      +    }
      +
      +    setTimeout(function() {
      +
      +      p = sm2.getMoviePercent();
      +
      +      if (loadIncomplete) {
      + +
    • + + +
    • +
      + +
      + +
      +

      special case: if movie partially loaded, retry until it's 100% before assuming failure.

      + +
      + +
              waitingForEI = false;
      +        sm2._wD(str('waitSWF'));
      +        window.setTimeout(delayWaitForEI, 1);
      +        return false;
      +      }
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (!didInit) {
      +
      +        sm2._wD(sm + ': No Flash response within expected time. Likely causes: ' + (p === 0 ? 'SWF load failed, ':'') + 'Flash blocked or JS-Flash security error.' + (sm2.debugFlash?' ' + str('checkSWF'):''), 2);
      +
      +        if (!overHTTP && p) {
      +
      +          _wDS('localFail', 2);
      +
      +          if (!sm2.debugFlash) {
      +            _wDS('tryDebug', 2);
      +          }
      +
      +        }
      +
      +        if (p === 0) {
      + +
    • + + +
    • +
      + +
      + +
      +

      if 0 (not null), probably a 404.

      + +
      + +
                sm2._wD(str('swf404', sm2.url), 1);
      +
      +        }
      +
      +        debugTS('flashtojs', false, ': Timed out' + overHTTP?' (Check flash security or flash blockers)':' (No plugin/missing SWF?)');
      +
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
    • + + +
    • +
      + +
      + +
      +

      give up / time-out, depending

      + +
      + +
      +      if (!didInit && okToDisable) {
      +
      +        if (p === null) {
      + +
    • + + +
    • +
      + +
      + +
      +

      SWF failed to report load progress. Possibly blocked.

      + +
      + +
      +          if (sm2.useFlashBlock || sm2.flashLoadTimeout === 0) {
      +
      +            if (sm2.useFlashBlock) {
      +
      +              flashBlockHandler();
      +
      +            }
      +
      +            _wDS('waitForever');
      +
      +          } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      no custom flash block handling, but SWF has timed out. Will recover if user unblocks / allows SWF load.

      + +
      + +
      +            if (!sm2.useFlashBlock && canIgnoreFlash) {
      +
      +              rebootIntoHTML5();
      +
      +            } else {
      +
      +              _wDS('waitForever');
      + +
    • + + +
    • +
      + +
      + +
      +

      fire any regular registered ontimeout() listeners.

      + +
      + +
                    processOnEvents({type:'ontimeout', ignoreInit: true, error: {type: 'INIT_FLASHBLOCK'}});
      +
      +            }
      +
      +          }
      +
      +        } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      SWF loaded? Shouldn't be a blocking issue, then.

      + +
      + +
      +          if (sm2.flashLoadTimeout === 0) {
      +
      +            _wDS('waitForever');
      +
      +          } else {
      +
      +            if (!sm2.useFlashBlock && canIgnoreFlash) {
      +
      +              rebootIntoHTML5();
      +
      +            } else {
      +
      +              failSafely(true);
      +
      +            }
      +
      +          }
      +
      +        }
      +
      +      }
      +
      +    }, sm2.flashLoadTimeout);
      +
      +  };
      +
      +  handleFocus = function() {
      +
      +    function cleanup() {
      +      event.remove(window, 'focus', handleFocus);
      +    }
      +
      +    if (isFocused || !tryInitOnFocus) {
      + +
    • + + +
    • +
      + +
      + +
      +

      already focused, or not special Safari background tab case

      + +
      + +
            cleanup();
      +      return true;
      +    }
      +
      +    okToDisable = true;
      +    isFocused = true;
      +    _wDS('gotFocus');
      + +
    • + + +
    • +
      + +
      + +
      +

      allow init to restart

      + +
      + +
          waitingForEI = false;
      + +
    • + + +
    • +
      + +
      + +
      +

      kick off ExternalInterface timeout, now that the SWF has started

      + +
      + +
          delayWaitForEI();
      +
      +    cleanup();
      +    return true;
      +
      +  };
      +
      +  flushMessages = function() {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
    • + + +
    • +
      + +
      + +
      +

      SM2 pre-init debug messages

      + +
      + +
          if (messages.length) {
      +      sm2._wD('SoundManager 2: ' + messages.join(' '), 1);
      +      messages = [];
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  showSupport = function() {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
      +    flushMessages();
      +
      +    var item, tests = [];
      +
      +    if (sm2.useHTML5Audio && sm2.hasHTML5) {
      +      for (item in sm2.audioFormats) {
      +        if (sm2.audioFormats.hasOwnProperty(item)) {
      +          tests.push(item + ' = ' + sm2.html5[item] + (!sm2.html5[item] && needsFlash && sm2.flash[item] ? ' (using flash)' : (sm2.preferFlash && sm2.flash[item] && needsFlash ? ' (preferring flash)': (!sm2.html5[item] ? ' (' + (sm2.audioFormats[item].required ? 'required, ':'') + 'and no flash support)' : ''))));
      +        }
      +      }
      +      sm2._wD('SoundManager 2 HTML5 support: ' + tests.join(', '), 1);
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +  };
      +
      +  initComplete = function(bNoDisable) {
      +
      +    if (didInit) {
      +      return false;
      +    }
      +
      +    if (sm2.html5Only) {
      + +
    • + + +
    • +
      + +
      + +
      +

      all good.

      + +
      + +
            _wDS('sm2Loaded');
      +      didInit = true;
      +      initUserOnload();
      +      debugTS('onload', true);
      +      return true;
      +    }
      +
      +    var wasTimeout = (sm2.useFlashBlock && sm2.flashLoadTimeout && !sm2.getMoviePercent()),
      +        result = true,
      +        error;
      +
      +    if (!wasTimeout) {
      +      didInit = true;
      +    }
      +
      +    error = {type: (!hasFlash && needsFlash ? 'NO_FLASH' : 'INIT_TIMEOUT')};
      +
      +    sm2._wD('SoundManager 2 ' + (disabled ? 'failed to load' : 'loaded') + ' (' + (disabled ? 'Flash security/load error' : 'OK') + ')', disabled ? 2: 1);
      +
      +    if (disabled || bNoDisable) {
      +      if (sm2.useFlashBlock && sm2.oMC) {
      +        sm2.oMC.className = getSWFCSS() + ' ' + (sm2.getMoviePercent() === null?swfCSS.swfTimedout:swfCSS.swfError);
      +      }
      +      processOnEvents({type:'ontimeout', error:error, ignoreInit: true});
      +      debugTS('onload', false);
      +      catchError(error);
      +      result = false;
      +    } else {
      +      debugTS('onload', true);
      +    }
      +
      +    if (!disabled) {
      +      if (sm2.waitForWindowLoad && !windowLoaded) {
      +        _wDS('waitOnload');
      +        event.add(window, 'load', initUserOnload);
      +      } else {
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
              if (sm2.waitForWindowLoad && windowLoaded) {
      +          _wDS('docLoaded');
      +        }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
              initUserOnload();
      +      }
      +    }
      +
      +    return result;
      +
      +  };
      +
      +  /**
      +   * apply top-level setupOptions object as local properties, eg., this.setupOptions.flashVersion -> this.flashVersion (soundManager.flashVersion)
      +   * this maintains backward compatibility, and allows properties to be defined separately for use by soundManager.setup().
      +   */
      +
      +  setProperties = function() {
      +
      +    var i,
      +        o = sm2.setupOptions;
      +
      +    for (i in o) {
      +
      +      if (o.hasOwnProperty(i)) {
      + +
    • + + +
    • +
      + +
      + +
      +

      assign local property if not already defined

      + +
      + +
      +        if (sm2[i] === _undefined) {
      +
      +          sm2[i] = o[i];
      +
      +        } else if (sm2[i] !== o[i]) {
      + +
    • + + +
    • +
      + +
      + +
      +

      legacy support: write manually-assigned property (eg., soundManager.url) back to setupOptions to keep things in sync

      + +
      + +
                sm2.setupOptions[i] = sm2[i];
      +
      +        }
      +
      +      }
      +
      +    }
      +
      +  };
      +
      +
      +  init = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      called after onload()

      + +
      + +
      +    if (didInit) {
      +      _wDS('didInit');
      +      return false;
      +    }
      +
      +    function cleanup() {
      +      event.remove(window, 'load', sm2.beginDelayedInit);
      +    }
      +
      +    if (sm2.html5Only) {
      +      if (!didInit) {
      + +
    • + + +
    • +
      + +
      + +
      +

      we don't need no steenking flash!

      + +
      + +
              cleanup();
      +        sm2.enabled = true;
      +        initComplete();
      +      }
      +      return true;
      +    }
      + +
    • + + +
    • +
      + +
      + +
      +

      flash path

      + +
      + +
          initMovie();
      +
      +    try {
      + +
    • + + +
    • +
      + +
      + +
      +

      attempt to talk to Flash

      + +
      + +
            flash._externalInterfaceTest(false);
      + +
    • + + +
    • +
      + +
      + +
      +

      apply user-specified polling interval, OR, if "high performance" set, faster vs. default polling +(determines frequency of whileloading/whileplaying callbacks, effectively driving UI framerates)

      + +
      + +
            setPolling(true, (sm2.flashPollingInterval || (sm2.useHighPerformance ? 10 : 50)));
      +
      +      if (!sm2.debugMode) {
      + +
    • + + +
    • +
      + +
      + +
      +

      stop the SWF from making debug output calls to JS

      + +
      + +
              flash._disableDebug();
      +      }
      +
      +      sm2.enabled = true;
      +      debugTS('jstoflash', true);
      +
      +      if (!sm2.html5Only) {
      + +
    • + + +
    • +
      + +
      + +
      +

      prevent browser from showing cached page state (or rather, restoring "suspended" page state) via back button, because flash may be dead +http://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/

      + +
      + +
              event.add(window, 'unload', doNothing);
      +      }
      +
      +    } catch(e) {
      +
      +      sm2._wD('js/flash exception: ' + e.toString());
      +      debugTS('jstoflash', false);
      +      catchError({type:'JS_TO_FLASH_EXCEPTION', fatal:true});
      + +
    • + + +
    • +
      + +
      + +
      +

      don't disable, for reboot()

      + +
      + +
            failSafely(true);
      +      initComplete();
      +
      +      return false;
      +
      +    }
      +
      +    initComplete();
      + +
    • + + +
    • +
      + +
      + +
      +

      disconnect events

      + +
      + +
          cleanup();
      +
      +    return true;
      +
      +  };
      +
      +  domContentLoaded = function() {
      +
      +    if (didDCLoaded) {
      +      return false;
      +    }
      +
      +    didDCLoaded = true;
      + +
    • + + +
    • +
      + +
      + +
      +

      assign top-level soundManager properties eg. soundManager.url

      + +
      + +
          setProperties();
      +
      +    initDebug();
      +
      +    /**
      +     * Temporary feature: allow force of HTML5 via URL params: sm2-usehtml5audio=0 or 1
      +     * Ditto for sm2-preferFlash, too.
      +     */
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
          (function(){
      +
      +      var a = 'sm2-usehtml5audio=',
      +          a2 = 'sm2-preferflash=',
      +          b = null,
      +          b2 = null,
      +          l = wl.toLowerCase();
      +
      +      if (l.indexOf(a) !== -1) {
      +        b = (l.charAt(l.indexOf(a)+a.length) === '1');
      +        if (hasConsole) {
      +          console.log((b?'Enabling ':'Disabling ')+'useHTML5Audio via URL parameter');
      +        }
      +        sm2.setup({
      +          'useHTML5Audio': b
      +        });
      +      }
      +
      +      if (l.indexOf(a2) !== -1) {
      +        b2 = (l.charAt(l.indexOf(a2)+a2.length) === '1');
      +        if (hasConsole) {
      +          console.log((b2?'Enabling ':'Disabling ')+'preferFlash via URL parameter');
      +        }
      +        sm2.setup({
      +          'preferFlash': b2
      +        });
      +      }
      +
      +    }());
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +    if (!hasFlash && sm2.hasHTML5) {
      +      sm2._wD('SoundManager 2: No Flash detected' + (!sm2.useHTML5Audio ? ', enabling HTML5.' : '. Trying HTML5-only mode.'), 1);
      +      sm2.setup({
      +        'useHTML5Audio': true,
      + +
    • + + +
    • +
      + +
      + +
      +

      make sure we aren't preferring flash, either +TODO: preferFlash should not matter if flash is not installed. Currently, stuff breaks without the below tweak.

      + +
      + +
              'preferFlash': false
      +      });
      +    }
      +
      +    testHTML5();
      +
      +    if (!hasFlash && needsFlash) {
      +      messages.push(strings.needFlash);
      + +
    • + + +
    • +
      + +
      + +
      +

      TODO: Fatal here vs. timeout approach, etc. +hack: fail sooner.

      + +
      + +
            sm2.setup({
      +        'flashLoadTimeout': 1
      +      });
      +    }
      +
      +    if (doc.removeEventListener) {
      +      doc.removeEventListener('DOMContentLoaded', domContentLoaded, false);
      +    }
      +
      +    initMovie();
      +
      +    return true;
      +
      +  };
      +
      +  domContentLoadedIE = function() {
      +
      +    if (doc.readyState === 'complete') {
      +      domContentLoaded();
      +      doc.detachEvent('onreadystatechange', domContentLoadedIE);
      +    }
      +
      +    return true;
      +
      +  };
      +
      +  winOnLoad = function() {
      + +
    • + + +
    • +
      + +
      + +
      +

      catch edge case of initComplete() firing after window.load()

      + +
      + +
          windowLoaded = true;
      +    event.remove(window, 'load', winOnLoad);
      +
      +  };
      +
      +  /**
      +   * miscellaneous run-time, pre-init stuff
      +   */
      +
      +  preInit = function() {
      +
      +    if (mobileHTML5) {
      + +
    • + + +
    • +
      + +
      + +
      +

      prefer HTML5 for mobile + tablet-like devices, probably more reliable vs. flash at this point.

      + +
      + +
    • + + +
    • +
      + +
      + +
      + + +
      + +
            if (!sm2.setupOptions.useHTML5Audio || sm2.setupOptions.preferFlash) {
      + +
    • + + +
    • +
      + +
      + +
      +

      notify that defaults are being changed.

      + +
      + +
              messages.push(strings.mobileUA);
      +      }
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
      +      sm2.setupOptions.useHTML5Audio = true;
      +      sm2.setupOptions.preferFlash = false;
      +
      +      if (is_iDevice || (isAndroid && !ua.match(/android\s2\.3/i))) {
      + +
    • + + +
    • +
      + +
      + +
      +

      iOS and Android devices tend to work better with a single audio instance, specifically for chained playback of sounds in sequence. +common use case: exiting sound onfinish() -> createSound() -> play()

      + + +
      + +
              messages.push(strings.globalHTML5);
      + +
    • + + +
    • +
      + +
      + +
      +

      + +
      + +
              if (is_iDevice) {
      +          sm2.ignoreFlash = true;
      +        }
      +        useGlobalHTML5Audio = true;
      +      }
      +
      +    }
      +
      +  };
      +
      +  preInit();
      + +
    • + + +
    • +
      + +
      + +
      +

      sniff up-front

      + +
      + +
        detectFlash();
      + +
    • + + +
    • +
      + +
      + +
      +

      focus and window load, init (primarily flash-driven)

      + +
      + +
        event.add(window, 'focus', handleFocus);
      +  event.add(window, 'load', delayWaitForEI);
      +  event.add(window, 'load', winOnLoad);
      +
      +  if (doc.addEventListener) {
      +
      +    doc.addEventListener('DOMContentLoaded', domContentLoaded, false);
      +
      +  } else if (doc.attachEvent) {
      +
      +    doc.attachEvent('onreadystatechange', domContentLoadedIE);
      +
      +  } else {
      + +
    • + + +
    • +
      + +
      + +
      +

      no add/attachevent support - safe to assume no JS -> Flash either

      + +
      + +
          debugTS('onload', false);
      +    catchError({type:'NO_DOM2_EVENTS', fatal:true});
      +
      +  }
      +
      +} // SoundManager()
      + +
    • + + +
    • + + +
      +if (window.SM2_DEFER === undefined || !SM2_DEFER) {
      +  soundManager = new SoundManager();
      +}
      +
      +/**
      + * SoundManager public interfaces
      + * ------------------------------
      + */
      +
      +window.SoundManager = SoundManager; // constructor
      +window.soundManager = soundManager; // public API, flash callbacks etc.
      +
      +}(window));
      + +
    • + +
    +